From a80c68f3171505bf3ed0dc61ce3eae54b9408e21 Mon Sep 17 00:00:00 2001 From: Falk Howar Date: Fri, 21 Feb 2025 15:10:45 +0100 Subject: [PATCH 01/26] remove transition guards, remove generics from datavalue --- .../learnlib/ralib/automata/Assignment.java | 15 +- .../ralib/automata/InputTransition.java | 3 +- .../learnlib/ralib/automata/Transition.java | 10 +- .../ralib/automata/TransitionGuard.java | 9 +- .../guards/AtomicGuardExpression.java | 9 +- .../ralib/automata/guards/Conjunction.java | 3 +- .../ralib/automata/guards/Disjunction.java | 3 +- .../automata/guards/FalseGuardExpression.java | 3 +- .../automata/guards/GuardExpression.java | 3 +- .../ralib/automata/guards/Negation.java | 3 +- .../ralib/automata/guards/Relation.java | 1 + .../automata/guards/TrueGuardExpression.java | 3 +- .../automata/output/OutputTransition.java | 15 +- .../learnlib/ralib/automata/util/RAToDot.java | 11 +- .../ralib/automata/xml/ExpressionParser.java | 36 +- .../xml/RegisterAutomatonExporter.java | 17 +- .../xml/RegisterAutomatonImporter.java | 25 +- .../ralib/ceanalysis/Essentializer.java | 8 +- .../ralib/ceanalysis/PrefixFinder.java | 5 +- .../de/learnlib/ralib/data/Constants.java | 2 +- .../java/de/learnlib/ralib/data/DataType.java | 11 +- .../de/learnlib/ralib/data/DataValue.java | 62 +--- .../de/learnlib/ralib/data/FreshValue.java | 6 +- .../java/de/learnlib/ralib/data/Mapping.java | 11 +- src/main/java/de/learnlib/ralib/data/PIV.java | 12 +- .../de/learnlib/ralib/data/ParValuation.java | 8 +- .../learnlib/ralib/data/SuffixValuation.java | 4 +- .../ralib/data/SymbolicDataValue.java | 86 ++--- .../de/learnlib/ralib/data/VarMapping.java | 76 +++- .../de/learnlib/ralib/data/VarValuation.java | 5 +- .../de/learnlib/ralib/data/WordValuation.java | 2 +- src/main/java/de/learnlib/ralib/dt/DTHyp.java | 10 +- .../java/de/learnlib/ralib/dt/DTLeaf.java | 13 +- .../de/learnlib/ralib/dt/MappedPrefix.java | 2 +- .../java/de/learnlib/ralib/dt/PathResult.java | 2 +- .../ralib/equivalence/IOEquivalenceTest.java | 29 +- .../ralib/equivalence/IORandomWalk.java | 10 +- .../ralib/equivalence/RAEquivalenceTest.java | 20 +- .../ralib/learning/AutomatonBuilder.java | 16 +- .../learning/CounterexampleAnalysis.java | 7 +- .../learnlib/ralib/learning/Hypothesis.java | 6 +- .../ralib/learning/IOAutomatonBuilder.java | 45 ++- .../ralib/learning/SymbolicSuffix.java | 18 +- .../learnlib/ralib/learning/SymbolicWord.java | 4 +- .../ralib/learning/ralambda/RaLambda.java | 9 +- .../ralib/learning/rastar/Component.java | 3 +- .../learnlib/ralib/learning/rastar/Row.java | 2 +- .../de/learnlib/ralib/oracles/Branching.java | 3 +- .../ralib/oracles/SDTLogicOracle.java | 15 +- .../oracles/mto/MultiTheoryBranching.java | 28 +- .../mto/MultiTheorySDTLogicOracle.java | 75 ++-- .../oracles/mto/MultiTheoryTreeOracle.java | 47 ++- .../mto/OptimizedSymbolicSuffixBuilder.java | 26 +- .../de/learnlib/ralib/oracles/mto/SDT.java | 6 +- .../learnlib/ralib/oracles/mto/SDTLeaf.java | 1 + .../mto/SymbolicSuffixRestrictionBuilder.java | 6 +- .../{solver => smt}/ConstraintSolver.java | 7 +- .../ConstraintSolverFactory.java | 11 +- .../ralib/smt/ReplacingVarsVisitor.java | 21 ++ .../java/de/learnlib/ralib/smt/SMTUtils.java | 41 ++ .../JConstraintsConstraintSolver.java | 12 +- .../jconstraints/JContraintsUtil.java | 21 +- .../ralib/solver/simple/Constraint.java | 129 ------- .../ralib/solver/simple/DisjointSet.java | 112 ------ .../learnlib/ralib/solver/simple/IntPair.java | 80 ---- .../ralib/solver/simple/Monomial.java | 351 ------------------ .../ralib/solver/simple/Polynomial.java | 180 --------- .../ralib/solver/simple/Relation.java | 25 -- .../solver/simple/SimpleConstraintSolver.java | 64 ---- .../ralib/solver/simple/SimpleSolver.java | 30 -- .../solver/simple/TranslationContext.java | 116 ------ .../de/learnlib/ralib/sul/SimulatorSUL.java | 4 +- .../ralib/theory/EquivalenceClassFilter.java | 18 +- .../de/learnlib/ralib/theory/SDTAndGuard.java | 1 + .../de/learnlib/ralib/theory/SDTGuard.java | 81 +--- .../de/learnlib/ralib/theory/SDTIfGuard.java | 3 +- .../learnlib/ralib/theory/SDTMultiGuard.java | 1 + .../de/learnlib/ralib/theory/SDTOrGuard.java | 1 + .../learnlib/ralib/theory/SDTTrueGuard.java | 1 + .../ralib/theory/SuffixValueRestriction.java | 18 +- .../java/de/learnlib/ralib/theory/Theory.java | 10 +- .../theory/equality/DisequalityGuard.java | 1 + .../theory/equality/EqualRestriction.java | 4 +- .../ralib/theory/equality/EqualityGuard.java | 1 + .../ralib/theory/equality/EqualityTheory.java | 48 ++- .../theory/equality/UniqueEqualityTheory.java | 24 +- .../inequality/InequalityTheoryWithEq.java | 148 ++++---- .../tools/AbstractToolWithRandomWalk.java | 16 +- .../learnlib/ralib/tools/ClassAnalyzer.java | 6 +- .../ClasssAnalyzerDataWordSUL.java | 20 +- .../tools/classanalyzer/MethodConfig.java | 8 +- .../tools/classanalyzer/SpecialSymbols.java | 2 +- .../tools/classanalyzer/TypedTheory.java | 3 +- .../ralib/tools/theories/DoubleDataValue.java | 21 -- .../theories/DoubleInequalityTheory.java | 84 ++--- .../tools/theories/IntegerEqualityTheory.java | 20 +- .../theories/UniqueIntegerEqualityTheory.java | 19 +- .../de/learnlib/ralib/words/DataWords.java | 45 +-- .../learnlib/ralib/words/PSymbolInstance.java | 2 +- .../ralib/RaLibLearningExperimentRunner.java | 2 +- .../java/de/learnlib/ralib/RandomWalk.java | 10 +- src/test/java/de/learnlib/ralib/TestUtil.java | 4 +- .../ralib/automata/KeygenAutomatonTest.java | 53 +-- .../ralib/automata/LoginAutomatonTest.java | 9 +- .../ralib/automata/xml/OutputTest.java | 5 +- .../ralib/ceanalysis/EssentializerTest.java | 25 +- .../ralib/ceanalysis/PrefixFinderTest.java | 22 +- .../ralib/data/PIVRemappingIteratorTest.java | 9 +- .../de/learnlib/ralib/dt/DTInnerNodeTest.java | 19 +- .../java/de/learnlib/ralib/dt/DTTest.java | 47 +-- .../ralib/dt/RegisterConsistencyTest.java | 19 +- .../equivalence/RAEquivalenceTestTest.java | 12 +- .../ralib/example/container/ContainerSUL.java | 10 +- .../ralib/example/keygen/KeyGenMap.java | 11 +- .../example/keygen/MapAutomatonExample.java | 22 +- .../ralib/example/list/BoundedList.java | 19 +- .../list/BoundedListDataWordOracle.java | 17 +- .../llambda/LLambdaAutomatonExample.java | 4 +- .../ralib/example/login/FreshMultiLogin.java | 15 +- .../example/login/LoginAutomatonExample.java | 28 +- .../example/priority/PriorityQueueOracle.java | 8 +- .../example/priority/PriorityQueueSUL.java | 6 +- .../ralib/example/repeater/RepeaterSUL.java | 8 +- .../example/sdts/LoginExampleBranching.java | 7 +- .../ralib/example/sdts/LoginExampleSDT.java | 3 +- .../example/sdts/LoginExampleTreeOracle.java | 29 +- .../example/stack/StackAutomatonExample.java | 16 +- .../ralib/learning/SymbolicSuffixTest.java | 9 +- .../ralambda/GeneratedHypothesesTest.java | 6 +- .../learning/ralambda/IOHandlingTest.java | 48 +-- .../learning/ralambda/LearnABPOutputTest.java | 7 +- .../ralambda/LearnDtlsServerTest.java | 2 +- .../learning/ralambda/LearnEchoTest.java | 26 +- .../learning/ralambda/LearnLoginTest.java | 14 +- .../learning/ralambda/LearnMixedIOTest.java | 2 +- .../learning/ralambda/LearnPQIOTest.java | 2 +- .../ralib/learning/ralambda/LearnPQTest.java | 2 +- .../ralib/learning/ralambda/LearnPadlock.java | 30 +- .../ralambda/LearnPalindromeIOTest.java | 8 +- .../learning/ralambda/LearnRepeaterTest.java | 19 +- .../learning/ralambda/LearnSipIOTest.java | 7 +- .../learning/ralambda/LearnStackTest.java | 47 +-- .../TestDistinguishingSuffixOptimization.java | 10 +- .../learning/ralambda/TestOutputSuffixes.java | 7 +- .../learning/ralambda/TestQueryCount.java | 2 +- .../ralambda/TestSuffixOptimization.java | 19 +- .../ralib/learning/ralambda/TestSymmetry.java | 81 ++-- .../ralambda/TestUnknownMemorable.java | 49 +-- .../ralib/learning/rastar/CellTest.java | 13 +- .../learning/rastar/LearnBoundedListTest.java | 6 +- .../ralib/learning/rastar/LearnLoginTest.java | 11 +- .../learning/rastar/LearnMixedIOTest.java | 2 +- .../ralib/learning/rastar/LearnPQIOTest.java | 3 +- .../ralib/learning/rastar/LearnPQTest.java | 2 +- .../rastar/LearnPalindromeIOTest.java | 8 +- .../ralib/learning/rastar/LearnSipIOTest.java | 6 +- .../ralib/learning/rastar/RowTest.java | 21 +- .../mto/ConstantsSDTBranchingTest.java | 12 +- .../ralib/oracles/mto/FreshValuesTest.java | 17 +- .../mto/InstantiateSymbolicWordTest.java | 64 ++-- .../ralib/oracles/mto/LoginBranchingTest.java | 41 +- .../oracles/mto/MultiSDTBranchingTest.java | 9 +- .../mto/MultiTheorySDTLogicOracleTest.java | 21 +- .../oracles/mto/MultipleSpecialCasesTest.java | 4 +- .../oracles/mto/NonFreeSuffixValuesTest.java | 48 +-- .../OptimizedSymbolicSuffixBuilderTest.java | 166 +++++---- .../ralib/oracles/mto/SIPSDTMergingTest.java | 10 +- .../oracles/mto/SecondSDTBranchingTest.java | 11 +- .../oracles/mto/UntypedBranchingTest.java | 10 +- .../de/learnlib/ralib/sul/CachingSULTest.java | 6 +- .../theory/EquivalenceClassCoverageTest.java | 37 +- .../ralib/theory/TestEqualityTheory.java | 18 +- .../learnlib/ralib/theory/TestIneqEqTree.java | 2 +- .../ralib/theory/TestIneqOutputTree.java | 4 +- .../learnlib/ralib/theory/TestTreeOracle.java | 56 +-- .../theory/TestUniqueEqualityTheory.java | 18 +- .../ralib/tools/ClassAnalyzerTest.java | 12 +- .../de/learnlib/ralib/words/TestWords.java | 29 +- 178 files changed, 1621 insertions(+), 2562 deletions(-) rename src/main/java/de/learnlib/ralib/{solver => smt}/ConstraintSolver.java (82%) rename src/main/java/de/learnlib/ralib/{solver => smt}/ConstraintSolverFactory.java (80%) create mode 100644 src/main/java/de/learnlib/ralib/smt/ReplacingVarsVisitor.java create mode 100644 src/main/java/de/learnlib/ralib/smt/SMTUtils.java rename src/main/java/de/learnlib/ralib/{solver => smt}/jconstraints/JConstraintsConstraintSolver.java (81%) rename src/main/java/de/learnlib/ralib/{solver => smt}/jconstraints/JContraintsUtil.java (89%) delete mode 100644 src/main/java/de/learnlib/ralib/solver/simple/Constraint.java delete mode 100644 src/main/java/de/learnlib/ralib/solver/simple/DisjointSet.java delete mode 100644 src/main/java/de/learnlib/ralib/solver/simple/IntPair.java delete mode 100644 src/main/java/de/learnlib/ralib/solver/simple/Monomial.java delete mode 100644 src/main/java/de/learnlib/ralib/solver/simple/Polynomial.java delete mode 100644 src/main/java/de/learnlib/ralib/solver/simple/Relation.java delete mode 100644 src/main/java/de/learnlib/ralib/solver/simple/SimpleConstraintSolver.java delete mode 100644 src/main/java/de/learnlib/ralib/solver/simple/SimpleSolver.java delete mode 100644 src/main/java/de/learnlib/ralib/solver/simple/TranslationContext.java delete mode 100644 src/main/java/de/learnlib/ralib/tools/theories/DoubleDataValue.java diff --git a/src/main/java/de/learnlib/ralib/automata/Assignment.java b/src/main/java/de/learnlib/ralib/automata/Assignment.java index 6e6236eb..dfc114b1 100644 --- a/src/main/java/de/learnlib/ralib/automata/Assignment.java +++ b/src/main/java/de/learnlib/ralib/automata/Assignment.java @@ -16,16 +16,13 @@ */ package de.learnlib.ralib.automata; +import java.util.List; import java.util.Map.Entry; -import de.learnlib.ralib.data.Constants; -import de.learnlib.ralib.data.ParValuation; -import de.learnlib.ralib.data.SymbolicDataValue; +import de.learnlib.ralib.data.*; import de.learnlib.ralib.data.SymbolicDataValue.Constant; import de.learnlib.ralib.data.SymbolicDataValue.Parameter; import de.learnlib.ralib.data.SymbolicDataValue.Register; -import de.learnlib.ralib.data.VarMapping; -import de.learnlib.ralib.data.VarValuation; /** * A parallel assignment for registers. @@ -41,7 +38,13 @@ public Assignment(VarMapping assignment) } public VarValuation compute(VarValuation registers, ParValuation parameters, Constants consts) { - VarValuation val = new VarValuation(registers); + VarValuation val = new VarValuation(); + List rNames = assignment.keySet().stream().map(k -> k.getName()).toList(); + for (Entry e : registers.entrySet()) { + if (!rNames.contains(e.getKey().getName())) { + val.put(e.getKey(), e.getValue()); + } + } for (Entry e : assignment) { SymbolicDataValue valp = e.getValue(); if (valp.isRegister()) { diff --git a/src/main/java/de/learnlib/ralib/automata/InputTransition.java b/src/main/java/de/learnlib/ralib/automata/InputTransition.java index fc6fa485..b04dd6ae 100644 --- a/src/main/java/de/learnlib/ralib/automata/InputTransition.java +++ b/src/main/java/de/learnlib/ralib/automata/InputTransition.java @@ -17,6 +17,7 @@ package de.learnlib.ralib.automata; import de.learnlib.ralib.words.InputSymbol; +import gov.nasa.jpf.constraints.api.Expression; /** * @@ -24,7 +25,7 @@ */ public class InputTransition extends Transition { - public InputTransition(TransitionGuard guard, InputSymbol label, RALocation source, RALocation destination, Assignment assignment) { + public InputTransition(Expression guard, InputSymbol label, RALocation source, RALocation destination, Assignment assignment) { super(label, guard, source, destination, assignment); } diff --git a/src/main/java/de/learnlib/ralib/automata/Transition.java b/src/main/java/de/learnlib/ralib/automata/Transition.java index 2d5af317..10bcaa09 100644 --- a/src/main/java/de/learnlib/ralib/automata/Transition.java +++ b/src/main/java/de/learnlib/ralib/automata/Transition.java @@ -19,7 +19,9 @@ import de.learnlib.ralib.data.Constants; import de.learnlib.ralib.data.ParValuation; import de.learnlib.ralib.data.VarValuation; +import de.learnlib.ralib.smt.SMTUtils; import de.learnlib.ralib.words.ParameterizedSymbol; +import gov.nasa.jpf.constraints.api.Expression; /** * Register Automaton transitions have input symbols, and assignments. @@ -30,7 +32,7 @@ public class Transition { protected final ParameterizedSymbol label; - protected final TransitionGuard guard; + protected final Expression guard; protected final RALocation source; @@ -38,7 +40,7 @@ public class Transition { protected final Assignment assignment; - public Transition(ParameterizedSymbol label, TransitionGuard guard, + public Transition(ParameterizedSymbol label, Expression guard, RALocation source, RALocation destination, Assignment assignment) { this.label = label; this.guard = guard; @@ -48,7 +50,7 @@ public Transition(ParameterizedSymbol label, TransitionGuard guard, } public boolean isEnabled(VarValuation registers, ParValuation parameters, Constants consts) { - return guard.isSatisfied(registers, parameters, consts); + return guard.evaluateSMT(SMTUtils.compose(registers, parameters, consts)); } public VarValuation execute(VarValuation registers, ParValuation parameters, Constants consts) { @@ -86,7 +88,7 @@ public Assignment getAssignment() { /** * @return the guard */ - public TransitionGuard getGuard() { + public Expression getGuard() { return guard; } diff --git a/src/main/java/de/learnlib/ralib/automata/TransitionGuard.java b/src/main/java/de/learnlib/ralib/automata/TransitionGuard.java index f13760b2..6850991b 100644 --- a/src/main/java/de/learnlib/ralib/automata/TransitionGuard.java +++ b/src/main/java/de/learnlib/ralib/automata/TransitionGuard.java @@ -18,16 +18,15 @@ import de.learnlib.ralib.automata.guards.GuardExpression; import de.learnlib.ralib.automata.guards.TrueGuardExpression; -import de.learnlib.ralib.data.Constants; -import de.learnlib.ralib.data.ParValuation; -import de.learnlib.ralib.data.VarMapping; -import de.learnlib.ralib.data.VarValuation; +import de.learnlib.ralib.data.*; +import gov.nasa.jpf.constraints.api.Expression; /** * Transition Guard. * * @author falk */ +@Deprecated public class TransitionGuard { private final GuardExpression condition; @@ -51,7 +50,7 @@ public TransitionGuard(GuardExpression condition) { * @return */ public boolean isSatisfied(VarValuation registers, ParValuation parameters, Constants consts) { - VarMapping val = new VarMapping(); + Mapping val = new Mapping<>(); val.putAll(registers); val.putAll(parameters); val.putAll(consts); diff --git a/src/main/java/de/learnlib/ralib/automata/guards/AtomicGuardExpression.java b/src/main/java/de/learnlib/ralib/automata/guards/AtomicGuardExpression.java index 2a97887b..9968a7fe 100644 --- a/src/main/java/de/learnlib/ralib/automata/guards/AtomicGuardExpression.java +++ b/src/main/java/de/learnlib/ralib/automata/guards/AtomicGuardExpression.java @@ -29,6 +29,7 @@ * @param * @param */ +@Deprecated public class AtomicGuardExpression extends GuardExpression { private final Left left; @@ -44,7 +45,7 @@ public AtomicGuardExpression(Left left, Relation relation, Right right) { } @Override - public boolean isSatisfied(Mapping> val) { + public boolean isSatisfied(Mapping val) { DataValue lv = val.get(left); DataValue rv = val.get(right); @@ -107,12 +108,12 @@ public Relation getRelation() { } private boolean numCompare(DataValue l, DataValue r, Relation relation) { - if (!l.getType().equals(r.getType())) { + if (!l.getDataType().equals(r.getDataType())) { return false; } - Comparable lc = (Comparable) l.getId(); - int result = lc.compareTo(r.getId()); + Comparable lc = (Comparable) l.getValue(); + int result = lc.compareTo(r.getValue()); switch (relation) { case SMALLER: return result < 0; diff --git a/src/main/java/de/learnlib/ralib/automata/guards/Conjunction.java b/src/main/java/de/learnlib/ralib/automata/guards/Conjunction.java index eab40fec..da55f177 100644 --- a/src/main/java/de/learnlib/ralib/automata/guards/Conjunction.java +++ b/src/main/java/de/learnlib/ralib/automata/guards/Conjunction.java @@ -29,6 +29,7 @@ * * @author falk */ +@Deprecated public class Conjunction extends GuardExpression { private final GuardExpression[] conjuncts; @@ -48,7 +49,7 @@ public GuardExpression relabel(VarMapping relabelling) { } @Override - public boolean isSatisfied(Mapping> val) { + public boolean isSatisfied(Mapping val) { for (GuardExpression ge : conjuncts) { if (!ge.isSatisfied(val)) { return false; diff --git a/src/main/java/de/learnlib/ralib/automata/guards/Disjunction.java b/src/main/java/de/learnlib/ralib/automata/guards/Disjunction.java index a7ff59ae..60cc545d 100644 --- a/src/main/java/de/learnlib/ralib/automata/guards/Disjunction.java +++ b/src/main/java/de/learnlib/ralib/automata/guards/Disjunction.java @@ -29,6 +29,7 @@ * * @author falk */ +@Deprecated public class Disjunction extends GuardExpression { private final GuardExpression[] disjuncts; @@ -48,7 +49,7 @@ public GuardExpression relabel(VarMapping relabelling) { } @Override - public boolean isSatisfied(Mapping> val) { + public boolean isSatisfied(Mapping val) { for (GuardExpression ge : disjuncts) { if (ge.isSatisfied(val)) { return true; diff --git a/src/main/java/de/learnlib/ralib/automata/guards/FalseGuardExpression.java b/src/main/java/de/learnlib/ralib/automata/guards/FalseGuardExpression.java index 806742d8..f6a1218e 100644 --- a/src/main/java/de/learnlib/ralib/automata/guards/FalseGuardExpression.java +++ b/src/main/java/de/learnlib/ralib/automata/guards/FalseGuardExpression.java @@ -27,6 +27,7 @@ * * @author falk */ +@Deprecated public class FalseGuardExpression extends GuardExpression { public static final FalseGuardExpression FALSE = new FalseGuardExpression(); @@ -37,7 +38,7 @@ public GuardExpression relabel(VarMapping relabelling) { } @Override - public boolean isSatisfied(Mapping> val) { + public boolean isSatisfied(Mapping val) { return true; } diff --git a/src/main/java/de/learnlib/ralib/automata/guards/GuardExpression.java b/src/main/java/de/learnlib/ralib/automata/guards/GuardExpression.java index 404c2427..c0d02403 100644 --- a/src/main/java/de/learnlib/ralib/automata/guards/GuardExpression.java +++ b/src/main/java/de/learnlib/ralib/automata/guards/GuardExpression.java @@ -29,11 +29,12 @@ * @author falk * */ +@Deprecated public abstract class GuardExpression { public abstract GuardExpression relabel(VarMapping relabelling); - public abstract boolean isSatisfied(Mapping> val); + public abstract boolean isSatisfied(Mapping val); public Set getSymbolicDataValues() { Set set = new LinkedHashSet<>(); diff --git a/src/main/java/de/learnlib/ralib/automata/guards/Negation.java b/src/main/java/de/learnlib/ralib/automata/guards/Negation.java index b64759fa..431c04eb 100644 --- a/src/main/java/de/learnlib/ralib/automata/guards/Negation.java +++ b/src/main/java/de/learnlib/ralib/automata/guards/Negation.java @@ -27,6 +27,7 @@ * * @author falk */ +@Deprecated public class Negation extends GuardExpression { private final GuardExpression negated; @@ -46,7 +47,7 @@ public GuardExpression relabel(VarMapping relabelling) { } @Override - public boolean isSatisfied(Mapping> val) { + public boolean isSatisfied(Mapping val) { return !negated.isSatisfied(val); } diff --git a/src/main/java/de/learnlib/ralib/automata/guards/Relation.java b/src/main/java/de/learnlib/ralib/automata/guards/Relation.java index 46f807eb..2ccbcde7 100644 --- a/src/main/java/de/learnlib/ralib/automata/guards/Relation.java +++ b/src/main/java/de/learnlib/ralib/automata/guards/Relation.java @@ -16,6 +16,7 @@ */ package de.learnlib.ralib.automata.guards; +@Deprecated public enum Relation { SMALLER("<"), diff --git a/src/main/java/de/learnlib/ralib/automata/guards/TrueGuardExpression.java b/src/main/java/de/learnlib/ralib/automata/guards/TrueGuardExpression.java index 8649b569..6494125c 100644 --- a/src/main/java/de/learnlib/ralib/automata/guards/TrueGuardExpression.java +++ b/src/main/java/de/learnlib/ralib/automata/guards/TrueGuardExpression.java @@ -27,6 +27,7 @@ * * @author falk */ +@Deprecated public class TrueGuardExpression extends GuardExpression { public static final TrueGuardExpression TRUE = new TrueGuardExpression(); @@ -37,7 +38,7 @@ public GuardExpression relabel(VarMapping relabelling) { } @Override - public boolean isSatisfied(Mapping> val) { + public boolean isSatisfied(Mapping val) { return true; } diff --git a/src/main/java/de/learnlib/ralib/automata/output/OutputTransition.java b/src/main/java/de/learnlib/ralib/automata/output/OutputTransition.java index 2692a4ec..81a98640 100644 --- a/src/main/java/de/learnlib/ralib/automata/output/OutputTransition.java +++ b/src/main/java/de/learnlib/ralib/automata/output/OutputTransition.java @@ -30,7 +30,10 @@ import de.learnlib.ralib.data.SymbolicDataValue.Parameter; import de.learnlib.ralib.data.SymbolicDataValue.Register; import de.learnlib.ralib.data.VarValuation; +import de.learnlib.ralib.smt.SMTUtils; import de.learnlib.ralib.words.OutputSymbol; +import gov.nasa.jpf.constraints.api.Expression; +import gov.nasa.jpf.constraints.util.ExpressionUtil; /** * Output transitions are a convenient way of @@ -42,20 +45,20 @@ public class OutputTransition extends Transition { private final OutputMapping output; - public OutputTransition(TransitionGuard guard, OutputMapping output, - OutputSymbol label, RALocation source, RALocation destination, - Assignment assignment) { + public OutputTransition(Expression guard, OutputMapping output, + OutputSymbol label, RALocation source, RALocation destination, + Assignment assignment) { super(label, guard, source, destination, assignment); this.output = output; } public OutputTransition(OutputMapping output, OutputSymbol label, RALocation source, RALocation destination, Assignment assignment) { - this( new TransitionGuard(), output, label, source, destination, assignment); + this(ExpressionUtil.TRUE, output, label, source, destination, assignment); } public boolean canBeEnabled(VarValuation registers, Constants consts) { // FIXME: this is not in general safe to do!! (We assume the guard to not have parameters) - return this.guard.isSatisfied(registers, new ParValuation(), consts); + return this.guard.evaluateSMT(SMTUtils.compose(registers, new ParValuation(), consts)); } @Override @@ -67,7 +70,7 @@ public boolean isEnabled(VarValuation registers, ParValuation parameters, Consta if (registers.containsValue(pval) || consts.containsValue(pval)) { return false; } - for (Entry> e : parameters) { + for (Entry e : parameters) { if (!p.equals(e.getKey()) && pval.equals(e.getValue())) { return false; } diff --git a/src/main/java/de/learnlib/ralib/automata/util/RAToDot.java b/src/main/java/de/learnlib/ralib/automata/util/RAToDot.java index 8b0f06d1..446a02fa 100644 --- a/src/main/java/de/learnlib/ralib/automata/util/RAToDot.java +++ b/src/main/java/de/learnlib/ralib/automata/util/RAToDot.java @@ -25,6 +25,7 @@ import de.learnlib.ralib.automata.TransitionGuard; import de.learnlib.ralib.automata.guards.TrueGuardExpression; import de.learnlib.ralib.automata.output.OutputTransition; +import gov.nasa.jpf.constraints.util.ExpressionUtil; /** * @@ -121,8 +122,8 @@ private void printTransitions(RegisterAutomaton ra) { private void printInputLabel(Transition t) { stringRA.append(t.getLabel()); - if (!t.getGuard().getCondition().equals(TrueGuardExpression.TRUE)) { - stringRA.append("|").append(escapeGuard(t.getGuard())); + if (!t.getGuard().equals(ExpressionUtil.TRUE)) { + stringRA.append("|").append(escapeGuard(t.toString())); } if (!t.getAssignment().getAssignment().isEmpty()) { stringRA.append("
"); @@ -132,8 +133,8 @@ private void printInputLabel(Transition t) { private void printOutputLabel(OutputTransition t) { stringRA.append(t.getLabel()); - if (!t.getGuard().getCondition().equals(TrueGuardExpression.TRUE)) { - stringRA.append("|").append(escapeGuard(t.getGuard())); + if (!t.getGuard().equals(ExpressionUtil.TRUE)) { + stringRA.append("|").append(escapeGuard(t.toString())); } if (!t.getOutput().getFreshParameters().isEmpty() || !t.getOutput().getOutput().isEmpty()) { @@ -146,7 +147,7 @@ private void printOutputLabel(OutputTransition t) { } } - private String escapeGuard(TransitionGuard g) { + private String escapeGuard(String g) { return g.toString().replaceAll("&", "&"); } } diff --git a/src/main/java/de/learnlib/ralib/automata/xml/ExpressionParser.java b/src/main/java/de/learnlib/ralib/automata/xml/ExpressionParser.java index 31d43216..e3592bd5 100644 --- a/src/main/java/de/learnlib/ralib/automata/xml/ExpressionParser.java +++ b/src/main/java/de/learnlib/ralib/automata/xml/ExpressionParser.java @@ -28,6 +28,10 @@ import de.learnlib.ralib.automata.guards.Relation; import de.learnlib.ralib.automata.guards.TrueGuardExpression; import de.learnlib.ralib.data.SymbolicDataValue; +import gov.nasa.jpf.constraints.api.Expression; +import gov.nasa.jpf.constraints.expressions.NumericBooleanExpression; +import gov.nasa.jpf.constraints.expressions.NumericComparator; +import gov.nasa.jpf.constraints.util.ExpressionUtil; /** * @@ -39,7 +43,7 @@ public class ExpressionParser { private final String expLine; private final Map pMap; - private GuardExpression predicate; + private Expression predicate; public ExpressionParser(String exp, Map pMap) { expLine = exp.trim(); @@ -53,56 +57,56 @@ private void buildExpression() this.predicate = buildDisjunction(expLine); } - private GuardExpression buildDisjunction(String dis) { + private Expression buildDisjunction(String dis) { StringTokenizer tok = new StringTokenizer(dis, "||"); if (tok.countTokens() < 2) { return buildConjunction(dis); } - List disjuncts = new ArrayList<>(); + List> disjuncts = new ArrayList<>(); while (tok.hasMoreTokens()) { disjuncts.add(buildConjunction(tok.nextToken().trim())); } - return new Disjunction(disjuncts.toArray(new GuardExpression[] {})); + return ExpressionUtil.or(disjuncts.toArray(new Expression[] {})); } - private GuardExpression buildConjunction(String con) { + private Expression buildConjunction(String con) { StringTokenizer tok = new StringTokenizer(con, "&&"); if (tok.countTokens() < 2) { return buildPredicate(con); } - List conjuncts = new ArrayList<>(); + List> conjuncts = new ArrayList<>(); while (tok.hasMoreTokens()) { conjuncts.add(buildPredicate(tok.nextToken().trim())); } - return new Conjunction(conjuncts.toArray(new GuardExpression[] {})); + return ExpressionUtil.and(conjuncts.toArray(new Expression[] {})); } - private GuardExpression buildPredicate(String pred) + private Expression buildPredicate(String pred) { pred = pred.replace("!=", "!!"); if (pred.trim().length() < 1) { - return new TrueGuardExpression(); + return ExpressionUtil.TRUE; } - Relation relation = null; + NumericComparator relation = null; String[] related = null; if (pred.contains("==")) { related = pred.split("=="); - relation = Relation.EQUALS; + relation = NumericComparator.EQ; } else if (pred.contains("!!")) { related = pred.split("!!"); - relation = Relation.NOT_EQUALS; + relation = NumericComparator.NE; } else if (pred.contains("<")) { related = pred.split("<"); - relation = Relation.SMALLER; + relation = NumericComparator.LT; } else if (pred.contains(">")) { related = pred.split(">"); - relation = Relation.BIGGER; + relation = NumericComparator.GT; } if (relation == null) { @@ -112,13 +116,13 @@ else if (pred.contains(">")) { SymbolicDataValue left = pMap.get(related[0].trim()); SymbolicDataValue right = pMap.get(related[1].trim()); - return new AtomicGuardExpression(left, relation, right); + return new NumericBooleanExpression(left, relation, right); } /** * @return the predicate */ - public GuardExpression getPredicate() { + public Expression getPredicate() { return predicate; } diff --git a/src/main/java/de/learnlib/ralib/automata/xml/RegisterAutomatonExporter.java b/src/main/java/de/learnlib/ralib/automata/xml/RegisterAutomatonExporter.java index 788401b3..6e98b62e 100644 --- a/src/main/java/de/learnlib/ralib/automata/xml/RegisterAutomatonExporter.java +++ b/src/main/java/de/learnlib/ralib/automata/xml/RegisterAutomatonExporter.java @@ -23,12 +23,13 @@ import java.util.Map; import java.util.Map.Entry; import java.util.Set; + +import gov.nasa.jpf.constraints.api.Expression; import jakarta.xml.bind.JAXB; import de.learnlib.ralib.automata.Assignment; import de.learnlib.ralib.automata.RALocation; import de.learnlib.ralib.automata.Transition; -import de.learnlib.ralib.automata.TransitionGuard; import de.learnlib.ralib.automata.output.OutputMapping; import de.learnlib.ralib.automata.output.OutputTransition; import de.learnlib.ralib.data.Constants; @@ -53,11 +54,11 @@ public class RegisterAutomatonExporter { private static RegisterAutomaton.Constants exportConstants(Constants consts) { RegisterAutomaton.Constants ret = factory.createRegisterAutomatonConstants(); - for (Entry> e : consts) { + for (Entry e : consts) { RegisterAutomaton.Constants.Constant c = factory.createRegisterAutomatonConstantsConstant(); c.setName(e.getKey().toString()); - c.setType(e.getKey().getType().getName()); - c.setValue(e.getValue().getId().toString()); + c.setType(e.getKey().getDataType().getName()); + c.setValue(e.getValue().getValue().toString()); ret.getConstant().add(c); } return ret; @@ -68,7 +69,7 @@ private static RegisterAutomaton.Globals exportRegisters(Collection re for (Register r : reg) { RegisterAutomaton.Globals.Variable v = factory.createRegisterAutomatonGlobalsVariable(); v.setName(r.toString()); - v.setType(r.getType().getName()); + v.setType(r.getDataType().getName()); v.setValue("0"); ret.getVariable().add(v); } @@ -206,8 +207,8 @@ private static RegisterAutomaton.Transitions.Transition exportOutputTransition( // assignments are assumed to happen before // output by the parser if (out instanceof Register) { - String tmpName = "tmp_" + out.getType().getName() + "_" + idx; - tmp.put(tmpName, out.getType()); + String tmpName = "tmp_" + out.getDataType().getName() + "_" + idx; + tmp.put(tmpName, out.getDataType()); RegisterAutomaton.Transitions.Transition.Assignments.Assign a = factory.createRegisterAutomatonTransitionsTransitionAssignmentsAssign(); @@ -232,7 +233,7 @@ private static RegisterAutomaton.Transitions.Transition exportOutputTransition( return ret; } - private static String exportGuard(TransitionGuard guard) { + private static String exportGuard(Expression guard) { String g = guard.toString(); if (!g.contains("=") && !g.contains("<") && !g.contains(">")) { return null; diff --git a/src/main/java/de/learnlib/ralib/automata/xml/RegisterAutomatonImporter.java b/src/main/java/de/learnlib/ralib/automata/xml/RegisterAutomatonImporter.java index 1c52e6a4..91cbe3cb 100644 --- a/src/main/java/de/learnlib/ralib/automata/xml/RegisterAutomatonImporter.java +++ b/src/main/java/de/learnlib/ralib/automata/xml/RegisterAutomatonImporter.java @@ -27,6 +27,9 @@ import java.util.ListIterator; import java.util.Map; import java.util.Set; + +import gov.nasa.jpf.constraints.api.Expression; +import gov.nasa.jpf.constraints.util.ExpressionUtil; import jakarta.xml.bind.JAXB; import org.slf4j.Logger; @@ -149,12 +152,12 @@ private void loadModel(InputStream is) { // guard String gstring = t.getGuard(); - TransitionGuard p = new TransitionGuard(); + Expression p = ExpressionUtil.TRUE; if (gstring != null) { Map map = buildValueMap( constMap, regMap, (ps instanceof OutputSymbol) ? new LinkedHashMap() : paramMap); ExpressionParser parser = new ExpressionParser(gstring, map); - p = new TransitionGuard(parser.getPredicate()); + p = parser.getPredicate(); } // assignment @@ -286,7 +289,7 @@ private void getConstants(RegisterAutomaton.Constants xml) { constMap.put(def.value, c); constMap.put(def.name, c); LOGGER.trace(Category.DATASTRUCTURE, "{} ->{}", def.name, c); - DataValue dv = new DataValue(type, Integer.parseInt(def.value)); + DataValue dv = new DataValue(type, new BigDecimal(def.value)); consts.put(c, dv); } LOGGER.trace(Category.EVENT, "Loading: {}", consts); @@ -299,19 +302,7 @@ private void getRegisters(RegisterAutomaton.Globals g) { Register r = rgen.next(type); regMap.put(def.name, r); LOGGER.trace(Category.DATASTRUCTURE, "{} ->{}", def.name, r); - Object o = null; - switch (type.getBase().getName()) { - case "java.lang.Integer": - o = Integer.parseInt(def.value); - break; - case "java.lang.Double": - o = BigDecimal.valueOf(Double.parseDouble(def.value)); - break; - default: - throw new IllegalStateException( - "Unsupported Register Type: " + - type.getBase().getName()); - } + BigDecimal o = new BigDecimal(def.value); DataValue dv = new DataValue(type, o); initialRegs.put(r, dv); } @@ -326,7 +317,7 @@ private DataType getOrCreateType(String name) { DataType t = typeMap.get(name); if (t == null) { // TODO: there should be a proper way of specifying java types to be bound - t = new DataType(name, isDoubleTempCheck(name) ? Double.class : Integer.class); + t = new DataType(name); typeMap.put(name, t); } return t; diff --git a/src/main/java/de/learnlib/ralib/ceanalysis/Essentializer.java b/src/main/java/de/learnlib/ralib/ceanalysis/Essentializer.java index f594e21a..76e277b8 100644 --- a/src/main/java/de/learnlib/ralib/ceanalysis/Essentializer.java +++ b/src/main/java/de/learnlib/ralib/ceanalysis/Essentializer.java @@ -27,14 +27,14 @@ import de.learnlib.ralib.words.ParameterizedSymbol; import net.automatalib.word.Word; -public class Essentializer { +public class Essentializer { - private final EqualityTheory theory; + private final EqualityTheory theory; private final DataWordOracle sulOracle; private final DataWordOracle hypOracle; - public Essentializer(EqualityTheory theory, DataWordOracle sulOracle, DataWordOracle hypOracle) { + public Essentializer(EqualityTheory theory, DataWordOracle sulOracle, DataWordOracle hypOracle) { this.theory = theory; this.sulOracle = sulOracle; this.hypOracle = hypOracle; @@ -54,7 +54,7 @@ public Word essentialEq(Word in) { continue; } // can we make index unique - DataValue fresh = theory.getFreshValue(Arrays.asList(vals)); + DataValue fresh = theory.getFreshValue(Arrays.asList(vals)); vals[index] = fresh; Word instantiated = DataWords.instantiate(acts, vals); if(refOutSul == sulOracle.answerQuery(instantiated) && diff --git a/src/main/java/de/learnlib/ralib/ceanalysis/PrefixFinder.java b/src/main/java/de/learnlib/ralib/ceanalysis/PrefixFinder.java index 97beee74..de08067d 100644 --- a/src/main/java/de/learnlib/ralib/ceanalysis/PrefixFinder.java +++ b/src/main/java/de/learnlib/ralib/ceanalysis/PrefixFinder.java @@ -5,6 +5,7 @@ import java.util.Map; import java.util.Set; +import gov.nasa.jpf.constraints.util.ExpressionUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -200,7 +201,7 @@ private boolean transitionHasCE(Word ce, int idx) { boolean hasCE = sdtOracle.hasCounterexample(location, resHyp.getSdt(), resHyp.getPiv(), resSul.getSdt(), resSul.getPiv(), - new TransitionGuard(), transition); + ExpressionUtil.TRUE, transition); if (hasCE) { SymbolicWord sw = candidate(location, symSuffix, resSul.getSdt(), resSul.getPiv(), resHyp.getSdt(), resHyp.getPiv(), ce); @@ -258,7 +259,7 @@ private SymbolicWord candidate(Word prefix, GuardExpression exprR = expr.relabel(renaming); ParValuation pars = new ParValuation(path); - Mapping> vals = new Mapping<>(); + Mapping vals = new Mapping<>(); vals.putAll(DataWords.computeVarValuation(pars, pivSul)); vals.putAll(pars); vals.putAll(consts); diff --git a/src/main/java/de/learnlib/ralib/data/Constants.java b/src/main/java/de/learnlib/ralib/data/Constants.java index f7a54d02..726bf601 100644 --- a/src/main/java/de/learnlib/ralib/data/Constants.java +++ b/src/main/java/de/learnlib/ralib/data/Constants.java @@ -21,6 +21,6 @@ * * @author falk */ -public class Constants extends Mapping> { +public class Constants extends Mapping { } diff --git a/src/main/java/de/learnlib/ralib/data/DataType.java b/src/main/java/de/learnlib/ralib/data/DataType.java index 8d97540a..98c70a46 100644 --- a/src/main/java/de/learnlib/ralib/data/DataType.java +++ b/src/main/java/de/learnlib/ralib/data/DataType.java @@ -30,14 +30,8 @@ public final class DataType { */ final String name; - /** - * base type - */ - final Class base; - - public DataType(String name, Class base) { + public DataType(String name) { this.name = name; - this.base = base; } @Override @@ -66,7 +60,4 @@ public String getName() { return name; } - public Class getBase() { - return base; - } } diff --git a/src/main/java/de/learnlib/ralib/data/DataValue.java b/src/main/java/de/learnlib/ralib/data/DataValue.java index 17658ad5..9f4e8f30 100644 --- a/src/main/java/de/learnlib/ralib/data/DataValue.java +++ b/src/main/java/de/learnlib/ralib/data/DataValue.java @@ -16,34 +16,38 @@ */ package de.learnlib.ralib.data; +import gov.nasa.jpf.constraints.expressions.Constant; +import gov.nasa.jpf.constraints.types.BuiltinTypes; +import gov.nasa.jpf.constraints.types.Type; + +import java.math.BigDecimal; import java.util.Objects; /** + * RaLib extension of SMT constant values that + * retains user-annotated type information * * @author falk - * @param a type parameter */ -public class DataValue { +public class DataValue extends Constant { protected final DataType type; - protected final T id; - - public DataValue(DataType type, T id) { + public DataValue(DataType type, BigDecimal value) { + super(BuiltinTypes.DECIMAL, value); this.type = type; - this.id = id; } @Override public String toString() { - return id.toString() + "[" + this.type.getName() + "]"; + return getValue().toString() + "[" + this.type.getName() + "]"; } @Override public int hashCode() { int hash = 7; hash = 97 * hash + Objects.hashCode(this.type); - hash = 97 * hash + Objects.hashCode(this.id); + hash = 97 * hash + Objects.hashCode(this.getValue()); return hash; } @@ -55,51 +59,25 @@ public boolean equals(Object obj) { if (!(obj instanceof DataValue)) { return false; } - final DataValue other = (DataValue) obj; + final DataValue other = (DataValue) obj; if (!Objects.equals(this.type, other.type)) { return false; } - if (!Objects.equals(this.id, other.id)) { + if (!this.getValue().equals(other.getValue())) { return false; } return true; } - public T getId() { - return id; - } - - public DataType getType() { + public DataType getDataType() { return type; } - public static

DataValue

valueOf(String strVal, DataType type) { - return new DataValue(type, valueOf(strVal, type.getBase())); + @Override + public BigDecimal getValue() { + return super.getValue(); } - - public static

P valueOf(String strVal, Class

cls) { - P realValue = null; - if (Number.class.isAssignableFrom(cls)) { - Object objVal; - try { - objVal = cls.getMethod("valueOf", String.class).invoke(cls, strVal); - - realValue = cls.cast(objVal); - } catch (Exception e) { - throw new RuntimeException(e); - } - } else { - if (cls.isPrimitive()) { - if (cls.equals(int.class)) - return (P) Integer.valueOf(strVal); - else if (cls.equals(double.class)) - return (P) Double.valueOf(strVal); - else if (cls.equals(long.class)) - return (P) Long.valueOf(strVal); - } - throw new RuntimeException("Cannot deserialize values of the class " + cls); - } - return realValue; + public static DataValue valueOf(String strVal, DataType type) { + return new DataValue(type, new BigDecimal(strVal)); } - } diff --git a/src/main/java/de/learnlib/ralib/data/FreshValue.java b/src/main/java/de/learnlib/ralib/data/FreshValue.java index 5061d0dc..895e9116 100644 --- a/src/main/java/de/learnlib/ralib/data/FreshValue.java +++ b/src/main/java/de/learnlib/ralib/data/FreshValue.java @@ -16,13 +16,15 @@ */ package de.learnlib.ralib.data; +import java.math.BigDecimal; + /** * * @author falk */ -public class FreshValue extends DataValue { +public class FreshValue extends DataValue { - public FreshValue(DataType type, T id) { + public FreshValue(DataType type, BigDecimal id) { super(type, id); } diff --git a/src/main/java/de/learnlib/ralib/data/Mapping.java b/src/main/java/de/learnlib/ralib/data/Mapping.java index 13ccd4e9..8a1be60f 100644 --- a/src/main/java/de/learnlib/ralib/data/Mapping.java +++ b/src/main/java/de/learnlib/ralib/data/Mapping.java @@ -31,7 +31,8 @@ * @param * @param */ -public class Mapping> extends LinkedHashMap +@Deprecated +public class Mapping extends LinkedHashMap implements Iterable> { /** @@ -41,11 +42,11 @@ public class Mapping> extends LinkedHashMap * @param type the type * @return */ - public Collection> values(DataType type) { - List> list = new ArrayList<>(); - for (DataValue v : values()) { + public Collection values(DataType type) { + List list = new ArrayList<>(); + for (DataValue v : values()) { if (v.type.equals(type)) { - list.add((DataValue) v); + list.add(v); } } return list; diff --git a/src/main/java/de/learnlib/ralib/data/PIV.java b/src/main/java/de/learnlib/ralib/data/PIV.java index 08bdf0e7..3edc75c0 100644 --- a/src/main/java/de/learnlib/ralib/data/PIV.java +++ b/src/main/java/de/learnlib/ralib/data/PIV.java @@ -48,9 +48,9 @@ public PIV relabel(VarMapping relabelling) { public Map typedSize() { Map ret = new LinkedHashMap<>(); for (Parameter p : keySet()) { - Integer i = ret.get(p.getType()); + Integer i = ret.get(p.getDataType()); i = (i == null) ? 1 : i+1; - ret.put(p.getType(), i); + ret.put(p.getDataType(), i); } return ret; } @@ -58,10 +58,10 @@ public Map typedSize() { public Map asTypedArrays() { Map> tmp = new LinkedHashMap<>(); for (Parameter p : keySet()) { - List list = tmp.get(p.getType()); + List list = tmp.get(p.getDataType()); if (list == null) { list = new ArrayList<>(); - tmp.put(p.getType(), list); + tmp.put(p.getDataType(), list); } list.add(p); } @@ -79,7 +79,7 @@ public Parameter getOneKey(Register value) { for (Map.Entry entry : this.entrySet()) { // System.out.println("key = " + entry.getKey().toString()); // System.out.println("value = " + entry.getValue().toString()); - if (entry.getValue().getId().equals(value.getId())){ + if (entry.getValue().getId() == value.getId()){ // System.out.println(entry.getValue().toString() + " equals " + value.toString()); retKey = entry.getKey(); break; @@ -105,7 +105,7 @@ public VarMapping createRemapping(PIV to) { for (Entry e : this) { Register rep = to.get(e.getKey()); if (rep == null) { - rep = new Register(e.getValue().getType(), id++); + rep = new Register(e.getValue().getDataType(), id++); } map.put(e.getValue(), rep); } diff --git a/src/main/java/de/learnlib/ralib/data/ParValuation.java b/src/main/java/de/learnlib/ralib/data/ParValuation.java index 7f54d341..9ddfa964 100644 --- a/src/main/java/de/learnlib/ralib/data/ParValuation.java +++ b/src/main/java/de/learnlib/ralib/data/ParValuation.java @@ -20,6 +20,7 @@ import de.learnlib.ralib.data.util.SymbolicDataValueGenerator.ParameterGenerator; import de.learnlib.ralib.words.PSymbolInstance; +import gov.nasa.jpf.constraints.api.Valuation; import net.automatalib.word.Word; /** @@ -27,7 +28,8 @@ * * @author falk */ -public class ParValuation extends Mapping> { +@Deprecated +public class ParValuation extends Mapping { public ParValuation() { @@ -36,7 +38,7 @@ public ParValuation() { public ParValuation(PSymbolInstance psi) { ParameterGenerator pgen = new ParameterGenerator(); for (DataValue dv : psi.getParameterValues()) { - this.put(pgen.next(dv.getType()), dv); + this.put(pgen.next(dv.getDataType()), dv); } } @@ -46,7 +48,7 @@ public ParValuation(Word dw) { while (it.hasNext()) { PSymbolInstance psi = it.next(); for (DataValue dv : psi.getParameterValues()) { - put(pgen.next(dv.getType()), dv); + put(pgen.next(dv.getDataType()), dv); } } } diff --git a/src/main/java/de/learnlib/ralib/data/SuffixValuation.java b/src/main/java/de/learnlib/ralib/data/SuffixValuation.java index 6cf33677..1634e369 100644 --- a/src/main/java/de/learnlib/ralib/data/SuffixValuation.java +++ b/src/main/java/de/learnlib/ralib/data/SuffixValuation.java @@ -20,7 +20,7 @@ * * @author falk */ -//TODO: check is necessary -public class SuffixValuation extends Mapping> { +@Deprecated +public class SuffixValuation extends Mapping { } diff --git a/src/main/java/de/learnlib/ralib/data/SymbolicDataValue.java b/src/main/java/de/learnlib/ralib/data/SymbolicDataValue.java index 9e986df0..b96859ce 100644 --- a/src/main/java/de/learnlib/ralib/data/SymbolicDataValue.java +++ b/src/main/java/de/learnlib/ralib/data/SymbolicDataValue.java @@ -16,6 +16,10 @@ */ package de.learnlib.ralib.data; +import gov.nasa.jpf.constraints.api.Variable; +import gov.nasa.jpf.constraints.types.BuiltinTypes; + +import java.math.BigDecimal; import java.util.Objects; /** @@ -23,83 +27,75 @@ * * @author falk */ -public abstract class SymbolicDataValue extends DataValue { +@Deprecated +public abstract class SymbolicDataValue extends Variable { public static final class Parameter extends SymbolicDataValue { public Parameter(DataType dataType, int id) { - super(dataType, id); - } - - public boolean equals(Parameter other) { - return (this.getType().equals(other.getType()) && this.getId().equals(other.getId())); - } - - @Override - public SymbolicDataValue.Parameter copy() { - return new SymbolicDataValue.Parameter(type, id); + super(dataType, id, "p" + id); } }; public static final class Register extends SymbolicDataValue { public Register(DataType dataType, int id) { - super(dataType, id); - } - - @Override - public SymbolicDataValue.Register copy() { - return new SymbolicDataValue.Register(type, id); + super(dataType, id, "r" + id); } }; public static final class Constant extends SymbolicDataValue { public Constant(DataType dataType, int id) { - super(dataType, id); - } - - @Override - public SymbolicDataValue.Constant copy() { - return new SymbolicDataValue.Constant(type, id); + super(dataType, id, "c" + id); } }; + /* + * a parameter in a suffix: we should replace those by v_i + */ public static final class SuffixValue extends SymbolicDataValue { public SuffixValue(DataType dataType, int id) { - super(dataType, id); - } - - @Override - public SymbolicDataValue.SuffixValue copy() { - return new SymbolicDataValue.SuffixValue(type, id); + super(dataType, id, "s" + id); } }; - private SymbolicDataValue(DataType dataType, int id) { - super(dataType, id); + final DataType type; + + final int id; + + // TODO: id needed? + private SymbolicDataValue(DataType dataType, int id, String name) { + super(BuiltinTypes.DECIMAL, name); + this.type = dataType; + this.id = id; } - public String toStringWithType() { - return this.toString() + ":" + this.type.getName(); + public DataType getDataType() { + return this.type; } - public abstract SymbolicDataValue copy(); + public int getId() { + return this.id; + } + + public static T copy(T orig) { + if (orig.isParameter()) { + return (T) new Parameter(orig.type, orig.id); + } else if (orig.isRegister()) { + return (T) new Register(orig.type, orig.id); + } else if (orig.isConstant()) { + return (T) new Constant(orig.type, orig.id); + } else if (orig.isSuffixValue()) { + return (T) new SuffixValue(orig.type, orig.id); + } + throw new RuntimeException("should not be reachable."); + } @Override public String toString() { - String s = ""; - if (this.isParameter()) { - s += "p"; - } else if (this.isRegister()) { - s += "r"; - } else if (this.isSuffixValue()) { - s += "s"; - } else if (this.isConstant()) { - s += "c"; - } - return s + this.id; + return getName(); } @Override diff --git a/src/main/java/de/learnlib/ralib/data/VarMapping.java b/src/main/java/de/learnlib/ralib/data/VarMapping.java index 0935c293..30426e93 100644 --- a/src/main/java/de/learnlib/ralib/data/VarMapping.java +++ b/src/main/java/de/learnlib/ralib/data/VarMapping.java @@ -16,6 +16,10 @@ */ package de.learnlib.ralib.data; +import com.google.common.base.Function; + +import java.util.*; + /** * maps symbolic data values to symbolic data values. * @@ -24,8 +28,9 @@ * @param * @param */ +@Deprecated public class VarMapping -extends Mapping { + extends LinkedHashMap implements Iterable> { public VarMapping(SymbolicDataValue ... kvpairs) { for (int i=0; i Collection values(DataType type) { + List list = new ArrayList<>(); + for (SymbolicDataValue v : values()) { + if (v.type.equals(type)) { + list.add(v); + } + } + return list; + } + + @Override + public Iterator> iterator() { + return this.entrySet().iterator(); + } + + @Override + public boolean equals(Object obj) { + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + final VarMapping other = (VarMapping) obj; + return other.entrySet().equals(entrySet()); + } + + @Override + public int hashCode() { + int hash = 7; + return hash * this.entrySet().hashCode(); + } + +// @Override +// public V get(Object key) { +// V v = super.get(key); +// if (v == null) { +// throw new IllegalStateException(); +// } +// return v; +// } + + public String toString(String map) { + StringBuilder sb = new StringBuilder(); + sb.append("["); + for (Map.Entry e : entrySet()) { + sb.append(e.getKey()).append(map).append(e.getValue()).append(","); + } + sb.append("]"); + return sb.toString(); + } + + public Set getAllKeys(V value) { + Set retKeySet = new LinkedHashSet(); + for (Map.Entry entry : this.entrySet()) { + //log.trace("key = " + K); + //log.trace("value = " + entry.getKey().toString()); + if (entry.getValue().equals(value)){ + //log.trace(entry.getKey().toString() + " equals " + value.toString()); + retKeySet.add(entry.getKey()); + } + } + return retKeySet; + } + + @Override + public String toString() { + return toString(">"); + } } diff --git a/src/main/java/de/learnlib/ralib/data/VarValuation.java b/src/main/java/de/learnlib/ralib/data/VarValuation.java index ac3a02fa..a82c4a62 100644 --- a/src/main/java/de/learnlib/ralib/data/VarValuation.java +++ b/src/main/java/de/learnlib/ralib/data/VarValuation.java @@ -16,12 +16,15 @@ */ package de.learnlib.ralib.data; +import java.util.Optional; + /** * A valuation of registers. * * @author falk */ -public class VarValuation extends Mapping> { +@Deprecated +public class VarValuation extends Mapping { public VarValuation(VarValuation other) { if (other != null) { diff --git a/src/main/java/de/learnlib/ralib/data/WordValuation.java b/src/main/java/de/learnlib/ralib/data/WordValuation.java index 0d2f39e9..24c20067 100644 --- a/src/main/java/de/learnlib/ralib/data/WordValuation.java +++ b/src/main/java/de/learnlib/ralib/data/WordValuation.java @@ -22,6 +22,6 @@ */ //TODO: check is necessary public class WordValuation extends - Mapping> { + Mapping { } diff --git a/src/main/java/de/learnlib/ralib/dt/DTHyp.java b/src/main/java/de/learnlib/ralib/dt/DTHyp.java index 6f575601..9b3cca5a 100644 --- a/src/main/java/de/learnlib/ralib/dt/DTHyp.java +++ b/src/main/java/de/learnlib/ralib/dt/DTHyp.java @@ -12,8 +12,10 @@ import de.learnlib.ralib.data.VarValuation; import de.learnlib.ralib.learning.Hypothesis; import de.learnlib.ralib.oracles.Branching; +import de.learnlib.ralib.smt.SMTUtils; import de.learnlib.ralib.words.PSymbolInstance; import de.learnlib.ralib.words.ParameterizedSymbol; +import gov.nasa.jpf.constraints.api.Expression; import net.automatalib.word.Word; public class DTHyp extends Hypothesis { @@ -79,7 +81,7 @@ protected List> getDTTransitions(Word dw) ParValuation pars = new ParValuation(psi); - Map, TransitionGuard> candidates = + Map, Expression> candidates = current.getBranching(psi.getBaseSymbol()).getBranches(); if (candidates == null) { @@ -87,9 +89,9 @@ protected List> getDTTransitions(Word dw) } boolean found = false; - for (Map.Entry, TransitionGuard> e : candidates.entrySet()) { - TransitionGuard g = e.getValue(); - if (g.isSatisfied(vars, pars, this.constants)) { + for (Map.Entry, Expression> e : candidates.entrySet()) { + Expression g = e.getValue(); + if (g.evaluateSMT(SMTUtils.compose(vars, pars, this.constants))) { Word w = e.getKey(); vars = current.getAssignment(w, dt.getLeaf(w)).compute(vars, pars, this.constants); current = dt.getLeaf(w); diff --git a/src/main/java/de/learnlib/ralib/dt/DTLeaf.java b/src/main/java/de/learnlib/ralib/dt/DTLeaf.java index 854fca8b..a1257bd7 100644 --- a/src/main/java/de/learnlib/ralib/dt/DTLeaf.java +++ b/src/main/java/de/learnlib/ralib/dt/DTLeaf.java @@ -14,6 +14,7 @@ import com.google.common.collect.Iterators; import com.google.common.collect.Sets; +import gov.nasa.jpf.constraints.api.Expression; import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; @@ -323,17 +324,17 @@ private Pair, Word> startPrefix(DT dt, Sh static public Word branchWithSameGuard(Word word, Branching wordBranching, PIV wordPIV, Branching accBranching, PIV accPIV, SDTLogicOracle oracle) { Word a = null; - TransitionGuard g = null; - for (Entry, TransitionGuard> e : wordBranching.getBranches().entrySet()) { + Expression g = null; + for (Entry, Expression> e : wordBranching.getBranches().entrySet()) { if (e.getKey().equals(word)) { g = e.getValue(); break; } } - for (Entry, TransitionGuard> e : accBranching.getBranches().entrySet()) { - TransitionGuard ag = e.getValue(); - boolean eq = oracle.areEquivalent(g, accPIV, ag, accPIV, new Mapping>()); + for (Entry, Expression> e : accBranching.getBranches().entrySet()) { + Expression ag = e.getValue(); + boolean eq = oracle.areEquivalent(g, accPIV, ag, accPIV, new Mapping()); if (eq) { a = e.getKey(); break; @@ -635,7 +636,7 @@ public Assignment getAssignment(Word dest_id, DTLeaf dest_c) { // remapping is null for prime rows ... Register rNew = (remapping == null) ? e.getValue() : (Register) remapping.get(e.getValue()); if (p.getId() > max) { - Parameter pNew = new Parameter(p.getType(), p.getId() - max); + Parameter pNew = new Parameter(p.getDataType(), p.getId() - max); assignments.put(rNew, pNew); } else { Register rOld = parsInVars_Src.get(p); diff --git a/src/main/java/de/learnlib/ralib/dt/MappedPrefix.java b/src/main/java/de/learnlib/ralib/dt/MappedPrefix.java index fca23430..c3133758 100644 --- a/src/main/java/de/learnlib/ralib/dt/MappedPrefix.java +++ b/src/main/java/de/learnlib/ralib/dt/MappedPrefix.java @@ -72,7 +72,7 @@ void updateMemorable(PIV piv) { for (Entry e : piv.entrySet()) { Register r = memorable.get(e.getKey()); if (r == null) { - r = regGen.next(e.getKey().getType()); + r = regGen.next(e.getKey().getDataType()); memorable.put(e.getKey(), r); } } diff --git a/src/main/java/de/learnlib/ralib/dt/PathResult.java b/src/main/java/de/learnlib/ralib/dt/PathResult.java index acd149d7..c34bd4d8 100644 --- a/src/main/java/de/learnlib/ralib/dt/PathResult.java +++ b/src/main/java/de/learnlib/ralib/dt/PathResult.java @@ -44,7 +44,7 @@ private void addResult(SymbolicSuffix s, TreeQueryResult tqr) { for (Map.Entry e : cpv.entrySet()) { SymbolicDataValue.Register r = this.memorable.get(e.getKey()); if (r == null) { - r = regGen.next(e.getKey().getType()); + r = regGen.next(e.getKey().getDataType()); memorable.put(e.getKey(), r); } relabelling.put(e.getValue(), r); diff --git a/src/main/java/de/learnlib/ralib/equivalence/IOEquivalenceTest.java b/src/main/java/de/learnlib/ralib/equivalence/IOEquivalenceTest.java index 38e3708d..d81066cc 100644 --- a/src/main/java/de/learnlib/ralib/equivalence/IOEquivalenceTest.java +++ b/src/main/java/de/learnlib/ralib/equivalence/IOEquivalenceTest.java @@ -139,7 +139,7 @@ private boolean compatible(Tuple t1, Tuple t2) private boolean compareRegister( VarValuation r1, VarValuation r2, Map vMap) { - for (Map.Entry> entry : r1.entrySet()) + for (Map.Entry entry : r1.entrySet()) { DataValue v1 = entry.getValue(); DataValue v2 = r2.get(entry.getKey()); @@ -153,8 +153,8 @@ private boolean compareRegister( if (n1 || n2) return false; - Object o1 = vMap.get(v1.getId()); - if (o1 != null && !o1.equals(v2.getId())) { + Object o1 = vMap.get(v1.getValue()); + if (o1 != null && !o1.equals(v2.getValue())) { return false; } @@ -165,7 +165,7 @@ private boolean compareRegister( return false; } } - vMap.put( v1.getId(), v2.getId()); + vMap.put( v1.getValue(), v2.getValue()); } return true; @@ -421,7 +421,7 @@ private List> getNext(Word w, ParameterizedSymbol ps, VarValuation r1, //VarValuation r2, boolean checkForEqualParameters) { - Set> potential = new LinkedHashSet<>(); + Set potential = new LinkedHashSet<>(); potential.addAll(r1.values()); // this is maybe ok during learning //potential.addAll(r2.values()); @@ -433,7 +433,7 @@ private List> getNext(Word w, List valuations = new ArrayList<>(); computeValuations(ps, valuations, potential, - new ArrayList>(),checkForEqualParameters, DataWords.valSet(w)); + new ArrayList(),checkForEqualParameters, DataWords.valSet(w)); List> ret = new ArrayList<>(); for (DataValue[] data : valuations) { @@ -445,8 +445,8 @@ private List> getNext(Word w, // FIXME: this work only for the equality case!!!! private void computeValuations(ParameterizedSymbol ps, List valuations, - Set> potential, List> val, - boolean checkForEqualParameters, Set> prefixVals) { + Set potential, List val, + boolean checkForEqualParameters, Set prefixVals) { int idx = val.size(); if (idx >= ps.getArity()) { @@ -466,23 +466,23 @@ private void computeValuations(ParameterizedSymbol ps, List valuati //System.out.println("FOR FRESH: " + Arrays.toString(forFresh.toArray()) + " for " + t); DataValue fresh = teach.getFreshValue(new ArrayList<>(forFresh)); //next.add(fresh); - List> nextValFresh = new ArrayList<>(val); + List nextValFresh = new ArrayList<>(val); nextValFresh.add(fresh); computeValuations(ps, valuations, potential, nextValFresh, checkForEqualParameters, prefixVals); for (DataValue d : next) { - List> nextVal = new ArrayList<>(val); + List nextVal = new ArrayList<>(val); nextVal.add(d); computeValuations(ps, valuations, potential, nextVal, checkForEqualParameters, prefixVals); } } - private Set valSet(Collection> in, DataType t) { + private Set valSet(Collection in, DataType t) { Set out = new LinkedHashSet<>(); for (DataValue dv : in) { - if (dv.getType().equals(t)) { + if (dv.getDataType().equals(t)) { out.add(dv); } } @@ -501,10 +501,11 @@ private PSymbolInstance createOutputSymbol(OutputTransition ot, VarValuation reg SymbolicDataValue.Parameter p = pgen.next(t); if (!mapping.getOutput().keySet().contains(p)) { - Set> forFresh = new LinkedHashSet<>(); + Set forFresh = new LinkedHashSet<>(); forFresh.addAll(register.values()); forFresh.addAll(register2.values()); List old = computeOld(t, pval, valSet(forFresh, t)); + System.out.println("OLD:" + Arrays.toString(old.toArray())); vals[i] = teacher.get(t).getFreshValue(old); } else { @@ -543,7 +544,7 @@ private List computeOld(DataType t, ParValuation pval, Set stored) { stored.addAll(consts.values()); for (DataValue d : pval.values()){ - if (d.getType().equals(t)) { + if (d.getDataType().equals(t)) { stored.add(d); } } diff --git a/src/main/java/de/learnlib/ralib/equivalence/IORandomWalk.java b/src/main/java/de/learnlib/ralib/equivalence/IORandomWalk.java index eddfcb97..e29f86b2 100644 --- a/src/main/java/de/learnlib/ralib/equivalence/IORandomWalk.java +++ b/src/main/java/de/learnlib/ralib/equivalence/IORandomWalk.java @@ -189,22 +189,22 @@ private PSymbolInstance nextDataValues( for (DataType t : ps.getPtypes()) { Theory teacher = teachers.get(t); // TODO: generics hack? - Set> oldSet = DataWords.valSet(run, t); + Set oldSet = DataWords.valSet(run, t); for (int j = 0; j < i; j++) { - if (vals[j].getType().equals(t)) { + if (vals[j].getDataType().equals(t)) { oldSet.add(vals[j]); } } - ArrayList> old = new ArrayList<>(oldSet); + ArrayList old = new ArrayList<>(oldSet); - Set> newSet = new HashSet<>( + Set newSet = new HashSet<>( teacher.getAllNextValues(old)); // TODO: add constants in teacher? newSet.addAll(constants.values(t)); newSet.removeAll(old); - ArrayList> newList = new ArrayList<>(newSet); + ArrayList newList = new ArrayList<>(newSet); double draw = rand.nextDouble(); if (draw <= newDataProbability || old.isEmpty()) { diff --git a/src/main/java/de/learnlib/ralib/equivalence/RAEquivalenceTest.java b/src/main/java/de/learnlib/ralib/equivalence/RAEquivalenceTest.java index bc1bb82a..d315425a 100644 --- a/src/main/java/de/learnlib/ralib/equivalence/RAEquivalenceTest.java +++ b/src/main/java/de/learnlib/ralib/equivalence/RAEquivalenceTest.java @@ -116,7 +116,7 @@ private boolean compatible(Tuple t1, Tuple t2) private boolean compareRegister( VarValuation r1, VarValuation r2, Map vMap) { - for (Map.Entry> entry : r1.entrySet()) + for (Map.Entry entry : r1.entrySet()) { DataValue v1 = entry.getValue(); DataValue v2 = r2.get(entry.getKey()); @@ -130,8 +130,8 @@ private boolean compareRegister( if (n1 || n2) return false; - Object o1 = vMap.get(v1.getId()); - if (o1 != null && !o1.equals(v2.getId())) { + Object o1 = vMap.get(v1.getValue()); + if (o1 != null && !o1.equals(v2.getValue())) { return false; } @@ -142,7 +142,7 @@ private boolean compareRegister( return false; } } - vMap.put(v1.getId(), v2.getId()); + vMap.put(v1.getValue(), v2.getValue()); } return true; @@ -363,7 +363,7 @@ private List> getNext(Word w, ParameterizedSymbol ps, VarValuation r1, boolean checkForEqualParameters) { - Set> potential = new LinkedHashSet<>(); + Set potential = new LinkedHashSet<>(); potential.addAll(r1.values()); // this is maybe ok during learning //potential.addAll(r2.values()); @@ -373,7 +373,7 @@ private List> getNext(Word w, List valuations = new ArrayList<>(); computeValuations(ps, valuations, potential, - new ArrayList>(),checkForEqualParameters); + new ArrayList(),checkForEqualParameters); List> ret = new ArrayList<>(); for (DataValue[] data : valuations) { @@ -385,7 +385,7 @@ private List> getNext(Word w, // FIXME: this work only for the equality case!!!! private void computeValuations(ParameterizedSymbol ps, List valuations, - Set> potential, List> val, + Set potential, List val, boolean checkForEqualParameters) { int idx = val.size(); @@ -407,17 +407,17 @@ private void computeValuations(ParameterizedSymbol ps, List valuati next.add(fresh); for (DataValue d : next) { - List> nextVal = new ArrayList<>(val); + List nextVal = new ArrayList<>(val); nextVal.add(d); computeValuations(ps, valuations, potential, nextVal, checkForEqualParameters); } } - private Set valSet(Collection> in, DataType t) { + private Set valSet(Collection in, DataType t) { Set out = new LinkedHashSet<>(); for (DataValue dv : in) { - if (dv.getType().equals(t)) { + if (dv.getDataType().equals(t)) { out.add(dv); } } diff --git a/src/main/java/de/learnlib/ralib/learning/AutomatonBuilder.java b/src/main/java/de/learnlib/ralib/learning/AutomatonBuilder.java index ba222e30..a0d46f3e 100644 --- a/src/main/java/de/learnlib/ralib/learning/AutomatonBuilder.java +++ b/src/main/java/de/learnlib/ralib/learning/AutomatonBuilder.java @@ -20,6 +20,8 @@ import java.util.Map; import java.util.Map.Entry; +import de.learnlib.ralib.smt.SMTUtils; +import gov.nasa.jpf.constraints.api.Expression; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -132,7 +134,7 @@ private void computeTransition(LocationComponent dest_c, PrefixContainer r) { Branching b = src_c.getBranching(action); // System.out.println("b.getBranches is " + b.getBranches().toString()); // System.out.println("getting guard for " + r.getPrefix().toString()); - TransitionGuard guard = b.getBranches().get(r.getPrefix()); + Expression guard = b.getBranches().get(r.getPrefix()); if (guard == null) { guard = findMatchingGuard(dest_id, src_c.getPrimePrefix().getParsInVars(), b.getBranches(), consts); } @@ -158,13 +160,14 @@ private void computeTransition(LocationComponent dest_c, PrefixContainer r) { // LOGGER.trace(Category.EVENT, "PIV SRC: {}", parsInVars_Src); // LOGGER.trace(Category.EVENT, "REMAP: {}", remapping); + //System.out.println(parsInVars_Row); for (Entry e : parsInVars_Row) { // param or register Parameter p = e.getKey(); // remapping is null for prime rows ... Register rNew = (remapping == null) ? e.getValue() : (Register) remapping.get(e.getValue()); if (p.getId() > max) { - Parameter pNew = new Parameter(p.getType(), p.getId() - max); + Parameter pNew = new Parameter(p.getDataType(), p.getId() - max); assignments.put(rNew, pNew); } else { Register rOld = parsInVars_Src.get(p); @@ -173,6 +176,7 @@ private void computeTransition(LocationComponent dest_c, PrefixContainer r) { } } Assignment assign = new Assignment(assignments); + //System.out.println(assign); // create transition Transition t = createTransition(action, guard, src_loc, dest_loc, assign); @@ -183,16 +187,16 @@ private void computeTransition(LocationComponent dest_c, PrefixContainer r) { } } - protected Transition createTransition(ParameterizedSymbol action, TransitionGuard guard, + protected Transition createTransition(ParameterizedSymbol action, Expression guard, RALocation src_loc, RALocation dest_loc, Assignment assign) { return new Transition(action, guard, src_loc, dest_loc, assign); } - public static TransitionGuard findMatchingGuard(Word dw, PIV piv, Map, TransitionGuard> branches, Constants consts) { + public static Expression findMatchingGuard(Word dw, PIV piv, Map, Expression> branches, Constants consts) { ParValuation pars = new ParValuation(dw); VarValuation vars = DataWords.computeVarValuation(new ParValuation(dw.prefix(dw.length() - 1)), piv); - for (TransitionGuard g : branches.values()) { - if (g.isSatisfied(vars, pars, consts)) { + for (Expression g : branches.values()) { + if (g.evaluateSMT(SMTUtils.compose(vars, pars, consts))) { return g; } } diff --git a/src/main/java/de/learnlib/ralib/learning/CounterexampleAnalysis.java b/src/main/java/de/learnlib/ralib/learning/CounterexampleAnalysis.java index d195d8a1..2db3b1e7 100644 --- a/src/main/java/de/learnlib/ralib/learning/CounterexampleAnalysis.java +++ b/src/main/java/de/learnlib/ralib/learning/CounterexampleAnalysis.java @@ -18,6 +18,7 @@ import java.util.Map; +import gov.nasa.jpf.constraints.api.Expression; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -126,7 +127,7 @@ private IndexResult computeIndex(Word ce, int idx) { LocationComponent c = components.get(location); ParameterizedSymbol act = transition.lastSymbol().getBaseSymbol(); - TransitionGuard g = c.getBranching(act).getBranches().get(transition); + Expression g = c.getBranching(act).getBranches().get(transition); boolean hasCE = sdtOracle.hasCounterexample(location, resHyp.getSdt(), resHyp.getPiv(), //new PIV(location, resHyp.getParsInVars()), @@ -167,9 +168,9 @@ private boolean hypRefinesTransitions(Word prefix, // System.out.println(e.getKey() + " -> " + e.getValue()); // } - for (TransitionGuard guardHyp : branchHyp.getBranches().values()) { + for (Expression guardHyp : branchHyp.getBranches().values()) { boolean refines = false; - for (TransitionGuard guardSul : branchSul.getBranches().values()) { + for (Expression guardSul : branchSul.getBranches().values()) { if (sdtOracle.doesRefine(guardHyp, c.getPrimePrefix().getParsInVars(), guardSul, pivSUL, new Mapping<>())) { refines = true; diff --git a/src/main/java/de/learnlib/ralib/learning/Hypothesis.java b/src/main/java/de/learnlib/ralib/learning/Hypothesis.java index 3bcc4d35..d0aa065f 100644 --- a/src/main/java/de/learnlib/ralib/learning/Hypothesis.java +++ b/src/main/java/de/learnlib/ralib/learning/Hypothesis.java @@ -35,8 +35,10 @@ import de.learnlib.ralib.data.VarMapping; import de.learnlib.ralib.data.VarValuation; import de.learnlib.ralib.oracles.Branching; +import de.learnlib.ralib.smt.SMTUtils; import de.learnlib.ralib.words.PSymbolInstance; import de.learnlib.ralib.words.ParameterizedSymbol; +import gov.nasa.jpf.constraints.api.Expression; import net.automatalib.common.util.Pair; import net.automatalib.word.Word; @@ -109,9 +111,9 @@ public Word branchWithSameGuard(Word word, Bra VarValuation vars = tvseq.get(tvseq.size()-1).getSecond(); ParValuation pval = new ParValuation(word.lastSymbol()); - for (Map.Entry, TransitionGuard> e : branching.getBranches().entrySet()) { + for (Map.Entry, Expression> e : branching.getBranches().entrySet()) { if (e.getKey().lastSymbol().getBaseSymbol().equals(ps)) { - if (e.getValue().isSatisfied(vars, pval, constants)) { + if (e.getValue().evaluateSMT(SMTUtils.compose(vars, pval, constants))) { return e.getKey(); } } diff --git a/src/main/java/de/learnlib/ralib/learning/IOAutomatonBuilder.java b/src/main/java/de/learnlib/ralib/learning/IOAutomatonBuilder.java index a4cfb8df..7d1450f6 100644 --- a/src/main/java/de/learnlib/ralib/learning/IOAutomatonBuilder.java +++ b/src/main/java/de/learnlib/ralib/learning/IOAutomatonBuilder.java @@ -39,11 +39,17 @@ import de.learnlib.ralib.data.SymbolicDataValue.Constant; import de.learnlib.ralib.data.SymbolicDataValue.Parameter; import de.learnlib.ralib.data.VarMapping; +import de.learnlib.ralib.data.util.SymbolicDataValueGenerator; import de.learnlib.ralib.data.util.SymbolicDataValueGenerator.ParameterGenerator; import de.learnlib.ralib.dt.DT; import de.learnlib.ralib.words.OutputSymbol; import de.learnlib.ralib.words.PSymbolInstance; import de.learnlib.ralib.words.ParameterizedSymbol; +import gov.nasa.jpf.constraints.api.Expression; +import gov.nasa.jpf.constraints.expressions.NumericBooleanExpression; +import gov.nasa.jpf.constraints.expressions.NumericComparator; +import gov.nasa.jpf.constraints.expressions.PropositionalCompound; +import gov.nasa.jpf.constraints.util.ExpressionUtil; import net.automatalib.word.Word; /** @@ -59,8 +65,8 @@ public IOAutomatonBuilder(Map, LocationComponent> componen super(components, consts); this.reverseConsts = new LinkedHashMap<>(); - for (Entry> c : consts) { - reverseConsts.put(c.getValue().getId(), c.getKey()); + for (Entry c : consts) { + reverseConsts.put(c.getValue().getValue(), c.getKey()); } } @@ -69,15 +75,15 @@ public IOAutomatonBuilder(Map, LocationComponent> componen super(components, consts, dt); this.reverseConsts = new LinkedHashMap<>(); - for (Entry> c : consts) { - reverseConsts.put(c.getValue().getId(), c.getKey()); + for (Entry c : consts) { + reverseConsts.put(c.getValue().getValue(), c.getKey()); } } @Override protected Transition createTransition(ParameterizedSymbol action, - TransitionGuard guard, RALocation src_loc, RALocation dest_loc, - Assignment assign) { + Expression guard, RALocation src_loc, RALocation dest_loc, + Assignment assign) { if (!dest_loc.isAccepting()) { return null; @@ -88,7 +94,7 @@ protected Transition createTransition(ParameterizedSymbol action, } //IfGuard _guard = (IfGuard) guard; - GuardExpression expr = guard.getCondition(); + Expression expr = guard; VarMapping outmap = new VarMapping<>(); analyzeExpression(expr, outmap); @@ -104,24 +110,25 @@ protected Transition createTransition(ParameterizedSymbol action, OutputMapping outMap = new OutputMapping(fresh, outmap); - return new OutputTransition(new TransitionGuard(), + return new OutputTransition(ExpressionUtil.TRUE, outMap, (OutputSymbol) action, src_loc, dest_loc, assign); } - private void analyzeExpression(GuardExpression expr, + private void analyzeExpression(Expression expr, VarMapping outmap) { - if (expr instanceof Conjunction) { - Conjunction pc = (Conjunction) expr; - for (GuardExpression e : pc.getConjuncts()) { - analyzeExpression(e, outmap); - } + if (expr instanceof PropositionalCompound) { + PropositionalCompound pc = (PropositionalCompound) expr; + analyzeExpression(pc.getLeft(), outmap); + analyzeExpression(pc.getRight(), outmap); } - else if (expr instanceof AtomicGuardExpression) { - AtomicGuardExpression nbe = (AtomicGuardExpression) expr; - if (nbe.getRelation() == Relation.EQUALS) { - SymbolicDataValue left = nbe.getLeft(); - SymbolicDataValue right = nbe.getRight(); + else if (expr instanceof NumericBooleanExpression) { + NumericBooleanExpression nbe = (NumericBooleanExpression) expr; + if (nbe.getComparator() == NumericComparator.EQ) { + // FIXME: this is unchecked! + //System.out.println(expr); + SymbolicDataValue left = (SymbolicDataValue) nbe.getLeft(); + SymbolicDataValue right = (SymbolicDataValue) nbe.getRight(); Parameter p = null; SymbolicDataValue sv = null; diff --git a/src/main/java/de/learnlib/ralib/learning/SymbolicSuffix.java b/src/main/java/de/learnlib/ralib/learning/SymbolicSuffix.java index 5305357f..fd4d46ef 100644 --- a/src/main/java/de/learnlib/ralib/learning/SymbolicSuffix.java +++ b/src/main/java/de/learnlib/ralib/learning/SymbolicSuffix.java @@ -97,7 +97,7 @@ public SymbolicSuffix(Word prefix, SuffixValueGenerator svgen = new SuffixValueGenerator(); for (DataValue dv : DataWords.valsOf(suffix)) { - SuffixValue sv = svgen.next(dv.getType()); + SuffixValue sv = svgen.next(dv.getDataType()); SuffixValueRestriction restriction = SuffixValueRestriction.genericRestriction(sv, prefix, suffix, consts); restrictions.put(sv, restriction); } @@ -156,7 +156,7 @@ public SymbolicSuffix(Word prefix, SuffixValueGenerator svgen = new SuffixValueGenerator(); for (DataValue dv : DataWords.valsOf(suffix)) { - SuffixValue sv = svgen.next(dv.getType()); + SuffixValue sv = svgen.next(dv.getDataType()); SuffixValueRestriction restriction = SuffixValueRestriction.genericRestriction(sv, prefix, suffix, consts); restrictions.put(sv, restriction); } @@ -165,7 +165,7 @@ public SymbolicSuffix(Word prefix, for (Map.Entry e : symSuffix.restrictions.entrySet()) { SuffixValue sv = e.getKey(); SuffixValueRestriction restriction = e.getValue(); - SuffixValue s = new SuffixValue(sv.getType(), sv.getId()+actionArity); + SuffixValue s = new SuffixValue(sv.getDataType(), sv.getId()+actionArity); restrictions.put(s, restriction.shift(actionArity)); } } @@ -184,7 +184,7 @@ public SymbolicSuffix(Word prefix, SymbolicSuffix symSuffix, Sy for (Map.Entry e : symSuffix.restrictions.entrySet()) { SuffixValue sv = e.getKey(); SuffixValueRestriction restriction = e.getValue(); - SuffixValue s = new SuffixValue(sv.getType(), sv.getId()+actionArity); + SuffixValue s = new SuffixValue(sv.getDataType(), sv.getId()+actionArity); restrictions.put(s, restriction.shift(actionArity)); } } @@ -197,7 +197,7 @@ public SymbolicSuffix(Word actions, Map seen = new LinkedHashSet<>(); for (Map.Entry e : dataValues.entrySet()) { SuffixValue sv = e.getValue(); - SuffixValue suffixValue = new SuffixValue(sv.getType(), e.getKey()); + SuffixValue suffixValue = new SuffixValue(sv.getDataType(), e.getKey()); if (freeValues.contains(sv)) { restrictions.put(suffixValue, new UnrestrictedSuffixValue(suffixValue)); seen.add(sv); @@ -208,7 +208,7 @@ public SymbolicSuffix(Word actions, Map e : other.restrictions.entrySet()) { - SuffixValue sv = new SuffixValue(e.getKey().getType(), e.getKey().getId()+arity); + SuffixValue sv = new SuffixValue(e.getKey().getDataType(), e.getKey().getId()+arity); SuffixValueRestriction restr = e.getValue().shift(arity); concatRestr.put(sv, restr); } @@ -285,9 +285,7 @@ public boolean isOptimizationGeneric() { @Override public String toString() { - Word dw = - DataWords.instantiate(actions, restrictions.keySet()); - return "((" + dw.toString() + "))" + Arrays.toString(restrictions.values().toArray()); + return "((" + actions.toString() + "))" + Arrays.toString(restrictions.values().toArray()); } @Override diff --git a/src/main/java/de/learnlib/ralib/learning/SymbolicWord.java b/src/main/java/de/learnlib/ralib/learning/SymbolicWord.java index 0e2f27d3..62314071 100644 --- a/src/main/java/de/learnlib/ralib/learning/SymbolicWord.java +++ b/src/main/java/de/learnlib/ralib/learning/SymbolicWord.java @@ -32,8 +32,8 @@ public SymbolicSuffix getSuffix() { return suffix; } - public Mapping> computeValuation(Word concreteSuffix, PIV piv) { - Mapping> vals = new Mapping<>(); + public Mapping computeValuation(Word concreteSuffix, PIV piv) { + Mapping vals = new Mapping<>(); SuffixValueGenerator svGen = new SuffixValueGenerator(); Word actions = suffix.getActions(); diff --git a/src/main/java/de/learnlib/ralib/learning/ralambda/RaLambda.java b/src/main/java/de/learnlib/ralib/learning/ralambda/RaLambda.java index 47fe65d3..088f5c36 100644 --- a/src/main/java/de/learnlib/ralib/learning/ralambda/RaLambda.java +++ b/src/main/java/de/learnlib/ralib/learning/ralambda/RaLambda.java @@ -9,6 +9,7 @@ import java.util.Map; import java.util.Set; +import gov.nasa.jpf.constraints.api.Expression; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -46,7 +47,7 @@ import de.learnlib.ralib.oracles.mto.OptimizedSymbolicSuffixBuilder; import de.learnlib.ralib.oracles.mto.SDT; import de.learnlib.ralib.oracles.mto.SymbolicSuffixRestrictionBuilder; -import de.learnlib.ralib.solver.ConstraintSolver; +import de.learnlib.ralib.smt.ConstraintSolver; import de.learnlib.ralib.words.PSymbolInstance; import de.learnlib.ralib.words.ParameterizedSymbol; import net.automatalib.word.Word; @@ -281,9 +282,9 @@ private boolean isGuardRefinement(Word word, CEAnalysisResult c return true; } - TransitionGuard guard = AutomatonBuilder.findMatchingGuard(word, piv, hypBranching.getBranches(), consts); - for (Map.Entry, TransitionGuard> e : hypBranching.getBranches().entrySet()) { - boolean eq = sdtLogicOracle.areEquivalent(e.getValue(), piv, guard, piv, new Mapping>()); + Expression guard = AutomatonBuilder.findMatchingGuard(word, piv, hypBranching.getBranches(), consts); + for (Map.Entry, Expression> e : hypBranching.getBranches().entrySet()) { + boolean eq = sdtLogicOracle.areEquivalent(e.getValue(), piv, guard, piv, new Mapping()); if (eq && !e.getKey().equals(word)) { guardPrefixes.put(word, true); return true; diff --git a/src/main/java/de/learnlib/ralib/learning/rastar/Component.java b/src/main/java/de/learnlib/ralib/learning/rastar/Component.java index a97feb5d..cad3ff46 100644 --- a/src/main/java/de/learnlib/ralib/learning/rastar/Component.java +++ b/src/main/java/de/learnlib/ralib/learning/rastar/Component.java @@ -25,6 +25,7 @@ import java.util.Map; import java.util.Map.Entry; +import gov.nasa.jpf.constraints.api.Expression; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -298,7 +299,7 @@ void toString(StringBuilder sb) { sb.append("******** BRANCHING: ").append("\n"); for (Entry b : branching.entrySet()) { sb.append(b.getKey()).append(":\n"); - for (Entry, TransitionGuard> e : + for (Entry, Expression> e : b.getValue().getBranches().entrySet()) { sb.append(e.getKey()).append(" -> ").append(e.getValue()).append("\n"); } diff --git a/src/main/java/de/learnlib/ralib/learning/rastar/Row.java b/src/main/java/de/learnlib/ralib/learning/rastar/Row.java index a4a94af9..6d722d6a 100644 --- a/src/main/java/de/learnlib/ralib/learning/rastar/Row.java +++ b/src/main/java/de/learnlib/ralib/learning/rastar/Row.java @@ -106,7 +106,7 @@ private void addCell(Cell c) { for (Entry e : cpv.entrySet()) { Register r = this.memorable.get(e.getKey()); if (r == null) { - r = regGen.next(e.getKey().getType()); + r = regGen.next(e.getKey().getDataType()); memorable.put(e.getKey(), r); } relabelling.put(e.getValue(), r); diff --git a/src/main/java/de/learnlib/ralib/oracles/Branching.java b/src/main/java/de/learnlib/ralib/oracles/Branching.java index 21bdd438..ebb5d06a 100644 --- a/src/main/java/de/learnlib/ralib/oracles/Branching.java +++ b/src/main/java/de/learnlib/ralib/oracles/Branching.java @@ -20,6 +20,7 @@ import de.learnlib.ralib.automata.TransitionGuard; import de.learnlib.ralib.words.PSymbolInstance; +import gov.nasa.jpf.constraints.api.Expression; import net.automatalib.word.Word; /** @@ -28,7 +29,7 @@ */ public interface Branching { - public Map, TransitionGuard> getBranches(); + public Map, Expression> getBranches(); public Word transformPrefix(Word prefix); } diff --git a/src/main/java/de/learnlib/ralib/oracles/SDTLogicOracle.java b/src/main/java/de/learnlib/ralib/oracles/SDTLogicOracle.java index 0387496a..ed3b6cc8 100644 --- a/src/main/java/de/learnlib/ralib/oracles/SDTLogicOracle.java +++ b/src/main/java/de/learnlib/ralib/oracles/SDTLogicOracle.java @@ -25,6 +25,7 @@ import de.learnlib.ralib.data.SymbolicDataValue; import de.learnlib.ralib.learning.SymbolicDecisionTree; import de.learnlib.ralib.words.PSymbolInstance; +import gov.nasa.jpf.constraints.api.Expression; import net.automatalib.word.Word; /** @@ -58,7 +59,7 @@ public interface SDTLogicOracle { boolean hasCounterexample(Word prefix, SymbolicDecisionTree sdt1, PIV piv1, SymbolicDecisionTree sdt2, PIV piv2, - TransitionGuard guard, Word rep); + Expression guard, Word rep); GuardExpression getCEGuard(Word prefix, SymbolicDecisionTree sdt1, PIV piv1, @@ -73,20 +74,20 @@ GuardExpression getCEGuard(Word prefix, * @param pivRefined * @return */ - boolean doesRefine(TransitionGuard refining, PIV pivRefining, - TransitionGuard refined, PIV pivRefined, Mapping> valuation); + boolean doesRefine(Expression refining, PIV pivRefining, + Expression refined, PIV pivRefined, Mapping valuation); /** * Returns true if two guards are mutually exclusive (they cannot be both true) */ - boolean areMutuallyExclusive(TransitionGuard guard1, PIV piv1, TransitionGuard guard2, - PIV piv2, Mapping> valuation); + boolean areMutuallyExclusive(Expression guard1, PIV piv1, Expression guard2, + PIV piv2, Mapping valuation); /** * Returns true if two guards are equivalent (guard1 is true iff guard2 is true) */ - boolean areEquivalent(TransitionGuard guard1, PIV piv1, TransitionGuard guard2, - PIV piv2, Mapping> valuation); + boolean areEquivalent(Expression guard1, PIV piv1, Expression guard2, + PIV piv2, Mapping valuation); /** * Returns true if the word leads to an accepting leaf on the SDT. */ diff --git a/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheoryBranching.java b/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheoryBranching.java index d9aafc29..1e4e3b12 100644 --- a/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheoryBranching.java +++ b/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheoryBranching.java @@ -36,11 +36,16 @@ import de.learnlib.ralib.data.VarMapping; import de.learnlib.ralib.data.VarValuation; import de.learnlib.ralib.oracles.Branching; +import de.learnlib.ralib.smt.SMTUtils; +import de.learnlib.ralib.smt.jconstraints.JContraintsUtil; import de.learnlib.ralib.theory.SDTGuard; import de.learnlib.ralib.words.DataWords; import de.learnlib.ralib.words.PSymbolInstance; import de.learnlib.ralib.words.ParameterizedSymbol; +import gov.nasa.jpf.constraints.api.Expression; +import gov.nasa.jpf.constraints.util.ExpressionUtil; import net.automatalib.word.Word; +import org.apache.commons.math3.analysis.function.Exp; /** * @@ -223,15 +228,14 @@ private Map> collectDataValuesAndGuards(Node n, Map< } @Override - public Map, TransitionGuard> getBranches() { + public Map, Expression> getBranches() { - Map, TransitionGuard> branches = new LinkedHashMap<>(); + Map, Expression> branches = new LinkedHashMap<>(); if (this.action.getArity() == 0) { // System.out.println("arity 0"); - TransitionGuard tg = new TransitionGuard(); PSymbolInstance psi = new PSymbolInstance(action, new DataValue[0]); - branches.put(prefix.append(psi), tg); + branches.put(prefix.append(psi), ExpressionUtil.TRUE); return branches; } @@ -245,7 +249,9 @@ public Map, TransitionGuard> getBranches() { for (SDTGuard g : gList) { gExpr.add(renameSuffixValues(g.toExpr())); } - TransitionGuard tg = new TransitionGuard(new Conjunction(gExpr.toArray(new GuardExpression[] {}))); + Expression tg = ExpressionUtil.and( + gExpr.stream().map(g -> JContraintsUtil.toExpression(g)).toList().toArray(new Expression[]{}) + ); assert tg != null; Word branch = prefix.append(new PSymbolInstance(action, entry.getKey())); @@ -272,16 +278,16 @@ public Word transformPrefix(Word dw) { for (int i=0; i, TransitionGuard> branches = getBranches(); + Map, Expression> branches = getBranches(); Word prefix = null; - for (Map.Entry, TransitionGuard> e : branches.entrySet()) { - TransitionGuard g = e.getValue(); - if (g.isSatisfied(vars, vals, constants)) { + for (Map.Entry, Expression> e : branches.entrySet()) { + Expression g = e.getValue(); + if (g.evaluateSMT(SMTUtils.compose(vars, vals, constants))) { prefix = e.getKey(); break; } @@ -295,7 +301,7 @@ private GuardExpression renameSuffixValues(GuardExpression expr) { VarMapping vmap = new VarMapping(); for (SymbolicDataValue sv : svals) { if (sv instanceof SuffixValue) { - vmap.put(sv, new Parameter(sv.getType(), sv.getId())); + vmap.put(sv, new Parameter(sv.getDataType(), sv.getId())); } } return expr.relabel(vmap); diff --git a/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheorySDTLogicOracle.java b/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheorySDTLogicOracle.java index c3c8d5c0..764847ce 100644 --- a/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheorySDTLogicOracle.java +++ b/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheorySDTLogicOracle.java @@ -18,6 +18,12 @@ import java.util.Map; +import de.learnlib.ralib.smt.SMTUtils; +import de.learnlib.ralib.smt.jconstraints.JContraintsUtil; +import gov.nasa.jpf.constraints.api.Expression; +import gov.nasa.jpf.constraints.api.Variable; +import gov.nasa.jpf.constraints.expressions.Negation; +import gov.nasa.jpf.constraints.util.ExpressionUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -25,7 +31,6 @@ import de.learnlib.ralib.automata.guards.Conjunction; import de.learnlib.ralib.automata.guards.Disjunction; import de.learnlib.ralib.automata.guards.GuardExpression; -import de.learnlib.ralib.automata.guards.Negation; import de.learnlib.ralib.data.Constants; import de.learnlib.ralib.data.DataValue; import de.learnlib.ralib.data.Mapping; @@ -37,7 +42,7 @@ import de.learnlib.ralib.data.VarMapping; import de.learnlib.ralib.learning.SymbolicDecisionTree; import de.learnlib.ralib.oracles.SDTLogicOracle; -import de.learnlib.ralib.solver.ConstraintSolver; +import de.learnlib.ralib.smt.ConstraintSolver; import de.learnlib.ralib.theory.SDTGuard; import de.learnlib.ralib.words.DataWords; import de.learnlib.ralib.words.PSymbolInstance; @@ -62,7 +67,7 @@ public MultiTheorySDTLogicOracle(Constants consts, ConstraintSolver solver) { @Override public boolean hasCounterexample(Word prefix, SymbolicDecisionTree sdt1, PIV piv1, - SymbolicDecisionTree sdt2, PIV piv2, TransitionGuard guard, Word rep) { + SymbolicDecisionTree sdt2, PIV piv2, Expression guard, Word rep) { // Collection join = piv1.values(); @@ -74,28 +79,29 @@ public boolean hasCounterexample(Word prefix, SymbolicDecisionT SDT _sdt1 = (SDT) sdt1; SDT _sdt2 = (SDT) sdt2; - GuardExpression expr1 = _sdt1.getAcceptingPaths(consts); - GuardExpression expr2 = _sdt2.getAcceptingPaths(consts); - GuardExpression exprG = guard.getCondition(); + Expression expr1 = JContraintsUtil.toExpression(_sdt1.getAcceptingPaths(consts)); + Expression expr2 = JContraintsUtil.toExpression(_sdt2.getAcceptingPaths(consts)); + Expression exprG = guard; VarMapping gremap = new VarMapping<>(); - for (SymbolicDataValue sv : exprG.getSymbolicDataValues()) { + for (Variable sv : ExpressionUtil.freeVariables(exprG)) { if (sv instanceof Parameter) { - gremap.put(sv, new SuffixValue(sv.getType(), sv.getId())); + Parameter p = (Parameter) sv; + gremap.put(p, new SuffixValue( p.getDataType(), p.getId())); } } - exprG = exprG.relabel(gremap); + exprG = SMTUtils.renameVars(exprG, gremap); VarMapping remap = piv2.createRemapping(piv1); - GuardExpression expr2r = expr2.relabel(remap); + Expression expr2r = SMTUtils.renameVars(expr2, remap); - GuardExpression left = new Conjunction(exprG, expr1, new Negation(expr2r)); + Expression left = ExpressionUtil.and(exprG, expr1, new Negation(expr2r)); - GuardExpression right = new Conjunction(exprG, expr2r, new Negation(expr1)); + Expression right = ExpressionUtil.and(exprG, expr2r, new Negation(expr1)); - GuardExpression test = new Disjunction(left, right); + Expression test = ExpressionUtil.or(left, right); // System.out.println("A1: " + expr1); // System.out.println("A2: " + expr2); @@ -139,7 +145,7 @@ public GuardExpression getCEGuard(Word prefix, } @Override - public boolean doesRefine(TransitionGuard refining, PIV pivRefining, TransitionGuard refined, PIV pivRefined, Mapping> valuation) { + public boolean doesRefine(Expression refining, PIV pivRefining, Expression refined, PIV pivRefined, Mapping valuation) { LOGGER.trace("refining: {0}", refining); LOGGER.trace("refined: {0}", refined); @@ -148,13 +154,16 @@ public boolean doesRefine(TransitionGuard refining, PIV pivRefining, TransitionG VarMapping remap = pivRefined.createRemapping(pivRefining); - GuardExpression exprRefining = refining.getCondition(); - GuardExpression exprRefined = refined.getCondition().relabel(remap); + Expression exprRefining = refining; + Expression exprRefined = SMTUtils.renameVars(refined, remap); + // is there any case for which refining is true but refined is false? - GuardExpression test = new Conjunction(exprRefining, new Negation(exprRefined)); + Expression test = ExpressionUtil.and( + exprRefining, new gov.nasa.jpf.constraints.expressions.Negation(exprRefined)); + // it is important to include constants to see that, e.g., c1==p1 refines c2!=p1 - Mapping> valWithConsts = new Mapping<>(); + Mapping valWithConsts = new Mapping<>(); valWithConsts.putAll(valuation); valWithConsts.putAll(consts); @@ -166,8 +175,8 @@ public boolean doesRefine(TransitionGuard refining, PIV pivRefining, TransitionG } @Override - public boolean areMutuallyExclusive(TransitionGuard guard1, PIV piv1, TransitionGuard guard2, - PIV piv2, Mapping> valuation) { + public boolean areMutuallyExclusive(Expression guard1, PIV piv1, Expression guard2, + PIV piv2, Mapping valuation) { LOGGER.trace("guard1: {0}", guard1); LOGGER.trace("guard2: {0}", guard2); LOGGER.trace("piv1: {0}", piv1); @@ -175,10 +184,10 @@ public boolean areMutuallyExclusive(TransitionGuard guard1, PIV piv1, Transition VarMapping remap = piv2.createRemapping(piv1); - GuardExpression exprGuard1 = guard1.getCondition(); - GuardExpression exprGuard2 = guard2.getCondition().relabel(remap); + Expression exprGuard1 = guard1; + Expression exprGuard2 = SMTUtils.renameVars(guard2, remap); - GuardExpression test = new Conjunction(exprGuard1, exprGuard2); + Expression test = ExpressionUtil.and(exprGuard1, exprGuard2); LOGGER.trace("MAP: " + remap); LOGGER.trace("TEST:" + test); @@ -188,8 +197,8 @@ public boolean areMutuallyExclusive(TransitionGuard guard1, PIV piv1, Transition } @Override - public boolean areEquivalent(TransitionGuard guard1, PIV piv1, TransitionGuard guard2, - PIV piv2, Mapping> valuation) { + public boolean areEquivalent(Expression guard1, PIV piv1, Expression guard2, + PIV piv2, Mapping valuation) { LOGGER.trace("guard1: {0}", guard1); LOGGER.trace("guard2: {0}", guard2); LOGGER.trace("piv1: {0}", piv1); @@ -197,10 +206,12 @@ public boolean areEquivalent(TransitionGuard guard1, PIV piv1, TransitionGuard g VarMapping remap = piv2.createRemapping(piv1); - GuardExpression exprGuard1 = guard1.getCondition(); - GuardExpression exprGuard2 = guard2.getCondition().relabel(remap); - GuardExpression test = new Disjunction(new Conjunction(exprGuard1, new Negation(exprGuard2)), - new Conjunction(new Negation(exprGuard1), exprGuard2)); + Expression g2relabel = SMTUtils.renameVars(guard2, remap); + + Expression test = ExpressionUtil.or( + ExpressionUtil.and(guard1, new gov.nasa.jpf.constraints.expressions.Negation(g2relabel)), + ExpressionUtil.and(new gov.nasa.jpf.constraints.expressions.Negation(guard1), g2relabel) + ); LOGGER.trace("MAP: " + remap); LOGGER.trace("TEST:" + test); @@ -215,7 +226,7 @@ public boolean accepts(Word word, Word prefix, SDT _sdt = (SDT) sdt; assert _sdt.getHeight() == DataWords.paramValLength(word.suffix(word.length() - prefix.length())) : "The height of the tree is not consistent with the number of parameters in the word"; - Mapping> valuation = new Mapping<>(); + Mapping valuation = new Mapping<>(); valuation.putAll(consts); DataValue[] vals = DataWords.valsOf(prefix); for (Map.Entry entry : piv.entrySet()) { @@ -228,7 +239,7 @@ public boolean accepts(Word word, Word prefix, } private boolean accepts(Word word, Word prefix, int symIndex, SDT sdt, - Mapping> valuation) { + Mapping valuation) { boolean accepts; if (symIndex == word.length()) { accepts = sdt.isAccepting(); @@ -238,7 +249,7 @@ private boolean accepts(Word word, Word prefix accepts = accepts(word, prefix, symIndex + 1, sdt, valuation); } else { SDT nextSdt = sdt; - Mapping> newValuation = new Mapping<>(); + Mapping newValuation = new Mapping<>(); newValuation.putAll(valuation); for (int i = 0; i < sym.getBaseSymbol().getArity(); i++) { DataValue value = sym.getParameterValues()[i]; diff --git a/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheoryTreeOracle.java b/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheoryTreeOracle.java index ee41ce92..98bc1914 100644 --- a/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheoryTreeOracle.java +++ b/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheoryTreeOracle.java @@ -30,6 +30,8 @@ import com.google.common.collect.Sets; +import de.learnlib.ralib.smt.jconstraints.JContraintsUtil; +import de.learnlib.ralib.theory.equality.DisequalityGuard; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -61,7 +63,7 @@ import de.learnlib.ralib.oracles.TreeOracle; import de.learnlib.ralib.oracles.TreeQueryResult; import de.learnlib.ralib.oracles.mto.MultiTheoryBranching.Node; -import de.learnlib.ralib.solver.ConstraintSolver; +import de.learnlib.ralib.smt.ConstraintSolver; import de.learnlib.ralib.theory.SDTAndGuard; import de.learnlib.ralib.theory.SDTGuard; import de.learnlib.ralib.theory.SDTTrueGuard; @@ -117,7 +119,7 @@ public TreeQueryResult treeQuery(Word prefix, SymbolicSuffix su for (Entry e : pir.entrySet()) { if (regs.contains(e.getValue())) { Register r = e.getValue(); - rename.put(r, gen.next(r.getType())); + rename.put(r, gen.next(r.getDataType())); piv.put(e.getKey(), (Register) rename.get(r)); } } @@ -152,7 +154,7 @@ public SDT treeQuery(Word prefix, SymbolicSuffix suffix, WordVa // OTHERWISE get the first noninstantiated data value in the suffix and its type SymbolicDataValue sd = suffix.getDataValue(values.size() + 1); - Theory teach = teachers.get(sd.getType()); + Theory teach = teachers.get(sd.getDataType()); // make a new tree query for prefix, suffix, prefix valuation, ... // to the correct teacher (given by type of first DV in suffix) @@ -250,7 +252,7 @@ private Node createNode(int i, Word prefix, ParameterizedSymbol Parameter p = new Parameter(type, i); // valuation - Mapping> valuation = buildValuation(pval, prefix, piv, constants); + Mapping valuation = buildValuation(pval, prefix, piv, constants); // the map may contain no old values for p, in which case we use an empty set // (to avoid potential NPE when instantiating guards) @@ -307,7 +309,7 @@ private Node createNode(int i, Word prefix, ParameterizedSymbol // conjoins the initial guards of the SDTs producing a map from new refined // (initial) guards to the set of guards they originated from private Map> getNewRefinedInitialGuards(SDT[] sdts, MultiTheorySDTLogicOracle mlo, - Mapping> valuation) { + Mapping valuation) { Map> mergedGroup = new LinkedHashMap<>(); for (SDT sdt : sdts) { Set nextGuardGroup = sdt.getChildren().keySet(); @@ -323,7 +325,7 @@ private Map> getNewRefinedInitialGuards(SDT[] sdts, Mult // this is possible in the sense that the guards are not mutually exclusive // 2. updating the map private Map> combineGroups(Map> mergedHead, Set nextGroup, - MultiTheorySDTLogicOracle mlo, Mapping> valuation) { + MultiTheorySDTLogicOracle mlo, Mapping valuation) { Map> mergedGroup = new LinkedHashMap<>(); if (mergedHead.isEmpty()) { nextGroup.forEach(next -> { @@ -400,10 +402,14 @@ public SDTGuard conjoin(SDTGuard guard1, SDTGuard guard2) { } private boolean canBeMerged(SDTGuard a, SDTGuard b, MultiTheorySDTLogicOracle mlo, - Mapping> valuation) { + Mapping valuation) { if (a.equals(b) || a instanceof SDTTrueGuard || b instanceof SDTTrueGuard) return true; + // FIXME: Falk added this to prevent and of two equals + if (a instanceof EqualityGuard && b instanceof EqualityGuard) + return false; + // some quick answers, implemented for compatibility with older theories. if (a instanceof EqualityGuard) if (b.equals(((EqualityGuard) a).toDeqGuard())) @@ -411,14 +417,16 @@ private boolean canBeMerged(SDTGuard a, SDTGuard b, MultiTheorySDTLogicOracle ml if (b instanceof EqualityGuard) if (a.equals(((EqualityGuard) b).toDeqGuard())) return false; - return !mlo.areMutuallyExclusive(a.toTG(), new PIV(), b.toTG(), new PIV(), valuation); + return !mlo.areMutuallyExclusive(JContraintsUtil.toExpression(a.toExpr()), new PIV(), + JContraintsUtil.toExpression(b.toExpr()), new PIV(), valuation); } private boolean refines(SDTGuard a, SDTGuard b, MultiTheorySDTLogicOracle mlo, - Mapping> valuation) { + Mapping valuation) { if (b instanceof SDTTrueGuard) return true; - boolean ref1 = mlo.doesRefine(a.toTG(), new PIV(), b.toTG(), new PIV(), valuation); + boolean ref1 = mlo.doesRefine(JContraintsUtil.toExpression(a.toExpr()), new PIV(), + JContraintsUtil.toExpression(b.toExpr()), new PIV(), valuation); return ref1; } @@ -439,12 +447,12 @@ private Map> getChildren(SDT[] sdts) { return children; } - private Mapping> buildValuation(ParValuation parValuation, + private Mapping buildValuation(ParValuation parValuation, Word prefix, PIV piv, Constants constants) { - Mapping> valuation = new Mapping>(); - DataValue[] values = DataWords.valsOf(prefix); + Mapping valuation = new Mapping(); + DataValue[] values = DataWords.valsOf(prefix); piv.forEach((param, reg) -> valuation.put(reg, values[param.getId() - 1])); - parValuation.forEach((param, dv) -> valuation.put(new SuffixValue(param.getType(), param.getId()), dv)); + parValuation.forEach((param, dv) -> valuation.put(new SuffixValue(param.getDataType(), param.getId()), dv)); constants.forEach((c, dv) -> valuation.put(c, dv)); return valuation; } @@ -502,6 +510,11 @@ private void instantiate(Map, Boolean> words, Word prefix, ParameterizedSymbol ps, Branching current, PIV piv, SymbolicDecisionTree... sdts) { + //System.out.println(current); + //for (SymbolicDecisionTree s: sdts) { + // System.out.println(s); + //} + MultiTheoryBranching oldBranching = (MultiTheoryBranching) current; Map> oldDvs = oldBranching.getDVs(); @@ -534,7 +547,7 @@ public Branching updateBranching(Word prefix, ParameterizedSymb } public boolean accepts(Word prefix, Word suffix, SymbolicDecisionTree sdt, PIV piv) { - Mapping> mapping = new Mapping<>(); + Mapping mapping = new Mapping<>(); mapping.putAll(constants); int index = 0; @@ -562,8 +575,8 @@ public boolean accepts(Word prefix, Word suffi return false; for (SymbolicDataValue sdv : expr.getSymbolicDataValues()) { if (sdv instanceof Register && mapping.get(sdv) == null) { - Theory teach = teachers.get(sdv.getType()); - List> values = new ArrayList<>(); + Theory teach = teachers.get(sdv.getDataType()); + List values = new ArrayList<>(); values.addAll(mapping.values()); values.addAll(pars.values()); DataValue dv = teach.getFreshValue(values); diff --git a/src/main/java/de/learnlib/ralib/oracles/mto/OptimizedSymbolicSuffixBuilder.java b/src/main/java/de/learnlib/ralib/oracles/mto/OptimizedSymbolicSuffixBuilder.java index f4c91d55..468df8f4 100644 --- a/src/main/java/de/learnlib/ralib/oracles/mto/OptimizedSymbolicSuffixBuilder.java +++ b/src/main/java/de/learnlib/ralib/oracles/mto/OptimizedSymbolicSuffixBuilder.java @@ -22,7 +22,7 @@ import de.learnlib.ralib.data.VarMapping; import de.learnlib.ralib.data.util.SymbolicDataValueGenerator; import de.learnlib.ralib.learning.SymbolicSuffix; -import de.learnlib.ralib.solver.ConstraintSolver; +import de.learnlib.ralib.smt.ConstraintSolver; import de.learnlib.ralib.theory.SDTGuard; import de.learnlib.ralib.theory.SuffixValueRestriction; import de.learnlib.ralib.theory.UnrestrictedSuffixValue; @@ -115,13 +115,13 @@ SymbolicSuffix extendSuffix(Word prefix, List sdtPath Parameter p = e.getKey(); Register r = e.getValue(); if (p.getId() > subArity) { - SuffixValue sv = new SuffixValue(p.getType(), p.getId()-subArity); + SuffixValue sv = new SuffixValue(p.getDataType(), p.getId()-subArity); renaming.put(r, sv); } } for (SDTGuard guard : sdtPath) { SuffixValue oldSV = guard.getParameter(); - SuffixValue newSV = new SuffixValue(oldSV.getType(), oldSV.getId()+actionArity); + SuffixValue newSV = new SuffixValue(oldSV.getDataType(), oldSV.getId()+actionArity); renaming.put(oldSV, newSV); SDTGuard renamedGuard = guard.relabel(renaming); SuffixValueRestriction restr = restrictionBuilder.restrictSuffixValue(renamedGuard, restrictions); @@ -337,22 +337,22 @@ public SymbolicSuffix distinguishingSuffixFromSDTs(Word prefix1 SymbolicDataValueGenerator.RegisterGenerator rgen = new SymbolicDataValueGenerator.RegisterGenerator(); VarMapping relabellingSdt1 = new VarMapping<>(); for (Register r : piv1.values()) { - relabellingSdt1.put(r, rgen.next(r.getType())); + relabellingSdt1.put(r, rgen.next(r.getDataType())); } SDT relSdt1 = (SDT) sdt1.relabel(relabellingSdt1); PIV relPiv1 = piv1.relabel(relabellingSdt1); VarMapping relabellingSdt2 = new VarMapping<>(); for (Register r : piv2.values()) { - relabellingSdt2.put(r, rgen.next(r.getType())); + relabellingSdt2.put(r, rgen.next(r.getDataType())); } SDT relSdt2 = (SDT) sdt2.relabel(relabellingSdt2); PIV relPiv2 = piv2.relabel(relabellingSdt2); // we build valuations which we use to determine satisfiable paths - Mapping> valuationSdt1 = buildValuation(prefix1, relPiv1, consts); - Mapping> valuationSdt2 = buildValuation(prefix2, relPiv2, consts); - Mapping> combined = new Mapping<>(); + Mapping valuationSdt1 = buildValuation(prefix1, relPiv1, consts); + Mapping valuationSdt2 = buildValuation(prefix2, relPiv2, consts); + Mapping combined = new Mapping<>(); combined.putAll(valuationSdt1); combined.putAll(valuationSdt2); SymbolicSuffix suffix = distinguishingSuffixFromSDTs(prefix1, relSdt1, relPiv1, prefix2, relSdt2, relPiv2, combined, suffixActions, solver); @@ -361,7 +361,7 @@ public SymbolicSuffix distinguishingSuffixFromSDTs(Word prefix1 private SymbolicSuffix distinguishingSuffixFromSDTs(Word prefix1, SDT sdt1, PIV piv1, Word prefix2, SDT sdt2, PIV piv2, - Mapping> valuation, Word suffixActions, ConstraintSolver solver) { + Mapping valuation, Word suffixActions, ConstraintSolver solver) { SymbolicSuffix best = null; for (boolean b : new boolean [] {true, false}) { // we check for paths @@ -398,7 +398,7 @@ SymbolicSuffix coalesceSuffixes(SymbolicSuffix suffix1, SymbolicSuffix suffix2) SymbolicDataValueGenerator.SuffixValueGenerator sgen = new SymbolicDataValueGenerator.SuffixValueGenerator(); for (int i=0; i guards) { return new Conjunction(expr.toArray(exprArr)); } - private Mapping> buildValuation(Word prefix, PIV piv, Constants constants) { - Mapping> valuation = new Mapping>(); - DataValue[] values = DataWords.valsOf(prefix); + private Mapping buildValuation(Word prefix, PIV piv, Constants constants) { + Mapping valuation = new Mapping(); + DataValue[] values = DataWords.valsOf(prefix); piv.forEach((param, reg) -> valuation.put(reg, values[param.getId() - 1])); constants.forEach((c, dv) -> valuation.put(c, dv)); return valuation; diff --git a/src/main/java/de/learnlib/ralib/oracles/mto/SDT.java b/src/main/java/de/learnlib/ralib/oracles/mto/SDT.java index c98d6e08..c00f2945 100644 --- a/src/main/java/de/learnlib/ralib/oracles/mto/SDT.java +++ b/src/main/java/de/learnlib/ralib/oracles/mto/SDT.java @@ -42,12 +42,14 @@ import de.learnlib.ralib.theory.SDTMultiGuard; import de.learnlib.ralib.theory.SDTTrueGuard; import de.learnlib.ralib.theory.inequality.IntervalGuard; +import gov.nasa.jpf.constraints.api.Expression; /** * Implementation of Symbolic Decision Trees. * * @author Sofia Cassel */ +@Deprecated public class SDT implements SymbolicDecisionTree { private final Map children; @@ -184,8 +186,8 @@ public boolean isAccepting() { //return false; } - public boolean isAccepting(Mapping> vals, Constants consts) { - Mapping> mapping = new Mapping>(); + public boolean isAccepting(Mapping vals, Constants consts) { + Mapping mapping = new Mapping(); mapping.putAll(vals); mapping.putAll(consts); GuardExpression expr = getAcceptingPaths(consts); diff --git a/src/main/java/de/learnlib/ralib/oracles/mto/SDTLeaf.java b/src/main/java/de/learnlib/ralib/oracles/mto/SDTLeaf.java index 3290ba88..bdb4b6dd 100644 --- a/src/main/java/de/learnlib/ralib/oracles/mto/SDTLeaf.java +++ b/src/main/java/de/learnlib/ralib/oracles/mto/SDTLeaf.java @@ -34,6 +34,7 @@ * * @author falk */ +@Deprecated public class SDTLeaf extends SDT { public static final SDTLeaf ACCEPTING = new SDTLeaf(true); diff --git a/src/main/java/de/learnlib/ralib/oracles/mto/SymbolicSuffixRestrictionBuilder.java b/src/main/java/de/learnlib/ralib/oracles/mto/SymbolicSuffixRestrictionBuilder.java index 4604837a..005517b7 100644 --- a/src/main/java/de/learnlib/ralib/oracles/mto/SymbolicSuffixRestrictionBuilder.java +++ b/src/main/java/de/learnlib/ralib/oracles/mto/SymbolicSuffixRestrictionBuilder.java @@ -55,7 +55,7 @@ public Map restrictSuffix(Word theory = teachers.get(t); + Theory theory = teachers.get(t); restr = theory.restrictSuffixValue(sv, prefix, suffix, consts); } restrictions.put(sv, restr); @@ -66,7 +66,7 @@ public Map restrictSuffix(Word prior) { if (teachers == null) return SuffixValueRestriction.genericRestriction(guard, prior); - Theory theory = teachers.get(guard.getParameter().getType()); + Theory theory = teachers.get(guard.getParameter().getDataType()); return theory.restrictSuffixValue(guard, prior); } @@ -75,7 +75,7 @@ public boolean sdtPathRevealsRegister(List path, SymbolicDataValue[] r return false; Set revealedRegisters = new LinkedHashSet<>(); for (SDTGuard guard : path) { - Theory theory = teachers.get(guard.getParameter().getType()); + Theory theory = teachers.get(guard.getParameter().getDataType()); for (SymbolicDataValue r : registers) { if (theory.guardRevealsRegister(guard, r)) { revealedRegisters.add(r); diff --git a/src/main/java/de/learnlib/ralib/solver/ConstraintSolver.java b/src/main/java/de/learnlib/ralib/smt/ConstraintSolver.java similarity index 82% rename from src/main/java/de/learnlib/ralib/solver/ConstraintSolver.java rename to src/main/java/de/learnlib/ralib/smt/ConstraintSolver.java index 1e4e2182..cef1fbed 100644 --- a/src/main/java/de/learnlib/ralib/solver/ConstraintSolver.java +++ b/src/main/java/de/learnlib/ralib/smt/ConstraintSolver.java @@ -14,12 +14,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package de.learnlib.ralib.solver; +package de.learnlib.ralib.smt; import de.learnlib.ralib.automata.guards.GuardExpression; import de.learnlib.ralib.data.DataValue; import de.learnlib.ralib.data.Mapping; import de.learnlib.ralib.data.SymbolicDataValue; +import gov.nasa.jpf.constraints.api.Expression; /** * @@ -27,6 +28,8 @@ */ public interface ConstraintSolver { - public boolean isSatisfiable(GuardExpression expr, Mapping> val); + public boolean isSatisfiable(GuardExpression expr, Mapping val); + + public boolean isSatisfiable(Expression expr, Mapping val); } diff --git a/src/main/java/de/learnlib/ralib/solver/ConstraintSolverFactory.java b/src/main/java/de/learnlib/ralib/smt/ConstraintSolverFactory.java similarity index 80% rename from src/main/java/de/learnlib/ralib/solver/ConstraintSolverFactory.java rename to src/main/java/de/learnlib/ralib/smt/ConstraintSolverFactory.java index 2ee5181e..f75af6d4 100644 --- a/src/main/java/de/learnlib/ralib/solver/ConstraintSolverFactory.java +++ b/src/main/java/de/learnlib/ralib/smt/ConstraintSolverFactory.java @@ -15,12 +15,11 @@ * limitations under the License. */ -package de.learnlib.ralib.solver; +package de.learnlib.ralib.smt; import java.util.Properties; -import de.learnlib.ralib.solver.jconstraints.JConstraintsConstraintSolver; -import de.learnlib.ralib.solver.simple.SimpleConstraintSolver; +import de.learnlib.ralib.smt.jconstraints.JConstraintsConstraintSolver; import gov.nasa.jpf.constraints.solvers.nativez3.NativeZ3SolverProvider; /** @@ -35,8 +34,6 @@ public class ConstraintSolverFactory { public static ConstraintSolver createSolver(final String id) { switch (id) { - case ID_SIMPLE: - return createSimpleConstraintSolver(); case ID_Z3: return createZ3ConstraintSolver(); default: @@ -44,10 +41,6 @@ public static ConstraintSolver createSolver(final String id) { } } - public static SimpleConstraintSolver createSimpleConstraintSolver() { - return new SimpleConstraintSolver(); - } - public static JConstraintsConstraintSolver createZ3ConstraintSolver() { return new JConstraintsConstraintSolver( (new NativeZ3SolverProvider()).createSolver(new Properties())); diff --git a/src/main/java/de/learnlib/ralib/smt/ReplacingVarsVisitor.java b/src/main/java/de/learnlib/ralib/smt/ReplacingVarsVisitor.java new file mode 100644 index 00000000..c4e4e7f7 --- /dev/null +++ b/src/main/java/de/learnlib/ralib/smt/ReplacingVarsVisitor.java @@ -0,0 +1,21 @@ +package de.learnlib.ralib.smt; + +import de.learnlib.ralib.data.SymbolicDataValue; +import de.learnlib.ralib.data.VarMapping; +import gov.nasa.jpf.constraints.api.Expression; +import gov.nasa.jpf.constraints.api.Variable; +import gov.nasa.jpf.constraints.util.DuplicatingVisitor; + +public class ReplacingVarsVisitor extends + DuplicatingVisitor> { + + @Override + public Expression visit(Variable v, VarMapping data) { + SymbolicDataValue newVar = data.get(v); + return (newVar != null) ? newVar : v; + } + + public Expression apply(Expression expr, VarMapping rename) { + return visit(expr, rename).requireAs(expr.getType()); + } +} diff --git a/src/main/java/de/learnlib/ralib/smt/SMTUtils.java b/src/main/java/de/learnlib/ralib/smt/SMTUtils.java new file mode 100644 index 00000000..45deffcc --- /dev/null +++ b/src/main/java/de/learnlib/ralib/smt/SMTUtils.java @@ -0,0 +1,41 @@ +package de.learnlib.ralib.smt; + +import com.google.common.base.Function; +import de.learnlib.ralib.data.DataValue; +import de.learnlib.ralib.data.Mapping; +import de.learnlib.ralib.data.SymbolicDataValue; +import de.learnlib.ralib.data.VarMapping; +import gov.nasa.jpf.constraints.api.Expression; +import gov.nasa.jpf.constraints.api.ExpressionVisitor; +import gov.nasa.jpf.constraints.api.Valuation; +import gov.nasa.jpf.constraints.api.Variable; +import gov.nasa.jpf.constraints.expressions.*; +import gov.nasa.jpf.constraints.types.BuiltinTypes; +import gov.nasa.jpf.constraints.util.DuplicatingVisitor; + +import java.util.Arrays; + +public class SMTUtils { + + public static Valuation compose(Mapping... varVals) { + Valuation val = new Valuation(); + //System.out.println(Arrays.toString(varVals)); + Arrays.stream(varVals).sequential().flatMap( vv -> vv.entrySet().stream() ).forEach( e -> { + if (val.containsValueFor(e.getKey())) { + assert false; + } + val.setValue(e.getKey(), e.getValue().getValue()); + }); + return val; + } + + public static Constant constantFor(DataValue sv) { + return new Constant(BuiltinTypes.DECIMAL, sv.getValue()); + } + + public static Expression renameVars(Expression expr, + final VarMapping relabelling) { + final ReplacingVarsVisitor replacer = new ReplacingVarsVisitor(); + return replacer.apply(expr, relabelling); + } +} diff --git a/src/main/java/de/learnlib/ralib/solver/jconstraints/JConstraintsConstraintSolver.java b/src/main/java/de/learnlib/ralib/smt/jconstraints/JConstraintsConstraintSolver.java similarity index 81% rename from src/main/java/de/learnlib/ralib/solver/jconstraints/JConstraintsConstraintSolver.java rename to src/main/java/de/learnlib/ralib/smt/jconstraints/JConstraintsConstraintSolver.java index f76e23eb..2d547dff 100644 --- a/src/main/java/de/learnlib/ralib/solver/jconstraints/JConstraintsConstraintSolver.java +++ b/src/main/java/de/learnlib/ralib/smt/jconstraints/JConstraintsConstraintSolver.java @@ -14,13 +14,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package de.learnlib.ralib.solver.jconstraints; +package de.learnlib.ralib.smt.jconstraints; import de.learnlib.ralib.automata.guards.GuardExpression; import de.learnlib.ralib.data.DataValue; import de.learnlib.ralib.data.Mapping; import de.learnlib.ralib.data.SymbolicDataValue; -import de.learnlib.ralib.solver.*; +import de.learnlib.ralib.smt.*; import gov.nasa.jpf.constraints.api.ConstraintSolver.Result; import gov.nasa.jpf.constraints.api.Expression; @@ -38,10 +38,16 @@ public JConstraintsConstraintSolver( } @Override - public boolean isSatisfiable(GuardExpression expr, Mapping> val) { + public boolean isSatisfiable(GuardExpression expr, Mapping val) { Expression jexpr = JContraintsUtil.toExpression(expr, val); Result r = solver.isSatisfiable(jexpr); return r == Result.SAT; } + @Override + public boolean isSatisfiable(Expression expr, Mapping val) { + Result r = solver.isSatisfiable( JContraintsUtil.toExpression(expr, val)); + return r == Result.SAT; + } + } diff --git a/src/main/java/de/learnlib/ralib/solver/jconstraints/JContraintsUtil.java b/src/main/java/de/learnlib/ralib/smt/jconstraints/JContraintsUtil.java similarity index 89% rename from src/main/java/de/learnlib/ralib/solver/jconstraints/JContraintsUtil.java rename to src/main/java/de/learnlib/ralib/smt/jconstraints/JContraintsUtil.java index 8297d61f..d267d932 100644 --- a/src/main/java/de/learnlib/ralib/solver/jconstraints/JContraintsUtil.java +++ b/src/main/java/de/learnlib/ralib/smt/jconstraints/JContraintsUtil.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package de.learnlib.ralib.solver.jconstraints; +package de.learnlib.ralib.smt.jconstraints; import java.util.HashMap; import java.util.Map; @@ -77,17 +77,24 @@ public static Expression toExpression( } } - public static Expression toExpression(GuardExpression expr, Mapping> val) { + public static Expression toExpression(GuardExpression expr, Mapping val) { Map map = new HashMap<>(); Expression guardExpr = toExpression(expr, map); Expression valExpr = toExpression(val, map); return ExpressionUtil.and(guardExpr, valExpr); } - public static Expression toExpression(Mapping> val, Map map) { + public static Expression toExpression(Expression expr, Mapping val) { + Map map = new HashMap<>(); + //Expression guardExpr = toExpression(expr, map); + Expression valExpr = toExpression(val, map); + return ExpressionUtil.and(expr, valExpr); + } + + public static Expression toExpression(Mapping val, Map map) { Expression[] elems = new Expression[val.size()]; int i = 0; - for (Map.Entry> entry : val.entrySet()) { + for (Map.Entry entry : val.entrySet()) { elems[i++] = new NumericBooleanExpression(getOrCreate(entry.getKey(), map), NumericComparator.EQ, toConstant(entry.getValue())); } return ExpressionUtil.and(elems); @@ -147,17 +154,17 @@ public static Expression toExpression(AtomicGuardExpression expr, private static Variable getOrCreate(SymbolicDataValue dv, Map map) { - Type jcType = getJCType(dv.getType().getBase()); Variable ret = map.get(dv); if (ret == null) { - ret = new Variable(jcType, dv.toString()); + // FIXME: superfluous! + ret = dv; map.put(dv, ret); } return ret; } public static Constant toConstant(DataValue v) { - return new Constant( getJCType(v.getType().getBase()), (v.getId())); + return new Constant( BuiltinTypes.DECIMAL, (v.getValue())); } public static Variable toVariable(DataValue v) { diff --git a/src/main/java/de/learnlib/ralib/solver/simple/Constraint.java b/src/main/java/de/learnlib/ralib/solver/simple/Constraint.java deleted file mode 100644 index 88aea901..00000000 --- a/src/main/java/de/learnlib/ralib/solver/simple/Constraint.java +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Copyright (C) 2014-2015 The LearnLib Contributors - * This file is part of LearnLib, http://www.learnlib.de/. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package de.learnlib.ralib.solver.simple; - -import java.io.IOException; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -public abstract class Constraint { - - public static final Monomial TRUE = Monomial.create(Collections.emptyList(), Collections.emptyList()); - public static final Polynomial FALSE = new Polynomial(Collections.emptySet()); - - public static Constraint disjunction(List constraints) { - Set cset = new HashSet(); - for(Constraint c : constraints) - cset.addAll(c.monomials()); - - return Polynomial.fromSet(cset); - } - - public static Monomial makeEquality(int lhs, int rhs) { - return Monomial.create(Collections.singletonList(IntPair.makeOrdered(lhs, rhs)), - Collections.emptyList()); - } - - public static Monomial makeInequality(int lhs, int rhs) { - return Monomial.create(Collections.emptyList(), - Collections.singletonList(IntPair.makeOrdered(lhs, rhs))); - } - - public static Constraint disjunction(Constraint ...constraints) { - return disjunction(Arrays.asList(constraints)); - } - - public static Constraint conjunction(List constraints) { - Set cset = new HashSet(); - makeConjunction(cset, constraints); - return Polynomial.fromSet(cset); - } - - public static Constraint conjunction(Constraint ...constraints) { - return conjunction(Arrays.asList(constraints)); - } - - private static void makeConjunction(Set constraints, List csetList) { - makeConjunction(constraints, csetList, TRUE, 0); - } - - private static void makeConjunction(Set constraints, List csetList, Monomial curr, int idx) { - if(curr == null) - return; - if(idx >= csetList.size()) { - constraints.add(curr); - return; - } - Constraint cset = csetList.get(idx); - if(cset.isFalse()) - return; - - for(Monomial m : cset.monomials()) - makeConjunction(constraints, csetList, Monomial.conjoin(curr, m), idx+1); - } - - public abstract Constraint restrict(int newDomSize); - - public abstract Constraint negate(); - - public abstract void print(Appendable a, String[] varNames) - throws IOException; - - public abstract Constraint shift(int[] numVars, int thisIdx); - - public abstract Constraint shift(int myVars, int base, int total); - - public abstract Constraint substitute(int[] subst); - - public abstract Constraint shift(int shift); - - public abstract Collection monomials(); - - public abstract boolean isTrue(); - - public abstract boolean isFalse(); - - public boolean implies(Constraint other) { - return conjunction(this, other.negate()).isFalse(); - } - - public Relation compare(Constraint other) { - boolean implies = implies(other); - boolean impliedBy = other.implies(this); - if(implies) { - if(impliedBy) - return Relation.EQUIVALENT; - return Relation.IMPLIES; - } - else if(impliedBy) - return Relation.IMPLIED_BY; - - if(conjunction(this, other).isFalse()) - return Relation.DISJOINT; - return Relation.INTERSECT; - } - - public boolean equivalent(Constraint other) { - return implies(other) && other.implies(this); - } - - public abstract Constraint normalize(); -} diff --git a/src/main/java/de/learnlib/ralib/solver/simple/DisjointSet.java b/src/main/java/de/learnlib/ralib/solver/simple/DisjointSet.java deleted file mode 100644 index b6f47652..00000000 --- a/src/main/java/de/learnlib/ralib/solver/simple/DisjointSet.java +++ /dev/null @@ -1,112 +0,0 @@ -/* - * Copyright (C) 2014-2015 The LearnLib Contributors - * This file is part of LearnLib, http://www.learnlib.de/. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package de.learnlib.ralib.solver.simple; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class DisjointSet { - - private static class Node { - T x; - Node parent; - int rank; - - public Node(T x) { - this.x = x; - this.parent = null; - this.rank = 0; - } - } - - - - private final Map> nodes - = new HashMap>(); - - public DisjointSet() { - } - - private Node getNode(T x) { - Node n = nodes.get(x); - if(n == null) { - n = new Node(x); - nodes.put(x, n); - } - return n; - } - - public T find(T x) { - Node n = getNode(x); - return findRoot(n).x; - } - - public T union(T a, T b) { - return union(findRoot(a), findRoot(b)).x; - } - - private Node findRoot(T x) { - return findRoot(getNode(x)); - } - - private Node findRoot(Node n) { - if(n.parent == null) - return n; - Node root = findRoot(n.parent); - n.parent = root; - return root; - } - - private Node union(Node a, Node b) { - if(a == b) - return a; - - if(a.rank < b.rank) { - a.parent = b; - a = b; - } - else if(a.rank > b.rank) - b.parent = a; - else { - b.parent = a; - a.rank++; - } - return a; - } - - - public Collection> partition() { - Map,List> result = new HashMap,List>(); - - - for(Node n : nodes.values()) { - Node root = findRoot(n); - List l = result.get(root); - if(l == null) { - l = new ArrayList(); - result.put(root, l); - } - l.add(n.x); - } - - return result.values(); - } - -} diff --git a/src/main/java/de/learnlib/ralib/solver/simple/IntPair.java b/src/main/java/de/learnlib/ralib/solver/simple/IntPair.java deleted file mode 100644 index 1398cd69..00000000 --- a/src/main/java/de/learnlib/ralib/solver/simple/IntPair.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright (C) 2014-2015 The LearnLib Contributors - * This file is part of LearnLib, http://www.learnlib.de/. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package de.learnlib.ralib.solver.simple; - -public class IntPair implements Comparable { - - public static IntPair makeOrdered(int fst, int snd) { - if(fst > snd) - return new IntPair(snd, fst); - return new IntPair(fst, snd); - } - - private final int fst; - private final int snd; - - public IntPair() { - fst = snd = 0; - } - - public IntPair(int fst, int snd) { - this.fst = fst; - this.snd = snd; - } - - public int getFst() { - return fst; - } - - public int getSnd() { - return snd; - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + fst; - result = prime * result + snd; - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - IntPair other = (IntPair) obj; - if (fst != other.fst) - return false; - if (snd != other.snd) - return false; - return true; - } - - @Override - public int compareTo(IntPair o) { - int d = fst - o.fst; - if(d != 0) - return d; - return snd - o.snd; - } - -} diff --git a/src/main/java/de/learnlib/ralib/solver/simple/Monomial.java b/src/main/java/de/learnlib/ralib/solver/simple/Monomial.java deleted file mode 100644 index e4d7abca..00000000 --- a/src/main/java/de/learnlib/ralib/solver/simple/Monomial.java +++ /dev/null @@ -1,351 +0,0 @@ -/* - * Copyright (C) 2014-2015 The LearnLib Contributors - * This file is part of LearnLib, http://www.learnlib.de/. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package de.learnlib.ralib.solver.simple; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -public class Monomial extends Constraint { - - private static List aggregateEqualities(List constraints) { - List result = new ArrayList(); - for(Monomial c : constraints) - result.addAll(c.getEqualities()); - return result; - } - - private static List aggregateInequalities(List constraints) { - List result = new ArrayList(); - for(Monomial c : constraints) - result.addAll(c.getInequalities()); - return result; - } - - private static IntPair shift(IntPair p, int myVars, int base, int total) { - int fst = p.getFst(), snd = p.getSnd(); - if(fst < myVars) - fst += base; - else - fst = fst - myVars + total; - if(snd < myVars) - snd += base; - else - snd = snd - myVars + total; - return new IntPair(fst, snd); - } - - public static Monomial conjoin(Monomial ...constraints) { - return conjoin(Arrays.asList(constraints)); - } - - public static Monomial conjoin(List constraints) { - List eqs = aggregateEqualities(constraints); - List neqs = aggregateInequalities(constraints); - return create(eqs, neqs); - } - - public static Monomial create(List equalities, List inequalities) { - DisjointSet ds = new DisjointSet(); - - for(IntPair eq : equalities) - ds.union(eq.getFst(), eq.getSnd()); - - IntPair[] ineqs = new IntPair[inequalities.size()]; - - { - int i = 0; - for(IntPair neq : inequalities) { - int a = ds.find(neq.getFst()); - int b = ds.find(neq.getSnd()); - if(a == b) - return null; - - ineqs[i++] = IntPair.makeOrdered(a, b); - } - } - - int pos = 0; - - if(ineqs.length > 0) { - Arrays.sort(ineqs); - IntPair last = ineqs[0]; - pos = 1; - for(int i = 1; i < ineqs.length; i++) { - IntPair neq = ineqs[i]; - if(!last.equals(neq)) { - if(pos != i) - ineqs[pos] = neq; - last = neq; - pos++; - } - } - - } - - List eqs = new ArrayList(); - - for(List set : ds.partition()) { - if(set.size() < 2) - continue; - int min = Integer.MAX_VALUE; - for(int i : set) { - if(i < min) - min = i; - } - for(int i : set) { - if(i != min) - eqs.add(new IntPair(min, i)); - } - } - - return new Monomial(eqs, (pos <= 0) ? Collections.emptyList() : Arrays.asList(ineqs).subList(0, pos)); - } - - private final List equalities; - private final List inequalities; - - private Monomial(List equalities, List inequalities) { - this.equalities = equalities; - this.inequalities = inequalities; - } - - public List getEqualities() { - return equalities; - } - - public List getInequalities() { - return inequalities; - } - /* - public boolean implies(Constraint other) { - if(equalities.size() < other.equalities.size()) - return false; - else if(equalities.size() == other.equalities.size()) { - if(inequalities.size() < other.inequalities.size()) - return false; - } - - DisjointSet ds = partition(); - - for(IntPair oeq : other.equalities) { - if(oeq.) - } - - }*/ - - @Override - public Monomial restrict(int newDomSize) { - List eqs = new ArrayList(); - List neqs = new ArrayList(); - for(IntPair eq : equalities) { - if(eq.getSnd() < newDomSize) - eqs.add(eq); - } - for(IntPair neq : inequalities) { - if(neq.getSnd() < newDomSize) - neqs.add(neq); - } - - return new Monomial(eqs, neqs); - } - - @Override - public Constraint negate() { - if(isTrue()) - return Constraint.FALSE; - Set mons = new HashSet(negated()); - - return Polynomial.fromSet(mons); - } - - public List negated() { - List result = new ArrayList(equalities.size() + inequalities.size()); - - for(IntPair eq : equalities) - result.add(new Monomial(Collections.emptyList(), Collections.singletonList(eq))); - for(IntPair neq : inequalities) - result.add(new Monomial(Collections.singletonList(neq), Collections.emptyList())); - - return result; - } - - @Override - public void print(Appendable a, String[] varNames) throws IOException { - if(equalities.isEmpty() && inequalities.isEmpty()) { - a.append("true"); - return; - } - - boolean first = true; - for(IntPair eq : equalities) { - if(first) - first = false; - else - a.append(" && "); - - int lhs = eq.getFst(), rhs = eq.getSnd(); - - printIndex(a, varNames, lhs); - a.append(" = "); - printIndex(a, varNames, rhs); - } - - for(IntPair neq : inequalities) { - if(first) - first = false; - else - a.append(" && "); - - int lhs = neq.getFst(); - int rhs = neq.getSnd(); - - printIndex(a, varNames, lhs); - a.append(" != "); - printIndex(a, varNames, rhs); - } - } - - public static void printIndex(Appendable a, String[] varNames, int index) throws IOException { - if(index < varNames.length) { - a.append(varNames[index]); - return; - } - index -= varNames.length; - - a.append('p'); - a.append(Integer.toString(index+1)); - } - - @Override - public Monomial shift(int[] numVars, int thisIdx) { - int base = 0; - int total = 0; - for(int i = 0; i < numVars.length; i++) { - if(i == thisIdx) - base = total; - total += numVars[i]; - } - - int myVars = numVars[thisIdx]; - - List eqs = new ArrayList(equalities.size()); - for(IntPair ip : equalities) - eqs.add(shift(ip, myVars, base, total)); - List neqs = new ArrayList(inequalities.size()); - for(IntPair ip : inequalities) - neqs.add(shift(ip, myVars, base, total)); - - return new Monomial(eqs, neqs); - } - - @Override - public Monomial shift(int myVars, int base, int total) { - List eqs = new ArrayList(equalities.size()); - for(IntPair ip : equalities) - eqs.add(shift(ip, myVars, base, total)); - List neqs = new ArrayList(inequalities.size()); - for(IntPair ip : inequalities) - neqs.add(shift(ip, myVars, base, total)); - - return new Monomial(eqs, neqs); - } - - @Override - public Monomial substitute(int[] subst) { - List eqs = new ArrayList(equalities.size()); - for(IntPair ip : equalities) - eqs.add(new IntPair(subst[ip.getFst()], subst[ip.getSnd()])); - List neqs = new ArrayList(inequalities.size()); - for(IntPair ip : inequalities) - neqs.add(new IntPair(subst[ip.getFst()], subst[ip.getSnd()])); - - return Monomial.create(eqs, neqs); - } - - @Override - public Monomial shift(int shift) { - List eqs = new ArrayList(equalities.size()); - for(IntPair ip : equalities) - eqs.add(new IntPair(ip.getFst() + shift, ip.getSnd() + shift)); - - List neqs = new ArrayList(inequalities.size()); - for(IntPair ip : inequalities) - neqs.add(new IntPair(ip.getFst() + shift, ip.getSnd() + shift)); - - return new Monomial(eqs, neqs); - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result - + ((equalities == null) ? 0 : equalities.hashCode()); - result = prime * result - + ((inequalities == null) ? 0 : inequalities.hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - Monomial other = (Monomial) obj; - if (equalities == null) { - if (other.equalities != null) - return false; - } else if (!equalities.equals(other.equalities)) - return false; - if (inequalities == null) { - if (other.inequalities != null) - return false; - } else if (!inequalities.equals(other.inequalities)) - return false; - return true; - } - - @Override - public Collection monomials() { - return Collections.singletonList(this); - } - - @Override - public boolean isTrue() { - return equalities.isEmpty() && inequalities.isEmpty(); - } - - @Override - public boolean isFalse() { - return false; - } - - @Override - public Constraint normalize() { - return this; - } - -} diff --git a/src/main/java/de/learnlib/ralib/solver/simple/Polynomial.java b/src/main/java/de/learnlib/ralib/solver/simple/Polynomial.java deleted file mode 100644 index 6835aaec..00000000 --- a/src/main/java/de/learnlib/ralib/solver/simple/Polynomial.java +++ /dev/null @@ -1,180 +0,0 @@ -/* - * Copyright (C) 2014-2015 The LearnLib Contributors - * This file is part of LearnLib, http://www.learnlib.de/. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package de.learnlib.ralib.solver.simple; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -public class Polynomial extends Constraint { - - static Constraint fromSet(Set constraints) { - int size = constraints.size(); - if(size == 0) - return FALSE; - else if(size == 1) - return constraints.iterator().next(); - return new Polynomial(constraints); - } - - private final Set constraints; - - Polynomial(Set constraints) { - this.constraints = constraints; - } - - @Override - public Constraint negate() { - List csets = new ArrayList(constraints.size()); - - for(Monomial m : constraints) - csets.add(m.negate()); - - return Constraint.conjunction(csets); - } - - public boolean implies(Polynomial other) { - return conjunction(Arrays.asList(this, other.negate())).isFalse(); - } - - public boolean equivalent(Polynomial other) { - return implies(other) && other.implies(this); - } - - public Set getConstraints() { - return Collections.unmodifiableSet(constraints); - } - - @Override - public void print(Appendable a, String[] varNames) throws IOException { - if(constraints.isEmpty()) { - a.append("false"); - return; - } - boolean first = true; - for(Constraint c : constraints) { - if(first) - first = false; - else - a.append(" || "); - c.print(a, varNames); - } - } - - @Override - public Polynomial shift(int[] numVars, int thisIdx) { - Set cs = new HashSet(constraints.size()); - for(Monomial c : constraints) - cs.add(c.shift(numVars, thisIdx)); - return new Polynomial(cs); - } - - @Override - public Polynomial shift(int myVars, int base, int total) { - Set cs = new HashSet(constraints.size()); - for(Monomial c : constraints) - cs.add(c.shift(myVars, base, total)); - return new Polynomial(cs); - } - - @Override - public boolean isFalse() { - return constraints.isEmpty(); - } - - @Override - public boolean isTrue() { - return negate().isFalse(); - } - - @Override - public Polynomial substitute(int[] subst) { - Set cs = new HashSet(); - for(Monomial c : constraints) - cs.add(c.substitute(subst)); - return new Polynomial(cs); - } - - @Override - public Polynomial shift(int shift) { - Set cs = new HashSet(constraints.size()); - for(Monomial c : constraints) - cs.add(c.shift(shift)); - return new Polynomial(cs); - } - - @Override - public Polynomial restrict(int numVars) { - Set cs = new HashSet(); - for(Monomial c : constraints) - cs.add(c.restrict(numVars)); - return new Polynomial(cs); - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result - + ((constraints == null) ? 0 : constraints.hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - Polynomial other = (Polynomial) obj; - if (constraints == null) { - if (other.constraints != null) - return false; - } else if (!constraints.equals(other.constraints)) - return false; - return true; - } - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - try { - print(sb, new String[0]); - } - catch(IOException e) {} - return sb.toString(); - } - - @Override - public Collection monomials() { - return constraints; - } - - - @Override - public Constraint normalize() { - return negate().negate(); - } - -} diff --git a/src/main/java/de/learnlib/ralib/solver/simple/Relation.java b/src/main/java/de/learnlib/ralib/solver/simple/Relation.java deleted file mode 100644 index 51d0f89e..00000000 --- a/src/main/java/de/learnlib/ralib/solver/simple/Relation.java +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright (C) 2014-2015 The LearnLib Contributors - * This file is part of LearnLib, http://www.learnlib.de/. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package de.learnlib.ralib.solver.simple; - -public enum Relation { - EQUIVALENT, - IMPLIES, - IMPLIED_BY, - INTERSECT, - DISJOINT -} diff --git a/src/main/java/de/learnlib/ralib/solver/simple/SimpleConstraintSolver.java b/src/main/java/de/learnlib/ralib/solver/simple/SimpleConstraintSolver.java deleted file mode 100644 index a5291b1a..00000000 --- a/src/main/java/de/learnlib/ralib/solver/simple/SimpleConstraintSolver.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (C) 2014-2015 The LearnLib Contributors - * This file is part of LearnLib, http://www.learnlib.de/. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package de.learnlib.ralib.solver.simple; - -import java.util.ArrayList; -import java.util.List; - -import de.learnlib.ralib.automata.guards.AtomicGuardExpression; -import de.learnlib.ralib.automata.guards.Conjunction; -import de.learnlib.ralib.automata.guards.GuardExpression; -import de.learnlib.ralib.data.DataValue; -import de.learnlib.ralib.data.Mapping; -import de.learnlib.ralib.data.SymbolicDataValue; -import de.learnlib.ralib.solver.ConstraintSolver; - -/** - * - * @author falk - */ -public class SimpleConstraintSolver implements ConstraintSolver { - - private final SimpleSolver solver; - - public SimpleConstraintSolver() { - this.solver = new SimpleSolver(); - } - - @Override - public boolean isSatisfiable(GuardExpression expr, Mapping> val) { - List conjuncts = new ArrayList(); - conjuncts.add(expr); - SymbolicDataValue[] sdvs = val.keySet().toArray(new SymbolicDataValue[val.size()]); - - for (int i = 0; i < sdvs.length; i++) { - for (int j = i + 1; j < sdvs.length; j++) { - if (val.get(sdvs[i]).equals(val.get(sdvs[j]))) { - conjuncts.add(new AtomicGuardExpression(sdvs[i], - de.learnlib.ralib.automata.guards.Relation.EQUALS, sdvs[j])); - } else { - conjuncts.add(new AtomicGuardExpression(sdvs[i], - de.learnlib.ralib.automata.guards.Relation.NOT_EQUALS, sdvs[j])); - } - } - } - - Conjunction exprWithVal = new Conjunction(conjuncts.toArray(new GuardExpression[conjuncts.size()])); - - return solver.isSatisfiable(exprWithVal); - } -} diff --git a/src/main/java/de/learnlib/ralib/solver/simple/SimpleSolver.java b/src/main/java/de/learnlib/ralib/solver/simple/SimpleSolver.java deleted file mode 100644 index d13d1250..00000000 --- a/src/main/java/de/learnlib/ralib/solver/simple/SimpleSolver.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (C) 2014-2015 The LearnLib Contributors - * This file is part of LearnLib, http://www.learnlib.de/. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package de.learnlib.ralib.solver.simple; - -import de.learnlib.ralib.automata.guards.GuardExpression; - -public class SimpleSolver { - - - public boolean isSatisfiable(GuardExpression guard) { - TranslationContext ctx = new TranslationContext(); - Constraint c = ctx.translateGuard(guard); - return !c.isFalse(); - } - -} diff --git a/src/main/java/de/learnlib/ralib/solver/simple/TranslationContext.java b/src/main/java/de/learnlib/ralib/solver/simple/TranslationContext.java deleted file mode 100644 index 0e021945..00000000 --- a/src/main/java/de/learnlib/ralib/solver/simple/TranslationContext.java +++ /dev/null @@ -1,116 +0,0 @@ -/* - * Copyright (C) 2014-2015 The LearnLib Contributors - * This file is part of LearnLib, http://www.learnlib.de/. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package de.learnlib.ralib.solver.simple; - -import java.util.HashMap; -import java.util.Map; - -import de.learnlib.ralib.automata.guards.AtomicGuardExpression; -import de.learnlib.ralib.automata.guards.Conjunction; -import de.learnlib.ralib.automata.guards.Disjunction; -import de.learnlib.ralib.automata.guards.FalseGuardExpression; -import de.learnlib.ralib.automata.guards.GuardExpression; -import de.learnlib.ralib.automata.guards.Negation; -import de.learnlib.ralib.automata.guards.TrueGuardExpression; -import de.learnlib.ralib.data.SymbolicDataValue; - -public class TranslationContext { - - private final Map dvMap = new HashMap<>(); - - public int getDataValueIndex(SymbolicDataValue dataValue) { - Integer i = dvMap.get(dataValue); - if (i == null) { - return -1; - } - return i.intValue(); - } - - public int translateDataValue(SymbolicDataValue dataValue) { - Integer i = dvMap.get(dataValue); - if (i == null) { - i = dvMap.size(); - dvMap.put(dataValue, i); - } - return i.intValue(); - } - - public Constraint translateGuard(GuardExpression e) { - if (e instanceof TrueGuardExpression) { - return translate((TrueGuardExpression) e); - } - if (e instanceof FalseGuardExpression) { - return translate((FalseGuardExpression) e); - } - if (e instanceof Negation) { - return translate((Negation) e); - } - if (e instanceof Conjunction) { - return translate((Conjunction) e); - } - if (e instanceof Disjunction) { - return translate((Disjunction) e); - } - if (e instanceof AtomicGuardExpression) { - return translate((AtomicGuardExpression) e); - } - throw new IllegalArgumentException(); - } - - private Constraint translate(TrueGuardExpression unused) { - return Constraint.TRUE; - } - - private Constraint translate(FalseGuardExpression unused) { - return Constraint.FALSE; - } - - private Constraint translate(Negation e) { - return translateGuard(e.getNegated()).negate(); - } - - private Constraint translate(Conjunction e) { - GuardExpression[] conjuncts = e.getConjuncts(); - Constraint[] translated = new Constraint[conjuncts.length]; - for (int i = 0; i < conjuncts.length; i++) { - translated[i] = translateGuard(conjuncts[i]); - } - return Constraint.conjunction(translated); - } - - private Constraint translate(Disjunction e) { - GuardExpression[] disjuncts = e.getDisjuncts(); - Constraint[] translated = new Constraint[disjuncts.length]; - for (int i = 0; i < disjuncts.length; i++) { - translated[i] = translateGuard(disjuncts[i]); - } - return Constraint.disjunction(translated); - } - - private Monomial translate(AtomicGuardExpression e) { - int lhs = translateDataValue(e.getLeft()); - int rhs = translateDataValue(e.getRight()); - switch (e.getRelation()) { - case EQUALS: - return Constraint.makeEquality(lhs, rhs); - case NOT_EQUALS: - return Constraint.makeInequality(lhs, rhs); - } - throw new AssertionError(); - } - -} diff --git a/src/main/java/de/learnlib/ralib/sul/SimulatorSUL.java b/src/main/java/de/learnlib/ralib/sul/SimulatorSUL.java index b4549a82..08a84e43 100644 --- a/src/main/java/de/learnlib/ralib/sul/SimulatorSUL.java +++ b/src/main/java/de/learnlib/ralib/sul/SimulatorSUL.java @@ -131,7 +131,7 @@ private PSymbolInstance createOutputSymbol(OutputTransition ot) { if (!mapping.getOutput().keySet().contains(p)) { List old = computeOld(t, pval); DataValue dv = teachers.get(t).getFreshValue(old); - vals[i] = new FreshValue(dv.getType(), dv.getId()); + vals[i] = new FreshValue(dv.getDataType(), dv.getValue()); } else { SymbolicDataValue sv = mapping.getOutput().get(p); @@ -169,7 +169,7 @@ private List computeOld(DataType t, ParValuation pval) { Set set = new LinkedHashSet<>(); set.addAll(DataWords.valSet(prefix, t)); for (DataValue d : pval.values()){ - if (d.getType().equals(t)) { + if (d.getDataType().equals(t)) { set.add(d); } } diff --git a/src/main/java/de/learnlib/ralib/theory/EquivalenceClassFilter.java b/src/main/java/de/learnlib/ralib/theory/EquivalenceClassFilter.java index fb553ec5..fb9ef0ac 100644 --- a/src/main/java/de/learnlib/ralib/theory/EquivalenceClassFilter.java +++ b/src/main/java/de/learnlib/ralib/theory/EquivalenceClassFilter.java @@ -19,29 +19,29 @@ public class EquivalenceClassFilter { - private final List> equivClasses; + private final List equivClasses; private boolean useOptimization; - public EquivalenceClassFilter(List> equivClasses, boolean useOptimization) { + public EquivalenceClassFilter(List equivClasses, boolean useOptimization) { this.equivClasses = equivClasses; this.useOptimization = useOptimization; } - public List> toList(SuffixValueRestriction restr, + public List toList(SuffixValueRestriction restr, Word prefix, Word suffix, WordValuation valuation) { if (!useOptimization) { return equivClasses; } - List> filtered = new ArrayList<>(); + List filtered = new ArrayList<>(); ParameterGenerator pgen = new ParameterGenerator(); SuffixValueGenerator svgen = new SuffixValueGenerator(); - Mapping> mapping = new Mapping<>(); + Mapping mapping = new Mapping<>(); for (PSymbolInstance psi : prefix) { DataType[] dts = psi.getBaseSymbol().getPtypes(); - DataValue[] dvs = psi.getParameterValues(); + DataValue[] dvs = psi.getParameterValues(); for (int i = 0; i < dvs.length; i++) { Parameter p = pgen.next(dts[i]); mapping.put(p, dvs[i]); @@ -51,7 +51,7 @@ public List> toList(SuffixValueRestriction restr, DataType[] dts = ps.getPtypes(); for (int i = 0; i < dts.length; i++) { SuffixValue sv = svgen.next(dts[i]); - DataValue val = valuation.get(sv.getId()); + DataValue val = valuation.get(sv.getId()); if (val != null) { mapping.put(sv, val); } @@ -59,8 +59,8 @@ public List> toList(SuffixValueRestriction restr, } GuardExpression expr = restr.toGuardExpression(mapping.keySet()); - for (DataValue ec : equivClasses) { - Mapping> ecMapping = new Mapping<>(); + for (DataValue ec : equivClasses) { + Mapping ecMapping = new Mapping<>(); ecMapping.putAll(mapping); ecMapping.put(restr.getParameter(), ec); if (expr.isSatisfied(ecMapping)) { diff --git a/src/main/java/de/learnlib/ralib/theory/SDTAndGuard.java b/src/main/java/de/learnlib/ralib/theory/SDTAndGuard.java index cc32f9f1..32dd8ffb 100644 --- a/src/main/java/de/learnlib/ralib/theory/SDTAndGuard.java +++ b/src/main/java/de/learnlib/ralib/theory/SDTAndGuard.java @@ -28,6 +28,7 @@ import de.learnlib.ralib.data.SymbolicDataValue.SuffixValue; import de.learnlib.ralib.data.VarMapping; +@Deprecated public class SDTAndGuard extends SDTMultiGuard { @Override diff --git a/src/main/java/de/learnlib/ralib/theory/SDTGuard.java b/src/main/java/de/learnlib/ralib/theory/SDTGuard.java index 5647beae..99d2398a 100644 --- a/src/main/java/de/learnlib/ralib/theory/SDTGuard.java +++ b/src/main/java/de/learnlib/ralib/theory/SDTGuard.java @@ -29,6 +29,7 @@ * * @author falk */ +@Deprecated public abstract class SDTGuard { //TODO: this should probably be a special sdtparameter @@ -49,7 +50,7 @@ public SDTGuard(SuffixValue param) { public abstract Set getComparands(SymbolicDataValue dv); public SDTGuard(SDTGuard other) { - this.parameter = (SuffixValue) other.parameter.copy(); + this.parameter = (SuffixValue) SymbolicDataValue.copy(other.parameter); } public TransitionGuard toTG() { @@ -64,82 +65,4 @@ public TransitionGuard toTG() { public abstract SDTGuard copy(); -// private Set mergeIfWith(SDTIfGuard thisIf, SDTIfGuard otherIf) { -// Set ifGuard = new LinkedHashSet<>(); -// ifGuard.add(otherIf); -// return mergeIfWith(thisIf, ifGuard); -// } -// -// private Set mergeIfWith(SDTIfGuard thisIf, Set otherOr) { -//// System.out.println("mergeIfWith Set: thisIf " + thisIf + ", otherOr " + otherOr); -// Set otherGuards = new LinkedHashSet<>(); -// otherGuards.addAll(otherOr); -// if (otherGuards.contains(thisIf.toDeqGuard())) { -//// System.out.println("contradiction"); -// otherGuards.remove(thisIf.toDeqGuard()); -// // disequality + equality = true -// if (!((thisIf instanceof EqualityGuard) || thisIf instanceof DisequalityGuard)) { -//// System.out.println("neither is eq or deq"); -// otherGuards.add(new DisequalityGuard( -// thisIf.getParameter(), thisIf.getRegister())); -// } -// } else { -// otherGuards.add(thisIf); -// } -//// System.out.println("otherGuards " + otherGuards); -// return otherGuards; -// } -// -// private Set mergeIfWith(SDTIfGuard thisIf, SDTAndGuard otherAnd) { -// Set ifGuard = new LinkedHashSet<>(); -// ifGuard.add(thisIf); -// return mergeAndWith(otherAnd, ifGuard); -// } -// -//// private Set mergeAndWith(SDTAndGuard thisAnd, SDTAndGuard otherAnd) { -//// Set andGuard = new LinkedHashSet<>(); -//// andGuard.add(otherAnd); -//// return mergeAndWith(thisAnd, andGuard); -//// } -//// -//// private Set mergeAndWith(SDTAndGuard thisAnd, SDTIfGuard otherIf) { -//// return mergeIfWith(otherIf, thisAnd); -//// } -// private Set mergeAndWith(SDTAndGuard thisAnd, Set _merged) { -// //System.out.println(thisAnd + " merges with " + _merged); -// Set ifs = new LinkedHashSet<>(); -// List thisGuards = thisAnd.getGuards(); -// Set merged = new LinkedHashSet<>(); -// merged.addAll(_merged); -// for (SDTGuard x : thisGuards) { -// assert x instanceof SDTIfGuard; -// SDTIfGuard ifX = (SDTIfGuard) x; -// if (merged.contains(ifX.toDeqGuard())) { -// merged.remove(ifX.toDeqGuard()); -// if (!((ifX instanceof EqualityGuard) || ifX instanceof DisequalityGuard)) { -// merged.add(new DisequalityGuard(ifX.getParameter(), ifX.getRegister())); -// } -// } else { -// ifs.add(ifX); -// } -// } -// if (ifs.size() == 1) { -// merged.addAll(ifs); -// } else if (ifs.size() > 1) { -// merged.add(new SDTAndGuard(thisAnd.parameter, ifs.toArray(new SDTIfGuard[]{}))); -// -// } -// //System.out.println("result: " + merged); -// return merged; -// } - -// private Set mergeOrWith(SDTOrGuard thisOr, SDTIfGuard otherIf) { -// return mergeIfWith(otherIf, thisOr.guardSet); -// } -// -// private Set mergeOrWith(SDTOrGuard thisOr, SDTAndGuard otherAnd) { -// return mergeAndWith(otherAnd, thisOr.guardSet); -// } - //public abstract SDTGuard mergeWith(Set others); - } diff --git a/src/main/java/de/learnlib/ralib/theory/SDTIfGuard.java b/src/main/java/de/learnlib/ralib/theory/SDTIfGuard.java index 12b755da..cb9b34cf 100644 --- a/src/main/java/de/learnlib/ralib/theory/SDTIfGuard.java +++ b/src/main/java/de/learnlib/ralib/theory/SDTIfGuard.java @@ -26,6 +26,7 @@ import de.learnlib.ralib.data.SymbolicDataValue.SuffixValue; import de.learnlib.ralib.data.VarMapping; +@Deprecated public abstract class SDTIfGuard extends SDTGuard { protected final SymbolicDataValue register; @@ -54,7 +55,7 @@ public SDTIfGuard(SuffixValue param, SymbolicDataValue reg, Relation rel) { public SDTIfGuard(SDTIfGuard other) { super(other); - register = other.register.copy(); + register = SymbolicDataValue.copy(other.register); relation = other.relation; } diff --git a/src/main/java/de/learnlib/ralib/theory/SDTMultiGuard.java b/src/main/java/de/learnlib/ralib/theory/SDTMultiGuard.java index 9c655375..c6a513d7 100644 --- a/src/main/java/de/learnlib/ralib/theory/SDTMultiGuard.java +++ b/src/main/java/de/learnlib/ralib/theory/SDTMultiGuard.java @@ -26,6 +26,7 @@ import de.learnlib.ralib.data.SymbolicDataValue; import de.learnlib.ralib.data.SymbolicDataValue.SuffixValue; +@Deprecated public abstract class SDTMultiGuard extends SDTGuard { protected enum ConDis { diff --git a/src/main/java/de/learnlib/ralib/theory/SDTOrGuard.java b/src/main/java/de/learnlib/ralib/theory/SDTOrGuard.java index d4afda86..2a00e95d 100644 --- a/src/main/java/de/learnlib/ralib/theory/SDTOrGuard.java +++ b/src/main/java/de/learnlib/ralib/theory/SDTOrGuard.java @@ -28,6 +28,7 @@ import de.learnlib.ralib.data.SymbolicDataValue.SuffixValue; import de.learnlib.ralib.data.VarMapping; +@Deprecated public class SDTOrGuard extends SDTMultiGuard { @Override diff --git a/src/main/java/de/learnlib/ralib/theory/SDTTrueGuard.java b/src/main/java/de/learnlib/ralib/theory/SDTTrueGuard.java index 0701d0cd..616ca26f 100644 --- a/src/main/java/de/learnlib/ralib/theory/SDTTrueGuard.java +++ b/src/main/java/de/learnlib/ralib/theory/SDTTrueGuard.java @@ -31,6 +31,7 @@ * * @author Stealth */ +@Deprecated public class SDTTrueGuard extends SDTGuard { public SDTTrueGuard(SymbolicDataValue.SuffixValue param) { diff --git a/src/main/java/de/learnlib/ralib/theory/SuffixValueRestriction.java b/src/main/java/de/learnlib/ralib/theory/SuffixValueRestriction.java index 8591bf6b..6a857803 100644 --- a/src/main/java/de/learnlib/ralib/theory/SuffixValueRestriction.java +++ b/src/main/java/de/learnlib/ralib/theory/SuffixValueRestriction.java @@ -25,11 +25,11 @@ public SuffixValueRestriction(SuffixValue parameter) { } public SuffixValueRestriction(SuffixValueRestriction other) { - parameter = new SuffixValue(other.parameter.getType(), other.parameter.getId()); + parameter = new SuffixValue(other.parameter.getDataType(), other.parameter.getId()); } public SuffixValueRestriction(SuffixValueRestriction other, int shift) { - parameter = new SuffixValue(other.parameter.getType(), other.parameter.getId()+shift); + parameter = new SuffixValue(other.parameter.getDataType(), other.parameter.getId()+shift); } public SuffixValue getParameter() { @@ -54,18 +54,18 @@ public SuffixValue getParameter() { * @return */ public static SuffixValueRestriction genericRestriction(SuffixValue sv, Word prefix, Word suffix, Constants consts) { - DataValue[] prefixVals = DataWords.valsOf(prefix); - DataValue[] suffixVals = DataWords.valsOf(suffix); + DataValue[] prefixVals = DataWords.valsOf(prefix); + DataValue[] suffixVals = DataWords.valsOf(suffix); DataType[] prefixTypes = DataWords.typesOf(DataWords.actsOf(prefix)); DataType[] suffixTypes = DataWords.typesOf(DataWords.actsOf(suffix)); - DataValue val = suffixVals[sv.getId()-1]; + DataValue val = suffixVals[sv.getId()-1]; int firstSymbolArity = suffix.length() > 0 ? suffix.getSymbol(0).getBaseSymbol().getArity() : 0; boolean unrestricted = false; for (int i = 0; i < prefixVals.length; i++) { - DataValue dv = prefixVals[i]; + DataValue dv = prefixVals[i]; DataType dt = prefixTypes[i]; - if (dt.equals(sv.getType()) && dv.equals(val)) { + if (dt.equals(sv.getDataType()) && dv.equals(val)) { unrestricted = true; } } @@ -76,7 +76,7 @@ public static SuffixValueRestriction genericRestriction(SuffixValue sv, Word */ -public interface Theory { +public interface Theory { /** @@ -51,7 +49,7 @@ public interface Theory { * @param vals * @return a fresh data value of type T */ - public DataValue getFreshValue(List> vals); + public DataValue getFreshValue(List vals); /** * Implements a tree query for this theory. This tree query @@ -89,7 +87,7 @@ public SDT treeQuery( * @param vals * @return */ - public Collection> getAllNextValues(List> vals); + public Collection getAllNextValues(List vals); /** * TBD @@ -107,7 +105,7 @@ public SDT treeQuery( public DataValue instantiate(Word prefix, ParameterizedSymbol ps, PIV piv, ParValuation pval, Constants constants, - SDTGuard guard, Parameter param, Set> oldDvs); + SDTGuard guard, Parameter param, Set oldDvs); public SuffixValueRestriction restrictSuffixValue(SuffixValue suffixValue, Word prefix, Word suffix, Constants consts); diff --git a/src/main/java/de/learnlib/ralib/theory/equality/DisequalityGuard.java b/src/main/java/de/learnlib/ralib/theory/equality/DisequalityGuard.java index 27c4ab2e..3b44f029 100644 --- a/src/main/java/de/learnlib/ralib/theory/equality/DisequalityGuard.java +++ b/src/main/java/de/learnlib/ralib/theory/equality/DisequalityGuard.java @@ -33,6 +33,7 @@ * * @author falk */ +@Deprecated public class DisequalityGuard extends SDTIfGuard { public DisequalityGuard( diff --git a/src/main/java/de/learnlib/ralib/theory/equality/EqualRestriction.java b/src/main/java/de/learnlib/ralib/theory/equality/EqualRestriction.java index 27b783e1..3f8dbe17 100644 --- a/src/main/java/de/learnlib/ralib/theory/equality/EqualRestriction.java +++ b/src/main/java/de/learnlib/ralib/theory/equality/EqualRestriction.java @@ -23,12 +23,12 @@ public EqualRestriction(SuffixValue param, SuffixValue equalParam) { public EqualRestriction(EqualRestriction other) { super(other); - equalParam = new SuffixValue(other.equalParam.getType(), other.equalParam.getId()); + equalParam = new SuffixValue(other.equalParam.getDataType(), other.equalParam.getId()); } public EqualRestriction(EqualRestriction other, int shift) { super(other, shift); - equalParam = new SuffixValue(other.equalParam.getType(), other.equalParam.getId()+shift); + equalParam = new SuffixValue(other.equalParam.getDataType(), other.equalParam.getId()+shift); } @Override diff --git a/src/main/java/de/learnlib/ralib/theory/equality/EqualityGuard.java b/src/main/java/de/learnlib/ralib/theory/equality/EqualityGuard.java index 44294ada..8a373020 100644 --- a/src/main/java/de/learnlib/ralib/theory/equality/EqualityGuard.java +++ b/src/main/java/de/learnlib/ralib/theory/equality/EqualityGuard.java @@ -35,6 +35,7 @@ * * @author falk */ +@Deprecated public class EqualityGuard extends SDTIfGuard { public EqualityGuard(SuffixValue param, SymbolicDataValue reg) { diff --git a/src/main/java/de/learnlib/ralib/theory/equality/EqualityTheory.java b/src/main/java/de/learnlib/ralib/theory/equality/EqualityTheory.java index d60c5e10..deb73427 100644 --- a/src/main/java/de/learnlib/ralib/theory/equality/EqualityTheory.java +++ b/src/main/java/de/learnlib/ralib/theory/equality/EqualityTheory.java @@ -64,11 +64,9 @@ import net.automatalib.word.Word; /** - * * @author falk and sofia - * @param */ -public abstract class EqualityTheory implements Theory { +public abstract class EqualityTheory implements Theory { protected boolean useNonFreeOptimization; @@ -91,7 +89,7 @@ public EqualityTheory() { this(false); } - public List> getPotential(List> vals) { + public List getPotential(List vals) { return vals; } @@ -145,7 +143,7 @@ private PIV keepMem(Map guardMap) { if (mg instanceof EqualityGuard) { LOGGER.trace(mg.toString()); SymbolicDataValue r = ((EqualityGuard) mg).getRegister(); - Parameter p = new Parameter(r.getType(), r.getId()); + Parameter p = new Parameter(r.getDataType(), r.getId()); if (r instanceof Register) { ret.put(p, (Register) r); } @@ -162,22 +160,22 @@ public SDT treeQuery(Word prefix, SymbolicSuffix suffix, WordVa int pId = values.size() + 1; SuffixValue currentParam = suffix.getSuffixValue(pId); - DataType type = currentParam.getType(); + DataType type = currentParam.getDataType(); Map tempKids = new LinkedHashMap<>(); - Collection> potSet = DataWords.joinValsToSet(constants.values(type), - DataWords.valSet(prefix, type), suffixValues.values(type)); + Collection potSet = DataWords.joinValsToSet(constants.values(type), + DataWords.valSet(prefix, type), suffixValues.values(type)); - List> potList = new ArrayList<>(potSet); - List> potential = getPotential(potList); + List potList = new ArrayList<>(potSet); + List potential = getPotential(potList); - DataValue fresh = getFreshValue(potential); + DataValue fresh = getFreshValue(potential); - List> equivClasses = new ArrayList<>(potSet); + List equivClasses = new ArrayList<>(potSet); equivClasses.add(fresh); - EquivalenceClassFilter eqcFilter = new EquivalenceClassFilter(equivClasses, useNonFreeOptimization); - List> filteredEquivClasses = eqcFilter.toList(suffix.getRestriction(currentParam), prefix, suffix.getActions(), values); + EquivalenceClassFilter eqcFilter = new EquivalenceClassFilter(equivClasses, useNonFreeOptimization); + List filteredEquivClasses = eqcFilter.toList(suffix.getRestriction(currentParam), prefix, suffix.getActions(), values); assert filteredEquivClasses.size() > 0; // TODO: integrate fresh-value optimization with restrictions @@ -236,7 +234,7 @@ public SDT treeQuery(Word prefix, SymbolicSuffix suffix, WordVa LOGGER.trace("prefix list " + prefixValues.toString()); List diseqList = new ArrayList(); - for (DataValue newDv : potential) { + for (DataValue newDv : potential) { if (filteredEquivClasses.contains(newDv)) { LOGGER.trace(newDv.toString()); @@ -311,11 +309,11 @@ public SDT treeQuery(Word prefix, SymbolicSuffix suffix, WordVa } // construct equality guard by picking up a data value from the prefix - private EqualityGuard pickupDataValue(DataValue newDv, List prefixValues, SuffixValue currentParam, + private EqualityGuard pickupDataValue(DataValue newDv, List prefixValues, SuffixValue currentParam, WordValuation ifValues, Constants constants) { - DataType type = currentParam.getType(); + DataType type = currentParam.getDataType(); int newDv_i; - for (Map.Entry > entry : constants.entrySet()) { + for (Map.Entry entry : constants.entrySet()) { if (entry.getValue().equals(newDv)) { return new EqualityGuard(currentParam, entry.getKey()); } @@ -340,11 +338,11 @@ private EqualityGuard pickupDataValue(DataValue newDv, List prefix @Override // instantiate a parameter with a data value public DataValue instantiate(Word prefix, ParameterizedSymbol ps, PIV piv, ParValuation pval, - Constants constants, SDTGuard guard, Parameter param, Set> oldDvs) { + Constants constants, SDTGuard guard, Parameter param, Set oldDvs) { - List> prefixValues = Arrays.asList(DataWords.valsOf(prefix)); + List prefixValues = Arrays.asList(DataWords.valsOf(prefix)); LOGGER.trace("prefix values : " + prefixValues.toString()); - DataType type = param.getType(); + DataType type = param.getDataType(); Deque guards = new LinkedList<>(); guards.add(guard); @@ -372,15 +370,15 @@ public DataValue instantiate(Word prefix, ParameterizedSymbol p } } - Collection> potSet = DataWords.joinValsToSet(constants.values(type), DataWords.valSet(prefix, type), - pval.values(type)); + Collection potSet = DataWords.joinValsToSet(constants.values(type), DataWords.valSet(prefix, type), + pval.values(type)); if (!potSet.isEmpty()) { LOGGER.trace("potSet = " + potSet.toString()); } else { LOGGER.trace("potSet is empty"); } - DataValue fresh = this.getFreshValue(new ArrayList>(potSet)); + DataValue fresh = this.getFreshValue(new ArrayList(potSet)); LOGGER.trace("fresh = " + fresh.toString()); return fresh; @@ -417,7 +415,7 @@ private Word buildQuery(Word prefix, SymbolicS if (base + a.getArity() > values.size()) { break; } - DataValue[] vals = new DataValue[a.getArity()]; + DataValue[] vals = new DataValue[a.getArity()]; for (int i = 0; i < a.getArity(); i++) { vals[i] = values.get(base + i + 1); } diff --git a/src/main/java/de/learnlib/ralib/theory/equality/UniqueEqualityTheory.java b/src/main/java/de/learnlib/ralib/theory/equality/UniqueEqualityTheory.java index 5e76813c..364fda8b 100644 --- a/src/main/java/de/learnlib/ralib/theory/equality/UniqueEqualityTheory.java +++ b/src/main/java/de/learnlib/ralib/theory/equality/UniqueEqualityTheory.java @@ -19,7 +19,7 @@ import de.learnlib.ralib.words.ParameterizedSymbol; import net.automatalib.word.Word; -public abstract class UniqueEqualityTheory implements Theory { +public abstract class UniqueEqualityTheory implements Theory { // protected boolean useNonFreeOptimization; @@ -42,7 +42,7 @@ public UniqueEqualityTheory() { this(false); } - public List> getPotential(List> vals) { + public List getPotential(List vals) { return vals; } @@ -53,13 +53,13 @@ public SDT treeQuery(Word prefix, SymbolicSuffix suffix, WordVa int pId = values.size() + 1; SymbolicDataValue.SuffixValue sv = suffix.getDataValue(pId); - DataType type = sv.getType(); + DataType type = sv.getDataType(); - Collection> potSet = DataWords.joinValsToSet(constants.values(type), - DataWords.valSet(prefix, type), suffixValues.values(type)); + Collection potSet = DataWords.joinValsToSet(constants.values(type), + DataWords.valSet(prefix, type), suffixValues.values(type)); - List> potList = new ArrayList<>(potSet); - List> potential = getPotential(potList); + List potList = new ArrayList<>(potSet); + List potential = getPotential(potList); SDT sdt; Map merged = new HashMap<>(); @@ -83,20 +83,20 @@ public SDT treeQuery(Word prefix, SymbolicSuffix suffix, WordVa @Override // instantiate a parameter with a data value public DataValue instantiate(Word prefix, ParameterizedSymbol ps, PIV piv, ParValuation pval, - Constants constants, SDTGuard guard, SymbolicDataValue.Parameter param, Set> oldDvs) { + Constants constants, SDTGuard guard, SymbolicDataValue.Parameter param, Set oldDvs) { List prefixValues = Arrays.asList(DataWords.valsOf(prefix)); LOGGER.trace(Category.QUERY, "prefix values : {}", prefixValues.toString()); - DataType type = param.getType(); - Collection potSet = DataWords.joinValsToSet(constants.values(type), DataWords.valSet(prefix, type), - pval.values(type)); + DataType type = param.getDataType(); + Collection potSet = DataWords.joinValsToSet(constants.values(type), DataWords.valSet(prefix, type), + pval.values(type)); if (!potSet.isEmpty()) { LOGGER.trace(Category.DATASTRUCTURE, "potSet = {}", potSet.toString()); } else { LOGGER.trace(Category.DATASTRUCTURE, "potSet is empty"); } - DataValue fresh = this.getFreshValue(new ArrayList>(potSet)); + DataValue fresh = this.getFreshValue(new ArrayList(potSet)); LOGGER.trace(Category.DATASTRUCTURE, "fresh = {}", fresh.toString()); return fresh; diff --git a/src/main/java/de/learnlib/ralib/theory/inequality/InequalityTheoryWithEq.java b/src/main/java/de/learnlib/ralib/theory/inequality/InequalityTheoryWithEq.java index 0581aec5..6a0cda66 100644 --- a/src/main/java/de/learnlib/ralib/theory/inequality/InequalityTheoryWithEq.java +++ b/src/main/java/de/learnlib/ralib/theory/inequality/InequalityTheoryWithEq.java @@ -16,7 +16,7 @@ */ package de.learnlib.ralib.theory.inequality; -import static de.learnlib.ralib.solver.jconstraints.JContraintsUtil.toVariable; +import static de.learnlib.ralib.smt.jconstraints.JContraintsUtil.toVariable; import java.util.ArrayList; import java.util.Arrays; @@ -60,9 +60,9 @@ /** * * @author Sofia Cassel - * @param + */ -public abstract class InequalityTheoryWithEq implements Theory { +public abstract class InequalityTheoryWithEq implements Theory { // private static final LearnLogger LOGGER // = LearnLogger.getLogger(InequalityTheoryWithEq.class); @@ -813,7 +813,7 @@ private PIV keepMem(Map guardMap) { if (mg instanceof SDTIfGuard) { //LOGGER.trace(mg.toString()); SymbolicDataValue r = ((SDTIfGuard) mg).getRegister(); - Parameter p = new Parameter(r.getType(), r.getId()); + Parameter p = new Parameter(r.getDataType(), r.getId()); if (r instanceof Register) { ret.put(p, (Register) r); } @@ -821,7 +821,7 @@ private PIV keepMem(Map guardMap) { IntervalGuard iGuard = (IntervalGuard) mg; if (!iGuard.isBiggerGuard()) { SymbolicDataValue r = iGuard.getRightReg(); - Parameter p = new Parameter(r.getType(), r.getId()); + Parameter p = new Parameter(r.getDataType(), r.getId()); if (r instanceof Register) { ret.put(p, (Register) r); } @@ -829,7 +829,7 @@ private PIV keepMem(Map guardMap) { } if (!iGuard.isSmallerGuard()) { SymbolicDataValue r = iGuard.getLeftReg(); - Parameter p = new Parameter(r.getType(), r.getId()); + Parameter p = new Parameter(r.getDataType(), r.getId()); if (r instanceof Register) { ret.put(p, (Register) r); } @@ -837,7 +837,7 @@ private PIV keepMem(Map guardMap) { } else if (mg instanceof SDTOrGuard) { Set rSet = ((SDTOrGuard) mg).getAllRegs(); for (SymbolicDataValue r : rSet) { - Parameter p = new Parameter(r.getType(), r.getId()); + Parameter p = new Parameter(r.getDataType(), r.getId()); if (r instanceof Register) { ret.put(p, (Register) r); } @@ -862,7 +862,7 @@ public SDT treeQuery( int pId = values.size() + 1; List regPotential = new ArrayList<>(); SuffixValue sv = suffix.getDataValue(pId); - DataType type = sv.getType(); + DataType type = sv.getDataType(); List prefixValues = Arrays.asList(DataWords.valsOf(prefix)); @@ -870,13 +870,13 @@ public SDT treeQuery( Map tempKids = new LinkedHashMap<>(); - Collection> potSet = DataWords.joinValsToSet( - constants.values(type), - DataWords.valSet(prefix, type), - suffixValues.values(type)); + Collection potSet = DataWords.joinValsToSet( + constants.values(type), + DataWords.valSet(prefix, type), + suffixValues.values(type)); - List> potList = new ArrayList<>(potSet); - List> potential = getPotential(potList); + List potList = new ArrayList<>(potSet); + List potential = getPotential(potList); // WE ASSUME THE POTENTIAL IS SORTED int potSize = potential.size(); @@ -885,7 +885,7 @@ public SDT treeQuery( if (potential.isEmpty()) { // System.out.println("empty potential"); WordValuation elseValues = new WordValuation(); - DataValue fresh = getFreshValue(potential); + DataValue fresh = getFreshValue(potential); elseValues.putAll(values); elseValues.put(pId, fresh); @@ -910,13 +910,13 @@ public SDT treeQuery( smSuffixValues.putAll(suffixValues); Valuation smVal = new Valuation(); - DataValue dvRight = potential.get(0); + DataValue dvRight = potential.get(0); IntervalGuard sguard = makeSmallerGuard( dvRight, prefixValues, currentParam, smValues, piv); SymbolicDataValue rsm = sguard.getRightReg(); // System.out.println("setting valuation, symDV: " + rsm.toVariable() + " dvright: " + dvRight); - smVal.setValue(toVariable(rsm), dvRight.getId()); - DataValue smcv = instantiate( + smVal.setValue(rsm, dvRight.getValue()); + DataValue smcv = instantiate( sguard, smVal, constants, potential); smValues.put(pId, smcv); smSuffixValues.put(sv, smcv); @@ -934,13 +934,13 @@ public SDT treeQuery( Valuation bgVal = new Valuation(); - DataValue dvLeft = potential.get(potSize - 1); + DataValue dvLeft = potential.get(potSize - 1); IntervalGuard bguard = makeBiggerGuard( dvLeft, prefixValues, currentParam, bgValues, piv); SymbolicDataValue rbg = bguard.getLeftReg(); - bgVal.setValue(toVariable(rbg), dvLeft.getId()); - DataValue bgcv = instantiate( + bgVal.setValue(rbg, dvLeft.getValue()); + DataValue bgcv = instantiate( bguard, bgVal, constants, potential); bgValues.put(pId, bgcv); bgSuffixValues.put(sv, bgcv); @@ -959,8 +959,8 @@ public SDT treeQuery( currentSuffixValues.putAll(suffixValues); //SDTGuard guard; Valuation val = new Valuation(); - DataValue dvMRight = potential.get(i); - DataValue dvMLeft = potential.get(i - 1); + DataValue dvMRight = potential.get(i); + DataValue dvMLeft = potential.get(i - 1); // IntervalGuard smallerGuard = makeSmallerGuard( // dvMRight, prefixValues, @@ -976,10 +976,10 @@ public SDT treeQuery( SymbolicDataValue rs = intervalGuard.getRightReg(); SymbolicDataValue rb = intervalGuard.getLeftReg(); - val.setValue(toVariable(rs), dvMRight.getId()); - val.setValue(toVariable(rb), dvMLeft.getId()); + val.setValue(rs, dvMRight.getValue()); + val.setValue(rb, dvMLeft.getValue()); - DataValue cv = instantiate( + DataValue cv = instantiate( intervalGuard, val, constants, potential); currentValues.put(pId, cv); currentSuffixValues.put(sv, cv); @@ -994,7 +994,7 @@ public SDT treeQuery( } } // System.out.println("eq potential is: " + potential); - for (DataValue newDv : potential) { + for (DataValue newDv : potential) { // LOGGER.trace(newDv.toString()); // this is the valuation of the suffixvalues in the suffix @@ -1047,12 +1047,12 @@ public SDT treeQuery( return returnSDT; } - private EqualityGuard pickupDataValue(DataValue newDv, + private EqualityGuard pickupDataValue(DataValue newDv, List prefixValues, SuffixValue currentParam, WordValuation ifValues, Constants constants) { - DataType type = currentParam.getType(); + DataType type = currentParam.getDataType(); int newDv_i; - for (Map.Entry> entry : constants.entrySet()) { + for (Map.Entry entry : constants.entrySet()) { if (entry.getValue().equals(newDv)) { return new EqualityGuard(currentParam, entry.getKey()); } @@ -1070,10 +1070,10 @@ private EqualityGuard pickupDataValue(DataValue newDv, } } - private IntervalGuard makeSmallerGuard(DataValue smallerDv, + private IntervalGuard makeSmallerGuard(DataValue smallerDv, List prefixValues, SuffixValue currentParam, WordValuation ifValues, PIV pir) { - DataType type = currentParam.getType(); + DataType type = currentParam.getDataType(); int newDv_i; if (prefixValues.contains(smallerDv)) { newDv_i = prefixValues.indexOf(smallerDv) + 1; @@ -1096,8 +1096,8 @@ private IntervalGuard makeSmallerGuard(DataValue smallerDv, } } - private IntervalGuard makeIntervalGuard(DataValue biggerDv, - DataValue smallerDv, + private IntervalGuard makeIntervalGuard(DataValue biggerDv, + DataValue smallerDv, List prefixValues, SuffixValue currentParam, WordValuation ifValues, PIV pir) { IntervalGuard smallerGuard = makeSmallerGuard(smallerDv, prefixValues, currentParam, ifValues, pir); @@ -1105,10 +1105,10 @@ private IntervalGuard makeIntervalGuard(DataValue biggerDv, return new IntervalGuard(currentParam, biggerGuard.getLeftReg(), smallerGuard.getRightReg()); } - private IntervalGuard makeBiggerGuard(DataValue biggerDv, + private IntervalGuard makeBiggerGuard(DataValue biggerDv, List prefixValues, SuffixValue currentParam, WordValuation ifValues, PIV pir) { - DataType type = currentParam.getType(); + DataType type = currentParam.getDataType(); int newDv_i; if (prefixValues.contains(biggerDv)) { newDv_i = prefixValues.indexOf(biggerDv) + 1; @@ -1131,7 +1131,7 @@ private IntervalGuard makeBiggerGuard(DataValue biggerDv, } } - public abstract List> getPotential(List> vals); + public abstract List getPotential(List vals); private DataValue getRegisterValue(SymbolicDataValue r, PIV piv, List prefixValues, Constants constants, @@ -1143,7 +1143,7 @@ private DataValue getRegisterValue(SymbolicDataValue r, PIV piv, int idx = p.getId(); return prefixValues.get(idx - 1); } else if (r.isSuffixValue()) { - Parameter p = new Parameter(r.getType(), r.getId()); + Parameter p = new Parameter(r.getDataType(), r.getId()); return pval.get(p); } else if (r.isConstant()) { return constants.get((SymbolicDataValue.Constant) r); @@ -1152,8 +1152,8 @@ private DataValue getRegisterValue(SymbolicDataValue r, PIV piv, } } - public abstract DataValue instantiate(SDTGuard guard, Valuation val, - Constants constants, Collection> alreadyUsedValues); + public abstract DataValue instantiate(SDTGuard guard, Valuation val, + Constants constants, Collection alreadyUsedValues); @Override public DataValue instantiate( @@ -1163,10 +1163,10 @@ public DataValue instantiate( Constants constants, SDTGuard guard, Parameter param, - Set> oldDvs) { + Set oldDvs) { - DataType type = param.getType(); - DataValue returnThis = null; + DataType type = param.getDataType(); + DataValue returnThis = null; List prefixValues = Arrays.asList(DataWords.valsOf(prefix)); // LOGGER.trace("prefix values : " + prefixValues.toString()); @@ -1182,48 +1182,48 @@ public DataValue instantiate( returnThis = prefixValues.get(idx - 1); } else if (ereg.isSuffixValue()) { Parameter p = new Parameter(type, ereg.getId()); - returnThis = (DataValue) pval.get(p); + returnThis = (DataValue) pval.get(p); } else if (ereg.isConstant()) { - returnThis = (DataValue) constants.get((SymbolicDataValue.Constant) ereg); + returnThis = (DataValue) constants.get((SymbolicDataValue.Constant) ereg); } } else if (guard instanceof SDTTrueGuard || guard instanceof DisequalityGuard) { - Collection> potSet = DataWords.joinValsToSet( - constants.values(type), - DataWords.valSet(prefix, type), - pval.values(type)); + Collection potSet = DataWords.joinValsToSet( + constants.values(type), + DataWords.valSet(prefix, type), + pval.values(type)); returnThis = this.getFreshValue(new ArrayList<>(potSet)); } else { - Collection> alreadyUsedValues - = DataWords.joinValsToSet( - constants.values(type), - DataWords.valSet(prefix, type), - pval.values(type)); + Collection alreadyUsedValues + = DataWords.joinValsToSet( + constants.values(type), + DataWords.valSet(prefix, type), + pval.values(type)); Valuation val = new Valuation(); //System.out.println("already used = " + alreadyUsedValues); if (guard instanceof IntervalGuard) { IntervalGuard iGuard = (IntervalGuard) guard; if (!iGuard.isBiggerGuard()) { SymbolicDataValue r = iGuard.getRightReg(); - DataValue regVal = getRegisterValue(r, piv, + DataValue regVal = getRegisterValue(r, piv, prefixValues, constants, pval); - val.setValue(toVariable(r), regVal.getId()); + val.setValue(r, regVal.getValue()); } if (!iGuard.isSmallerGuard()) { SymbolicDataValue l = iGuard.getLeftReg(); DataValue regVal = getRegisterValue(l, piv, prefixValues, constants, pval); - val.setValue(toVariable(l), regVal.getId()); + val.setValue(l, regVal.getValue()); } //instantiate(guard, val, param, constants); } else if (guard instanceof SDTIfGuard) { SymbolicDataValue r = ((SDTIfGuard) guard).getRegister(); - DataValue regVal = getRegisterValue(r, piv, + DataValue regVal = getRegisterValue(r, piv, prefixValues, constants, pval); - val.setValue(toVariable(r), regVal.getId()); + val.setValue(r, regVal.getValue()); } else if (guard instanceof SDTOrGuard) { SDTGuard iGuard = ((SDTOrGuard) guard).getGuards().get(0); @@ -1242,7 +1242,7 @@ public DataValue instantiate( // } // } else if (iGuard instanceof SDTIfGuard) { // SymbolicDataValue r = ((SDTIfGuard) iGuard).getRegister(); -// DataValue regVal = getRegisterValue(r, piv, +// DataValue regVal = getRegisterValue(r, piv, // prefixValues, constants, pval); // val.setValue(r.toVariable(), regVal); // } @@ -1250,10 +1250,10 @@ public DataValue instantiate( // } if (!(oldDvs.isEmpty())) { // System.out.println("old dvs: " + oldDvs); - for (DataValue oldDv : oldDvs) { + for (DataValue oldDv : oldDvs) { Valuation newVal = new Valuation(); newVal.putAll(val); - newVal.setValue(toVariable( new SuffixValue(param.getType(), param.getId()) ), oldDv.getId()); + newVal.setValue( new SuffixValue(param.getDataType(), param.getId()) , oldDv.getValue()); // System.out.println("instantiating " + guard + " with " + newVal); DataValue inst = instantiate(guard, newVal, constants, alreadyUsedValues); if (inst != null) { @@ -1293,22 +1293,22 @@ public DataValue instantiate( // } else if ((guard instanceof SDTTrueGuard) // || guard instanceof DisequalityGuard) { // -// Collection> potSet = DataWords.joinValsToSet( -// constants.values(type), -// DataWords.valSet(prefix, type), -// pval.values(type)); +// Collection potSet = DataWords.joinValsToSet( +// constants.values(type), +// DataWords.valSet(prefix, type), +// pval.values(type)); // -// return this.getFreshValue(new ArrayList>(potSet)); +// return this.getFreshValue(new ArrayList(potSet)); // } else { -// Collection> alreadyUsedValues -// = DataWords.joinValsToSet( -// constants.values(type), -// DataWords.valSet(prefix, type), -// pval.values(type)); +// Collection alreadyUsedValues +// = DataWords.joinValsToSet( +// constants.values(type), +// DataWords.valSet(prefix, type), +// pval.values(type)); // Valuation val = new Valuation(); // if (guard instanceof SDTIfGuard) { // SymbolicDataValue r = (((SDTIfGuard) guard).getRegister()); -// DataValue regVal = getRegisterValue(r, piv, +// DataValue regVal = getRegisterValue(r, piv, // prefixValues, constants, pval); // // val.setValue(r.toVariable(), regVal); @@ -1316,7 +1316,7 @@ public DataValue instantiate( // } else if (guard instanceof SDTMultiGuard) { // for (SDTIfGuard ifGuard : ((SDTMultiGuard) guard).getGuards()) { // SymbolicDataValue r = ifGuard.getRegister(); -// DataValue regVal = getRegisterValue(r, piv, +// DataValue regVal = getRegisterValue(r, piv, // prefixValues, constants, pval); // val.setValue(r.toVariable(), regVal); // } diff --git a/src/main/java/de/learnlib/ralib/tools/AbstractToolWithRandomWalk.java b/src/main/java/de/learnlib/ralib/tools/AbstractToolWithRandomWalk.java index aadb2fa8..80d3898b 100644 --- a/src/main/java/de/learnlib/ralib/tools/AbstractToolWithRandomWalk.java +++ b/src/main/java/de/learnlib/ralib/tools/AbstractToolWithRandomWalk.java @@ -17,6 +17,7 @@ package de.learnlib.ralib.tools; import java.lang.reflect.InvocationTargetException; +import java.math.BigDecimal; import java.util.HashMap; import java.util.Map; import java.util.Random; @@ -26,8 +27,8 @@ import de.learnlib.ralib.data.DataType; import de.learnlib.ralib.data.DataValue; -import de.learnlib.ralib.solver.ConstraintSolver; -import de.learnlib.ralib.solver.ConstraintSolverFactory; +import de.learnlib.ralib.smt.ConstraintSolver; +import de.learnlib.ralib.smt.ConstraintSolverFactory; import de.learnlib.ralib.tools.classanalyzer.TypedTheory; import de.learnlib.ralib.tools.config.Configuration; import de.learnlib.ralib.tools.config.ConfigurationException; @@ -132,12 +133,6 @@ public Level parse(Configuration c) throws ConfigurationException { = new ConfigurationOption.StringOption("teachers", "Teachers. Format: type:class + type:class + ...", null, false); - protected static final ConfigurationOption.StringOption OPTION_SOLVER - = new ConfigurationOption.StringOption("solver", - "Constraints Solver. Options: " + ConstraintSolverFactory.ID_SIMPLE + - ", " + ConstraintSolverFactory.ID_Z3 + ".", - ConstraintSolverFactory.ID_SIMPLE, true); - protected static final ConfigurationOption.StringOption OPTION_CONSTANTS = new ConfigurationOption.StringOption("constants", "Regular constants of form [{\"type\":typeA,\"value\":\"valueA\"}, ...]", @@ -197,8 +192,7 @@ public void setup(Configuration config) throws ConfigurationException { teacherClasses.put(pair.getFirst(), pair.getSecond()); } - this.solver = ConstraintSolverFactory.createSolver( - OPTION_SOLVER.parse(config)); + this.solver = ConstraintSolverFactory.createZ3ConstraintSolver(); } private Pair parseTeacherConfig(String config) @@ -240,7 +234,7 @@ public DataValue toDataValue(DataType type) { if (type.getName().compareTo(this.type) != 0) { throw new RuntimeException("Type name mismatch"); } - DataValue dv = new DataValue(type, DataValue.valueOf(value, type.getBase())); + DataValue dv = new DataValue(type, new BigDecimal(value)); return dv; } } diff --git a/src/main/java/de/learnlib/ralib/tools/ClassAnalyzer.java b/src/main/java/de/learnlib/ralib/tools/ClassAnalyzer.java index 0ccf1d63..b02699fc 100644 --- a/src/main/java/de/learnlib/ralib/tools/ClassAnalyzer.java +++ b/src/main/java/de/learnlib/ralib/tools/ClassAnalyzer.java @@ -16,8 +16,6 @@ */ package de.learnlib.ralib.tools; -import static de.learnlib.ralib.tools.AbstractToolWithRandomWalk.OPTION_LOGGING_LEVEL; - import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.util.ArrayList; @@ -183,8 +181,8 @@ public void setup(Configuration config) throws ConfigurationException { String cstString = OPTION_CONSTANTS.parse(config); if (cstString != null) { final SymbolicDataValueGenerator.ConstantGenerator cgen = new SymbolicDataValueGenerator.ConstantGenerator(); - DataValue[] cstArray = super.parseDataValues(cstString, types); - Arrays.stream(cstArray).forEach(c -> consts.put(cgen.next(c.getType()), c)); + DataValue[] cstArray = super.parseDataValues(cstString, types); + Arrays.stream(cstArray).forEach(c -> consts.put(cgen.next(c.getDataType()), c)); } sulLearn = new ClasssAnalyzerDataWordSUL(target, methods, md, consts); diff --git a/src/main/java/de/learnlib/ralib/tools/classanalyzer/ClasssAnalyzerDataWordSUL.java b/src/main/java/de/learnlib/ralib/tools/classanalyzer/ClasssAnalyzerDataWordSUL.java index 58e7d33c..f8f8f1c3 100644 --- a/src/main/java/de/learnlib/ralib/tools/classanalyzer/ClasssAnalyzerDataWordSUL.java +++ b/src/main/java/de/learnlib/ralib/tools/classanalyzer/ClasssAnalyzerDataWordSUL.java @@ -18,6 +18,7 @@ import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; +import java.math.BigDecimal; import java.util.HashMap; import java.util.Map; @@ -123,9 +124,10 @@ public PSymbolInstance step(PSymbolInstance i) throws SULException { return new PSymbolInstance((Boolean) ret ? SpecialSymbols.TRUE : SpecialSymbols.FALSE); } + // FIXME: this is broken now, we need to register values and create representative BigDecimals DataValue retVal = (isFresh(in.getRetType(), ret)) ? registerFreshValue(in.getRetType(), ret) - : new DataValue(in.getRetType(), ret); + : new DataValue(in.getRetType(), (BigDecimal) ret); //updateSeen(retVal); return new PSymbolInstance(in.getOutput(), retVal); @@ -134,25 +136,25 @@ public PSymbolInstance step(PSymbolInstance i) throws SULException { private void updateSeen(DataValue... vals) { for (DataValue v : vals) { - Map map = this.buckets.get(v.getType()); + Map map = this.buckets.get(v.getDataType()); if (map == null) { map = new HashMap<>(); - this.buckets.put(v.getType(), map); + this.buckets.put(v.getDataType(), map); } if (!map.containsKey(v)) { //System.out.println("Put: " + v + " : " + v.getId()); - map.put(v, v.getId()); + map.put(v, v.getValue()); } } } private Object resolve(DataValue d) { - Map map = this.buckets.get(d.getType()); + Map map = this.buckets.get(d.getDataType()); if (map == null || !map.containsKey(d)) { //System.out.println(d); assert false; - return d.getId(); + return d.getValue(); } //System.out.println("Get: " + d + " : " + map.get(d)); return map.get(d); @@ -161,7 +163,7 @@ private Object resolve(DataValue d) { private boolean isFresh(DataType t, Object id) { if (consts.values() .stream() - .filter(d -> d.getType().equals(t) && d.getId().equals(id)) + .filter(d -> d.getDataType().equals(t) && d.getValue().equals(id)) .findAny() .isPresent()) return false; @@ -176,10 +178,10 @@ private DataValue registerFreshValue(DataType retType, Object ret) { this.buckets.put(retType, map); } - DataValue v = new DataValue(retType, map.size()); + DataValue v = new DataValue(retType, new BigDecimal(map.size())); //System.out.println("Put (F): " + v + " : " + ret); map.put(v, ret); - return new FreshValue(v.getType(), v.getId()); + return new FreshValue(v.getDataType(), v.getValue()); } } diff --git a/src/main/java/de/learnlib/ralib/tools/classanalyzer/MethodConfig.java b/src/main/java/de/learnlib/ralib/tools/classanalyzer/MethodConfig.java index d4e1c6e7..7a23e47b 100644 --- a/src/main/java/de/learnlib/ralib/tools/classanalyzer/MethodConfig.java +++ b/src/main/java/de/learnlib/ralib/tools/classanalyzer/MethodConfig.java @@ -56,7 +56,7 @@ public MethodConfig(String config, Class clazz, Map types) Pair, String> parsed = parseParamConfig(pc); pTypes[idx] = parsed.getFirst(); - cTypes[idx] = getOrCreate(parsed.getSecond(), parsed.getFirst(), types); + cTypes[idx] = getOrCreate(parsed.getSecond(), types); idx++; } @@ -72,7 +72,7 @@ public MethodConfig(String config, Class clazz, Map types) else { Pair, String> parsed = parseParamConfig(returnConfig); assert rType.equals(parsed.getFirst()); - DataType rtc = getOrCreate(parsed.getSecond(), parsed.getFirst(), types); + DataType rtc = getOrCreate(parsed.getSecond(), types); this.output = new OutputSymbol("O_" + methodName, rtc); this.isVoid = false; this.retType = rtc; @@ -123,10 +123,10 @@ private Pair, String> parseParamConfig(String config) throws ClassNotFo return Pair.of(cl, parts[1].trim()); } - private DataType getOrCreate(String name, Class base, Map map) { + private DataType getOrCreate(String name, Map map) { DataType ret = map.get(name); if (ret == null) { - ret = new DataType(name, base); + ret = new DataType(name); map.put(name, ret); } return ret; diff --git a/src/main/java/de/learnlib/ralib/tools/classanalyzer/SpecialSymbols.java b/src/main/java/de/learnlib/ralib/tools/classanalyzer/SpecialSymbols.java index dedf466c..b3a6a86c 100644 --- a/src/main/java/de/learnlib/ralib/tools/classanalyzer/SpecialSymbols.java +++ b/src/main/java/de/learnlib/ralib/tools/classanalyzer/SpecialSymbols.java @@ -66,5 +66,5 @@ public boolean equals(Object obj) { public static final OutputSymbol FALSE = new OutputSymbol("FALSE"); - public static final DataType BOOLEAN_TYPE = new DataType("boolean", boolean.class); + public static final DataType BOOLEAN_TYPE = new DataType("boolean"); } diff --git a/src/main/java/de/learnlib/ralib/tools/classanalyzer/TypedTheory.java b/src/main/java/de/learnlib/ralib/tools/classanalyzer/TypedTheory.java index c7180219..7a446202 100644 --- a/src/main/java/de/learnlib/ralib/tools/classanalyzer/TypedTheory.java +++ b/src/main/java/de/learnlib/ralib/tools/classanalyzer/TypedTheory.java @@ -23,9 +23,8 @@ /** * * @author falk - * @param */ -public interface TypedTheory extends Theory { +public interface TypedTheory extends Theory { public void setType(DataType type); diff --git a/src/main/java/de/learnlib/ralib/tools/theories/DoubleDataValue.java b/src/main/java/de/learnlib/ralib/tools/theories/DoubleDataValue.java deleted file mode 100644 index 7312b82f..00000000 --- a/src/main/java/de/learnlib/ralib/tools/theories/DoubleDataValue.java +++ /dev/null @@ -1,21 +0,0 @@ -package de.learnlib.ralib.tools.theories; - -import java.math.BigDecimal; - -import de.learnlib.ralib.data.DataType; -import de.learnlib.ralib.data.DataValue; - -public class DoubleDataValue extends DataValue { - - DoubleDataValue(DataType type, BigDecimal id) { - super(type, id); - } - - @Override - public boolean equals(Object other) { - if (other instanceof DoubleDataValue && id.compareTo(((DoubleDataValue) other).getId()) == 0) - return true; - return super.equals(other); - } - -} diff --git a/src/main/java/de/learnlib/ralib/tools/theories/DoubleInequalityTheory.java b/src/main/java/de/learnlib/ralib/tools/theories/DoubleInequalityTheory.java index af6d2f99..c2690ded 100644 --- a/src/main/java/de/learnlib/ralib/tools/theories/DoubleInequalityTheory.java +++ b/src/main/java/de/learnlib/ralib/tools/theories/DoubleInequalityTheory.java @@ -18,8 +18,8 @@ */ package de.learnlib.ralib.tools.theories; -import static de.learnlib.ralib.solver.jconstraints.JContraintsUtil.toExpression; -import static de.learnlib.ralib.solver.jconstraints.JContraintsUtil.toVariable; +import static de.learnlib.ralib.smt.jconstraints.JContraintsUtil.toExpression; +import static de.learnlib.ralib.smt.jconstraints.JContraintsUtil.toVariable; import java.math.BigDecimal; import java.util.*; @@ -60,13 +60,13 @@ * * @author falk */ -public class DoubleInequalityTheory extends InequalityTheoryWithEq implements TypedTheory { +public class DoubleInequalityTheory extends InequalityTheoryWithEq implements TypedTheory { - private static final class Cpr implements Comparator> { + private static final class Cpr implements Comparator { @Override - public int compare(DataValue one, DataValue other) { - return one.getId().compareTo(other.getId()); + public int compare(DataValue one, DataValue other) { + return one.getValue().compareTo(other.getValue()); } } @@ -84,10 +84,10 @@ public DoubleInequalityTheory(DataType t) { } @Override - public List> getPotential(List> dvs) { + public List getPotential(List dvs) { //assume we can just sort the list and get the values - List> sortedList = new ArrayList<>(); - for (DataValue d : dvs) { + List sortedList = new ArrayList<>(); + for (DataValue d : dvs) { // if (d.getId() instanceof Integer) { // sortedList.add(new DataValue(d.getType(), ((Integer) d.getId()).doubleValue())); // } else if (d.getId() instanceof Double) { @@ -110,28 +110,28 @@ private List> instantiateGuard(SDTGuard g, Valuation val) { // pick up the register SymbolicDataValue si = ((SDTIfGuard) g).getRegister(); // get the register value from the valuation - DataValue sdi = new DoubleDataValue(type, (BigDecimal) val.getValue(toVariable(si))); + DataValue sdi = new DataValue(type, (BigDecimal) val.getValue(si)); // add the register value as a constant - gov.nasa.jpf.constraints.expressions.Constant wm = new gov.nasa.jpf.constraints.expressions.Constant(BuiltinTypes.DECIMAL, (sdi.getId())); + gov.nasa.jpf.constraints.expressions.Constant wm = new gov.nasa.jpf.constraints.expressions.Constant(BuiltinTypes.DECIMAL, (sdi.getValue())); // add the constant equivalence expression to the list - eList.add(new NumericBooleanExpression(wm, NumericComparator.EQ, toVariable(si))); + eList.add(new NumericBooleanExpression(wm, NumericComparator.EQ, si)); } else if (g instanceof IntervalGuard) { IntervalGuard iGuard = (IntervalGuard) g; if (!iGuard.isBiggerGuard()) { SymbolicDataValue r = iGuard.getRightReg(); - DataValue ri = new DoubleDataValue(type, (BigDecimal) val.getValue(toVariable(r))); - gov.nasa.jpf.constraints.expressions.Constant wm = new gov.nasa.jpf.constraints.expressions.Constant(BuiltinTypes.DECIMAL, (ri.getId())); + DataValue ri = new DataValue(type, (BigDecimal) val.getValue(r)); + gov.nasa.jpf.constraints.expressions.Constant wm = new gov.nasa.jpf.constraints.expressions.Constant(BuiltinTypes.DECIMAL, (ri.getValue())); // add the constant equivalence expression to the list - eList.add(new NumericBooleanExpression(wm, NumericComparator.EQ, toVariable(r))); + eList.add(new NumericBooleanExpression(wm, NumericComparator.EQ, r)); } if (!iGuard.isSmallerGuard()) { SymbolicDataValue l = iGuard.getLeftReg(); - DataValue li = new DoubleDataValue(type, (BigDecimal) val.getValue(toVariable(l))); - gov.nasa.jpf.constraints.expressions.Constant wm = new gov.nasa.jpf.constraints.expressions.Constant(BuiltinTypes.DECIMAL, (li.getId())); + DataValue li = new DataValue(type, (BigDecimal) val.getValue(l)); + gov.nasa.jpf.constraints.expressions.Constant wm = new gov.nasa.jpf.constraints.expressions.Constant(BuiltinTypes.DECIMAL, (li.getValue())); // add the constant equivalence expression to the list - eList.add(new NumericBooleanExpression(wm, NumericComparator.EQ, toVariable(l))); + eList.add(new NumericBooleanExpression(wm, NumericComparator.EQ, l)); } } @@ -139,7 +139,7 @@ private List> instantiateGuard(SDTGuard g, Valuation val) { } @Override - public DoubleDataValue instantiate(SDTGuard g, Valuation val, Constants c, Collection> alreadyUsedValues) { + public DataValue instantiate(SDTGuard g, Valuation val, Constants c, Collection alreadyUsedValues) { //System.out.println("INSTANTIATING: " + g.toString()); SymbolicDataValue.SuffixValue sp = g.getParameter(); Valuation newVal = new Valuation(); @@ -164,16 +164,16 @@ public DoubleDataValue instantiate(SDTGuard g, Valuation val, Constants c, Colle } // add disequalities - for (DataValue au : alreadyUsedValues) { - gov.nasa.jpf.constraints.expressions.Constant w = new gov.nasa.jpf.constraints.expressions.Constant(BuiltinTypes.DECIMAL, (au.getId())); - Expression auExpr = new NumericBooleanExpression(w, NumericComparator.NE, toVariable(sp)); + for (DataValue au : alreadyUsedValues) { + gov.nasa.jpf.constraints.expressions.Constant w = new gov.nasa.jpf.constraints.expressions.Constant(BuiltinTypes.DECIMAL, (au.getValue())); + Expression auExpr = new NumericBooleanExpression(w, NumericComparator.NE, sp); eList.add(auExpr); } - if (newVal.containsValueFor(toVariable(sp))) { - DoubleDataValue spDouble = new DoubleDataValue(type, (BigDecimal)newVal.getValue(toVariable(sp))); - gov.nasa.jpf.constraints.expressions.Constant spw = new gov.nasa.jpf.constraints.expressions.Constant(BuiltinTypes.DECIMAL, (spDouble.getId())); - Expression spExpr = new NumericBooleanExpression(spw, NumericComparator.EQ, toVariable(sp)); + if (newVal.containsValueFor(sp)) { + DataValue spDouble = new DataValue(type, (BigDecimal)newVal.getValue(sp)); + gov.nasa.jpf.constraints.expressions.Constant spw = new gov.nasa.jpf.constraints.expressions.Constant(BuiltinTypes.DECIMAL, (spDouble.getValue())); + Expression spExpr = new NumericBooleanExpression(spw, NumericComparator.EQ, sp); eList.add(spExpr); } @@ -188,7 +188,7 @@ public DoubleDataValue instantiate(SDTGuard g, Valuation val, Constants c, Colle if (res == Result.SAT) { // System.out.println("SAT!!"); // System.out.println(newVal.getValue(sp.toVariable()) + " " + newVal.getValue(sp.toVariable()).getClass()); - DoubleDataValue d = new DoubleDataValue(type, (BigDecimal)(newVal.getValue(toVariable(sp)))); + DataValue d = new DataValue(type, (BigDecimal)(newVal.getValue(sp))); //System.out.println("return d: " + d.toString()); return d;//new DataValue(doubleType, d); } else { @@ -198,17 +198,17 @@ public DoubleDataValue instantiate(SDTGuard g, Valuation val, Constants c, Colle } @Override - public DoubleDataValue getFreshValue(List> vals) { + public DataValue getFreshValue(List vals) { if (vals.isEmpty()) { - return new DoubleDataValue(type, BigDecimal.ONE); + return new DataValue(type, BigDecimal.ONE); } - List> potential = getPotential(vals); + List potential = getPotential(vals); if (potential.isEmpty()) { - return new DoubleDataValue(type, BigDecimal.ONE); + return new DataValue(type, BigDecimal.ONE); } //LOGGER.trace("smallest index of " + newDv.toString() + " in " + ifValues.toString() + " is " + smallest); - DataValue biggestDv = Collections.max(potential, new Cpr()); - return new DoubleDataValue(type, biggestDv.getId().add(BigDecimal.ONE)); + DataValue biggestDv = Collections.max(potential, new Cpr()); + return new DataValue(type, biggestDv.getValue().add(BigDecimal.ONE)); } @Override @@ -231,25 +231,25 @@ public void setCheckForFreshOutputs(boolean doit, IOOracle oracle) { } @Override - public Collection> getAllNextValues( - List> vals) { - Set> nextValues = new LinkedHashSet<>(); + public Collection getAllNextValues( + List vals) { + Set nextValues = new LinkedHashSet<>(); nextValues.addAll(vals); if (vals.isEmpty()) { - nextValues.add(new DoubleDataValue(type, BigDecimal.ONE)); + nextValues.add(new DataValue(type, BigDecimal.ONE)); } else { Collections.sort(vals, new Cpr()); if (vals.size() > 1) { for (int i = 0; i < (vals.size() - 1); i++) { - BigDecimal d1 = vals.get(i).getId(); - BigDecimal d2 = vals.get(i + 1).getId(); - nextValues.add(new DoubleDataValue(type, + BigDecimal d1 = vals.get(i).getValue(); + BigDecimal d2 = vals.get(i + 1).getValue(); + nextValues.add(new DataValue(type, d2.subtract(d1).divide(BigDecimal.valueOf(2.0)).add(d1))); //(d1 + ((d2 - d1) / 2)))); } } - nextValues.add(new DoubleDataValue(type, (Collections.min(vals, new Cpr()).getId().subtract(BigDecimal.ONE)))); - nextValues.add(new DoubleDataValue(type, (Collections.max(vals, new Cpr()).getId().add(BigDecimal.ONE)))); + nextValues.add(new DataValue(type, (Collections.min(vals, new Cpr()).getValue().subtract(BigDecimal.ONE)))); + nextValues.add(new DataValue(type, (Collections.max(vals, new Cpr()).getValue().add(BigDecimal.ONE)))); } return nextValues; } diff --git a/src/main/java/de/learnlib/ralib/tools/theories/IntegerEqualityTheory.java b/src/main/java/de/learnlib/ralib/tools/theories/IntegerEqualityTheory.java index e959fde2..30b9d422 100644 --- a/src/main/java/de/learnlib/ralib/tools/theories/IntegerEqualityTheory.java +++ b/src/main/java/de/learnlib/ralib/tools/theories/IntegerEqualityTheory.java @@ -16,6 +16,7 @@ */ package de.learnlib.ralib.tools.theories; +import java.math.BigDecimal; import java.util.ArrayList; import java.util.Collection; import java.util.List; @@ -30,7 +31,7 @@ * * @author falk */ -public class IntegerEqualityTheory extends EqualityTheory implements TypedTheory { +public class IntegerEqualityTheory extends EqualityTheory implements TypedTheory { private DataType type = null; @@ -43,13 +44,13 @@ public IntegerEqualityTheory(DataType t) { } @Override - public DataValue getFreshValue(List> vals) { - int dv = -1; - for (DataValue d : vals) { - dv = Math.max(dv, d.getId()); + public DataValue getFreshValue(List vals) { + BigDecimal dv = new BigDecimal("-1"); + for (DataValue d : vals) { + dv = dv.max(d.getValue()); } - return new DataValue(type, dv + 1); + return new DataValue(type, BigDecimal.ONE.add(dv)); } @Override @@ -68,12 +69,9 @@ public void setCheckForFreshOutputs(boolean doit, IOOracle oracle) { } @Override - public Collection> getAllNextValues( - List> vals) { - + public Collection getAllNextValues(List vals) { // TODO: add constants ... - - ArrayList> ret = new ArrayList<>(vals); + ArrayList ret = new ArrayList<>(vals); ret.add(getFreshValue(vals)); return ret; } diff --git a/src/main/java/de/learnlib/ralib/tools/theories/UniqueIntegerEqualityTheory.java b/src/main/java/de/learnlib/ralib/tools/theories/UniqueIntegerEqualityTheory.java index 8f331cd2..06f0a808 100644 --- a/src/main/java/de/learnlib/ralib/tools/theories/UniqueIntegerEqualityTheory.java +++ b/src/main/java/de/learnlib/ralib/tools/theories/UniqueIntegerEqualityTheory.java @@ -1,5 +1,6 @@ package de.learnlib.ralib.tools.theories; +import java.math.BigDecimal; import java.util.ArrayList; import java.util.Collection; import java.util.List; @@ -19,7 +20,7 @@ import de.learnlib.ralib.words.PSymbolInstance; import net.automatalib.word.Word; -public class UniqueIntegerEqualityTheory extends UniqueEqualityTheory implements TypedTheory { +public class UniqueIntegerEqualityTheory extends UniqueEqualityTheory implements TypedTheory { private DataType type = null; @@ -31,13 +32,13 @@ public UniqueIntegerEqualityTheory(DataType t) { } @Override - public DataValue getFreshValue(List> vals) { - int dv = -1; - for (DataValue d : vals) { - dv = Math.max(dv, d.getId()); + public DataValue getFreshValue(List vals) { + BigDecimal dv = new BigDecimal("-1"); + for (DataValue d : vals) { + dv = dv.max(d.getValue()); } - return new DataValue(type, dv + 1); + return new DataValue(type, BigDecimal.ONE.add(dv)); } @Override @@ -56,11 +57,11 @@ public void setCheckForFreshOutputs(boolean doit, IOOracle oracle) { } @Override - public Collection> getAllNextValues( - List> vals) { + public Collection getAllNextValues( + List vals) { // only fresh value is next value ... - ArrayList> ret = new ArrayList<>(); + ArrayList ret = new ArrayList<>(); ret.add(getFreshValue(vals)); return ret; } diff --git a/src/main/java/de/learnlib/ralib/words/DataWords.java b/src/main/java/de/learnlib/ralib/words/DataWords.java index 9f4d2f06..b3f3cfc3 100644 --- a/src/main/java/de/learnlib/ralib/words/DataWords.java +++ b/src/main/java/de/learnlib/ralib/words/DataWords.java @@ -47,16 +47,15 @@ public final class DataWords { /** * returns sequence of data values of a specific type in a data word. * - * @param * @param word * @param t * @return */ - public static DataValue[] valsOf(Word word, DataType t) { - List> vals = new ArrayList<>(); + public static DataValue[] valsOf(Word word, DataType t) { + List vals = new ArrayList<>(); for (PSymbolInstance psi : word) { for (DataValue d : psi.getParameterValues()) { - if (d.getType().equals(t)) { + if (d.getDataType().equals(t)) { vals.add(d); } } @@ -101,16 +100,16 @@ public static DataType[] typesOf(Word word) { /** * returns set of unique data values of some type in a data word. * - * @param + * @param * @param word * @param t * @return */ - public static Set> valSet(Word word, DataType t) { - Set> vals = new LinkedHashSet<>(); + public static Set valSet(Word word, DataType t) { + Set vals = new LinkedHashSet<>(); for (PSymbolInstance psi : word) { for (DataValue d : psi.getParameterValues()) { - if (d.getType().equals(t)) { + if (d.getDataType().equals(t)) { vals.add(d); } } @@ -120,14 +119,14 @@ public static Set> valSet(Word word, DataType /** * - * @param + * @param * @param in * @return */ @SafeVarargs - public static Set> joinValsToSet(Collection> ... in) { - Set> vals = new LinkedHashSet<>(); - for (Collection> s : in) { + public static Set joinValsToSet(Collection ... in) { + Set vals = new LinkedHashSet<>(); + for (Collection s : in) { vals.addAll(s); } return vals; @@ -139,8 +138,8 @@ public static Set> joinValsToSet(Collection> ... i * @param word * @return */ - public static Set> valSet(Word word) { - Set> valset = new LinkedHashSet<>(); + public static Set valSet(Word word) { + Set valset = new LinkedHashSet<>(); for (PSymbolInstance psi : word) { valset.addAll(Arrays.asList(psi.getParameterValues())); } @@ -187,22 +186,6 @@ public static Word instantiate( return Word.fromSymbols(symbols); } - public static Word instantiate( - Word actions, - Collection suffixValues) { - PSymbolInstance[] symbols = new PSymbolInstance[actions.length()]; - int idx = 0; - Iterator svit = suffixValues.iterator(); - for (ParameterizedSymbol ps : actions) { - DataValue[] pvalues = new DataValue[ps.getArity()]; - for (int i = 0; i < ps.getArity(); i++) { - pvalues[i] = svit.next(); - } - symbols[idx++] = new PSymbolInstance(ps, pvalues); - } - return Word.fromSymbols(symbols); - } - /** * instantiates a data word from a sequence of actions and * a valuation. @@ -271,7 +254,7 @@ public static ParValuation computeParValuation(Word word) { public static VarValuation computeVarValuation(ParValuation pars, PIV piv) { VarValuation vars = new VarValuation(); - for (Entry> e : pars.entrySet()) { + for (Entry e : pars.entrySet()) { Register r = piv.get(e.getKey()); if (r != null) vars.put(r, e.getValue()); diff --git a/src/main/java/de/learnlib/ralib/words/PSymbolInstance.java b/src/main/java/de/learnlib/ralib/words/PSymbolInstance.java index 825bdb10..cd1b59c7 100644 --- a/src/main/java/de/learnlib/ralib/words/PSymbolInstance.java +++ b/src/main/java/de/learnlib/ralib/words/PSymbolInstance.java @@ -47,7 +47,7 @@ public ParameterizedSymbol getBaseSymbol() { return baseSymbol; } - public DataValue[] getParameterValues() { + public DataValue[] getParameterValues() { return parameterValues; } diff --git a/src/test/java/de/learnlib/ralib/RaLibLearningExperimentRunner.java b/src/test/java/de/learnlib/ralib/RaLibLearningExperimentRunner.java index dcbbfc54..33f9606f 100644 --- a/src/test/java/de/learnlib/ralib/RaLibLearningExperimentRunner.java +++ b/src/test/java/de/learnlib/ralib/RaLibLearningExperimentRunner.java @@ -25,7 +25,7 @@ import de.learnlib.ralib.oracles.TreeOracleFactory; import de.learnlib.ralib.oracles.mto.MultiTheorySDTLogicOracle; import de.learnlib.ralib.oracles.mto.MultiTheoryTreeOracle; -import de.learnlib.ralib.solver.ConstraintSolver; +import de.learnlib.ralib.smt.ConstraintSolver; import de.learnlib.ralib.theory.Theory; import de.learnlib.ralib.words.PSymbolInstance; import de.learnlib.ralib.words.ParameterizedSymbol; diff --git a/src/test/java/de/learnlib/ralib/RandomWalk.java b/src/test/java/de/learnlib/ralib/RandomWalk.java index c1f5c36a..9e119e56 100644 --- a/src/test/java/de/learnlib/ralib/RandomWalk.java +++ b/src/test/java/de/learnlib/ralib/RandomWalk.java @@ -93,21 +93,21 @@ private PSymbolInstance nextDataValues( Theory teacher = teachers.get(t); // TODO: generics hack? // TODO: add constants? - Set> oldSet = DataWords.valSet(run, t); + Set oldSet = DataWords.valSet(run, t); for (int j = 0; j < i; j++) { - if (vals[j].getType().equals(t)) { + if (vals[j].getDataType().equals(t)) { oldSet.add(vals[j]); } } oldSet.addAll(consts.values(t)); - ArrayList> old = new ArrayList<>(oldSet); + ArrayList old = new ArrayList<>(oldSet); - Set> newSet = new HashSet<>( + Set newSet = new HashSet<>( teacher.getAllNextValues(old)); newSet.removeAll(old); - ArrayList> newList = new ArrayList<>(newSet); + ArrayList newList = new ArrayList<>(newSet); double draw = rand.nextDouble(); if (draw <= freshProbability || old.isEmpty()) { diff --git a/src/test/java/de/learnlib/ralib/TestUtil.java b/src/test/java/de/learnlib/ralib/TestUtil.java index 26ca5bde..90dde319 100644 --- a/src/test/java/de/learnlib/ralib/TestUtil.java +++ b/src/test/java/de/learnlib/ralib/TestUtil.java @@ -32,8 +32,8 @@ import de.learnlib.ralib.oracles.io.IOFilter; import de.learnlib.ralib.oracles.io.IOOracle; import de.learnlib.ralib.oracles.mto.MultiTheoryTreeOracle; -import de.learnlib.ralib.solver.ConstraintSolver; -import de.learnlib.ralib.solver.jconstraints.JConstraintsConstraintSolver; +import de.learnlib.ralib.smt.ConstraintSolver; +import de.learnlib.ralib.smt.jconstraints.JConstraintsConstraintSolver; import de.learnlib.ralib.sul.DataWordSUL; import de.learnlib.ralib.sul.SULOracle; import de.learnlib.ralib.theory.Theory; diff --git a/src/test/java/de/learnlib/ralib/automata/KeygenAutomatonTest.java b/src/test/java/de/learnlib/ralib/automata/KeygenAutomatonTest.java index afad2c18..f20e1df8 100644 --- a/src/test/java/de/learnlib/ralib/automata/KeygenAutomatonTest.java +++ b/src/test/java/de/learnlib/ralib/automata/KeygenAutomatonTest.java @@ -25,6 +25,7 @@ import static de.learnlib.ralib.example.keygen.MapAutomatonExample.T_KEY; import static de.learnlib.ralib.example.keygen.MapAutomatonExample.T_VAL; +import java.math.BigDecimal; import java.util.logging.Level; import org.testng.Assert; @@ -60,58 +61,58 @@ public void testHasTrace() { Assert.assertTrue(ra.accepts(test1)); Word test2 = Word.epsilon(); - test2 = test2.append(new PSymbolInstance(I_PUT, new DataValue[] { new DataValue(T_VAL, 1)} )); - test2 = test2.append(new PSymbolInstance(O_PUT, new DataValue[] { new DataValue(T_KEY, 1) })); + test2 = test2.append(new PSymbolInstance(I_PUT, new DataValue[] { new DataValue(T_VAL, BigDecimal.ONE)} )); + test2 = test2.append(new PSymbolInstance(O_PUT, new DataValue[] { new DataValue(T_KEY, BigDecimal.ONE) })); logger.log(Level.FINE, "test2: {0}", test2); Assert.assertTrue(ra.accepts(test2)); Word test3 = Word.epsilon(); - test3 = test3.append(new PSymbolInstance(I_PUT, new DataValue[] { new DataValue(T_VAL, 1)} )); - test3 = test3.append(new PSymbolInstance(O_PUT, new DataValue[] { new DataValue(T_KEY, 1) })); - test3 = test3.append(new PSymbolInstance(I_GET, new DataValue[] { new DataValue(T_KEY, 1)} )); - test3 = test3.append(new PSymbolInstance(O_GET, new DataValue[] { new DataValue(T_VAL, 1) })); + test3 = test3.append(new PSymbolInstance(I_PUT, new DataValue[] { new DataValue(T_VAL, BigDecimal.ONE)} )); + test3 = test3.append(new PSymbolInstance(O_PUT, new DataValue[] { new DataValue(T_KEY, BigDecimal.ONE) })); + test3 = test3.append(new PSymbolInstance(I_GET, new DataValue[] { new DataValue(T_KEY, BigDecimal.ONE)} )); + test3 = test3.append(new PSymbolInstance(O_GET, new DataValue[] { new DataValue(T_VAL, BigDecimal.ONE) })); logger.log(Level.FINE, "test3: {0}", test3); Assert.assertTrue(ra.accepts(test3)); Word test4 = Word.epsilon(); - test4 = test4.append(new PSymbolInstance(I_PUT, new DataValue[] { new DataValue(T_VAL, 1)} )); - test4 = test4.append(new PSymbolInstance(O_PUT, new DataValue[] { new DataValue(T_KEY, 1) })); - test4 = test4.append(new PSymbolInstance(I_GET, new DataValue[] { new DataValue(T_KEY, 2)} )); + test4 = test4.append(new PSymbolInstance(I_PUT, new DataValue[] { new DataValue(T_VAL, BigDecimal.ONE)} )); + test4 = test4.append(new PSymbolInstance(O_PUT, new DataValue[] { new DataValue(T_KEY, BigDecimal.ONE) })); + test4 = test4.append(new PSymbolInstance(I_GET, new DataValue[] { new DataValue(T_KEY, new BigDecimal(2))} )); test4 = test4.append(new PSymbolInstance(O_NULL, new DataValue[] { })); logger.log(Level.FINE, "test4: {0}", test4); Assert.assertTrue(ra.accepts(test4)); Word test5 = Word.epsilon(); - test5 = test5.append(new PSymbolInstance(I_PUT, new DataValue[] { new DataValue(T_VAL, 1)} )); - test5 = test5.append(new PSymbolInstance(O_PUT, new DataValue[] { new DataValue(T_KEY, 1) })); - test5 = test5.append(new PSymbolInstance(I_PUT, new DataValue[] { new DataValue(T_VAL, 2)} )); - test5 = test5.append(new PSymbolInstance(O_PUT, new DataValue[] { new DataValue(T_KEY, 2) })); - test5 = test5.append(new PSymbolInstance(I_GET, new DataValue[] { new DataValue(T_KEY, 1)} )); - test5 = test5.append(new PSymbolInstance(O_GET, new DataValue[] { new DataValue(T_VAL, 1) })); - test5 = test5.append(new PSymbolInstance(I_GET, new DataValue[] { new DataValue(T_KEY, 2)} )); - test5 = test5.append(new PSymbolInstance(O_GET, new DataValue[] { new DataValue(T_VAL, 2) })); + test5 = test5.append(new PSymbolInstance(I_PUT, new DataValue[] { new DataValue(T_VAL, BigDecimal.ONE)} )); + test5 = test5.append(new PSymbolInstance(O_PUT, new DataValue[] { new DataValue(T_KEY, BigDecimal.ONE) })); + test5 = test5.append(new PSymbolInstance(I_PUT, new DataValue[] { new DataValue(T_VAL, new BigDecimal(2))} )); + test5 = test5.append(new PSymbolInstance(O_PUT, new DataValue[] { new DataValue(T_KEY, new BigDecimal(2)) })); + test5 = test5.append(new PSymbolInstance(I_GET, new DataValue[] { new DataValue(T_KEY, BigDecimal.ONE)} )); + test5 = test5.append(new PSymbolInstance(O_GET, new DataValue[] { new DataValue(T_VAL, BigDecimal.ONE) })); + test5 = test5.append(new PSymbolInstance(I_GET, new DataValue[] { new DataValue(T_KEY, new BigDecimal(2))} )); + test5 = test5.append(new PSymbolInstance(O_GET, new DataValue[] { new DataValue(T_VAL, new BigDecimal(2)) })); logger.log(Level.FINE, "test5: {0}", test5); Assert.assertTrue(ra.accepts(test5)); Word test6 = Word.epsilon(); - test6 = test6.append(new PSymbolInstance(I_PUT, new DataValue[] { new DataValue(T_VAL, 1)} )); - test6 = test6.append(new PSymbolInstance(O_PUT, new DataValue[] { new DataValue(T_KEY, 1) })); - test6 = test6.append(new PSymbolInstance(I_PUT, new DataValue[] { new DataValue(T_VAL, 2)} )); - test6 = test6.append(new PSymbolInstance(O_PUT, new DataValue[] { new DataValue(T_KEY, 2) })); - test6 = test6.append(new PSymbolInstance(I_GET, new DataValue[] { new DataValue(T_KEY, 3)} )); + test6 = test6.append(new PSymbolInstance(I_PUT, new DataValue[] { new DataValue(T_VAL, BigDecimal.ONE)} )); + test6 = test6.append(new PSymbolInstance(O_PUT, new DataValue[] { new DataValue(T_KEY, BigDecimal.ONE) })); + test6 = test6.append(new PSymbolInstance(I_PUT, new DataValue[] { new DataValue(T_VAL, new BigDecimal(2))} )); + test6 = test6.append(new PSymbolInstance(O_PUT, new DataValue[] { new DataValue(T_KEY, new BigDecimal(2)) })); + test6 = test6.append(new PSymbolInstance(I_GET, new DataValue[] { new DataValue(T_KEY, new BigDecimal(3))} )); logger.log(Level.FINE, "test6: {0}", test6); Assert.assertTrue(!ra.accepts(test6)); Word test7 = Word.epsilon(); - test7 = test7.append(new PSymbolInstance(I_PUT, new DataValue[] { new DataValue(T_VAL, 1)} )); - test7 = test7.append(new PSymbolInstance(O_PUT, new DataValue[] { new DataValue(T_KEY, 1) })); - test7 = test7.append(new PSymbolInstance(I_PUT, new DataValue[] { new DataValue(T_VAL, 2)} )); - test7 = test7.append(new PSymbolInstance(O_PUT, new DataValue[] { new DataValue(T_KEY, 1) })); + test7 = test7.append(new PSymbolInstance(I_PUT, new DataValue[] { new DataValue(T_VAL, BigDecimal.ONE)} )); + test7 = test7.append(new PSymbolInstance(O_PUT, new DataValue[] { new DataValue(T_KEY, BigDecimal.ONE) })); + test7 = test7.append(new PSymbolInstance(I_PUT, new DataValue[] { new DataValue(T_VAL, new BigDecimal(2))} )); + test7 = test7.append(new PSymbolInstance(O_PUT, new DataValue[] { new DataValue(T_KEY, BigDecimal.ONE) })); logger.log(Level.FINE, "test7: {0}", test7); Assert.assertTrue(!ra.accepts(test7)); diff --git a/src/test/java/de/learnlib/ralib/automata/LoginAutomatonTest.java b/src/test/java/de/learnlib/ralib/automata/LoginAutomatonTest.java index 917fc0ae..dabf36fc 100644 --- a/src/test/java/de/learnlib/ralib/automata/LoginAutomatonTest.java +++ b/src/test/java/de/learnlib/ralib/automata/LoginAutomatonTest.java @@ -22,6 +22,7 @@ import static de.learnlib.ralib.example.login.LoginAutomatonExample.T_PWD; import static de.learnlib.ralib.example.login.LoginAutomatonExample.T_UID; +import java.math.BigDecimal; import java.util.logging.Level; import org.testng.Assert; @@ -50,18 +51,18 @@ public void testHasTrace() { Word test2 = Word.epsilon(); test2 = test2.append(new PSymbolInstance(I_REGISTER, new DataValue[] { - new DataValue(T_UID, 1), new DataValue(T_PWD, 2)})); + new DataValue(T_UID, BigDecimal.ONE), new DataValue(T_PWD, new BigDecimal(2) )})); test2 = test2.append(new PSymbolInstance(I_LOGIN, new DataValue[] { - new DataValue(T_UID, 1), new DataValue(T_PWD, 2)})); + new DataValue(T_UID, BigDecimal.ONE), new DataValue(T_PWD, new BigDecimal(2) )})); logger.log(Level.FINE, "test2: {0}", test2); Assert.assertTrue(ra.accepts(test2)); Word test3 = Word.epsilon(); test3 = test3.append(new PSymbolInstance(I_REGISTER, new DataValue[] { - new DataValue(T_UID, 1), new DataValue(T_PWD, 2)})); + new DataValue(T_UID, BigDecimal.ONE), new DataValue(T_PWD, new BigDecimal(2) )})); test3 = test3.append(new PSymbolInstance(I_LOGIN, new DataValue[] { - new DataValue(T_UID, 1), new DataValue(T_PWD, 3)})); + new DataValue(T_UID, BigDecimal.ONE), new DataValue(T_PWD, new BigDecimal(3) )})); logger.log(Level.FINE, "test3: {0}", test3); Assert.assertFalse(ra.accepts(test3)); diff --git a/src/test/java/de/learnlib/ralib/automata/xml/OutputTest.java b/src/test/java/de/learnlib/ralib/automata/xml/OutputTest.java index 2e2730c6..f38d2364 100644 --- a/src/test/java/de/learnlib/ralib/automata/xml/OutputTest.java +++ b/src/test/java/de/learnlib/ralib/automata/xml/OutputTest.java @@ -16,6 +16,7 @@ */ package de.learnlib.ralib.automata.xml; +import java.math.BigDecimal; import java.util.LinkedHashMap; import java.util.Map; import java.util.logging.Level; @@ -74,8 +75,8 @@ public void testModelswithOutput() { ParameterizedSymbol o100 = new OutputSymbol( "O100", new DataType[] {intType}); - DataValue d0 = new DataValue(intType, 0); - DataValue d1 = new DataValue(intType, 1); + DataValue d0 = new DataValue(intType, BigDecimal.ZERO); + DataValue d1 = new DataValue(intType, BigDecimal.ONE); Word test1 = Word.fromSymbols( new PSymbolInstance(inv, new DataValue[] {d0}), diff --git a/src/test/java/de/learnlib/ralib/ceanalysis/EssentializerTest.java b/src/test/java/de/learnlib/ralib/ceanalysis/EssentializerTest.java index 67e73473..e7e8c8ac 100644 --- a/src/test/java/de/learnlib/ralib/ceanalysis/EssentializerTest.java +++ b/src/test/java/de/learnlib/ralib/ceanalysis/EssentializerTest.java @@ -1,5 +1,6 @@ package de.learnlib.ralib.ceanalysis; +import java.math.BigDecimal; import java.util.Collection; import java.util.List; @@ -20,21 +21,21 @@ public class EssentializerTest { @Test public void testEssentializerLogin() { - final DataType _t = new DataType("T", Integer.class); + final DataType _t = new DataType("T"); final InputSymbol act = new InputSymbol("act", _t); - final EqualityTheory theory = new EqualityTheory() { + final EqualityTheory theory = new EqualityTheory() { @Override - public DataValue getFreshValue(List> vals) { - int max = 0; - for (DataValue i : vals) { - max = Math.max(max, i.getId()); + public DataValue getFreshValue(List vals) { + BigDecimal max = BigDecimal.ZERO; + for (DataValue i : vals) { + max = max.max(i.getValue()); } - return new DataValue(_t, max + 1); + return new DataValue(_t, max.add(BigDecimal.ONE)); } @Override - public Collection> getAllNextValues(List> vals) { + public Collection getAllNextValues(List vals) { throw new RuntimeException("not implemented for test."); } }; @@ -52,10 +53,10 @@ public void processQueries(Collection> Essentializer e = new Essentializer(theory, oracle, oracle); - DataValue dv1 = new DataValue(_t, 1); - DataValue dv2 = new DataValue(_t, 2); - DataValue dv3 = new DataValue(_t, 3); - DataValue dv4 = new DataValue(_t, 4); + DataValue dv1 = new DataValue(_t, new BigDecimal(1)); + DataValue dv2 = new DataValue(_t, new BigDecimal(2)); + DataValue dv3 = new DataValue(_t, new BigDecimal(3)); + DataValue dv4 = new DataValue(_t, new BigDecimal(4)); Word w1 = DataWords.instantiate( Word.fromSymbols(act, act, act, act), diff --git a/src/test/java/de/learnlib/ralib/ceanalysis/PrefixFinderTest.java b/src/test/java/de/learnlib/ralib/ceanalysis/PrefixFinderTest.java index 758350e4..efd62687 100644 --- a/src/test/java/de/learnlib/ralib/ceanalysis/PrefixFinderTest.java +++ b/src/test/java/de/learnlib/ralib/ceanalysis/PrefixFinderTest.java @@ -21,9 +21,12 @@ import static de.learnlib.ralib.example.stack.StackAutomatonExample.I_PUSH; import static de.learnlib.ralib.example.stack.StackAutomatonExample.T_INT; +import java.math.BigDecimal; import java.util.LinkedHashMap; import java.util.Map; +import de.learnlib.ralib.smt.ConstraintSolverFactory; +import de.learnlib.ralib.smt.jconstraints.JConstraintsConstraintSolver; import org.testng.Assert; import org.testng.annotations.Test; @@ -43,8 +46,7 @@ import de.learnlib.ralib.oracles.TreeOracleFactory; import de.learnlib.ralib.oracles.mto.MultiTheorySDTLogicOracle; import de.learnlib.ralib.oracles.mto.MultiTheoryTreeOracle; -import de.learnlib.ralib.solver.ConstraintSolver; -import de.learnlib.ralib.solver.simple.SimpleConstraintSolver; +import de.learnlib.ralib.smt.ConstraintSolver; import de.learnlib.ralib.theory.Theory; import de.learnlib.ralib.tools.theories.IntegerEqualityTheory; import de.learnlib.ralib.words.PSymbolInstance; @@ -66,7 +68,7 @@ public void prefixFinderTest() { teachers.put(T_UID, new IntegerEqualityTheory(T_UID)); teachers.put(T_PWD, new IntegerEqualityTheory(T_PWD)); - ConstraintSolver solver = new SimpleConstraintSolver(); + ConstraintSolver solver = ConstraintSolverFactory.createZ3ConstraintSolver(); MultiTheoryTreeOracle mto = new MultiTheoryTreeOracle( dwOracle, teachers, new Constants(), solver); @@ -85,9 +87,9 @@ public void prefixFinderTest() { Word ce = Word.fromSymbols( new PSymbolInstance(I_REGISTER, - new DataValue(T_UID, 1), new DataValue(T_PWD, 1)), + new DataValue(T_UID, BigDecimal.ONE), new DataValue(T_PWD, BigDecimal.ONE)), new PSymbolInstance(I_LOGIN, - new DataValue(T_UID, 1), new DataValue(T_PWD, 1))); + new DataValue(T_UID, BigDecimal.ONE), new DataValue(T_PWD, BigDecimal.ONE))); PrefixFinder pf = new PrefixFinder( mto, @@ -110,7 +112,7 @@ public void prefixFinderMultipleAccessSequencesTest() { final Map teachers = new LinkedHashMap<>(); teachers.put(T_INT, new IntegerEqualityTheory(T_INT)); - ConstraintSolver solver = new SimpleConstraintSolver(); + ConstraintSolver solver = ConstraintSolverFactory.createZ3ConstraintSolver(); MultiTheoryTreeOracle mto = new MultiTheoryTreeOracle( dwOracle, teachers, new Constants(), solver); @@ -127,14 +129,14 @@ public void prefixFinderMultipleAccessSequencesTest() { // System.out.println(hyp); Word shortPrefix = Word.fromSymbols( - new PSymbolInstance(I_PUSH, new DataValue(T_INT, 0))); + new PSymbolInstance(I_PUSH, new DataValue(T_INT, BigDecimal.ZERO))); DTLeaf leaf = ralambda.getDT().getLeaf(shortPrefix); leaf.elevatePrefix(ralambda.getDT(), shortPrefix, hyp, slo); Word ce = Word.fromSymbols( - new PSymbolInstance(I_PUSH, new DataValue(T_INT, 0)), - new PSymbolInstance(I_POP, new DataValue(T_INT, 0)), - new PSymbolInstance(I_PUSH, new DataValue(T_INT, 1))); + new PSymbolInstance(I_PUSH, new DataValue(T_INT, BigDecimal.ZERO)), + new PSymbolInstance(I_POP, new DataValue(T_INT, BigDecimal.ZERO)), + new PSymbolInstance(I_PUSH, new DataValue(T_INT, BigDecimal.ONE))); PrefixFinder pf = new PrefixFinder( mto, diff --git a/src/test/java/de/learnlib/ralib/data/PIVRemappingIteratorTest.java b/src/test/java/de/learnlib/ralib/data/PIVRemappingIteratorTest.java index 65ce6f4e..b320d0cd 100644 --- a/src/test/java/de/learnlib/ralib/data/PIVRemappingIteratorTest.java +++ b/src/test/java/de/learnlib/ralib/data/PIVRemappingIteratorTest.java @@ -48,11 +48,14 @@ private PIV generatePIV(PIV piv, DataType t, int size) { @Test public void testOneType() { - DataType type1 = new DataType("type1", Integer.class); + DataType type1 = new DataType("type1"); PIV piv1 = generatePIV(new PIV(), type1, 4); PIV piv2 = generatePIV(new PIV(), type1, 4); + + System.out.println("" + piv1); + int count = 0; for (VarMapping unused : new PIVRemappingIterator(piv1, piv2)) { count++; @@ -64,8 +67,8 @@ public void testOneType() { @Test public void testTwoTypes() { - DataType type1 = new DataType("type1", Integer.class); - DataType type2 = new DataType("type2", Integer.class); + DataType type1 = new DataType("type1"); + DataType type2 = new DataType("type2"); PIV piv1 = generatePIV(new PIV(), type1, 2); PIV piv2 = generatePIV(new PIV(), type1, 2); diff --git a/src/test/java/de/learnlib/ralib/dt/DTInnerNodeTest.java b/src/test/java/de/learnlib/ralib/dt/DTInnerNodeTest.java index b37d73e4..2172fff6 100644 --- a/src/test/java/de/learnlib/ralib/dt/DTInnerNodeTest.java +++ b/src/test/java/de/learnlib/ralib/dt/DTInnerNodeTest.java @@ -5,9 +5,11 @@ import static de.learnlib.ralib.example.stack.StackAutomatonExample.I_PUSH; import static de.learnlib.ralib.example.stack.StackAutomatonExample.T_INT; +import java.math.BigDecimal; import java.util.LinkedHashMap; import java.util.Map; +import de.learnlib.ralib.smt.ConstraintSolverFactory; import org.testng.Assert; import org.testng.annotations.Test; @@ -20,8 +22,7 @@ import de.learnlib.ralib.oracles.DataWordOracle; import de.learnlib.ralib.oracles.SimulatorOracle; import de.learnlib.ralib.oracles.mto.MultiTheoryTreeOracle; -import de.learnlib.ralib.solver.ConstraintSolver; -import de.learnlib.ralib.solver.simple.SimpleConstraintSolver; +import de.learnlib.ralib.smt.ConstraintSolver; import de.learnlib.ralib.theory.Theory; import de.learnlib.ralib.tools.theories.IntegerEqualityTheory; import de.learnlib.ralib.words.PSymbolInstance; @@ -38,25 +39,25 @@ public void siftTest() { final Map teachers = new LinkedHashMap<>(); teachers.put(T_INT, new IntegerEqualityTheory(T_INT)); - ConstraintSolver solver = new SimpleConstraintSolver(); + ConstraintSolver solver = ConstraintSolverFactory.createZ3ConstraintSolver(); MultiTheoryTreeOracle mto = new MultiTheoryTreeOracle( dwOracle, teachers, new Constants(), solver); Word p1 = Word.fromSymbols( - new PSymbolInstance(I_PUSH, new DataValue(T_INT, 1)), - new PSymbolInstance(I_POP, new DataValue(T_INT, 1))); + new PSymbolInstance(I_PUSH, new DataValue(T_INT, new BigDecimal(1))), + new PSymbolInstance(I_POP, new DataValue(T_INT, new BigDecimal(1)))); Word p2 = Word.fromSymbols( - new PSymbolInstance(I_PUSH, new DataValue(T_INT, 1)), - new PSymbolInstance(I_PUSH, new DataValue(T_INT, 2))); + new PSymbolInstance(I_PUSH, new DataValue(T_INT, new BigDecimal(1))), + new PSymbolInstance(I_PUSH, new DataValue(T_INT, new BigDecimal(2)))); Word epsilon = Word.epsilon(); Word push = Word.fromSymbols( - new PSymbolInstance(I_PUSH, new DataValue(T_INT, 1))); + new PSymbolInstance(I_PUSH, new DataValue(T_INT, new BigDecimal(1)))); Word suffix = Word.fromSymbols( - new PSymbolInstance(I_POP, new DataValue(T_INT, 1))); + new PSymbolInstance(I_POP, new DataValue(T_INT, new BigDecimal(1)))); SymbolicSuffix symbSuffix = new SymbolicSuffix(epsilon, suffix); diff --git a/src/test/java/de/learnlib/ralib/dt/DTTest.java b/src/test/java/de/learnlib/ralib/dt/DTTest.java index bbe142e7..8129fe6c 100644 --- a/src/test/java/de/learnlib/ralib/dt/DTTest.java +++ b/src/test/java/de/learnlib/ralib/dt/DTTest.java @@ -5,9 +5,11 @@ import static de.learnlib.ralib.example.stack.StackAutomatonExample.I_PUSH; import static de.learnlib.ralib.example.stack.StackAutomatonExample.T_INT; +import java.math.BigDecimal; import java.util.LinkedHashMap; import java.util.Map; +import de.learnlib.ralib.smt.ConstraintSolverFactory; import org.testng.Assert; import org.testng.annotations.Test; @@ -24,8 +26,7 @@ import de.learnlib.ralib.oracles.TreeQueryResult; import de.learnlib.ralib.oracles.mto.MultiTheorySDTLogicOracle; import de.learnlib.ralib.oracles.mto.MultiTheoryTreeOracle; -import de.learnlib.ralib.solver.ConstraintSolver; -import de.learnlib.ralib.solver.simple.SimpleConstraintSolver; +import de.learnlib.ralib.smt.ConstraintSolver; import de.learnlib.ralib.theory.Theory; import de.learnlib.ralib.tools.theories.IntegerEqualityTheory; import de.learnlib.ralib.words.PSymbolInstance; @@ -35,12 +36,12 @@ public class DTTest { private DT buildFullTreePrimesOnly(TreeOracle oracle) { Word prePop = Word.fromSymbols( - new PSymbolInstance(I_POP, new DataValue(T_INT, 1))); + new PSymbolInstance(I_POP, new DataValue(T_INT, new BigDecimal(1)))); Word prePush = Word.fromSymbols( - new PSymbolInstance(I_PUSH, new DataValue(T_INT, 1))); + new PSymbolInstance(I_PUSH, new DataValue(T_INT, new BigDecimal(1)))); Word prePushPush = Word.fromSymbols( - new PSymbolInstance(I_PUSH, new DataValue(T_INT, 1)), - new PSymbolInstance(I_PUSH, new DataValue(T_INT, 2))); + new PSymbolInstance(I_PUSH, new DataValue(T_INT, new BigDecimal(1))), + new PSymbolInstance(I_PUSH, new DataValue(T_INT, new BigDecimal(2)))); Word epsilon = Word.epsilon(); SymbolicSuffix suffEps = new SymbolicSuffix(epsilon, epsilon); @@ -94,7 +95,7 @@ private DT buildFullTreePrimesOnly(TreeOracle oracle) { private DT buildSimpleTree(TreeOracle oracle) { Word prePop = Word.fromSymbols( - new PSymbolInstance(I_POP, new DataValue(T_INT, 1))); + new PSymbolInstance(I_POP, new DataValue(T_INT, new BigDecimal(1)))); Word epsilon = Word.epsilon(); SymbolicSuffix suffEps = new SymbolicSuffix(epsilon, epsilon); @@ -135,7 +136,7 @@ public void siftTest() { final Map teachers = new LinkedHashMap<>(); teachers.put(T_INT, new IntegerEqualityTheory(T_INT)); - ConstraintSolver solver = new SimpleConstraintSolver(); + ConstraintSolver solver = ConstraintSolverFactory.createZ3ConstraintSolver(); MultiTheoryTreeOracle mto = new MultiTheoryTreeOracle( dwOracle, teachers, new Constants(), solver); @@ -144,29 +145,29 @@ public void siftTest() { Word prePush1Pop1 = Word.fromSymbols( new PSymbolInstance(I_PUSH, - new DataValue(T_INT, 1)), + new DataValue(T_INT, new BigDecimal(1))), new PSymbolInstance(I_POP, - new DataValue(T_INT, 1))); + new DataValue(T_INT, new BigDecimal(1)))); Word prePush1Pop2 = Word.fromSymbols( new PSymbolInstance(I_PUSH, - new DataValue(T_INT, 1)), + new DataValue(T_INT, new BigDecimal(1))), new PSymbolInstance(I_POP, - new DataValue(T_INT, 2))); + new DataValue(T_INT, new BigDecimal(2)))); Word prePushPushPop = Word.fromSymbols( new PSymbolInstance(I_PUSH, - new DataValue(T_INT, 1)), + new DataValue(T_INT, new BigDecimal(1))), new PSymbolInstance(I_PUSH, - new DataValue(T_INT, 2)), + new DataValue(T_INT, new BigDecimal(2))), new PSymbolInstance(I_POP, - new DataValue(T_INT, 2))); + new DataValue(T_INT, new BigDecimal(2)))); Word accessEps = Word.epsilon(); Word accessPop = Word.fromSymbols( - new PSymbolInstance(I_POP, new DataValue(T_INT,1))); + new PSymbolInstance(I_POP, new DataValue(T_INT,new BigDecimal(1)))); Word accessPush = Word.fromSymbols( - new PSymbolInstance(I_PUSH, new DataValue(T_INT,1))); + new PSymbolInstance(I_PUSH, new DataValue(T_INT,new BigDecimal(1)))); DTLeaf leafPush1Pop1 = dt.sift(prePush1Pop1, true); DTLeaf leafPush1Pop2 = dt.sift(prePush1Pop2, true); @@ -180,10 +181,10 @@ public void siftTest() { dt = buildSimpleTree(mto); int leavesBeforeDiscovery = dt.getLeaves().size(); Word prePush = Word.fromSymbols( - new PSymbolInstance(I_PUSH, new DataValue(T_INT, 1))); + new PSymbolInstance(I_PUSH, new DataValue(T_INT, new BigDecimal(1)))); Word prePushPush = Word.fromSymbols( - new PSymbolInstance(I_PUSH, new DataValue(T_INT, 1)), - new PSymbolInstance(I_PUSH, new DataValue(T_INT, 2))); + new PSymbolInstance(I_PUSH, new DataValue(T_INT, new BigDecimal(1))), + new PSymbolInstance(I_PUSH, new DataValue(T_INT, new BigDecimal(2)))); DTLeaf newLeaf = dt.sift(prePush, true); Assert.assertEquals(dt.getLeaves().size(), leavesBeforeDiscovery + 1); @@ -202,7 +203,7 @@ public void splitTest() { final Map teachers = new LinkedHashMap<>(); teachers.put(T_INT, new IntegerEqualityTheory(T_INT)); - ConstraintSolver solver = new SimpleConstraintSolver(); + ConstraintSolver solver = ConstraintSolverFactory.createZ3ConstraintSolver(); MultiTheoryTreeOracle mto = new MultiTheoryTreeOracle( dwOracle, teachers, new Constants(), solver); @@ -214,9 +215,9 @@ public void splitTest() { DTHyp hyp = new DTHyp(consts, dt); Word prePush = Word.fromSymbols( - new PSymbolInstance(I_PUSH, new DataValue(T_INT, 0))); + new PSymbolInstance(I_PUSH, new DataValue(T_INT, new BigDecimal(0)))); Word prePop = Word.fromSymbols( - new PSymbolInstance(I_POP, new DataValue(T_INT, 0))); + new PSymbolInstance(I_POP, new DataValue(T_INT, new BigDecimal(0)))); Word eps = Word.epsilon(); SymbolicSuffix suffPop = new SymbolicSuffix(eps, prePop); diff --git a/src/test/java/de/learnlib/ralib/dt/RegisterConsistencyTest.java b/src/test/java/de/learnlib/ralib/dt/RegisterConsistencyTest.java index 206e6f2d..cc88834c 100644 --- a/src/test/java/de/learnlib/ralib/dt/RegisterConsistencyTest.java +++ b/src/test/java/de/learnlib/ralib/dt/RegisterConsistencyTest.java @@ -1,5 +1,6 @@ package de.learnlib.ralib.dt; +import java.math.BigDecimal; import java.util.Map; import org.testng.Assert; @@ -36,7 +37,7 @@ public class RegisterConsistencyTest extends RaLibTestSuite { - private static final DataType T_INT = new DataType("int", Integer.class); + private static final DataType T_INT = new DataType("int"); private static final InputSymbol A = new InputSymbol("a", new DataType[] {T_INT}); @@ -104,16 +105,16 @@ public void addSuffix(SymbolicSuffix suffix, DTLeaf leaf) { @Test public void testSymmetry() { Word word = Word.fromSymbols( - new PSymbolInstance(A, new DataValue(T_INT, 0)), - new PSymbolInstance(A, new DataValue(T_INT, 1)), - new PSymbolInstance(A, new DataValue(T_INT, 1))); + new PSymbolInstance(A, new DataValue(T_INT, BigDecimal.ZERO)), + new PSymbolInstance(A, new DataValue(T_INT, BigDecimal.ONE)), + new PSymbolInstance(A, new DataValue(T_INT, BigDecimal.ONE))); Word suffixWord = Word.fromSymbols( - new PSymbolInstance(A, new DataValue(T_INT, 0)), - new PSymbolInstance(A, new DataValue(T_INT, 1))); + new PSymbolInstance(A, new DataValue(T_INT, BigDecimal.ZERO)), + new PSymbolInstance(A, new DataValue(T_INT, BigDecimal.ONE))); Word suffixExpected = Word.fromSymbols( - new PSymbolInstance(A, new DataValue(T_INT, 1)), - new PSymbolInstance(A, new DataValue(T_INT, 0)), - new PSymbolInstance(A, new DataValue(T_INT, 1))); + new PSymbolInstance(A, new DataValue(T_INT, BigDecimal.ONE)), + new PSymbolInstance(A, new DataValue(T_INT, BigDecimal.ZERO)), + new PSymbolInstance(A, new DataValue(T_INT, BigDecimal.ONE))); Word prefix = word.prefix(2); SymbolicSuffix symSuffixEps = new SymbolicSuffix(Word.epsilon(), Word.epsilon()); SymbolicSuffix symSuffixWord = new SymbolicSuffix(word, suffixWord); diff --git a/src/test/java/de/learnlib/ralib/equivalence/RAEquivalenceTestTest.java b/src/test/java/de/learnlib/ralib/equivalence/RAEquivalenceTestTest.java index df16fa76..aa1888d6 100644 --- a/src/test/java/de/learnlib/ralib/equivalence/RAEquivalenceTestTest.java +++ b/src/test/java/de/learnlib/ralib/equivalence/RAEquivalenceTestTest.java @@ -8,6 +8,10 @@ import java.util.LinkedHashMap; import java.util.Map; +import gov.nasa.jpf.constraints.api.Expression; +import gov.nasa.jpf.constraints.expressions.NumericBooleanExpression; +import gov.nasa.jpf.constraints.expressions.NumericComparator; +import gov.nasa.jpf.constraints.util.ExpressionUtil; import org.testng.Assert; import org.testng.annotations.Test; @@ -63,11 +67,9 @@ public void findCounterExampleHasCETest() { ParameterGenerator pgen = new ParameterGenerator(); Parameter pVal = pgen.next(T_INT); - TransitionGuard eqGuard = new TransitionGuard( - new AtomicGuardExpression(rVal, Relation.EQUALS, pVal)); - TransitionGuard neqGuard = new TransitionGuard( - new AtomicGuardExpression(rVal, Relation.NOT_EQUALS, pVal)); - TransitionGuard trueGuard = new TransitionGuard(); + Expression eqGuard = new NumericBooleanExpression(rVal, NumericComparator.EQ, pVal); + Expression neqGuard = new NumericBooleanExpression(rVal, NumericComparator.NE, pVal); + Expression trueGuard = ExpressionUtil.TRUE; // assignments VarMapping storeMapping = new VarMapping(); diff --git a/src/test/java/de/learnlib/ralib/example/container/ContainerSUL.java b/src/test/java/de/learnlib/ralib/example/container/ContainerSUL.java index eeb4c550..2bd0fc60 100644 --- a/src/test/java/de/learnlib/ralib/example/container/ContainerSUL.java +++ b/src/test/java/de/learnlib/ralib/example/container/ContainerSUL.java @@ -1,16 +1,18 @@ package de.learnlib.ralib.example.container; +import java.math.BigDecimal; + public class ContainerSUL { - public static final int ERROR = 0; + public static final BigDecimal ERROR = BigDecimal.ZERO; - private Integer val = null; + private BigDecimal val = null; - public void put(Integer val) { + public void put(BigDecimal val) { this.val = val; } - public Integer get() { + public BigDecimal get() { return val == null ? ERROR : val; } } diff --git a/src/test/java/de/learnlib/ralib/example/keygen/KeyGenMap.java b/src/test/java/de/learnlib/ralib/example/keygen/KeyGenMap.java index 2826c3c6..39cb30a7 100644 --- a/src/test/java/de/learnlib/ralib/example/keygen/KeyGenMap.java +++ b/src/test/java/de/learnlib/ralib/example/keygen/KeyGenMap.java @@ -16,6 +16,7 @@ */ package de.learnlib.ralib.example.keygen; +import java.math.BigDecimal; import java.util.HashMap; import java.util.Map; import java.util.Set; @@ -27,22 +28,22 @@ */ public class KeyGenMap { - private final Set known = new TreeSet<>(); + private final Set known = new TreeSet<>(); - private final Map objects = new HashMap<>(); + private final Map objects = new HashMap<>(); - public Integer put(Integer o) { + public BigDecimal put(BigDecimal o) { known.add(o); if (objects.size() > 0) { throw new IllegalStateException(); } - Integer newKey = known.size(); + BigDecimal newKey = new BigDecimal(known.size()); known.add(newKey); objects.put(newKey, o); return newKey; } - public Integer get(Integer o) { + public BigDecimal get(BigDecimal o) { known.add(o); return objects.get(o); } diff --git a/src/test/java/de/learnlib/ralib/example/keygen/MapAutomatonExample.java b/src/test/java/de/learnlib/ralib/example/keygen/MapAutomatonExample.java index 978b3116..0f8fc852 100644 --- a/src/test/java/de/learnlib/ralib/example/keygen/MapAutomatonExample.java +++ b/src/test/java/de/learnlib/ralib/example/keygen/MapAutomatonExample.java @@ -24,7 +24,6 @@ import de.learnlib.ralib.automata.TransitionGuard; import de.learnlib.ralib.automata.guards.AtomicGuardExpression; import de.learnlib.ralib.automata.guards.GuardExpression; -import de.learnlib.ralib.automata.guards.Negation; import de.learnlib.ralib.automata.guards.Relation; import de.learnlib.ralib.automata.output.OutputMapping; import de.learnlib.ralib.automata.output.OutputTransition; @@ -35,6 +34,11 @@ import de.learnlib.ralib.data.util.SymbolicDataValueGenerator; import de.learnlib.ralib.words.InputSymbol; import de.learnlib.ralib.words.OutputSymbol; +import gov.nasa.jpf.constraints.api.Expression; +import gov.nasa.jpf.constraints.expressions.Negation; +import gov.nasa.jpf.constraints.expressions.NumericBooleanExpression; +import gov.nasa.jpf.constraints.expressions.NumericComparator; +import gov.nasa.jpf.constraints.util.ExpressionUtil; /** * @@ -42,8 +46,8 @@ */ public final class MapAutomatonExample { - public static final DataType T_KEY = new DataType("T_key", Integer.class); - public static final DataType T_VAL = new DataType("T_val", Integer.class); + public static final DataType T_KEY = new DataType("T_key"); + public static final DataType T_VAL = new DataType("T_val"); public static final InputSymbol I_PUT = new InputSymbol("put", new DataType[] {T_VAL}); @@ -92,13 +96,13 @@ private static RegisterAutomaton buildAutomaton() { // guards - GuardExpression condition1 = new AtomicGuardExpression(rKey1, Relation.EQUALS, pKey); - GuardExpression condition2 = new AtomicGuardExpression(rKey2, Relation.EQUALS, pKey); + Expression condition1 = new NumericBooleanExpression(rKey1, NumericComparator.EQ, pKey); + Expression condition2 = new NumericBooleanExpression(rKey2, NumericComparator.EQ, pKey); - TransitionGuard get1Guard = new TransitionGuard(condition1); - TransitionGuard get2Guard = new TransitionGuard(condition2); - TransitionGuard error1Guard = new TransitionGuard(new Negation(condition1)); - TransitionGuard trueGuard = new TransitionGuard(); + Expression get1Guard = condition1; + Expression get2Guard = condition2; + Expression error1Guard = new Negation(condition1); + Expression trueGuard = ExpressionUtil.TRUE; // assignments VarMapping store1IMapping = new VarMapping(); diff --git a/src/test/java/de/learnlib/ralib/example/list/BoundedList.java b/src/test/java/de/learnlib/ralib/example/list/BoundedList.java index 7db1a934..61bbd8da 100644 --- a/src/test/java/de/learnlib/ralib/example/list/BoundedList.java +++ b/src/test/java/de/learnlib/ralib/example/list/BoundedList.java @@ -1,5 +1,6 @@ package de.learnlib.ralib.example.list; +import java.math.BigDecimal; import java.util.LinkedList; /** @@ -10,10 +11,10 @@ public class BoundedList { public static final int DEFAULT_MAX_CAPACITY = 3; public static final boolean DEFAULT_USE_NULL= false; - public static final Integer NULL_VALUE = 0; + public static final BigDecimal NULL_VALUE = BigDecimal.ZERO; private boolean useNull = false; - private LinkedList list; + private LinkedList list; private int maxCapacity; public BoundedList() { @@ -27,10 +28,10 @@ public BoundedList(int maxCapacity) { public BoundedList(int maxCapacity, boolean useNull) { this.maxCapacity = maxCapacity; this.useNull = useNull; - list = new LinkedList(); + list = new LinkedList(); } - public void push(Integer e) { + public void push(BigDecimal e) { if (useNull && e.equals(NULL_VALUE)) { throw new RuntimeException(); } @@ -39,25 +40,25 @@ public void push(Integer e) { } } - public Integer pop() { + public BigDecimal pop() { return list.pop(); } - public boolean contains(Integer e) { + public boolean contains(BigDecimal e) { return list.contains(e); } - public boolean itemnull(Integer e) { + public boolean itemnull(BigDecimal e) { return (useNull && NULL_VALUE.equals(e)) || !list.contains(e); } - public void insert(Integer e1, Integer e2) { + public void insert(BigDecimal e1, BigDecimal e2) { int i = 1; if (useNull && e2.equals(NULL_VALUE)) { throw new RuntimeException(); } if (maxCapacity > list.size()) { - for (Integer el : list) { + for (BigDecimal el : list) { if (el.equals(e1)) { list.add(i-1, e2); return; diff --git a/src/test/java/de/learnlib/ralib/example/list/BoundedListDataWordOracle.java b/src/test/java/de/learnlib/ralib/example/list/BoundedListDataWordOracle.java index a062c6e5..b1b293a4 100644 --- a/src/test/java/de/learnlib/ralib/example/list/BoundedListDataWordOracle.java +++ b/src/test/java/de/learnlib/ralib/example/list/BoundedListDataWordOracle.java @@ -1,5 +1,6 @@ package de.learnlib.ralib.example.list; +import java.math.BigDecimal; import java.util.Collection; import java.util.function.Supplier; @@ -17,7 +18,7 @@ * */ public class BoundedListDataWordOracle implements DataWordOracle { - public static final DataType INT_TYPE= new DataType("int", Integer.class); + public static final DataType INT_TYPE= new DataType("int"); public static final InputSymbol PUSH = new InputSymbol("push", new DataType[]{INT_TYPE}); public static final InputSymbol INSERT = new InputSymbol("insert", new DataType[]{INT_TYPE, INT_TYPE}); @@ -57,21 +58,21 @@ private Boolean answer(Word input) { private boolean accepts(PSymbolInstance symInst, BoundedList list) { if (symInst.getBaseSymbol().equals(PUSH)) { - list.push( (Integer) symInst.getParameterValues()[0].getId()); + list.push( symInst.getParameterValues()[0].getValue() ); return true; } else if (symInst.getBaseSymbol().equals(POP)) { - Integer value = list.pop(); - return symInst.getParameterValues()[0].getId().equals(value); + BigDecimal value = list.pop(); + return symInst.getParameterValues()[0].getValue().equals(value); } else if (symInst.getBaseSymbol().equals(INSERT)) { - list.insert((Integer) symInst.getParameterValues()[0].getId(), (Integer) symInst.getParameterValues()[1].getId()); + list.insert( symInst.getParameterValues()[0].getValue(), symInst.getParameterValues()[1].getValue()); return true; } else if (symInst.getBaseSymbol().equals(CONTAINS)) { - return list.contains((Integer) symInst.getParameterValues()[0].getId()); + return list.contains( symInst.getParameterValues()[0].getValue() ); } return false; } - public static DataValue dv(int val) { - return new DataValue(INT_TYPE, val); + public static DataValue dv(int val) { + return new DataValue(INT_TYPE, new BigDecimal(val)); } } diff --git a/src/test/java/de/learnlib/ralib/example/llambda/LLambdaAutomatonExample.java b/src/test/java/de/learnlib/ralib/example/llambda/LLambdaAutomatonExample.java index 83bfd802..6c59c566 100644 --- a/src/test/java/de/learnlib/ralib/example/llambda/LLambdaAutomatonExample.java +++ b/src/test/java/de/learnlib/ralib/example/llambda/LLambdaAutomatonExample.java @@ -11,6 +11,8 @@ import de.learnlib.ralib.data.SymbolicDataValue.Register; import de.learnlib.ralib.data.VarMapping; import de.learnlib.ralib.words.InputSymbol; +import gov.nasa.jpf.constraints.api.Expression; +import gov.nasa.jpf.constraints.util.ExpressionUtil; public class LLambdaAutomatonExample { @@ -40,7 +42,7 @@ private static RegisterAutomaton buildAutomaton() { // registers and parameters // guards - TransitionGuard trueGuard = new TransitionGuard(); + Expression trueGuard = ExpressionUtil.TRUE; // assignments VarMapping noMapping = new VarMapping(); diff --git a/src/test/java/de/learnlib/ralib/example/login/FreshMultiLogin.java b/src/test/java/de/learnlib/ralib/example/login/FreshMultiLogin.java index e8bbff6d..871c86f4 100644 --- a/src/test/java/de/learnlib/ralib/example/login/FreshMultiLogin.java +++ b/src/test/java/de/learnlib/ralib/example/login/FreshMultiLogin.java @@ -17,6 +17,7 @@ package de.learnlib.ralib.example.login; import java.lang.reflect.Method; +import java.math.BigDecimal; import java.util.Arrays; import java.util.HashMap; import java.util.Random; @@ -24,8 +25,8 @@ public class FreshMultiLogin { // Initialize statemachine constants,variables and locations - HashMap< Integer, Integer> id2pwd = new HashMap<>(); - HashMap< Integer, Boolean> id2loggedin = new HashMap<>(); + HashMap< java.math.BigDecimal, java.math.BigDecimal> id2pwd = new HashMap<>(); + HashMap< java.math.BigDecimal, Boolean> id2loggedin = new HashMap<>(); private final int MAX_REGISTERED_USERS = 3; private final int MAX_LOGGEDIN_USERS = 1000000; @@ -40,8 +41,8 @@ public class FreshMultiLogin { * - you can only register once for a specific uid * - at most MAX_REGISTERED_USERS may be registered */ - public Integer IRegister(Integer uid) { - Integer pwd = random.nextInt(10000000); + public java.math.BigDecimal IRegister(java.math.BigDecimal uid) { + java.math.BigDecimal pwd = new BigDecimal(random.nextInt(10000000)); if (!id2pwd.containsKey(uid) && id2pwd.keySet().size() < MAX_REGISTERED_USERS) { id2pwd.put(uid, pwd); id2loggedin.put(uid, false); @@ -57,7 +58,7 @@ public Integer IRegister(Integer uid) { * + and is not logged in * - at most MAX_LOGGEDIN_USERS users may be logged in */ - public boolean ILogin(Integer uid, Integer pwd) { + public boolean ILogin(java.math.BigDecimal uid, java.math.BigDecimal pwd) { if (id2pwd.containsKey(uid) && !id2loggedin.get(uid) && pwd == id2pwd.get(uid) @@ -73,7 +74,7 @@ public boolean ILogin(Integer uid, Integer pwd) { * * A user can only logout when logged in. */ - public boolean ILogout(Integer uid) { + public boolean ILogout(java.math.BigDecimal uid) { if (id2loggedin.containsKey(uid) && id2loggedin.get(uid)) { id2loggedin.put(uid, false); loggedin_users--; @@ -86,7 +87,7 @@ public boolean ILogout(Integer uid) { * * A user can only change password when logged in */ - public boolean IChangePassword(Integer uid, Integer pwd) { + public boolean IChangePassword(java.math.BigDecimal uid, java.math.BigDecimal pwd) { if (id2loggedin.containsKey(uid) && id2loggedin.get(uid)) { id2pwd.put(uid, pwd); diff --git a/src/test/java/de/learnlib/ralib/example/login/LoginAutomatonExample.java b/src/test/java/de/learnlib/ralib/example/login/LoginAutomatonExample.java index d6dbf325..49ebeb01 100644 --- a/src/test/java/de/learnlib/ralib/example/login/LoginAutomatonExample.java +++ b/src/test/java/de/learnlib/ralib/example/login/LoginAutomatonExample.java @@ -35,6 +35,10 @@ import de.learnlib.ralib.data.util.SymbolicDataValueGenerator.ParameterGenerator; import de.learnlib.ralib.data.util.SymbolicDataValueGenerator.RegisterGenerator; import de.learnlib.ralib.words.InputSymbol; +import gov.nasa.jpf.constraints.api.Expression; +import gov.nasa.jpf.constraints.expressions.NumericBooleanExpression; +import gov.nasa.jpf.constraints.expressions.NumericComparator; +import gov.nasa.jpf.constraints.util.ExpressionUtil; /** * @@ -42,8 +46,8 @@ */ public final class LoginAutomatonExample { - public static final DataType T_UID = new DataType("T_uid", Integer.class); - public static final DataType T_PWD = new DataType("T_pwd", Integer.class); + public static final DataType T_UID = new DataType("T_uid"); + public static final DataType T_PWD = new DataType("T_pwd"); public static final InputSymbol I_REGISTER = new InputSymbol("register", new DataType[] {T_UID, T_PWD}); @@ -77,17 +81,19 @@ private static RegisterAutomaton buildAutomaton() { // guards - GuardExpression condition = new Conjunction( - new AtomicGuardExpression(rUid, Relation.EQUALS, pUid), - new AtomicGuardExpression(rPwd, Relation.EQUALS, pPwd)); + Expression condition = ExpressionUtil.and( + new NumericBooleanExpression(rUid, NumericComparator.EQ, pUid), + new NumericBooleanExpression(rPwd, NumericComparator.EQ, pPwd) + ); - GuardExpression elseCond = new Disjunction( - new AtomicGuardExpression(rUid, Relation.NOT_EQUALS, pUid), - new AtomicGuardExpression(rPwd, Relation.NOT_EQUALS, pPwd)); + Expression elseCond = ExpressionUtil.or( + new NumericBooleanExpression(rUid, NumericComparator.NE, pUid), + new NumericBooleanExpression(rPwd, NumericComparator.NE, pPwd) + ); - TransitionGuard okGuard = new TransitionGuard(condition); - TransitionGuard errorGuard = new TransitionGuard(elseCond); - TransitionGuard trueGuard = new TransitionGuard(); + Expression okGuard = condition; + Expression errorGuard = elseCond; + Expression trueGuard = ExpressionUtil.TRUE; // assignments VarMapping copyMapping = new VarMapping(); diff --git a/src/test/java/de/learnlib/ralib/example/priority/PriorityQueueOracle.java b/src/test/java/de/learnlib/ralib/example/priority/PriorityQueueOracle.java index a14a0be1..8f78aed4 100644 --- a/src/test/java/de/learnlib/ralib/example/priority/PriorityQueueOracle.java +++ b/src/test/java/de/learnlib/ralib/example/priority/PriorityQueueOracle.java @@ -34,7 +34,7 @@ public final class PriorityQueueOracle implements DataWordOracle { public static final Integer CAPACITY = 3; - public static final DataType doubleType = new DataType("DOUBLE", Double.class); + public static final DataType doubleType = new DataType("DOUBLE"); public static final InputSymbol POLL = new InputSymbol("poll", new DataType[]{doubleType}); public static final InputSymbol OFFER = new InputSymbol("offer", new DataType[]{doubleType}); @@ -64,14 +64,14 @@ public void processQueries(Collection> answer[i] = false; //try { PSymbolInstance psi = query.getInput().getSymbol(i); - DataValue d = (DataValue) psi.getParameterValues()[0]; + DataValue d = (DataValue) psi.getParameterValues()[0]; if (psi.getBaseSymbol().equals(OFFER) && queue.size() < capacity) { - queue.offer(d.getId()); + queue.offer(d.getValue()); answer[i] = true; } else if (psi.getBaseSymbol().equals(POLL)) { BigDecimal val = queue.poll(); if (val != null) { - if (val.equals(d.getId())) { + if (val.equals(d.getValue())) { answer[i] = true; } } diff --git a/src/test/java/de/learnlib/ralib/example/priority/PriorityQueueSUL.java b/src/test/java/de/learnlib/ralib/example/priority/PriorityQueueSUL.java index e1993339..e9300f25 100644 --- a/src/test/java/de/learnlib/ralib/example/priority/PriorityQueueSUL.java +++ b/src/test/java/de/learnlib/ralib/example/priority/PriorityQueueSUL.java @@ -30,7 +30,7 @@ public class PriorityQueueSUL extends DataWordSUL { public static final DataType DOUBLE_TYPE = - new DataType("DOUBLE", BigDecimal.class); + new DataType("DOUBLE"); public static final ParameterizedSymbol POLL = new InputSymbol("poll", new DataType[]{}); @@ -91,7 +91,7 @@ private PSymbolInstance createOutputSymbol(Object x) { return new PSymbolInstance(NOK); } else { assert (null != x); - return new PSymbolInstance(OUTPUT, new DataValue(DOUBLE_TYPE, x)); + return new PSymbolInstance(OUTPUT, new DataValue(DOUBLE_TYPE, new BigDecimal(x.toString()))); } } @@ -99,7 +99,7 @@ private PSymbolInstance createOutputSymbol(Object x) { public PSymbolInstance step(PSymbolInstance i) throws SULException { countInputs(1); if (i.getBaseSymbol().equals(OFFER)) { - Object x = pqueue.offer(i.getParameterValues()[0].getId()); + Object x = pqueue.offer(i.getParameterValues()[0].getValue()); return createOutputSymbol(x); } else if (i.getBaseSymbol().equals(POLL)) { Object x = pqueue.poll(); diff --git a/src/test/java/de/learnlib/ralib/example/repeater/RepeaterSUL.java b/src/test/java/de/learnlib/ralib/example/repeater/RepeaterSUL.java index a5af4b1a..a3eab846 100644 --- a/src/test/java/de/learnlib/ralib/example/repeater/RepeaterSUL.java +++ b/src/test/java/de/learnlib/ralib/example/repeater/RepeaterSUL.java @@ -9,9 +9,11 @@ import de.learnlib.ralib.words.PSymbolInstance; import de.learnlib.ralib.words.ParameterizedSymbol; +import java.math.BigDecimal; + public class RepeaterSUL extends DataWordSUL { public static final DataType TINT = - new DataType("int", Integer.class); + new DataType("int"); public static final ParameterizedSymbol IPUT = new InputSymbol("put", new DataType[] {TINT}); @@ -64,14 +66,14 @@ public void post() { private PSymbolInstance createOutputSymbol(Integer x) { if (x == null) return new PSymbolInstance(ONOK); - return new PSymbolInstance(OECHO, new DataValue(TINT, x.intValue())); + return new PSymbolInstance(OECHO, new DataValue(TINT, new BigDecimal(x))); } @Override public PSymbolInstance step(PSymbolInstance in) throws SULException { countInputs(1); if (in.getBaseSymbol().equals(IPUT)) { - Integer p = (Integer)in.getParameterValues()[0].getId(); + Integer p =in.getParameterValues()[0].getValue().intValue(); Integer x = repeater.repeat(p); return createOutputSymbol(x); } else { diff --git a/src/test/java/de/learnlib/ralib/example/sdts/LoginExampleBranching.java b/src/test/java/de/learnlib/ralib/example/sdts/LoginExampleBranching.java index 74f70545..eb53589c 100644 --- a/src/test/java/de/learnlib/ralib/example/sdts/LoginExampleBranching.java +++ b/src/test/java/de/learnlib/ralib/example/sdts/LoginExampleBranching.java @@ -21,6 +21,7 @@ import de.learnlib.ralib.automata.TransitionGuard; import de.learnlib.ralib.oracles.Branching; import de.learnlib.ralib.words.PSymbolInstance; +import gov.nasa.jpf.constraints.api.Expression; import net.automatalib.word.Word; /** @@ -29,14 +30,14 @@ */ public class LoginExampleBranching implements Branching { - private final Map, TransitionGuard> branches; + private final Map, Expression> branches; - public LoginExampleBranching(Map, TransitionGuard> branches) { + public LoginExampleBranching(Map, Expression> branches) { this.branches = branches; } @Override - public Map, TransitionGuard> getBranches() { + public Map, Expression> getBranches() { return branches; } diff --git a/src/test/java/de/learnlib/ralib/example/sdts/LoginExampleSDT.java b/src/test/java/de/learnlib/ralib/example/sdts/LoginExampleSDT.java index 38a1a604..1a2392a7 100644 --- a/src/test/java/de/learnlib/ralib/example/sdts/LoginExampleSDT.java +++ b/src/test/java/de/learnlib/ralib/example/sdts/LoginExampleSDT.java @@ -19,6 +19,7 @@ import java.util.LinkedHashSet; import java.util.Set; +import de.learnlib.ralib.data.SymbolicDataValue; import de.learnlib.ralib.data.SymbolicDataValue.Register; import de.learnlib.ralib.data.VarMapping; import de.learnlib.ralib.learning.SymbolicDecisionTree; @@ -49,7 +50,7 @@ public LoginExampleSDT(LoginExampleSDT other) { suffix = new SymbolicSuffix(other.suffix); registers = new LinkedHashSet<>(); for (Register r : other.registers) - registers.add(r.copy()); + registers.add(SymbolicDataValue.copy(r)); } @Override diff --git a/src/test/java/de/learnlib/ralib/example/sdts/LoginExampleTreeOracle.java b/src/test/java/de/learnlib/ralib/example/sdts/LoginExampleTreeOracle.java index f8f261c9..cd037a42 100644 --- a/src/test/java/de/learnlib/ralib/example/sdts/LoginExampleTreeOracle.java +++ b/src/test/java/de/learnlib/ralib/example/sdts/LoginExampleTreeOracle.java @@ -22,6 +22,7 @@ import static de.learnlib.ralib.example.login.LoginAutomatonExample.T_PWD; import static de.learnlib.ralib.example.login.LoginAutomatonExample.T_UID; +import java.math.BigDecimal; import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.Map; @@ -49,6 +50,10 @@ import de.learnlib.ralib.words.DataWords; import de.learnlib.ralib.words.PSymbolInstance; import de.learnlib.ralib.words.ParameterizedSymbol; +import gov.nasa.jpf.constraints.api.Expression; +import gov.nasa.jpf.constraints.expressions.NumericBooleanExpression; +import gov.nasa.jpf.constraints.expressions.NumericComparator; +import gov.nasa.jpf.constraints.util.ExpressionUtil; import net.automatalib.word.Word; /** @@ -161,7 +166,7 @@ private Word getDefaultExtension( DataValue[] params = new DataValue[ps.getArity()]; int base = DataWords.paramLength(DataWords.actsOf(prefix)) + 1; for (int i = 0; i < ps.getArity(); i++) { - params[i] = new DataValue(ps.getPtypes()[i], base + i); + params[i] = new DataValue(ps.getPtypes()[i], new BigDecimal(base + i)); } return prefix.append(new PSymbolInstance(ps, params)); } @@ -170,7 +175,7 @@ private Word getDefaultExtension( public Branching getInitialBranching(Word prefix, ParameterizedSymbol ps, PIV piv, SymbolicDecisionTree... sdts) { - Map, TransitionGuard> branches = new LinkedHashMap, TransitionGuard>(); + Map, Expression> branches = new LinkedHashMap, Expression>(); Word acts = DataWords.actsOf(prefix); DataValue[] vals = DataWords.valsOf(prefix); @@ -184,23 +189,25 @@ public Branching getInitialBranching(Word prefix, SymbolicDataValue.Parameter pPwd = pgen.next(T_PWD); // guards - GuardExpression condition = new Conjunction( - new AtomicGuardExpression(rUid, Relation.EQUALS, pUid), - new AtomicGuardExpression(rPwd, Relation.EQUALS, pPwd)); + Expression condition = ExpressionUtil.and( + new NumericBooleanExpression(rUid, NumericComparator.EQ, pUid), + new NumericBooleanExpression(rPwd, NumericComparator.EQ, pPwd) + ); - GuardExpression elseCond = new Disjunction( - new AtomicGuardExpression(rUid, Relation.NOT_EQUALS, pUid), - new AtomicGuardExpression(rPwd, Relation.NOT_EQUALS, pPwd)); + Expression elseCond = ExpressionUtil.or( + new NumericBooleanExpression(rUid, NumericComparator.NE, pUid), + new NumericBooleanExpression(rPwd, NumericComparator.NE, pPwd) + ); - TransitionGuard ifGuard = new TransitionGuard(condition); - TransitionGuard elseGuard = new TransitionGuard(elseCond); + Expression ifGuard = condition; + Expression elseGuard = elseCond; branches.put(getDefaultExtension(prefix, ps), elseGuard); branches.put(prefix.append(new PSymbolInstance(ps, vals)), ifGuard); } else { - TransitionGuard guard = new TransitionGuard(); + Expression guard = ExpressionUtil.TRUE; branches.put(getDefaultExtension(prefix, ps), guard); } diff --git a/src/test/java/de/learnlib/ralib/example/stack/StackAutomatonExample.java b/src/test/java/de/learnlib/ralib/example/stack/StackAutomatonExample.java index 4818ad7e..78047dc7 100644 --- a/src/test/java/de/learnlib/ralib/example/stack/StackAutomatonExample.java +++ b/src/test/java/de/learnlib/ralib/example/stack/StackAutomatonExample.java @@ -16,10 +16,14 @@ import de.learnlib.ralib.data.util.SymbolicDataValueGenerator.ParameterGenerator; import de.learnlib.ralib.data.util.SymbolicDataValueGenerator.RegisterGenerator; import de.learnlib.ralib.words.InputSymbol; +import gov.nasa.jpf.constraints.api.Expression; +import gov.nasa.jpf.constraints.expressions.NumericBooleanExpression; +import gov.nasa.jpf.constraints.expressions.NumericComparator; +import gov.nasa.jpf.constraints.util.ExpressionUtil; public class StackAutomatonExample { - public static final DataType T_INT = new DataType("T_int", Integer.class); + public static final DataType T_INT = new DataType("T_int"); public static final InputSymbol I_PUSH = new InputSymbol("push", new DataType[] {T_INT}); @@ -49,11 +53,11 @@ private static RegisterAutomaton buildAutomaton() { Parameter pVal = pgen.next(T_INT); // guards - TransitionGuard okGuard1 = new TransitionGuard(new AtomicGuardExpression(rVal1, Relation.EQUALS, pVal)); - TransitionGuard okGuard2 = new TransitionGuard(new AtomicGuardExpression(rVal2, Relation.EQUALS, pVal)); - TransitionGuard errorGuard1 = new TransitionGuard(new AtomicGuardExpression(rVal1, Relation.NOT_EQUALS, pVal)); - TransitionGuard errorGuard2 = new TransitionGuard(new AtomicGuardExpression(rVal2, Relation.NOT_EQUALS, pVal)); - TransitionGuard trueGuard = new TransitionGuard(); + Expression okGuard1 = new NumericBooleanExpression(rVal1, NumericComparator.EQ, pVal); + Expression okGuard2 = new NumericBooleanExpression(rVal2, NumericComparator.EQ, pVal); + Expression errorGuard1 = new NumericBooleanExpression(rVal1, NumericComparator.NE, pVal); + Expression errorGuard2 = new NumericBooleanExpression(rVal2, NumericComparator.NE, pVal); + Expression trueGuard = ExpressionUtil.TRUE; // assignments VarMapping copyMapping = new VarMapping(); diff --git a/src/test/java/de/learnlib/ralib/learning/SymbolicSuffixTest.java b/src/test/java/de/learnlib/ralib/learning/SymbolicSuffixTest.java index f902b77f..d0108256 100644 --- a/src/test/java/de/learnlib/ralib/learning/SymbolicSuffixTest.java +++ b/src/test/java/de/learnlib/ralib/learning/SymbolicSuffixTest.java @@ -1,5 +1,6 @@ package de.learnlib.ralib.learning; +import java.math.BigDecimal; import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.Map; @@ -40,7 +41,7 @@ public void concatTest() { final Map teachers = new LinkedHashMap<>(); loader.getDataTypes().stream().forEach((t) -> { - TypedTheory theory = new IntegerEqualityTheory(t); + TypedTheory theory = new IntegerEqualityTheory(t); theory.setUseSuffixOpt(true); teachers.put(t, theory); }); @@ -61,9 +62,9 @@ public void concatTest() { ParameterizedSymbol ook = new OutputSymbol( "OOK", new DataType[] {}); - DataValue d0 = new DataValue(intType, 0); - DataValue d1 = new DataValue(intType, 1); - DataValue d6 = new DataValue(intType, 6); + DataValue d0 = new DataValue(intType, BigDecimal.ZERO); + DataValue d1 = new DataValue(intType, BigDecimal.ONE); + DataValue d6 = new DataValue(intType, new BigDecimal( 6)); //****** IPut[0[int]] OOK[] IPut[1[int]] OOK[] Word prefix1 = Word.fromSymbols( diff --git a/src/test/java/de/learnlib/ralib/learning/ralambda/GeneratedHypothesesTest.java b/src/test/java/de/learnlib/ralib/learning/ralambda/GeneratedHypothesesTest.java index c175b95c..b82ce20e 100644 --- a/src/test/java/de/learnlib/ralib/learning/ralambda/GeneratedHypothesesTest.java +++ b/src/test/java/de/learnlib/ralib/learning/ralambda/GeneratedHypothesesTest.java @@ -8,6 +8,7 @@ import java.util.LinkedHashMap; import java.util.Map; +import de.learnlib.ralib.smt.ConstraintSolverFactory; import org.testng.Assert; import org.testng.annotations.Test; @@ -25,8 +26,7 @@ import de.learnlib.ralib.oracles.TreeOracleFactory; import de.learnlib.ralib.oracles.mto.MultiTheorySDTLogicOracle; import de.learnlib.ralib.oracles.mto.MultiTheoryTreeOracle; -import de.learnlib.ralib.solver.ConstraintSolver; -import de.learnlib.ralib.solver.simple.SimpleConstraintSolver; +import de.learnlib.ralib.smt.ConstraintSolver; import de.learnlib.ralib.theory.Theory; import de.learnlib.ralib.tools.theories.IntegerEqualityTheory; @@ -40,7 +40,7 @@ public void getHypothesisTest() { Constants consts = new Constants(); RegisterAutomaton sul = AUTOMATON; DataWordOracle dwOracle = new SimulatorOracle(sul); - ConstraintSolver solver = new SimpleConstraintSolver(); + ConstraintSolver solver = ConstraintSolverFactory.createZ3ConstraintSolver(); final Map teachers = new LinkedHashMap<>(); IntegerEqualityTheory theory = new IntegerEqualityTheory(T_INT); diff --git a/src/test/java/de/learnlib/ralib/learning/ralambda/IOHandlingTest.java b/src/test/java/de/learnlib/ralib/learning/ralambda/IOHandlingTest.java index ae5d2559..8789ec93 100644 --- a/src/test/java/de/learnlib/ralib/learning/ralambda/IOHandlingTest.java +++ b/src/test/java/de/learnlib/ralib/learning/ralambda/IOHandlingTest.java @@ -6,10 +6,16 @@ import static de.learnlib.ralib.learning.ralambda.IOHandlingTest.IORAExamples.OK; import static de.learnlib.ralib.learning.ralambda.IOHandlingTest.IORAExamples.OUT; +import java.math.BigDecimal; import java.util.LinkedHashMap; import java.util.Map; import java.util.logging.Level; +import de.learnlib.ralib.smt.ConstraintSolverFactory; +import gov.nasa.jpf.constraints.api.Expression; +import gov.nasa.jpf.constraints.expressions.NumericBooleanExpression; +import gov.nasa.jpf.constraints.expressions.NumericComparator; +import gov.nasa.jpf.constraints.util.ExpressionUtil; import org.testng.Assert; import org.testng.annotations.Test; @@ -42,8 +48,8 @@ import de.learnlib.ralib.oracles.io.IOOracle; import de.learnlib.ralib.oracles.mto.MultiTheorySDTLogicOracle; import de.learnlib.ralib.oracles.mto.MultiTheoryTreeOracle; -import de.learnlib.ralib.solver.ConstraintSolver; -import de.learnlib.ralib.solver.simple.SimpleConstraintSolver; +import de.learnlib.ralib.smt.ConstraintSolver; + import de.learnlib.ralib.sul.DataWordSUL; import de.learnlib.ralib.sul.SULOracle; import de.learnlib.ralib.sul.SimulatorSUL; @@ -58,7 +64,7 @@ public class IOHandlingTest extends RaLibTestSuite { static class IORAExamples { - static final DataType ID = new DataType("id", Integer.class); + static final DataType ID = new DataType("id"); static final OutputSymbol NOK = new OutputSymbol("NOK", new DataType[] {}); @@ -90,11 +96,11 @@ private static RegisterAutomaton buildAutomatonWithNoOutputParams() { Parameter pVal = pgen.next(ID); // guards - TransitionGuard okGuard = new TransitionGuard( - new AtomicGuardExpression(rVal, Relation.EQUALS, pVal)); - TransitionGuard nokGuard = new TransitionGuard( - new AtomicGuardExpression(rVal, Relation.NOT_EQUALS, pVal)); - TransitionGuard trueGuard = new TransitionGuard(); + Expression okGuard = + new NumericBooleanExpression(rVal, NumericComparator.EQ, pVal); + Expression nokGuard = + new NumericBooleanExpression(rVal, NumericComparator.NE, pVal); + Expression trueGuard = ExpressionUtil.TRUE; // assignments VarMapping copyMapping = new VarMapping(); @@ -152,11 +158,9 @@ private static RegisterAutomaton buildAutomatonOutputParam(boolean fresh) { Parameter pVal = pgen.next(ID); // guards - TransitionGuard okGuard = new TransitionGuard( - new AtomicGuardExpression(rVal, Relation.EQUALS, pVal)); - TransitionGuard nokGuard = new TransitionGuard( - new AtomicGuardExpression(rVal, Relation.NOT_EQUALS, pVal)); - TransitionGuard trueGuard = new TransitionGuard(); + Expression okGuard = new NumericBooleanExpression(rVal, NumericComparator.EQ, pVal); + Expression nokGuard = new NumericBooleanExpression(rVal, NumericComparator.NE, pVal); + Expression trueGuard = ExpressionUtil.TRUE; // assignments VarMapping copyMapping = new VarMapping(); @@ -212,7 +216,7 @@ public void testLearnIORAWithNoOutputParams() { ((EqualityTheory) t).setFreshValues(true, ioCache); }); - ConstraintSolver solver = new SimpleConstraintSolver(); + ConstraintSolver solver = ConstraintSolverFactory.createZ3ConstraintSolver(); MultiTheoryTreeOracle mto = new MultiTheoryTreeOracle(ioFilter, teachers, consts, solver); MultiTheorySDTLogicOracle mlo = new MultiTheorySDTLogicOracle(consts, solver); @@ -227,8 +231,8 @@ public void testLearnIORAWithNoOutputParams() { RegisterAutomaton hyp = ralambda.getHypothesis(); logger.log(Level.FINE, "HYP1: {0}", hyp); - Word ce = Word.fromSymbols(new PSymbolInstance(IN, new DataValue(ID, 0)), - new PSymbolInstance(OK), new PSymbolInstance(IN, new DataValue(ID, 1)), new PSymbolInstance(NOK)); + Word ce = Word.fromSymbols(new PSymbolInstance(IN, new DataValue(ID, BigDecimal.ZERO)), + new PSymbolInstance(OK), new PSymbolInstance(IN, new DataValue(ID, BigDecimal.ONE)), new PSymbolInstance(NOK)); ralambda.addCounterexample(new DefaultQuery<>(ce, model.accepts(ce))); @@ -259,7 +263,7 @@ public void testLearnIORAWithEqualOutputParam() { ((EqualityTheory) t).setFreshValues(true, ioCache); }); - ConstraintSolver solver = new SimpleConstraintSolver(); + ConstraintSolver solver = ConstraintSolverFactory.createZ3ConstraintSolver(); MultiTheoryTreeOracle mto = new MultiTheoryTreeOracle(ioFilter, teachers, consts, solver); MultiTheorySDTLogicOracle mlo = new MultiTheorySDTLogicOracle(consts, solver); @@ -277,8 +281,8 @@ public void testLearnIORAWithEqualOutputParam() { // Word ce = Word.fromSymbols(new PSymbolInstance(IN, new DataValue(ID, 0)), // new PSymbolInstance(OUT, new DataValue(ID, 0)), new PSymbolInstance(IN, new DataValue(ID, 1)), // new PSymbolInstance(NOK)); - Word ce = Word.fromSymbols(new PSymbolInstance(IN, new DataValue(ID, 0)), - new PSymbolInstance(OUT, new DataValue(ID, 0)), new PSymbolInstance(IN, new DataValue(ID, 1)), + Word ce = Word.fromSymbols(new PSymbolInstance(IN, new DataValue(ID, BigDecimal.ZERO)), + new PSymbolInstance(OUT, new DataValue(ID, BigDecimal.ZERO)), new PSymbolInstance(IN, new DataValue(ID, BigDecimal.ONE)), new PSymbolInstance(NOK)); ralambda.addCounterexample(new DefaultQuery<>(ce, model.accepts(ce))); @@ -310,7 +314,7 @@ public void testLearnIORAWithFreshOutputParam() { ((EqualityTheory) t).setFreshValues(true, ioCache); }); - ConstraintSolver solver = new SimpleConstraintSolver(); + ConstraintSolver solver = ConstraintSolverFactory.createZ3ConstraintSolver(); MultiTheoryTreeOracle mto = new MultiTheoryTreeOracle(ioFilter, teachers, consts, solver); MultiTheorySDTLogicOracle mlo = new MultiTheorySDTLogicOracle(consts, solver); @@ -325,8 +329,8 @@ public void testLearnIORAWithFreshOutputParam() { RegisterAutomaton hyp = ralambda.getHypothesis(); logger.log(Level.FINE, "HYP1: {0}", hyp); - Word ce = Word.fromSymbols(new PSymbolInstance(IN, new DataValue(ID, 0)), - new PSymbolInstance(OUT, new DataValue(ID, 1)), new PSymbolInstance(IN, new DataValue(ID, 1)), + Word ce = Word.fromSymbols(new PSymbolInstance(IN, new DataValue(ID, BigDecimal.ZERO)), + new PSymbolInstance(OUT, new DataValue(ID, BigDecimal.ONE)), new PSymbolInstance(IN, new DataValue(ID, BigDecimal.ONE)), new PSymbolInstance(NOK)); ralambda.addCounterexample(new DefaultQuery<>(ce, model.accepts(ce))); diff --git a/src/test/java/de/learnlib/ralib/learning/ralambda/LearnABPOutputTest.java b/src/test/java/de/learnlib/ralib/learning/ralambda/LearnABPOutputTest.java index 91455624..f8c94c86 100644 --- a/src/test/java/de/learnlib/ralib/learning/ralambda/LearnABPOutputTest.java +++ b/src/test/java/de/learnlib/ralib/learning/ralambda/LearnABPOutputTest.java @@ -5,6 +5,7 @@ import java.util.Random; import java.util.logging.Level; +import de.learnlib.ralib.smt.ConstraintSolverFactory; import org.testng.Assert; import org.testng.annotations.Test; @@ -28,8 +29,8 @@ import de.learnlib.ralib.oracles.io.IOOracle; import de.learnlib.ralib.oracles.mto.MultiTheorySDTLogicOracle; import de.learnlib.ralib.oracles.mto.MultiTheoryTreeOracle; -import de.learnlib.ralib.solver.ConstraintSolver; -import de.learnlib.ralib.solver.simple.SimpleConstraintSolver; +import de.learnlib.ralib.smt.ConstraintSolver; + import de.learnlib.ralib.sul.DataWordSUL; import de.learnlib.ralib.sul.SULOracle; import de.learnlib.ralib.sul.SimulatorSUL; @@ -76,7 +77,7 @@ public void learnABPOutput() { ((EqualityTheory)t).setFreshValues(true, ioCache); }); - ConstraintSolver solver = new SimpleConstraintSolver(); + ConstraintSolver solver = ConstraintSolverFactory.createZ3ConstraintSolver(); MultiTheoryTreeOracle mto = new MultiTheoryTreeOracle( ioFilter, teachers, consts, solver); diff --git a/src/test/java/de/learnlib/ralib/learning/ralambda/LearnDtlsServerTest.java b/src/test/java/de/learnlib/ralib/learning/ralambda/LearnDtlsServerTest.java index 3a7e7bb8..3a4d4aac 100644 --- a/src/test/java/de/learnlib/ralib/learning/ralambda/LearnDtlsServerTest.java +++ b/src/test/java/de/learnlib/ralib/learning/ralambda/LearnDtlsServerTest.java @@ -18,7 +18,7 @@ import de.learnlib.ralib.learning.Hypothesis; import de.learnlib.ralib.learning.RaLearningAlgorithmName; import de.learnlib.ralib.oracles.SimulatorOracle; -import de.learnlib.ralib.solver.jconstraints.JConstraintsConstraintSolver; +import de.learnlib.ralib.smt.jconstraints.JConstraintsConstraintSolver; import de.learnlib.ralib.theory.Theory; import de.learnlib.ralib.tools.theories.IntegerEqualityTheory; import de.learnlib.ralib.words.PSymbolInstance; diff --git a/src/test/java/de/learnlib/ralib/learning/ralambda/LearnEchoTest.java b/src/test/java/de/learnlib/ralib/learning/ralambda/LearnEchoTest.java index 6159eca6..a197e9af 100644 --- a/src/test/java/de/learnlib/ralib/learning/ralambda/LearnEchoTest.java +++ b/src/test/java/de/learnlib/ralib/learning/ralambda/LearnEchoTest.java @@ -5,9 +5,11 @@ import static de.learnlib.ralib.example.repeater.RepeaterSUL.ONOK; import static de.learnlib.ralib.example.repeater.RepeaterSUL.TINT; +import java.math.BigDecimal; import java.util.LinkedHashMap; import java.util.Map; +import de.learnlib.ralib.smt.ConstraintSolverFactory; import org.testng.Assert; import org.testng.annotations.Test; @@ -26,8 +28,8 @@ import de.learnlib.ralib.oracles.io.IOOracle; import de.learnlib.ralib.oracles.mto.MultiTheorySDTLogicOracle; import de.learnlib.ralib.oracles.mto.MultiTheoryTreeOracle; -import de.learnlib.ralib.solver.ConstraintSolver; -import de.learnlib.ralib.solver.simple.SimpleConstraintSolver; +import de.learnlib.ralib.smt.ConstraintSolver; + import de.learnlib.ralib.sul.SULOracle; import de.learnlib.ralib.theory.Theory; import de.learnlib.ralib.tools.theories.IntegerEqualityTheory; @@ -51,7 +53,7 @@ public void learnEchoTest() { IOCache ioCache = new IOCache(ioOracle); IOFilter oracle = new IOFilter(ioCache, sul.getInputSymbols()); - ConstraintSolver solver = new SimpleConstraintSolver(); + ConstraintSolver solver = ConstraintSolverFactory.createZ3ConstraintSolver(); MultiTheoryTreeOracle mto = new MultiTheoryTreeOracle(oracle, teachers, consts, solver); MultiTheorySDTLogicOracle mlo = new MultiTheorySDTLogicOracle(consts, solver); @@ -63,15 +65,15 @@ public void learnEchoTest() { learner.learn(); Word ce = Word.fromSymbols( - new PSymbolInstance(IPUT, new DataValue(TINT, 0)), - new PSymbolInstance(OECHO, new DataValue(TINT, 0)), - new PSymbolInstance(IPUT, new DataValue(TINT, 1)), - new PSymbolInstance(OECHO, new DataValue(TINT, 1)), - new PSymbolInstance(IPUT, new DataValue(TINT, 2)), - new PSymbolInstance(OECHO, new DataValue(TINT, 2)), - new PSymbolInstance(IPUT, new DataValue(TINT, 3)), - new PSymbolInstance(OECHO, new DataValue(TINT, 3)), - new PSymbolInstance(IPUT, new DataValue(TINT, 4)), + new PSymbolInstance(IPUT, new DataValue(TINT, BigDecimal.ZERO)), + new PSymbolInstance(OECHO, new DataValue(TINT, BigDecimal.ZERO)), + new PSymbolInstance(IPUT, new DataValue(TINT, BigDecimal.ONE)), + new PSymbolInstance(OECHO, new DataValue(TINT, BigDecimal.ONE)), + new PSymbolInstance(IPUT, new DataValue(TINT, new BigDecimal(2))), + new PSymbolInstance(OECHO, new DataValue(TINT, new BigDecimal(2))), + new PSymbolInstance(IPUT, new DataValue(TINT, new BigDecimal(3))), + new PSymbolInstance(OECHO, new DataValue(TINT, new BigDecimal(3))), + new PSymbolInstance(IPUT, new DataValue(TINT, new BigDecimal(4))), new PSymbolInstance(ONOK)); learner.addCounterexample(new DefaultQuery<>(ce, true)); diff --git a/src/test/java/de/learnlib/ralib/learning/ralambda/LearnLoginTest.java b/src/test/java/de/learnlib/ralib/learning/ralambda/LearnLoginTest.java index 0969ea64..e747d026 100644 --- a/src/test/java/de/learnlib/ralib/learning/ralambda/LearnLoginTest.java +++ b/src/test/java/de/learnlib/ralib/learning/ralambda/LearnLoginTest.java @@ -7,11 +7,13 @@ import static de.learnlib.ralib.example.login.LoginAutomatonExample.T_PWD; import static de.learnlib.ralib.example.login.LoginAutomatonExample.T_UID; +import java.math.BigDecimal; import java.util.Arrays; import java.util.LinkedHashMap; import java.util.Map; import java.util.logging.Level; +import de.learnlib.ralib.smt.ConstraintSolverFactory; import org.testng.Assert; import org.testng.annotations.Test; @@ -31,8 +33,8 @@ import de.learnlib.ralib.oracles.TreeOracleFactory; import de.learnlib.ralib.oracles.mto.MultiTheorySDTLogicOracle; import de.learnlib.ralib.oracles.mto.MultiTheoryTreeOracle; -import de.learnlib.ralib.solver.ConstraintSolver; -import de.learnlib.ralib.solver.simple.SimpleConstraintSolver; +import de.learnlib.ralib.smt.ConstraintSolver; + import de.learnlib.ralib.theory.Theory; import de.learnlib.ralib.tools.theories.IntegerEqualityTheory; import de.learnlib.ralib.words.PSymbolInstance; @@ -51,7 +53,7 @@ public void learnLoginTest() { teachers.put(T_UID, new IntegerEqualityTheory(T_UID)); teachers.put(T_PWD, new IntegerEqualityTheory(T_PWD)); - ConstraintSolver solver = new SimpleConstraintSolver(); + ConstraintSolver solver = ConstraintSolverFactory.createZ3ConstraintSolver(); MultiTheoryTreeOracle mto = new MultiTheoryTreeOracle( dwOracle, teachers, new Constants(), solver); @@ -71,9 +73,9 @@ public void learnLoginTest() { Word ce = Word.fromSymbols( new PSymbolInstance(I_REGISTER, - new DataValue(T_UID, 0), new DataValue(T_PWD, 0)), + new DataValue(T_UID, BigDecimal.ZERO), new DataValue(T_PWD, BigDecimal.ZERO)), new PSymbolInstance(I_LOGIN, - new DataValue(T_UID, 0), new DataValue(T_PWD, 0))); + new DataValue(T_UID, BigDecimal.ZERO), new DataValue(T_PWD, BigDecimal.ZERO))); ralambda.addCounterexample(new DefaultQuery<>(ce, sul.accepts(ce))); @@ -92,7 +94,7 @@ public void learnLoginRandomTest() { Constants consts = new Constants(); RegisterAutomaton sul = AUTOMATON; DataWordOracle dwOracle = new SimulatorOracle(sul); - ConstraintSolver solver = new SimpleConstraintSolver(); + ConstraintSolver solver = ConstraintSolverFactory.createZ3ConstraintSolver(); final Map teachers = new LinkedHashMap<>(); teachers.put(T_UID, new IntegerEqualityTheory(T_UID)); diff --git a/src/test/java/de/learnlib/ralib/learning/ralambda/LearnMixedIOTest.java b/src/test/java/de/learnlib/ralib/learning/ralambda/LearnMixedIOTest.java index 1f06a92b..2ac3e5d6 100644 --- a/src/test/java/de/learnlib/ralib/learning/ralambda/LearnMixedIOTest.java +++ b/src/test/java/de/learnlib/ralib/learning/ralambda/LearnMixedIOTest.java @@ -44,7 +44,7 @@ import de.learnlib.ralib.oracles.io.IOOracle; import de.learnlib.ralib.oracles.mto.MultiTheorySDTLogicOracle; import de.learnlib.ralib.oracles.mto.MultiTheoryTreeOracle; -import de.learnlib.ralib.solver.jconstraints.JConstraintsConstraintSolver; +import de.learnlib.ralib.smt.jconstraints.JConstraintsConstraintSolver; import de.learnlib.ralib.sul.DataWordSUL; import de.learnlib.ralib.sul.SULOracle; import de.learnlib.ralib.sul.SimulatorSUL; diff --git a/src/test/java/de/learnlib/ralib/learning/ralambda/LearnPQIOTest.java b/src/test/java/de/learnlib/ralib/learning/ralambda/LearnPQIOTest.java index 6256cc86..278a43d6 100644 --- a/src/test/java/de/learnlib/ralib/learning/ralambda/LearnPQIOTest.java +++ b/src/test/java/de/learnlib/ralib/learning/ralambda/LearnPQIOTest.java @@ -45,7 +45,7 @@ import de.learnlib.ralib.oracles.io.IOOracle; import de.learnlib.ralib.oracles.mto.MultiTheorySDTLogicOracle; import de.learnlib.ralib.oracles.mto.MultiTheoryTreeOracle; -import de.learnlib.ralib.solver.jconstraints.JConstraintsConstraintSolver; +import de.learnlib.ralib.smt.jconstraints.JConstraintsConstraintSolver; import de.learnlib.ralib.sul.SULOracle; import de.learnlib.ralib.theory.Theory; import de.learnlib.ralib.tools.theories.DoubleInequalityTheory; diff --git a/src/test/java/de/learnlib/ralib/learning/ralambda/LearnPQTest.java b/src/test/java/de/learnlib/ralib/learning/ralambda/LearnPQTest.java index adacc525..0a6faf89 100644 --- a/src/test/java/de/learnlib/ralib/learning/ralambda/LearnPQTest.java +++ b/src/test/java/de/learnlib/ralib/learning/ralambda/LearnPQTest.java @@ -47,7 +47,7 @@ import de.learnlib.ralib.oracles.TreeOracleFactory; import de.learnlib.ralib.oracles.mto.MultiTheorySDTLogicOracle; import de.learnlib.ralib.oracles.mto.MultiTheoryTreeOracle; -import de.learnlib.ralib.solver.jconstraints.JConstraintsConstraintSolver; +import de.learnlib.ralib.smt.jconstraints.JConstraintsConstraintSolver; import de.learnlib.ralib.theory.Theory; import de.learnlib.ralib.tools.theories.DoubleInequalityTheory; import de.learnlib.ralib.words.PSymbolInstance; diff --git a/src/test/java/de/learnlib/ralib/learning/ralambda/LearnPadlock.java b/src/test/java/de/learnlib/ralib/learning/ralambda/LearnPadlock.java index b957593f..90e5dfe2 100644 --- a/src/test/java/de/learnlib/ralib/learning/ralambda/LearnPadlock.java +++ b/src/test/java/de/learnlib/ralib/learning/ralambda/LearnPadlock.java @@ -1,9 +1,15 @@ package de.learnlib.ralib.learning.ralambda; +import java.math.BigDecimal; import java.util.LinkedHashMap; import java.util.Map; import java.util.logging.Level; +import de.learnlib.ralib.smt.ConstraintSolverFactory; +import gov.nasa.jpf.constraints.api.Expression; +import gov.nasa.jpf.constraints.expressions.NumericBooleanExpression; +import gov.nasa.jpf.constraints.expressions.NumericComparator; +import gov.nasa.jpf.constraints.util.ExpressionUtil; import org.testng.annotations.Test; import de.learnlib.query.DefaultQuery; @@ -31,8 +37,8 @@ import de.learnlib.ralib.oracles.TreeOracleFactory; import de.learnlib.ralib.oracles.mto.MultiTheorySDTLogicOracle; import de.learnlib.ralib.oracles.mto.MultiTheoryTreeOracle; -import de.learnlib.ralib.solver.ConstraintSolver; -import de.learnlib.ralib.solver.simple.SimpleConstraintSolver; +import de.learnlib.ralib.smt.ConstraintSolver; + import de.learnlib.ralib.theory.Theory; import de.learnlib.ralib.tools.theories.IntegerEqualityTheory; import de.learnlib.ralib.words.InputSymbol; @@ -40,7 +46,7 @@ import net.automatalib.word.Word; public class LearnPadlock extends RaLibTestSuite { - static final DataType DIGIT = new DataType("id", Integer.class); + static final DataType DIGIT = new DataType("id"); static final InputSymbol IN = new InputSymbol("in", new DataType[] { DIGIT }); @@ -61,11 +67,9 @@ private static RegisterAutomaton buildAutomaton() { Parameter pVal = pgen.next(DIGIT); // guards - TransitionGuard eqGuard = new TransitionGuard( - new AtomicGuardExpression(rVal, Relation.EQUALS, pVal)); - TransitionGuard neqGuard = new TransitionGuard( - new AtomicGuardExpression(rVal, Relation.NOT_EQUALS, pVal)); - TransitionGuard trueGuard = new TransitionGuard(); + Expression eqGuard = new NumericBooleanExpression(rVal, NumericComparator.EQ, pVal); + Expression neqGuard = new NumericBooleanExpression(rVal, NumericComparator.NE, pVal); + Expression trueGuard = ExpressionUtil.TRUE; // assignments VarMapping copyMapping = new VarMapping(); @@ -107,7 +111,7 @@ public void learnPadlock() { final Map teachers = new LinkedHashMap<>(); teachers.put(DIGIT, new IntegerEqualityTheory(DIGIT)); - ConstraintSolver solver = new SimpleConstraintSolver(); + ConstraintSolver solver = ConstraintSolverFactory.createZ3ConstraintSolver(); MultiTheoryTreeOracle mto = new MultiTheoryTreeOracle( dwOracle, teachers, new Constants(), solver); @@ -126,10 +130,10 @@ public void learnPadlock() { logger.log(Level.FINE, "HYP0: {0}", hyp); Word ce = Word.fromSymbols( - new PSymbolInstance(IN, new DataValue<>(DIGIT, 0)), - new PSymbolInstance(IN, new DataValue<>(DIGIT, 0)), - new PSymbolInstance(IN, new DataValue<>(DIGIT, 0)), - new PSymbolInstance(IN, new DataValue<>(DIGIT, 0))); + new PSymbolInstance(IN, new DataValue(DIGIT, BigDecimal.ZERO)), + new PSymbolInstance(IN, new DataValue(DIGIT, BigDecimal.ZERO)), + new PSymbolInstance(IN, new DataValue(DIGIT, BigDecimal.ZERO)), + new PSymbolInstance(IN, new DataValue(DIGIT, BigDecimal.ZERO))); ralambda.addCounterexample(new DefaultQuery<>(ce, sul.accepts(ce))); diff --git a/src/test/java/de/learnlib/ralib/learning/ralambda/LearnPalindromeIOTest.java b/src/test/java/de/learnlib/ralib/learning/ralambda/LearnPalindromeIOTest.java index 4faa5f54..b177e20d 100644 --- a/src/test/java/de/learnlib/ralib/learning/ralambda/LearnPalindromeIOTest.java +++ b/src/test/java/de/learnlib/ralib/learning/ralambda/LearnPalindromeIOTest.java @@ -4,6 +4,7 @@ import java.util.Map; import java.util.logging.Level; +import de.learnlib.ralib.smt.ConstraintSolverFactory; import org.testng.Assert; import org.testng.annotations.Test; @@ -23,8 +24,7 @@ import de.learnlib.ralib.oracles.io.IOOracle; import de.learnlib.ralib.oracles.mto.MultiTheorySDTLogicOracle; import de.learnlib.ralib.oracles.mto.MultiTheoryTreeOracle; -import de.learnlib.ralib.solver.ConstraintSolver; -import de.learnlib.ralib.solver.simple.SimpleConstraintSolver; +import de.learnlib.ralib.smt.ConstraintSolver; import de.learnlib.ralib.sul.DataWordSUL; import de.learnlib.ralib.sul.SULOracle; import de.learnlib.ralib.sul.SimulatorSUL; @@ -55,12 +55,12 @@ public void learnPalindromeIO() { final Map teachers = new LinkedHashMap<>(); loader.getDataTypes().stream().forEach((t) -> { - TypedTheory theory = new IntegerEqualityTheory(t); + TypedTheory theory = new IntegerEqualityTheory(t); theory.setUseSuffixOpt(true); teachers.put(t, theory); }); - ConstraintSolver solver = new SimpleConstraintSolver(); + ConstraintSolver solver = ConstraintSolverFactory.createZ3ConstraintSolver(); DataWordSUL sul = new SimulatorSUL(model, teachers, consts); IOOracle ioOracle = new SULOracle(sul, ERROR); diff --git a/src/test/java/de/learnlib/ralib/learning/ralambda/LearnRepeaterTest.java b/src/test/java/de/learnlib/ralib/learning/ralambda/LearnRepeaterTest.java index ab4dd917..402f10b7 100644 --- a/src/test/java/de/learnlib/ralib/learning/ralambda/LearnRepeaterTest.java +++ b/src/test/java/de/learnlib/ralib/learning/ralambda/LearnRepeaterTest.java @@ -4,9 +4,11 @@ import static de.learnlib.ralib.example.repeater.RepeaterSUL.OECHO; import static de.learnlib.ralib.example.repeater.RepeaterSUL.TINT; +import java.math.BigDecimal; import java.util.LinkedHashMap; import java.util.Map; +import de.learnlib.ralib.smt.ConstraintSolverFactory; import org.testng.Assert; import org.testng.annotations.Test; @@ -27,8 +29,7 @@ import de.learnlib.ralib.oracles.io.IOOracle; import de.learnlib.ralib.oracles.mto.MultiTheorySDTLogicOracle; import de.learnlib.ralib.oracles.mto.MultiTheoryTreeOracle; -import de.learnlib.ralib.solver.ConstraintSolver; -import de.learnlib.ralib.solver.simple.SimpleConstraintSolver; +import de.learnlib.ralib.smt.ConstraintSolver; import de.learnlib.ralib.sul.SULOracle; import de.learnlib.ralib.theory.Theory; import de.learnlib.ralib.tools.theories.IntegerEqualityTheory; @@ -52,7 +53,7 @@ public void learnRepeaterTest() { IOCache ioCache = new IOCache(ioOracle); IOFilter oracle = new IOFilter(ioCache, sul.getInputSymbols()); - ConstraintSolver solver = new SimpleConstraintSolver(); + ConstraintSolver solver = ConstraintSolverFactory.createZ3ConstraintSolver(); MultiTheoryTreeOracle mto = new MultiTheoryTreeOracle(oracle, teachers, consts, solver); @@ -77,12 +78,12 @@ public void learnRepeaterTest() { Assert.assertNull(repeater.repeat(0)); Word ce = - Word.fromSymbols(new PSymbolInstance(IPUT, new DataValue(TINT, 0)), - new PSymbolInstance(OECHO, new DataValue(TINT, 0)), - new PSymbolInstance(IPUT, new DataValue(TINT, 0)), - new PSymbolInstance(OECHO, new DataValue(TINT, 0)), - new PSymbolInstance(IPUT, new DataValue(TINT, 0)), - new PSymbolInstance(OECHO, new DataValue(TINT, 0))); + Word.fromSymbols(new PSymbolInstance(IPUT, new DataValue(TINT, BigDecimal.ZERO)), + new PSymbolInstance(OECHO, new DataValue(TINT, BigDecimal.ZERO)), + new PSymbolInstance(IPUT, new DataValue(TINT, BigDecimal.ZERO)), + new PSymbolInstance(OECHO, new DataValue(TINT, BigDecimal.ZERO)), + new PSymbolInstance(IPUT, new DataValue(TINT, BigDecimal.ZERO)), + new PSymbolInstance(OECHO, new DataValue(TINT, BigDecimal.ZERO))); learner.addCounterexample(new DefaultQuery(ce, false)); diff --git a/src/test/java/de/learnlib/ralib/learning/ralambda/LearnSipIOTest.java b/src/test/java/de/learnlib/ralib/learning/ralambda/LearnSipIOTest.java index 579eb0ff..cde9f36d 100644 --- a/src/test/java/de/learnlib/ralib/learning/ralambda/LearnSipIOTest.java +++ b/src/test/java/de/learnlib/ralib/learning/ralambda/LearnSipIOTest.java @@ -5,6 +5,7 @@ import java.util.Random; import java.util.logging.Level; +import de.learnlib.ralib.smt.ConstraintSolverFactory; import org.testng.Assert; import org.testng.annotations.Test; @@ -29,8 +30,8 @@ import de.learnlib.ralib.oracles.io.IOOracle; import de.learnlib.ralib.oracles.mto.MultiTheorySDTLogicOracle; import de.learnlib.ralib.oracles.mto.MultiTheoryTreeOracle; -import de.learnlib.ralib.solver.ConstraintSolver; -import de.learnlib.ralib.solver.simple.SimpleConstraintSolver; +import de.learnlib.ralib.smt.ConstraintSolver; + import de.learnlib.ralib.sul.DataWordSUL; import de.learnlib.ralib.sul.SULOracle; import de.learnlib.ralib.sul.SimulatorSUL; @@ -79,7 +80,7 @@ public void learnSipIO() { ((EqualityTheory)t).setFreshValues(true, ioCache); }); - ConstraintSolver solver = new SimpleConstraintSolver(); + ConstraintSolver solver = ConstraintSolverFactory.createZ3ConstraintSolver(); MultiTheoryTreeOracle mto = new MultiTheoryTreeOracle( ioFilter, teachers, consts, solver); diff --git a/src/test/java/de/learnlib/ralib/learning/ralambda/LearnStackTest.java b/src/test/java/de/learnlib/ralib/learning/ralambda/LearnStackTest.java index 260b4d9f..9508e686 100644 --- a/src/test/java/de/learnlib/ralib/learning/ralambda/LearnStackTest.java +++ b/src/test/java/de/learnlib/ralib/learning/ralambda/LearnStackTest.java @@ -5,6 +5,7 @@ import static de.learnlib.ralib.example.stack.StackAutomatonExample.I_PUSH; import static de.learnlib.ralib.example.stack.StackAutomatonExample.T_INT; +import java.math.BigDecimal; import java.util.Arrays; import java.util.Collection; import java.util.LinkedHashMap; @@ -15,6 +16,7 @@ import com.google.common.collect.ImmutableSet; +import de.learnlib.ralib.smt.ConstraintSolverFactory; import org.testng.Assert; import org.testng.annotations.Test; @@ -36,8 +38,7 @@ import de.learnlib.ralib.oracles.TreeOracleFactory; import de.learnlib.ralib.oracles.mto.MultiTheorySDTLogicOracle; import de.learnlib.ralib.oracles.mto.MultiTheoryTreeOracle; -import de.learnlib.ralib.solver.ConstraintSolver; -import de.learnlib.ralib.solver.simple.SimpleConstraintSolver; +import de.learnlib.ralib.smt.ConstraintSolver; import de.learnlib.ralib.theory.Theory; import de.learnlib.ralib.tools.theories.IntegerEqualityTheory; import de.learnlib.ralib.words.PSymbolInstance; @@ -56,7 +57,7 @@ public void learnStackTest() { final Map teachers = new LinkedHashMap<>(); teachers.put(T_INT, new IntegerEqualityTheory(T_INT)); - ConstraintSolver solver = new SimpleConstraintSolver(); + ConstraintSolver solver = ConstraintSolverFactory.createZ3ConstraintSolver(); Measurements mes = new Measurements(); @@ -77,8 +78,8 @@ public void learnStackTest() { logger.log(Level.FINE, "HYP0: {0}", hyp); Word ce = Word.fromSymbols( - new PSymbolInstance(I_PUSH, new DataValue(T_INT, 0)), - new PSymbolInstance(I_POP, new DataValue(T_INT, 0))); + new PSymbolInstance(I_PUSH, new DataValue(T_INT, BigDecimal.ZERO)), + new PSymbolInstance(I_POP, new DataValue(T_INT, BigDecimal.ZERO))); ralambda.addCounterexample(new DefaultQuery<>(ce, sul.accepts(ce))); @@ -87,9 +88,9 @@ public void learnStackTest() { logger.log(Level.FINE, "HYP1: {0}", hyp); ce = Word.fromSymbols( - new PSymbolInstance(I_PUSH, new DataValue(T_INT, 0)), - new PSymbolInstance(I_PUSH, new DataValue(T_INT, 1)), - new PSymbolInstance(I_PUSH, new DataValue(T_INT, 2))); + new PSymbolInstance(I_PUSH, new DataValue(T_INT, BigDecimal.ZERO)), + new PSymbolInstance(I_PUSH, new DataValue(T_INT, BigDecimal.ONE)), + new PSymbolInstance(I_PUSH, new DataValue(T_INT, new BigDecimal(2)))); ralambda.addCounterexample(new DefaultQuery<>(ce, sul.accepts(ce))); @@ -110,7 +111,7 @@ public void learnStackSwitchedCETest() { final Map teachers = new LinkedHashMap<>(); teachers.put(T_INT, new IntegerEqualityTheory(T_INT)); - ConstraintSolver solver = new SimpleConstraintSolver(); + ConstraintSolver solver = ConstraintSolverFactory.createZ3ConstraintSolver(); MultiTheoryTreeOracle mto = new MultiTheoryTreeOracle( dwOracle, teachers, new Constants(), solver); @@ -131,9 +132,9 @@ public void learnStackSwitchedCETest() { logger.log(Level.FINE, "HYP1: {0}", hyp); Word ce = Word.fromSymbols( - new PSymbolInstance(I_PUSH, new DataValue(T_INT, 0)), - new PSymbolInstance(I_PUSH, new DataValue(T_INT, 1)), - new PSymbolInstance(I_PUSH, new DataValue(T_INT, 2))); + new PSymbolInstance(I_PUSH, new DataValue(T_INT, BigDecimal.ZERO)), + new PSymbolInstance(I_PUSH, new DataValue(T_INT, BigDecimal.ONE)), + new PSymbolInstance(I_PUSH, new DataValue(T_INT, new BigDecimal(2)))); ralambda.addCounterexample(new DefaultQuery<>(ce, sul.accepts(ce))); @@ -142,8 +143,8 @@ public void learnStackSwitchedCETest() { logger.log(Level.FINE, "HYP2: {0}", hyp); ce = Word.fromSymbols( - new PSymbolInstance(I_PUSH, new DataValue(T_INT, 0)), - new PSymbolInstance(I_POP, new DataValue(T_INT, 0))); + new PSymbolInstance(I_PUSH, new DataValue(T_INT, BigDecimal.ZERO)), + new PSymbolInstance(I_POP, new DataValue(T_INT, BigDecimal.ZERO))); ralambda.addCounterexample(new DefaultQuery<>(ce, sul.accepts(ce))); @@ -152,9 +153,9 @@ public void learnStackSwitchedCETest() { logger.log(Level.FINE, "HYP2: {0}", hyp); ce = Word.fromSymbols( - new PSymbolInstance(I_PUSH, new DataValue(T_INT, 0)), - new PSymbolInstance(I_PUSH, new DataValue(T_INT, 1)), - new PSymbolInstance(I_POP, new DataValue(T_INT, 1))); + new PSymbolInstance(I_PUSH, new DataValue(T_INT, BigDecimal.ZERO)), + new PSymbolInstance(I_PUSH, new DataValue(T_INT, BigDecimal.ONE)), + new PSymbolInstance(I_POP, new DataValue(T_INT, BigDecimal.ONE))); ralambda.addCounterexample(new DefaultQuery<>(ce, sul.accepts(ce))); ralambda.learn(); @@ -183,7 +184,7 @@ public void learnStackLongCETest() { final Map teachers = new LinkedHashMap<>(); teachers.put(T_INT, new IntegerEqualityTheory(T_INT)); - ConstraintSolver solver = new SimpleConstraintSolver(); + ConstraintSolver solver = ConstraintSolverFactory.createZ3ConstraintSolver(); MultiTheoryTreeOracle mto = new MultiTheoryTreeOracle( dwOracle, teachers, new Constants(), solver); @@ -204,10 +205,10 @@ public void learnStackLongCETest() { logger.log(Level.FINE, "HYP1: {0}", hyp); Word ce = Word.fromSymbols( - new PSymbolInstance(I_PUSH, new DataValue(T_INT, 0)), - new PSymbolInstance(I_PUSH, new DataValue(T_INT, 0)), - new PSymbolInstance(I_POP, new DataValue(T_INT, 0)), - new PSymbolInstance(I_POP, new DataValue(T_INT, 0)) + new PSymbolInstance(I_PUSH, new DataValue(T_INT, BigDecimal.ZERO)), + new PSymbolInstance(I_PUSH, new DataValue(T_INT, BigDecimal.ZERO)), + new PSymbolInstance(I_POP, new DataValue(T_INT, BigDecimal.ZERO)), + new PSymbolInstance(I_POP, new DataValue(T_INT, BigDecimal.ZERO)) ); ralambda.addCounterexample(new DefaultQuery<>(ce, sul.accepts(ce))); @@ -225,7 +226,7 @@ public void learnStackRandomTest() { Constants consts = new Constants(); RegisterAutomaton sul = AUTOMATON; DataWordOracle dwOracle = new SimulatorOracle(sul); - ConstraintSolver solver = new SimpleConstraintSolver(); + ConstraintSolver solver =ConstraintSolverFactory.createZ3ConstraintSolver(); final Map teachers = new LinkedHashMap<>(); IntegerEqualityTheory theory = new IntegerEqualityTheory(T_INT); diff --git a/src/test/java/de/learnlib/ralib/learning/ralambda/TestDistinguishingSuffixOptimization.java b/src/test/java/de/learnlib/ralib/learning/ralambda/TestDistinguishingSuffixOptimization.java index 83064e1e..963c2365 100644 --- a/src/test/java/de/learnlib/ralib/learning/ralambda/TestDistinguishingSuffixOptimization.java +++ b/src/test/java/de/learnlib/ralib/learning/ralambda/TestDistinguishingSuffixOptimization.java @@ -4,6 +4,9 @@ import java.util.Map; import java.util.Set; +import de.learnlib.ralib.smt.ConstraintSolverFactory; +import gov.nasa.jpf.constraints.api.Expression; +import gov.nasa.jpf.constraints.util.ExpressionUtil; import org.testng.Assert; import org.testng.annotations.Test; @@ -26,8 +29,7 @@ import de.learnlib.ralib.oracles.TreeOracleFactory; import de.learnlib.ralib.oracles.mto.MultiTheorySDTLogicOracle; import de.learnlib.ralib.oracles.mto.MultiTheoryTreeOracle; -import de.learnlib.ralib.solver.ConstraintSolver; -import de.learnlib.ralib.solver.simple.SimpleConstraintSolver; +import de.learnlib.ralib.smt.ConstraintSolver; import de.learnlib.ralib.theory.Theory; import de.learnlib.ralib.words.InputSymbol; import de.learnlib.ralib.words.PSymbolInstance; @@ -50,7 +52,7 @@ private RegisterAutomaton buildAutomaton() { RALocation l4 = ra.addState(false); RALocation l5 = ra.addState(true); - TransitionGuard trueGuard = new TransitionGuard(); + Expression trueGuard = ExpressionUtil.TRUE; VarMapping noMapping = new VarMapping(); Assignment noAssign = new Assignment(noMapping); @@ -81,7 +83,7 @@ public void testDistinguishingSuffixOptimization() { final Map teachers = new LinkedHashMap<>(); - ConstraintSolver solver = new SimpleConstraintSolver(); + ConstraintSolver solver = ConstraintSolverFactory.createZ3ConstraintSolver(); MultiTheoryTreeOracle mto = new MultiTheoryTreeOracle(dwOracle, teachers, new Constants(), solver); diff --git a/src/test/java/de/learnlib/ralib/learning/ralambda/TestOutputSuffixes.java b/src/test/java/de/learnlib/ralib/learning/ralambda/TestOutputSuffixes.java index 038d55f1..e3f87c82 100644 --- a/src/test/java/de/learnlib/ralib/learning/ralambda/TestOutputSuffixes.java +++ b/src/test/java/de/learnlib/ralib/learning/ralambda/TestOutputSuffixes.java @@ -8,6 +8,7 @@ import com.google.common.collect.Sets; +import de.learnlib.ralib.smt.ConstraintSolverFactory; import org.testng.Assert; import org.testng.annotations.Test; @@ -26,8 +27,8 @@ import de.learnlib.ralib.oracles.io.IOOracle; import de.learnlib.ralib.oracles.mto.MultiTheorySDTLogicOracle; import de.learnlib.ralib.oracles.mto.MultiTheoryTreeOracle; -import de.learnlib.ralib.solver.ConstraintSolver; -import de.learnlib.ralib.solver.simple.SimpleConstraintSolver; +import de.learnlib.ralib.smt.ConstraintSolver; + import de.learnlib.ralib.sul.DataWordSUL; import de.learnlib.ralib.sul.SULOracle; import de.learnlib.ralib.sul.SimulatorSUL; @@ -68,7 +69,7 @@ public void testSIPOutputSuffixesPresent() { IOCache ioCache = new IOCache(ioOracle); IOFilter ioFilter = new IOFilter(ioCache, inputs); - ConstraintSolver solver = new SimpleConstraintSolver(); + ConstraintSolver solver = ConstraintSolverFactory.createZ3ConstraintSolver(); MultiTheoryTreeOracle mto = new MultiTheoryTreeOracle( ioFilter, teachers, consts, solver); diff --git a/src/test/java/de/learnlib/ralib/learning/ralambda/TestQueryCount.java b/src/test/java/de/learnlib/ralib/learning/ralambda/TestQueryCount.java index a1ddc725..f483a043 100644 --- a/src/test/java/de/learnlib/ralib/learning/ralambda/TestQueryCount.java +++ b/src/test/java/de/learnlib/ralib/learning/ralambda/TestQueryCount.java @@ -23,7 +23,7 @@ import de.learnlib.ralib.oracles.io.IOOracle; import de.learnlib.ralib.oracles.mto.MultiTheorySDTLogicOracle; import de.learnlib.ralib.oracles.mto.MultiTheoryTreeOracle; -import de.learnlib.ralib.solver.jconstraints.JConstraintsConstraintSolver; +import de.learnlib.ralib.smt.jconstraints.JConstraintsConstraintSolver; import de.learnlib.ralib.sul.SULOracle; import de.learnlib.ralib.theory.Theory; import de.learnlib.ralib.tools.theories.DoubleInequalityTheory; diff --git a/src/test/java/de/learnlib/ralib/learning/ralambda/TestSuffixOptimization.java b/src/test/java/de/learnlib/ralib/learning/ralambda/TestSuffixOptimization.java index 0392d782..3cdcde2e 100644 --- a/src/test/java/de/learnlib/ralib/learning/ralambda/TestSuffixOptimization.java +++ b/src/test/java/de/learnlib/ralib/learning/ralambda/TestSuffixOptimization.java @@ -4,9 +4,11 @@ import static de.learnlib.ralib.example.repeater.RepeaterSUL.OECHO; import static de.learnlib.ralib.example.repeater.RepeaterSUL.TINT; +import java.math.BigDecimal; import java.util.LinkedHashMap; import java.util.Map; +import de.learnlib.ralib.smt.ConstraintSolverFactory; import org.testng.Assert; import org.testng.annotations.Test; @@ -27,8 +29,7 @@ import de.learnlib.ralib.oracles.io.IOOracle; import de.learnlib.ralib.oracles.mto.MultiTheorySDTLogicOracle; import de.learnlib.ralib.oracles.mto.MultiTheoryTreeOracle; -import de.learnlib.ralib.solver.ConstraintSolver; -import de.learnlib.ralib.solver.simple.SimpleConstraintSolver; +import de.learnlib.ralib.smt.ConstraintSolver; import de.learnlib.ralib.sul.SULOracle; import de.learnlib.ralib.theory.Theory; import de.learnlib.ralib.tools.theories.IntegerEqualityTheory; @@ -52,7 +53,7 @@ public void learnRepeaterSuffixOptTest() { IOCache ioCache = new IOCache(ioOracle); IOFilter oracle = new IOFilter(ioCache, sul.getInputSymbols()); - ConstraintSolver solver = new SimpleConstraintSolver(); + ConstraintSolver solver = ConstraintSolverFactory.createZ3ConstraintSolver(); MultiTheoryTreeOracle mto = new MultiTheoryTreeOracle(oracle, teachers, consts, solver); @@ -72,12 +73,12 @@ public void learnRepeaterSuffixOptTest() { learner.learn(); Word ce = - Word.fromSymbols(new PSymbolInstance(IPUT, new DataValue(TINT, 0)), - new PSymbolInstance(OECHO, new DataValue(TINT, 0)), - new PSymbolInstance(IPUT, new DataValue(TINT, 1)), - new PSymbolInstance(OECHO, new DataValue(TINT, 1)), - new PSymbolInstance(IPUT, new DataValue(TINT, 2)), - new PSymbolInstance(OECHO, new DataValue(TINT, 2))); + Word.fromSymbols(new PSymbolInstance(IPUT, new DataValue(TINT, BigDecimal.ZERO)), + new PSymbolInstance(OECHO, new DataValue(TINT, BigDecimal.ZERO)), + new PSymbolInstance(IPUT, new DataValue(TINT, BigDecimal.ONE)), + new PSymbolInstance(OECHO, new DataValue(TINT, BigDecimal.ONE)), + new PSymbolInstance(IPUT, new DataValue(TINT, new BigDecimal(2))), + new PSymbolInstance(OECHO, new DataValue(TINT, new BigDecimal(2)))); learner.addCounterexample(new DefaultQuery(ce, false)); diff --git a/src/test/java/de/learnlib/ralib/learning/ralambda/TestSymmetry.java b/src/test/java/de/learnlib/ralib/learning/ralambda/TestSymmetry.java index cc926f5b..a0f2afca 100644 --- a/src/test/java/de/learnlib/ralib/learning/ralambda/TestSymmetry.java +++ b/src/test/java/de/learnlib/ralib/learning/ralambda/TestSymmetry.java @@ -1,8 +1,14 @@ package de.learnlib.ralib.learning.ralambda; +import java.math.BigDecimal; import java.util.LinkedHashMap; import java.util.Map; +import de.learnlib.ralib.smt.ConstraintSolverFactory; +import gov.nasa.jpf.constraints.api.Expression; +import gov.nasa.jpf.constraints.expressions.NumericBooleanExpression; +import gov.nasa.jpf.constraints.expressions.NumericComparator; +import gov.nasa.jpf.constraints.util.ExpressionUtil; import org.testng.Assert; import org.testng.annotations.Test; @@ -32,8 +38,7 @@ import de.learnlib.ralib.oracles.TreeOracleFactory; import de.learnlib.ralib.oracles.mto.MultiTheorySDTLogicOracle; import de.learnlib.ralib.oracles.mto.MultiTheoryTreeOracle; -import de.learnlib.ralib.solver.ConstraintSolver; -import de.learnlib.ralib.solver.simple.SimpleConstraintSolver; +import de.learnlib.ralib.smt.ConstraintSolver; import de.learnlib.ralib.theory.Theory; import de.learnlib.ralib.tools.theories.IntegerEqualityTheory; import de.learnlib.ralib.words.InputSymbol; @@ -42,7 +47,7 @@ public class TestSymmetry extends RaLibTestSuite { - private static final DataType T_INT = new DataType("int", Integer.class); + private static final DataType T_INT = new DataType("int"); private static final InputSymbol A = new InputSymbol("a", new DataType[] {T_INT}); private static final InputSymbol B = new InputSymbol("b", new DataType[] {T_INT}); @@ -56,7 +61,7 @@ public void learnSymmetryExampleCT2() { final Map teachers = new LinkedHashMap<>(); teachers.put(T_INT, new IntegerEqualityTheory(T_INT)); - ConstraintSolver solver = new SimpleConstraintSolver(); + ConstraintSolver solver = ConstraintSolverFactory.createZ3ConstraintSolver(); MultiTheoryTreeOracle mto = new MultiTheoryTreeOracle(dwOracle, teachers, new Constants(), solver); @@ -74,9 +79,9 @@ public void learnSymmetryExampleCT2() { learner.learn(); Word ce = - Word.fromSymbols(new PSymbolInstance(A, new DataValue(T_INT, 1)), - new PSymbolInstance(A, new DataValue(T_INT, 2)), - new PSymbolInstance(A, new DataValue(T_INT, 1))); + Word.fromSymbols(new PSymbolInstance(A, new DataValue(T_INT, BigDecimal.ONE)), + new PSymbolInstance(A, new DataValue(T_INT, new BigDecimal(2) )), + new PSymbolInstance(A, new DataValue(T_INT, BigDecimal.ONE))); learner.addCounterexample(new DefaultQuery<>(ce, true)); learner.learn(); @@ -84,12 +89,12 @@ public void learnSymmetryExampleCT2() { // System.out.println(hyp.toString()); // System.out.println(learner.getDT()); - ce = Word.fromSymbols(new PSymbolInstance(A, new DataValue(T_INT, 1)), - new PSymbolInstance(A, new DataValue(T_INT, 2)), - new PSymbolInstance(B, new DataValue(T_INT, 3)), - new PSymbolInstance(B, new DataValue(T_INT, 4)), - new PSymbolInstance(B, new DataValue(T_INT, 2)), - new PSymbolInstance(B, new DataValue(T_INT, 1))); + ce = Word.fromSymbols(new PSymbolInstance(A, new DataValue(T_INT, BigDecimal.ONE)), + new PSymbolInstance(A, new DataValue(T_INT, new BigDecimal(2))), + new PSymbolInstance(B, new DataValue(T_INT, new BigDecimal(3) )), + new PSymbolInstance(B, new DataValue(T_INT, new BigDecimal(4))), + new PSymbolInstance(B, new DataValue(T_INT, new BigDecimal(2))), + new PSymbolInstance(B, new DataValue(T_INT, BigDecimal.ONE))); Assert.assertTrue(sul.accepts(ce)); Assert.assertFalse(hyp.accepts(ce)); @@ -121,19 +126,17 @@ private RegisterAutomaton buildCT2() { SymbolicDataValueGenerator.ParameterGenerator pgen = new SymbolicDataValueGenerator.ParameterGenerator(); SymbolicDataValue.Parameter p1 = pgen.next(T_INT); - TransitionGuard trueGuard = new TransitionGuard(); - TransitionGuard equalR1 = - new TransitionGuard(new AtomicGuardExpression(r1, Relation.EQUALS, p1)); - TransitionGuard notEqualR1 = - new TransitionGuard(new AtomicGuardExpression(r1, Relation.NOT_EQUALS, p1)); + Expression trueGuard = ExpressionUtil.TRUE; + Expression equalR1 = new NumericBooleanExpression(r1, NumericComparator.EQ, p1); + Expression notEqualR1 = new NumericBooleanExpression(r1, NumericComparator.NE, p1); - TransitionGuard disjunctionGuard = - new TransitionGuard(new Disjunction(new AtomicGuardExpression(r1, Relation.EQUALS, p1), - new AtomicGuardExpression(r2, Relation.EQUALS, p1))); + Expression disjunctionGuard = ExpressionUtil.or( + new NumericBooleanExpression(r1, NumericComparator.EQ, p1), + new NumericBooleanExpression(r2, NumericComparator.EQ, p1)); - TransitionGuard elseGuard = - new TransitionGuard(new Conjunction(new AtomicGuardExpression(r1, Relation.NOT_EQUALS, p1), - new AtomicGuardExpression(r2, Relation.NOT_EQUALS, p1))); + Expression elseGuard = ExpressionUtil.and( + new NumericBooleanExpression(r1, NumericComparator.NE, p1), + new NumericBooleanExpression(r2, NumericComparator.NE, p1)); VarMapping storeR1Mapping = new VarMapping(); @@ -194,7 +197,7 @@ public void learnSymmetryExampleCT() { final Map teachers = new LinkedHashMap<>(); teachers.put(T_INT, new IntegerEqualityTheory(T_INT)); - ConstraintSolver solver = new SimpleConstraintSolver(); + ConstraintSolver solver = ConstraintSolverFactory.createZ3ConstraintSolver(); MultiTheoryTreeOracle mto = new MultiTheoryTreeOracle(dwOracle, teachers, new Constants(), solver); @@ -210,10 +213,10 @@ public void learnSymmetryExampleCT() { learner.learn(); Word ce = Word.fromSymbols( - new PSymbolInstance(A, new DataValue(T_INT, 1)), - new PSymbolInstance(A, new DataValue(T_INT, 2)), - new PSymbolInstance(B, new DataValue(T_INT, 1)), - new PSymbolInstance(B, new DataValue(T_INT, 2))); + new PSymbolInstance(A, new DataValue(T_INT, BigDecimal.ONE)), + new PSymbolInstance(A, new DataValue(T_INT, new BigDecimal(2))), + new PSymbolInstance(B, new DataValue(T_INT, BigDecimal.ONE)), + new PSymbolInstance(B, new DataValue(T_INT, new BigDecimal(2)))); learner.addCounterexample(new DefaultQuery<>(ce, true)); learner.learn(); @@ -222,10 +225,10 @@ public void learnSymmetryExampleCT() { // System.out.println(learner.getHypothesis().toString()); ce = Word.fromSymbols( - new PSymbolInstance(A, new DataValue(T_INT, 1)), - new PSymbolInstance(B, new DataValue(T_INT, 2)), - new PSymbolInstance(B, new DataValue(T_INT, 3)), - new PSymbolInstance(B, new DataValue(T_INT, 2))); + new PSymbolInstance(A, new DataValue(T_INT, BigDecimal.ONE)), + new PSymbolInstance(B, new DataValue(T_INT, new BigDecimal(2))), + new PSymbolInstance(B, new DataValue(T_INT, new BigDecimal(3))), + new PSymbolInstance(B, new DataValue(T_INT, new BigDecimal(2)))); Assert.assertTrue(hyp.accepts(ce)); } @@ -245,12 +248,12 @@ private RegisterAutomaton buildCT() { SymbolicDataValueGenerator.ParameterGenerator pgen = new SymbolicDataValueGenerator.ParameterGenerator(); SymbolicDataValue.Parameter p1 = pgen.next(T_INT); - TransitionGuard trueGuard = new TransitionGuard(); - TransitionGuard equalR1 = new TransitionGuard(new AtomicGuardExpression(r1, Relation.EQUALS, p1)); - TransitionGuard notEqualR1 = new TransitionGuard(new AtomicGuardExpression(r1, Relation.NOT_EQUALS, p1)); - TransitionGuard disjunctionGuard = new TransitionGuard(new Disjunction( - new AtomicGuardExpression(r1, Relation.EQUALS, p1), - new AtomicGuardExpression(r2, Relation.EQUALS, p1))); + Expression trueGuard = ExpressionUtil.TRUE; + Expression equalR1 = new NumericBooleanExpression(r1, NumericComparator.EQ, p1); + Expression notEqualR1 = new NumericBooleanExpression(r1, NumericComparator.NE, p1); + Expression disjunctionGuard = ExpressionUtil.or( + new NumericBooleanExpression(r1, NumericComparator.EQ, p1), + new NumericBooleanExpression(r2, NumericComparator.EQ, p1)); VarMapping storeR1Mapping = new VarMapping(); storeR1Mapping.put(r1, p1); diff --git a/src/test/java/de/learnlib/ralib/learning/ralambda/TestUnknownMemorable.java b/src/test/java/de/learnlib/ralib/learning/ralambda/TestUnknownMemorable.java index 8fea978e..451ac3d5 100644 --- a/src/test/java/de/learnlib/ralib/learning/ralambda/TestUnknownMemorable.java +++ b/src/test/java/de/learnlib/ralib/learning/ralambda/TestUnknownMemorable.java @@ -1,5 +1,6 @@ package de.learnlib.ralib.learning.ralambda; +import java.math.BigDecimal; import java.util.ArrayList; import java.util.Collection; import java.util.Deque; @@ -10,6 +11,11 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; +import de.learnlib.ralib.smt.ConstraintSolverFactory; +import gov.nasa.jpf.constraints.api.Expression; +import gov.nasa.jpf.constraints.expressions.NumericBooleanExpression; +import gov.nasa.jpf.constraints.expressions.NumericComparator; +import gov.nasa.jpf.constraints.util.ExpressionUtil; import org.testng.Assert; import org.testng.annotations.Test; @@ -42,8 +48,7 @@ import de.learnlib.ralib.oracles.io.IOOracle; import de.learnlib.ralib.oracles.mto.MultiTheorySDTLogicOracle; import de.learnlib.ralib.oracles.mto.MultiTheoryTreeOracle; -import de.learnlib.ralib.solver.ConstraintSolver; -import de.learnlib.ralib.solver.simple.SimpleConstraintSolver; +import de.learnlib.ralib.smt.ConstraintSolver; import de.learnlib.ralib.sul.DataWordSUL; import de.learnlib.ralib.sul.SULOracle; import de.learnlib.ralib.sul.SimulatorSUL; @@ -57,7 +62,7 @@ public class TestUnknownMemorable extends RaLibTestSuite { - private static final DataType T_INT = new DataType("int", Integer.class); + private static final DataType T_INT = new DataType("int"); private static final InputSymbol IPUT = new InputSymbol("put", new DataType[] {T_INT}); @@ -107,12 +112,12 @@ private RegisterAutomaton buildAutomaton() { SymbolicDataValue.Parameter p1 = pgen.next(T_INT); // guards - GuardExpression equal = new AtomicGuardExpression(r1, Relation.EQUALS, p1); - GuardExpression notEqual = new AtomicGuardExpression(r1, Relation.NOT_EQUALS, p1); + Expression equal = new NumericBooleanExpression(r1, NumericComparator.EQ, p1); + Expression notEqual = new NumericBooleanExpression(r1, NumericComparator.NE, p1); - TransitionGuard equalGuard = new TransitionGuard(equal); - TransitionGuard notEqualGuard = new TransitionGuard(notEqual); - TransitionGuard trueGuard = new TransitionGuard(); + Expression equalGuard = equal; + Expression notEqualGuard = notEqual; + Expression trueGuard = ExpressionUtil.TRUE; // assignments VarMapping store = new VarMapping(); @@ -188,7 +193,7 @@ public void testUnknownMemorable() { final Map teachers = new LinkedHashMap<>(); teachers.put(T_INT, new IntegerEqualityTheory(T_INT)); - ConstraintSolver solver = new SimpleConstraintSolver(); + ConstraintSolver solver = ConstraintSolverFactory.createZ3ConstraintSolver(); DataWordSUL sul = new SimulatorSUL(ra, teachers, consts); final ParameterizedSymbol ERROR = new OutputSymbol("_io_err", new DataType[]{}); @@ -208,25 +213,25 @@ public void testUnknownMemorable() { ralambda.learn(); Word ce = Word.fromSymbols( - new PSymbolInstance(IPUT, new DataValue(T_INT, 0)), - new PSymbolInstance(OECHO, new DataValue(T_INT, 0)), - new PSymbolInstance(IPUT, new DataValue(T_INT, 1)), - new PSymbolInstance(OECHO, new DataValue(T_INT, 1)), + new PSymbolInstance(IPUT, new DataValue(T_INT, BigDecimal.ZERO)), + new PSymbolInstance(OECHO, new DataValue(T_INT, BigDecimal.ZERO)), + new PSymbolInstance(IPUT, new DataValue(T_INT, BigDecimal.ONE)), + new PSymbolInstance(OECHO, new DataValue(T_INT, BigDecimal.ONE)), new PSymbolInstance(IQUERY), - new PSymbolInstance(OYES, new DataValue(T_INT, 1))); + new PSymbolInstance(OYES, new DataValue(T_INT, BigDecimal.ONE))); ralambda.addCounterexample(new DefaultQuery(ce, true)); ralambda.learn(); ce = Word.fromSymbols( - new PSymbolInstance(IPUT, new DataValue(T_INT, 0)), - new PSymbolInstance(OECHO, new DataValue(T_INT, 0)), + new PSymbolInstance(IPUT, new DataValue(T_INT, BigDecimal.ZERO)), + new PSymbolInstance(OECHO, new DataValue(T_INT, BigDecimal.ZERO)), new PSymbolInstance(IHELLO), new PSymbolInstance(OHELLO), - new PSymbolInstance(IPUT, new DataValue(T_INT, 0)), - new PSymbolInstance(OECHO, new DataValue(T_INT, 0)), + new PSymbolInstance(IPUT, new DataValue(T_INT, BigDecimal.ZERO)), + new PSymbolInstance(OECHO, new DataValue(T_INT, BigDecimal.ZERO)), new PSymbolInstance(IQUERY), - new PSymbolInstance(ONO, new DataValue(T_INT, 0))); + new PSymbolInstance(ONO, new DataValue(T_INT, BigDecimal.ZERO))); boolean acc = ralambda.getHypothesis().accepts(ce); if (!acc) { ralambda.addCounterexample(new DefaultQuery(ce, true)); @@ -266,7 +271,7 @@ public void testSkippingMemorable() { IOCache ioCache = new IOCache(ioOracle); IOFilter ioFilter = new IOFilter(ioCache, inputs); - ConstraintSolver solver = new SimpleConstraintSolver(); + ConstraintSolver solver = ConstraintSolverFactory.createZ3ConstraintSolver(); MultiTheoryTreeOracle mto = new MultiTheoryTreeOracle( ioFilter, teachers, consts, solver); @@ -326,7 +331,7 @@ public void testSkippingMemorable2() { IOCache ioCache = new IOCache(ioOracle); IOFilter ioFilter = new IOFilter(ioCache, inputs); - ConstraintSolver solver = new SimpleConstraintSolver(); + ConstraintSolver solver = ConstraintSolverFactory.createZ3ConstraintSolver(); MultiTheoryTreeOracle mto = new MultiTheoryTreeOracle( ioFilter, teachers, consts, solver); @@ -409,7 +414,7 @@ private static DefaultQuery buildSIPCounterExample(Str return null; DataType[] dt = actionSymbols[idx].getPtypes(); PSymbolInstance psi = dt.length > 0 ? - new PSymbolInstance(actionSymbols[idx], new DataValue(dt[0], dv[i])) : + new PSymbolInstance(actionSymbols[idx], new DataValue(dt[0], new BigDecimal(dv[i]))) : new PSymbolInstance(actionSymbols[idx]); ce = ce.append(psi); } diff --git a/src/test/java/de/learnlib/ralib/learning/rastar/CellTest.java b/src/test/java/de/learnlib/ralib/learning/rastar/CellTest.java index 1976c414..9de0fef9 100644 --- a/src/test/java/de/learnlib/ralib/learning/rastar/CellTest.java +++ b/src/test/java/de/learnlib/ralib/learning/rastar/CellTest.java @@ -22,6 +22,7 @@ import static de.learnlib.ralib.example.login.LoginAutomatonExample.T_PWD; import static de.learnlib.ralib.example.login.LoginAutomatonExample.T_UID; +import java.math.BigDecimal; import java.util.Arrays; import java.util.logging.Level; @@ -47,16 +48,16 @@ public void testCellCreation() { final Word prefix = Word.fromSymbols( new PSymbolInstance(I_REGISTER, - new DataValue(T_UID, 1), - new DataValue(T_PWD, 1)), + new DataValue(T_UID, BigDecimal.ONE), + new DataValue(T_PWD, BigDecimal.ONE)), new PSymbolInstance(I_LOGIN, - new DataValue(T_UID, 2), - new DataValue(T_PWD, 2))); + new DataValue(T_UID, new BigDecimal(2)), + new DataValue(T_PWD, new BigDecimal(2)))); final Word longsuffix = Word.fromSymbols( new PSymbolInstance(I_LOGIN, - new DataValue(T_UID, 1), - new DataValue(T_PWD, 1)), + new DataValue(T_UID, BigDecimal.ONE), + new DataValue(T_PWD, BigDecimal.ONE)), new PSymbolInstance(I_LOGOUT)); diff --git a/src/test/java/de/learnlib/ralib/learning/rastar/LearnBoundedListTest.java b/src/test/java/de/learnlib/ralib/learning/rastar/LearnBoundedListTest.java index 19e48c12..baa0df06 100644 --- a/src/test/java/de/learnlib/ralib/learning/rastar/LearnBoundedListTest.java +++ b/src/test/java/de/learnlib/ralib/learning/rastar/LearnBoundedListTest.java @@ -28,8 +28,8 @@ import de.learnlib.ralib.oracles.TreeOracleFactory; import de.learnlib.ralib.oracles.mto.MultiTheorySDTLogicOracle; import de.learnlib.ralib.oracles.mto.MultiTheoryTreeOracle; -import de.learnlib.ralib.solver.ConstraintSolver; -import de.learnlib.ralib.solver.ConstraintSolverFactory; +import de.learnlib.ralib.smt.ConstraintSolver; +import de.learnlib.ralib.smt.ConstraintSolverFactory; import de.learnlib.ralib.theory.Theory; import de.learnlib.ralib.tools.theories.IntegerEqualityTheory; import de.learnlib.ralib.words.PSymbolInstance; @@ -61,7 +61,7 @@ public void learnBoundedListOracleTest() { private Hypothesis learnBoundedListDWOracle(int size, boolean useNull, Word[] ces) { Constants consts = new Constants(); if (useNull) { - consts.put(new Constant(INT_TYPE, 1), new DataValue<>(INT_TYPE, BoundedList.NULL_VALUE)); + consts.put(new Constant(INT_TYPE, 1), new DataValue(INT_TYPE, BoundedList.NULL_VALUE)); } BoundedListDataWordOracle dwOracle = new BoundedListDataWordOracle(() -> new BoundedList(size, useNull)); diff --git a/src/test/java/de/learnlib/ralib/learning/rastar/LearnLoginTest.java b/src/test/java/de/learnlib/ralib/learning/rastar/LearnLoginTest.java index b54fb693..93cf83a3 100644 --- a/src/test/java/de/learnlib/ralib/learning/rastar/LearnLoginTest.java +++ b/src/test/java/de/learnlib/ralib/learning/rastar/LearnLoginTest.java @@ -23,10 +23,12 @@ import static de.learnlib.ralib.example.login.LoginAutomatonExample.T_PWD; import static de.learnlib.ralib.example.login.LoginAutomatonExample.T_UID; +import java.math.BigDecimal; import java.util.LinkedHashMap; import java.util.Map; import java.util.logging.Level; +import de.learnlib.ralib.smt.ConstraintSolverFactory; import org.testng.Assert; import org.testng.annotations.Test; @@ -42,8 +44,7 @@ import de.learnlib.ralib.oracles.TreeOracleFactory; import de.learnlib.ralib.oracles.mto.MultiTheorySDTLogicOracle; import de.learnlib.ralib.oracles.mto.MultiTheoryTreeOracle; -import de.learnlib.ralib.solver.ConstraintSolver; -import de.learnlib.ralib.solver.simple.SimpleConstraintSolver; +import de.learnlib.ralib.smt.ConstraintSolver; import de.learnlib.ralib.theory.Theory; import de.learnlib.ralib.tools.theories.IntegerEqualityTheory; import de.learnlib.ralib.words.PSymbolInstance; @@ -66,7 +67,7 @@ public void learnLoginExample() { teachers.put(T_UID, new IntegerEqualityTheory(T_UID)); teachers.put(T_PWD, new IntegerEqualityTheory(T_PWD)); - ConstraintSolver solver = new SimpleConstraintSolver(); + ConstraintSolver solver = ConstraintSolverFactory.createZ3ConstraintSolver(); MultiTheoryTreeOracle mto = new MultiTheoryTreeOracle( dwOracle, teachers, new Constants(), solver); @@ -85,9 +86,9 @@ public void learnLoginExample() { Word ce = Word.fromSymbols( new PSymbolInstance(I_REGISTER, - new DataValue(T_UID, 1), new DataValue(T_PWD, 1)), + new DataValue(T_UID, BigDecimal.ONE), new DataValue(T_PWD, BigDecimal.ONE)), new PSymbolInstance(I_LOGIN, - new DataValue(T_UID, 1), new DataValue(T_PWD, 1))); + new DataValue(T_UID, BigDecimal.ONE), new DataValue(T_PWD, BigDecimal.ONE))); rastar.addCounterexample(new DefaultQuery<>(ce, sul.accepts(ce))); diff --git a/src/test/java/de/learnlib/ralib/learning/rastar/LearnMixedIOTest.java b/src/test/java/de/learnlib/ralib/learning/rastar/LearnMixedIOTest.java index 13d71738..64cb97f1 100644 --- a/src/test/java/de/learnlib/ralib/learning/rastar/LearnMixedIOTest.java +++ b/src/test/java/de/learnlib/ralib/learning/rastar/LearnMixedIOTest.java @@ -44,7 +44,7 @@ import de.learnlib.ralib.oracles.io.IOOracle; import de.learnlib.ralib.oracles.mto.MultiTheorySDTLogicOracle; import de.learnlib.ralib.oracles.mto.MultiTheoryTreeOracle; -import de.learnlib.ralib.solver.jconstraints.JConstraintsConstraintSolver; +import de.learnlib.ralib.smt.jconstraints.JConstraintsConstraintSolver; import de.learnlib.ralib.sul.DataWordSUL; import de.learnlib.ralib.sul.SULOracle; import de.learnlib.ralib.sul.SimulatorSUL; diff --git a/src/test/java/de/learnlib/ralib/learning/rastar/LearnPQIOTest.java b/src/test/java/de/learnlib/ralib/learning/rastar/LearnPQIOTest.java index b16eb079..2fddacf2 100644 --- a/src/test/java/de/learnlib/ralib/learning/rastar/LearnPQIOTest.java +++ b/src/test/java/de/learnlib/ralib/learning/rastar/LearnPQIOTest.java @@ -45,7 +45,7 @@ import de.learnlib.ralib.oracles.io.IOOracle; import de.learnlib.ralib.oracles.mto.MultiTheorySDTLogicOracle; import de.learnlib.ralib.oracles.mto.MultiTheoryTreeOracle; -import de.learnlib.ralib.solver.jconstraints.JConstraintsConstraintSolver; +import de.learnlib.ralib.smt.jconstraints.JConstraintsConstraintSolver; import de.learnlib.ralib.sul.SULOracle; import de.learnlib.ralib.theory.Theory; import de.learnlib.ralib.tools.theories.DoubleInequalityTheory; @@ -108,6 +108,7 @@ public void learnLoginExampleIO() { check++; rastar.learn(); Hypothesis hyp = rastar.getHypothesis(); + //System.out.println(hyp); DefaultQuery ce = iowalk.findCounterExample(hyp, null); diff --git a/src/test/java/de/learnlib/ralib/learning/rastar/LearnPQTest.java b/src/test/java/de/learnlib/ralib/learning/rastar/LearnPQTest.java index 511efc30..c7c952be 100644 --- a/src/test/java/de/learnlib/ralib/learning/rastar/LearnPQTest.java +++ b/src/test/java/de/learnlib/ralib/learning/rastar/LearnPQTest.java @@ -42,7 +42,7 @@ import de.learnlib.ralib.oracles.TreeOracleFactory; import de.learnlib.ralib.oracles.mto.MultiTheorySDTLogicOracle; import de.learnlib.ralib.oracles.mto.MultiTheoryTreeOracle; -import de.learnlib.ralib.solver.jconstraints.JConstraintsConstraintSolver; +import de.learnlib.ralib.smt.jconstraints.JConstraintsConstraintSolver; import de.learnlib.ralib.theory.Theory; import de.learnlib.ralib.tools.theories.DoubleInequalityTheory; import de.learnlib.ralib.words.PSymbolInstance; diff --git a/src/test/java/de/learnlib/ralib/learning/rastar/LearnPalindromeIOTest.java b/src/test/java/de/learnlib/ralib/learning/rastar/LearnPalindromeIOTest.java index c06f8a2c..1bdd8184 100644 --- a/src/test/java/de/learnlib/ralib/learning/rastar/LearnPalindromeIOTest.java +++ b/src/test/java/de/learnlib/ralib/learning/rastar/LearnPalindromeIOTest.java @@ -20,6 +20,7 @@ import java.util.Map; import java.util.logging.Level; +import de.learnlib.ralib.smt.ConstraintSolverFactory; import org.testng.Assert; import org.testng.annotations.Test; @@ -39,8 +40,7 @@ import de.learnlib.ralib.oracles.io.IOOracle; import de.learnlib.ralib.oracles.mto.MultiTheorySDTLogicOracle; import de.learnlib.ralib.oracles.mto.MultiTheoryTreeOracle; -import de.learnlib.ralib.solver.ConstraintSolver; -import de.learnlib.ralib.solver.simple.SimpleConstraintSolver; +import de.learnlib.ralib.smt.ConstraintSolver; import de.learnlib.ralib.sul.DataWordSUL; import de.learnlib.ralib.sul.SULOracle; import de.learnlib.ralib.sul.SimulatorSUL; @@ -75,12 +75,12 @@ public void learnPalindromeIO() { final Map teachers = new LinkedHashMap<>(); loader.getDataTypes().stream().forEach((t) -> { - TypedTheory theory = new IntegerEqualityTheory(t); + TypedTheory theory = new IntegerEqualityTheory(t); theory.setUseSuffixOpt(true); teachers.put(t, theory); }); - ConstraintSolver solver = new SimpleConstraintSolver(); + ConstraintSolver solver = ConstraintSolverFactory.createZ3ConstraintSolver(); DataWordSUL sul = new SimulatorSUL(model, teachers, consts); IOOracle ioOracle = new SULOracle(sul, ERROR); diff --git a/src/test/java/de/learnlib/ralib/learning/rastar/LearnSipIOTest.java b/src/test/java/de/learnlib/ralib/learning/rastar/LearnSipIOTest.java index b8b48638..9f3286f7 100644 --- a/src/test/java/de/learnlib/ralib/learning/rastar/LearnSipIOTest.java +++ b/src/test/java/de/learnlib/ralib/learning/rastar/LearnSipIOTest.java @@ -21,6 +21,7 @@ import java.util.Random; import java.util.logging.Level; +import de.learnlib.ralib.smt.ConstraintSolverFactory; import org.testng.Assert; import org.testng.annotations.Test; @@ -43,8 +44,7 @@ import de.learnlib.ralib.oracles.io.IOOracle; import de.learnlib.ralib.oracles.mto.MultiTheorySDTLogicOracle; import de.learnlib.ralib.oracles.mto.MultiTheoryTreeOracle; -import de.learnlib.ralib.solver.ConstraintSolver; -import de.learnlib.ralib.solver.simple.SimpleConstraintSolver; +import de.learnlib.ralib.smt.ConstraintSolver; import de.learnlib.ralib.sul.DataWordSUL; import de.learnlib.ralib.sul.SULOracle; import de.learnlib.ralib.sul.SimulatorSUL; @@ -97,7 +97,7 @@ public void learnSipIO() { ((EqualityTheory)t).setFreshValues(true, ioCache); }); - ConstraintSolver solver = new SimpleConstraintSolver(); + ConstraintSolver solver = ConstraintSolverFactory.createZ3ConstraintSolver(); MultiTheoryTreeOracle mto = new MultiTheoryTreeOracle( ioFilter, teachers, consts, solver); diff --git a/src/test/java/de/learnlib/ralib/learning/rastar/RowTest.java b/src/test/java/de/learnlib/ralib/learning/rastar/RowTest.java index 5dc79156..d477c3f4 100644 --- a/src/test/java/de/learnlib/ralib/learning/rastar/RowTest.java +++ b/src/test/java/de/learnlib/ralib/learning/rastar/RowTest.java @@ -21,6 +21,7 @@ import static de.learnlib.ralib.example.login.LoginAutomatonExample.T_PWD; import static de.learnlib.ralib.example.login.LoginAutomatonExample.T_UID; +import java.math.BigDecimal; import java.util.Arrays; import java.util.logging.Level; @@ -47,25 +48,25 @@ public void testRowEquivalence() { final Word prefix1 = Word.fromSymbols( new PSymbolInstance(I_LOGIN, - new DataValue(T_UID, 1), - new DataValue(T_PWD, 1)), + new DataValue(T_UID, BigDecimal.ONE), + new DataValue(T_PWD, BigDecimal.ONE)), new PSymbolInstance(I_REGISTER, - new DataValue(T_UID, 2), - new DataValue(T_PWD, 2))); + new DataValue(T_UID, new BigDecimal(2)), + new DataValue(T_PWD, new BigDecimal(2)))); final Word prefix2 = Word.fromSymbols( new PSymbolInstance(I_REGISTER, - new DataValue(T_UID, 1), - new DataValue(T_PWD, 1)), + new DataValue(T_UID, BigDecimal.ONE), + new DataValue(T_PWD, BigDecimal.ONE)), new PSymbolInstance(I_LOGIN, - new DataValue(T_UID, 2), - new DataValue(T_PWD, 2))); + new DataValue(T_UID, new BigDecimal(2)), + new DataValue(T_PWD, new BigDecimal(2)))); final Word suffix1 = Word.epsilon(); final Word suffix2 = Word.fromSymbols( new PSymbolInstance(I_LOGIN, - new DataValue(T_UID, 1), - new DataValue(T_PWD, 1))); + new DataValue(T_UID, BigDecimal.ONE), + new DataValue(T_PWD, BigDecimal.ONE))); final SymbolicSuffix symSuffix1 = new SymbolicSuffix(prefix1, suffix1); final SymbolicSuffix symSuffix2 = new SymbolicSuffix(prefix1, suffix2); diff --git a/src/test/java/de/learnlib/ralib/oracles/mto/ConstantsSDTBranchingTest.java b/src/test/java/de/learnlib/ralib/oracles/mto/ConstantsSDTBranchingTest.java index f07e6e92..e48ff7d5 100644 --- a/src/test/java/de/learnlib/ralib/oracles/mto/ConstantsSDTBranchingTest.java +++ b/src/test/java/de/learnlib/ralib/oracles/mto/ConstantsSDTBranchingTest.java @@ -16,11 +16,13 @@ */ package de.learnlib.ralib.oracles.mto; +import java.math.BigDecimal; import java.util.Arrays; import java.util.LinkedHashMap; import java.util.Map; import java.util.logging.Level; +import de.learnlib.ralib.smt.ConstraintSolverFactory; import org.testng.Assert; import org.testng.annotations.Test; @@ -34,7 +36,7 @@ import de.learnlib.ralib.learning.SymbolicSuffix; import de.learnlib.ralib.oracles.Branching; import de.learnlib.ralib.oracles.TreeQueryResult; -import de.learnlib.ralib.solver.simple.SimpleConstraintSolver; + import de.learnlib.ralib.sul.DataWordSUL; import de.learnlib.ralib.sul.SimulatorSUL; import de.learnlib.ralib.theory.Theory; @@ -72,7 +74,7 @@ public void testModelswithOutput() { DataWordSUL sul = new SimulatorSUL(model, teachers, consts); MultiTheoryTreeOracle mto = TestUtil.createMTO(sul, ERROR, - teachers, consts, new SimpleConstraintSolver(), inputs); + teachers, consts, ConstraintSolverFactory.createZ3ConstraintSolver(), inputs); DataType intType = TestUtil.getType("int", loader.getDataTypes()); @@ -91,8 +93,8 @@ public void testModelswithOutput() { ParameterizedSymbol oframe = new OutputSymbol( "OFrame", new DataType[] {intType, intType}); - DataValue d2 = new DataValue(intType, 2); - //DataValue c1 = new DataValue(intType, 0); + DataValue d2 = new DataValue(intType, new BigDecimal(2)); + //DataValue c1 = new DataValue(intType, BigDecimal.ZERO); //****** ROW: IIn OOK ISendFrame Word prefix = Word.fromSymbols( @@ -112,7 +114,7 @@ public void testModelswithOutput() { logger.log(Level.FINE, "PIV: {0}", tqr.getPiv()); logger.log(Level.FINE, "SDT: {0}", tqr.getSdt()); - final String expected = "[(r1==p1) && (c1==p2), (r1==p1) && (c1!=p2), (r1!=p1) && TRUE]"; + final String expected = "[(('r1' == 'p1') && ('c1' == 'p2')), (('r1' == 'p1') && ('c1' != 'p2')), (('r1' != 'p1') && true)]"; Branching b = mto.getInitialBranching(prefix, oframe, tqr.getPiv(), tqr.getSdt()); String bString = Arrays.toString(b.getBranches().values().toArray()); diff --git a/src/test/java/de/learnlib/ralib/oracles/mto/FreshValuesTest.java b/src/test/java/de/learnlib/ralib/oracles/mto/FreshValuesTest.java index da3aa902..fe5cad02 100644 --- a/src/test/java/de/learnlib/ralib/oracles/mto/FreshValuesTest.java +++ b/src/test/java/de/learnlib/ralib/oracles/mto/FreshValuesTest.java @@ -16,10 +16,12 @@ */ package de.learnlib.ralib.oracles.mto; +import java.math.BigDecimal; import java.util.LinkedHashMap; import java.util.Map; import java.util.logging.Level; +import de.learnlib.ralib.smt.ConstraintSolverFactory; import org.testng.Assert; import org.testng.annotations.Test; @@ -35,7 +37,6 @@ import de.learnlib.ralib.oracles.io.IOCache; import de.learnlib.ralib.oracles.io.IOFilter; import de.learnlib.ralib.oracles.io.IOOracle; -import de.learnlib.ralib.solver.simple.SimpleConstraintSolver; import de.learnlib.ralib.sul.DataWordSUL; import de.learnlib.ralib.sul.SULOracle; import de.learnlib.ralib.sul.SimulatorSUL; @@ -80,7 +81,7 @@ public void testModelswithOutput() { IOFilter ioFilter = new IOFilter(ioCache, inputs); MultiTheoryTreeOracle mto = new MultiTheoryTreeOracle( - ioFilter, teachers, consts, new SimpleConstraintSolver()); + ioFilter, teachers, consts, ConstraintSolverFactory.createZ3ConstraintSolver()); teachers.values().stream().forEach((t) -> { ((EqualityTheory)t).setFreshValues(true, ioCache); @@ -104,9 +105,9 @@ public void testModelswithOutput() { ParameterizedSymbol onok = new OutputSymbol( "ONOK", new DataType[] {}); - DataValue d0 = new DataValue(intType, 0); - DataValue d1 = new DataValue(intType, 1); - DataValue d2 = new DataValue(intType, 2); + DataValue d0 = new DataValue(intType, BigDecimal.ZERO); + DataValue d1 = new DataValue(intType, BigDecimal.ONE); + DataValue d2 = new DataValue(intType, new BigDecimal(2)); // IPut[0[int]] OPut[1[int]] IGet[2[int]] ONOK[] [p2>r1,p1>r2,p3>r3,] [] Word prefix1 = Word.fromSymbols( @@ -115,9 +116,9 @@ public void testModelswithOutput() { new PSymbolInstance(iget, d2), new PSymbolInstance(onok)); - DataValue d3 = new DataValue(intType, 3); - DataValue d4 = new DataValue(intType, 4); - DataValue d5 = new DataValue(intType, 5); + DataValue d3 = new DataValue(intType, new BigDecimal(3)); + DataValue d4 = new DataValue(intType, new BigDecimal(4)); + DataValue d5 = new DataValue(intType, new BigDecimal(5)); // [s2, s4]((IGet[s1] ONOK[] IPut[s2] OPut[s3] IGet[s4] ONOK[] IPut[s5] ONOK[])) Word suffix = Word.fromSymbols( diff --git a/src/test/java/de/learnlib/ralib/oracles/mto/InstantiateSymbolicWordTest.java b/src/test/java/de/learnlib/ralib/oracles/mto/InstantiateSymbolicWordTest.java index 691faf94..4ef583df 100644 --- a/src/test/java/de/learnlib/ralib/oracles/mto/InstantiateSymbolicWordTest.java +++ b/src/test/java/de/learnlib/ralib/oracles/mto/InstantiateSymbolicWordTest.java @@ -5,9 +5,15 @@ import static de.learnlib.ralib.example.stack.StackAutomatonExample.I_PUSH; import static de.learnlib.ralib.example.stack.StackAutomatonExample.T_INT; +import java.math.BigDecimal; import java.util.LinkedHashMap; import java.util.Map; +import de.learnlib.ralib.smt.ConstraintSolverFactory; +import gov.nasa.jpf.constraints.api.Expression; +import gov.nasa.jpf.constraints.expressions.NumericBooleanExpression; +import gov.nasa.jpf.constraints.expressions.NumericComparator; +import gov.nasa.jpf.constraints.util.ExpressionUtil; import org.testng.Assert; import org.testng.annotations.Test; @@ -31,8 +37,8 @@ import de.learnlib.ralib.oracles.DataWordOracle; import de.learnlib.ralib.oracles.SimulatorOracle; import de.learnlib.ralib.oracles.TreeQueryResult; -import de.learnlib.ralib.solver.ConstraintSolver; -import de.learnlib.ralib.solver.simple.SimpleConstraintSolver; +import de.learnlib.ralib.smt.ConstraintSolver; + import de.learnlib.ralib.theory.Theory; import de.learnlib.ralib.tools.theories.IntegerEqualityTheory; import de.learnlib.ralib.words.InputSymbol; @@ -49,17 +55,17 @@ public void testInstantiateStack() { final Map teachers = new LinkedHashMap<>(); teachers.put(T_INT, new IntegerEqualityTheory(T_INT)); - ConstraintSolver solver = new SimpleConstraintSolver(); + ConstraintSolver solver = ConstraintSolverFactory.createZ3ConstraintSolver(); MultiTheoryTreeOracle mto = new MultiTheoryTreeOracle( dwOracle, teachers, new Constants(), solver); Word prefix = Word.fromSymbols( - new PSymbolInstance(I_PUSH, new DataValue(T_INT, 0))); + new PSymbolInstance(I_PUSH, new DataValue(T_INT, BigDecimal.ZERO))); Word suffix = Word.fromSymbols( - new PSymbolInstance(I_PUSH, new DataValue(T_INT, 1)), - new PSymbolInstance(I_POP, new DataValue(T_INT, 1)), - new PSymbolInstance(I_POP, new DataValue(T_INT, 0))); + new PSymbolInstance(I_PUSH, new DataValue(T_INT, BigDecimal.ONE)), + new PSymbolInstance(I_POP, new DataValue(T_INT, BigDecimal.ONE)), + new PSymbolInstance(I_POP, new DataValue(T_INT, BigDecimal.ZERO))); SymbolicSuffix symbSuffix = new SymbolicSuffix(prefix, suffix); TreeQueryResult tqr = mto.treeQuery(prefix, symbSuffix); @@ -67,20 +73,20 @@ public void testInstantiateStack() { Map, Boolean> words = mto.instantiate(prefix, symbSuffix, tqr.getSdt(), tqr.getPiv()); Word p1 = Word.fromSymbols( - new PSymbolInstance(I_PUSH, new DataValue(T_INT, 0)), - new PSymbolInstance(I_PUSH, new DataValue(T_INT, 1)), - new PSymbolInstance(I_POP, new DataValue(T_INT, 1)), - new PSymbolInstance(I_POP, new DataValue(T_INT, 0))); + new PSymbolInstance(I_PUSH, new DataValue(T_INT, BigDecimal.ZERO)), + new PSymbolInstance(I_PUSH, new DataValue(T_INT, BigDecimal.ONE)), + new PSymbolInstance(I_POP, new DataValue(T_INT, BigDecimal.ONE)), + new PSymbolInstance(I_POP, new DataValue(T_INT, BigDecimal.ZERO))); Word p2 = Word.fromSymbols( - new PSymbolInstance(I_PUSH, new DataValue(T_INT, 0)), - new PSymbolInstance(I_PUSH, new DataValue(T_INT, 1)), - new PSymbolInstance(I_POP, new DataValue(T_INT, 1)), - new PSymbolInstance(I_POP, new DataValue(T_INT, 2))); + new PSymbolInstance(I_PUSH, new DataValue(T_INT, BigDecimal.ZERO)), + new PSymbolInstance(I_PUSH, new DataValue(T_INT, BigDecimal.ONE)), + new PSymbolInstance(I_POP, new DataValue(T_INT, BigDecimal.ONE)), + new PSymbolInstance(I_POP, new DataValue(T_INT, new BigDecimal(2)))); Word p3 = Word.fromSymbols( - new PSymbolInstance(I_PUSH, new DataValue(T_INT, 0)), - new PSymbolInstance(I_PUSH, new DataValue(T_INT, 1)), - new PSymbolInstance(I_POP, new DataValue(T_INT, 2)), - new PSymbolInstance(I_POP, new DataValue(T_INT, 3))); + new PSymbolInstance(I_PUSH, new DataValue(T_INT, BigDecimal.ZERO)), + new PSymbolInstance(I_PUSH, new DataValue(T_INT, BigDecimal.ONE)), + new PSymbolInstance(I_POP, new DataValue(T_INT, new BigDecimal(2) )), + new PSymbolInstance(I_POP, new DataValue(T_INT, new BigDecimal(3) ))); Assert.assertEquals(words.size(), 3); Assert.assertTrue(words.containsKey(p1) && @@ -107,12 +113,12 @@ public void testInstantiateWithSuffixOpt() { SymbolicDataValue.Parameter p1 = pgen.next(T_INT); // guards - GuardExpression equal = new AtomicGuardExpression(r1, Relation.EQUALS, p1); - GuardExpression notEqual = new AtomicGuardExpression(r1, Relation.NOT_EQUALS, p1); + Expression equal = new NumericBooleanExpression(r1, NumericComparator.EQ, p1); + Expression notEqual = new NumericBooleanExpression(r1, NumericComparator.NE, p1); - TransitionGuard equalGuard = new TransitionGuard(equal); - TransitionGuard notEqualGuard = new TransitionGuard(notEqual); - TransitionGuard trueGuard = new TransitionGuard(); + Expression equalGuard = equal; + Expression notEqualGuard = notEqual; + Expression trueGuard = ExpressionUtil.TRUE; // assignments VarMapping store = new VarMapping(); @@ -140,14 +146,14 @@ public void testInstantiateWithSuffixOpt() { DataWordOracle dwOracle = new SimulatorOracle(ra); MultiTheoryTreeOracle mto = new MultiTheoryTreeOracle( - dwOracle, teachers, new Constants(), new SimpleConstraintSolver()); + dwOracle, teachers, new Constants(), ConstraintSolverFactory.createZ3ConstraintSolver()); Word prefix = Word.fromSymbols( - new PSymbolInstance(A, new DataValue(T_INT, 0)), - new PSymbolInstance(B, new DataValue(T_INT, 0))); + new PSymbolInstance(A, new DataValue(T_INT, BigDecimal.ZERO)), + new PSymbolInstance(B, new DataValue(T_INT, BigDecimal.ZERO))); Word suffix = Word.fromSymbols( - new PSymbolInstance(A, new DataValue(T_INT, 1)), - new PSymbolInstance(B, new DataValue(T_INT, 1))); + new PSymbolInstance(A, new DataValue(T_INT, BigDecimal.ONE)), + new PSymbolInstance(B, new DataValue(T_INT, BigDecimal.ONE))); SymbolicSuffix symSuffix = new SymbolicSuffix(prefix, suffix); TreeQueryResult tqr = mto.treeQuery(prefix, symSuffix); diff --git a/src/test/java/de/learnlib/ralib/oracles/mto/LoginBranchingTest.java b/src/test/java/de/learnlib/ralib/oracles/mto/LoginBranchingTest.java index 97afab48..309c533f 100644 --- a/src/test/java/de/learnlib/ralib/oracles/mto/LoginBranchingTest.java +++ b/src/test/java/de/learnlib/ralib/oracles/mto/LoginBranchingTest.java @@ -22,11 +22,13 @@ import static de.learnlib.ralib.example.login.LoginAutomatonExample.T_PWD; import static de.learnlib.ralib.example.login.LoginAutomatonExample.T_UID; +import java.math.BigDecimal; import java.util.Arrays; import java.util.LinkedHashMap; import java.util.Map; import java.util.logging.Level; +import de.learnlib.ralib.smt.ConstraintSolverFactory; import org.testng.Assert; import org.testng.annotations.Test; @@ -43,8 +45,7 @@ import de.learnlib.ralib.oracles.DataWordOracle; import de.learnlib.ralib.oracles.SimulatorOracle; import de.learnlib.ralib.oracles.TreeQueryResult; -import de.learnlib.ralib.solver.ConstraintSolver; -import de.learnlib.ralib.solver.simple.SimpleConstraintSolver; +import de.learnlib.ralib.smt.ConstraintSolver; import de.learnlib.ralib.sul.DataWordSUL; import de.learnlib.ralib.sul.SimulatorSUL; import de.learnlib.ralib.theory.Theory; @@ -79,7 +80,7 @@ public void testBranching() { }); DataWordSUL sul = new SimulatorSUL(model, teachers, consts); - MultiTheoryTreeOracle mto = TestUtil.createMTO(sul, ERROR, teachers, consts, new SimpleConstraintSolver(), + MultiTheoryTreeOracle mto = TestUtil.createMTO(sul, ERROR, teachers, consts, ConstraintSolverFactory.createZ3ConstraintSolver(), inputs); DataType uid = TestUtil.getType("uid", loader.getDataTypes()); @@ -91,8 +92,8 @@ public void testBranching() { ParameterizedSymbol ok = new OutputSymbol("OOK", new DataType[] {}); - DataValue u = new DataValue(uid, 0); - DataValue p = new DataValue(pwd, 0); + DataValue u = new DataValue(uid, BigDecimal.ZERO); + DataValue p = new DataValue(pwd, BigDecimal.ZERO); Word prefix = Word.fromSymbols(new PSymbolInstance(reg, new DataValue[] { u, p }), new PSymbolInstance(ok, new DataValue[] {})); @@ -144,20 +145,20 @@ public void testUpdateRefinedBranching() { teachers.put(T_UID, new IntegerEqualityTheory(T_UID)); teachers.put(T_PWD, new IntegerEqualityTheory(T_PWD)); - ConstraintSolver solver = new SimpleConstraintSolver(); + ConstraintSolver solver = ConstraintSolverFactory.createZ3ConstraintSolver(); MultiTheoryTreeOracle mto = new MultiTheoryTreeOracle(dwOracle, teachers, new Constants(), solver); Word prefix = Word - .fromLetter(new PSymbolInstance(I_REGISTER, new DataValue<>(T_UID, 1), new DataValue<>(T_PWD, 1))); + .fromLetter(new PSymbolInstance(I_REGISTER, new DataValue(T_UID, BigDecimal.ONE), new DataValue(T_PWD, BigDecimal.ONE))); SymbolicSuffix suffix1 = new SymbolicSuffix(prefix, - Word.fromLetter(new PSymbolInstance(I_LOGIN, new DataValue<>(T_UID, 1), new DataValue<>(T_PWD, 1)))); + Word.fromLetter(new PSymbolInstance(I_LOGIN, new DataValue(T_UID, BigDecimal.ONE), new DataValue(T_PWD, BigDecimal.ONE)))); TreeQueryResult tqr1 = mto.treeQuery(prefix, suffix1); SymbolicSuffix suffix2 = new SymbolicSuffix(prefix, - Word.fromSymbols(new PSymbolInstance(I_LOGIN, new DataValue<>(T_UID, 1), new DataValue<>(T_PWD, 1)), - new PSymbolInstance(I_REGISTER, new DataValue<>(T_UID, 1), new DataValue<>(T_PWD, 1)))); + Word.fromSymbols(new PSymbolInstance(I_LOGIN, new DataValue(T_UID, BigDecimal.ONE), new DataValue(T_PWD, BigDecimal.ONE)), + new PSymbolInstance(I_REGISTER, new DataValue(T_UID, BigDecimal.ONE), new DataValue(T_PWD, BigDecimal.ONE)))); TreeQueryResult tqr2 = mto.treeQuery(prefix, suffix2); @@ -180,20 +181,20 @@ public void testInitialBranchingWithSDTs() { teachers.put(T_UID, new IntegerEqualityTheory(T_UID)); teachers.put(T_PWD, new IntegerEqualityTheory(T_PWD)); - ConstraintSolver solver = new SimpleConstraintSolver(); + ConstraintSolver solver = ConstraintSolverFactory.createZ3ConstraintSolver(); MultiTheoryTreeOracle mto = new MultiTheoryTreeOracle(dwOracle, teachers, new Constants(), solver); Word prefix = Word - .fromLetter(new PSymbolInstance(I_REGISTER, new DataValue<>(T_UID, 1), new DataValue<>(T_PWD, 1))); + .fromLetter(new PSymbolInstance(I_REGISTER, new DataValue(T_UID, BigDecimal.ONE), new DataValue(T_PWD, BigDecimal.ONE))); SymbolicSuffix suffix1 = new SymbolicSuffix(prefix, - Word.fromLetter(new PSymbolInstance(I_LOGIN, new DataValue<>(T_UID, 1), new DataValue<>(T_PWD, 1)))); + Word.fromLetter(new PSymbolInstance(I_LOGIN, new DataValue(T_UID, BigDecimal.ONE), new DataValue(T_PWD, BigDecimal.ONE)))); TreeQueryResult tqr1 = mto.treeQuery(prefix, suffix1); SymbolicSuffix suffix2 = new SymbolicSuffix(prefix, - Word.fromSymbols(new PSymbolInstance(I_LOGIN, new DataValue<>(T_UID, 1), new DataValue<>(T_PWD, 1)), - new PSymbolInstance(I_REGISTER, new DataValue<>(T_UID, 1), new DataValue<>(T_PWD, 1)))); + Word.fromSymbols(new PSymbolInstance(I_LOGIN, new DataValue(T_UID, BigDecimal.ONE), new DataValue(T_PWD, BigDecimal.ONE)), + new PSymbolInstance(I_REGISTER, new DataValue(T_UID, BigDecimal.ONE), new DataValue(T_PWD, BigDecimal.ONE)))); TreeQueryResult tqr2 = mto.treeQuery(prefix, suffix2); @@ -212,20 +213,20 @@ public void testUpdateBranchingNoSDTsMeansNoUpdate() { teachers.put(T_UID, new IntegerEqualityTheory(T_UID)); teachers.put(T_PWD, new IntegerEqualityTheory(T_PWD)); - ConstraintSolver solver = new SimpleConstraintSolver(); + ConstraintSolver solver = ConstraintSolverFactory.createZ3ConstraintSolver(); MultiTheoryTreeOracle mto = new MultiTheoryTreeOracle(dwOracle, teachers, new Constants(), solver); Word prefix = Word - .fromLetter(new PSymbolInstance(I_REGISTER, new DataValue<>(T_UID, 1), new DataValue<>(T_PWD, 1))); + .fromLetter(new PSymbolInstance(I_REGISTER, new DataValue(T_UID, BigDecimal.ONE), new DataValue(T_PWD, BigDecimal.ONE))); SymbolicSuffix suffix1 = new SymbolicSuffix(prefix, - Word.fromLetter(new PSymbolInstance(I_LOGIN, new DataValue<>(T_UID, 1), new DataValue<>(T_PWD, 1)))); + Word.fromLetter(new PSymbolInstance(I_LOGIN, new DataValue(T_UID, BigDecimal.ONE), new DataValue(T_PWD, BigDecimal.ONE)))); TreeQueryResult tqr1 = mto.treeQuery(prefix, suffix1); SymbolicSuffix suffix2 = new SymbolicSuffix(prefix, - Word.fromSymbols(new PSymbolInstance(I_LOGIN, new DataValue<>(T_UID, 1), new DataValue<>(T_PWD, 1)), - new PSymbolInstance(I_REGISTER, new DataValue<>(T_UID, 1), new DataValue<>(T_PWD, 1)))); + Word.fromSymbols(new PSymbolInstance(I_LOGIN, new DataValue(T_UID, BigDecimal.ONE), new DataValue(T_PWD, BigDecimal.ONE)), + new PSymbolInstance(I_REGISTER, new DataValue(T_UID, BigDecimal.ONE), new DataValue(T_PWD, BigDecimal.ONE)))); TreeQueryResult tqr2 = mto.treeQuery(prefix, suffix2); diff --git a/src/test/java/de/learnlib/ralib/oracles/mto/MultiSDTBranchingTest.java b/src/test/java/de/learnlib/ralib/oracles/mto/MultiSDTBranchingTest.java index 58984c50..5f2cb40a 100644 --- a/src/test/java/de/learnlib/ralib/oracles/mto/MultiSDTBranchingTest.java +++ b/src/test/java/de/learnlib/ralib/oracles/mto/MultiSDTBranchingTest.java @@ -16,11 +16,13 @@ */ package de.learnlib.ralib.oracles.mto; +import java.math.BigDecimal; import java.util.Arrays; import java.util.LinkedHashMap; import java.util.Map; import java.util.logging.Level; +import de.learnlib.ralib.smt.ConstraintSolverFactory; import org.testng.Assert; import org.testng.annotations.Test; @@ -34,7 +36,6 @@ import de.learnlib.ralib.learning.SymbolicSuffix; import de.learnlib.ralib.oracles.Branching; import de.learnlib.ralib.oracles.TreeQueryResult; -import de.learnlib.ralib.solver.simple.SimpleConstraintSolver; import de.learnlib.ralib.sul.DataWordSUL; import de.learnlib.ralib.sul.SimulatorSUL; import de.learnlib.ralib.theory.Theory; @@ -72,7 +73,7 @@ public void testModelswithOutput() { DataWordSUL sul = new SimulatorSUL(model, teachers, consts); MultiTheoryTreeOracle mto = TestUtil.createMTO(sul, ERROR, - teachers, consts, new SimpleConstraintSolver(), inputs); + teachers, consts, ConstraintSolverFactory.createZ3ConstraintSolver(), inputs); DataType intType = TestUtil.getType("int", loader.getDataTypes()); @@ -88,8 +89,8 @@ public void testModelswithOutput() { ParameterizedSymbol o200 = new OutputSymbol( "O200", new DataType[]{intType}); - DataValue d0 = new DataValue(intType, 0); - DataValue d1 = new DataValue(intType, 1); + DataValue d0 = new DataValue(intType, BigDecimal.ZERO); + DataValue d1 = new DataValue(intType, BigDecimal.ONE); //****** ROW: IINVITE[0[int]] O100[0[int]] IPRACK[0[int]] O200[0[int]] IINVITE[1[int]] Word prefix = Word.fromSymbols( diff --git a/src/test/java/de/learnlib/ralib/oracles/mto/MultiTheorySDTLogicOracleTest.java b/src/test/java/de/learnlib/ralib/oracles/mto/MultiTheorySDTLogicOracleTest.java index f59d967e..eeb0c08c 100644 --- a/src/test/java/de/learnlib/ralib/oracles/mto/MultiTheorySDTLogicOracleTest.java +++ b/src/test/java/de/learnlib/ralib/oracles/mto/MultiTheorySDTLogicOracleTest.java @@ -7,11 +7,13 @@ import static de.learnlib.ralib.example.login.LoginAutomatonExample.T_PWD; import static de.learnlib.ralib.example.login.LoginAutomatonExample.T_UID; +import java.math.BigDecimal; import java.util.Arrays; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import de.learnlib.ralib.smt.ConstraintSolverFactory; import org.testng.Assert; import org.testng.annotations.Test; @@ -25,8 +27,7 @@ import de.learnlib.ralib.oracles.TreeOracle; import de.learnlib.ralib.oracles.TreeOracleFactory; import de.learnlib.ralib.oracles.TreeQueryResult; -import de.learnlib.ralib.solver.ConstraintSolver; -import de.learnlib.ralib.solver.simple.SimpleConstraintSolver; +import de.learnlib.ralib.smt.ConstraintSolver; import de.learnlib.ralib.theory.Theory; import de.learnlib.ralib.tools.theories.IntegerEqualityTheory; import de.learnlib.ralib.words.PSymbolInstance; @@ -43,7 +44,7 @@ public void acceptsTest() { teachers.put(T_UID, new IntegerEqualityTheory(T_UID)); teachers.put(T_PWD, new IntegerEqualityTheory(T_PWD)); - ConstraintSolver solver = new SimpleConstraintSolver(); + ConstraintSolver solver = ConstraintSolverFactory.createZ3ConstraintSolver(); SDTLogicOracle slo = new MultiTheorySDTLogicOracle(consts, solver); @@ -52,10 +53,10 @@ public void acceptsTest() { new Constants(), solver); TreeOracle sulTreeOracle = hypFactory.createTreeOracle(sul); Word acceptedWord = Word.fromSymbols( - new PSymbolInstance(I_REGISTER, new DataValue<>(T_UID, 0), new DataValue<>(T_PWD, 0)), - new PSymbolInstance(I_LOGIN, new DataValue<>(T_UID, 0), new DataValue<>(T_PWD, 0)), + new PSymbolInstance(I_REGISTER, new DataValue(T_UID, BigDecimal.ZERO), new DataValue(T_PWD, BigDecimal.ZERO)), + new PSymbolInstance(I_LOGIN, new DataValue(T_UID, BigDecimal.ZERO), new DataValue(T_PWD, BigDecimal.ZERO)), new PSymbolInstance(I_LOGOUT), - new PSymbolInstance(I_LOGIN, new DataValue<>(T_UID, 0), new DataValue<>(T_PWD, 0))); + new PSymbolInstance(I_LOGIN, new DataValue(T_UID, BigDecimal.ZERO), new DataValue(T_PWD, BigDecimal.ZERO))); Word prefix = acceptedWord.prefix(1); Word suffix = acceptedWord.suffix(acceptedWord.length() - prefix.length()); SymbolicSuffix symSuffix = new SymbolicSuffix(prefix, suffix); @@ -63,13 +64,13 @@ public void acceptsTest() { Assert.assertTrue(slo.accepts(acceptedWord, prefix, query.getSdt(), query.getPiv())); List> rejectedSuffixes = Arrays.asList( Word.fromSymbols( - new PSymbolInstance(I_LOGIN, new DataValue<>(T_UID, 1), new DataValue<>(T_PWD, 0)), + new PSymbolInstance(I_LOGIN, new DataValue(T_UID, BigDecimal.ONE), new DataValue(T_PWD, BigDecimal.ZERO)), new PSymbolInstance(I_LOGOUT), - new PSymbolInstance(I_LOGIN, new DataValue<>(T_UID, 0), new DataValue<>(T_PWD, 1))), + new PSymbolInstance(I_LOGIN, new DataValue(T_UID, BigDecimal.ZERO), new DataValue(T_PWD, BigDecimal.ONE))), Word.fromSymbols( - new PSymbolInstance(I_LOGIN, new DataValue<>(T_UID, 0), new DataValue<>(T_PWD, 0)), + new PSymbolInstance(I_LOGIN, new DataValue(T_UID, BigDecimal.ZERO), new DataValue(T_PWD, BigDecimal.ZERO)), new PSymbolInstance(I_LOGOUT), - new PSymbolInstance(I_LOGIN, new DataValue<>(T_UID, 0), new DataValue<>(T_PWD, 1)))); + new PSymbolInstance(I_LOGIN, new DataValue(T_UID, BigDecimal.ZERO), new DataValue(T_PWD, BigDecimal.ONE)))); for (Word rejectedSuffix : rejectedSuffixes) { Word rejectedWord = prefix.concat(rejectedSuffix); diff --git a/src/test/java/de/learnlib/ralib/oracles/mto/MultipleSpecialCasesTest.java b/src/test/java/de/learnlib/ralib/oracles/mto/MultipleSpecialCasesTest.java index e118b93f..6d490c56 100644 --- a/src/test/java/de/learnlib/ralib/oracles/mto/MultipleSpecialCasesTest.java +++ b/src/test/java/de/learnlib/ralib/oracles/mto/MultipleSpecialCasesTest.java @@ -20,6 +20,7 @@ import java.util.Map; import java.util.logging.Level; +import de.learnlib.ralib.smt.ConstraintSolverFactory; import org.testng.Assert; import org.testng.annotations.Test; @@ -32,7 +33,6 @@ import de.learnlib.ralib.data.DataValue; import de.learnlib.ralib.learning.SymbolicSuffix; import de.learnlib.ralib.oracles.TreeQueryResult; -import de.learnlib.ralib.solver.simple.SimpleConstraintSolver; import de.learnlib.ralib.sul.DataWordSUL; import de.learnlib.ralib.sul.SimulatorSUL; import de.learnlib.ralib.theory.Theory; @@ -70,7 +70,7 @@ public void testModelswithOutput() { DataWordSUL sul = new SimulatorSUL(model, teachers, consts); MultiTheoryTreeOracle mto = TestUtil.createMTO(sul, ERROR, - teachers, consts, new SimpleConstraintSolver(), inputs); + teachers, consts, ConstraintSolverFactory.createZ3ConstraintSolver(), inputs); DataType intType = TestUtil.getType("int", loader.getDataTypes()); diff --git a/src/test/java/de/learnlib/ralib/oracles/mto/NonFreeSuffixValuesTest.java b/src/test/java/de/learnlib/ralib/oracles/mto/NonFreeSuffixValuesTest.java index 96e94f5d..643d076d 100644 --- a/src/test/java/de/learnlib/ralib/oracles/mto/NonFreeSuffixValuesTest.java +++ b/src/test/java/de/learnlib/ralib/oracles/mto/NonFreeSuffixValuesTest.java @@ -20,10 +20,12 @@ import static de.learnlib.ralib.example.repeater.RepeaterSUL.OECHO; import static de.learnlib.ralib.example.repeater.RepeaterSUL.TINT; +import java.math.BigDecimal; import java.util.LinkedHashMap; import java.util.Map; import java.util.logging.Level; +import de.learnlib.ralib.smt.ConstraintSolverFactory; import org.testng.Assert; import org.testng.annotations.Test; @@ -40,8 +42,8 @@ import de.learnlib.ralib.oracles.io.IOCache; import de.learnlib.ralib.oracles.io.IOFilter; import de.learnlib.ralib.oracles.io.IOOracle; -import de.learnlib.ralib.solver.ConstraintSolver; -import de.learnlib.ralib.solver.simple.SimpleConstraintSolver; +import de.learnlib.ralib.smt.ConstraintSolver; + import de.learnlib.ralib.sul.DataWordSUL; import de.learnlib.ralib.sul.SULOracle; import de.learnlib.ralib.sul.SimulatorSUL; @@ -76,7 +78,7 @@ public void testModelswithOutputFifo() { final Map teachers = new LinkedHashMap<>(); loader.getDataTypes().stream().forEach((t) -> { - TypedTheory theory = new IntegerEqualityTheory(t); + TypedTheory theory = new IntegerEqualityTheory(t); theory.setUseSuffixOpt(true); teachers.put(t, theory); }); @@ -84,7 +86,7 @@ public void testModelswithOutputFifo() { DataWordSUL sul = new SimulatorSUL(model, teachers, consts); MultiTheoryTreeOracle mto = TestUtil.createMTO(sul, ERROR, - teachers, consts, new SimpleConstraintSolver(), inputs); + teachers, consts, ConstraintSolverFactory.createZ3ConstraintSolver(), inputs); DataType intType = TestUtil.getType("int", loader.getDataTypes()); @@ -100,9 +102,9 @@ public void testModelswithOutputFifo() { ParameterizedSymbol ook = new OutputSymbol( "OOK", new DataType[] {}); - DataValue d0 = new DataValue(intType, 0); - DataValue d1 = new DataValue(intType, 1); - DataValue d6 = new DataValue(intType, 6); + DataValue d0 = new DataValue(intType, BigDecimal.ZERO); + DataValue d1 = new DataValue(intType, BigDecimal.ONE); + DataValue d6 = new DataValue(intType, new BigDecimal(6)); //****** IPut[0[int]] OOK[] IPut[1[int]] OOK[] Word prefix = Word.fromSymbols( @@ -176,7 +178,7 @@ public void testModelswithOutputPalindrome() { DataWordSUL sul = new SimulatorSUL(model, teachers, consts); MultiTheoryTreeOracle mto = TestUtil.createMTO(sul, ERROR, - teachers, consts, new SimpleConstraintSolver(), inputs); + teachers, consts, ConstraintSolverFactory.createZ3ConstraintSolver(), inputs); DataType intType = TestUtil.getType("int", loader.getDataTypes()); @@ -186,14 +188,14 @@ public void testModelswithOutputPalindrome() { ParameterizedSymbol oyes = new OutputSymbol( "OYes", new DataType[] {}); - DataValue d0 = new DataValue(intType, 0); - DataValue d1 = new DataValue(intType, 1); - DataValue d2 = new DataValue(intType, 2); - DataValue d3 = new DataValue(intType, 3); - DataValue d4 = new DataValue(intType, 4); - DataValue d5 = new DataValue(intType, 5); - DataValue d6 = new DataValue(intType, 6); - DataValue d7 = new DataValue(intType, 7); + DataValue d0 = new DataValue(intType, BigDecimal.ZERO); + DataValue d1 = new DataValue(intType, BigDecimal.ONE); + DataValue d2 = new DataValue(intType, new BigDecimal(2)); + DataValue d3 = new DataValue(intType, new BigDecimal(3)); + DataValue d4 = new DataValue(intType, new BigDecimal(4)); + DataValue d5 = new DataValue(intType, new BigDecimal(5)); + DataValue d6 = new DataValue(intType, new BigDecimal(6)); + DataValue d7 = new DataValue(intType, new BigDecimal(7)); //****** Word prefix1 = Word.fromSymbols(); @@ -240,18 +242,18 @@ public void testNonFreeNonFresh() { IOCache ioCache = new IOCache(ioOracle); IOFilter oracle = new IOFilter(ioCache, sul.getInputSymbols()); - ConstraintSolver solver = new SimpleConstraintSolver(); + ConstraintSolver solver = ConstraintSolverFactory.createZ3ConstraintSolver(); MultiTheoryTreeOracle mto = new MultiTheoryTreeOracle( oracle, teachers, consts, solver); Word word = Word.fromSymbols( - new PSymbolInstance(IPUT, new DataValue(TINT, 0)), - new PSymbolInstance(OECHO, new DataValue(TINT, 0)), - new PSymbolInstance(IPUT, new DataValue(TINT, 1)), - new PSymbolInstance(OECHO, new DataValue(TINT, 1)), - new PSymbolInstance(IPUT, new DataValue(TINT, 2)), - new PSymbolInstance(OECHO, new DataValue(TINT, 2))); + new PSymbolInstance(IPUT, new DataValue(TINT, BigDecimal.ZERO)), + new PSymbolInstance(OECHO, new DataValue(TINT, BigDecimal.ZERO)), + new PSymbolInstance(IPUT, new DataValue(TINT, BigDecimal.ONE)), + new PSymbolInstance(OECHO, new DataValue(TINT, BigDecimal.ONE)), + new PSymbolInstance(IPUT, new DataValue(TINT, new BigDecimal(2) )), + new PSymbolInstance(OECHO, new DataValue(TINT, new BigDecimal(2) ))); SymbolicSuffix suffix = new SymbolicSuffix(word.prefix(2), word.suffix(4), restrictionBuilder); Assert.assertTrue(suffix.getFreeValues().isEmpty()); diff --git a/src/test/java/de/learnlib/ralib/oracles/mto/OptimizedSymbolicSuffixBuilderTest.java b/src/test/java/de/learnlib/ralib/oracles/mto/OptimizedSymbolicSuffixBuilderTest.java index 591de36e..d9ca2382 100644 --- a/src/test/java/de/learnlib/ralib/oracles/mto/OptimizedSymbolicSuffixBuilderTest.java +++ b/src/test/java/de/learnlib/ralib/oracles/mto/OptimizedSymbolicSuffixBuilderTest.java @@ -7,6 +7,7 @@ import static de.learnlib.ralib.example.list.BoundedListDataWordOracle.PUSH; import static de.learnlib.ralib.example.list.BoundedListDataWordOracle.dv; +import java.math.BigDecimal; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; @@ -33,9 +34,8 @@ import de.learnlib.ralib.example.list.BoundedListDataWordOracle; import de.learnlib.ralib.learning.SymbolicSuffix; import de.learnlib.ralib.oracles.TreeQueryResult; -import de.learnlib.ralib.solver.ConstraintSolver; -import de.learnlib.ralib.solver.ConstraintSolverFactory; -import de.learnlib.ralib.solver.simple.SimpleConstraintSolver; +import de.learnlib.ralib.smt.ConstraintSolver; +import de.learnlib.ralib.smt.ConstraintSolverFactory; import de.learnlib.ralib.theory.FreshSuffixValue; import de.learnlib.ralib.theory.SDTAndGuard; import de.learnlib.ralib.theory.SDTGuard; @@ -113,60 +113,60 @@ public void extendDistinguishingSuffixTest() { piv5.put(p1, r1); Constants consts2 = new Constants(); - consts2.put(c1, new DataValue(INT_TYPE, 2)); + consts2.put(c1, new DataValue(INT_TYPE,new BigDecimal(2))); SymbolicSuffixRestrictionBuilder restrictionBuilder2 = new SymbolicSuffixRestrictionBuilder(consts2, teachers); Word word1 = Word.fromSymbols( - new PSymbolInstance(A, new DataValue(INT_TYPE, 0), new DataValue(INT_TYPE, 0)), - new PSymbolInstance(A, new DataValue(INT_TYPE, 1), new DataValue(INT_TYPE, 1)), - new PSymbolInstance(A, new DataValue(INT_TYPE, 0), new DataValue(INT_TYPE, 1))); + new PSymbolInstance(A, new DataValue(INT_TYPE, BigDecimal.ZERO), new DataValue(INT_TYPE, BigDecimal.ZERO)), + new PSymbolInstance(A, new DataValue(INT_TYPE, BigDecimal.ONE), new DataValue(INT_TYPE, BigDecimal.ONE)), + new PSymbolInstance(A, new DataValue(INT_TYPE, BigDecimal.ZERO), new DataValue(INT_TYPE, BigDecimal.ONE))); Word word2 = Word.fromSymbols( - new PSymbolInstance(A, new DataValue(INT_TYPE, 0), new DataValue(INT_TYPE, 1)), - new PSymbolInstance(A, new DataValue(INT_TYPE, 2), new DataValue(INT_TYPE, 3)), - new PSymbolInstance(A, new DataValue(INT_TYPE, 3), new DataValue(INT_TYPE, 4))); + new PSymbolInstance(A, new DataValue(INT_TYPE, BigDecimal.ZERO), new DataValue(INT_TYPE, BigDecimal.ONE)), + new PSymbolInstance(A, new DataValue(INT_TYPE,new BigDecimal(2)), new DataValue(INT_TYPE,new BigDecimal(3))), + new PSymbolInstance(A, new DataValue(INT_TYPE,new BigDecimal(3)), new DataValue(INT_TYPE,new BigDecimal(4)))); Word word3 = Word.fromSymbols( - new PSymbolInstance(A, new DataValue(INT_TYPE, 0), new DataValue(INT_TYPE, 1)), + new PSymbolInstance(A, new DataValue(INT_TYPE, BigDecimal.ZERO), new DataValue(INT_TYPE, BigDecimal.ONE)), new PSymbolInstance(B), - new PSymbolInstance(A, new DataValue(INT_TYPE, 1), new DataValue(INT_TYPE, 2))); + new PSymbolInstance(A, new DataValue(INT_TYPE, BigDecimal.ONE), new DataValue(INT_TYPE,new BigDecimal(2)))); Word word4 = Word.fromSymbols( - new PSymbolInstance(C, new DataValue(INT_TYPE, 0)), + new PSymbolInstance(C, new DataValue(INT_TYPE, BigDecimal.ZERO)), new PSymbolInstance(B), - new PSymbolInstance(C, new DataValue(INT_TYPE, 2)), - new PSymbolInstance(C, new DataValue(INT_TYPE, 2)), - new PSymbolInstance(C, new DataValue(INT_TYPE, 0)), - new PSymbolInstance(C, new DataValue(INT_TYPE, 0))); + new PSymbolInstance(C, new DataValue(INT_TYPE,new BigDecimal(2))), + new PSymbolInstance(C, new DataValue(INT_TYPE,new BigDecimal(2))), + new PSymbolInstance(C, new DataValue(INT_TYPE, BigDecimal.ZERO)), + new PSymbolInstance(C, new DataValue(INT_TYPE, BigDecimal.ZERO))); Word word5 = Word.fromSymbols( - new PSymbolInstance(C, new DataValue(INT_TYPE, 0)), + new PSymbolInstance(C, new DataValue(INT_TYPE, BigDecimal.ZERO)), new PSymbolInstance(B), - new PSymbolInstance(C, new DataValue(INT_TYPE, 1)), - new PSymbolInstance(C, new DataValue(INT_TYPE, 1)), - new PSymbolInstance(C, new DataValue(INT_TYPE, 0)), - new PSymbolInstance(C, new DataValue(INT_TYPE, 0))); + new PSymbolInstance(C, new DataValue(INT_TYPE, BigDecimal.ONE)), + new PSymbolInstance(C, new DataValue(INT_TYPE, BigDecimal.ONE)), + new PSymbolInstance(C, new DataValue(INT_TYPE, BigDecimal.ZERO)), + new PSymbolInstance(C, new DataValue(INT_TYPE, BigDecimal.ZERO))); Word word6 = Word.fromSymbols( - new PSymbolInstance(A, new DataValue(INT_TYPE, 2), new DataValue(INT_TYPE, 0)), - new PSymbolInstance(C, new DataValue(INT_TYPE, 2))); + new PSymbolInstance(A, new DataValue(INT_TYPE,new BigDecimal(2)), new DataValue(INT_TYPE, BigDecimal.ZERO)), + new PSymbolInstance(C, new DataValue(INT_TYPE,new BigDecimal(2)))); Word word7a = Word.fromSymbols( - new PSymbolInstance(C, new DataValue(INT_TYPE, 0)), + new PSymbolInstance(C, new DataValue(INT_TYPE, BigDecimal.ZERO)), new PSymbolInstance(B), - new PSymbolInstance(C, new DataValue(INT_TYPE, 1)), + new PSymbolInstance(C, new DataValue(INT_TYPE, BigDecimal.ONE)), new PSymbolInstance(B)); Word word7b = Word.fromSymbols( - new PSymbolInstance(C, new DataValue(INT_TYPE, 0)), + new PSymbolInstance(C, new DataValue(INT_TYPE, BigDecimal.ZERO)), new PSymbolInstance(B), - new PSymbolInstance(C, new DataValue(INT_TYPE, 2)), + new PSymbolInstance(C, new DataValue(INT_TYPE,new BigDecimal(2))), new PSymbolInstance(B)); Word word8a = Word.fromSymbols( - new PSymbolInstance(C, new DataValue(INT_TYPE, 0)), - new PSymbolInstance(C, new DataValue(INT_TYPE, 1)), - new PSymbolInstance(C, new DataValue(INT_TYPE, 1))); + new PSymbolInstance(C, new DataValue(INT_TYPE, BigDecimal.ZERO)), + new PSymbolInstance(C, new DataValue(INT_TYPE, BigDecimal.ONE)), + new PSymbolInstance(C, new DataValue(INT_TYPE, BigDecimal.ONE))); Word word8b = Word.fromSymbols( - new PSymbolInstance(C, new DataValue(INT_TYPE, 0)), - new PSymbolInstance(C, new DataValue(INT_TYPE, 0)), - new PSymbolInstance(C, new DataValue(INT_TYPE, 1))); + new PSymbolInstance(C, new DataValue(INT_TYPE, BigDecimal.ZERO)), + new PSymbolInstance(C, new DataValue(INT_TYPE, BigDecimal.ZERO)), + new PSymbolInstance(C, new DataValue(INT_TYPE, BigDecimal.ONE))); Word word8c = Word.fromSymbols( - new PSymbolInstance(C, new DataValue(INT_TYPE, 0)), - new PSymbolInstance(C, new DataValue(INT_TYPE, 0)), - new PSymbolInstance(C, new DataValue(INT_TYPE, 0))); + new PSymbolInstance(C, new DataValue(INT_TYPE, BigDecimal.ZERO)), + new PSymbolInstance(C, new DataValue(INT_TYPE, BigDecimal.ZERO)), + new PSymbolInstance(C, new DataValue(INT_TYPE, BigDecimal.ZERO))); SymbolicSuffix suffix1 = new SymbolicSuffix(word1.prefix(2), word1.suffix(1), restrictionBuilder); SymbolicSuffix suffix2 = new SymbolicSuffix(word2.prefix(2), word2.suffix(1), restrictionBuilder); SymbolicSuffix suffix3 = new SymbolicSuffix(word3.prefix(2), word3.suffix(1), restrictionBuilder2); @@ -281,7 +281,7 @@ private void equalsSuffixesFromConcretePrefixSuffix(Word word, @Test public void extendSuffixTest() { - DataType type = new DataType("int",Integer.class); + DataType type = new DataType("int"); final Map teachers = new LinkedHashMap<>(); IntegerEqualityTheory dit = new IntegerEqualityTheory(type); @@ -320,32 +320,32 @@ public void extendSuffixTest() { Constants consts1 = new Constants(); Constants consts2 = new Constants(); - consts2.put(c1, new DataValue(INT_TYPE, 3)); - consts2.put(c2, new DataValue(INT_TYPE, 4)); + consts2.put(c1, new DataValue(INT_TYPE,new BigDecimal(3))); + consts2.put(c2, new DataValue(INT_TYPE,new BigDecimal(4))); SymbolicSuffixRestrictionBuilder restrictionBuilder1 = new SymbolicSuffixRestrictionBuilder(consts1, teachers); SymbolicSuffixRestrictionBuilder restrictionBuilder2 = new SymbolicSuffixRestrictionBuilder(consts2, teachers); Word word1 = Word.fromSymbols( - new PSymbolInstance(A, new DataValue(INT_TYPE, 0), new DataValue(INT_TYPE, 1)), - new PSymbolInstance(A, new DataValue(INT_TYPE, 1), new DataValue(INT_TYPE, 2)), - new PSymbolInstance(A, new DataValue(INT_TYPE, 0), new DataValue(INT_TYPE, 1)), - new PSymbolInstance(A, new DataValue(INT_TYPE, 2), new DataValue(INT_TYPE, 1)), - new PSymbolInstance(B, new DataValue(INT_TYPE, 2))); + new PSymbolInstance(A, new DataValue(INT_TYPE, BigDecimal.ZERO), new DataValue(INT_TYPE, BigDecimal.ONE)), + new PSymbolInstance(A, new DataValue(INT_TYPE, BigDecimal.ONE), new DataValue(INT_TYPE,new BigDecimal(2))), + new PSymbolInstance(A, new DataValue(INT_TYPE, BigDecimal.ZERO), new DataValue(INT_TYPE, BigDecimal.ONE)), + new PSymbolInstance(A, new DataValue(INT_TYPE,new BigDecimal(2)), new DataValue(INT_TYPE, BigDecimal.ONE)), + new PSymbolInstance(B, new DataValue(INT_TYPE,new BigDecimal(2)))); Word word2 = Word.fromSymbols( - new PSymbolInstance(A, new DataValue(INT_TYPE, 0), new DataValue(INT_TYPE, 1)), - new PSymbolInstance(A, new DataValue(INT_TYPE, 1), new DataValue(INT_TYPE, 2)), - new PSymbolInstance(A, new DataValue(INT_TYPE, 1), new DataValue(INT_TYPE, 0)), - new PSymbolInstance(A, new DataValue(INT_TYPE, 3), new DataValue(INT_TYPE, 0)), - new PSymbolInstance(B, new DataValue(INT_TYPE, 4))); + new PSymbolInstance(A, new DataValue(INT_TYPE, BigDecimal.ZERO), new DataValue(INT_TYPE, BigDecimal.ONE)), + new PSymbolInstance(A, new DataValue(INT_TYPE, BigDecimal.ONE), new DataValue(INT_TYPE, new BigDecimal(2))), + new PSymbolInstance(A, new DataValue(INT_TYPE, BigDecimal.ONE), new DataValue(INT_TYPE, BigDecimal.ZERO)), + new PSymbolInstance(A, new DataValue(INT_TYPE, new BigDecimal(3)), new DataValue(INT_TYPE, BigDecimal.ZERO)), + new PSymbolInstance(B, new DataValue(INT_TYPE, new BigDecimal(4)))); Word word3 = Word.fromSymbols( - new PSymbolInstance(A, new DataValue(INT_TYPE, 0), new DataValue(INT_TYPE, 1)), - new PSymbolInstance(A, new DataValue(INT_TYPE, 1), new DataValue(INT_TYPE, 2)), - new PSymbolInstance(A, new DataValue(INT_TYPE, 3), new DataValue(INT_TYPE, 6)), - new PSymbolInstance(B, new DataValue(INT_TYPE, 5))); + new PSymbolInstance(A, new DataValue(INT_TYPE, BigDecimal.ZERO), new DataValue(INT_TYPE, BigDecimal.ONE)), + new PSymbolInstance(A, new DataValue(INT_TYPE, BigDecimal.ONE), new DataValue(INT_TYPE, new BigDecimal(2))), + new PSymbolInstance(A, new DataValue(INT_TYPE,new BigDecimal(3)), new DataValue(INT_TYPE, new BigDecimal(6))), + new PSymbolInstance(B, new DataValue(INT_TYPE, new BigDecimal(5)))); Word word4 = Word.fromSymbols( - new PSymbolInstance(B, new DataValue(INT_TYPE, 0)), - new PSymbolInstance(B, new DataValue(INT_TYPE, 3)), + new PSymbolInstance(B, new DataValue(INT_TYPE, BigDecimal.ZERO)), + new PSymbolInstance(B, new DataValue(INT_TYPE, new BigDecimal(3))), new PSymbolInstance(C)); SymbolicSuffix suffix1 = new SymbolicSuffix(word1.prefix(2), word1.suffix(3), restrictionBuilder1); SymbolicSuffix suffix2 = new SymbolicSuffix(word2.prefix(2), word2.suffix(3), restrictionBuilder1); @@ -373,7 +373,7 @@ public void extendSuffixTest() { OptimizedSymbolicSuffixBuilder builder1 = new OptimizedSymbolicSuffixBuilder(consts1, restrictionBuilder1); OptimizedSymbolicSuffixBuilder builder2 = new OptimizedSymbolicSuffixBuilder(consts2, restrictionBuilder2); - ConstraintSolver solver = new SimpleConstraintSolver(); + ConstraintSolver solver = ConstraintSolverFactory.createZ3ConstraintSolver(); SymbolicSuffix expected1 = new SymbolicSuffix(word1.prefix(1), word1.suffix(4), restrictionBuilder1); SymbolicSuffix actual1 = builder1.extendSuffix(word1.prefix(2), sdtPath1, piv1, suffix1.getActions()); @@ -395,7 +395,7 @@ public void extendSuffixTest() { @Test public void buildOptimizedSuffixTest() { - DataType type = new DataType("int",Integer.class); + DataType type = new DataType("int"); InputSymbol a = new InputSymbol("a", type); @@ -419,9 +419,9 @@ public void buildOptimizedSuffixTest() { Constants consts = new Constants(); - Word prefix1 = Word.fromSymbols(new PSymbolInstance(a, new DataValue(type, 0))); - Word prefix2 = Word.fromSymbols(new PSymbolInstance(a, new DataValue(type, 0)), - new PSymbolInstance(a, new DataValue(type, 1))); + Word prefix1 = Word.fromSymbols(new PSymbolInstance(a, new DataValue(type, BigDecimal.ZERO))); + Word prefix2 = Word.fromSymbols(new PSymbolInstance(a, new DataValue(type, BigDecimal.ZERO)), + new PSymbolInstance(a, new DataValue(type, BigDecimal.ONE))); SDT sdt1 = new SDT(Map.of( new EqualityGuard(s1, r1), new SDT(Map.of( @@ -446,7 +446,8 @@ public void buildOptimizedSuffixTest() { piv2.put(p2, r1); OptimizedSymbolicSuffixBuilder builder = new OptimizedSymbolicSuffixBuilder(consts); - SymbolicSuffix suffix12 = builder.distinguishingSuffixFromSDTs(prefix1, sdt1, piv1, prefix2, sdt2, piv2, Word.fromSymbols(a, a, a), new SimpleConstraintSolver()); + SymbolicSuffix suffix12 = builder.distinguishingSuffixFromSDTs(prefix1, sdt1, piv1, prefix2, sdt2, piv2, Word.fromSymbols(a, a, a), + ConstraintSolverFactory.createZ3ConstraintSolver()); Map expectedRestr12 = new LinkedHashMap<>(); expectedRestr12.put(s1, new FreshSuffixValue(s1)); expectedRestr12.put(s2, new EqualRestriction(s2, s1)); @@ -484,7 +485,8 @@ public void buildOptimizedSuffixTest() { piv4.put(p1, r1); piv4.put(p2, r2); - SymbolicSuffix suffix34 = builder.distinguishingSuffixFromSDTs(prefix3, sdt3, piv3, prefix4, sdt4, piv4, Word.fromSymbols(a, a, a), new SimpleConstraintSolver()); + SymbolicSuffix suffix34 = builder.distinguishingSuffixFromSDTs(prefix3, sdt3, piv3, prefix4, sdt4, piv4, Word.fromSymbols(a, a, a), + ConstraintSolverFactory.createZ3ConstraintSolver()); Map expectedRestr34 = new LinkedHashMap<>(); expectedRestr34.put(s1, new FreshSuffixValue(s1)); expectedRestr34.put(s2, new UnrestrictedSuffixValue(s2)); @@ -497,7 +499,7 @@ public void buildOptimizedSuffixTest() { @Test public void extendSuffixRevealingRegistersTest() { - DataType type = new DataType("int",Integer.class); + DataType type = new DataType("int"); InputSymbol a = new InputSymbol("a", type); InputSymbol b = new InputSymbol("b", type, type); @@ -524,10 +526,10 @@ public void extendSuffixRevealingRegistersTest() { OptimizedSymbolicSuffixBuilder builder = new OptimizedSymbolicSuffixBuilder(consts, restrictionBuilder); Word word1 = Word.fromSymbols( - new PSymbolInstance(a, new DataValue(type, 0)), - new PSymbolInstance(a, new DataValue(type, 1)), - new PSymbolInstance(a, new DataValue(type, 2)), - new PSymbolInstance(a, new DataValue(type, 0))); + new PSymbolInstance(a, new DataValue(type, BigDecimal.ZERO)), + new PSymbolInstance(a, new DataValue(type, BigDecimal.ONE)), + new PSymbolInstance(a, new DataValue(type, new BigDecimal(2))), + new PSymbolInstance(a, new DataValue(type, BigDecimal.ZERO))); SymbolicSuffix suffix1 = new SymbolicSuffix(word1.prefix(2), word1.suffix(2), restrictionBuilder); SymbolicSuffix expectedSuffix1 = new SymbolicSuffix(word1.prefix(1), word1.suffix(3), restrictionBuilder); SDT sdt1 = new SDT(Map.of( @@ -544,11 +546,11 @@ public void extendSuffixRevealingRegistersTest() { Word word2 = Word.fromSymbols( - new PSymbolInstance(a, new DataValue(type, 0)), - new PSymbolInstance(a, new DataValue(type, 1)), - new PSymbolInstance(a, new DataValue(type, 2)), - new PSymbolInstance(a, new DataValue(type, 1)), - new PSymbolInstance(a, new DataValue(type, 0))); + new PSymbolInstance(a, new DataValue(type, BigDecimal.ZERO)), + new PSymbolInstance(a, new DataValue(type, BigDecimal.ONE)), + new PSymbolInstance(a, new DataValue(type, new BigDecimal(2))), + new PSymbolInstance(a, new DataValue(type, BigDecimal.ONE)), + new PSymbolInstance(a, new DataValue(type, BigDecimal.ZERO))); SymbolicSuffix suffix2 = new SymbolicSuffix(word2.prefix(3), word2.suffix(2), restrictionBuilder); SymbolicSuffix expectedSuffix2 = new SymbolicSuffix(word2.prefix(2), word2.suffix(3), restrictionBuilder); SDT sdt2 = new SDT(Map.of( @@ -565,10 +567,10 @@ public void extendSuffixRevealingRegistersTest() { Word word3 = Word.fromSymbols( - new PSymbolInstance(a, new DataValue(type, 0)), - new PSymbolInstance(b, new DataValue(type, 1), new DataValue(type, 2)), - new PSymbolInstance(a, new DataValue(type, 0)), - new PSymbolInstance(a, new DataValue(type, 0))); + new PSymbolInstance(a, new DataValue(type, BigDecimal.ZERO)), + new PSymbolInstance(b, new DataValue(type, BigDecimal.ONE), new DataValue(type, new BigDecimal(2))), + new PSymbolInstance(a, new DataValue(type, BigDecimal.ZERO)), + new PSymbolInstance(a, new DataValue(type, BigDecimal.ZERO))); SymbolicSuffix suffix3 = new SymbolicSuffix(word3.prefix(2), word3.suffix(2), restrictionBuilder); SymbolicSuffix expectedSuffix3 = new SymbolicSuffix(word3.prefix(1), word3.suffix(3), restrictionBuilder); SDT sdt3 = new SDT(Map.of( @@ -589,7 +591,7 @@ public void extendSuffixRevealingRegistersTest() { @Test private void sdtPruneTest() { - DataType type = new DataType("int",Integer.class); + DataType type = new DataType("int"); InputSymbol a = new InputSymbol("a", type); InputSymbol b = new InputSymbol("b", type, type); @@ -692,12 +694,12 @@ private void sdtPruneTest() { } public void testCoalesce() { - DataType type = new DataType("int",Integer.class); + DataType type = new DataType("int"); InputSymbol a = new InputSymbol("a", type); - DataValue dv1 = new DataValue(type, 0); - DataValue dv2 = new DataValue(type, 1); - DataValue dv3 = new DataValue(type, 2); + DataValue dv1 = new DataValue(type, BigDecimal.ZERO); + DataValue dv2 = new DataValue(type, BigDecimal.ONE); + DataValue dv3 = new DataValue(type, new BigDecimal(2)); Constants consts = new Constants(); OptimizedSymbolicSuffixBuilder builder = new OptimizedSymbolicSuffixBuilder(consts); diff --git a/src/test/java/de/learnlib/ralib/oracles/mto/SIPSDTMergingTest.java b/src/test/java/de/learnlib/ralib/oracles/mto/SIPSDTMergingTest.java index be9dbeec..c4a1b4da 100644 --- a/src/test/java/de/learnlib/ralib/oracles/mto/SIPSDTMergingTest.java +++ b/src/test/java/de/learnlib/ralib/oracles/mto/SIPSDTMergingTest.java @@ -16,10 +16,12 @@ */ package de.learnlib.ralib.oracles.mto; +import java.math.BigDecimal; import java.util.LinkedHashMap; import java.util.Map; import java.util.logging.Level; +import de.learnlib.ralib.smt.ConstraintSolverFactory; import org.testng.Assert; import org.testng.annotations.Test; @@ -32,7 +34,7 @@ import de.learnlib.ralib.data.DataValue; import de.learnlib.ralib.learning.SymbolicSuffix; import de.learnlib.ralib.oracles.TreeQueryResult; -import de.learnlib.ralib.solver.simple.SimpleConstraintSolver; + import de.learnlib.ralib.sul.DataWordSUL; import de.learnlib.ralib.sul.SimulatorSUL; import de.learnlib.ralib.theory.Theory; @@ -70,7 +72,7 @@ public void testModelswithOutput() { DataWordSUL sul = new SimulatorSUL(model, teachers, consts); MultiTheoryTreeOracle mto = TestUtil.createMTO(sul, ERROR, - teachers, consts, new SimpleConstraintSolver(), inputs); + teachers, consts, ConstraintSolverFactory.createZ3ConstraintSolver(), inputs); DataType intType = TestUtil.getType("int", loader.getDataTypes()); @@ -92,8 +94,8 @@ public void testModelswithOutput() { ParameterizedSymbol o481 = new OutputSymbol( "O481", new DataType[] {intType}); - DataValue d0 = new DataValue(intType, 0); - DataValue d1 = new DataValue(intType, 1); + DataValue d0 = new DataValue(intType, BigDecimal.ZERO); + DataValue d1 = new DataValue(intType, BigDecimal.ONE); //****** ROW: IINVITE[0[int]] O100[0[int]] IINVITE[1[int]] O100[1[int]] diff --git a/src/test/java/de/learnlib/ralib/oracles/mto/SecondSDTBranchingTest.java b/src/test/java/de/learnlib/ralib/oracles/mto/SecondSDTBranchingTest.java index 06b0f783..6a3a383f 100644 --- a/src/test/java/de/learnlib/ralib/oracles/mto/SecondSDTBranchingTest.java +++ b/src/test/java/de/learnlib/ralib/oracles/mto/SecondSDTBranchingTest.java @@ -16,11 +16,13 @@ */ package de.learnlib.ralib.oracles.mto; +import java.math.BigDecimal; import java.util.Arrays; import java.util.LinkedHashMap; import java.util.Map; import java.util.logging.Level; +import de.learnlib.ralib.smt.ConstraintSolverFactory; import org.testng.Assert; import org.testng.annotations.Test; @@ -39,7 +41,6 @@ import de.learnlib.ralib.learning.SymbolicSuffix; import de.learnlib.ralib.oracles.Branching; import de.learnlib.ralib.oracles.TreeQueryResult; -import de.learnlib.ralib.solver.simple.SimpleConstraintSolver; import de.learnlib.ralib.sul.DataWordSUL; import de.learnlib.ralib.sul.SimulatorSUL; import de.learnlib.ralib.theory.Theory; @@ -78,7 +79,7 @@ public void testModelswithOutput() { DataWordSUL sul = new SimulatorSUL(model, teachers, consts); MultiTheoryTreeOracle mto = TestUtil.createMTO(sul, ERROR, - teachers, consts, new SimpleConstraintSolver(), inputs); + teachers, consts, ConstraintSolverFactory.createZ3ConstraintSolver(), inputs); DataType intType = TestUtil.getType("int", loader.getDataTypes()); @@ -97,8 +98,8 @@ public void testModelswithOutput() { ParameterizedSymbol o481 = new OutputSymbol( "O481", new DataType[] {intType}); - DataValue d0 = new DataValue(intType, 0); - DataValue d1 = new DataValue(intType, 1); + DataValue d0 = new DataValue(intType, BigDecimal.ZERO); + DataValue d1 = new DataValue(intType, BigDecimal.ONE); //****** ROW: IINVITE[0[int]] O100[0[int]] IPRACK[1[int]] Word prefix = Word.fromSymbols( @@ -147,7 +148,7 @@ public void testModelswithOutput() { String guards = Arrays.toString(b.getBranches().values().toArray()); logger.log(Level.FINE, "Guards: {0}", guards); - final String expected = "[(r2==p1), (r2!=p1)]"; + final String expected = "[('r2' == 'p1'), ('r2' != 'p1')]"; Assert.assertEquals(guards, expected); } diff --git a/src/test/java/de/learnlib/ralib/oracles/mto/UntypedBranchingTest.java b/src/test/java/de/learnlib/ralib/oracles/mto/UntypedBranchingTest.java index 753eb7f9..1a736aed 100644 --- a/src/test/java/de/learnlib/ralib/oracles/mto/UntypedBranchingTest.java +++ b/src/test/java/de/learnlib/ralib/oracles/mto/UntypedBranchingTest.java @@ -35,10 +35,12 @@ * MA 02110-1301 USA */ +import java.math.BigDecimal; import java.util.LinkedHashMap; import java.util.Map; import java.util.logging.Level; +import de.learnlib.ralib.smt.ConstraintSolverFactory; import org.testng.Assert; import org.testng.annotations.Test; @@ -59,7 +61,7 @@ import de.learnlib.ralib.learning.SymbolicSuffix; import de.learnlib.ralib.oracles.Branching; import de.learnlib.ralib.oracles.TreeQueryResult; -import de.learnlib.ralib.solver.simple.SimpleConstraintSolver; + import de.learnlib.ralib.sul.DataWordSUL; import de.learnlib.ralib.sul.SimulatorSUL; import de.learnlib.ralib.theory.Theory; @@ -99,7 +101,7 @@ public void testBranching() { DataWordSUL sul = new SimulatorSUL(model, teachers, consts); MultiTheoryTreeOracle mto = TestUtil.createMTO(sul, ERROR, - teachers, consts, new SimpleConstraintSolver(), inputs); + teachers, consts, ConstraintSolverFactory.createZ3ConstraintSolver(), inputs); DataType intType = TestUtil.getType("int", loader.getDataTypes()); @@ -112,8 +114,8 @@ public void testBranching() { ParameterizedSymbol ok = new OutputSymbol( "OOK", new DataType[] {}); - DataValue u = new DataValue(intType, 0); - DataValue p = new DataValue(intType, 1); + DataValue u = new DataValue(intType, BigDecimal.ZERO); + DataValue p = new DataValue(intType, BigDecimal.ONE); Word prefix = Word.fromSymbols( new PSymbolInstance(reg, new DataValue[] {u, p}), diff --git a/src/test/java/de/learnlib/ralib/sul/CachingSULTest.java b/src/test/java/de/learnlib/ralib/sul/CachingSULTest.java index b14e3583..0d76c1e6 100644 --- a/src/test/java/de/learnlib/ralib/sul/CachingSULTest.java +++ b/src/test/java/de/learnlib/ralib/sul/CachingSULTest.java @@ -28,7 +28,7 @@ public void stepTest() { IOCache ioCache = new IOCache(ioOracle); CachingSUL cachingSul = new CachingSUL(sul, ioCache); cachingSul.pre(); - PSymbolInstance ok = cachingSul.step(new PSymbolInstance(OFFER, new DataValue(DOUBLE_TYPE, new BigDecimal(1)))); + PSymbolInstance ok = cachingSul.step(new PSymbolInstance(OFFER, new DataValue(DOUBLE_TYPE, new BigDecimal(1)))); PSymbolInstance out = cachingSul.step(new PSymbolInstance(POLL)); cachingSul.post(); Assert.assertEquals(ok.getBaseSymbol(), OK); @@ -46,7 +46,7 @@ public void cachingTest() { cachingSul.pre(); - cachingSul.step(new PSymbolInstance(OFFER, new DataValue(DOUBLE_TYPE, new BigDecimal(1)))); + cachingSul.step(new PSymbolInstance(OFFER, new DataValue(DOUBLE_TYPE, new BigDecimal(1)))); cachingSul.step(new PSymbolInstance(POLL)); cachingSul.post(); @@ -54,7 +54,7 @@ public void cachingTest() { Assert.assertEquals(sul.getResets(), 1); cachingSul.pre(); - cachingSul.step(new PSymbolInstance(OFFER, new DataValue(DOUBLE_TYPE, new BigDecimal(1)))); + cachingSul.step(new PSymbolInstance(OFFER, new DataValue(DOUBLE_TYPE, new BigDecimal(1)))); cachingSul.step(new PSymbolInstance(POLL)); cachingSul.post(); diff --git a/src/test/java/de/learnlib/ralib/theory/EquivalenceClassCoverageTest.java b/src/test/java/de/learnlib/ralib/theory/EquivalenceClassCoverageTest.java index 3716eea5..d4b673d9 100644 --- a/src/test/java/de/learnlib/ralib/theory/EquivalenceClassCoverageTest.java +++ b/src/test/java/de/learnlib/ralib/theory/EquivalenceClassCoverageTest.java @@ -1,6 +1,6 @@ package de.learnlib.ralib.theory; -import static de.learnlib.ralib.solver.jconstraints.JContraintsUtil.toVariable; +import static de.learnlib.ralib.smt.jconstraints.JContraintsUtil.toVariable; import java.math.BigDecimal; import java.util.ArrayList; @@ -8,6 +8,7 @@ import java.util.LinkedHashMap; import java.util.Map; +import de.learnlib.ralib.smt.ConstraintSolverFactory; import org.testng.Assert; import org.testng.annotations.Test; @@ -20,9 +21,9 @@ import de.learnlib.ralib.data.util.SymbolicDataValueGenerator.SuffixValueGenerator; import de.learnlib.ralib.learning.SymbolicSuffix; import de.learnlib.ralib.oracles.mto.MultiTheoryTreeOracle; -import de.learnlib.ralib.solver.ConstraintSolver; -import de.learnlib.ralib.solver.jconstraints.JConstraintsConstraintSolver; -import de.learnlib.ralib.solver.simple.SimpleConstraintSolver; +import de.learnlib.ralib.smt.ConstraintSolver; +import de.learnlib.ralib.smt.jconstraints.JConstraintsConstraintSolver; + import de.learnlib.ralib.theory.inequality.IntervalGuard; import de.learnlib.ralib.tools.theories.DoubleInequalityTheory; import de.learnlib.ralib.tools.theories.IntegerEqualityTheory; @@ -36,23 +37,23 @@ public class EquivalenceClassCoverageTest extends RaLibTestSuite { @Test public void testEqualityTheory() { - DataType type = new DataType("int",Integer.class); + DataType type = new DataType("int"); final Map teachers = new LinkedHashMap<>(); IntegerEqualityTheory dit = new IntegerEqualityTheory(type); dit.setUseSuffixOpt(false); teachers.put(type, dit); - ConstraintSolver solver = new SimpleConstraintSolver(); + ConstraintSolver solver = ConstraintSolverFactory.createZ3ConstraintSolver(); EqCRecordingOracle oracle = new EqCRecordingOracle(); MultiTheoryTreeOracle mto = new MultiTheoryTreeOracle( oracle, teachers, new Constants(), solver); InputSymbol A = new InputSymbol("a", type); - DataValue d0 = new DataValue(type, 0); - DataValue d1 = new DataValue(type, 1); - DataValue d2 = new DataValue(type, 2); - DataValue d3 = new DataValue(type, 3); + DataValue d0 = new DataValue(type, BigDecimal.ZERO); + DataValue d1 = new DataValue(type, BigDecimal.ONE); + DataValue d2 = new DataValue(type, new BigDecimal(2)); + DataValue d3 = new DataValue(type, new BigDecimal(3)); PSymbolInstance symbol = new PSymbolInstance(A, d0); Word prefix = Word.epsilon(); @@ -72,7 +73,7 @@ public void testEqualityTheory() { @Test public void testDoubleInequalityTheory() { - DataType type = new DataType("double", BigDecimal.class); + DataType type = new DataType("double"); final Map teachers = new LinkedHashMap<>(); DoubleInequalityTheory dit = new DoubleInequalityTheory(type); @@ -107,10 +108,10 @@ public void testDoubleInequalityTheory() { private static Collection> permutationsEqWith4Params(InputSymbol A) { DataType type = A.getPtypes()[0]; - DataValue d0 = new DataValue(type, 0); - DataValue d1 = new DataValue(type, 1); - DataValue d2 = new DataValue(type, 2); - DataValue d3 = new DataValue(type, 3); + DataValue d0 = new DataValue(type, BigDecimal.ZERO); + DataValue d1 = new DataValue(type, BigDecimal.ONE); + DataValue d2 = new DataValue(type, new BigDecimal(2)); + DataValue d3 = new DataValue(type, new BigDecimal(3)); Collection> expected = new ArrayList<>(); expected.add(Word.fromSymbols( new PSymbolInstance(A, d0), @@ -350,9 +351,9 @@ private static DataValue generateDecimal(DataValue d1, DataValue d2, DoubleInequ SuffixValue s3 = sgen.next(t); SDTGuard ig = new IntervalGuard(s3, s1, s2); Valuation vals1 = new Valuation(); - vals1.setValue(toVariable(s1), d1.getId()); - vals1.setValue(toVariable(s2), d2.getId()); - Collection> usedVals1 = new ArrayList<>(); + vals1.setValue(s1, d1.getValue()); + vals1.setValue(s2, d2.getValue()); + Collection usedVals1 = new ArrayList<>(); usedVals1.add(d1); usedVals1.add(d2); return theory.instantiate(ig, vals1, new Constants(), usedVals1); diff --git a/src/test/java/de/learnlib/ralib/theory/TestEqualityTheory.java b/src/test/java/de/learnlib/ralib/theory/TestEqualityTheory.java index de99672b..5313ee6c 100644 --- a/src/test/java/de/learnlib/ralib/theory/TestEqualityTheory.java +++ b/src/test/java/de/learnlib/ralib/theory/TestEqualityTheory.java @@ -23,10 +23,12 @@ import static de.learnlib.ralib.example.login.LoginAutomatonExample.T_PWD; import static de.learnlib.ralib.example.login.LoginAutomatonExample.T_UID; +import java.math.BigDecimal; import java.util.LinkedHashMap; import java.util.Map; import java.util.logging.Level; +import de.learnlib.ralib.smt.ConstraintSolverFactory; import org.testng.Assert; import org.testng.annotations.Test; @@ -44,7 +46,7 @@ import de.learnlib.ralib.oracles.SimulatorOracle; import de.learnlib.ralib.oracles.TreeQueryResult; import de.learnlib.ralib.oracles.mto.MultiTheoryTreeOracle; -import de.learnlib.ralib.solver.simple.SimpleConstraintSolver; + import de.learnlib.ralib.tools.theories.IntegerEqualityTheory; import de.learnlib.ralib.words.PSymbolInstance; import net.automatalib.word.Word; @@ -65,21 +67,21 @@ public void testLoginExample1() { theories.put(T_PWD, new IntegerEqualityTheory(T_PWD)); MultiTheoryTreeOracle treeOracle = new MultiTheoryTreeOracle( - oracle, theories, new Constants(), new SimpleConstraintSolver()); + oracle, theories, new Constants(), ConstraintSolverFactory.createZ3ConstraintSolver()); final Word longsuffix = Word.fromSymbols( new PSymbolInstance(I_LOGIN, - new DataValue(T_UID, 1), - new DataValue(T_PWD, 1)), + new DataValue(T_UID, BigDecimal.ONE), + new DataValue(T_PWD, BigDecimal.ONE)), new PSymbolInstance(I_LOGOUT), new PSymbolInstance(I_LOGIN, - new DataValue(T_UID, 1), - new DataValue(T_PWD, 1))); + new DataValue(T_UID, BigDecimal.ONE), + new DataValue(T_PWD, BigDecimal.ONE))); final Word prefix = Word.fromSymbols( new PSymbolInstance(I_REGISTER, - new DataValue(T_UID, 1), - new DataValue(T_PWD, 1))); + new DataValue(T_UID, BigDecimal.ONE), + new DataValue(T_PWD, BigDecimal.ONE))); // create a symbolic suffix from the concrete suffix diff --git a/src/test/java/de/learnlib/ralib/theory/TestIneqEqTree.java b/src/test/java/de/learnlib/ralib/theory/TestIneqEqTree.java index 4a2c6b77..41d6e793 100644 --- a/src/test/java/de/learnlib/ralib/theory/TestIneqEqTree.java +++ b/src/test/java/de/learnlib/ralib/theory/TestIneqEqTree.java @@ -40,7 +40,7 @@ import de.learnlib.ralib.oracles.Branching; import de.learnlib.ralib.oracles.TreeQueryResult; import de.learnlib.ralib.oracles.mto.MultiTheoryTreeOracle; -import de.learnlib.ralib.solver.jconstraints.JConstraintsConstraintSolver; +import de.learnlib.ralib.smt.jconstraints.JConstraintsConstraintSolver; import de.learnlib.ralib.tools.theories.DoubleInequalityTheory; import de.learnlib.ralib.words.PSymbolInstance; import net.automatalib.word.Word; diff --git a/src/test/java/de/learnlib/ralib/theory/TestIneqOutputTree.java b/src/test/java/de/learnlib/ralib/theory/TestIneqOutputTree.java index dcfaa76f..c0ccaffb 100644 --- a/src/test/java/de/learnlib/ralib/theory/TestIneqOutputTree.java +++ b/src/test/java/de/learnlib/ralib/theory/TestIneqOutputTree.java @@ -37,7 +37,7 @@ import de.learnlib.ralib.learning.SymbolicSuffix; import de.learnlib.ralib.oracles.TreeQueryResult; import de.learnlib.ralib.oracles.mto.MultiTheoryTreeOracle; -import de.learnlib.ralib.solver.jconstraints.JConstraintsConstraintSolver; +import de.learnlib.ralib.smt.jconstraints.JConstraintsConstraintSolver; import de.learnlib.ralib.sul.DataWordSUL; import de.learnlib.ralib.tools.theories.DoubleInequalityTheory; import de.learnlib.ralib.words.InputSymbol; @@ -68,7 +68,7 @@ public void post() { @Override public PSymbolInstance step(PSymbolInstance i) throws SULException { return new PSymbolInstance(OUT, new DataValue(TYPE, - ((BigDecimal)i.getParameterValues()[0].getId()).add(BigDecimal.ONE))); + ((BigDecimal)i.getParameterValues()[0].getValue()).add(BigDecimal.ONE))); } } diff --git a/src/test/java/de/learnlib/ralib/theory/TestTreeOracle.java b/src/test/java/de/learnlib/ralib/theory/TestTreeOracle.java index f23cf7bc..6a2e4e56 100644 --- a/src/test/java/de/learnlib/ralib/theory/TestTreeOracle.java +++ b/src/test/java/de/learnlib/ralib/theory/TestTreeOracle.java @@ -16,6 +16,7 @@ */ package de.learnlib.ralib.theory; +import java.math.BigDecimal; import java.util.Arrays; import java.util.Collection; import java.util.LinkedHashMap; @@ -23,6 +24,8 @@ import java.util.Map; import java.util.logging.Level; +import de.learnlib.ralib.smt.ConstraintSolverFactory; +import de.learnlib.ralib.tools.theories.IntegerEqualityTheory; import org.testng.Assert; import org.testng.annotations.Test; @@ -35,7 +38,7 @@ import de.learnlib.ralib.oracles.DataWordOracle; import de.learnlib.ralib.oracles.TreeQueryResult; import de.learnlib.ralib.oracles.mto.MultiTheoryTreeOracle; -import de.learnlib.ralib.solver.simple.SimpleConstraintSolver; + import de.learnlib.ralib.theory.equality.EqualityTheory; import de.learnlib.ralib.words.InputSymbol; import de.learnlib.ralib.words.PSymbolInstance; @@ -52,8 +55,8 @@ public class TestTreeOracle extends RaLibTestSuite { public void testTreeOracle() { // define types - final DataType userType = new DataType("userType", String.class); - final DataType passType = new DataType("passType", String.class); + final DataType userType = new DataType("userType"); + final DataType passType = new DataType("passType"); // define parameterized symbols final ParameterizedSymbol register = new InputSymbol( @@ -71,21 +74,21 @@ public void testTreeOracle() { // create prefix: register(falk[userType], secret[passType]) final Word prefix = Word.fromLetter( new PSymbolInstance(register, - new DataValue(userType, "falk"), - new DataValue(passType, "secret"))); + new DataValue(userType, BigDecimal.ONE), + new DataValue(passType, BigDecimal.ZERO))); final Word suffix = Word.fromSymbols( new PSymbolInstance(login, - new DataValue(userType, "falk"), - new DataValue(passType, "secret")) + new DataValue(userType, BigDecimal.ONE), + new DataValue(passType, BigDecimal.ZERO)) ); // create a symbolic suffix from the concrete suffix // symbolic data values: s1, s2 (userType, passType) final SymbolicSuffix symSuffix = new SymbolicSuffix(prefix, suffix); - //System.out.println("Prefix: " + prefix); - //System.out.println("Suffix: " + symSuffix); + System.out.println("Prefix: " + prefix); + System.out.println("Suffix: " + symSuffix); // hacked oracle @@ -115,37 +118,8 @@ public void processQueries(Collection> } }; - Theory userTheory = new EqualityTheory() { - - @Override - public DataValue getFreshValue(List> vals) { - DataValue v = vals.get(0); - return new DataValue(v.getType(), - v.getId().toString() + "_" + vals.size()); - } - - @Override - public Collection> getAllNextValues(List> vals) { - throw new UnsupportedOperationException("Not supported yet."); - } - - }; - - Theory passTheory = new EqualityTheory() { - - @Override - public DataValue getFreshValue(List> vals) { - DataValue v = vals.get(0); - return new DataValue(v.getType(), - v.getId().toString() + "_" + vals.size()); - } - - @Override - public Collection> getAllNextValues(List> vals) { - throw new UnsupportedOperationException("Not supported yet."); - } - - }; + Theory userTheory = new IntegerEqualityTheory(userType); + Theory passTheory = new IntegerEqualityTheory(passType); Map theories = new LinkedHashMap(); theories.put(userType, userTheory); @@ -153,7 +127,7 @@ public Collection> getAllNextValues(List> va MultiTheoryTreeOracle treeOracle = new MultiTheoryTreeOracle( dwOracle, theories, - new Constants(), new SimpleConstraintSolver()); + new Constants(), ConstraintSolverFactory.createZ3ConstraintSolver()); TreeQueryResult res = treeOracle.treeQuery(prefix, symSuffix); diff --git a/src/test/java/de/learnlib/ralib/theory/TestUniqueEqualityTheory.java b/src/test/java/de/learnlib/ralib/theory/TestUniqueEqualityTheory.java index 49f1cdf3..b6272fe3 100644 --- a/src/test/java/de/learnlib/ralib/theory/TestUniqueEqualityTheory.java +++ b/src/test/java/de/learnlib/ralib/theory/TestUniqueEqualityTheory.java @@ -2,10 +2,12 @@ import static de.learnlib.ralib.example.login.LoginAutomatonExample.*; +import java.math.BigDecimal; import java.util.LinkedHashMap; import java.util.Map; import java.util.logging.Level; +import de.learnlib.ralib.smt.ConstraintSolverFactory; import org.testng.Assert; import org.testng.annotations.Test; @@ -18,7 +20,7 @@ import de.learnlib.ralib.oracles.SimulatorOracle; import de.learnlib.ralib.oracles.TreeQueryResult; import de.learnlib.ralib.oracles.mto.MultiTheoryTreeOracle; -import de.learnlib.ralib.solver.simple.SimpleConstraintSolver; + import de.learnlib.ralib.tools.theories.UniqueIntegerEqualityTheory; import de.learnlib.ralib.words.PSymbolInstance; import net.automatalib.word.Word; @@ -35,21 +37,21 @@ public void testLoginExample1() { theories.put(T_PWD, new UniqueIntegerEqualityTheory(T_PWD)); MultiTheoryTreeOracle treeOracle = new MultiTheoryTreeOracle( - oracle, theories, new Constants(), new SimpleConstraintSolver()); + oracle, theories, new Constants(), ConstraintSolverFactory.createZ3ConstraintSolver()); final Word longsuffix = Word.fromSymbols( new PSymbolInstance(I_LOGIN, - new DataValue(T_UID, 1), - new DataValue(T_PWD, 1)), + new DataValue(T_UID, BigDecimal.ONE), + new DataValue(T_PWD, BigDecimal.ONE)), new PSymbolInstance(I_LOGOUT), new PSymbolInstance(I_LOGIN, - new DataValue(T_UID, 2), - new DataValue(T_PWD, 2))); + new DataValue(T_UID, new BigDecimal(2)), + new DataValue(T_PWD, new BigDecimal(2)))); final Word prefix = Word.fromSymbols( new PSymbolInstance(I_REGISTER, - new DataValue(T_UID, 1), - new DataValue(T_PWD, 1))); + new DataValue(T_UID, BigDecimal.ONE), + new DataValue(T_PWD, BigDecimal.ONE))); // create a symbolic suffix from the concrete suffix diff --git a/src/test/java/de/learnlib/ralib/tools/ClassAnalyzerTest.java b/src/test/java/de/learnlib/ralib/tools/ClassAnalyzerTest.java index c2afef78..9e30b5b3 100644 --- a/src/test/java/de/learnlib/ralib/tools/ClassAnalyzerTest.java +++ b/src/test/java/de/learnlib/ralib/tools/ClassAnalyzerTest.java @@ -34,8 +34,8 @@ public void classAnalyzerWithMultiloginTest() { "class-analyzer", "target=de.learnlib.ralib.example.login.FreshMultiLogin;" + "methods=" + - "IRegister(java.lang.Integer:uid)java.lang.Integer:pwd+" + - "ILogin(java.lang.Integer:uid,java.lang.Integer:pwd)boolean:boolean;" + + "IRegister(java.math.BigDecimal:uid)java.math.BigDecimal:pwd+" + + "ILogin(java.math.BigDecimal:uid,java.math.BigDecimal:pwd)boolean:boolean;" + //"ILogout(java.lang.Integer:int)boolean:boolean+" + //"IChangePassword(java.lang.Integer:int,java.lang.Integer:int)boolean:boolean;" + "random.seed=6521023071547789;" + @@ -71,8 +71,8 @@ public void classAnalyzerWithFreshValuesTest() { final String[] options = new String[] { "class-analyzer", "target=de.learnlib.ralib.example.keygen.KeyGenMap;" + - "methods=put(java.lang.Integer:int)java.lang.Integer:int+" - + "get(java.lang.Integer:int)java.lang.Integer:int;" + + "methods=put(java.math.BigDecimal:int)java.math.BigDecimal:int+" + + "get(java.math.BigDecimal:int)java.math.BigDecimal:int;" + "random.seed=652102309071547789;" + "logging.level=WARNING;" + "max.time.millis=600000;" + @@ -137,8 +137,8 @@ public void classAnalyzerConstantsTest() { final String[] options = new String[] { "class-analyzer", "target=de.learnlib.ralib.example.container.ContainerSUL;" + - "methods=put(java.lang.Integer:int)void+" + - "get()java.lang.Integer:int;" + + "methods=put(java.math.BigDecimal:int)void+" + + "get()java.math.BigDecimal:int;" + "random.seed=652102309071547789;" + "logging.level=WARNING;" + "max.time.millis=600000;" + diff --git a/src/test/java/de/learnlib/ralib/words/TestWords.java b/src/test/java/de/learnlib/ralib/words/TestWords.java index dfd7200c..418399a7 100644 --- a/src/test/java/de/learnlib/ralib/words/TestWords.java +++ b/src/test/java/de/learnlib/ralib/words/TestWords.java @@ -22,6 +22,7 @@ import static de.learnlib.ralib.example.login.LoginAutomatonExample.T_PWD; import static de.learnlib.ralib.example.login.LoginAutomatonExample.T_UID; +import java.math.BigDecimal; import java.util.Collection; import java.util.LinkedHashMap; import java.util.Map; @@ -50,13 +51,13 @@ public class TestWords extends RaLibTestSuite { @Test public void testSymbolicSuffix1() { - DataType intType = new DataType("int", int.class); + DataType intType = new DataType("int"); ParameterizedSymbol a = new InputSymbol("a", new DataType[]{intType}); - DataValue i1 = new DataValue(intType, 1); - DataValue i2 = new DataValue(intType, 2); - DataValue i3 = new DataValue(intType, 3); + DataValue i1 = new DataValue(intType, BigDecimal.ONE); + DataValue i2 = new DataValue(intType, new BigDecimal(2)); + DataValue i3 = new DataValue(intType, new BigDecimal(3)); PSymbolInstance[] prefixSymbols = new PSymbolInstance[] { new PSymbolInstance(a, i1), @@ -97,22 +98,22 @@ public void testSymbolicSuffix2() { final Word prefix1 = Word.fromSymbols( new PSymbolInstance(I_REGISTER, - new DataValue(T_UID, 1), - new DataValue(T_PWD, 1))); + new DataValue(T_UID, BigDecimal.ONE), + new DataValue(T_PWD, BigDecimal.ONE))); final Word prefix2 = Word.fromSymbols( new PSymbolInstance(I_REGISTER, - new DataValue(T_UID, 1), - new DataValue(T_PWD, 1)), + new DataValue(T_UID, BigDecimal.ONE), + new DataValue(T_PWD, BigDecimal.ONE)), new PSymbolInstance(I_LOGIN, - new DataValue(T_UID, 1), - new DataValue(T_PWD, 1)), + new DataValue(T_UID, BigDecimal.ONE), + new DataValue(T_PWD, BigDecimal.ONE)), new PSymbolInstance(I_LOGOUT)); final Word suffix = Word.fromSymbols( new PSymbolInstance(I_LOGIN, - new DataValue(T_UID, 1), - new DataValue(T_PWD, 1))); + new DataValue(T_UID, BigDecimal.ONE), + new DataValue(T_PWD, BigDecimal.ONE))); final SymbolicSuffix symSuffix1 = new SymbolicSuffix(prefix1, suffix); final SymbolicSuffix symSuffix2 = new SymbolicSuffix(prefix2, symSuffix1); @@ -123,8 +124,8 @@ public void testSymbolicSuffix2() { logger.log(Level.FINE, "Sym. Suffix 1: {0}", symSuffix1); logger.log(Level.FINE, "Sym. Suffix 2: {0}", symSuffix2); - String expected1 = "((login[s1, s2]))[Unrestricted(s1), Unrestricted(s2)]"; - String expected2 = "((logout[] login[s1, s2]))[Unrestricted(s1), Unrestricted(s2)]"; + String expected1 = "((?login[T_uid, T_pwd]))[Unrestricted(s1), Unrestricted(s2)]"; + String expected2 = "((?logout[] ?login[T_uid, T_pwd]))[Unrestricted(s1), Unrestricted(s2)]"; Assert.assertEquals(symSuffix1.toString(), expected1); Assert.assertEquals(symSuffix2.toString(), expected2); From e03b5239275a66707da9faf1b77eb26c64c33c51 Mon Sep 17 00:00:00 2001 From: Falk Howar Date: Fri, 21 Feb 2025 17:00:56 +0100 Subject: [PATCH 02/26] remove guardexpression --- .../ralib/automata/TransitionGuard.java | 73 ---------- .../guards/AtomicGuardExpression.java | 129 ------------------ .../ralib/automata/guards/Conjunction.java | 77 ----------- .../ralib/automata/guards/Disjunction.java | 77 ----------- .../automata/guards/FalseGuardExpression.java | 54 -------- .../automata/guards/GuardExpression.java | 46 ------- .../ralib/automata/guards/Negation.java | 64 --------- .../automata/guards/TrueGuardExpression.java | 54 -------- .../automata/output/OutputTransition.java | 1 - .../learnlib/ralib/automata/util/RAToDot.java | 2 - .../ralib/automata/xml/ExpressionParser.java | 6 - .../xml/RegisterAutomatonImporter.java | 1 - .../ralib/ceanalysis/PrefixFinder.java | 10 +- src/main/java/de/learnlib/ralib/dt/DTHyp.java | 1 - .../java/de/learnlib/ralib/dt/DTLeaf.java | 1 - .../ralib/equivalence/IOEquivalenceTest.java | 2 +- .../ralib/learning/AutomatonBuilder.java | 1 - .../learning/CounterexampleAnalysis.java | 1 - .../learnlib/ralib/learning/Hypothesis.java | 1 - .../ralib/learning/IOAutomatonBuilder.java | 6 - .../ralib/learning/ralambda/RaLambda.java | 1 - .../ralib/learning/rastar/Component.java | 1 - .../de/learnlib/ralib/oracles/Branching.java | 1 - .../ralib/oracles/SDTLogicOracle.java | 4 +- .../oracles/mto/MultiTheoryBranching.java | 23 +--- .../mto/MultiTheorySDTLogicOracle.java | 29 ++-- .../oracles/mto/MultiTheoryTreeOracle.java | 24 ++-- .../mto/OptimizedSymbolicSuffixBuilder.java | 18 +-- .../de/learnlib/ralib/oracles/mto/SDT.java | 50 ++++--- .../learnlib/ralib/smt/ConstraintSolver.java | 5 +- .../ralib/smt/ConstraintSolverFactory.java | 14 -- .../java/de/learnlib/ralib/smt/SMTUtils.java | 12 ++ .../JConstraintsConstraintSolver.java | 8 -- .../smt/jconstraints/JContraintsUtil.java | 98 ------------- .../ralib/theory/EquivalenceClassFilter.java | 16 ++- .../ralib/theory/FreshSuffixValue.java | 17 +-- .../de/learnlib/ralib/theory/SDTAndGuard.java | 17 ++- .../de/learnlib/ralib/theory/SDTGuard.java | 9 +- .../learnlib/ralib/theory/SDTMultiGuard.java | 4 +- .../de/learnlib/ralib/theory/SDTOrGuard.java | 17 ++- .../learnlib/ralib/theory/SDTTrueGuard.java | 8 +- .../ralib/theory/SuffixValueRestriction.java | 4 +- .../ralib/theory/UnrestrictedSuffixValue.java | 8 +- .../theory/equality/DisequalityGuard.java | 11 +- .../theory/equality/EqualRestriction.java | 9 +- .../ralib/theory/equality/EqualityGuard.java | 11 +- .../ralib/theory/equality/EqualityTheory.java | 3 + .../theory/inequality/IntervalGuard.java | 19 +-- .../theories/DoubleInequalityTheory.java | 8 +- .../equivalence/RAEquivalenceTestTest.java | 3 - .../example/keygen/MapAutomatonExample.java | 4 - .../llambda/LLambdaAutomatonExample.java | 1 - .../example/login/LoginAutomatonExample.java | 6 - .../example/sdts/LoginExampleBranching.java | 1 - .../example/sdts/LoginExampleTreeOracle.java | 6 - .../example/stack/StackAutomatonExample.java | 3 - .../learning/ralambda/IOHandlingTest.java | 3 - .../ralib/learning/ralambda/LearnPadlock.java | 3 - .../TestDistinguishingSuffixOptimization.java | 1 - .../ralib/learning/ralambda/TestSymmetry.java | 5 - .../ralambda/TestUnknownMemorable.java | 4 - .../mto/InstantiateSymbolicWordTest.java | 4 - 62 files changed, 166 insertions(+), 934 deletions(-) delete mode 100644 src/main/java/de/learnlib/ralib/automata/TransitionGuard.java delete mode 100644 src/main/java/de/learnlib/ralib/automata/guards/AtomicGuardExpression.java delete mode 100644 src/main/java/de/learnlib/ralib/automata/guards/Conjunction.java delete mode 100644 src/main/java/de/learnlib/ralib/automata/guards/Disjunction.java delete mode 100644 src/main/java/de/learnlib/ralib/automata/guards/FalseGuardExpression.java delete mode 100644 src/main/java/de/learnlib/ralib/automata/guards/GuardExpression.java delete mode 100644 src/main/java/de/learnlib/ralib/automata/guards/Negation.java delete mode 100644 src/main/java/de/learnlib/ralib/automata/guards/TrueGuardExpression.java diff --git a/src/main/java/de/learnlib/ralib/automata/TransitionGuard.java b/src/main/java/de/learnlib/ralib/automata/TransitionGuard.java deleted file mode 100644 index 6850991b..00000000 --- a/src/main/java/de/learnlib/ralib/automata/TransitionGuard.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright (C) 2014-2015 The LearnLib Contributors - * This file is part of LearnLib, http://www.learnlib.de/. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package de.learnlib.ralib.automata; - -import de.learnlib.ralib.automata.guards.GuardExpression; -import de.learnlib.ralib.automata.guards.TrueGuardExpression; -import de.learnlib.ralib.data.*; -import gov.nasa.jpf.constraints.api.Expression; - -/** - * Transition Guard. - * - * @author falk - */ -@Deprecated -public class TransitionGuard { - - private final GuardExpression condition; - - public TransitionGuard() { - this.condition = TrueGuardExpression.TRUE; - } - - public TransitionGuard(GuardExpression condition) { - assert condition != null; - this.condition = condition; - } - - /** - * Checks if the guard is satisfied for the given assignments of - * registers, parameters, and named constants. - * - * @param registers - * @param parameters - * @param consts - * @return - */ - public boolean isSatisfied(VarValuation registers, ParValuation parameters, Constants consts) { - Mapping val = new Mapping<>(); - val.putAll(registers); - val.putAll(parameters); - val.putAll(consts); - - return condition.isSatisfied(val); - } - - @Override - public String toString() { - return condition.toString(); - } - - /** - * @return the condition - */ - public GuardExpression getCondition() { - return condition; - } - -} diff --git a/src/main/java/de/learnlib/ralib/automata/guards/AtomicGuardExpression.java b/src/main/java/de/learnlib/ralib/automata/guards/AtomicGuardExpression.java deleted file mode 100644 index 9968a7fe..00000000 --- a/src/main/java/de/learnlib/ralib/automata/guards/AtomicGuardExpression.java +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Copyright (C) 2014-2015 The LearnLib Contributors - * This file is part of LearnLib, http://www.learnlib.de/. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package de.learnlib.ralib.automata.guards; - -import java.util.Set; - -import de.learnlib.ralib.data.DataValue; -import de.learnlib.ralib.data.Mapping; -import de.learnlib.ralib.data.SymbolicDataValue; -import de.learnlib.ralib.data.VarMapping; - -/** - * - * @author falk - * @param - * @param - */ -@Deprecated -public class AtomicGuardExpression extends GuardExpression { - - private final Left left; - - private final Relation relation; - - private final Right right; - - public AtomicGuardExpression(Left left, Relation relation, Right right) { - this.left = left; - this.relation = relation; - this.right = right; - } - - @Override - public boolean isSatisfied(Mapping val) { - - DataValue lv = val.get(left); - DataValue rv = val.get(right); - - //System.out.println(this); - //System.out.println(val.toString()); - - assert lv != null && rv != null; - - switch (relation) { - case EQUALS: - return lv.equals(rv); - case NOT_EQUALS: - return !lv.equals(rv); - case BIGGER: - case SMALLER: - return numCompare(lv, rv, relation); - - default: - throw new UnsupportedOperationException( - "Relation " + relation + " is not supported in guards"); - } - } - - @Override - public GuardExpression relabel(VarMapping relabelling) { - SymbolicDataValue newLeft = (SymbolicDataValue) relabelling.get(left); - if (newLeft == null) { - newLeft = left; - } - SymbolicDataValue newRight = (SymbolicDataValue) relabelling.get(right); - if (newRight == null) { - newRight = right; - } - - return new AtomicGuardExpression(newLeft, relation, newRight); - } - - @Override - public String toString() { - return "(" + left + relation + right + ")"; - } - - public Left getLeft() { - return left; - } - - public Right getRight() { - return right; - } - - @Override - protected void getSymbolicDataValues(Set vals) { - vals.add(left); - vals.add(right); - } - - public Relation getRelation() { - return relation; - } - - private boolean numCompare(DataValue l, DataValue r, Relation relation) { - if (!l.getDataType().equals(r.getDataType())) { - return false; - } - - Comparable lc = (Comparable) l.getValue(); - int result = lc.compareTo(r.getValue()); - switch (relation) { - case SMALLER: - return result < 0; - case BIGGER: - return result > 0; - - default: - throw new UnsupportedOperationException( - "Relation " + relation + " is not supported in guards"); - } - } - -} diff --git a/src/main/java/de/learnlib/ralib/automata/guards/Conjunction.java b/src/main/java/de/learnlib/ralib/automata/guards/Conjunction.java deleted file mode 100644 index da55f177..00000000 --- a/src/main/java/de/learnlib/ralib/automata/guards/Conjunction.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright (C) 2014-2015 The LearnLib Contributors - * This file is part of LearnLib, http://www.learnlib.de/. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package de.learnlib.ralib.automata.guards; - -import java.util.Set; - -import org.apache.commons.lang3.StringUtils; - -import de.learnlib.ralib.data.DataValue; -import de.learnlib.ralib.data.Mapping; -import de.learnlib.ralib.data.SymbolicDataValue; -import de.learnlib.ralib.data.VarMapping; - -/** - * - * @author falk - */ -@Deprecated -public class Conjunction extends GuardExpression { - - private final GuardExpression[] conjuncts; - - public Conjunction(GuardExpression ... conjuncts) { - this.conjuncts = conjuncts; - } - - @Override - public GuardExpression relabel(VarMapping relabelling) { - GuardExpression[] newExpr = new GuardExpression[conjuncts.length]; - int i = 0; - for (GuardExpression ge : conjuncts) { - newExpr[i++] = ge.relabel(relabelling); - } - return new Conjunction(newExpr); - } - - @Override - public boolean isSatisfied(Mapping val) { - for (GuardExpression ge : conjuncts) { - if (!ge.isSatisfied(val)) { - return false; - } - } - return true; - } - - @Override - public String toString() { - return StringUtils.join(conjuncts, " && "); - } - - @Override - protected void getSymbolicDataValues(Set vals) { - for (GuardExpression ge : conjuncts) { - ge.getSymbolicDataValues(vals); - } - } - - public GuardExpression[] getConjuncts() { - return conjuncts; - } - -} diff --git a/src/main/java/de/learnlib/ralib/automata/guards/Disjunction.java b/src/main/java/de/learnlib/ralib/automata/guards/Disjunction.java deleted file mode 100644 index 60cc545d..00000000 --- a/src/main/java/de/learnlib/ralib/automata/guards/Disjunction.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright (C) 2014-2015 The LearnLib Contributors - * This file is part of LearnLib, http://www.learnlib.de/. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package de.learnlib.ralib.automata.guards; - -import java.util.Set; - -import org.apache.commons.lang3.StringUtils; - -import de.learnlib.ralib.data.DataValue; -import de.learnlib.ralib.data.Mapping; -import de.learnlib.ralib.data.SymbolicDataValue; -import de.learnlib.ralib.data.VarMapping; - -/** - * - * @author falk - */ -@Deprecated -public class Disjunction extends GuardExpression { - - private final GuardExpression[] disjuncts; - - public Disjunction(GuardExpression ... disjuncts) { - this.disjuncts = disjuncts; - } - - @Override - public GuardExpression relabel(VarMapping relabelling) { - GuardExpression[] newExpr = new GuardExpression[disjuncts.length]; - int i = 0; - for (GuardExpression ge : disjuncts) { - newExpr[i++] = ge.relabel(relabelling); - } - return new Disjunction(newExpr); - } - - @Override - public boolean isSatisfied(Mapping val) { - for (GuardExpression ge : disjuncts) { - if (ge.isSatisfied(val)) { - return true; - } - } - return false; - } - - @Override - public String toString() { - return StringUtils.join(disjuncts, " || "); - } - - @Override - protected void getSymbolicDataValues(Set vals) { - for (GuardExpression ge : disjuncts) { - ge.getSymbolicDataValues(vals); - } - } - - public GuardExpression[] getDisjuncts() { - return disjuncts; - } - -} diff --git a/src/main/java/de/learnlib/ralib/automata/guards/FalseGuardExpression.java b/src/main/java/de/learnlib/ralib/automata/guards/FalseGuardExpression.java deleted file mode 100644 index f6a1218e..00000000 --- a/src/main/java/de/learnlib/ralib/automata/guards/FalseGuardExpression.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (C) 2014-2015 The LearnLib Contributors - * This file is part of LearnLib, http://www.learnlib.de/. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package de.learnlib.ralib.automata.guards; - -import java.util.Set; - -import de.learnlib.ralib.data.DataValue; -import de.learnlib.ralib.data.Mapping; -import de.learnlib.ralib.data.SymbolicDataValue; -import de.learnlib.ralib.data.VarMapping; - -/** - * - * @author falk - */ -@Deprecated -public class FalseGuardExpression extends GuardExpression { - - public static final FalseGuardExpression FALSE = new FalseGuardExpression(); - - @Override - public GuardExpression relabel(VarMapping relabelling) { - return FALSE; - } - - @Override - public boolean isSatisfied(Mapping val) { - return true; - } - - @Override - public String toString() { - return "FALSE"; - } - - @Override - protected void getSymbolicDataValues(Set vals) { - } - -} diff --git a/src/main/java/de/learnlib/ralib/automata/guards/GuardExpression.java b/src/main/java/de/learnlib/ralib/automata/guards/GuardExpression.java deleted file mode 100644 index c0d02403..00000000 --- a/src/main/java/de/learnlib/ralib/automata/guards/GuardExpression.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright (C) 2014-2015 The LearnLib Contributors - * This file is part of LearnLib, http://www.learnlib.de/. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package de.learnlib.ralib.automata.guards; - -import java.util.LinkedHashSet; -import java.util.Set; - -import de.learnlib.ralib.data.DataValue; -import de.learnlib.ralib.data.Mapping; -import de.learnlib.ralib.data.SymbolicDataValue; -import de.learnlib.ralib.data.VarMapping; - -/** - * - * @author falk - * - */ -@Deprecated -public abstract class GuardExpression { - - public abstract GuardExpression relabel(VarMapping relabelling); - - public abstract boolean isSatisfied(Mapping val); - - public Set getSymbolicDataValues() { - Set set = new LinkedHashSet<>(); - getSymbolicDataValues(set); - return set; - } - - protected abstract void getSymbolicDataValues(Set vals); -} diff --git a/src/main/java/de/learnlib/ralib/automata/guards/Negation.java b/src/main/java/de/learnlib/ralib/automata/guards/Negation.java deleted file mode 100644 index 431c04eb..00000000 --- a/src/main/java/de/learnlib/ralib/automata/guards/Negation.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (C) 2014-2015 The LearnLib Contributors - * This file is part of LearnLib, http://www.learnlib.de/. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package de.learnlib.ralib.automata.guards; - -import java.util.Set; - -import de.learnlib.ralib.data.DataValue; -import de.learnlib.ralib.data.Mapping; -import de.learnlib.ralib.data.SymbolicDataValue; -import de.learnlib.ralib.data.VarMapping; - -/** - * - * @author falk - */ -@Deprecated -public class Negation extends GuardExpression { - - private final GuardExpression negated; - - public Negation(GuardExpression negated) { - this.negated = negated; - } - - public GuardExpression getNegated() { - return negated; - } - - @Override - public GuardExpression relabel(VarMapping relabelling) { - GuardExpression newNegated = negated.relabel(relabelling); - return new Negation(newNegated); - } - - @Override - public boolean isSatisfied(Mapping val) { - return !negated.isSatisfied(val); - } - - @Override - public String toString() { - return "(!" + negated + ")"; - } - - @Override - protected void getSymbolicDataValues(Set vals) { - this.negated.getSymbolicDataValues(vals); - } - -} diff --git a/src/main/java/de/learnlib/ralib/automata/guards/TrueGuardExpression.java b/src/main/java/de/learnlib/ralib/automata/guards/TrueGuardExpression.java deleted file mode 100644 index 6494125c..00000000 --- a/src/main/java/de/learnlib/ralib/automata/guards/TrueGuardExpression.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (C) 2014-2015 The LearnLib Contributors - * This file is part of LearnLib, http://www.learnlib.de/. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package de.learnlib.ralib.automata.guards; - -import java.util.Set; - -import de.learnlib.ralib.data.DataValue; -import de.learnlib.ralib.data.Mapping; -import de.learnlib.ralib.data.SymbolicDataValue; -import de.learnlib.ralib.data.VarMapping; - -/** - * - * @author falk - */ -@Deprecated -public class TrueGuardExpression extends GuardExpression { - - public static final TrueGuardExpression TRUE = new TrueGuardExpression(); - - @Override - public GuardExpression relabel(VarMapping relabelling) { - return TRUE; - } - - @Override - public boolean isSatisfied(Mapping val) { - return true; - } - - @Override - public String toString() { - return "TRUE"; - } - - @Override - protected void getSymbolicDataValues(Set vals) { - } - -} diff --git a/src/main/java/de/learnlib/ralib/automata/output/OutputTransition.java b/src/main/java/de/learnlib/ralib/automata/output/OutputTransition.java index 81a98640..1792a20f 100644 --- a/src/main/java/de/learnlib/ralib/automata/output/OutputTransition.java +++ b/src/main/java/de/learnlib/ralib/automata/output/OutputTransition.java @@ -21,7 +21,6 @@ import de.learnlib.ralib.automata.Assignment; import de.learnlib.ralib.automata.RALocation; import de.learnlib.ralib.automata.Transition; -import de.learnlib.ralib.automata.TransitionGuard; import de.learnlib.ralib.data.Constants; import de.learnlib.ralib.data.DataValue; import de.learnlib.ralib.data.ParValuation; diff --git a/src/main/java/de/learnlib/ralib/automata/util/RAToDot.java b/src/main/java/de/learnlib/ralib/automata/util/RAToDot.java index 446a02fa..40009a50 100644 --- a/src/main/java/de/learnlib/ralib/automata/util/RAToDot.java +++ b/src/main/java/de/learnlib/ralib/automata/util/RAToDot.java @@ -22,8 +22,6 @@ import de.learnlib.ralib.automata.RALocation; import de.learnlib.ralib.automata.RegisterAutomaton; import de.learnlib.ralib.automata.Transition; -import de.learnlib.ralib.automata.TransitionGuard; -import de.learnlib.ralib.automata.guards.TrueGuardExpression; import de.learnlib.ralib.automata.output.OutputTransition; import gov.nasa.jpf.constraints.util.ExpressionUtil; diff --git a/src/main/java/de/learnlib/ralib/automata/xml/ExpressionParser.java b/src/main/java/de/learnlib/ralib/automata/xml/ExpressionParser.java index e3592bd5..693c562c 100644 --- a/src/main/java/de/learnlib/ralib/automata/xml/ExpressionParser.java +++ b/src/main/java/de/learnlib/ralib/automata/xml/ExpressionParser.java @@ -21,12 +21,6 @@ import java.util.Map; import java.util.StringTokenizer; -import de.learnlib.ralib.automata.guards.AtomicGuardExpression; -import de.learnlib.ralib.automata.guards.Conjunction; -import de.learnlib.ralib.automata.guards.Disjunction; -import de.learnlib.ralib.automata.guards.GuardExpression; -import de.learnlib.ralib.automata.guards.Relation; -import de.learnlib.ralib.automata.guards.TrueGuardExpression; import de.learnlib.ralib.data.SymbolicDataValue; import gov.nasa.jpf.constraints.api.Expression; import gov.nasa.jpf.constraints.expressions.NumericBooleanExpression; diff --git a/src/main/java/de/learnlib/ralib/automata/xml/RegisterAutomatonImporter.java b/src/main/java/de/learnlib/ralib/automata/xml/RegisterAutomatonImporter.java index 91cbe3cb..774dd5ce 100644 --- a/src/main/java/de/learnlib/ralib/automata/xml/RegisterAutomatonImporter.java +++ b/src/main/java/de/learnlib/ralib/automata/xml/RegisterAutomatonImporter.java @@ -40,7 +40,6 @@ import de.learnlib.ralib.automata.InputTransition; import de.learnlib.ralib.automata.MutableRegisterAutomaton; import de.learnlib.ralib.automata.RALocation; -import de.learnlib.ralib.automata.TransitionGuard; import de.learnlib.ralib.automata.output.OutputMapping; import de.learnlib.ralib.automata.output.OutputTransition; import de.learnlib.ralib.automata.xml.RegisterAutomaton.Transitions.Transition; diff --git a/src/main/java/de/learnlib/ralib/ceanalysis/PrefixFinder.java b/src/main/java/de/learnlib/ralib/ceanalysis/PrefixFinder.java index de08067d..7374e370 100644 --- a/src/main/java/de/learnlib/ralib/ceanalysis/PrefixFinder.java +++ b/src/main/java/de/learnlib/ralib/ceanalysis/PrefixFinder.java @@ -5,14 +5,14 @@ import java.util.Map; import java.util.Set; +import de.learnlib.ralib.smt.SMTUtils; +import gov.nasa.jpf.constraints.api.Expression; import gov.nasa.jpf.constraints.util.ExpressionUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import de.learnlib.logging.Category; import de.learnlib.query.DefaultQuery; -import de.learnlib.ralib.automata.TransitionGuard; -import de.learnlib.ralib.automata.guards.GuardExpression; import de.learnlib.ralib.data.Constants; import de.learnlib.ralib.data.DataType; import de.learnlib.ralib.data.DataValue; @@ -237,7 +237,7 @@ private SymbolicWord candidate(Word prefix, SymbolicDecisionTree sdtHyp, PIV pivHyp, Word ce) { Word candidate = null; - GuardExpression expr = sdtOracle.getCEGuard(prefix, sdtSul, pivSul, sdtHyp, pivHyp); + Expression expr = sdtOracle.getCEGuard(prefix, sdtSul, pivSul, sdtHyp, pivHyp); Map, Boolean> sulPaths = sulOracle.instantiate(prefix, symSuffix, sdtSul, pivSul); for (Word path : sulPaths.keySet()) { @@ -256,7 +256,7 @@ private SymbolicWord candidate(Word prefix, renaming.put(sv, p); } } - GuardExpression exprR = expr.relabel(renaming); + Expression exprR = SMTUtils.renameVars(expr, renaming); ParValuation pars = new ParValuation(path); Mapping vals = new Mapping<>(); @@ -264,7 +264,7 @@ private SymbolicWord candidate(Word prefix, vals.putAll(pars); vals.putAll(consts); - if (exprR.isSatisfied(vals)) { + if (exprR.evaluateSMT(SMTUtils.compose(vals))) { candidate = path.prefix(prefix.length() + 1); SymbolicSuffix suffix = new SymbolicSuffix(candidate, ce.suffix(symSuffix.length() - 1), restrictionBuilder); return new SymbolicWord(candidate, suffix); diff --git a/src/main/java/de/learnlib/ralib/dt/DTHyp.java b/src/main/java/de/learnlib/ralib/dt/DTHyp.java index 9b3cca5a..7a2fa102 100644 --- a/src/main/java/de/learnlib/ralib/dt/DTHyp.java +++ b/src/main/java/de/learnlib/ralib/dt/DTHyp.java @@ -6,7 +6,6 @@ import java.util.Map; import java.util.Set; -import de.learnlib.ralib.automata.TransitionGuard; import de.learnlib.ralib.data.Constants; import de.learnlib.ralib.data.ParValuation; import de.learnlib.ralib.data.VarValuation; diff --git a/src/main/java/de/learnlib/ralib/dt/DTLeaf.java b/src/main/java/de/learnlib/ralib/dt/DTLeaf.java index a1257bd7..e0072113 100644 --- a/src/main/java/de/learnlib/ralib/dt/DTLeaf.java +++ b/src/main/java/de/learnlib/ralib/dt/DTLeaf.java @@ -19,7 +19,6 @@ import org.apache.commons.lang3.tuple.Pair; import de.learnlib.ralib.automata.Assignment; -import de.learnlib.ralib.automata.TransitionGuard; import de.learnlib.ralib.data.Constants; import de.learnlib.ralib.data.DataValue; import de.learnlib.ralib.data.Mapping; diff --git a/src/main/java/de/learnlib/ralib/equivalence/IOEquivalenceTest.java b/src/main/java/de/learnlib/ralib/equivalence/IOEquivalenceTest.java index d81066cc..1f429d46 100644 --- a/src/main/java/de/learnlib/ralib/equivalence/IOEquivalenceTest.java +++ b/src/main/java/de/learnlib/ralib/equivalence/IOEquivalenceTest.java @@ -505,7 +505,7 @@ private PSymbolInstance createOutputSymbol(OutputTransition ot, VarValuation reg forFresh.addAll(register.values()); forFresh.addAll(register2.values()); List old = computeOld(t, pval, valSet(forFresh, t)); - System.out.println("OLD:" + Arrays.toString(old.toArray())); + //System.out.println("OLD:" + Arrays.toString(old.toArray())); vals[i] = teacher.get(t).getFreshValue(old); } else { diff --git a/src/main/java/de/learnlib/ralib/learning/AutomatonBuilder.java b/src/main/java/de/learnlib/ralib/learning/AutomatonBuilder.java index a0d46f3e..09989b07 100644 --- a/src/main/java/de/learnlib/ralib/learning/AutomatonBuilder.java +++ b/src/main/java/de/learnlib/ralib/learning/AutomatonBuilder.java @@ -29,7 +29,6 @@ import de.learnlib.ralib.automata.Assignment; import de.learnlib.ralib.automata.RALocation; import de.learnlib.ralib.automata.Transition; -import de.learnlib.ralib.automata.TransitionGuard; import de.learnlib.ralib.data.Constants; import de.learnlib.ralib.data.PIV; import de.learnlib.ralib.data.ParValuation; diff --git a/src/main/java/de/learnlib/ralib/learning/CounterexampleAnalysis.java b/src/main/java/de/learnlib/ralib/learning/CounterexampleAnalysis.java index 2db3b1e7..ddb8d3de 100644 --- a/src/main/java/de/learnlib/ralib/learning/CounterexampleAnalysis.java +++ b/src/main/java/de/learnlib/ralib/learning/CounterexampleAnalysis.java @@ -22,7 +22,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import de.learnlib.ralib.automata.TransitionGuard; import de.learnlib.ralib.data.Constants; import de.learnlib.ralib.data.Mapping; import de.learnlib.ralib.data.PIV; diff --git a/src/main/java/de/learnlib/ralib/learning/Hypothesis.java b/src/main/java/de/learnlib/ralib/learning/Hypothesis.java index d0aa065f..d18be69d 100644 --- a/src/main/java/de/learnlib/ralib/learning/Hypothesis.java +++ b/src/main/java/de/learnlib/ralib/learning/Hypothesis.java @@ -26,7 +26,6 @@ import de.learnlib.ralib.automata.MutableRegisterAutomaton; import de.learnlib.ralib.automata.RALocation; import de.learnlib.ralib.automata.Transition; -import de.learnlib.ralib.automata.TransitionGuard; import de.learnlib.ralib.automata.TransitionSequenceTransformer; import de.learnlib.ralib.data.Constants; import de.learnlib.ralib.data.ParValuation; diff --git a/src/main/java/de/learnlib/ralib/learning/IOAutomatonBuilder.java b/src/main/java/de/learnlib/ralib/learning/IOAutomatonBuilder.java index 7d1450f6..c981195d 100644 --- a/src/main/java/de/learnlib/ralib/learning/IOAutomatonBuilder.java +++ b/src/main/java/de/learnlib/ralib/learning/IOAutomatonBuilder.java @@ -25,11 +25,6 @@ import de.learnlib.ralib.automata.Assignment; import de.learnlib.ralib.automata.RALocation; import de.learnlib.ralib.automata.Transition; -import de.learnlib.ralib.automata.TransitionGuard; -import de.learnlib.ralib.automata.guards.AtomicGuardExpression; -import de.learnlib.ralib.automata.guards.Conjunction; -import de.learnlib.ralib.automata.guards.GuardExpression; -import de.learnlib.ralib.automata.guards.Relation; import de.learnlib.ralib.automata.output.OutputMapping; import de.learnlib.ralib.automata.output.OutputTransition; import de.learnlib.ralib.data.Constants; @@ -39,7 +34,6 @@ import de.learnlib.ralib.data.SymbolicDataValue.Constant; import de.learnlib.ralib.data.SymbolicDataValue.Parameter; import de.learnlib.ralib.data.VarMapping; -import de.learnlib.ralib.data.util.SymbolicDataValueGenerator; import de.learnlib.ralib.data.util.SymbolicDataValueGenerator.ParameterGenerator; import de.learnlib.ralib.dt.DT; import de.learnlib.ralib.words.OutputSymbol; diff --git a/src/main/java/de/learnlib/ralib/learning/ralambda/RaLambda.java b/src/main/java/de/learnlib/ralib/learning/ralambda/RaLambda.java index 088f5c36..5ae80b9f 100644 --- a/src/main/java/de/learnlib/ralib/learning/ralambda/RaLambda.java +++ b/src/main/java/de/learnlib/ralib/learning/ralambda/RaLambda.java @@ -15,7 +15,6 @@ import de.learnlib.logging.Category; import de.learnlib.query.DefaultQuery; -import de.learnlib.ralib.automata.TransitionGuard; import de.learnlib.ralib.ceanalysis.PrefixFinder; import de.learnlib.ralib.data.Constants; import de.learnlib.ralib.data.DataValue; diff --git a/src/main/java/de/learnlib/ralib/learning/rastar/Component.java b/src/main/java/de/learnlib/ralib/learning/rastar/Component.java index cad3ff46..3f55a478 100644 --- a/src/main/java/de/learnlib/ralib/learning/rastar/Component.java +++ b/src/main/java/de/learnlib/ralib/learning/rastar/Component.java @@ -30,7 +30,6 @@ import org.slf4j.LoggerFactory; import de.learnlib.logging.Category; -import de.learnlib.ralib.automata.TransitionGuard; import de.learnlib.ralib.data.Constants; import de.learnlib.ralib.data.PIV; import de.learnlib.ralib.data.SymbolicDataValue.Parameter; diff --git a/src/main/java/de/learnlib/ralib/oracles/Branching.java b/src/main/java/de/learnlib/ralib/oracles/Branching.java index ebb5d06a..9b2ecf2f 100644 --- a/src/main/java/de/learnlib/ralib/oracles/Branching.java +++ b/src/main/java/de/learnlib/ralib/oracles/Branching.java @@ -18,7 +18,6 @@ import java.util.Map; -import de.learnlib.ralib.automata.TransitionGuard; import de.learnlib.ralib.words.PSymbolInstance; import gov.nasa.jpf.constraints.api.Expression; import net.automatalib.word.Word; diff --git a/src/main/java/de/learnlib/ralib/oracles/SDTLogicOracle.java b/src/main/java/de/learnlib/ralib/oracles/SDTLogicOracle.java index ed3b6cc8..6fbcb47f 100644 --- a/src/main/java/de/learnlib/ralib/oracles/SDTLogicOracle.java +++ b/src/main/java/de/learnlib/ralib/oracles/SDTLogicOracle.java @@ -17,8 +17,6 @@ package de.learnlib.ralib.oracles; -import de.learnlib.ralib.automata.TransitionGuard; -import de.learnlib.ralib.automata.guards.GuardExpression; import de.learnlib.ralib.data.DataValue; import de.learnlib.ralib.data.Mapping; import de.learnlib.ralib.data.PIV; @@ -61,7 +59,7 @@ boolean hasCounterexample(Word prefix, SymbolicDecisionTree sdt2, PIV piv2, Expression guard, Word rep); - GuardExpression getCEGuard(Word prefix, + Expression getCEGuard(Word prefix, SymbolicDecisionTree sdt1, PIV piv1, SymbolicDecisionTree sdt2, PIV piv2); diff --git a/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheoryBranching.java b/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheoryBranching.java index 1e4e3b12..5bbf3ccc 100644 --- a/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheoryBranching.java +++ b/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheoryBranching.java @@ -16,16 +16,8 @@ */ package de.learnlib.ralib.oracles.mto; -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import de.learnlib.ralib.automata.TransitionGuard; -import de.learnlib.ralib.automata.guards.Conjunction; -import de.learnlib.ralib.automata.guards.GuardExpression; +import java.util.*; + import de.learnlib.ralib.data.Constants; import de.learnlib.ralib.data.DataValue; import de.learnlib.ralib.data.PIV; @@ -45,7 +37,6 @@ import gov.nasa.jpf.constraints.api.Expression; import gov.nasa.jpf.constraints.util.ExpressionUtil; import net.automatalib.word.Word; -import org.apache.commons.math3.analysis.function.Exp; /** * @@ -244,13 +235,13 @@ public Map, Expression> getBranches() { new ArrayList()); for (Map.Entry > entry : tempMap.entrySet()) { - List gExpr = new ArrayList<>(); + List > gExpr = new ArrayList<>(); List gList = entry.getValue(); for (SDTGuard g : gList) { gExpr.add(renameSuffixValues(g.toExpr())); } Expression tg = ExpressionUtil.and( - gExpr.stream().map(g -> JContraintsUtil.toExpression(g)).toList().toArray(new Expression[]{}) + gExpr.stream().toList().toArray(new Expression[]{}) ); assert tg != null; @@ -296,15 +287,15 @@ public Word transformPrefix(Word dw) { return prefix; } - private GuardExpression renameSuffixValues(GuardExpression expr) { - Set svals = expr.getSymbolicDataValues(); + private Expression renameSuffixValues(Expression expr) { + Collection svals = SMTUtils.getSymbolicDataValues(expr); VarMapping vmap = new VarMapping(); for (SymbolicDataValue sv : svals) { if (sv instanceof SuffixValue) { vmap.put(sv, new Parameter(sv.getDataType(), sv.getId())); } } - return expr.relabel(vmap); + return SMTUtils.renameVars(expr, vmap); } @Override diff --git a/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheorySDTLogicOracle.java b/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheorySDTLogicOracle.java index 764847ce..eff1e349 100644 --- a/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheorySDTLogicOracle.java +++ b/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheorySDTLogicOracle.java @@ -18,6 +18,7 @@ import java.util.Map; +import de.learnlib.ralib.smt.ReplacingVarsVisitor; import de.learnlib.ralib.smt.SMTUtils; import de.learnlib.ralib.smt.jconstraints.JContraintsUtil; import gov.nasa.jpf.constraints.api.Expression; @@ -27,10 +28,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import de.learnlib.ralib.automata.TransitionGuard; -import de.learnlib.ralib.automata.guards.Conjunction; -import de.learnlib.ralib.automata.guards.Disjunction; -import de.learnlib.ralib.automata.guards.GuardExpression; import de.learnlib.ralib.data.Constants; import de.learnlib.ralib.data.DataValue; import de.learnlib.ralib.data.Mapping; @@ -79,8 +76,8 @@ public boolean hasCounterexample(Word prefix, SymbolicDecisionT SDT _sdt1 = (SDT) sdt1; SDT _sdt2 = (SDT) sdt2; - Expression expr1 = JContraintsUtil.toExpression(_sdt1.getAcceptingPaths(consts)); - Expression expr2 = JContraintsUtil.toExpression(_sdt2.getAcceptingPaths(consts)); + Expression expr1 = _sdt1.getAcceptingPaths(consts); + Expression expr2 = _sdt2.getAcceptingPaths(consts); Expression exprG = guard; VarMapping gremap = new VarMapping<>(); @@ -117,24 +114,24 @@ public boolean hasCounterexample(Word prefix, SymbolicDecisionT } @Override - public GuardExpression getCEGuard(Word prefix, + public Expression getCEGuard(Word prefix, SymbolicDecisionTree sdt1, PIV piv1, SymbolicDecisionTree sdt2, PIV piv2) { SDT _sdt1 = (SDT) sdt1; SDT _sdt2 = (SDT) sdt2; - Map exprMap1 = _sdt1.getGuardExpressions(consts); - Map exprMap2 = _sdt2.getGuardExpressions(consts); + Map, Boolean> exprMap1 = _sdt1.getGuardExpressions(consts); + Map, Boolean> exprMap2 = _sdt2.getGuardExpressions(consts); - for (Map.Entry e1 : exprMap1.entrySet()) { - GuardExpression expr1 = e1.getKey(); + for (Map.Entry, Boolean> e1 : exprMap1.entrySet()) { + Expression expr1 = e1.getKey(); boolean outcome1 = e1.getValue(); - for (Map.Entry e2 : exprMap2.entrySet()) { - GuardExpression expr2 = e2.getKey(); + for (Map.Entry, Boolean> e2 : exprMap2.entrySet()) { + Expression expr2 = e2.getKey(); boolean outcome2 = e2.getValue(); if (outcome1 != outcome2) { VarMapping remap = piv2.createRemapping(piv1); - GuardExpression test = new Conjunction(expr1, expr2.relabel(remap)); + Expression test = ExpressionUtil.and(expr1, SMTUtils.renameVars(expr2, remap)); if (solver.isSatisfiable(test, new Mapping<>())) { return expr1; } @@ -257,8 +254,8 @@ private boolean accepts(Word word, Word prefix newValuation.put(suffixValue, value); boolean found = false; for (Map.Entry entry : nextSdt.getChildren().entrySet()) { - TransitionGuard guardExpr = entry.getKey().toTG(); - if (solver.isSatisfiable(guardExpr.getCondition(), newValuation)) { + Expression guardExpr = entry.getKey().toExpr(); + if (solver.isSatisfiable(guardExpr, newValuation)) { nextSdt = entry.getValue(); found = true; break; diff --git a/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheoryTreeOracle.java b/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheoryTreeOracle.java index 98bc1914..599452bd 100644 --- a/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheoryTreeOracle.java +++ b/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheoryTreeOracle.java @@ -30,15 +30,15 @@ import com.google.common.collect.Sets; +import de.learnlib.ralib.smt.SMTUtils; import de.learnlib.ralib.smt.jconstraints.JContraintsUtil; -import de.learnlib.ralib.theory.equality.DisequalityGuard; +import gov.nasa.jpf.constraints.api.Expression; +import gov.nasa.jpf.constraints.util.ExpressionUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import de.learnlib.logging.Category; import de.learnlib.query.DefaultQuery; -import de.learnlib.ralib.automata.guards.FalseGuardExpression; -import de.learnlib.ralib.automata.guards.GuardExpression; import de.learnlib.ralib.data.Constants; import de.learnlib.ralib.data.DataType; import de.learnlib.ralib.data.DataValue; @@ -107,8 +107,8 @@ public TreeQueryResult treeQuery(Word prefix, SymbolicSuffix su PIV pir = new PIV(); SDT sdt = treeQuery(prefix, suffix, new WordValuation(), pir, constants, new SuffixValuation()); -// System.out.println(prefix + " . " + suffix); -// System.out.println(sdt); + //System.out.println(prefix + " . " + suffix); + //System.out.println(sdt); // move registers to 1 ... n VarMapping rename = new VarMapping(); @@ -417,16 +417,14 @@ private boolean canBeMerged(SDTGuard a, SDTGuard b, MultiTheorySDTLogicOracle ml if (b instanceof EqualityGuard) if (a.equals(((EqualityGuard) b).toDeqGuard())) return false; - return !mlo.areMutuallyExclusive(JContraintsUtil.toExpression(a.toExpr()), new PIV(), - JContraintsUtil.toExpression(b.toExpr()), new PIV(), valuation); + return !mlo.areMutuallyExclusive(a.toExpr(), new PIV(), b.toExpr(), new PIV(), valuation); } private boolean refines(SDTGuard a, SDTGuard b, MultiTheorySDTLogicOracle mlo, Mapping valuation) { if (b instanceof SDTTrueGuard) return true; - boolean ref1 = mlo.doesRefine(JContraintsUtil.toExpression(a.toExpr()), new PIV(), - JContraintsUtil.toExpression(b.toExpr()), new PIV(), valuation); + boolean ref1 = mlo.doesRefine(a.toExpr(), new PIV(), b.toExpr(), new PIV(), valuation); return ref1; } @@ -570,10 +568,10 @@ public boolean accepts(Word prefix, Word suffi mapping.putAll(vars); SDT _sdt = (SDT)sdt; - GuardExpression expr = _sdt.getAcceptingPaths(constants); - if (expr instanceof FalseGuardExpression) + Expression expr = _sdt.getAcceptingPaths(constants); + if (expr.equals(ExpressionUtil.FALSE)) return false; - for (SymbolicDataValue sdv : expr.getSymbolicDataValues()) { + for (SymbolicDataValue sdv : SMTUtils.getSymbolicDataValues(expr)) { if (sdv instanceof Register && mapping.get(sdv) == null) { Theory teach = teachers.get(sdv.getDataType()); List values = new ArrayList<>(); @@ -584,7 +582,7 @@ public boolean accepts(Word prefix, Word suffi } } - return expr.isSatisfied(mapping); + return expr.evaluateSMT(SMTUtils.compose(mapping)); } public Map getTeachers() { diff --git a/src/main/java/de/learnlib/ralib/oracles/mto/OptimizedSymbolicSuffixBuilder.java b/src/main/java/de/learnlib/ralib/oracles/mto/OptimizedSymbolicSuffixBuilder.java index 468df8f4..8d3388d2 100644 --- a/src/main/java/de/learnlib/ralib/oracles/mto/OptimizedSymbolicSuffixBuilder.java +++ b/src/main/java/de/learnlib/ralib/oracles/mto/OptimizedSymbolicSuffixBuilder.java @@ -8,8 +8,6 @@ import java.util.Map; import java.util.Set; -import de.learnlib.ralib.automata.guards.Conjunction; -import de.learnlib.ralib.automata.guards.GuardExpression; import de.learnlib.ralib.data.Constants; import de.learnlib.ralib.data.DataType; import de.learnlib.ralib.data.DataValue; @@ -29,6 +27,8 @@ import de.learnlib.ralib.words.DataWords; import de.learnlib.ralib.words.PSymbolInstance; import de.learnlib.ralib.words.ParameterizedSymbol; +import gov.nasa.jpf.constraints.api.Expression; +import gov.nasa.jpf.constraints.util.ExpressionUtil; import net.automatalib.word.Word; public class OptimizedSymbolicSuffixBuilder { @@ -368,10 +368,10 @@ private SymbolicSuffix distinguishingSuffixFromSDTs(Word prefix List> pathsSdt1 = sdt1.getPaths(b); List> pathsSdt2 = sdt2.getPaths(!b); for (List pathSdt1 : pathsSdt1) { - GuardExpression expr1 = toGuardExpression(pathSdt1); + Expression expr1 = toGuardExpression(pathSdt1); for (List pathSdt2 : pathsSdt2) { - GuardExpression expr2 = toGuardExpression(pathSdt2); - if (solver.isSatisfiable(new Conjunction(expr1, expr2), valuation)) { + Expression expr2 = toGuardExpression(pathSdt2); + if (solver.isSatisfiable(ExpressionUtil.and(expr1, expr2), valuation)) { SymbolicSuffix suffix = buildOptimizedSuffix(prefix1, pathSdt1, piv1, prefix2, pathSdt2, piv2, suffixActions); best = pickBest(best, suffix); } @@ -426,13 +426,13 @@ private int score(SymbolicSuffix suffix) { } - private GuardExpression toGuardExpression(List guards) { - List expr = new ArrayList<>(); + private Expression toGuardExpression(List guards) { + List> expr = new ArrayList<>(); for (SDTGuard g : guards) { expr.add(g.toExpr()); } - GuardExpression[] exprArr = new GuardExpression[expr.size()]; - return new Conjunction(expr.toArray(exprArr)); + Expression [] exprArr = new Expression[expr.size()]; + return ExpressionUtil.and(expr.toArray(exprArr)); } private Mapping buildValuation(Word prefix, PIV piv, Constants constants) { diff --git a/src/main/java/de/learnlib/ralib/oracles/mto/SDT.java b/src/main/java/de/learnlib/ralib/oracles/mto/SDT.java index c00f2945..53c47c49 100644 --- a/src/main/java/de/learnlib/ralib/oracles/mto/SDT.java +++ b/src/main/java/de/learnlib/ralib/oracles/mto/SDT.java @@ -25,10 +25,6 @@ import java.util.Map.Entry; import java.util.Set; -import de.learnlib.ralib.automata.guards.Conjunction; -import de.learnlib.ralib.automata.guards.Disjunction; -import de.learnlib.ralib.automata.guards.FalseGuardExpression; -import de.learnlib.ralib.automata.guards.GuardExpression; import de.learnlib.ralib.data.Constants; import de.learnlib.ralib.data.DataValue; import de.learnlib.ralib.data.Mapping; @@ -37,12 +33,14 @@ import de.learnlib.ralib.data.SymbolicDataValue.SuffixValue; import de.learnlib.ralib.data.VarMapping; import de.learnlib.ralib.learning.SymbolicDecisionTree; +import de.learnlib.ralib.smt.SMTUtils; import de.learnlib.ralib.theory.SDTGuard; import de.learnlib.ralib.theory.SDTIfGuard; import de.learnlib.ralib.theory.SDTMultiGuard; import de.learnlib.ralib.theory.SDTTrueGuard; import de.learnlib.ralib.theory.inequality.IntervalGuard; import gov.nasa.jpf.constraints.api.Expression; +import gov.nasa.jpf.constraints.util.ExpressionUtil; /** * Implementation of Symbolic Decision Trees. @@ -190,8 +188,8 @@ public boolean isAccepting(Mapping vals, Constants Mapping mapping = new Mapping(); mapping.putAll(vals); mapping.putAll(consts); - GuardExpression expr = getAcceptingPaths(consts); - return expr.isSatisfied(mapping); + Expression expr = getAcceptingPaths(consts); + return expr.evaluateSMT(SMTUtils.compose(mapping)); } protected Map getChildren() { @@ -388,63 +386,63 @@ public boolean isEmpty() { return this.getChildren().isEmpty(); } - GuardExpression getAcceptingPaths(Constants consts) { + Expression getAcceptingPaths(Constants consts) { List> paths = getPaths(new ArrayList()); if (paths.isEmpty()) { - return FalseGuardExpression.FALSE; + return ExpressionUtil.FALSE; } - GuardExpression dis = null; + Expression dis = null; for (List list : paths) { - List expr = new ArrayList<>(); + List> expr = new ArrayList<>(); for (SDTGuard g : list) { expr.add(g.toExpr()); } - Conjunction con = new Conjunction( - expr.toArray(new GuardExpression[] {})); + Expression con = ExpressionUtil.and( + expr.toArray(new Expression[] {})); - dis = (dis == null) ? con : new Disjunction(dis, con); + dis = (dis == null) ? con : ExpressionUtil.or(dis, con); } return dis; } - GuardExpression getPaths(Constants consts) { + Expression getPaths(Constants consts) { List> paths = getPaths(new ArrayList()); if (paths.isEmpty()) { - return FalseGuardExpression.FALSE; + return ExpressionUtil.FALSE; } - GuardExpression dis = null; + Expression dis = null; for (List list : paths) { - List expr = new ArrayList<>(); + List> expr = new ArrayList<>(); for (SDTGuard g : list) { expr.add(g.toExpr()); } - Conjunction con = new Conjunction( - expr.toArray(new GuardExpression[] {})); + Expression con = ExpressionUtil.and( + expr.toArray(new Expression[] {})); - dis = (dis == null) ? con : new Disjunction(dis, con); + dis = (dis == null) ? con : ExpressionUtil.or(dis, con); } return dis; } - Map getGuardExpressions(Constants consts) { - Map expressions = new LinkedHashMap<>(); + Map, Boolean> getGuardExpressions(Constants consts) { + Map, Boolean> expressions = new LinkedHashMap<>(); Map, Boolean> paths = getAllPaths(new ArrayList()); if (paths.isEmpty()) { - expressions.put(FalseGuardExpression.FALSE, false); + expressions.put(ExpressionUtil.FALSE, false); return expressions; } for (Map.Entry, Boolean> e : paths.entrySet()) { List list = e.getKey(); - List expr = new ArrayList<>(); + List> expr = new ArrayList<>(); for (SDTGuard g : list) { expr.add(g.toExpr()); } - Conjunction con = new Conjunction( - expr.toArray(new GuardExpression[] {})); + Expression con = ExpressionUtil.and( + expr.toArray(new Expression[] {})); expressions.put(con, e.getValue()); } diff --git a/src/main/java/de/learnlib/ralib/smt/ConstraintSolver.java b/src/main/java/de/learnlib/ralib/smt/ConstraintSolver.java index cef1fbed..171baa88 100644 --- a/src/main/java/de/learnlib/ralib/smt/ConstraintSolver.java +++ b/src/main/java/de/learnlib/ralib/smt/ConstraintSolver.java @@ -16,7 +16,6 @@ */ package de.learnlib.ralib.smt; -import de.learnlib.ralib.automata.guards.GuardExpression; import de.learnlib.ralib.data.DataValue; import de.learnlib.ralib.data.Mapping; import de.learnlib.ralib.data.SymbolicDataValue; @@ -28,8 +27,6 @@ */ public interface ConstraintSolver { - public boolean isSatisfiable(GuardExpression expr, Mapping val); - - public boolean isSatisfiable(Expression expr, Mapping val); + boolean isSatisfiable(Expression expr, Mapping val); } diff --git a/src/main/java/de/learnlib/ralib/smt/ConstraintSolverFactory.java b/src/main/java/de/learnlib/ralib/smt/ConstraintSolverFactory.java index f75af6d4..f9c211eb 100644 --- a/src/main/java/de/learnlib/ralib/smt/ConstraintSolverFactory.java +++ b/src/main/java/de/learnlib/ralib/smt/ConstraintSolverFactory.java @@ -28,23 +28,9 @@ */ public class ConstraintSolverFactory { - public final static String ID_SIMPLE = "simple"; - - public final static String ID_Z3 = "z3"; - - public static ConstraintSolver createSolver(final String id) { - switch (id) { - case ID_Z3: - return createZ3ConstraintSolver(); - default: - throw new RuntimeException("Unsupported constraint solver: " + id); - } - } - public static JConstraintsConstraintSolver createZ3ConstraintSolver() { return new JConstraintsConstraintSolver( (new NativeZ3SolverProvider()).createSolver(new Properties())); - //gov.nasa.jpf.constraints.solvers.ConstraintSolverFactory.createSolver("z3")); } } diff --git a/src/main/java/de/learnlib/ralib/smt/SMTUtils.java b/src/main/java/de/learnlib/ralib/smt/SMTUtils.java index 45deffcc..f3f62fa0 100644 --- a/src/main/java/de/learnlib/ralib/smt/SMTUtils.java +++ b/src/main/java/de/learnlib/ralib/smt/SMTUtils.java @@ -12,8 +12,11 @@ import gov.nasa.jpf.constraints.expressions.*; import gov.nasa.jpf.constraints.types.BuiltinTypes; import gov.nasa.jpf.constraints.util.DuplicatingVisitor; +import gov.nasa.jpf.constraints.util.ExpressionUtil; +import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; public class SMTUtils { @@ -33,6 +36,15 @@ public static Constant constantFor(DataValue sv) { return new Constant(BuiltinTypes.DECIMAL, sv.getValue()); } + public static Collection getSymbolicDataValues( + Expression expr) { + ArrayList list = new ArrayList<>(); + for (Variable v : ExpressionUtil.freeVariables(expr)) { + list.add( (SymbolicDataValue) v); + } + return list; + } + public static Expression renameVars(Expression expr, final VarMapping relabelling) { final ReplacingVarsVisitor replacer = new ReplacingVarsVisitor(); diff --git a/src/main/java/de/learnlib/ralib/smt/jconstraints/JConstraintsConstraintSolver.java b/src/main/java/de/learnlib/ralib/smt/jconstraints/JConstraintsConstraintSolver.java index 2d547dff..b4677704 100644 --- a/src/main/java/de/learnlib/ralib/smt/jconstraints/JConstraintsConstraintSolver.java +++ b/src/main/java/de/learnlib/ralib/smt/jconstraints/JConstraintsConstraintSolver.java @@ -16,7 +16,6 @@ */ package de.learnlib.ralib.smt.jconstraints; -import de.learnlib.ralib.automata.guards.GuardExpression; import de.learnlib.ralib.data.DataValue; import de.learnlib.ralib.data.Mapping; import de.learnlib.ralib.data.SymbolicDataValue; @@ -37,13 +36,6 @@ public JConstraintsConstraintSolver( this.solver = solver; } - @Override - public boolean isSatisfiable(GuardExpression expr, Mapping val) { - Expression jexpr = JContraintsUtil.toExpression(expr, val); - Result r = solver.isSatisfiable(jexpr); - return r == Result.SAT; - } - @Override public boolean isSatisfiable(Expression expr, Mapping val) { Result r = solver.isSatisfiable( JContraintsUtil.toExpression(expr, val)); diff --git a/src/main/java/de/learnlib/ralib/smt/jconstraints/JContraintsUtil.java b/src/main/java/de/learnlib/ralib/smt/jconstraints/JContraintsUtil.java index d267d932..cd61234d 100644 --- a/src/main/java/de/learnlib/ralib/smt/jconstraints/JContraintsUtil.java +++ b/src/main/java/de/learnlib/ralib/smt/jconstraints/JContraintsUtil.java @@ -19,13 +19,6 @@ import java.util.HashMap; import java.util.Map; -import de.learnlib.ralib.automata.guards.AtomicGuardExpression; -import de.learnlib.ralib.automata.guards.Conjunction; -import de.learnlib.ralib.automata.guards.Disjunction; -import de.learnlib.ralib.automata.guards.FalseGuardExpression; -import de.learnlib.ralib.automata.guards.GuardExpression; -import de.learnlib.ralib.automata.guards.Negation; -import de.learnlib.ralib.automata.guards.TrueGuardExpression; import de.learnlib.ralib.data.DataValue; import de.learnlib.ralib.data.Mapping; import de.learnlib.ralib.data.SymbolicDataValue; @@ -45,45 +38,6 @@ */ public class JContraintsUtil { - public static Type getJCType(Class cls) { - if (cls == Integer.class) { - return BuiltinTypes.SINT32; - } else if (cls == Float.class) { - return BuiltinTypes.DECIMAL; - } else if (cls == Long.class) { - return BuiltinTypes.DECIMAL; - } else { - return BuiltinTypes.DECIMAL; - } - } - - public static Expression toExpression( - LogicalOperator op, - Map map, - GuardExpression... expr) { - - Expression[] elems = new Expression[expr.length]; - int i = 0; - for (GuardExpression e : expr) { - elems[i++] = toExpression(e, map); - } - switch (op) { - case AND: - return ExpressionUtil.and(elems); - case OR: - return ExpressionUtil.or(elems); - default: - throw new RuntimeException("Unsupported Operator: " + op); - } - } - - public static Expression toExpression(GuardExpression expr, Mapping val) { - Map map = new HashMap<>(); - Expression guardExpr = toExpression(expr, map); - Expression valExpr = toExpression(val, map); - return ExpressionUtil.and(guardExpr, valExpr); - } - public static Expression toExpression(Expression expr, Mapping val) { Map map = new HashMap<>(); //Expression guardExpr = toExpression(expr, map); @@ -100,58 +54,6 @@ public static Expression toExpression(Mapping toExpression(GuardExpression expr) { - return toExpression(expr, new HashMap<>()); - } - - public static Expression toExpression(GuardExpression expr, - Map map) { - - if (expr instanceof AtomicGuardExpression) { - return toExpression((AtomicGuardExpression) expr, map); - } else if (expr instanceof TrueGuardExpression) { - return ExpressionUtil.TRUE; - } else if (expr instanceof FalseGuardExpression) { - return ExpressionUtil.FALSE; - } else if (expr instanceof Conjunction) { - Conjunction con = (Conjunction) expr; - return toExpression(LogicalOperator.AND, map, con.getConjuncts()); - } else if (expr instanceof Disjunction) { - Disjunction dis = (Disjunction) expr; - return toExpression(LogicalOperator.OR, map, dis.getDisjuncts()); - } else if (expr instanceof Negation) { - Negation neg = (Negation) expr; - return new gov.nasa.jpf.constraints.expressions.Negation( - toExpression(neg.getNegated(), map)); - } - - throw new RuntimeException("Unsupported Guard Expression: " - + expr.getClass().getName()); - } - - - public static Expression toExpression(AtomicGuardExpression expr, - Map map) { - - Variable lv = getOrCreate(expr.getLeft(), map); - Variable rv = getOrCreate(expr.getRight(), map); - - switch (expr.getRelation()) { - case EQUALS: - return new NumericBooleanExpression(lv, NumericComparator.EQ, rv); - case NOT_EQUALS: - return new NumericBooleanExpression(lv, NumericComparator.NE, rv); - case SMALLER: - return new NumericBooleanExpression(lv, NumericComparator.LT, rv); - case BIGGER: - return new NumericBooleanExpression(lv, NumericComparator.GT, rv); - - default: - throw new UnsupportedOperationException( - "Relation " + expr.getRelation() + " is not supported in guards"); - } - } - private static Variable getOrCreate(SymbolicDataValue dv, Map map) { Variable ret = map.get(dv); diff --git a/src/main/java/de/learnlib/ralib/theory/EquivalenceClassFilter.java b/src/main/java/de/learnlib/ralib/theory/EquivalenceClassFilter.java index fb9ef0ac..91e17eaa 100644 --- a/src/main/java/de/learnlib/ralib/theory/EquivalenceClassFilter.java +++ b/src/main/java/de/learnlib/ralib/theory/EquivalenceClassFilter.java @@ -3,7 +3,6 @@ import java.util.ArrayList; import java.util.List; -import de.learnlib.ralib.automata.guards.GuardExpression; import de.learnlib.ralib.data.DataType; import de.learnlib.ralib.data.DataValue; import de.learnlib.ralib.data.Mapping; @@ -13,11 +12,13 @@ import de.learnlib.ralib.data.WordValuation; import de.learnlib.ralib.data.util.SymbolicDataValueGenerator.ParameterGenerator; import de.learnlib.ralib.data.util.SymbolicDataValueGenerator.SuffixValueGenerator; +import de.learnlib.ralib.smt.SMTUtils; import de.learnlib.ralib.words.PSymbolInstance; import de.learnlib.ralib.words.ParameterizedSymbol; +import gov.nasa.jpf.constraints.api.Expression; import net.automatalib.word.Word; -public class EquivalenceClassFilter { +public class EquivalenceClassFilter { private final List equivClasses; private boolean useOptimization; @@ -44,7 +45,9 @@ public List toList(SuffixValueRestriction restr, DataValue[] dvs = psi.getParameterValues(); for (int i = 0; i < dvs.length; i++) { Parameter p = pgen.next(dts[i]); - mapping.put(p, dvs[i]); + if (restr.parameter.getDataType().equals(dts[i])) { + mapping.put(p, dvs[i]); + } } } for (ParameterizedSymbol ps : suffix) { @@ -52,18 +55,19 @@ public List toList(SuffixValueRestriction restr, for (int i = 0; i < dts.length; i++) { SuffixValue sv = svgen.next(dts[i]); DataValue val = valuation.get(sv.getId()); - if (val != null) { + if (val != null && val.getDataType().equals(restr.parameter.getDataType())) { mapping.put(sv, val); } } } - GuardExpression expr = restr.toGuardExpression(mapping.keySet()); + Expression expr = restr.toGuardExpression(mapping.keySet()); for (DataValue ec : equivClasses) { Mapping ecMapping = new Mapping<>(); ecMapping.putAll(mapping); ecMapping.put(restr.getParameter(), ec); - if (expr.isSatisfied(ecMapping)) { + //System.out.println(" -- " + expr + " - " + ecMapping); + if (expr.evaluateSMT(SMTUtils.compose(ecMapping))) { filtered.add(ec); } } diff --git a/src/main/java/de/learnlib/ralib/theory/FreshSuffixValue.java b/src/main/java/de/learnlib/ralib/theory/FreshSuffixValue.java index 2aa8fc5b..79c3caf7 100644 --- a/src/main/java/de/learnlib/ralib/theory/FreshSuffixValue.java +++ b/src/main/java/de/learnlib/ralib/theory/FreshSuffixValue.java @@ -5,12 +5,13 @@ import java.util.Map; import java.util.Set; -import de.learnlib.ralib.automata.guards.AtomicGuardExpression; -import de.learnlib.ralib.automata.guards.Conjunction; -import de.learnlib.ralib.automata.guards.GuardExpression; import de.learnlib.ralib.automata.guards.Relation; import de.learnlib.ralib.data.SymbolicDataValue; import de.learnlib.ralib.data.SymbolicDataValue.SuffixValue; +import gov.nasa.jpf.constraints.api.Expression; +import gov.nasa.jpf.constraints.expressions.NumericBooleanExpression; +import gov.nasa.jpf.constraints.expressions.NumericComparator; +import gov.nasa.jpf.constraints.util.ExpressionUtil; public class FreshSuffixValue extends SuffixValueRestriction { public FreshSuffixValue(SuffixValue param) { @@ -22,15 +23,15 @@ public FreshSuffixValue(FreshSuffixValue other, int shift) { } @Override - public GuardExpression toGuardExpression(Set vals) { - List expr = new ArrayList<>(); + public Expression toGuardExpression(Set vals) { + List > expr = new ArrayList<>(); for (SymbolicDataValue sdv : vals) { - GuardExpression g = new AtomicGuardExpression(parameter, Relation.NOT_EQUALS, sdv); + Expression g = new NumericBooleanExpression(parameter, NumericComparator.NE, sdv); expr.add(g); } - GuardExpression[] exprArr = new GuardExpression[expr.size()]; + Expression [] exprArr = new Expression[expr.size()]; expr.toArray(exprArr); - return new Conjunction(exprArr); + return ExpressionUtil.and(exprArr); } @Override diff --git a/src/main/java/de/learnlib/ralib/theory/SDTAndGuard.java b/src/main/java/de/learnlib/ralib/theory/SDTAndGuard.java index 32dd8ffb..083a081c 100644 --- a/src/main/java/de/learnlib/ralib/theory/SDTAndGuard.java +++ b/src/main/java/de/learnlib/ralib/theory/SDTAndGuard.java @@ -21,12 +21,11 @@ import java.util.Objects; import java.util.Set; -import de.learnlib.ralib.automata.guards.Conjunction; -import de.learnlib.ralib.automata.guards.GuardExpression; -import de.learnlib.ralib.automata.guards.TrueGuardExpression; import de.learnlib.ralib.data.SymbolicDataValue; import de.learnlib.ralib.data.SymbolicDataValue.SuffixValue; import de.learnlib.ralib.data.VarMapping; +import gov.nasa.jpf.constraints.api.Expression; +import gov.nasa.jpf.constraints.util.ExpressionUtil; @Deprecated public class SDTAndGuard extends SDTMultiGuard { @@ -66,8 +65,8 @@ public SDTAndGuard(SDTAndGuard other) { super(other); } - private List toExprList() { - List exprs = new ArrayList<>(); + private List> toExprList() { + List> exprs = new ArrayList<>(); for (SDTGuard guard : this.guards) { exprs.add(guard.toExpr()); } @@ -75,15 +74,15 @@ private List toExprList() { } @Override - public GuardExpression toExpr() { - List thisList = this.toExprList(); + public Expression toExpr() { + List> thisList = this.toExprList(); if (thisList.isEmpty()) { - return TrueGuardExpression.TRUE; + return ExpressionUtil.TRUE; } if (thisList.size() == 1) { return thisList.get(0); } else { - return new Conjunction(thisList.toArray(new GuardExpression[]{})); + return ExpressionUtil.and(thisList.toArray(new Expression[]{})); } } diff --git a/src/main/java/de/learnlib/ralib/theory/SDTGuard.java b/src/main/java/de/learnlib/ralib/theory/SDTGuard.java index 99d2398a..3a4e6995 100644 --- a/src/main/java/de/learnlib/ralib/theory/SDTGuard.java +++ b/src/main/java/de/learnlib/ralib/theory/SDTGuard.java @@ -19,11 +19,10 @@ import java.util.List; import java.util.Set; -import de.learnlib.ralib.automata.TransitionGuard; -import de.learnlib.ralib.automata.guards.GuardExpression; import de.learnlib.ralib.data.SymbolicDataValue; import de.learnlib.ralib.data.SymbolicDataValue.SuffixValue; import de.learnlib.ralib.data.VarMapping; +import gov.nasa.jpf.constraints.api.Expression; /** * @@ -53,11 +52,7 @@ public SDTGuard(SDTGuard other) { this.parameter = (SuffixValue) SymbolicDataValue.copy(other.parameter); } - public TransitionGuard toTG() { - return new TransitionGuard(this.toExpr()); - } - - public abstract GuardExpression toExpr(); + public abstract Expression toExpr(); public abstract SDTGuard relabel(VarMapping relabelling); diff --git a/src/main/java/de/learnlib/ralib/theory/SDTMultiGuard.java b/src/main/java/de/learnlib/ralib/theory/SDTMultiGuard.java index c6a513d7..bac20480 100644 --- a/src/main/java/de/learnlib/ralib/theory/SDTMultiGuard.java +++ b/src/main/java/de/learnlib/ralib/theory/SDTMultiGuard.java @@ -22,9 +22,9 @@ import java.util.List; import java.util.Set; -import de.learnlib.ralib.automata.guards.GuardExpression; import de.learnlib.ralib.data.SymbolicDataValue; import de.learnlib.ralib.data.SymbolicDataValue.SuffixValue; +import gov.nasa.jpf.constraints.api.Expression; @Deprecated public abstract class SDTMultiGuard extends SDTGuard { @@ -112,7 +112,7 @@ public Set getComparands(SymbolicDataValue dv) { } @Override - public abstract GuardExpression toExpr(); + public abstract Expression toExpr(); @Override public String toString() { diff --git a/src/main/java/de/learnlib/ralib/theory/SDTOrGuard.java b/src/main/java/de/learnlib/ralib/theory/SDTOrGuard.java index 2a00e95d..c2e50d42 100644 --- a/src/main/java/de/learnlib/ralib/theory/SDTOrGuard.java +++ b/src/main/java/de/learnlib/ralib/theory/SDTOrGuard.java @@ -21,12 +21,11 @@ import java.util.Objects; import java.util.Set; -import de.learnlib.ralib.automata.guards.Disjunction; -import de.learnlib.ralib.automata.guards.GuardExpression; -import de.learnlib.ralib.automata.guards.TrueGuardExpression; import de.learnlib.ralib.data.SymbolicDataValue; import de.learnlib.ralib.data.SymbolicDataValue.SuffixValue; import de.learnlib.ralib.data.VarMapping; +import gov.nasa.jpf.constraints.api.Expression; +import gov.nasa.jpf.constraints.util.ExpressionUtil; @Deprecated public class SDTOrGuard extends SDTMultiGuard { @@ -66,8 +65,8 @@ public SDTOrGuard(SDTOrGuard other) { super(other); } - private List toExprList() { - List exprs = new ArrayList<>(); + private List > toExprList() { + List > exprs = new ArrayList<>(); for (SDTGuard guard : this.guards) { exprs.add(guard.toExpr()); } @@ -75,15 +74,15 @@ private List toExprList() { } @Override - public GuardExpression toExpr() { - List thisList = this.toExprList(); + public Expression toExpr() { + List> thisList = this.toExprList(); if (thisList.isEmpty()) { - return TrueGuardExpression.TRUE; + return ExpressionUtil.TRUE; } if (thisList.size() == 1) { return thisList.get(0); } else { - return new Disjunction(thisList.toArray(new GuardExpression[]{})); + return ExpressionUtil.or(thisList.toArray(new Expression[]{})); } } diff --git a/src/main/java/de/learnlib/ralib/theory/SDTTrueGuard.java b/src/main/java/de/learnlib/ralib/theory/SDTTrueGuard.java index 616ca26f..8cb8b723 100644 --- a/src/main/java/de/learnlib/ralib/theory/SDTTrueGuard.java +++ b/src/main/java/de/learnlib/ralib/theory/SDTTrueGuard.java @@ -22,10 +22,10 @@ import java.util.Objects; import java.util.Set; -import de.learnlib.ralib.automata.guards.GuardExpression; -import de.learnlib.ralib.automata.guards.TrueGuardExpression; import de.learnlib.ralib.data.SymbolicDataValue; import de.learnlib.ralib.data.VarMapping; +import gov.nasa.jpf.constraints.api.Expression; +import gov.nasa.jpf.constraints.util.ExpressionUtil; /** * @@ -55,8 +55,8 @@ public List unwrap() { } @Override - public GuardExpression toExpr() { - return TrueGuardExpression.TRUE; + public Expression toExpr() { + return ExpressionUtil.TRUE; } @Override diff --git a/src/main/java/de/learnlib/ralib/theory/SuffixValueRestriction.java b/src/main/java/de/learnlib/ralib/theory/SuffixValueRestriction.java index 6a857803..75eed2db 100644 --- a/src/main/java/de/learnlib/ralib/theory/SuffixValueRestriction.java +++ b/src/main/java/de/learnlib/ralib/theory/SuffixValueRestriction.java @@ -4,7 +4,6 @@ import java.util.Objects; import java.util.Set; -import de.learnlib.ralib.automata.guards.GuardExpression; import de.learnlib.ralib.data.Constants; import de.learnlib.ralib.data.DataType; import de.learnlib.ralib.data.DataValue; @@ -15,6 +14,7 @@ import de.learnlib.ralib.theory.equality.EqualityGuard; import de.learnlib.ralib.words.DataWords; import de.learnlib.ralib.words.PSymbolInstance; +import gov.nasa.jpf.constraints.api.Expression; import net.automatalib.word.Word; public abstract class SuffixValueRestriction { @@ -38,7 +38,7 @@ public SuffixValue getParameter() { public abstract SuffixValueRestriction shift(int shiftStep); - public abstract GuardExpression toGuardExpression(Set vals); + public abstract Expression toGuardExpression(Set vals); public abstract SuffixValueRestriction merge(SuffixValueRestriction other, Map prior); diff --git a/src/main/java/de/learnlib/ralib/theory/UnrestrictedSuffixValue.java b/src/main/java/de/learnlib/ralib/theory/UnrestrictedSuffixValue.java index 9d6a6a42..4cb1dde9 100644 --- a/src/main/java/de/learnlib/ralib/theory/UnrestrictedSuffixValue.java +++ b/src/main/java/de/learnlib/ralib/theory/UnrestrictedSuffixValue.java @@ -3,10 +3,10 @@ import java.util.Map; import java.util.Set; -import de.learnlib.ralib.automata.guards.GuardExpression; -import de.learnlib.ralib.automata.guards.TrueGuardExpression; import de.learnlib.ralib.data.SymbolicDataValue; import de.learnlib.ralib.data.SymbolicDataValue.SuffixValue; +import gov.nasa.jpf.constraints.api.Expression; +import gov.nasa.jpf.constraints.util.ExpressionUtil; public class UnrestrictedSuffixValue extends SuffixValueRestriction { @@ -19,8 +19,8 @@ public UnrestrictedSuffixValue(UnrestrictedSuffixValue other, int shift) { } @Override - public GuardExpression toGuardExpression(Set vals) { - return new TrueGuardExpression(); + public Expression toGuardExpression(Set vals) { + return ExpressionUtil.TRUE; } @Override diff --git a/src/main/java/de/learnlib/ralib/theory/equality/DisequalityGuard.java b/src/main/java/de/learnlib/ralib/theory/equality/DisequalityGuard.java index 3b44f029..7752b390 100644 --- a/src/main/java/de/learnlib/ralib/theory/equality/DisequalityGuard.java +++ b/src/main/java/de/learnlib/ralib/theory/equality/DisequalityGuard.java @@ -21,13 +21,14 @@ import java.util.Objects; import java.util.Set; -import de.learnlib.ralib.automata.guards.AtomicGuardExpression; -import de.learnlib.ralib.automata.guards.GuardExpression; import de.learnlib.ralib.automata.guards.Relation; import de.learnlib.ralib.data.SymbolicDataValue; import de.learnlib.ralib.data.VarMapping; import de.learnlib.ralib.theory.SDTGuard; import de.learnlib.ralib.theory.SDTIfGuard; +import gov.nasa.jpf.constraints.api.Expression; +import gov.nasa.jpf.constraints.expressions.NumericBooleanExpression; +import gov.nasa.jpf.constraints.expressions.NumericComparator; /** * @@ -58,9 +59,9 @@ public String toString() { } @Override - public GuardExpression toExpr() { - return new AtomicGuardExpression( - register, Relation.NOT_EQUALS, parameter); + public Expression toExpr() { + return new NumericBooleanExpression( + register, NumericComparator.NE, parameter); } @Override diff --git a/src/main/java/de/learnlib/ralib/theory/equality/EqualRestriction.java b/src/main/java/de/learnlib/ralib/theory/equality/EqualRestriction.java index 3f8dbe17..343bb345 100644 --- a/src/main/java/de/learnlib/ralib/theory/equality/EqualRestriction.java +++ b/src/main/java/de/learnlib/ralib/theory/equality/EqualRestriction.java @@ -4,14 +4,15 @@ import java.util.Objects; import java.util.Set; -import de.learnlib.ralib.automata.guards.AtomicGuardExpression; -import de.learnlib.ralib.automata.guards.GuardExpression; import de.learnlib.ralib.automata.guards.Relation; import de.learnlib.ralib.data.SymbolicDataValue; import de.learnlib.ralib.data.SymbolicDataValue.SuffixValue; import de.learnlib.ralib.theory.FreshSuffixValue; import de.learnlib.ralib.theory.SuffixValueRestriction; import de.learnlib.ralib.theory.UnrestrictedSuffixValue; +import gov.nasa.jpf.constraints.api.Expression; +import gov.nasa.jpf.constraints.expressions.NumericBooleanExpression; +import gov.nasa.jpf.constraints.expressions.NumericComparator; public class EqualRestriction extends SuffixValueRestriction { private final SuffixValue equalParam; @@ -32,10 +33,10 @@ public EqualRestriction(EqualRestriction other, int shift) { } @Override - public GuardExpression toGuardExpression(Set vals) { + public Expression toGuardExpression(Set vals) { assert vals.contains(equalParam); - return new AtomicGuardExpression(parameter, Relation.EQUALS, equalParam); + return new NumericBooleanExpression(parameter, NumericComparator.EQ, equalParam); } @Override diff --git a/src/main/java/de/learnlib/ralib/theory/equality/EqualityGuard.java b/src/main/java/de/learnlib/ralib/theory/equality/EqualityGuard.java index 8a373020..e7266957 100644 --- a/src/main/java/de/learnlib/ralib/theory/equality/EqualityGuard.java +++ b/src/main/java/de/learnlib/ralib/theory/equality/EqualityGuard.java @@ -21,8 +21,6 @@ import java.util.Objects; import java.util.Set; -import de.learnlib.ralib.automata.guards.AtomicGuardExpression; -import de.learnlib.ralib.automata.guards.GuardExpression; import de.learnlib.ralib.automata.guards.Relation; import de.learnlib.ralib.data.SymbolicDataValue; import de.learnlib.ralib.data.SymbolicDataValue.SuffixValue; @@ -30,6 +28,9 @@ import de.learnlib.ralib.theory.SDTGuard; import de.learnlib.ralib.theory.SDTIfGuard; import de.learnlib.ralib.theory.SDTOrGuard; +import gov.nasa.jpf.constraints.api.Expression; +import gov.nasa.jpf.constraints.expressions.NumericBooleanExpression; +import gov.nasa.jpf.constraints.expressions.NumericComparator; /** * @@ -104,9 +105,9 @@ public boolean equals(Object obj) { } @Override - public GuardExpression toExpr() { - return new AtomicGuardExpression<>(this.register, - Relation.EQUALS, parameter); + public Expression toExpr() { + return new NumericBooleanExpression(this.register, + NumericComparator.EQ, parameter); } @Override diff --git a/src/main/java/de/learnlib/ralib/theory/equality/EqualityTheory.java b/src/main/java/de/learnlib/ralib/theory/equality/EqualityTheory.java index deb73427..6bfa5e4f 100644 --- a/src/main/java/de/learnlib/ralib/theory/equality/EqualityTheory.java +++ b/src/main/java/de/learnlib/ralib/theory/equality/EqualityTheory.java @@ -174,6 +174,9 @@ public SDT treeQuery(Word prefix, SymbolicSuffix suffix, WordVa List equivClasses = new ArrayList<>(potSet); equivClasses.add(fresh); + //System.out.println(" prefix: " + prefix); + //System.out.println(" potential: " + potential); + //System.out.println(" eqs " + Arrays.toString(equivClasses.toArray())); EquivalenceClassFilter eqcFilter = new EquivalenceClassFilter(equivClasses, useNonFreeOptimization); List filteredEquivClasses = eqcFilter.toList(suffix.getRestriction(currentParam), prefix, suffix.getActions(), values); assert filteredEquivClasses.size() > 0; diff --git a/src/main/java/de/learnlib/ralib/theory/inequality/IntervalGuard.java b/src/main/java/de/learnlib/ralib/theory/inequality/IntervalGuard.java index 49b703ee..d371706d 100644 --- a/src/main/java/de/learnlib/ralib/theory/inequality/IntervalGuard.java +++ b/src/main/java/de/learnlib/ralib/theory/inequality/IntervalGuard.java @@ -24,9 +24,6 @@ import java.util.Objects; import java.util.Set; -import de.learnlib.ralib.automata.guards.AtomicGuardExpression; -import de.learnlib.ralib.automata.guards.Conjunction; -import de.learnlib.ralib.automata.guards.GuardExpression; import de.learnlib.ralib.automata.guards.Relation; import de.learnlib.ralib.data.SymbolicDataValue; import de.learnlib.ralib.data.SymbolicDataValue.SuffixValue; @@ -34,6 +31,10 @@ import de.learnlib.ralib.theory.SDTGuard; import de.learnlib.ralib.theory.equality.DisequalityGuard; import de.learnlib.ralib.theory.equality.EqualityGuard; +import gov.nasa.jpf.constraints.api.Expression; +import gov.nasa.jpf.constraints.expressions.NumericBooleanExpression; +import gov.nasa.jpf.constraints.expressions.NumericComparator; +import gov.nasa.jpf.constraints.util.ExpressionUtil; /** * @@ -293,16 +294,16 @@ public Set mergeWith(SDTGuard other, List regPotent } @Override - public GuardExpression toExpr() { + public Expression toExpr() { if (leftLimit == null) { - return new AtomicGuardExpression(parameter, Relation.SMALLER, rightLimit); + return new NumericBooleanExpression(parameter, NumericComparator.LT, rightLimit); } if (rightLimit == null) { - return new AtomicGuardExpression(parameter, Relation.BIGGER, leftLimit); + return new NumericBooleanExpression(parameter, NumericComparator.GT, leftLimit); } else { - GuardExpression smaller = new AtomicGuardExpression(parameter, Relation.SMALLER, rightLimit); - GuardExpression bigger = new AtomicGuardExpression(parameter, Relation.BIGGER, leftLimit); - return new Conjunction(smaller, bigger); + Expression smaller = new NumericBooleanExpression(parameter, NumericComparator.LT, rightLimit); + Expression bigger = new NumericBooleanExpression(parameter, NumericComparator.GT, leftLimit); + return ExpressionUtil.and(smaller, bigger); } } diff --git a/src/main/java/de/learnlib/ralib/tools/theories/DoubleInequalityTheory.java b/src/main/java/de/learnlib/ralib/tools/theories/DoubleInequalityTheory.java index c2690ded..37f3b673 100644 --- a/src/main/java/de/learnlib/ralib/tools/theories/DoubleInequalityTheory.java +++ b/src/main/java/de/learnlib/ralib/tools/theories/DoubleInequalityTheory.java @@ -19,7 +19,6 @@ package de.learnlib.ralib.tools.theories; import static de.learnlib.ralib.smt.jconstraints.JContraintsUtil.toExpression; -import static de.learnlib.ralib.smt.jconstraints.JContraintsUtil.toVariable; import java.math.BigDecimal; import java.util.*; @@ -28,7 +27,6 @@ import org.slf4j.LoggerFactory; import de.learnlib.logging.Category; -import de.learnlib.ralib.automata.guards.GuardExpression; import de.learnlib.ralib.data.Constants; import de.learnlib.ralib.data.DataType; import de.learnlib.ralib.data.DataValue; @@ -144,15 +142,15 @@ public DataValue instantiate(SDTGuard g, Valuation val, Constants c, Collection< SymbolicDataValue.SuffixValue sp = g.getParameter(); Valuation newVal = new Valuation(); newVal.putAll(val); - GuardExpression x = g.toExpr(); + Expression x = g.toExpr(); Result res; if (g instanceof EqualityGuard) { //System.out.println("SOLVING: " + x); - res = solver.solve(toExpression(x), newVal); + res = solver.solve(x, newVal); } else { List> eList = new ArrayList<>(); // add the guard - eList.add(toExpression(g.toExpr())); + eList.add(g.toExpr()); eList.addAll(instantiateGuard(g, val)); if (g instanceof SDTOrGuard) { // for all registers, pick them up diff --git a/src/test/java/de/learnlib/ralib/equivalence/RAEquivalenceTestTest.java b/src/test/java/de/learnlib/ralib/equivalence/RAEquivalenceTestTest.java index aa1888d6..74b21e4c 100644 --- a/src/test/java/de/learnlib/ralib/equivalence/RAEquivalenceTestTest.java +++ b/src/test/java/de/learnlib/ralib/equivalence/RAEquivalenceTestTest.java @@ -21,9 +21,6 @@ import de.learnlib.ralib.automata.MutableRegisterAutomaton; import de.learnlib.ralib.automata.RALocation; import de.learnlib.ralib.automata.RegisterAutomaton; -import de.learnlib.ralib.automata.TransitionGuard; -import de.learnlib.ralib.automata.guards.AtomicGuardExpression; -import de.learnlib.ralib.automata.guards.Relation; import de.learnlib.ralib.data.Constants; import de.learnlib.ralib.data.DataType; import de.learnlib.ralib.data.SymbolicDataValue; diff --git a/src/test/java/de/learnlib/ralib/example/keygen/MapAutomatonExample.java b/src/test/java/de/learnlib/ralib/example/keygen/MapAutomatonExample.java index 0f8fc852..43ac8450 100644 --- a/src/test/java/de/learnlib/ralib/example/keygen/MapAutomatonExample.java +++ b/src/test/java/de/learnlib/ralib/example/keygen/MapAutomatonExample.java @@ -21,10 +21,6 @@ import de.learnlib.ralib.automata.MutableRegisterAutomaton; import de.learnlib.ralib.automata.RALocation; import de.learnlib.ralib.automata.RegisterAutomaton; -import de.learnlib.ralib.automata.TransitionGuard; -import de.learnlib.ralib.automata.guards.AtomicGuardExpression; -import de.learnlib.ralib.automata.guards.GuardExpression; -import de.learnlib.ralib.automata.guards.Relation; import de.learnlib.ralib.automata.output.OutputMapping; import de.learnlib.ralib.automata.output.OutputTransition; import de.learnlib.ralib.data.DataType; diff --git a/src/test/java/de/learnlib/ralib/example/llambda/LLambdaAutomatonExample.java b/src/test/java/de/learnlib/ralib/example/llambda/LLambdaAutomatonExample.java index 6c59c566..b075dc73 100644 --- a/src/test/java/de/learnlib/ralib/example/llambda/LLambdaAutomatonExample.java +++ b/src/test/java/de/learnlib/ralib/example/llambda/LLambdaAutomatonExample.java @@ -5,7 +5,6 @@ import de.learnlib.ralib.automata.MutableRegisterAutomaton; import de.learnlib.ralib.automata.RALocation; import de.learnlib.ralib.automata.RegisterAutomaton; -import de.learnlib.ralib.automata.TransitionGuard; import de.learnlib.ralib.data.DataType; import de.learnlib.ralib.data.SymbolicDataValue; import de.learnlib.ralib.data.SymbolicDataValue.Register; diff --git a/src/test/java/de/learnlib/ralib/example/login/LoginAutomatonExample.java b/src/test/java/de/learnlib/ralib/example/login/LoginAutomatonExample.java index 49ebeb01..2fd5a732 100644 --- a/src/test/java/de/learnlib/ralib/example/login/LoginAutomatonExample.java +++ b/src/test/java/de/learnlib/ralib/example/login/LoginAutomatonExample.java @@ -21,12 +21,6 @@ import de.learnlib.ralib.automata.MutableRegisterAutomaton; import de.learnlib.ralib.automata.RALocation; import de.learnlib.ralib.automata.RegisterAutomaton; -import de.learnlib.ralib.automata.TransitionGuard; -import de.learnlib.ralib.automata.guards.AtomicGuardExpression; -import de.learnlib.ralib.automata.guards.Conjunction; -import de.learnlib.ralib.automata.guards.Disjunction; -import de.learnlib.ralib.automata.guards.GuardExpression; -import de.learnlib.ralib.automata.guards.Relation; import de.learnlib.ralib.data.DataType; import de.learnlib.ralib.data.SymbolicDataValue; import de.learnlib.ralib.data.SymbolicDataValue.Parameter; diff --git a/src/test/java/de/learnlib/ralib/example/sdts/LoginExampleBranching.java b/src/test/java/de/learnlib/ralib/example/sdts/LoginExampleBranching.java index eb53589c..7db1575d 100644 --- a/src/test/java/de/learnlib/ralib/example/sdts/LoginExampleBranching.java +++ b/src/test/java/de/learnlib/ralib/example/sdts/LoginExampleBranching.java @@ -18,7 +18,6 @@ import java.util.Map; -import de.learnlib.ralib.automata.TransitionGuard; import de.learnlib.ralib.oracles.Branching; import de.learnlib.ralib.words.PSymbolInstance; import gov.nasa.jpf.constraints.api.Expression; diff --git a/src/test/java/de/learnlib/ralib/example/sdts/LoginExampleTreeOracle.java b/src/test/java/de/learnlib/ralib/example/sdts/LoginExampleTreeOracle.java index cd037a42..49842ed0 100644 --- a/src/test/java/de/learnlib/ralib/example/sdts/LoginExampleTreeOracle.java +++ b/src/test/java/de/learnlib/ralib/example/sdts/LoginExampleTreeOracle.java @@ -27,12 +27,6 @@ import java.util.LinkedHashSet; import java.util.Map; -import de.learnlib.ralib.automata.TransitionGuard; -import de.learnlib.ralib.automata.guards.AtomicGuardExpression; -import de.learnlib.ralib.automata.guards.Conjunction; -import de.learnlib.ralib.automata.guards.Disjunction; -import de.learnlib.ralib.automata.guards.GuardExpression; -import de.learnlib.ralib.automata.guards.Relation; import de.learnlib.ralib.data.Constants; import de.learnlib.ralib.data.DataValue; import de.learnlib.ralib.data.PIV; diff --git a/src/test/java/de/learnlib/ralib/example/stack/StackAutomatonExample.java b/src/test/java/de/learnlib/ralib/example/stack/StackAutomatonExample.java index 78047dc7..698abfea 100644 --- a/src/test/java/de/learnlib/ralib/example/stack/StackAutomatonExample.java +++ b/src/test/java/de/learnlib/ralib/example/stack/StackAutomatonExample.java @@ -5,9 +5,6 @@ import de.learnlib.ralib.automata.MutableRegisterAutomaton; import de.learnlib.ralib.automata.RALocation; import de.learnlib.ralib.automata.RegisterAutomaton; -import de.learnlib.ralib.automata.TransitionGuard; -import de.learnlib.ralib.automata.guards.AtomicGuardExpression; -import de.learnlib.ralib.automata.guards.Relation; import de.learnlib.ralib.data.DataType; import de.learnlib.ralib.data.SymbolicDataValue; import de.learnlib.ralib.data.SymbolicDataValue.Parameter; diff --git a/src/test/java/de/learnlib/ralib/learning/ralambda/IOHandlingTest.java b/src/test/java/de/learnlib/ralib/learning/ralambda/IOHandlingTest.java index 8789ec93..f4d8a5fa 100644 --- a/src/test/java/de/learnlib/ralib/learning/ralambda/IOHandlingTest.java +++ b/src/test/java/de/learnlib/ralib/learning/ralambda/IOHandlingTest.java @@ -26,9 +26,6 @@ import de.learnlib.ralib.automata.MutableRegisterAutomaton; import de.learnlib.ralib.automata.RALocation; import de.learnlib.ralib.automata.RegisterAutomaton; -import de.learnlib.ralib.automata.TransitionGuard; -import de.learnlib.ralib.automata.guards.AtomicGuardExpression; -import de.learnlib.ralib.automata.guards.Relation; import de.learnlib.ralib.automata.output.OutputMapping; import de.learnlib.ralib.automata.output.OutputTransition; import de.learnlib.ralib.data.Constants; diff --git a/src/test/java/de/learnlib/ralib/learning/ralambda/LearnPadlock.java b/src/test/java/de/learnlib/ralib/learning/ralambda/LearnPadlock.java index 90e5dfe2..7b44e5a9 100644 --- a/src/test/java/de/learnlib/ralib/learning/ralambda/LearnPadlock.java +++ b/src/test/java/de/learnlib/ralib/learning/ralambda/LearnPadlock.java @@ -19,9 +19,6 @@ import de.learnlib.ralib.automata.MutableRegisterAutomaton; import de.learnlib.ralib.automata.RALocation; import de.learnlib.ralib.automata.RegisterAutomaton; -import de.learnlib.ralib.automata.TransitionGuard; -import de.learnlib.ralib.automata.guards.AtomicGuardExpression; -import de.learnlib.ralib.automata.guards.Relation; import de.learnlib.ralib.data.Constants; import de.learnlib.ralib.data.DataType; import de.learnlib.ralib.data.DataValue; diff --git a/src/test/java/de/learnlib/ralib/learning/ralambda/TestDistinguishingSuffixOptimization.java b/src/test/java/de/learnlib/ralib/learning/ralambda/TestDistinguishingSuffixOptimization.java index 963c2365..bf71b38c 100644 --- a/src/test/java/de/learnlib/ralib/learning/ralambda/TestDistinguishingSuffixOptimization.java +++ b/src/test/java/de/learnlib/ralib/learning/ralambda/TestDistinguishingSuffixOptimization.java @@ -16,7 +16,6 @@ import de.learnlib.ralib.automata.MutableRegisterAutomaton; import de.learnlib.ralib.automata.RALocation; import de.learnlib.ralib.automata.RegisterAutomaton; -import de.learnlib.ralib.automata.TransitionGuard; import de.learnlib.ralib.data.Constants; import de.learnlib.ralib.data.DataType; import de.learnlib.ralib.data.SymbolicDataValue; diff --git a/src/test/java/de/learnlib/ralib/learning/ralambda/TestSymmetry.java b/src/test/java/de/learnlib/ralib/learning/ralambda/TestSymmetry.java index a0f2afca..0d153768 100644 --- a/src/test/java/de/learnlib/ralib/learning/ralambda/TestSymmetry.java +++ b/src/test/java/de/learnlib/ralib/learning/ralambda/TestSymmetry.java @@ -19,11 +19,6 @@ import de.learnlib.ralib.automata.MutableRegisterAutomaton; import de.learnlib.ralib.automata.RALocation; import de.learnlib.ralib.automata.RegisterAutomaton; -import de.learnlib.ralib.automata.TransitionGuard; -import de.learnlib.ralib.automata.guards.AtomicGuardExpression; -import de.learnlib.ralib.automata.guards.Conjunction; -import de.learnlib.ralib.automata.guards.Disjunction; -import de.learnlib.ralib.automata.guards.Relation; import de.learnlib.ralib.data.Constants; import de.learnlib.ralib.data.DataType; import de.learnlib.ralib.data.DataValue; diff --git a/src/test/java/de/learnlib/ralib/learning/ralambda/TestUnknownMemorable.java b/src/test/java/de/learnlib/ralib/learning/ralambda/TestUnknownMemorable.java index 451ac3d5..d2128c4e 100644 --- a/src/test/java/de/learnlib/ralib/learning/ralambda/TestUnknownMemorable.java +++ b/src/test/java/de/learnlib/ralib/learning/ralambda/TestUnknownMemorable.java @@ -27,10 +27,6 @@ import de.learnlib.ralib.automata.MutableRegisterAutomaton; import de.learnlib.ralib.automata.RALocation; import de.learnlib.ralib.automata.RegisterAutomaton; -import de.learnlib.ralib.automata.TransitionGuard; -import de.learnlib.ralib.automata.guards.AtomicGuardExpression; -import de.learnlib.ralib.automata.guards.GuardExpression; -import de.learnlib.ralib.automata.guards.Relation; import de.learnlib.ralib.automata.output.OutputMapping; import de.learnlib.ralib.automata.output.OutputTransition; import de.learnlib.ralib.automata.xml.RegisterAutomatonImporter; diff --git a/src/test/java/de/learnlib/ralib/oracles/mto/InstantiateSymbolicWordTest.java b/src/test/java/de/learnlib/ralib/oracles/mto/InstantiateSymbolicWordTest.java index 4ef583df..b36d8a7e 100644 --- a/src/test/java/de/learnlib/ralib/oracles/mto/InstantiateSymbolicWordTest.java +++ b/src/test/java/de/learnlib/ralib/oracles/mto/InstantiateSymbolicWordTest.java @@ -22,10 +22,6 @@ import de.learnlib.ralib.automata.MutableRegisterAutomaton; import de.learnlib.ralib.automata.RALocation; import de.learnlib.ralib.automata.RegisterAutomaton; -import de.learnlib.ralib.automata.TransitionGuard; -import de.learnlib.ralib.automata.guards.AtomicGuardExpression; -import de.learnlib.ralib.automata.guards.GuardExpression; -import de.learnlib.ralib.automata.guards.Relation; import de.learnlib.ralib.data.Constants; import de.learnlib.ralib.data.DataType; import de.learnlib.ralib.data.DataValue; From f151896ac1bc872d898104d21ff3dcebc8c77eed Mon Sep 17 00:00:00 2001 From: Falk Howar Date: Fri, 21 Feb 2025 17:12:02 +0100 Subject: [PATCH 03/26] simplify constraint solver utils --- .../learnlib/ralib/automata/Transition.java | 4 +- .../automata/output/OutputTransition.java | 4 +- .../ralib/ceanalysis/PrefixFinder.java | 6 +- src/main/java/de/learnlib/ralib/dt/DTHyp.java | 4 +- .../ralib/learning/AutomatonBuilder.java | 4 +- .../learnlib/ralib/learning/Hypothesis.java | 4 +- .../oracles/mto/MultiTheoryBranching.java | 9 +-- .../mto/MultiTheorySDTLogicOracle.java | 16 ++-- .../oracles/mto/MultiTheoryTreeOracle.java | 7 +- .../de/learnlib/ralib/oracles/mto/SDT.java | 4 +- .../learnlib/ralib/smt/ConstraintSolver.java | 12 ++- .../ralib/smt/ConstraintSolverFactory.java | 36 --------- .../ralib/smt/{SMTUtils.java => SMTUtil.java} | 44 +++++++++-- .../JConstraintsConstraintSolver.java | 45 ----------- .../smt/jconstraints/JContraintsUtil.java | 75 ------------------- .../ralib/theory/EquivalenceClassFilter.java | 4 +- .../inequality/InequalityTheoryWithEq.java | 2 - .../tools/AbstractToolWithRandomWalk.java | 3 +- .../theories/DoubleInequalityTheory.java | 2 - src/test/java/de/learnlib/ralib/TestUtil.java | 8 +- .../ralib/ceanalysis/PrefixFinderTest.java | 6 +- .../de/learnlib/ralib/dt/DTInnerNodeTest.java | 3 +- .../java/de/learnlib/ralib/dt/DTTest.java | 5 +- .../ralambda/GeneratedHypothesesTest.java | 3 +- .../learning/ralambda/IOHandlingTest.java | 7 +- .../learning/ralambda/LearnABPOutputTest.java | 3 +- .../ralambda/LearnDtlsServerTest.java | 4 +- .../learning/ralambda/LearnEchoTest.java | 3 +- .../learning/ralambda/LearnLoginTest.java | 5 +- .../learning/ralambda/LearnMixedIOTest.java | 4 +- .../learning/ralambda/LearnPQIOTest.java | 4 +- .../ralib/learning/ralambda/LearnPQTest.java | 6 +- .../ralib/learning/ralambda/LearnPadlock.java | 3 +- .../ralambda/LearnPalindromeIOTest.java | 3 +- .../learning/ralambda/LearnRepeaterTest.java | 3 +- .../learning/ralambda/LearnSipIOTest.java | 3 +- .../learning/ralambda/LearnStackTest.java | 9 +-- .../TestDistinguishingSuffixOptimization.java | 3 +- .../learning/ralambda/TestOutputSuffixes.java | 3 +- .../learning/ralambda/TestQueryCount.java | 4 +- .../ralambda/TestSuffixOptimization.java | 3 +- .../ralib/learning/ralambda/TestSymmetry.java | 5 +- .../ralambda/TestUnknownMemorable.java | 7 +- .../learning/rastar/LearnBoundedListTest.java | 3 +- .../ralib/learning/rastar/LearnLoginTest.java | 3 +- .../learning/rastar/LearnMixedIOTest.java | 4 +- .../ralib/learning/rastar/LearnPQIOTest.java | 4 +- .../ralib/learning/rastar/LearnPQTest.java | 4 +- .../rastar/LearnPalindromeIOTest.java | 3 +- .../ralib/learning/rastar/LearnSipIOTest.java | 3 +- .../mto/ConstantsSDTBranchingTest.java | 4 +- .../ralib/oracles/mto/FreshValuesTest.java | 4 +- .../mto/InstantiateSymbolicWordTest.java | 5 +- .../ralib/oracles/mto/LoginBranchingTest.java | 9 +-- .../oracles/mto/MultiSDTBranchingTest.java | 4 +- .../mto/MultiTheorySDTLogicOracleTest.java | 3 +- .../oracles/mto/MultipleSpecialCasesTest.java | 4 +- .../oracles/mto/NonFreeSuffixValuesTest.java | 7 +- .../OptimizedSymbolicSuffixBuilderTest.java | 9 +-- .../ralib/oracles/mto/SIPSDTMergingTest.java | 4 +- .../oracles/mto/SecondSDTBranchingTest.java | 4 +- .../oracles/mto/UntypedBranchingTest.java | 4 +- .../theory/EquivalenceClassCoverageTest.java | 8 +- .../ralib/theory/TestEqualityTheory.java | 4 +- .../learnlib/ralib/theory/TestIneqEqTree.java | 4 +- .../ralib/theory/TestIneqOutputTree.java | 4 +- .../learnlib/ralib/theory/TestTreeOracle.java | 6 +- .../theory/TestUniqueEqualityTheory.java | 4 +- 68 files changed, 171 insertions(+), 336 deletions(-) delete mode 100644 src/main/java/de/learnlib/ralib/smt/ConstraintSolverFactory.java rename src/main/java/de/learnlib/ralib/smt/{SMTUtils.java => SMTUtil.java} (54%) delete mode 100644 src/main/java/de/learnlib/ralib/smt/jconstraints/JConstraintsConstraintSolver.java delete mode 100644 src/main/java/de/learnlib/ralib/smt/jconstraints/JContraintsUtil.java diff --git a/src/main/java/de/learnlib/ralib/automata/Transition.java b/src/main/java/de/learnlib/ralib/automata/Transition.java index 10bcaa09..9310ca8b 100644 --- a/src/main/java/de/learnlib/ralib/automata/Transition.java +++ b/src/main/java/de/learnlib/ralib/automata/Transition.java @@ -19,7 +19,7 @@ import de.learnlib.ralib.data.Constants; import de.learnlib.ralib.data.ParValuation; import de.learnlib.ralib.data.VarValuation; -import de.learnlib.ralib.smt.SMTUtils; +import de.learnlib.ralib.smt.SMTUtil; import de.learnlib.ralib.words.ParameterizedSymbol; import gov.nasa.jpf.constraints.api.Expression; @@ -50,7 +50,7 @@ public Transition(ParameterizedSymbol label, Expression guard, } public boolean isEnabled(VarValuation registers, ParValuation parameters, Constants consts) { - return guard.evaluateSMT(SMTUtils.compose(registers, parameters, consts)); + return guard.evaluateSMT(SMTUtil.compose(registers, parameters, consts)); } public VarValuation execute(VarValuation registers, ParValuation parameters, Constants consts) { diff --git a/src/main/java/de/learnlib/ralib/automata/output/OutputTransition.java b/src/main/java/de/learnlib/ralib/automata/output/OutputTransition.java index 1792a20f..e74518ae 100644 --- a/src/main/java/de/learnlib/ralib/automata/output/OutputTransition.java +++ b/src/main/java/de/learnlib/ralib/automata/output/OutputTransition.java @@ -29,7 +29,7 @@ import de.learnlib.ralib.data.SymbolicDataValue.Parameter; import de.learnlib.ralib.data.SymbolicDataValue.Register; import de.learnlib.ralib.data.VarValuation; -import de.learnlib.ralib.smt.SMTUtils; +import de.learnlib.ralib.smt.SMTUtil; import de.learnlib.ralib.words.OutputSymbol; import gov.nasa.jpf.constraints.api.Expression; import gov.nasa.jpf.constraints.util.ExpressionUtil; @@ -57,7 +57,7 @@ public OutputTransition(OutputMapping output, OutputSymbol label, RALocation sou public boolean canBeEnabled(VarValuation registers, Constants consts) { // FIXME: this is not in general safe to do!! (We assume the guard to not have parameters) - return this.guard.evaluateSMT(SMTUtils.compose(registers, new ParValuation(), consts)); + return this.guard.evaluateSMT(SMTUtil.compose(registers, new ParValuation(), consts)); } @Override diff --git a/src/main/java/de/learnlib/ralib/ceanalysis/PrefixFinder.java b/src/main/java/de/learnlib/ralib/ceanalysis/PrefixFinder.java index 7374e370..24bfe844 100644 --- a/src/main/java/de/learnlib/ralib/ceanalysis/PrefixFinder.java +++ b/src/main/java/de/learnlib/ralib/ceanalysis/PrefixFinder.java @@ -5,7 +5,7 @@ import java.util.Map; import java.util.Set; -import de.learnlib.ralib.smt.SMTUtils; +import de.learnlib.ralib.smt.SMTUtil; import gov.nasa.jpf.constraints.api.Expression; import gov.nasa.jpf.constraints.util.ExpressionUtil; import org.slf4j.Logger; @@ -256,7 +256,7 @@ private SymbolicWord candidate(Word prefix, renaming.put(sv, p); } } - Expression exprR = SMTUtils.renameVars(expr, renaming); + Expression exprR = SMTUtil.renameVars(expr, renaming); ParValuation pars = new ParValuation(path); Mapping vals = new Mapping<>(); @@ -264,7 +264,7 @@ private SymbolicWord candidate(Word prefix, vals.putAll(pars); vals.putAll(consts); - if (exprR.evaluateSMT(SMTUtils.compose(vals))) { + if (exprR.evaluateSMT(SMTUtil.compose(vals))) { candidate = path.prefix(prefix.length() + 1); SymbolicSuffix suffix = new SymbolicSuffix(candidate, ce.suffix(symSuffix.length() - 1), restrictionBuilder); return new SymbolicWord(candidate, suffix); diff --git a/src/main/java/de/learnlib/ralib/dt/DTHyp.java b/src/main/java/de/learnlib/ralib/dt/DTHyp.java index 7a2fa102..2953628e 100644 --- a/src/main/java/de/learnlib/ralib/dt/DTHyp.java +++ b/src/main/java/de/learnlib/ralib/dt/DTHyp.java @@ -11,7 +11,7 @@ import de.learnlib.ralib.data.VarValuation; import de.learnlib.ralib.learning.Hypothesis; import de.learnlib.ralib.oracles.Branching; -import de.learnlib.ralib.smt.SMTUtils; +import de.learnlib.ralib.smt.SMTUtil; import de.learnlib.ralib.words.PSymbolInstance; import de.learnlib.ralib.words.ParameterizedSymbol; import gov.nasa.jpf.constraints.api.Expression; @@ -90,7 +90,7 @@ protected List> getDTTransitions(Word dw) boolean found = false; for (Map.Entry, Expression> e : candidates.entrySet()) { Expression g = e.getValue(); - if (g.evaluateSMT(SMTUtils.compose(vars, pars, this.constants))) { + if (g.evaluateSMT(SMTUtil.compose(vars, pars, this.constants))) { Word w = e.getKey(); vars = current.getAssignment(w, dt.getLeaf(w)).compute(vars, pars, this.constants); current = dt.getLeaf(w); diff --git a/src/main/java/de/learnlib/ralib/learning/AutomatonBuilder.java b/src/main/java/de/learnlib/ralib/learning/AutomatonBuilder.java index 09989b07..16f7c3b0 100644 --- a/src/main/java/de/learnlib/ralib/learning/AutomatonBuilder.java +++ b/src/main/java/de/learnlib/ralib/learning/AutomatonBuilder.java @@ -20,7 +20,7 @@ import java.util.Map; import java.util.Map.Entry; -import de.learnlib.ralib.smt.SMTUtils; +import de.learnlib.ralib.smt.SMTUtil; import gov.nasa.jpf.constraints.api.Expression; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -195,7 +195,7 @@ public static Expression findMatchingGuard(Word dw, PI ParValuation pars = new ParValuation(dw); VarValuation vars = DataWords.computeVarValuation(new ParValuation(dw.prefix(dw.length() - 1)), piv); for (Expression g : branches.values()) { - if (g.evaluateSMT(SMTUtils.compose(vars, pars, consts))) { + if (g.evaluateSMT(SMTUtil.compose(vars, pars, consts))) { return g; } } diff --git a/src/main/java/de/learnlib/ralib/learning/Hypothesis.java b/src/main/java/de/learnlib/ralib/learning/Hypothesis.java index d18be69d..5d7b33bc 100644 --- a/src/main/java/de/learnlib/ralib/learning/Hypothesis.java +++ b/src/main/java/de/learnlib/ralib/learning/Hypothesis.java @@ -34,7 +34,7 @@ import de.learnlib.ralib.data.VarMapping; import de.learnlib.ralib.data.VarValuation; import de.learnlib.ralib.oracles.Branching; -import de.learnlib.ralib.smt.SMTUtils; +import de.learnlib.ralib.smt.SMTUtil; import de.learnlib.ralib.words.PSymbolInstance; import de.learnlib.ralib.words.ParameterizedSymbol; import gov.nasa.jpf.constraints.api.Expression; @@ -112,7 +112,7 @@ public Word branchWithSameGuard(Word word, Bra for (Map.Entry, Expression> e : branching.getBranches().entrySet()) { if (e.getKey().lastSymbol().getBaseSymbol().equals(ps)) { - if (e.getValue().evaluateSMT(SMTUtils.compose(vars, pval, constants))) { + if (e.getValue().evaluateSMT(SMTUtil.compose(vars, pval, constants))) { return e.getKey(); } } diff --git a/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheoryBranching.java b/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheoryBranching.java index 5bbf3ccc..f91a7d48 100644 --- a/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheoryBranching.java +++ b/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheoryBranching.java @@ -28,8 +28,7 @@ import de.learnlib.ralib.data.VarMapping; import de.learnlib.ralib.data.VarValuation; import de.learnlib.ralib.oracles.Branching; -import de.learnlib.ralib.smt.SMTUtils; -import de.learnlib.ralib.smt.jconstraints.JContraintsUtil; +import de.learnlib.ralib.smt.SMTUtil; import de.learnlib.ralib.theory.SDTGuard; import de.learnlib.ralib.words.DataWords; import de.learnlib.ralib.words.PSymbolInstance; @@ -278,7 +277,7 @@ public Word transformPrefix(Word dw) { Word prefix = null; for (Map.Entry, Expression> e : branches.entrySet()) { Expression g = e.getValue(); - if (g.evaluateSMT(SMTUtils.compose(vars, vals, constants))) { + if (g.evaluateSMT(SMTUtil.compose(vars, vals, constants))) { prefix = e.getKey(); break; } @@ -288,14 +287,14 @@ public Word transformPrefix(Word dw) { } private Expression renameSuffixValues(Expression expr) { - Collection svals = SMTUtils.getSymbolicDataValues(expr); + Collection svals = SMTUtil.getSymbolicDataValues(expr); VarMapping vmap = new VarMapping(); for (SymbolicDataValue sv : svals) { if (sv instanceof SuffixValue) { vmap.put(sv, new Parameter(sv.getDataType(), sv.getId())); } } - return SMTUtils.renameVars(expr, vmap); + return SMTUtil.renameVars(expr, vmap); } @Override diff --git a/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheorySDTLogicOracle.java b/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheorySDTLogicOracle.java index eff1e349..c0000397 100644 --- a/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheorySDTLogicOracle.java +++ b/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheorySDTLogicOracle.java @@ -18,9 +18,7 @@ import java.util.Map; -import de.learnlib.ralib.smt.ReplacingVarsVisitor; -import de.learnlib.ralib.smt.SMTUtils; -import de.learnlib.ralib.smt.jconstraints.JContraintsUtil; +import de.learnlib.ralib.smt.SMTUtil; import gov.nasa.jpf.constraints.api.Expression; import gov.nasa.jpf.constraints.api.Variable; import gov.nasa.jpf.constraints.expressions.Negation; @@ -88,11 +86,11 @@ public boolean hasCounterexample(Word prefix, SymbolicDecisionT } } - exprG = SMTUtils.renameVars(exprG, gremap); + exprG = SMTUtil.renameVars(exprG, gremap); VarMapping remap = piv2.createRemapping(piv1); - Expression expr2r = SMTUtils.renameVars(expr2, remap); + Expression expr2r = SMTUtil.renameVars(expr2, remap); Expression left = ExpressionUtil.and(exprG, expr1, new Negation(expr2r)); @@ -131,7 +129,7 @@ public Expression getCEGuard(Word prefix, boolean outcome2 = e2.getValue(); if (outcome1 != outcome2) { VarMapping remap = piv2.createRemapping(piv1); - Expression test = ExpressionUtil.and(expr1, SMTUtils.renameVars(expr2, remap)); + Expression test = ExpressionUtil.and(expr1, SMTUtil.renameVars(expr2, remap)); if (solver.isSatisfiable(test, new Mapping<>())) { return expr1; } @@ -152,7 +150,7 @@ public boolean doesRefine(Expression refining, PIV pivRefining, Express VarMapping remap = pivRefined.createRemapping(pivRefining); Expression exprRefining = refining; - Expression exprRefined = SMTUtils.renameVars(refined, remap); + Expression exprRefined = SMTUtil.renameVars(refined, remap); // is there any case for which refining is true but refined is false? @@ -182,7 +180,7 @@ public boolean areMutuallyExclusive(Expression guard1, PIV piv1, Expres VarMapping remap = piv2.createRemapping(piv1); Expression exprGuard1 = guard1; - Expression exprGuard2 = SMTUtils.renameVars(guard2, remap); + Expression exprGuard2 = SMTUtil.renameVars(guard2, remap); Expression test = ExpressionUtil.and(exprGuard1, exprGuard2); @@ -203,7 +201,7 @@ public boolean areEquivalent(Expression guard1, PIV piv1, Expression remap = piv2.createRemapping(piv1); - Expression g2relabel = SMTUtils.renameVars(guard2, remap); + Expression g2relabel = SMTUtil.renameVars(guard2, remap); Expression test = ExpressionUtil.or( ExpressionUtil.and(guard1, new gov.nasa.jpf.constraints.expressions.Negation(g2relabel)), diff --git a/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheoryTreeOracle.java b/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheoryTreeOracle.java index 599452bd..6a4e71b4 100644 --- a/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheoryTreeOracle.java +++ b/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheoryTreeOracle.java @@ -30,8 +30,7 @@ import com.google.common.collect.Sets; -import de.learnlib.ralib.smt.SMTUtils; -import de.learnlib.ralib.smt.jconstraints.JContraintsUtil; +import de.learnlib.ralib.smt.SMTUtil; import gov.nasa.jpf.constraints.api.Expression; import gov.nasa.jpf.constraints.util.ExpressionUtil; import org.slf4j.Logger; @@ -571,7 +570,7 @@ public boolean accepts(Word prefix, Word suffi Expression expr = _sdt.getAcceptingPaths(constants); if (expr.equals(ExpressionUtil.FALSE)) return false; - for (SymbolicDataValue sdv : SMTUtils.getSymbolicDataValues(expr)) { + for (SymbolicDataValue sdv : SMTUtil.getSymbolicDataValues(expr)) { if (sdv instanceof Register && mapping.get(sdv) == null) { Theory teach = teachers.get(sdv.getDataType()); List values = new ArrayList<>(); @@ -582,7 +581,7 @@ public boolean accepts(Word prefix, Word suffi } } - return expr.evaluateSMT(SMTUtils.compose(mapping)); + return expr.evaluateSMT(SMTUtil.compose(mapping)); } public Map getTeachers() { diff --git a/src/main/java/de/learnlib/ralib/oracles/mto/SDT.java b/src/main/java/de/learnlib/ralib/oracles/mto/SDT.java index 53c47c49..4e509afd 100644 --- a/src/main/java/de/learnlib/ralib/oracles/mto/SDT.java +++ b/src/main/java/de/learnlib/ralib/oracles/mto/SDT.java @@ -33,7 +33,7 @@ import de.learnlib.ralib.data.SymbolicDataValue.SuffixValue; import de.learnlib.ralib.data.VarMapping; import de.learnlib.ralib.learning.SymbolicDecisionTree; -import de.learnlib.ralib.smt.SMTUtils; +import de.learnlib.ralib.smt.SMTUtil; import de.learnlib.ralib.theory.SDTGuard; import de.learnlib.ralib.theory.SDTIfGuard; import de.learnlib.ralib.theory.SDTMultiGuard; @@ -189,7 +189,7 @@ public boolean isAccepting(Mapping vals, Constants mapping.putAll(vals); mapping.putAll(consts); Expression expr = getAcceptingPaths(consts); - return expr.evaluateSMT(SMTUtils.compose(mapping)); + return expr.evaluateSMT(SMTUtil.compose(mapping)); } protected Map getChildren() { diff --git a/src/main/java/de/learnlib/ralib/smt/ConstraintSolver.java b/src/main/java/de/learnlib/ralib/smt/ConstraintSolver.java index 171baa88..8cca20fd 100644 --- a/src/main/java/de/learnlib/ralib/smt/ConstraintSolver.java +++ b/src/main/java/de/learnlib/ralib/smt/ConstraintSolver.java @@ -20,13 +20,21 @@ import de.learnlib.ralib.data.Mapping; import de.learnlib.ralib.data.SymbolicDataValue; import gov.nasa.jpf.constraints.api.Expression; +import gov.nasa.jpf.constraints.solvers.nativez3.NativeZ3SolverProvider; + +import java.util.Properties; /** * * @author falk */ -public interface ConstraintSolver { +public class ConstraintSolver { - boolean isSatisfiable(Expression expr, Mapping val); + private final gov.nasa.jpf.constraints.api.ConstraintSolver solver = + new NativeZ3SolverProvider().createSolver(new Properties()); + public boolean isSatisfiable(Expression expr, Mapping val) { + gov.nasa.jpf.constraints.api.ConstraintSolver.Result r = solver.isSatisfiable( SMTUtil.toExpression(expr, val)); + return r == gov.nasa.jpf.constraints.api.ConstraintSolver.Result.SAT; + } } diff --git a/src/main/java/de/learnlib/ralib/smt/ConstraintSolverFactory.java b/src/main/java/de/learnlib/ralib/smt/ConstraintSolverFactory.java deleted file mode 100644 index f9c211eb..00000000 --- a/src/main/java/de/learnlib/ralib/smt/ConstraintSolverFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (C) 2014-2015 The LearnLib Contributors - * This file is part of LearnLib, http://www.learnlib.de/. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package de.learnlib.ralib.smt; - -import java.util.Properties; - -import de.learnlib.ralib.smt.jconstraints.JConstraintsConstraintSolver; -import gov.nasa.jpf.constraints.solvers.nativez3.NativeZ3SolverProvider; - -/** - * - * @author falk - */ -public class ConstraintSolverFactory { - - public static JConstraintsConstraintSolver createZ3ConstraintSolver() { - return new JConstraintsConstraintSolver( - (new NativeZ3SolverProvider()).createSolver(new Properties())); - } - -} diff --git a/src/main/java/de/learnlib/ralib/smt/SMTUtils.java b/src/main/java/de/learnlib/ralib/smt/SMTUtil.java similarity index 54% rename from src/main/java/de/learnlib/ralib/smt/SMTUtils.java rename to src/main/java/de/learnlib/ralib/smt/SMTUtil.java index f3f62fa0..0bb126ca 100644 --- a/src/main/java/de/learnlib/ralib/smt/SMTUtils.java +++ b/src/main/java/de/learnlib/ralib/smt/SMTUtil.java @@ -1,24 +1,19 @@ package de.learnlib.ralib.smt; -import com.google.common.base.Function; import de.learnlib.ralib.data.DataValue; import de.learnlib.ralib.data.Mapping; import de.learnlib.ralib.data.SymbolicDataValue; import de.learnlib.ralib.data.VarMapping; import gov.nasa.jpf.constraints.api.Expression; -import gov.nasa.jpf.constraints.api.ExpressionVisitor; import gov.nasa.jpf.constraints.api.Valuation; import gov.nasa.jpf.constraints.api.Variable; import gov.nasa.jpf.constraints.expressions.*; import gov.nasa.jpf.constraints.types.BuiltinTypes; -import gov.nasa.jpf.constraints.util.DuplicatingVisitor; import gov.nasa.jpf.constraints.util.ExpressionUtil; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; +import java.util.*; -public class SMTUtils { +public class SMTUtil { public static Valuation compose(Mapping... varVals) { Valuation val = new Valuation(); @@ -50,4 +45,39 @@ public static Expression renameVars(Expression expr, final ReplacingVarsVisitor replacer = new ReplacingVarsVisitor(); return replacer.apply(expr, relabelling); } + + public static Expression toExpression(Expression expr, Mapping val) { + Map map = new HashMap<>(); + //Expression guardExpr = toExpression(expr, map); + Expression valExpr = toExpression(val, map); + return ExpressionUtil.and(expr, valExpr); + } + + public static Expression toExpression(Mapping val, Map map) { + Expression[] elems = new Expression[val.size()]; + int i = 0; + for (Map.Entry entry : val.entrySet()) { + elems[i++] = new NumericBooleanExpression(getOrCreate(entry.getKey(), map), NumericComparator.EQ, toConstant(entry.getValue())); + } + return ExpressionUtil.and(elems); + } + + private static Variable getOrCreate(SymbolicDataValue dv, + Map map) { + Variable ret = map.get(dv); + if (ret == null) { + // FIXME: superfluous! + ret = dv; + map.put(dv, ret); + } + return ret; + } + + public static Constant toConstant(DataValue v) { + return new Constant( BuiltinTypes.DECIMAL, (v.getValue())); + } + + public static Variable toVariable(DataValue v) { + return new Variable(BuiltinTypes.DECIMAL, v.toString()); + } } diff --git a/src/main/java/de/learnlib/ralib/smt/jconstraints/JConstraintsConstraintSolver.java b/src/main/java/de/learnlib/ralib/smt/jconstraints/JConstraintsConstraintSolver.java deleted file mode 100644 index b4677704..00000000 --- a/src/main/java/de/learnlib/ralib/smt/jconstraints/JConstraintsConstraintSolver.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (C) 2014-2015 The LearnLib Contributors - * This file is part of LearnLib, http://www.learnlib.de/. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package de.learnlib.ralib.smt.jconstraints; - -import de.learnlib.ralib.data.DataValue; -import de.learnlib.ralib.data.Mapping; -import de.learnlib.ralib.data.SymbolicDataValue; -import de.learnlib.ralib.smt.*; -import gov.nasa.jpf.constraints.api.ConstraintSolver.Result; -import gov.nasa.jpf.constraints.api.Expression; - -/** - * - * @author falk - */ -public class JConstraintsConstraintSolver implements ConstraintSolver { - - private final gov.nasa.jpf.constraints.api.ConstraintSolver solver; - - public JConstraintsConstraintSolver( - gov.nasa.jpf.constraints.api.ConstraintSolver solver) { - this.solver = solver; - } - - @Override - public boolean isSatisfiable(Expression expr, Mapping val) { - Result r = solver.isSatisfiable( JContraintsUtil.toExpression(expr, val)); - return r == Result.SAT; - } - -} diff --git a/src/main/java/de/learnlib/ralib/smt/jconstraints/JContraintsUtil.java b/src/main/java/de/learnlib/ralib/smt/jconstraints/JContraintsUtil.java deleted file mode 100644 index cd61234d..00000000 --- a/src/main/java/de/learnlib/ralib/smt/jconstraints/JContraintsUtil.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright (C) 2014-2015 The LearnLib Contributors - * This file is part of LearnLib, http://www.learnlib.de/. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package de.learnlib.ralib.smt.jconstraints; - -import java.util.HashMap; -import java.util.Map; - -import de.learnlib.ralib.data.DataValue; -import de.learnlib.ralib.data.Mapping; -import de.learnlib.ralib.data.SymbolicDataValue; -import gov.nasa.jpf.constraints.api.Expression; -import gov.nasa.jpf.constraints.api.Variable; -import gov.nasa.jpf.constraints.expressions.Constant; -import gov.nasa.jpf.constraints.expressions.LogicalOperator; -import gov.nasa.jpf.constraints.expressions.NumericBooleanExpression; -import gov.nasa.jpf.constraints.expressions.NumericComparator; -import gov.nasa.jpf.constraints.types.BuiltinTypes; -import gov.nasa.jpf.constraints.types.Type; -import gov.nasa.jpf.constraints.util.ExpressionUtil; - -/** - * - * @author falk - */ -public class JContraintsUtil { - - public static Expression toExpression(Expression expr, Mapping val) { - Map map = new HashMap<>(); - //Expression guardExpr = toExpression(expr, map); - Expression valExpr = toExpression(val, map); - return ExpressionUtil.and(expr, valExpr); - } - - public static Expression toExpression(Mapping val, Map map) { - Expression[] elems = new Expression[val.size()]; - int i = 0; - for (Map.Entry entry : val.entrySet()) { - elems[i++] = new NumericBooleanExpression(getOrCreate(entry.getKey(), map), NumericComparator.EQ, toConstant(entry.getValue())); - } - return ExpressionUtil.and(elems); - } - - private static Variable getOrCreate(SymbolicDataValue dv, - Map map) { - Variable ret = map.get(dv); - if (ret == null) { - // FIXME: superfluous! - ret = dv; - map.put(dv, ret); - } - return ret; - } - - public static Constant toConstant(DataValue v) { - return new Constant( BuiltinTypes.DECIMAL, (v.getValue())); - } - - public static Variable toVariable(DataValue v) { - return new Variable(BuiltinTypes.DECIMAL, v.toString()); - } -} diff --git a/src/main/java/de/learnlib/ralib/theory/EquivalenceClassFilter.java b/src/main/java/de/learnlib/ralib/theory/EquivalenceClassFilter.java index 91e17eaa..467bcd38 100644 --- a/src/main/java/de/learnlib/ralib/theory/EquivalenceClassFilter.java +++ b/src/main/java/de/learnlib/ralib/theory/EquivalenceClassFilter.java @@ -12,7 +12,7 @@ import de.learnlib.ralib.data.WordValuation; import de.learnlib.ralib.data.util.SymbolicDataValueGenerator.ParameterGenerator; import de.learnlib.ralib.data.util.SymbolicDataValueGenerator.SuffixValueGenerator; -import de.learnlib.ralib.smt.SMTUtils; +import de.learnlib.ralib.smt.SMTUtil; import de.learnlib.ralib.words.PSymbolInstance; import de.learnlib.ralib.words.ParameterizedSymbol; import gov.nasa.jpf.constraints.api.Expression; @@ -67,7 +67,7 @@ public List toList(SuffixValueRestriction restr, ecMapping.putAll(mapping); ecMapping.put(restr.getParameter(), ec); //System.out.println(" -- " + expr + " - " + ecMapping); - if (expr.evaluateSMT(SMTUtils.compose(ecMapping))) { + if (expr.evaluateSMT(SMTUtil.compose(ecMapping))) { filtered.add(ec); } } diff --git a/src/main/java/de/learnlib/ralib/theory/inequality/InequalityTheoryWithEq.java b/src/main/java/de/learnlib/ralib/theory/inequality/InequalityTheoryWithEq.java index 6a0cda66..66f888c6 100644 --- a/src/main/java/de/learnlib/ralib/theory/inequality/InequalityTheoryWithEq.java +++ b/src/main/java/de/learnlib/ralib/theory/inequality/InequalityTheoryWithEq.java @@ -16,8 +16,6 @@ */ package de.learnlib.ralib.theory.inequality; -import static de.learnlib.ralib.smt.jconstraints.JContraintsUtil.toVariable; - import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; diff --git a/src/main/java/de/learnlib/ralib/tools/AbstractToolWithRandomWalk.java b/src/main/java/de/learnlib/ralib/tools/AbstractToolWithRandomWalk.java index 80d3898b..a76c7b41 100644 --- a/src/main/java/de/learnlib/ralib/tools/AbstractToolWithRandomWalk.java +++ b/src/main/java/de/learnlib/ralib/tools/AbstractToolWithRandomWalk.java @@ -28,7 +28,6 @@ import de.learnlib.ralib.data.DataType; import de.learnlib.ralib.data.DataValue; import de.learnlib.ralib.smt.ConstraintSolver; -import de.learnlib.ralib.smt.ConstraintSolverFactory; import de.learnlib.ralib.tools.classanalyzer.TypedTheory; import de.learnlib.ralib.tools.config.Configuration; import de.learnlib.ralib.tools.config.ConfigurationException; @@ -192,7 +191,7 @@ public void setup(Configuration config) throws ConfigurationException { teacherClasses.put(pair.getFirst(), pair.getSecond()); } - this.solver = ConstraintSolverFactory.createZ3ConstraintSolver(); + this.solver = new ConstraintSolver(); } private Pair parseTeacherConfig(String config) diff --git a/src/main/java/de/learnlib/ralib/tools/theories/DoubleInequalityTheory.java b/src/main/java/de/learnlib/ralib/tools/theories/DoubleInequalityTheory.java index 37f3b673..cf3061c2 100644 --- a/src/main/java/de/learnlib/ralib/tools/theories/DoubleInequalityTheory.java +++ b/src/main/java/de/learnlib/ralib/tools/theories/DoubleInequalityTheory.java @@ -18,8 +18,6 @@ */ package de.learnlib.ralib.tools.theories; -import static de.learnlib.ralib.smt.jconstraints.JContraintsUtil.toExpression; - import java.math.BigDecimal; import java.util.*; diff --git a/src/test/java/de/learnlib/ralib/TestUtil.java b/src/test/java/de/learnlib/ralib/TestUtil.java index 90dde319..a76995fc 100644 --- a/src/test/java/de/learnlib/ralib/TestUtil.java +++ b/src/test/java/de/learnlib/ralib/TestUtil.java @@ -33,7 +33,6 @@ import de.learnlib.ralib.oracles.io.IOOracle; import de.learnlib.ralib.oracles.mto.MultiTheoryTreeOracle; import de.learnlib.ralib.smt.ConstraintSolver; -import de.learnlib.ralib.smt.jconstraints.JConstraintsConstraintSolver; import de.learnlib.ralib.sul.DataWordSUL; import de.learnlib.ralib.sul.SULOracle; import de.learnlib.ralib.theory.Theory; @@ -59,11 +58,8 @@ public static void configureLogging(Level lvl) { } } - public static JConstraintsConstraintSolver getZ3Solver() { - gov.nasa.jpf.constraints.api.ConstraintSolver solver = - ConstraintSolverFactory.createSolver("z3"); - - return new JConstraintsConstraintSolver(solver); + public static ConstraintSolver getZ3Solver() { + return new ConstraintSolver(); } public static MultiTheoryTreeOracle createMTO( diff --git a/src/test/java/de/learnlib/ralib/ceanalysis/PrefixFinderTest.java b/src/test/java/de/learnlib/ralib/ceanalysis/PrefixFinderTest.java index efd62687..c8b58854 100644 --- a/src/test/java/de/learnlib/ralib/ceanalysis/PrefixFinderTest.java +++ b/src/test/java/de/learnlib/ralib/ceanalysis/PrefixFinderTest.java @@ -25,8 +25,6 @@ import java.util.LinkedHashMap; import java.util.Map; -import de.learnlib.ralib.smt.ConstraintSolverFactory; -import de.learnlib.ralib.smt.jconstraints.JConstraintsConstraintSolver; import org.testng.Assert; import org.testng.annotations.Test; @@ -68,7 +66,7 @@ public void prefixFinderTest() { teachers.put(T_UID, new IntegerEqualityTheory(T_UID)); teachers.put(T_PWD, new IntegerEqualityTheory(T_PWD)); - ConstraintSolver solver = ConstraintSolverFactory.createZ3ConstraintSolver(); + ConstraintSolver solver = new ConstraintSolver(); MultiTheoryTreeOracle mto = new MultiTheoryTreeOracle( dwOracle, teachers, new Constants(), solver); @@ -112,7 +110,7 @@ public void prefixFinderMultipleAccessSequencesTest() { final Map teachers = new LinkedHashMap<>(); teachers.put(T_INT, new IntegerEqualityTheory(T_INT)); - ConstraintSolver solver = ConstraintSolverFactory.createZ3ConstraintSolver(); + ConstraintSolver solver = new ConstraintSolver(); MultiTheoryTreeOracle mto = new MultiTheoryTreeOracle( dwOracle, teachers, new Constants(), solver); diff --git a/src/test/java/de/learnlib/ralib/dt/DTInnerNodeTest.java b/src/test/java/de/learnlib/ralib/dt/DTInnerNodeTest.java index 2172fff6..f8818376 100644 --- a/src/test/java/de/learnlib/ralib/dt/DTInnerNodeTest.java +++ b/src/test/java/de/learnlib/ralib/dt/DTInnerNodeTest.java @@ -9,7 +9,6 @@ import java.util.LinkedHashMap; import java.util.Map; -import de.learnlib.ralib.smt.ConstraintSolverFactory; import org.testng.Assert; import org.testng.annotations.Test; @@ -39,7 +38,7 @@ public void siftTest() { final Map teachers = new LinkedHashMap<>(); teachers.put(T_INT, new IntegerEqualityTheory(T_INT)); - ConstraintSolver solver = ConstraintSolverFactory.createZ3ConstraintSolver(); + ConstraintSolver solver = new ConstraintSolver(); MultiTheoryTreeOracle mto = new MultiTheoryTreeOracle( dwOracle, teachers, new Constants(), solver); diff --git a/src/test/java/de/learnlib/ralib/dt/DTTest.java b/src/test/java/de/learnlib/ralib/dt/DTTest.java index 8129fe6c..261dbb7e 100644 --- a/src/test/java/de/learnlib/ralib/dt/DTTest.java +++ b/src/test/java/de/learnlib/ralib/dt/DTTest.java @@ -9,7 +9,6 @@ import java.util.LinkedHashMap; import java.util.Map; -import de.learnlib.ralib.smt.ConstraintSolverFactory; import org.testng.Assert; import org.testng.annotations.Test; @@ -136,7 +135,7 @@ public void siftTest() { final Map teachers = new LinkedHashMap<>(); teachers.put(T_INT, new IntegerEqualityTheory(T_INT)); - ConstraintSolver solver = ConstraintSolverFactory.createZ3ConstraintSolver(); + ConstraintSolver solver = new ConstraintSolver(); MultiTheoryTreeOracle mto = new MultiTheoryTreeOracle( dwOracle, teachers, new Constants(), solver); @@ -203,7 +202,7 @@ public void splitTest() { final Map teachers = new LinkedHashMap<>(); teachers.put(T_INT, new IntegerEqualityTheory(T_INT)); - ConstraintSolver solver = ConstraintSolverFactory.createZ3ConstraintSolver(); + ConstraintSolver solver = new ConstraintSolver(); MultiTheoryTreeOracle mto = new MultiTheoryTreeOracle( dwOracle, teachers, new Constants(), solver); diff --git a/src/test/java/de/learnlib/ralib/learning/ralambda/GeneratedHypothesesTest.java b/src/test/java/de/learnlib/ralib/learning/ralambda/GeneratedHypothesesTest.java index b82ce20e..a4fdf38d 100644 --- a/src/test/java/de/learnlib/ralib/learning/ralambda/GeneratedHypothesesTest.java +++ b/src/test/java/de/learnlib/ralib/learning/ralambda/GeneratedHypothesesTest.java @@ -8,7 +8,6 @@ import java.util.LinkedHashMap; import java.util.Map; -import de.learnlib.ralib.smt.ConstraintSolverFactory; import org.testng.Assert; import org.testng.annotations.Test; @@ -40,7 +39,7 @@ public void getHypothesisTest() { Constants consts = new Constants(); RegisterAutomaton sul = AUTOMATON; DataWordOracle dwOracle = new SimulatorOracle(sul); - ConstraintSolver solver = ConstraintSolverFactory.createZ3ConstraintSolver(); + ConstraintSolver solver = new ConstraintSolver(); final Map teachers = new LinkedHashMap<>(); IntegerEqualityTheory theory = new IntegerEqualityTheory(T_INT); diff --git a/src/test/java/de/learnlib/ralib/learning/ralambda/IOHandlingTest.java b/src/test/java/de/learnlib/ralib/learning/ralambda/IOHandlingTest.java index f4d8a5fa..625dad4c 100644 --- a/src/test/java/de/learnlib/ralib/learning/ralambda/IOHandlingTest.java +++ b/src/test/java/de/learnlib/ralib/learning/ralambda/IOHandlingTest.java @@ -11,7 +11,6 @@ import java.util.Map; import java.util.logging.Level; -import de.learnlib.ralib.smt.ConstraintSolverFactory; import gov.nasa.jpf.constraints.api.Expression; import gov.nasa.jpf.constraints.expressions.NumericBooleanExpression; import gov.nasa.jpf.constraints.expressions.NumericComparator; @@ -213,7 +212,7 @@ public void testLearnIORAWithNoOutputParams() { ((EqualityTheory) t).setFreshValues(true, ioCache); }); - ConstraintSolver solver = ConstraintSolverFactory.createZ3ConstraintSolver(); + ConstraintSolver solver = new ConstraintSolver(); MultiTheoryTreeOracle mto = new MultiTheoryTreeOracle(ioFilter, teachers, consts, solver); MultiTheorySDTLogicOracle mlo = new MultiTheorySDTLogicOracle(consts, solver); @@ -260,7 +259,7 @@ public void testLearnIORAWithEqualOutputParam() { ((EqualityTheory) t).setFreshValues(true, ioCache); }); - ConstraintSolver solver = ConstraintSolverFactory.createZ3ConstraintSolver(); + ConstraintSolver solver = new ConstraintSolver(); MultiTheoryTreeOracle mto = new MultiTheoryTreeOracle(ioFilter, teachers, consts, solver); MultiTheorySDTLogicOracle mlo = new MultiTheorySDTLogicOracle(consts, solver); @@ -311,7 +310,7 @@ public void testLearnIORAWithFreshOutputParam() { ((EqualityTheory) t).setFreshValues(true, ioCache); }); - ConstraintSolver solver = ConstraintSolverFactory.createZ3ConstraintSolver(); + ConstraintSolver solver = new ConstraintSolver(); MultiTheoryTreeOracle mto = new MultiTheoryTreeOracle(ioFilter, teachers, consts, solver); MultiTheorySDTLogicOracle mlo = new MultiTheorySDTLogicOracle(consts, solver); diff --git a/src/test/java/de/learnlib/ralib/learning/ralambda/LearnABPOutputTest.java b/src/test/java/de/learnlib/ralib/learning/ralambda/LearnABPOutputTest.java index f8c94c86..5d7b880b 100644 --- a/src/test/java/de/learnlib/ralib/learning/ralambda/LearnABPOutputTest.java +++ b/src/test/java/de/learnlib/ralib/learning/ralambda/LearnABPOutputTest.java @@ -5,7 +5,6 @@ import java.util.Random; import java.util.logging.Level; -import de.learnlib.ralib.smt.ConstraintSolverFactory; import org.testng.Assert; import org.testng.annotations.Test; @@ -77,7 +76,7 @@ public void learnABPOutput() { ((EqualityTheory)t).setFreshValues(true, ioCache); }); - ConstraintSolver solver = ConstraintSolverFactory.createZ3ConstraintSolver(); + ConstraintSolver solver = new ConstraintSolver(); MultiTheoryTreeOracle mto = new MultiTheoryTreeOracle( ioFilter, teachers, consts, solver); diff --git a/src/test/java/de/learnlib/ralib/learning/ralambda/LearnDtlsServerTest.java b/src/test/java/de/learnlib/ralib/learning/ralambda/LearnDtlsServerTest.java index 3a4d4aac..32193762 100644 --- a/src/test/java/de/learnlib/ralib/learning/ralambda/LearnDtlsServerTest.java +++ b/src/test/java/de/learnlib/ralib/learning/ralambda/LearnDtlsServerTest.java @@ -3,6 +3,7 @@ import java.util.LinkedHashMap; import java.util.Map; +import de.learnlib.ralib.smt.ConstraintSolver; import org.testng.Assert; import org.testng.annotations.Test; @@ -18,7 +19,6 @@ import de.learnlib.ralib.learning.Hypothesis; import de.learnlib.ralib.learning.RaLearningAlgorithmName; import de.learnlib.ralib.oracles.SimulatorOracle; -import de.learnlib.ralib.smt.jconstraints.JConstraintsConstraintSolver; import de.learnlib.ralib.theory.Theory; import de.learnlib.ralib.tools.theories.IntegerEqualityTheory; import de.learnlib.ralib.words.PSymbolInstance; @@ -47,7 +47,7 @@ public void learnDtlsServerTest() { teachers.put(epoch, new IntegerEqualityTheory(epoch)); SimulatorOracle dwOracle = new SimulatorOracle(model); - JConstraintsConstraintSolver jsolv = TestUtil.getZ3Solver(); + ConstraintSolver jsolv = TestUtil.getZ3Solver(); RaLibLearningExperimentRunner runner = new RaLibLearningExperimentRunner(logger); IOEquivalenceTest eqOracle = new IOEquivalenceTest(model, teachers, consts, false, actions); diff --git a/src/test/java/de/learnlib/ralib/learning/ralambda/LearnEchoTest.java b/src/test/java/de/learnlib/ralib/learning/ralambda/LearnEchoTest.java index a197e9af..ef5b116c 100644 --- a/src/test/java/de/learnlib/ralib/learning/ralambda/LearnEchoTest.java +++ b/src/test/java/de/learnlib/ralib/learning/ralambda/LearnEchoTest.java @@ -9,7 +9,6 @@ import java.util.LinkedHashMap; import java.util.Map; -import de.learnlib.ralib.smt.ConstraintSolverFactory; import org.testng.Assert; import org.testng.annotations.Test; @@ -53,7 +52,7 @@ public void learnEchoTest() { IOCache ioCache = new IOCache(ioOracle); IOFilter oracle = new IOFilter(ioCache, sul.getInputSymbols()); - ConstraintSolver solver = ConstraintSolverFactory.createZ3ConstraintSolver(); + ConstraintSolver solver = new ConstraintSolver(); MultiTheoryTreeOracle mto = new MultiTheoryTreeOracle(oracle, teachers, consts, solver); MultiTheorySDTLogicOracle mlo = new MultiTheorySDTLogicOracle(consts, solver); diff --git a/src/test/java/de/learnlib/ralib/learning/ralambda/LearnLoginTest.java b/src/test/java/de/learnlib/ralib/learning/ralambda/LearnLoginTest.java index e747d026..5fffa0b8 100644 --- a/src/test/java/de/learnlib/ralib/learning/ralambda/LearnLoginTest.java +++ b/src/test/java/de/learnlib/ralib/learning/ralambda/LearnLoginTest.java @@ -13,7 +13,6 @@ import java.util.Map; import java.util.logging.Level; -import de.learnlib.ralib.smt.ConstraintSolverFactory; import org.testng.Assert; import org.testng.annotations.Test; @@ -53,7 +52,7 @@ public void learnLoginTest() { teachers.put(T_UID, new IntegerEqualityTheory(T_UID)); teachers.put(T_PWD, new IntegerEqualityTheory(T_PWD)); - ConstraintSolver solver = ConstraintSolverFactory.createZ3ConstraintSolver(); + ConstraintSolver solver = new ConstraintSolver(); MultiTheoryTreeOracle mto = new MultiTheoryTreeOracle( dwOracle, teachers, new Constants(), solver); @@ -94,7 +93,7 @@ public void learnLoginRandomTest() { Constants consts = new Constants(); RegisterAutomaton sul = AUTOMATON; DataWordOracle dwOracle = new SimulatorOracle(sul); - ConstraintSolver solver = ConstraintSolverFactory.createZ3ConstraintSolver(); + ConstraintSolver solver = new ConstraintSolver(); final Map teachers = new LinkedHashMap<>(); teachers.put(T_UID, new IntegerEqualityTheory(T_UID)); diff --git a/src/test/java/de/learnlib/ralib/learning/ralambda/LearnMixedIOTest.java b/src/test/java/de/learnlib/ralib/learning/ralambda/LearnMixedIOTest.java index 2ac3e5d6..2837ae88 100644 --- a/src/test/java/de/learnlib/ralib/learning/ralambda/LearnMixedIOTest.java +++ b/src/test/java/de/learnlib/ralib/learning/ralambda/LearnMixedIOTest.java @@ -23,6 +23,7 @@ import java.util.Random; import java.util.logging.Level; +import de.learnlib.ralib.smt.ConstraintSolver; import org.testng.Assert; import org.testng.annotations.Test; @@ -44,7 +45,6 @@ import de.learnlib.ralib.oracles.io.IOOracle; import de.learnlib.ralib.oracles.mto.MultiTheorySDTLogicOracle; import de.learnlib.ralib.oracles.mto.MultiTheoryTreeOracle; -import de.learnlib.ralib.smt.jconstraints.JConstraintsConstraintSolver; import de.learnlib.ralib.sul.DataWordSUL; import de.learnlib.ralib.sul.SULOracle; import de.learnlib.ralib.sul.SimulatorSUL; @@ -98,7 +98,7 @@ public void learnMixedIO() { DataWordSUL sul = new SimulatorSUL(model, teachers, consts); - JConstraintsConstraintSolver jsolv = TestUtil.getZ3Solver(); + ConstraintSolver jsolv = TestUtil.getZ3Solver(); IOOracle ioOracle = new SULOracle(sul, ERROR); MultiTheoryTreeOracle mto = TestUtil.createMTO( diff --git a/src/test/java/de/learnlib/ralib/learning/ralambda/LearnPQIOTest.java b/src/test/java/de/learnlib/ralib/learning/ralambda/LearnPQIOTest.java index 278a43d6..65c6d4df 100644 --- a/src/test/java/de/learnlib/ralib/learning/ralambda/LearnPQIOTest.java +++ b/src/test/java/de/learnlib/ralib/learning/ralambda/LearnPQIOTest.java @@ -23,6 +23,7 @@ import java.util.Random; import java.util.logging.Level; +import de.learnlib.ralib.smt.ConstraintSolver; import org.testng.Assert; import org.testng.annotations.Test; @@ -45,7 +46,6 @@ import de.learnlib.ralib.oracles.io.IOOracle; import de.learnlib.ralib.oracles.mto.MultiTheorySDTLogicOracle; import de.learnlib.ralib.oracles.mto.MultiTheoryTreeOracle; -import de.learnlib.ralib.smt.jconstraints.JConstraintsConstraintSolver; import de.learnlib.ralib.sul.SULOracle; import de.learnlib.ralib.theory.Theory; import de.learnlib.ralib.tools.theories.DoubleInequalityTheory; @@ -103,7 +103,7 @@ private Hypothesis learnPQ(long seed, Map teachers, Constants logger.log(Level.FINE, "SEED={0}", seed); final Random random = new Random(seed); - JConstraintsConstraintSolver jsolv = TestUtil.getZ3Solver(); + ConstraintSolver jsolv = TestUtil.getZ3Solver(); IOOracle ioOracle = new SULOracle(sul, PriorityQueueSUL.ERROR); MultiTheoryTreeOracle mto = TestUtil.createMTO( diff --git a/src/test/java/de/learnlib/ralib/learning/ralambda/LearnPQTest.java b/src/test/java/de/learnlib/ralib/learning/ralambda/LearnPQTest.java index 0a6faf89..cdf532c7 100644 --- a/src/test/java/de/learnlib/ralib/learning/ralambda/LearnPQTest.java +++ b/src/test/java/de/learnlib/ralib/learning/ralambda/LearnPQTest.java @@ -28,6 +28,7 @@ import java.util.Map; import java.util.logging.Level; +import de.learnlib.ralib.smt.ConstraintSolver; import org.testng.Assert; import org.testng.annotations.Test; @@ -47,7 +48,6 @@ import de.learnlib.ralib.oracles.TreeOracleFactory; import de.learnlib.ralib.oracles.mto.MultiTheorySDTLogicOracle; import de.learnlib.ralib.oracles.mto.MultiTheoryTreeOracle; -import de.learnlib.ralib.smt.jconstraints.JConstraintsConstraintSolver; import de.learnlib.ralib.theory.Theory; import de.learnlib.ralib.tools.theories.DoubleInequalityTheory; import de.learnlib.ralib.words.PSymbolInstance; @@ -70,7 +70,7 @@ public void learnPQ() { final Map teachers = new LinkedHashMap<>(); teachers.put(doubleType, new DoubleInequalityTheory(doubleType)); - JConstraintsConstraintSolver jsolv = TestUtil.getZ3Solver(); + ConstraintSolver jsolv = TestUtil.getZ3Solver(); MultiTheoryTreeOracle mto = new MultiTheoryTreeOracle( dwOracle, teachers, new Constants(), jsolv); @@ -132,7 +132,7 @@ public void learnPQRandom() { final Map teachers = new LinkedHashMap<>(); teachers.put(doubleType, new DoubleInequalityTheory(doubleType)); - JConstraintsConstraintSolver jsolv = TestUtil.getZ3Solver(); + ConstraintSolver jsolv = TestUtil.getZ3Solver(); RaLibLearningExperimentRunner runner = new RaLibLearningExperimentRunner(logger); runner.setMaxDepth(4); diff --git a/src/test/java/de/learnlib/ralib/learning/ralambda/LearnPadlock.java b/src/test/java/de/learnlib/ralib/learning/ralambda/LearnPadlock.java index 7b44e5a9..70160557 100644 --- a/src/test/java/de/learnlib/ralib/learning/ralambda/LearnPadlock.java +++ b/src/test/java/de/learnlib/ralib/learning/ralambda/LearnPadlock.java @@ -5,7 +5,6 @@ import java.util.Map; import java.util.logging.Level; -import de.learnlib.ralib.smt.ConstraintSolverFactory; import gov.nasa.jpf.constraints.api.Expression; import gov.nasa.jpf.constraints.expressions.NumericBooleanExpression; import gov.nasa.jpf.constraints.expressions.NumericComparator; @@ -108,7 +107,7 @@ public void learnPadlock() { final Map teachers = new LinkedHashMap<>(); teachers.put(DIGIT, new IntegerEqualityTheory(DIGIT)); - ConstraintSolver solver = ConstraintSolverFactory.createZ3ConstraintSolver(); + ConstraintSolver solver = new ConstraintSolver(); MultiTheoryTreeOracle mto = new MultiTheoryTreeOracle( dwOracle, teachers, new Constants(), solver); diff --git a/src/test/java/de/learnlib/ralib/learning/ralambda/LearnPalindromeIOTest.java b/src/test/java/de/learnlib/ralib/learning/ralambda/LearnPalindromeIOTest.java index b177e20d..ec80882c 100644 --- a/src/test/java/de/learnlib/ralib/learning/ralambda/LearnPalindromeIOTest.java +++ b/src/test/java/de/learnlib/ralib/learning/ralambda/LearnPalindromeIOTest.java @@ -4,7 +4,6 @@ import java.util.Map; import java.util.logging.Level; -import de.learnlib.ralib.smt.ConstraintSolverFactory; import org.testng.Assert; import org.testng.annotations.Test; @@ -60,7 +59,7 @@ public void learnPalindromeIO() { teachers.put(t, theory); }); - ConstraintSolver solver = ConstraintSolverFactory.createZ3ConstraintSolver(); + ConstraintSolver solver = new ConstraintSolver(); DataWordSUL sul = new SimulatorSUL(model, teachers, consts); IOOracle ioOracle = new SULOracle(sul, ERROR); diff --git a/src/test/java/de/learnlib/ralib/learning/ralambda/LearnRepeaterTest.java b/src/test/java/de/learnlib/ralib/learning/ralambda/LearnRepeaterTest.java index 402f10b7..f8c7a977 100644 --- a/src/test/java/de/learnlib/ralib/learning/ralambda/LearnRepeaterTest.java +++ b/src/test/java/de/learnlib/ralib/learning/ralambda/LearnRepeaterTest.java @@ -8,7 +8,6 @@ import java.util.LinkedHashMap; import java.util.Map; -import de.learnlib.ralib.smt.ConstraintSolverFactory; import org.testng.Assert; import org.testng.annotations.Test; @@ -53,7 +52,7 @@ public void learnRepeaterTest() { IOCache ioCache = new IOCache(ioOracle); IOFilter oracle = new IOFilter(ioCache, sul.getInputSymbols()); - ConstraintSolver solver = ConstraintSolverFactory.createZ3ConstraintSolver(); + ConstraintSolver solver = new ConstraintSolver(); MultiTheoryTreeOracle mto = new MultiTheoryTreeOracle(oracle, teachers, consts, solver); diff --git a/src/test/java/de/learnlib/ralib/learning/ralambda/LearnSipIOTest.java b/src/test/java/de/learnlib/ralib/learning/ralambda/LearnSipIOTest.java index cde9f36d..cd7e2e95 100644 --- a/src/test/java/de/learnlib/ralib/learning/ralambda/LearnSipIOTest.java +++ b/src/test/java/de/learnlib/ralib/learning/ralambda/LearnSipIOTest.java @@ -5,7 +5,6 @@ import java.util.Random; import java.util.logging.Level; -import de.learnlib.ralib.smt.ConstraintSolverFactory; import org.testng.Assert; import org.testng.annotations.Test; @@ -80,7 +79,7 @@ public void learnSipIO() { ((EqualityTheory)t).setFreshValues(true, ioCache); }); - ConstraintSolver solver = ConstraintSolverFactory.createZ3ConstraintSolver(); + ConstraintSolver solver = new ConstraintSolver(); MultiTheoryTreeOracle mto = new MultiTheoryTreeOracle( ioFilter, teachers, consts, solver); diff --git a/src/test/java/de/learnlib/ralib/learning/ralambda/LearnStackTest.java b/src/test/java/de/learnlib/ralib/learning/ralambda/LearnStackTest.java index 9508e686..285c6503 100644 --- a/src/test/java/de/learnlib/ralib/learning/ralambda/LearnStackTest.java +++ b/src/test/java/de/learnlib/ralib/learning/ralambda/LearnStackTest.java @@ -16,7 +16,6 @@ import com.google.common.collect.ImmutableSet; -import de.learnlib.ralib.smt.ConstraintSolverFactory; import org.testng.Assert; import org.testng.annotations.Test; @@ -57,7 +56,7 @@ public void learnStackTest() { final Map teachers = new LinkedHashMap<>(); teachers.put(T_INT, new IntegerEqualityTheory(T_INT)); - ConstraintSolver solver = ConstraintSolverFactory.createZ3ConstraintSolver(); + ConstraintSolver solver = new ConstraintSolver(); Measurements mes = new Measurements(); @@ -111,7 +110,7 @@ public void learnStackSwitchedCETest() { final Map teachers = new LinkedHashMap<>(); teachers.put(T_INT, new IntegerEqualityTheory(T_INT)); - ConstraintSolver solver = ConstraintSolverFactory.createZ3ConstraintSolver(); + ConstraintSolver solver = new ConstraintSolver(); MultiTheoryTreeOracle mto = new MultiTheoryTreeOracle( dwOracle, teachers, new Constants(), solver); @@ -184,7 +183,7 @@ public void learnStackLongCETest() { final Map teachers = new LinkedHashMap<>(); teachers.put(T_INT, new IntegerEqualityTheory(T_INT)); - ConstraintSolver solver = ConstraintSolverFactory.createZ3ConstraintSolver(); + ConstraintSolver solver = new ConstraintSolver(); MultiTheoryTreeOracle mto = new MultiTheoryTreeOracle( dwOracle, teachers, new Constants(), solver); @@ -226,7 +225,7 @@ public void learnStackRandomTest() { Constants consts = new Constants(); RegisterAutomaton sul = AUTOMATON; DataWordOracle dwOracle = new SimulatorOracle(sul); - ConstraintSolver solver =ConstraintSolverFactory.createZ3ConstraintSolver(); + ConstraintSolver solver =new ConstraintSolver(); final Map teachers = new LinkedHashMap<>(); IntegerEqualityTheory theory = new IntegerEqualityTheory(T_INT); diff --git a/src/test/java/de/learnlib/ralib/learning/ralambda/TestDistinguishingSuffixOptimization.java b/src/test/java/de/learnlib/ralib/learning/ralambda/TestDistinguishingSuffixOptimization.java index bf71b38c..24d2553c 100644 --- a/src/test/java/de/learnlib/ralib/learning/ralambda/TestDistinguishingSuffixOptimization.java +++ b/src/test/java/de/learnlib/ralib/learning/ralambda/TestDistinguishingSuffixOptimization.java @@ -4,7 +4,6 @@ import java.util.Map; import java.util.Set; -import de.learnlib.ralib.smt.ConstraintSolverFactory; import gov.nasa.jpf.constraints.api.Expression; import gov.nasa.jpf.constraints.util.ExpressionUtil; import org.testng.Assert; @@ -82,7 +81,7 @@ public void testDistinguishingSuffixOptimization() { final Map teachers = new LinkedHashMap<>(); - ConstraintSolver solver = ConstraintSolverFactory.createZ3ConstraintSolver(); + ConstraintSolver solver = new ConstraintSolver(); MultiTheoryTreeOracle mto = new MultiTheoryTreeOracle(dwOracle, teachers, new Constants(), solver); diff --git a/src/test/java/de/learnlib/ralib/learning/ralambda/TestOutputSuffixes.java b/src/test/java/de/learnlib/ralib/learning/ralambda/TestOutputSuffixes.java index e3f87c82..3393866c 100644 --- a/src/test/java/de/learnlib/ralib/learning/ralambda/TestOutputSuffixes.java +++ b/src/test/java/de/learnlib/ralib/learning/ralambda/TestOutputSuffixes.java @@ -8,7 +8,6 @@ import com.google.common.collect.Sets; -import de.learnlib.ralib.smt.ConstraintSolverFactory; import org.testng.Assert; import org.testng.annotations.Test; @@ -69,7 +68,7 @@ public void testSIPOutputSuffixesPresent() { IOCache ioCache = new IOCache(ioOracle); IOFilter ioFilter = new IOFilter(ioCache, inputs); - ConstraintSolver solver = ConstraintSolverFactory.createZ3ConstraintSolver(); + ConstraintSolver solver = new ConstraintSolver(); MultiTheoryTreeOracle mto = new MultiTheoryTreeOracle( ioFilter, teachers, consts, solver); diff --git a/src/test/java/de/learnlib/ralib/learning/ralambda/TestQueryCount.java b/src/test/java/de/learnlib/ralib/learning/ralambda/TestQueryCount.java index f483a043..c4117d7e 100644 --- a/src/test/java/de/learnlib/ralib/learning/ralambda/TestQueryCount.java +++ b/src/test/java/de/learnlib/ralib/learning/ralambda/TestQueryCount.java @@ -4,6 +4,7 @@ import java.util.LinkedHashMap; import java.util.Map; +import de.learnlib.ralib.smt.ConstraintSolver; import org.testng.Assert; import org.testng.annotations.Test; @@ -23,7 +24,6 @@ import de.learnlib.ralib.oracles.io.IOOracle; import de.learnlib.ralib.oracles.mto.MultiTheorySDTLogicOracle; import de.learnlib.ralib.oracles.mto.MultiTheoryTreeOracle; -import de.learnlib.ralib.smt.jconstraints.JConstraintsConstraintSolver; import de.learnlib.ralib.sul.SULOracle; import de.learnlib.ralib.theory.Theory; import de.learnlib.ralib.tools.theories.DoubleInequalityTheory; @@ -43,7 +43,7 @@ public void testQueryCount() { PriorityQueueSUL sul = new PriorityQueueSUL(2); - JConstraintsConstraintSolver jsolv = TestUtil.getZ3Solver(); + ConstraintSolver jsolv = TestUtil.getZ3Solver(); IOOracle ioOracle = new SULOracle(sul, PriorityQueueSUL.ERROR); Measurements measurements = new Measurements(); diff --git a/src/test/java/de/learnlib/ralib/learning/ralambda/TestSuffixOptimization.java b/src/test/java/de/learnlib/ralib/learning/ralambda/TestSuffixOptimization.java index 3cdcde2e..079669ea 100644 --- a/src/test/java/de/learnlib/ralib/learning/ralambda/TestSuffixOptimization.java +++ b/src/test/java/de/learnlib/ralib/learning/ralambda/TestSuffixOptimization.java @@ -8,7 +8,6 @@ import java.util.LinkedHashMap; import java.util.Map; -import de.learnlib.ralib.smt.ConstraintSolverFactory; import org.testng.Assert; import org.testng.annotations.Test; @@ -53,7 +52,7 @@ public void learnRepeaterSuffixOptTest() { IOCache ioCache = new IOCache(ioOracle); IOFilter oracle = new IOFilter(ioCache, sul.getInputSymbols()); - ConstraintSolver solver = ConstraintSolverFactory.createZ3ConstraintSolver(); + ConstraintSolver solver = new ConstraintSolver(); MultiTheoryTreeOracle mto = new MultiTheoryTreeOracle(oracle, teachers, consts, solver); diff --git a/src/test/java/de/learnlib/ralib/learning/ralambda/TestSymmetry.java b/src/test/java/de/learnlib/ralib/learning/ralambda/TestSymmetry.java index 0d153768..4324887a 100644 --- a/src/test/java/de/learnlib/ralib/learning/ralambda/TestSymmetry.java +++ b/src/test/java/de/learnlib/ralib/learning/ralambda/TestSymmetry.java @@ -4,7 +4,6 @@ import java.util.LinkedHashMap; import java.util.Map; -import de.learnlib.ralib.smt.ConstraintSolverFactory; import gov.nasa.jpf.constraints.api.Expression; import gov.nasa.jpf.constraints.expressions.NumericBooleanExpression; import gov.nasa.jpf.constraints.expressions.NumericComparator; @@ -56,7 +55,7 @@ public void learnSymmetryExampleCT2() { final Map teachers = new LinkedHashMap<>(); teachers.put(T_INT, new IntegerEqualityTheory(T_INT)); - ConstraintSolver solver = ConstraintSolverFactory.createZ3ConstraintSolver(); + ConstraintSolver solver = new ConstraintSolver(); MultiTheoryTreeOracle mto = new MultiTheoryTreeOracle(dwOracle, teachers, new Constants(), solver); @@ -192,7 +191,7 @@ public void learnSymmetryExampleCT() { final Map teachers = new LinkedHashMap<>(); teachers.put(T_INT, new IntegerEqualityTheory(T_INT)); - ConstraintSolver solver = ConstraintSolverFactory.createZ3ConstraintSolver(); + ConstraintSolver solver = new ConstraintSolver(); MultiTheoryTreeOracle mto = new MultiTheoryTreeOracle(dwOracle, teachers, new Constants(), solver); diff --git a/src/test/java/de/learnlib/ralib/learning/ralambda/TestUnknownMemorable.java b/src/test/java/de/learnlib/ralib/learning/ralambda/TestUnknownMemorable.java index d2128c4e..b55a99a4 100644 --- a/src/test/java/de/learnlib/ralib/learning/ralambda/TestUnknownMemorable.java +++ b/src/test/java/de/learnlib/ralib/learning/ralambda/TestUnknownMemorable.java @@ -11,7 +11,6 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; -import de.learnlib.ralib.smt.ConstraintSolverFactory; import gov.nasa.jpf.constraints.api.Expression; import gov.nasa.jpf.constraints.expressions.NumericBooleanExpression; import gov.nasa.jpf.constraints.expressions.NumericComparator; @@ -189,7 +188,7 @@ public void testUnknownMemorable() { final Map teachers = new LinkedHashMap<>(); teachers.put(T_INT, new IntegerEqualityTheory(T_INT)); - ConstraintSolver solver = ConstraintSolverFactory.createZ3ConstraintSolver(); + ConstraintSolver solver = new ConstraintSolver(); DataWordSUL sul = new SimulatorSUL(ra, teachers, consts); final ParameterizedSymbol ERROR = new OutputSymbol("_io_err", new DataType[]{}); @@ -267,7 +266,7 @@ public void testSkippingMemorable() { IOCache ioCache = new IOCache(ioOracle); IOFilter ioFilter = new IOFilter(ioCache, inputs); - ConstraintSolver solver = ConstraintSolverFactory.createZ3ConstraintSolver(); + ConstraintSolver solver = new ConstraintSolver(); MultiTheoryTreeOracle mto = new MultiTheoryTreeOracle( ioFilter, teachers, consts, solver); @@ -327,7 +326,7 @@ public void testSkippingMemorable2() { IOCache ioCache = new IOCache(ioOracle); IOFilter ioFilter = new IOFilter(ioCache, inputs); - ConstraintSolver solver = ConstraintSolverFactory.createZ3ConstraintSolver(); + ConstraintSolver solver = new ConstraintSolver(); MultiTheoryTreeOracle mto = new MultiTheoryTreeOracle( ioFilter, teachers, consts, solver); diff --git a/src/test/java/de/learnlib/ralib/learning/rastar/LearnBoundedListTest.java b/src/test/java/de/learnlib/ralib/learning/rastar/LearnBoundedListTest.java index baa0df06..65b67283 100644 --- a/src/test/java/de/learnlib/ralib/learning/rastar/LearnBoundedListTest.java +++ b/src/test/java/de/learnlib/ralib/learning/rastar/LearnBoundedListTest.java @@ -29,7 +29,6 @@ import de.learnlib.ralib.oracles.mto.MultiTheorySDTLogicOracle; import de.learnlib.ralib.oracles.mto.MultiTheoryTreeOracle; import de.learnlib.ralib.smt.ConstraintSolver; -import de.learnlib.ralib.smt.ConstraintSolverFactory; import de.learnlib.ralib.theory.Theory; import de.learnlib.ralib.tools.theories.IntegerEqualityTheory; import de.learnlib.ralib.words.PSymbolInstance; @@ -70,7 +69,7 @@ private Hypothesis learnBoundedListDWOracle(int size, boolean useNull, Word { ((EqualityTheory)t).setFreshValues(true, ioCache); diff --git a/src/test/java/de/learnlib/ralib/oracles/mto/InstantiateSymbolicWordTest.java b/src/test/java/de/learnlib/ralib/oracles/mto/InstantiateSymbolicWordTest.java index b36d8a7e..98752581 100644 --- a/src/test/java/de/learnlib/ralib/oracles/mto/InstantiateSymbolicWordTest.java +++ b/src/test/java/de/learnlib/ralib/oracles/mto/InstantiateSymbolicWordTest.java @@ -9,7 +9,6 @@ import java.util.LinkedHashMap; import java.util.Map; -import de.learnlib.ralib.smt.ConstraintSolverFactory; import gov.nasa.jpf.constraints.api.Expression; import gov.nasa.jpf.constraints.expressions.NumericBooleanExpression; import gov.nasa.jpf.constraints.expressions.NumericComparator; @@ -51,7 +50,7 @@ public void testInstantiateStack() { final Map teachers = new LinkedHashMap<>(); teachers.put(T_INT, new IntegerEqualityTheory(T_INT)); - ConstraintSolver solver = ConstraintSolverFactory.createZ3ConstraintSolver(); + ConstraintSolver solver = new ConstraintSolver(); MultiTheoryTreeOracle mto = new MultiTheoryTreeOracle( dwOracle, teachers, new Constants(), solver); @@ -142,7 +141,7 @@ public void testInstantiateWithSuffixOpt() { DataWordOracle dwOracle = new SimulatorOracle(ra); MultiTheoryTreeOracle mto = new MultiTheoryTreeOracle( - dwOracle, teachers, new Constants(), ConstraintSolverFactory.createZ3ConstraintSolver()); + dwOracle, teachers, new Constants(), new ConstraintSolver()); Word prefix = Word.fromSymbols( new PSymbolInstance(A, new DataValue(T_INT, BigDecimal.ZERO)), diff --git a/src/test/java/de/learnlib/ralib/oracles/mto/LoginBranchingTest.java b/src/test/java/de/learnlib/ralib/oracles/mto/LoginBranchingTest.java index 309c533f..0ef8a655 100644 --- a/src/test/java/de/learnlib/ralib/oracles/mto/LoginBranchingTest.java +++ b/src/test/java/de/learnlib/ralib/oracles/mto/LoginBranchingTest.java @@ -28,7 +28,6 @@ import java.util.Map; import java.util.logging.Level; -import de.learnlib.ralib.smt.ConstraintSolverFactory; import org.testng.Assert; import org.testng.annotations.Test; @@ -80,7 +79,7 @@ public void testBranching() { }); DataWordSUL sul = new SimulatorSUL(model, teachers, consts); - MultiTheoryTreeOracle mto = TestUtil.createMTO(sul, ERROR, teachers, consts, ConstraintSolverFactory.createZ3ConstraintSolver(), + MultiTheoryTreeOracle mto = TestUtil.createMTO(sul, ERROR, teachers, consts, new ConstraintSolver(), inputs); DataType uid = TestUtil.getType("uid", loader.getDataTypes()); @@ -145,7 +144,7 @@ public void testUpdateRefinedBranching() { teachers.put(T_UID, new IntegerEqualityTheory(T_UID)); teachers.put(T_PWD, new IntegerEqualityTheory(T_PWD)); - ConstraintSolver solver = ConstraintSolverFactory.createZ3ConstraintSolver(); + ConstraintSolver solver = new ConstraintSolver(); MultiTheoryTreeOracle mto = new MultiTheoryTreeOracle(dwOracle, teachers, new Constants(), solver); Word prefix = Word @@ -181,7 +180,7 @@ public void testInitialBranchingWithSDTs() { teachers.put(T_UID, new IntegerEqualityTheory(T_UID)); teachers.put(T_PWD, new IntegerEqualityTheory(T_PWD)); - ConstraintSolver solver = ConstraintSolverFactory.createZ3ConstraintSolver(); + ConstraintSolver solver = new ConstraintSolver(); MultiTheoryTreeOracle mto = new MultiTheoryTreeOracle(dwOracle, teachers, new Constants(), solver); Word prefix = Word @@ -213,7 +212,7 @@ public void testUpdateBranchingNoSDTsMeansNoUpdate() { teachers.put(T_UID, new IntegerEqualityTheory(T_UID)); teachers.put(T_PWD, new IntegerEqualityTheory(T_PWD)); - ConstraintSolver solver = ConstraintSolverFactory.createZ3ConstraintSolver(); + ConstraintSolver solver = new ConstraintSolver(); MultiTheoryTreeOracle mto = new MultiTheoryTreeOracle(dwOracle, teachers, new Constants(), solver); Word prefix = Word diff --git a/src/test/java/de/learnlib/ralib/oracles/mto/MultiSDTBranchingTest.java b/src/test/java/de/learnlib/ralib/oracles/mto/MultiSDTBranchingTest.java index 5f2cb40a..5cf72493 100644 --- a/src/test/java/de/learnlib/ralib/oracles/mto/MultiSDTBranchingTest.java +++ b/src/test/java/de/learnlib/ralib/oracles/mto/MultiSDTBranchingTest.java @@ -22,7 +22,7 @@ import java.util.Map; import java.util.logging.Level; -import de.learnlib.ralib.smt.ConstraintSolverFactory; +import de.learnlib.ralib.smt.ConstraintSolver; import org.testng.Assert; import org.testng.annotations.Test; @@ -73,7 +73,7 @@ public void testModelswithOutput() { DataWordSUL sul = new SimulatorSUL(model, teachers, consts); MultiTheoryTreeOracle mto = TestUtil.createMTO(sul, ERROR, - teachers, consts, ConstraintSolverFactory.createZ3ConstraintSolver(), inputs); + teachers, consts, new ConstraintSolver(), inputs); DataType intType = TestUtil.getType("int", loader.getDataTypes()); diff --git a/src/test/java/de/learnlib/ralib/oracles/mto/MultiTheorySDTLogicOracleTest.java b/src/test/java/de/learnlib/ralib/oracles/mto/MultiTheorySDTLogicOracleTest.java index eeb0c08c..68e275ab 100644 --- a/src/test/java/de/learnlib/ralib/oracles/mto/MultiTheorySDTLogicOracleTest.java +++ b/src/test/java/de/learnlib/ralib/oracles/mto/MultiTheorySDTLogicOracleTest.java @@ -13,7 +13,6 @@ import java.util.List; import java.util.Map; -import de.learnlib.ralib.smt.ConstraintSolverFactory; import org.testng.Assert; import org.testng.annotations.Test; @@ -44,7 +43,7 @@ public void acceptsTest() { teachers.put(T_UID, new IntegerEqualityTheory(T_UID)); teachers.put(T_PWD, new IntegerEqualityTheory(T_PWD)); - ConstraintSolver solver = ConstraintSolverFactory.createZ3ConstraintSolver(); + ConstraintSolver solver = new ConstraintSolver(); SDTLogicOracle slo = new MultiTheorySDTLogicOracle(consts, solver); diff --git a/src/test/java/de/learnlib/ralib/oracles/mto/MultipleSpecialCasesTest.java b/src/test/java/de/learnlib/ralib/oracles/mto/MultipleSpecialCasesTest.java index 6d490c56..673f5f6d 100644 --- a/src/test/java/de/learnlib/ralib/oracles/mto/MultipleSpecialCasesTest.java +++ b/src/test/java/de/learnlib/ralib/oracles/mto/MultipleSpecialCasesTest.java @@ -20,7 +20,7 @@ import java.util.Map; import java.util.logging.Level; -import de.learnlib.ralib.smt.ConstraintSolverFactory; +import de.learnlib.ralib.smt.ConstraintSolver; import org.testng.Assert; import org.testng.annotations.Test; @@ -70,7 +70,7 @@ public void testModelswithOutput() { DataWordSUL sul = new SimulatorSUL(model, teachers, consts); MultiTheoryTreeOracle mto = TestUtil.createMTO(sul, ERROR, - teachers, consts, ConstraintSolverFactory.createZ3ConstraintSolver(), inputs); + teachers, consts, new ConstraintSolver(), inputs); DataType intType = TestUtil.getType("int", loader.getDataTypes()); diff --git a/src/test/java/de/learnlib/ralib/oracles/mto/NonFreeSuffixValuesTest.java b/src/test/java/de/learnlib/ralib/oracles/mto/NonFreeSuffixValuesTest.java index 643d076d..f5394f88 100644 --- a/src/test/java/de/learnlib/ralib/oracles/mto/NonFreeSuffixValuesTest.java +++ b/src/test/java/de/learnlib/ralib/oracles/mto/NonFreeSuffixValuesTest.java @@ -25,7 +25,6 @@ import java.util.Map; import java.util.logging.Level; -import de.learnlib.ralib.smt.ConstraintSolverFactory; import org.testng.Assert; import org.testng.annotations.Test; @@ -86,7 +85,7 @@ public void testModelswithOutputFifo() { DataWordSUL sul = new SimulatorSUL(model, teachers, consts); MultiTheoryTreeOracle mto = TestUtil.createMTO(sul, ERROR, - teachers, consts, ConstraintSolverFactory.createZ3ConstraintSolver(), inputs); + teachers, consts, new ConstraintSolver(), inputs); DataType intType = TestUtil.getType("int", loader.getDataTypes()); @@ -178,7 +177,7 @@ public void testModelswithOutputPalindrome() { DataWordSUL sul = new SimulatorSUL(model, teachers, consts); MultiTheoryTreeOracle mto = TestUtil.createMTO(sul, ERROR, - teachers, consts, ConstraintSolverFactory.createZ3ConstraintSolver(), inputs); + teachers, consts, new ConstraintSolver(), inputs); DataType intType = TestUtil.getType("int", loader.getDataTypes()); @@ -242,7 +241,7 @@ public void testNonFreeNonFresh() { IOCache ioCache = new IOCache(ioOracle); IOFilter oracle = new IOFilter(ioCache, sul.getInputSymbols()); - ConstraintSolver solver = ConstraintSolverFactory.createZ3ConstraintSolver(); + ConstraintSolver solver = new ConstraintSolver(); MultiTheoryTreeOracle mto = new MultiTheoryTreeOracle( oracle, teachers, consts, solver); diff --git a/src/test/java/de/learnlib/ralib/oracles/mto/OptimizedSymbolicSuffixBuilderTest.java b/src/test/java/de/learnlib/ralib/oracles/mto/OptimizedSymbolicSuffixBuilderTest.java index d9ca2382..575a03f4 100644 --- a/src/test/java/de/learnlib/ralib/oracles/mto/OptimizedSymbolicSuffixBuilderTest.java +++ b/src/test/java/de/learnlib/ralib/oracles/mto/OptimizedSymbolicSuffixBuilderTest.java @@ -35,7 +35,6 @@ import de.learnlib.ralib.learning.SymbolicSuffix; import de.learnlib.ralib.oracles.TreeQueryResult; import de.learnlib.ralib.smt.ConstraintSolver; -import de.learnlib.ralib.smt.ConstraintSolverFactory; import de.learnlib.ralib.theory.FreshSuffixValue; import de.learnlib.ralib.theory.SDTAndGuard; import de.learnlib.ralib.theory.SDTGuard; @@ -61,7 +60,7 @@ public void extendDistinguishingSuffixTest() { final Map teachers = new LinkedHashMap<>(); IntegerEqualityTheory dit = new IntegerEqualityTheory(INT_TYPE); teachers.put(INT_TYPE, dit); - ConstraintSolver solver = ConstraintSolverFactory.createZ3ConstraintSolver(); + ConstraintSolver solver = new ConstraintSolver(); MultiTheoryTreeOracle mto = new MultiTheoryTreeOracle(dwOracle, teachers, new Constants(), solver); Constants consts = new Constants(); @@ -373,7 +372,7 @@ public void extendSuffixTest() { OptimizedSymbolicSuffixBuilder builder1 = new OptimizedSymbolicSuffixBuilder(consts1, restrictionBuilder1); OptimizedSymbolicSuffixBuilder builder2 = new OptimizedSymbolicSuffixBuilder(consts2, restrictionBuilder2); - ConstraintSolver solver = ConstraintSolverFactory.createZ3ConstraintSolver(); + ConstraintSolver solver = new ConstraintSolver(); SymbolicSuffix expected1 = new SymbolicSuffix(word1.prefix(1), word1.suffix(4), restrictionBuilder1); SymbolicSuffix actual1 = builder1.extendSuffix(word1.prefix(2), sdtPath1, piv1, suffix1.getActions()); @@ -447,7 +446,7 @@ public void buildOptimizedSuffixTest() { OptimizedSymbolicSuffixBuilder builder = new OptimizedSymbolicSuffixBuilder(consts); SymbolicSuffix suffix12 = builder.distinguishingSuffixFromSDTs(prefix1, sdt1, piv1, prefix2, sdt2, piv2, Word.fromSymbols(a, a, a), - ConstraintSolverFactory.createZ3ConstraintSolver()); + new ConstraintSolver()); Map expectedRestr12 = new LinkedHashMap<>(); expectedRestr12.put(s1, new FreshSuffixValue(s1)); expectedRestr12.put(s2, new EqualRestriction(s2, s1)); @@ -486,7 +485,7 @@ public void buildOptimizedSuffixTest() { piv4.put(p2, r2); SymbolicSuffix suffix34 = builder.distinguishingSuffixFromSDTs(prefix3, sdt3, piv3, prefix4, sdt4, piv4, Word.fromSymbols(a, a, a), - ConstraintSolverFactory.createZ3ConstraintSolver()); + new ConstraintSolver()); Map expectedRestr34 = new LinkedHashMap<>(); expectedRestr34.put(s1, new FreshSuffixValue(s1)); expectedRestr34.put(s2, new UnrestrictedSuffixValue(s2)); diff --git a/src/test/java/de/learnlib/ralib/oracles/mto/SIPSDTMergingTest.java b/src/test/java/de/learnlib/ralib/oracles/mto/SIPSDTMergingTest.java index c4a1b4da..770071b6 100644 --- a/src/test/java/de/learnlib/ralib/oracles/mto/SIPSDTMergingTest.java +++ b/src/test/java/de/learnlib/ralib/oracles/mto/SIPSDTMergingTest.java @@ -21,7 +21,7 @@ import java.util.Map; import java.util.logging.Level; -import de.learnlib.ralib.smt.ConstraintSolverFactory; +import de.learnlib.ralib.smt.ConstraintSolver; import org.testng.Assert; import org.testng.annotations.Test; @@ -72,7 +72,7 @@ public void testModelswithOutput() { DataWordSUL sul = new SimulatorSUL(model, teachers, consts); MultiTheoryTreeOracle mto = TestUtil.createMTO(sul, ERROR, - teachers, consts, ConstraintSolverFactory.createZ3ConstraintSolver(), inputs); + teachers, consts, new ConstraintSolver(), inputs); DataType intType = TestUtil.getType("int", loader.getDataTypes()); diff --git a/src/test/java/de/learnlib/ralib/oracles/mto/SecondSDTBranchingTest.java b/src/test/java/de/learnlib/ralib/oracles/mto/SecondSDTBranchingTest.java index 6a3a383f..c9131ffa 100644 --- a/src/test/java/de/learnlib/ralib/oracles/mto/SecondSDTBranchingTest.java +++ b/src/test/java/de/learnlib/ralib/oracles/mto/SecondSDTBranchingTest.java @@ -22,7 +22,7 @@ import java.util.Map; import java.util.logging.Level; -import de.learnlib.ralib.smt.ConstraintSolverFactory; +import de.learnlib.ralib.smt.ConstraintSolver; import org.testng.Assert; import org.testng.annotations.Test; @@ -79,7 +79,7 @@ public void testModelswithOutput() { DataWordSUL sul = new SimulatorSUL(model, teachers, consts); MultiTheoryTreeOracle mto = TestUtil.createMTO(sul, ERROR, - teachers, consts, ConstraintSolverFactory.createZ3ConstraintSolver(), inputs); + teachers, consts, new ConstraintSolver(), inputs); DataType intType = TestUtil.getType("int", loader.getDataTypes()); diff --git a/src/test/java/de/learnlib/ralib/oracles/mto/UntypedBranchingTest.java b/src/test/java/de/learnlib/ralib/oracles/mto/UntypedBranchingTest.java index 1a736aed..fde7cd59 100644 --- a/src/test/java/de/learnlib/ralib/oracles/mto/UntypedBranchingTest.java +++ b/src/test/java/de/learnlib/ralib/oracles/mto/UntypedBranchingTest.java @@ -40,7 +40,7 @@ import java.util.Map; import java.util.logging.Level; -import de.learnlib.ralib.smt.ConstraintSolverFactory; +import de.learnlib.ralib.smt.ConstraintSolver; import org.testng.Assert; import org.testng.annotations.Test; @@ -101,7 +101,7 @@ public void testBranching() { DataWordSUL sul = new SimulatorSUL(model, teachers, consts); MultiTheoryTreeOracle mto = TestUtil.createMTO(sul, ERROR, - teachers, consts, ConstraintSolverFactory.createZ3ConstraintSolver(), inputs); + teachers, consts, new ConstraintSolver(), inputs); DataType intType = TestUtil.getType("int", loader.getDataTypes()); diff --git a/src/test/java/de/learnlib/ralib/theory/EquivalenceClassCoverageTest.java b/src/test/java/de/learnlib/ralib/theory/EquivalenceClassCoverageTest.java index d4b673d9..10f0ccb3 100644 --- a/src/test/java/de/learnlib/ralib/theory/EquivalenceClassCoverageTest.java +++ b/src/test/java/de/learnlib/ralib/theory/EquivalenceClassCoverageTest.java @@ -1,14 +1,11 @@ package de.learnlib.ralib.theory; -import static de.learnlib.ralib.smt.jconstraints.JContraintsUtil.toVariable; - import java.math.BigDecimal; import java.util.ArrayList; import java.util.Collection; import java.util.LinkedHashMap; import java.util.Map; -import de.learnlib.ralib.smt.ConstraintSolverFactory; import org.testng.Assert; import org.testng.annotations.Test; @@ -22,7 +19,6 @@ import de.learnlib.ralib.learning.SymbolicSuffix; import de.learnlib.ralib.oracles.mto.MultiTheoryTreeOracle; import de.learnlib.ralib.smt.ConstraintSolver; -import de.learnlib.ralib.smt.jconstraints.JConstraintsConstraintSolver; import de.learnlib.ralib.theory.inequality.IntervalGuard; import de.learnlib.ralib.tools.theories.DoubleInequalityTheory; @@ -44,7 +40,7 @@ public void testEqualityTheory() { dit.setUseSuffixOpt(false); teachers.put(type, dit); - ConstraintSolver solver = ConstraintSolverFactory.createZ3ConstraintSolver(); + ConstraintSolver solver = new ConstraintSolver(); EqCRecordingOracle oracle = new EqCRecordingOracle(); MultiTheoryTreeOracle mto = new MultiTheoryTreeOracle( oracle, teachers, new Constants(), solver); @@ -80,7 +76,7 @@ public void testDoubleInequalityTheory() { dit.setUseSuffixOpt(false); teachers.put(type, dit); - JConstraintsConstraintSolver jsolv = TestUtil.getZ3Solver(); + ConstraintSolver jsolv = TestUtil.getZ3Solver(); EqCRecordingOracle oracle = new EqCRecordingOracle(); MultiTheoryTreeOracle mto = new MultiTheoryTreeOracle( oracle, teachers, new Constants(), jsolv); diff --git a/src/test/java/de/learnlib/ralib/theory/TestEqualityTheory.java b/src/test/java/de/learnlib/ralib/theory/TestEqualityTheory.java index 5313ee6c..2b77ba34 100644 --- a/src/test/java/de/learnlib/ralib/theory/TestEqualityTheory.java +++ b/src/test/java/de/learnlib/ralib/theory/TestEqualityTheory.java @@ -28,7 +28,7 @@ import java.util.Map; import java.util.logging.Level; -import de.learnlib.ralib.smt.ConstraintSolverFactory; +import de.learnlib.ralib.smt.ConstraintSolver; import org.testng.Assert; import org.testng.annotations.Test; @@ -67,7 +67,7 @@ public void testLoginExample1() { theories.put(T_PWD, new IntegerEqualityTheory(T_PWD)); MultiTheoryTreeOracle treeOracle = new MultiTheoryTreeOracle( - oracle, theories, new Constants(), ConstraintSolverFactory.createZ3ConstraintSolver()); + oracle, theories, new Constants(), new ConstraintSolver()); final Word longsuffix = Word.fromSymbols( new PSymbolInstance(I_LOGIN, diff --git a/src/test/java/de/learnlib/ralib/theory/TestIneqEqTree.java b/src/test/java/de/learnlib/ralib/theory/TestIneqEqTree.java index 41d6e793..8a33279d 100644 --- a/src/test/java/de/learnlib/ralib/theory/TestIneqEqTree.java +++ b/src/test/java/de/learnlib/ralib/theory/TestIneqEqTree.java @@ -23,6 +23,7 @@ import java.util.Map; import java.util.logging.Level; +import de.learnlib.ralib.smt.ConstraintSolver; import org.testng.Assert; import org.testng.annotations.Test; @@ -40,7 +41,6 @@ import de.learnlib.ralib.oracles.Branching; import de.learnlib.ralib.oracles.TreeQueryResult; import de.learnlib.ralib.oracles.mto.MultiTheoryTreeOracle; -import de.learnlib.ralib.smt.jconstraints.JConstraintsConstraintSolver; import de.learnlib.ralib.tools.theories.DoubleInequalityTheory; import de.learnlib.ralib.words.PSymbolInstance; import net.automatalib.word.Word; @@ -59,7 +59,7 @@ public void testIneqEqTree() { new DoubleInequalityTheory(PriorityQueueSUL.DOUBLE_TYPE)); PriorityQueueSUL sul = new PriorityQueueSUL(); - JConstraintsConstraintSolver jsolv = TestUtil.getZ3Solver(); + ConstraintSolver jsolv = TestUtil.getZ3Solver(); MultiTheoryTreeOracle mto = TestUtil.createMTO( sul, PriorityQueueSUL.ERROR, teachers, new Constants(), jsolv, diff --git a/src/test/java/de/learnlib/ralib/theory/TestIneqOutputTree.java b/src/test/java/de/learnlib/ralib/theory/TestIneqOutputTree.java index c0ccaffb..56283ced 100644 --- a/src/test/java/de/learnlib/ralib/theory/TestIneqOutputTree.java +++ b/src/test/java/de/learnlib/ralib/theory/TestIneqOutputTree.java @@ -23,6 +23,7 @@ import java.util.Map; import java.util.logging.Level; +import de.learnlib.ralib.smt.ConstraintSolver; import org.testng.Assert; import org.testng.annotations.Test; @@ -37,7 +38,6 @@ import de.learnlib.ralib.learning.SymbolicSuffix; import de.learnlib.ralib.oracles.TreeQueryResult; import de.learnlib.ralib.oracles.mto.MultiTheoryTreeOracle; -import de.learnlib.ralib.smt.jconstraints.JConstraintsConstraintSolver; import de.learnlib.ralib.sul.DataWordSUL; import de.learnlib.ralib.tools.theories.DoubleInequalityTheory; import de.learnlib.ralib.words.InputSymbol; @@ -80,7 +80,7 @@ public void testIneqEqTree() { teachers.put(TYPE, new DoubleInequalityTheory(TYPE)); BiggerSUL sul = new BiggerSUL(); - JConstraintsConstraintSolver jsolv = TestUtil.getZ3Solver(); + ConstraintSolver jsolv = TestUtil.getZ3Solver(); MultiTheoryTreeOracle mto = TestUtil.createMTO( sul, PriorityQueueSUL.ERROR, teachers, new Constants(), jsolv, diff --git a/src/test/java/de/learnlib/ralib/theory/TestTreeOracle.java b/src/test/java/de/learnlib/ralib/theory/TestTreeOracle.java index 6a2e4e56..ebfb472d 100644 --- a/src/test/java/de/learnlib/ralib/theory/TestTreeOracle.java +++ b/src/test/java/de/learnlib/ralib/theory/TestTreeOracle.java @@ -20,11 +20,10 @@ import java.util.Arrays; import java.util.Collection; import java.util.LinkedHashMap; -import java.util.List; import java.util.Map; import java.util.logging.Level; -import de.learnlib.ralib.smt.ConstraintSolverFactory; +import de.learnlib.ralib.smt.ConstraintSolver; import de.learnlib.ralib.tools.theories.IntegerEqualityTheory; import org.testng.Assert; import org.testng.annotations.Test; @@ -39,7 +38,6 @@ import de.learnlib.ralib.oracles.TreeQueryResult; import de.learnlib.ralib.oracles.mto.MultiTheoryTreeOracle; -import de.learnlib.ralib.theory.equality.EqualityTheory; import de.learnlib.ralib.words.InputSymbol; import de.learnlib.ralib.words.PSymbolInstance; import de.learnlib.ralib.words.ParameterizedSymbol; @@ -127,7 +125,7 @@ public void processQueries(Collection> MultiTheoryTreeOracle treeOracle = new MultiTheoryTreeOracle( dwOracle, theories, - new Constants(), ConstraintSolverFactory.createZ3ConstraintSolver()); + new Constants(), new ConstraintSolver()); TreeQueryResult res = treeOracle.treeQuery(prefix, symSuffix); diff --git a/src/test/java/de/learnlib/ralib/theory/TestUniqueEqualityTheory.java b/src/test/java/de/learnlib/ralib/theory/TestUniqueEqualityTheory.java index b6272fe3..54bb21af 100644 --- a/src/test/java/de/learnlib/ralib/theory/TestUniqueEqualityTheory.java +++ b/src/test/java/de/learnlib/ralib/theory/TestUniqueEqualityTheory.java @@ -7,7 +7,7 @@ import java.util.Map; import java.util.logging.Level; -import de.learnlib.ralib.smt.ConstraintSolverFactory; +import de.learnlib.ralib.smt.ConstraintSolver; import org.testng.Assert; import org.testng.annotations.Test; @@ -37,7 +37,7 @@ public void testLoginExample1() { theories.put(T_PWD, new UniqueIntegerEqualityTheory(T_PWD)); MultiTheoryTreeOracle treeOracle = new MultiTheoryTreeOracle( - oracle, theories, new Constants(), ConstraintSolverFactory.createZ3ConstraintSolver()); + oracle, theories, new Constants(), new ConstraintSolver()); final Word longsuffix = Word.fromSymbols( new PSymbolInstance(I_LOGIN, From 3cf1f58bc7751d5bdc413251bf8b3c14d1b0fd2f Mon Sep 17 00:00:00 2001 From: Falk Howar Date: Fri, 21 Feb 2025 17:13:18 +0100 Subject: [PATCH 04/26] maven compiler level 16 --- pom.xml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/pom.xml b/pom.xml index aeaf9ec5..f53bbba1 100644 --- a/pom.xml +++ b/pom.xml @@ -119,6 +119,14 @@ + + org.apache.maven.plugins + maven-compiler-plugin + + 16 + 16 + + From 077ffed5f7e83063f8aa46fb6356053785e5f006 Mon Sep 17 00:00:00 2001 From: Falk Howar Date: Fri, 21 Feb 2025 17:32:46 +0100 Subject: [PATCH 05/26] many small clean ups and remove Relation --- .../learnlib/ralib/automata/RALocation.java | 5 +- .../TransitionSequenceTransformer.java | 2 +- .../ralib/automata/guards/Relation.java | 37 ----------- .../learnlib/ralib/automata/util/RAToDot.java | 2 +- .../java/de/learnlib/ralib/data/DataType.java | 5 +- .../de/learnlib/ralib/data/DataValue.java | 8 +-- .../ralib/data/SymbolicDataValue.java | 13 ++-- .../data/util/SymbolicDataValueGenerator.java | 8 +-- src/main/java/de/learnlib/ralib/dt/DT.java | 16 ++--- .../java/de/learnlib/ralib/dt/DTBranch.java | 2 +- .../de/learnlib/ralib/dt/DTInnerNode.java | 4 +- .../java/de/learnlib/ralib/dt/DTLeaf.java | 4 +- .../de/learnlib/ralib/dt/MappedPrefix.java | 4 +- .../java/de/learnlib/ralib/dt/PathResult.java | 3 +- .../java/de/learnlib/ralib/dt/PrefixSet.java | 2 +- .../IOCounterExampleOptimizer.java | 2 +- .../ralib/equivalence/IOEquivalenceTest.java | 9 +-- .../ralib/equivalence/IORandomWalk.java | 5 +- .../ralib/equivalence/RAEquivalenceTest.java | 16 +---- .../ralib/learning/AutomatonBuilder.java | 6 +- .../learning/CounterexampleAnalysis.java | 2 +- .../ralib/learning/IOAutomatonBuilder.java | 6 +- .../ralib/learning/RaLearningAlgorithm.java | 12 ++-- .../ralib/learning/SymbolicDecisionTree.java | 8 +-- .../ralib/learning/SymbolicSuffix.java | 14 +---- .../learnlib/ralib/learning/SymbolicWord.java | 10 ++- .../learning/ralambda/DiscriminationTree.java | 6 +- .../ralib/learning/ralambda/RaLambda.java | 15 ++--- .../learning/rastar/ObservationTable.java | 17 ++---- .../ralib/learning/rastar/RaStar.java | 4 +- .../learnlib/ralib/learning/rastar/Row.java | 6 +- .../de/learnlib/ralib/oracles/Branching.java | 4 +- .../ralib/oracles/SDTLogicOracle.java | 2 +- .../de/learnlib/ralib/oracles/TreeOracle.java | 18 +++--- .../ralib/oracles/TreeOracleFactory.java | 2 +- .../de/learnlib/ralib/oracles/io/IOCache.java | 2 +- .../learnlib/ralib/oracles/io/IOFilter.java | 2 +- .../oracles/mto/MultiTheoryBranching.java | 10 +-- .../mto/MultiTheorySDTLogicOracle.java | 5 +- .../oracles/mto/MultiTheoryTreeOracle.java | 6 +- .../de/learnlib/ralib/oracles/mto/SDT.java | 61 +------------------ .../ralib/oracles/mto/SDTConstructor.java | 2 +- .../java/de/learnlib/ralib/smt/SMTUtil.java | 4 +- .../de/learnlib/ralib/sul/CachingSUL.java | 4 +- .../java/de/learnlib/ralib/sul/SULOracle.java | 2 +- .../de/learnlib/ralib/sul/SimulatorSUL.java | 6 +- .../ralib/theory/EquivalenceClassFilter.java | 2 +- .../ralib/theory/FreshSuffixValue.java | 1 - .../de/learnlib/ralib/theory/SDTGuard.java | 2 +- .../de/learnlib/ralib/theory/SDTIfGuard.java | 10 +-- .../learnlib/ralib/theory/SDTMultiGuard.java | 2 +- .../learnlib/ralib/theory/SDTTrueGuard.java | 5 +- .../ralib/theory/SuffixValueRestriction.java | 7 ++- .../java/de/learnlib/ralib/theory/Theory.java | 20 +++--- .../theory/equality/DisequalityGuard.java | 7 +-- .../theory/equality/EqualRestriction.java | 4 +- .../ralib/theory/equality/EqualityGuard.java | 7 +-- .../ralib/theory/equality/EqualityTheory.java | 25 ++++---- .../theory/equality/UniqueEqualityTheory.java | 4 +- .../inequality/InequalityTheoryWithEq.java | 30 ++++----- .../theory/inequality/IntervalGuard.java | 12 ++-- .../de/learnlib/ralib/tools/IOSimulator.java | 2 +- .../de/learnlib/ralib/tools/RaLibTool.java | 8 +-- .../ClasssAnalyzerDataWordSUL.java | 3 +- .../tools/classanalyzer/SpecialSymbols.java | 2 +- .../tools/classanalyzer/TypedTheory.java | 6 +- .../tools/config/ConfigurationOption.java | 4 +- .../theories/DoubleInequalityTheory.java | 13 ++-- .../learnlib/ralib/words/PSymbolInstance.java | 3 +- .../ralib/words/ParameterizedSymbol.java | 3 +- .../learnlib/ralib/CacheDataWordOracle.java | 4 +- .../ralib/RaLibLearningExperimentRunner.java | 4 +- .../de/learnlib/ralib/RaLibTestSuite.java | 2 +- .../java/de/learnlib/ralib/RandomWalk.java | 12 ++-- .../ralib/automata/KeygenAutomatonTest.java | 58 +++++++++--------- .../ralib/automata/LoginAutomatonTest.java | 12 ++-- .../ralib/automata/xml/OutputTest.java | 12 ++-- .../java/de/learnlib/ralib/dt/DTTest.java | 12 ++-- .../ralib/dt/RegisterConsistencyTest.java | 8 +-- .../example/keygen/MapAutomatonExample.java | 10 +-- .../ralib/example/list/BoundedList.java | 4 +- .../list/BoundedListDataWordOracle.java | 10 +-- .../llambda/LLambdaAutomatonExample.java | 4 +- .../ralib/example/login/FreshMultiLogin.java | 2 +- .../example/login/LoginAutomatonExample.java | 6 +- .../ralib/example/priority/PQWrapper.java | 2 +- .../example/priority/PriorityQueueOracle.java | 8 +-- .../example/priority/PriorityQueueSUL.java | 14 ++--- .../ralib/example/repeater/Repeater.java | 6 +- .../ralib/example/repeater/RepeaterSUL.java | 12 ++-- .../ralib/example/sdts/LoginExampleSDT.java | 2 +- .../example/sdts/LoginExampleTreeOracle.java | 4 +- .../example/stack/StackAutomatonExample.java | 4 +- .../ralib/learning/QueryStatisticsTest.java | 2 +- .../ralib/learning/SymbolicSuffixTest.java | 8 +-- .../learning/ralambda/IOHandlingTest.java | 10 +-- .../learning/ralambda/LearnABPOutputTest.java | 4 +- .../learning/ralambda/LearnMixedIOTest.java | 4 +- .../learning/ralambda/LearnPQIOTest.java | 2 +- .../ralib/learning/ralambda/LearnPadlock.java | 2 +- .../ralambda/LearnPalindromeIOTest.java | 4 +- .../learning/ralambda/LearnSipIOTest.java | 4 +- .../TestDistinguishingSuffixOptimization.java | 4 +- .../learning/ralambda/TestOutputSuffixes.java | 4 +- .../ralib/learning/ralambda/TestSymmetry.java | 4 +- .../ralambda/TestUnknownMemorable.java | 20 +++--- .../learning/rastar/LearnMixedIOTest.java | 4 +- .../ralib/learning/rastar/LearnPQIOTest.java | 2 +- .../rastar/LearnPalindromeIOTest.java | 4 +- .../ralib/learning/rastar/LearnSipIOTest.java | 4 +- .../mto/ConstantsSDTBranchingTest.java | 8 +-- .../ralib/oracles/mto/FreshValuesTest.java | 8 +-- .../mto/InstantiateSymbolicWordTest.java | 4 +- .../ralib/oracles/mto/LoginBranchingTest.java | 14 ++--- .../oracles/mto/MultiSDTBranchingTest.java | 8 +-- .../oracles/mto/MultipleSpecialCasesTest.java | 8 +-- .../oracles/mto/NonFreeSuffixValuesTest.java | 12 ++-- .../OptimizedSymbolicSuffixBuilderTest.java | 2 +- .../ralib/oracles/mto/SIPSDTMergingTest.java | 12 ++-- .../oracles/mto/SecondSDTBranchingTest.java | 10 +-- .../oracles/mto/UntypedBranchingTest.java | 14 ++--- .../ralib/theory/TestIneqOutputTree.java | 2 +- .../learnlib/ralib/theory/TestTreeOracle.java | 4 +- .../de/learnlib/ralib/words/TestWords.java | 2 +- 124 files changed, 393 insertions(+), 578 deletions(-) delete mode 100644 src/main/java/de/learnlib/ralib/automata/guards/Relation.java diff --git a/src/main/java/de/learnlib/ralib/automata/RALocation.java b/src/main/java/de/learnlib/ralib/automata/RALocation.java index 24d30114..cd8a76af 100644 --- a/src/main/java/de/learnlib/ralib/automata/RALocation.java +++ b/src/main/java/de/learnlib/ralib/automata/RALocation.java @@ -87,10 +87,7 @@ public boolean equals(Object obj) { return false; } final RALocation other = (RALocation) obj; - if (this.id != other.id) { - return false; - } - return true; + return this.id == other.id; } @Override diff --git a/src/main/java/de/learnlib/ralib/automata/TransitionSequenceTransformer.java b/src/main/java/de/learnlib/ralib/automata/TransitionSequenceTransformer.java index 3a9f1d4f..7df91b32 100644 --- a/src/main/java/de/learnlib/ralib/automata/TransitionSequenceTransformer.java +++ b/src/main/java/de/learnlib/ralib/automata/TransitionSequenceTransformer.java @@ -36,6 +36,6 @@ public interface TransitionSequenceTransformer { * @param word the input word * @return the word representing the last passed transition */ - public Word transformTransitionSequence(Word word); + Word transformTransitionSequence(Word word); } diff --git a/src/main/java/de/learnlib/ralib/automata/guards/Relation.java b/src/main/java/de/learnlib/ralib/automata/guards/Relation.java deleted file mode 100644 index 2ccbcde7..00000000 --- a/src/main/java/de/learnlib/ralib/automata/guards/Relation.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (C) 2014-2015 The LearnLib Contributors - * This file is part of LearnLib, http://www.learnlib.de/. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package de.learnlib.ralib.automata.guards; - -@Deprecated -public enum Relation { - - SMALLER("<"), - BIGGER(">"), - EQUALS("=="), - NOT_EQUALS("!="); - - private final String name; - - private Relation(String s) { - name = s; - } - - @Override - public String toString(){ - return name; - } -} diff --git a/src/main/java/de/learnlib/ralib/automata/util/RAToDot.java b/src/main/java/de/learnlib/ralib/automata/util/RAToDot.java index 40009a50..6194fe8d 100644 --- a/src/main/java/de/learnlib/ralib/automata/util/RAToDot.java +++ b/src/main/java/de/learnlib/ralib/automata/util/RAToDot.java @@ -146,6 +146,6 @@ private void printOutputLabel(OutputTransition t) { } private String escapeGuard(String g) { - return g.toString().replaceAll("&", "&"); + return g.replaceAll("&", "&"); } } diff --git a/src/main/java/de/learnlib/ralib/data/DataType.java b/src/main/java/de/learnlib/ralib/data/DataType.java index 98c70a46..1b878fbc 100644 --- a/src/main/java/de/learnlib/ralib/data/DataType.java +++ b/src/main/java/de/learnlib/ralib/data/DataType.java @@ -50,10 +50,7 @@ public boolean equals(Object obj) { return false; } final DataType other = (DataType) obj; - if (!Objects.equals(this.name, other.name)) { - return false; - } - return true; + return Objects.equals(this.name, other.name); } public String getName() { diff --git a/src/main/java/de/learnlib/ralib/data/DataValue.java b/src/main/java/de/learnlib/ralib/data/DataValue.java index 9f4e8f30..ec0c05c8 100644 --- a/src/main/java/de/learnlib/ralib/data/DataValue.java +++ b/src/main/java/de/learnlib/ralib/data/DataValue.java @@ -56,17 +56,13 @@ public boolean equals(Object obj) { if (obj == null) { return false; } - if (!(obj instanceof DataValue)) { + if (!(obj instanceof DataValue other)) { return false; } - final DataValue other = (DataValue) obj; if (!Objects.equals(this.type, other.type)) { return false; } - if (!this.getValue().equals(other.getValue())) { - return false; - } - return true; + return this.getValue().equals(other.getValue()); } public DataType getDataType() { diff --git a/src/main/java/de/learnlib/ralib/data/SymbolicDataValue.java b/src/main/java/de/learnlib/ralib/data/SymbolicDataValue.java index b96859ce..660d0e17 100644 --- a/src/main/java/de/learnlib/ralib/data/SymbolicDataValue.java +++ b/src/main/java/de/learnlib/ralib/data/SymbolicDataValue.java @@ -35,21 +35,21 @@ public static final class Parameter extends SymbolicDataValue { public Parameter(DataType dataType, int id) { super(dataType, id, "p" + id); } - }; + } public static final class Register extends SymbolicDataValue { public Register(DataType dataType, int id) { super(dataType, id, "r" + id); } - }; + } public static final class Constant extends SymbolicDataValue { public Constant(DataType dataType, int id) { super(dataType, id, "c" + id); } - }; + } /* * a parameter in a suffix: we should replace those by v_i @@ -59,7 +59,7 @@ public static final class SuffixValue extends SymbolicDataValue { public SuffixValue(DataType dataType, int id) { super(dataType, id, "s" + id); } - }; + } final DataType type; @@ -110,10 +110,7 @@ public boolean equals(Object obj) { if (!Objects.equals(this.type, other.type)) { return false; } - if (this.id != other.id) { - return false; - } - return true; + return this.id == other.id; } @Override diff --git a/src/main/java/de/learnlib/ralib/data/util/SymbolicDataValueGenerator.java b/src/main/java/de/learnlib/ralib/data/util/SymbolicDataValueGenerator.java index 4b0416f1..82969f69 100644 --- a/src/main/java/de/learnlib/ralib/data/util/SymbolicDataValueGenerator.java +++ b/src/main/java/de/learnlib/ralib/data/util/SymbolicDataValueGenerator.java @@ -42,26 +42,26 @@ public static final class ParameterGenerator extends SymbolicDataValueGenerator public SymbolicDataValue.Parameter next(DataType type) { return new SymbolicDataValue.Parameter(type, id++); } - }; + } public static final class RegisterGenerator extends SymbolicDataValueGenerator { @Override public SymbolicDataValue.Register next(DataType type) { return new SymbolicDataValue.Register(type, id++); } - }; + } public static final class SuffixValueGenerator extends SymbolicDataValueGenerator { @Override public SymbolicDataValue.SuffixValue next(DataType type) { return new SymbolicDataValue.SuffixValue(type, id++); } - }; + } public static final class ConstantGenerator extends SymbolicDataValueGenerator { @Override public SymbolicDataValue.Constant next(DataType type) { return new SymbolicDataValue.Constant(type, id++); } - }; + } } diff --git a/src/main/java/de/learnlib/ralib/dt/DT.java b/src/main/java/de/learnlib/ralib/dt/DT.java index 486a9f78..55ad234e 100644 --- a/src/main/java/de/learnlib/ralib/dt/DT.java +++ b/src/main/java/de/learnlib/ralib/dt/DT.java @@ -42,11 +42,11 @@ * @author fredrik */ public class DT implements DiscriminationTree { - private DTInnerNode root; + private final DTInnerNode root; private final ParameterizedSymbol[] inputs; - private TreeOracle oracle; - private boolean ioMode; + private final TreeOracle oracle; + private final boolean ioMode; private final Constants consts; private DTLeaf sink = null; private final SymbolicSuffixRestrictionBuilder restrictionBuilder; @@ -145,7 +145,7 @@ private DTLeaf sift(MappedPrefix mp, DTInnerNode from, boolean add) { leaf = new DTLeaf(oracle); //tqr = mp.computeTQR(suffix, oracle); PathResult r = PathResult.computePathResult(oracle, mp, inner.getSuffixes(), ioMode); - assert !mp.getTQRs().keySet().contains(suffix); + assert !mp.getTQRs().containsKey(suffix); mp.addTQR(suffix, r.getTQRforSuffix(suffix)); leaf.setAccessSequence(mp); DTBranch branch = new DTBranch(leaf, r); @@ -191,7 +191,7 @@ public void split(Word prefix, SymbolicSuffix suffix, DTLeaf le newLeaf.setParent(node); PathResult r = PathResult.computePathResult(oracle, mp, node.getSuffixes(), ioMode); TreeQueryResult tqr = r.getTQRforSuffix(suffix); - assert !mp.getTQRs().keySet().contains(suffix); + assert !mp.getTQRs().containsKey(suffix); mp.addTQR(suffix, tqr); DTBranch newBranch = new DTBranch(newLeaf, r); @@ -200,7 +200,7 @@ public void split(Word prefix, SymbolicSuffix suffix, DTLeaf le // update old leaf boolean removed = leaf.removeShortPrefix(prefix); - assert (removed == true); // must not split a prefix that isn't there + assert (removed); // must not split a prefix that isn't there //TreeQueryResult tqr2 = leaf.getPrimePrefix().computeTQR(suffix, oracle); PathResult r2 = PathResult.computePathResult(oracle, leaf.getPrimePrefix(), node.getSuffixes(), ioMode); @@ -233,7 +233,7 @@ public void addSuffix(SymbolicSuffix suffix, DTLeaf leaf) { //TreeQueryResult tqr = leaf.getPrimePrefix().computeTQR(suffix, oracle); PathResult r = PathResult.computePathResult(oracle, leaf.getPrimePrefix(), node.getSuffixes(), ioMode); TreeQueryResult tqr = r.getTQRforSuffix(suffix); - assert !leaf.getPrimePrefix().getTQRs().keySet().contains(suffix); + assert !leaf.getPrimePrefix().getTQRs().containsKey(suffix); leaf.getPrimePrefix().addTQR(suffix, tqr); DTBranch newBranch = new DTBranch(leaf, r); @@ -546,7 +546,7 @@ public String toString() { private void buildTreeString(StringBuilder builder, DTNode node, String currentIndentation, String indentation, String sep) { if (node.isLeaf()) { - builder.append("\n").append(currentIndentation).append("Leaf: ").append(node.toString()); + builder.append("\n").append(currentIndentation).append("Leaf: ").append(node); } else { DTInnerNode inner = (DTInnerNode) node; builder.append("\n").append(currentIndentation).append("Inner: ").append(inner.getSuffix()); diff --git a/src/main/java/de/learnlib/ralib/dt/DTBranch.java b/src/main/java/de/learnlib/ralib/dt/DTBranch.java index 4774c69c..06730d11 100644 --- a/src/main/java/de/learnlib/ralib/dt/DTBranch.java +++ b/src/main/java/de/learnlib/ralib/dt/DTBranch.java @@ -5,7 +5,7 @@ public class DTBranch { - private PathResult urap; + private final PathResult urap; private DTNode child; diff --git a/src/main/java/de/learnlib/ralib/dt/DTInnerNode.java b/src/main/java/de/learnlib/ralib/dt/DTInnerNode.java index 7462ef71..db7794c8 100644 --- a/src/main/java/de/learnlib/ralib/dt/DTInnerNode.java +++ b/src/main/java/de/learnlib/ralib/dt/DTInnerNode.java @@ -10,9 +10,9 @@ public class DTInnerNode extends DTNode { - private SymbolicSuffix suffix; + private final SymbolicSuffix suffix; - private Set branches; + private final Set branches; public DTInnerNode(SymbolicSuffix suffix) { super(); diff --git a/src/main/java/de/learnlib/ralib/dt/DTLeaf.java b/src/main/java/de/learnlib/ralib/dt/DTLeaf.java index e0072113..da1e7d3c 100644 --- a/src/main/java/de/learnlib/ralib/dt/DTLeaf.java +++ b/src/main/java/de/learnlib/ralib/dt/DTLeaf.java @@ -418,7 +418,7 @@ private boolean updateBranching(ParameterizedSymbol ps, ShortPrefix sp, Discrimi ret = false; } } - sp.putBranching(ps, newB);; + sp.putBranching(ps, newB); return ret; } @@ -496,7 +496,7 @@ private boolean checkVariableConsistency(MappedPrefix mp, DT dt, Constants const continue; TreeQueryResult tqr = oracle.treeQuery(prefix, newSuffix); - if (tqr.getPiv().keySet().contains(p)) { + if (tqr.getPiv().containsKey(p)) { dt.addSuffix(newSuffix, prefixLeaf); mp.missingParameter.remove(p); return false; diff --git a/src/main/java/de/learnlib/ralib/dt/MappedPrefix.java b/src/main/java/de/learnlib/ralib/dt/MappedPrefix.java index c3133758..9c696b4a 100644 --- a/src/main/java/de/learnlib/ralib/dt/MappedPrefix.java +++ b/src/main/java/de/learnlib/ralib/dt/MappedPrefix.java @@ -20,7 +20,7 @@ import net.automatalib.word.Word; public class MappedPrefix implements PrefixContainer { - private Word prefix; + private final Word prefix; private final PIV memorable = new PIV(); private final RegisterGenerator regGen = new RegisterGenerator(); private final Map tqrs = new LinkedHashMap(); @@ -105,7 +105,7 @@ public Word getPrefix() { @Override public String toString() { - return "{" + prefix.toString() + ", " + memorable.toString() + "}"; + return "{" + prefix.toString() + ", " + memorable + "}"; } @Override diff --git a/src/main/java/de/learnlib/ralib/dt/PathResult.java b/src/main/java/de/learnlib/ralib/dt/PathResult.java index c34bd4d8..fb39d828 100644 --- a/src/main/java/de/learnlib/ralib/dt/PathResult.java +++ b/src/main/java/de/learnlib/ralib/dt/PathResult.java @@ -149,8 +149,7 @@ public static PathResult computePathResult(TreeOracle oracle, } // unmatching suffix if ((prefix.getPrefix().length() < 1 && (s.getActions().firstSymbol() instanceof OutputSymbol)) - || (prefix.getPrefix().length() > 0 && !(prefix.getPrefix().lastSymbol().getBaseSymbol() instanceof InputSymbol - ^ s.getActions().firstSymbol() instanceof InputSymbol))) { + || (prefix.getPrefix().length() > 0 && prefix.getPrefix().lastSymbol().getBaseSymbol() instanceof InputSymbol == s.getActions().firstSymbol() instanceof InputSymbol)) { //log.log(Level.INFO, "Not adding suffix " + s + " to unmatching row " + r.getPrefix()); continue; } diff --git a/src/main/java/de/learnlib/ralib/dt/PrefixSet.java b/src/main/java/de/learnlib/ralib/dt/PrefixSet.java index 9587d41f..56a8d911 100644 --- a/src/main/java/de/learnlib/ralib/dt/PrefixSet.java +++ b/src/main/java/de/learnlib/ralib/dt/PrefixSet.java @@ -11,7 +11,7 @@ import net.automatalib.word.Word; public class PrefixSet { - private Set prefixes; + private final Set prefixes; public PrefixSet() { prefixes = new LinkedHashSet(); diff --git a/src/main/java/de/learnlib/ralib/equivalence/IOCounterExampleOptimizer.java b/src/main/java/de/learnlib/ralib/equivalence/IOCounterExampleOptimizer.java index db86f35c..219cfb72 100644 --- a/src/main/java/de/learnlib/ralib/equivalence/IOCounterExampleOptimizer.java +++ b/src/main/java/de/learnlib/ralib/equivalence/IOCounterExampleOptimizer.java @@ -28,7 +28,7 @@ */ public interface IOCounterExampleOptimizer { - public DefaultQuery optimizeCE( + DefaultQuery optimizeCE( Word ce, Hypothesis hyp); } diff --git a/src/main/java/de/learnlib/ralib/equivalence/IOEquivalenceTest.java b/src/main/java/de/learnlib/ralib/equivalence/IOEquivalenceTest.java index 1f429d46..3dc113c8 100644 --- a/src/main/java/de/learnlib/ralib/equivalence/IOEquivalenceTest.java +++ b/src/main/java/de/learnlib/ralib/equivalence/IOEquivalenceTest.java @@ -107,13 +107,10 @@ public boolean equals(Object obj) { return false; } final Tuple other = (Tuple) obj; - if (this.sys1loc != other.sys1loc && (this.sys1loc == null || !this.sys1loc.equals(other.sys1loc))) { + if (!Objects.equals(this.sys1loc, other.sys1loc)) { return false; } - if (this.sys2loc != other.sys2loc && (this.sys2loc == null || !this.sys2loc.equals(other.sys2loc))) { - return false; - } - return true; + return Objects.equals(this.sys2loc, other.sys2loc); } } @@ -499,7 +496,7 @@ private PSymbolInstance createOutputSymbol(OutputTransition ot, VarValuation reg int i = 0; for (DataType t : ps.getPtypes()) { SymbolicDataValue.Parameter p = pgen.next(t); - if (!mapping.getOutput().keySet().contains(p)) { + if (!mapping.getOutput().containsKey(p)) { Set forFresh = new LinkedHashSet<>(); forFresh.addAll(register.values()); diff --git a/src/main/java/de/learnlib/ralib/equivalence/IORandomWalk.java b/src/main/java/de/learnlib/ralib/equivalence/IORandomWalk.java index e29f86b2..90701a6c 100644 --- a/src/main/java/de/learnlib/ralib/equivalence/IORandomWalk.java +++ b/src/main/java/de/learnlib/ralib/equivalence/IORandomWalk.java @@ -63,7 +63,7 @@ public class IORandomWalk implements IOEquivalenceOracle { private final Constants constants; private final Map teachers; - private static Logger LOGGER = LoggerFactory.getLogger(IORandomWalk.class); + private static final Logger LOGGER = LoggerFactory.getLogger(IORandomWalk.class); private ParameterizedSymbol error = null; @@ -111,8 +111,7 @@ public DefaultQuery findCounterExample( } if (this.seedTransitions) { - if ((a instanceof Hypothesis)) { - Hypothesis hypothesis = (Hypothesis) a; + if ((a instanceof Hypothesis hypothesis)) { seeds = new ArrayList<>(); for (Word u : hypothesis.getTransitionSequences().values()) { if (u.lastSymbol().getBaseSymbol() instanceof OutputSymbol) { diff --git a/src/main/java/de/learnlib/ralib/equivalence/RAEquivalenceTest.java b/src/main/java/de/learnlib/ralib/equivalence/RAEquivalenceTest.java index d315425a..724ab17c 100644 --- a/src/main/java/de/learnlib/ralib/equivalence/RAEquivalenceTest.java +++ b/src/main/java/de/learnlib/ralib/equivalence/RAEquivalenceTest.java @@ -16,14 +16,7 @@ */ package de.learnlib.ralib.equivalence; -import java.util.ArrayList; -import java.util.Collection; -import java.util.LinkedHashMap; -import java.util.LinkedHashSet; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; import com.google.common.collect.Sets; @@ -84,13 +77,10 @@ public boolean equals(Object obj) { return false; } final Tuple other = (Tuple) obj; - if (this.sys1loc != other.sys1loc && (this.sys1loc == null || !this.sys1loc.equals(other.sys1loc))) { + if (!Objects.equals(this.sys1loc, other.sys1loc)) { return false; } - if (this.sys2loc != other.sys2loc && (this.sys2loc == null || !this.sys2loc.equals(other.sys2loc))) { - return false; - } - return true; + return Objects.equals(this.sys2loc, other.sys2loc); } } diff --git a/src/main/java/de/learnlib/ralib/learning/AutomatonBuilder.java b/src/main/java/de/learnlib/ralib/learning/AutomatonBuilder.java index 16f7c3b0..56c15689 100644 --- a/src/main/java/de/learnlib/ralib/learning/AutomatonBuilder.java +++ b/src/main/java/de/learnlib/ralib/learning/AutomatonBuilder.java @@ -60,7 +60,7 @@ public class AutomatonBuilder { protected final Constants consts; - private static Logger LOGGER = LoggerFactory.getLogger(AutomatonBuilder.class); + private static final Logger LOGGER = LoggerFactory.getLogger(AutomatonBuilder.class); public AutomatonBuilder(Map, LocationComponent> components, Constants consts) { this.consts = consts; @@ -143,9 +143,7 @@ private void computeTransition(LocationComponent dest_c, PrefixContainer r) { if (automaton instanceof DTHyp && guard == null) return; - if (guard == null) { - assert true; - } + assert true; assert guard!=null; // assignment diff --git a/src/main/java/de/learnlib/ralib/learning/CounterexampleAnalysis.java b/src/main/java/de/learnlib/ralib/learning/CounterexampleAnalysis.java index ddb8d3de..770e274c 100644 --- a/src/main/java/de/learnlib/ralib/learning/CounterexampleAnalysis.java +++ b/src/main/java/de/learnlib/ralib/learning/CounterexampleAnalysis.java @@ -57,7 +57,7 @@ public class CounterexampleAnalysis { private final Constants consts; - private static enum IndexResult {HAS_CE_AND_REFINES, HAS_CE_NO_REFINE, NO_CE}; + private enum IndexResult {HAS_CE_AND_REFINES, HAS_CE_NO_REFINE, NO_CE} private static final Logger LOGGER = LoggerFactory.getLogger(CounterexampleAnalysis.class); diff --git a/src/main/java/de/learnlib/ralib/learning/IOAutomatonBuilder.java b/src/main/java/de/learnlib/ralib/learning/IOAutomatonBuilder.java index c981195d..59d863f1 100644 --- a/src/main/java/de/learnlib/ralib/learning/IOAutomatonBuilder.java +++ b/src/main/java/de/learnlib/ralib/learning/IOAutomatonBuilder.java @@ -111,13 +111,11 @@ protected Transition createTransition(ParameterizedSymbol action, private void analyzeExpression(Expression expr, VarMapping outmap) { - if (expr instanceof PropositionalCompound) { - PropositionalCompound pc = (PropositionalCompound) expr; + if (expr instanceof PropositionalCompound pc) { analyzeExpression(pc.getLeft(), outmap); analyzeExpression(pc.getRight(), outmap); } - else if (expr instanceof NumericBooleanExpression) { - NumericBooleanExpression nbe = (NumericBooleanExpression) expr; + else if (expr instanceof NumericBooleanExpression nbe) { if (nbe.getComparator() == NumericComparator.EQ) { // FIXME: this is unchecked! //System.out.println(expr); diff --git a/src/main/java/de/learnlib/ralib/learning/RaLearningAlgorithm.java b/src/main/java/de/learnlib/ralib/learning/RaLearningAlgorithm.java index ed985614..6e918223 100644 --- a/src/main/java/de/learnlib/ralib/learning/RaLearningAlgorithm.java +++ b/src/main/java/de/learnlib/ralib/learning/RaLearningAlgorithm.java @@ -8,7 +8,7 @@ public interface RaLearningAlgorithm { /** * Creates a hypothesis consistent with the counterexamples added thus far. */ - public void learn(); + void learn(); /** * Provides a counterexample to the learner. Should be followed by {@link RaLearningAlgorithm#learn()}, which @@ -19,16 +19,16 @@ public interface RaLearningAlgorithm { * SUL (i.e. with the SULs output). * */ - public void addCounterexample(DefaultQuery ce); + void addCounterexample(DefaultQuery ce); /** * Returns the last created hypothesis. */ - public Hypothesis getHypothesis(); + Hypothesis getHypothesis(); - public void setStatisticCounter(QueryStatistics queryStats); + void setStatisticCounter(QueryStatistics queryStats); - public QueryStatistics getQueryStatistics(); + QueryStatistics getQueryStatistics(); - public RaLearningAlgorithmName getName(); + RaLearningAlgorithmName getName(); } diff --git a/src/main/java/de/learnlib/ralib/learning/SymbolicDecisionTree.java b/src/main/java/de/learnlib/ralib/learning/SymbolicDecisionTree.java index 3958567a..bd239c03 100644 --- a/src/main/java/de/learnlib/ralib/learning/SymbolicDecisionTree.java +++ b/src/main/java/de/learnlib/ralib/learning/SymbolicDecisionTree.java @@ -34,7 +34,7 @@ public interface SymbolicDecisionTree { * @param renaming * @return */ - public boolean isEquivalent(SymbolicDecisionTree other, VarMapping renaming); + boolean isEquivalent(SymbolicDecisionTree other, VarMapping renaming); /** * apply relabeling to tree and return a renamed tree. @@ -42,7 +42,7 @@ public interface SymbolicDecisionTree { * @param relabeling * @return */ - public SymbolicDecisionTree relabel(VarMapping relabeling); + SymbolicDecisionTree relabel(VarMapping relabeling); /** @@ -56,7 +56,7 @@ public interface SymbolicDecisionTree { * * @return */ - public boolean isAccepting(); + boolean isAccepting(); - public SymbolicDecisionTree copy(); + SymbolicDecisionTree copy(); } diff --git a/src/main/java/de/learnlib/ralib/learning/SymbolicSuffix.java b/src/main/java/de/learnlib/ralib/learning/SymbolicSuffix.java index fd4d46ef..c6a65006 100644 --- a/src/main/java/de/learnlib/ralib/learning/SymbolicSuffix.java +++ b/src/main/java/de/learnlib/ralib/learning/SymbolicSuffix.java @@ -16,12 +16,7 @@ */ package de.learnlib.ralib.learning; -import java.util.Arrays; -import java.util.Comparator; -import java.util.LinkedHashMap; -import java.util.LinkedHashSet; -import java.util.Map; -import java.util.Set; +import java.util.*; import de.learnlib.ralib.data.Constants; import de.learnlib.ralib.data.DataType; @@ -297,13 +292,10 @@ public boolean equals(Object obj) { return false; } final SymbolicSuffix other = (SymbolicSuffix) obj; - if (this.restrictions != other.restrictions && (this.restrictions == null || !this.restrictions.equals(other.restrictions))) { + if (!Objects.equals(this.restrictions, other.restrictions)) { return false; } - if (this.actions != other.actions && (this.actions == null || !this.actions.equals(other.actions))) { - return false; - } - return true; + return Objects.equals(this.actions, other.actions); } @Override diff --git a/src/main/java/de/learnlib/ralib/learning/SymbolicWord.java b/src/main/java/de/learnlib/ralib/learning/SymbolicWord.java index 62314071..5277faf5 100644 --- a/src/main/java/de/learnlib/ralib/learning/SymbolicWord.java +++ b/src/main/java/de/learnlib/ralib/learning/SymbolicWord.java @@ -16,8 +16,8 @@ import net.automatalib.word.Word; public class SymbolicWord { - private Word prefix; - private SymbolicSuffix suffix; + private final Word prefix; + private final SymbolicSuffix suffix; public SymbolicWord(Word prefix, SymbolicSuffix suffix) { this.prefix = prefix; @@ -74,10 +74,8 @@ public boolean equals(Object obj) { if (!prefix.equals(other.getPrefix())) return false; // if (!other.getSuffix().getActions().equals(suffix.getActions())) - if (!other.getSuffix().equals(suffix)) - return false; - return true; - } + return other.getSuffix().equals(suffix); + } @Override public int hashCode() { diff --git a/src/main/java/de/learnlib/ralib/learning/ralambda/DiscriminationTree.java b/src/main/java/de/learnlib/ralib/learning/ralambda/DiscriminationTree.java index 6987a458..0ebd7c36 100644 --- a/src/main/java/de/learnlib/ralib/learning/ralambda/DiscriminationTree.java +++ b/src/main/java/de/learnlib/ralib/learning/ralambda/DiscriminationTree.java @@ -22,7 +22,7 @@ public interface DiscriminationTree { * @param add * @return the leaf corresponding to prefix */ - public DTLeaf sift(Word prefix, boolean add); + DTLeaf sift(Word prefix, boolean add); /** * Split a prefix from a leaf node into a new leaf. Adds a new inner node using the suffix as a discriminator. @@ -31,7 +31,7 @@ public interface DiscriminationTree { * @param suffix * @param leaf */ - public void split(Word prefix, SymbolicSuffix suffix, DTLeaf leaf); + void split(Word prefix, SymbolicSuffix suffix, DTLeaf leaf); - public Map, LocationComponent> getComponents(); + Map, LocationComponent> getComponents(); } diff --git a/src/main/java/de/learnlib/ralib/learning/ralambda/RaLambda.java b/src/main/java/de/learnlib/ralib/learning/ralambda/RaLambda.java index 5ae80b9f..75baa052 100644 --- a/src/main/java/de/learnlib/ralib/learning/ralambda/RaLambda.java +++ b/src/main/java/de/learnlib/ralib/learning/ralambda/RaLambda.java @@ -55,8 +55,8 @@ public class RaLambda implements RaLearningAlgorithm { public static final Word EMPTY_PREFIX = Word.epsilon(); - public static final SymbolicSuffix EMPTY_SUFFIX = new SymbolicSuffix(Word.epsilon(), - Word.epsilon()); + public static final SymbolicSuffix EMPTY_SUFFIX = new SymbolicSuffix(Word.epsilon(), + Word.epsilon()); private final DT dt; @@ -223,11 +223,8 @@ private boolean analyzeCounterExample() { boolean consistent = false; while (!consistent) { - consistent = true; - if (!checkLocationConsistency()) { - consistent = false; - } + consistent = checkLocationConsistency(); if (!checkRegisterClosedness()) { consistent = false; @@ -266,7 +263,7 @@ private boolean isGuardRefinement(Word word, CEAnalysisResult c piv = sp.getParsInVars(); } - if (hypBranching.getBranches().keySet().contains(word)) + if (hypBranching.getBranches().containsKey(word)) return false; TreeOracle hypOracle = hypOracleFactory.createTreeOracle(hyp); @@ -358,7 +355,7 @@ private boolean checkGuardConsistency() { ShortPrefix sp = (ShortPrefix) src_c.getShortPrefixes().get(src_id); hypBranching = sp.getBranching(word.lastSymbol().getBaseSymbol()); } - if (hypBranching.getBranches().keySet().contains(word)) { + if (hypBranching.getBranches().containsKey(word)) { continue; } @@ -397,7 +394,7 @@ private boolean checkGuardConsistency() { } TreeQueryResult testTQR = sulOracle.treeQuery(src_id, testSuffix); Branching testBranching = sulOracle.updateBranching(src_id, word.lastSymbol().getBaseSymbol(), hypBranching, testTQR.getPiv(), testTQR.getSdt()); - if (testBranching.getBranches().keySet().contains(word)) { + if (testBranching.getBranches().containsKey(word)) { suffix = testSuffix; } } diff --git a/src/main/java/de/learnlib/ralib/learning/rastar/ObservationTable.java b/src/main/java/de/learnlib/ralib/learning/rastar/ObservationTable.java index 86c44be2..2924456e 100644 --- a/src/main/java/de/learnlib/ralib/learning/rastar/ObservationTable.java +++ b/src/main/java/de/learnlib/ralib/learning/rastar/ObservationTable.java @@ -62,7 +62,7 @@ class ObservationTable { private final SymbolicSuffixRestrictionBuilder restrictionBuilder; - private static Logger LOGGER = LoggerFactory.getLogger(ObservationTable.class); + private static final Logger LOGGER = LoggerFactory.getLogger(ObservationTable.class); public ObservationTable(TreeOracle oracle, boolean ioMode, Constants consts, ParameterizedSymbol ... inputs) { @@ -105,16 +105,11 @@ boolean complete() { return false; } - if (!checkVariableConsistency()) { - //AutomatonBuilder ab = new AutomatonBuilder(getComponents(), new Constants()); - //Hypothesis hyp = ab.toRegisterAutomaton(); - - //FIXME: the default logging appender cannot log models and data structures - //System.out.println(hyp.toString()); - return false; - } - - return true; + //AutomatonBuilder ab = new AutomatonBuilder(getComponents(), new Constants()); + //Hypothesis hyp = ab.toRegisterAutomaton(); + //FIXME: the default logging appender cannot log models and data structures + //System.out.println(hyp.toString()); + return checkVariableConsistency(); } private boolean checkBranchingCompleteness() { diff --git a/src/main/java/de/learnlib/ralib/learning/rastar/RaStar.java b/src/main/java/de/learnlib/ralib/learning/rastar/RaStar.java index 80cf546f..fa420f25 100644 --- a/src/main/java/de/learnlib/ralib/learning/rastar/RaStar.java +++ b/src/main/java/de/learnlib/ralib/learning/rastar/RaStar.java @@ -54,7 +54,7 @@ public class RaStar implements RaLearningAlgorithm { public static final Word EMPTY_PREFIX = Word.epsilon(); public static final SymbolicSuffix EMPTY_SUFFIX = new SymbolicSuffix( - Word.epsilon(), Word.epsilon()); + Word.epsilon(), Word.epsilon()); private final ObservationTable obs; @@ -115,7 +115,7 @@ public void learn() { do { LOGGER.info(Category.PHASE, "completing observation table"); - while(! obs.complete()) {}; + while(! obs.complete()) {} LOGGER.info(Category.PHASE, "completed observation table"); //System.out.println(obs.toString()); diff --git a/src/main/java/de/learnlib/ralib/learning/rastar/Row.java b/src/main/java/de/learnlib/ralib/learning/rastar/Row.java index 6d722d6a..b5201b97 100644 --- a/src/main/java/de/learnlib/ralib/learning/rastar/Row.java +++ b/src/main/java/de/learnlib/ralib/learning/rastar/Row.java @@ -83,8 +83,7 @@ void addSuffix(SymbolicSuffix suffix, TreeOracle oracle) { } // unmatching suffix if ((getPrefix().length() < 1 && (suffix.getActions().firstSymbol() instanceof OutputSymbol)) - || (prefix.length() > 0 && !(prefix.lastSymbol().getBaseSymbol() instanceof InputSymbol - ^ suffix.getActions().firstSymbol() instanceof InputSymbol))) { + || (prefix.length() > 0 && prefix.lastSymbol().getBaseSymbol() instanceof InputSymbol == suffix.getActions().firstSymbol() instanceof InputSymbol)) { LOGGER.info(Category.EVENT, "Not adding suffix {} to unmatching row {}", suffix, getPrefix()); return; } @@ -236,8 +235,7 @@ static Row computeRow(TreeOracle oracle, } // unmatching suffix if ((r.getPrefix().length() < 1 && (s.getActions().firstSymbol() instanceof OutputSymbol)) - || (prefix.length() > 0 && !(prefix.lastSymbol().getBaseSymbol() instanceof InputSymbol - ^ s.getActions().firstSymbol() instanceof InputSymbol))) { + || (prefix.length() > 0 && prefix.lastSymbol().getBaseSymbol() instanceof InputSymbol == s.getActions().firstSymbol() instanceof InputSymbol)) { LOGGER.info(Category.EVENT, "Not adding suffix {} to unmatching row {}", s, r.getPrefix()); continue; } diff --git a/src/main/java/de/learnlib/ralib/oracles/Branching.java b/src/main/java/de/learnlib/ralib/oracles/Branching.java index 9b2ecf2f..d8791606 100644 --- a/src/main/java/de/learnlib/ralib/oracles/Branching.java +++ b/src/main/java/de/learnlib/ralib/oracles/Branching.java @@ -28,7 +28,7 @@ */ public interface Branching { - public Map, Expression> getBranches(); + Map, Expression> getBranches(); - public Word transformPrefix(Word prefix); + Word transformPrefix(Word prefix); } diff --git a/src/main/java/de/learnlib/ralib/oracles/SDTLogicOracle.java b/src/main/java/de/learnlib/ralib/oracles/SDTLogicOracle.java index 6fbcb47f..45429fba 100644 --- a/src/main/java/de/learnlib/ralib/oracles/SDTLogicOracle.java +++ b/src/main/java/de/learnlib/ralib/oracles/SDTLogicOracle.java @@ -89,5 +89,5 @@ boolean areEquivalent(Expression guard1, PIV piv1, Expression /** * Returns true if the word leads to an accepting leaf on the SDT. */ - public boolean accepts(Word word, Word prefix, SymbolicDecisionTree sdt, PIV piv); + boolean accepts(Word word, Word prefix, SymbolicDecisionTree sdt, PIV piv); } diff --git a/src/main/java/de/learnlib/ralib/oracles/TreeOracle.java b/src/main/java/de/learnlib/ralib/oracles/TreeOracle.java index a310da52..fa738909 100644 --- a/src/main/java/de/learnlib/ralib/oracles/TreeOracle.java +++ b/src/main/java/de/learnlib/ralib/oracles/TreeOracle.java @@ -43,7 +43,7 @@ public interface TreeOracle { * @param suffix * @return */ - public TreeQueryResult treeQuery( + TreeQueryResult treeQuery( Word prefix, SymbolicSuffix suffix); /** @@ -55,8 +55,8 @@ public TreeQueryResult treeQuery( * @param sdts * @return */ - public Branching getInitialBranching(Word prefix, - ParameterizedSymbol ps, PIV piv, SymbolicDecisionTree ... sdts); + Branching getInitialBranching(Word prefix, + ParameterizedSymbol ps, PIV piv, SymbolicDecisionTree... sdts); /** * Updates and extends an existing Branching @@ -69,13 +69,13 @@ public Branching getInitialBranching(Word prefix, * @param sdts * @return */ - public Branching updateBranching(Word prefix, - ParameterizedSymbol ps, Branching current, - PIV piv, SymbolicDecisionTree ... sdts); + Branching updateBranching(Word prefix, + ParameterizedSymbol ps, Branching current, + PIV piv, SymbolicDecisionTree... sdts); - public Map, Boolean> instantiate(Word prefix, - SymbolicSuffix suffix, SymbolicDecisionTree sdt, PIV piv); + Map, Boolean> instantiate(Word prefix, + SymbolicSuffix suffix, SymbolicDecisionTree sdt, PIV piv); - public SymbolicSuffixRestrictionBuilder getRestrictionBuilder(); + SymbolicSuffixRestrictionBuilder getRestrictionBuilder(); } diff --git a/src/main/java/de/learnlib/ralib/oracles/TreeOracleFactory.java b/src/main/java/de/learnlib/ralib/oracles/TreeOracleFactory.java index c55de396..29bc7e99 100644 --- a/src/main/java/de/learnlib/ralib/oracles/TreeOracleFactory.java +++ b/src/main/java/de/learnlib/ralib/oracles/TreeOracleFactory.java @@ -31,6 +31,6 @@ public interface TreeOracleFactory { * @param hyp * @return */ - public TreeOracle createTreeOracle(RegisterAutomaton hyp); + TreeOracle createTreeOracle(RegisterAutomaton hyp); } diff --git a/src/main/java/de/learnlib/ralib/oracles/io/IOCache.java b/src/main/java/de/learnlib/ralib/oracles/io/IOCache.java index b665d947..9e49f5ce 100644 --- a/src/main/java/de/learnlib/ralib/oracles/io/IOCache.java +++ b/src/main/java/de/learnlib/ralib/oracles/io/IOCache.java @@ -52,7 +52,7 @@ private static class CacheNode { private final IOOracle sul; - private static Logger LOGGER = LoggerFactory.getLogger(IOCache.class); + private static final Logger LOGGER = LoggerFactory.getLogger(IOCache.class); public IOCache(IOOracle sul) { this.sul = sul; diff --git a/src/main/java/de/learnlib/ralib/oracles/io/IOFilter.java b/src/main/java/de/learnlib/ralib/oracles/io/IOFilter.java index 2754f134..960d6837 100644 --- a/src/main/java/de/learnlib/ralib/oracles/io/IOFilter.java +++ b/src/main/java/de/learnlib/ralib/oracles/io/IOFilter.java @@ -44,7 +44,7 @@ public class IOFilter extends QueryCounter implements DataWordOracle { private final DataWordOracle back; - private static Logger LOGGER = LoggerFactory.getLogger(IOFilter.class); + private static final Logger LOGGER = LoggerFactory.getLogger(IOFilter.class); public IOFilter(DataWordOracle back, ParameterizedSymbol ... inputs) { this.inputs = new LinkedHashSet<>(Arrays.asList(inputs)); diff --git a/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheoryBranching.java b/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheoryBranching.java index f91a7d48..700dfe09 100644 --- a/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheoryBranching.java +++ b/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheoryBranching.java @@ -118,7 +118,7 @@ protected SDT buildFakeSDT() { } return SDTLeaf.REJECTING; } - }; + } private final Word prefix; @@ -126,11 +126,11 @@ protected SDT buildFakeSDT() { private final Node node; - private PIV piv; + private final PIV piv; - private Constants constants; + private final Constants constants; - private ParValuation pval; + private final ParValuation pval; public MultiTheoryBranching(Word prefix, ParameterizedSymbol action, Node node, PIV piv, ParValuation pval, Constants constants, SDT... sdts) { @@ -224,7 +224,7 @@ public Map, Expression> getBranches() { if (this.action.getArity() == 0) { // System.out.println("arity 0"); - PSymbolInstance psi = new PSymbolInstance(action, new DataValue[0]); + PSymbolInstance psi = new PSymbolInstance(action); branches.put(prefix.append(psi), ExpressionUtil.TRUE); return branches; } diff --git a/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheorySDTLogicOracle.java b/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheorySDTLogicOracle.java index c0000397..e5e17dfd 100644 --- a/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheorySDTLogicOracle.java +++ b/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheorySDTLogicOracle.java @@ -53,7 +53,7 @@ public class MultiTheorySDTLogicOracle implements SDTLogicOracle { private final Constants consts; - private static Logger LOGGER = LoggerFactory.getLogger(MultiTheorySDTLogicOracle.class); + private static final Logger LOGGER = LoggerFactory.getLogger(MultiTheorySDTLogicOracle.class); public MultiTheorySDTLogicOracle(Constants consts, ConstraintSolver solver) { this.solver = solver; @@ -80,8 +80,7 @@ public boolean hasCounterexample(Word prefix, SymbolicDecisionT VarMapping gremap = new VarMapping<>(); for (Variable sv : ExpressionUtil.freeVariables(exprG)) { - if (sv instanceof Parameter) { - Parameter p = (Parameter) sv; + if (sv instanceof Parameter p) { gremap.put(p, new SuffixValue( p.getDataType(), p.getId())); } } diff --git a/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheoryTreeOracle.java b/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheoryTreeOracle.java index 6a4e71b4..213626d6 100644 --- a/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheoryTreeOracle.java +++ b/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheoryTreeOracle.java @@ -90,7 +90,7 @@ public class MultiTheoryTreeOracle implements TreeOracle, SDTConstructor { private final ConstraintSolver solver; - private static Logger LOGGER = LoggerFactory.getLogger(MultiTheoryTreeOracle.class); + private static final Logger LOGGER = LoggerFactory.getLogger(MultiTheoryTreeOracle.class); public MultiTheoryTreeOracle(DataWordOracle oracle, Map teachers, Constants constants, ConstraintSolver solver) { @@ -297,8 +297,8 @@ private Node createNode(int i, Word prefix, ParameterizedSymbol guardMap.put(dvi, guard); } - LOGGER.trace(Category.QUERY, "guardMap: " + guardMap.toString()); - LOGGER.trace(Category.QUERY, "nextMap: " + nextMap.toString()); + LOGGER.trace(Category.QUERY, "guardMap: " + guardMap); + LOGGER.trace(Category.QUERY, "nextMap: " + nextMap); assert !nextMap.isEmpty(); assert !guardMap.isEmpty(); return new Node(p, nextMap, guardMap); diff --git a/src/main/java/de/learnlib/ralib/oracles/mto/SDT.java b/src/main/java/de/learnlib/ralib/oracles/mto/SDT.java index 4e509afd..30d4ae89 100644 --- a/src/main/java/de/learnlib/ralib/oracles/mto/SDT.java +++ b/src/main/java/de/learnlib/ralib/oracles/mto/SDT.java @@ -56,20 +56,6 @@ public SDT(Map children) { this.children = children; } -// public Set getGuards() { -// if (this instanceof SDTLeaf) { -// return new LinkedHashSet<>(); -// } -// Set guards = new LinkedHashSet<>(); -// for (Map.Entry e : this.children.entrySet()) { -// guards.add(e.getKey()); -// if (!(e.getValue() instanceof SDTLeaf)) { -// guards.addAll(e.getValue().getGuards()); -// } -// } -// return guards; -// } - /** * Returns the registers of this SDT. * @@ -148,8 +134,7 @@ public Set getVariables() { variables.addAll(rSet); } } - } else if (g instanceof IntervalGuard) { - IntervalGuard iGuard = (IntervalGuard) g; + } else if (g instanceof IntervalGuard iGuard) { if (!iGuard.isBiggerGuard()) { variables.add(iGuard.getRightReg()); } @@ -171,7 +156,7 @@ public Set getVariables() { @Override public boolean isAccepting() { if (this instanceof SDTLeaf) { - return ((SDTLeaf) this).isAccepting(); + return this.isAccepting(); } else { for (Map.Entry e : children.entrySet()) { if (!e.getValue().isAccepting()) { @@ -377,7 +362,7 @@ public boolean canUse(SDT other) { } else { boolean accEq = (thisSdt.isAccepting() == other.isAccepting()); boolean chiEq = canPairBranches(thisSdt.getChildren(), - ((SDT) other).getChildren()); + other.getChildren()); return accEq && chiEq; } } @@ -407,27 +392,6 @@ Expression getAcceptingPaths(Constants consts) { return dis; } - Expression getPaths(Constants consts) { - - List> paths = getPaths(new ArrayList()); - if (paths.isEmpty()) { - return ExpressionUtil.FALSE; - } - Expression dis = null; - for (List list : paths) { - List> expr = new ArrayList<>(); - for (SDTGuard g : list) { - expr.add(g.toExpr()); - } - Expression con = ExpressionUtil.and( - expr.toArray(new Expression[] {})); - - dis = (dis == null) ? con : ExpressionUtil.or(dis, con); - } - - return dis; - } - Map, Boolean> getGuardExpressions(Constants consts) { Map, Boolean> expressions = new LinkedHashMap<>(); Map, Boolean> paths = getAllPaths(new ArrayList()); @@ -461,7 +425,6 @@ List> getPaths(List path) { return ret; } - List> getPaths(boolean accepting) { List> collectedPaths = new ArrayList>(); getPaths(accepting, new ArrayList<>(), this, collectedPaths); @@ -495,24 +458,6 @@ Map, Boolean> getAllPaths(List path) { return ret; } - public boolean replaceBranch(SDTGuard guard, SDT from, SDT with) { - for (Map.Entry branch : children.entrySet()) { - if (branch.getKey().equals(guard) && branch.getValue().equals(from)) { - children.put(guard, with); - return true; - } else { - boolean done = branch.getValue().replaceBranch(guard, from, with); - if (done) - return true; - } - } - return false; - } - - public static SDT getFinest(SDT... sdts) { - return findFinest(0, Arrays.asList(sdts), sdts[0]); - } - private static SDT findFinest(int i, List sdts, SDT curr) { i++; if (sdts.size() == i) { diff --git a/src/main/java/de/learnlib/ralib/oracles/mto/SDTConstructor.java b/src/main/java/de/learnlib/ralib/oracles/mto/SDTConstructor.java index db23c87b..2cfe0ea6 100644 --- a/src/main/java/de/learnlib/ralib/oracles/mto/SDTConstructor.java +++ b/src/main/java/de/learnlib/ralib/oracles/mto/SDTConstructor.java @@ -30,7 +30,7 @@ */ public interface SDTConstructor { - public SDT treeQuery( + SDT treeQuery( Word prefix, SymbolicSuffix suffix, WordValuation values, PIV piv, Constants constants, SuffixValuation suffixValues); diff --git a/src/main/java/de/learnlib/ralib/smt/SMTUtil.java b/src/main/java/de/learnlib/ralib/smt/SMTUtil.java index 0bb126ca..529e59ee 100644 --- a/src/main/java/de/learnlib/ralib/smt/SMTUtil.java +++ b/src/main/java/de/learnlib/ralib/smt/SMTUtil.java @@ -19,9 +19,7 @@ public static Valuation compose(Mapping. Valuation val = new Valuation(); //System.out.println(Arrays.toString(varVals)); Arrays.stream(varVals).sequential().flatMap( vv -> vv.entrySet().stream() ).forEach( e -> { - if (val.containsValueFor(e.getKey())) { - assert false; - } + assert !val.containsValueFor(e.getKey()); val.setValue(e.getKey(), e.getValue().getValue()); }); return val; diff --git a/src/main/java/de/learnlib/ralib/sul/CachingSUL.java b/src/main/java/de/learnlib/ralib/sul/CachingSUL.java index a1de75de..f830871c 100644 --- a/src/main/java/de/learnlib/ralib/sul/CachingSUL.java +++ b/src/main/java/de/learnlib/ralib/sul/CachingSUL.java @@ -11,8 +11,8 @@ */ public class CachingSUL extends DataWordSUL{ - private DataWordSUL sul; - private IOCache cache; + private final DataWordSUL sul; + private final IOCache cache; private Word trace; private boolean answerFromCache = false; diff --git a/src/main/java/de/learnlib/ralib/sul/SULOracle.java b/src/main/java/de/learnlib/ralib/sul/SULOracle.java index 38a21757..a50e890b 100644 --- a/src/main/java/de/learnlib/ralib/sul/SULOracle.java +++ b/src/main/java/de/learnlib/ralib/sul/SULOracle.java @@ -41,7 +41,7 @@ public class SULOracle extends IOOracle { private final ParameterizedSymbol error; - private static Logger log = LoggerFactory.getLogger(SULOracle.class); + private static final Logger log = LoggerFactory.getLogger(SULOracle.class); private final Map> replacements = new HashMap<>(); diff --git a/src/main/java/de/learnlib/ralib/sul/SimulatorSUL.java b/src/main/java/de/learnlib/ralib/sul/SimulatorSUL.java index 08a84e43..a4de6299 100644 --- a/src/main/java/de/learnlib/ralib/sul/SimulatorSUL.java +++ b/src/main/java/de/learnlib/ralib/sul/SimulatorSUL.java @@ -64,7 +64,7 @@ public class SimulatorSUL extends DataWordSUL { private VarValuation register = null; private Word prefix = null; - private static Logger LOGGER = LoggerFactory.getLogger(SimulatorSUL.class); + private static final Logger LOGGER = LoggerFactory.getLogger(SimulatorSUL.class); public SimulatorSUL(RegisterAutomaton model, Map teachers, Constants consts) { @@ -91,7 +91,7 @@ public void post() { @Override public PSymbolInstance step(PSymbolInstance i) throws SULException { countInputs(1); - LOGGER.trace(Category.EVENT, "step: {0} from {1} with regs {2}", new Object[] {i, loc, register}); + LOGGER.trace(Category.EVENT, "step: {0} from {1} with regs {2}", i, loc, register); prefix = prefix.append(i); boolean found = false; @@ -128,7 +128,7 @@ private PSymbolInstance createOutputSymbol(OutputTransition ot) { int i = 0; for (DataType t : ps.getPtypes()) { Parameter p = pgen.next(t); - if (!mapping.getOutput().keySet().contains(p)) { + if (!mapping.getOutput().containsKey(p)) { List old = computeOld(t, pval); DataValue dv = teachers.get(t).getFreshValue(old); vals[i] = new FreshValue(dv.getDataType(), dv.getValue()); diff --git a/src/main/java/de/learnlib/ralib/theory/EquivalenceClassFilter.java b/src/main/java/de/learnlib/ralib/theory/EquivalenceClassFilter.java index 467bcd38..35a732ed 100644 --- a/src/main/java/de/learnlib/ralib/theory/EquivalenceClassFilter.java +++ b/src/main/java/de/learnlib/ralib/theory/EquivalenceClassFilter.java @@ -21,7 +21,7 @@ public class EquivalenceClassFilter { private final List equivClasses; - private boolean useOptimization; + private final boolean useOptimization; public EquivalenceClassFilter(List equivClasses, boolean useOptimization) { this.equivClasses = equivClasses; diff --git a/src/main/java/de/learnlib/ralib/theory/FreshSuffixValue.java b/src/main/java/de/learnlib/ralib/theory/FreshSuffixValue.java index 79c3caf7..2bc59b7c 100644 --- a/src/main/java/de/learnlib/ralib/theory/FreshSuffixValue.java +++ b/src/main/java/de/learnlib/ralib/theory/FreshSuffixValue.java @@ -5,7 +5,6 @@ import java.util.Map; import java.util.Set; -import de.learnlib.ralib.automata.guards.Relation; import de.learnlib.ralib.data.SymbolicDataValue; import de.learnlib.ralib.data.SymbolicDataValue.SuffixValue; import gov.nasa.jpf.constraints.api.Expression; diff --git a/src/main/java/de/learnlib/ralib/theory/SDTGuard.java b/src/main/java/de/learnlib/ralib/theory/SDTGuard.java index 3a4e6995..6586257c 100644 --- a/src/main/java/de/learnlib/ralib/theory/SDTGuard.java +++ b/src/main/java/de/learnlib/ralib/theory/SDTGuard.java @@ -49,7 +49,7 @@ public SDTGuard(SuffixValue param) { public abstract Set getComparands(SymbolicDataValue dv); public SDTGuard(SDTGuard other) { - this.parameter = (SuffixValue) SymbolicDataValue.copy(other.parameter); + this.parameter = SymbolicDataValue.copy(other.parameter); } public abstract Expression toExpr(); diff --git a/src/main/java/de/learnlib/ralib/theory/SDTIfGuard.java b/src/main/java/de/learnlib/ralib/theory/SDTIfGuard.java index cb9b34cf..e8d70366 100644 --- a/src/main/java/de/learnlib/ralib/theory/SDTIfGuard.java +++ b/src/main/java/de/learnlib/ralib/theory/SDTIfGuard.java @@ -21,7 +21,6 @@ import java.util.List; import java.util.Set; -import de.learnlib.ralib.automata.guards.Relation; import de.learnlib.ralib.data.SymbolicDataValue; import de.learnlib.ralib.data.SymbolicDataValue.SuffixValue; import de.learnlib.ralib.data.VarMapping; @@ -30,16 +29,11 @@ public abstract class SDTIfGuard extends SDTGuard { protected final SymbolicDataValue register; - protected final Relation relation; public SymbolicDataValue getRegister() { return this.register; } - public Relation getRelation() { - return this.relation; - } - @Override public List unwrap() { List s = new ArrayList(); @@ -47,16 +41,14 @@ public List unwrap() { return s; } - public SDTIfGuard(SuffixValue param, SymbolicDataValue reg, Relation rel) { + protected SDTIfGuard(SuffixValue param, SymbolicDataValue reg) { super(param); - this.relation = rel; this.register = reg; } public SDTIfGuard(SDTIfGuard other) { super(other); register = SymbolicDataValue.copy(other.register); - relation = other.relation; } public abstract SDTIfGuard toDeqGuard(); diff --git a/src/main/java/de/learnlib/ralib/theory/SDTMultiGuard.java b/src/main/java/de/learnlib/ralib/theory/SDTMultiGuard.java index bac20480..42fc492e 100644 --- a/src/main/java/de/learnlib/ralib/theory/SDTMultiGuard.java +++ b/src/main/java/de/learnlib/ralib/theory/SDTMultiGuard.java @@ -120,7 +120,7 @@ public String toString() { if (this.guards.isEmpty()) { return p + "empty"; } - return p + this.guards.toString(); + return p + this.guards; } } diff --git a/src/main/java/de/learnlib/ralib/theory/SDTTrueGuard.java b/src/main/java/de/learnlib/ralib/theory/SDTTrueGuard.java index 8cb8b723..3c8aa211 100644 --- a/src/main/java/de/learnlib/ralib/theory/SDTTrueGuard.java +++ b/src/main/java/de/learnlib/ralib/theory/SDTTrueGuard.java @@ -72,10 +72,7 @@ public boolean equals(Object obj) { if (obj == null) { return false; } - if (getClass() != obj.getClass()) { - return false; - } - return true; + return getClass() == obj.getClass(); } @Override diff --git a/src/main/java/de/learnlib/ralib/theory/SuffixValueRestriction.java b/src/main/java/de/learnlib/ralib/theory/SuffixValueRestriction.java index 75eed2db..8afc9f9c 100644 --- a/src/main/java/de/learnlib/ralib/theory/SuffixValueRestriction.java +++ b/src/main/java/de/learnlib/ralib/theory/SuffixValueRestriction.java @@ -65,9 +65,10 @@ public static SuffixValueRestriction genericRestriction(SuffixValue sv, Word vals); + DataValue getFreshValue(List vals); /** * Implements a tree query for this theory. This tree query @@ -71,7 +71,7 @@ public interface Theory { * * @return a symbolic decision tree and updated piv */ - public SDT treeQuery( + SDT treeQuery( Word prefix, SymbolicSuffix suffix, WordValuation values, @@ -87,7 +87,7 @@ public SDT treeQuery( * @param vals * @return */ - public Collection getAllNextValues(List vals); + Collection getAllNextValues(List vals); /** * TBD @@ -102,15 +102,15 @@ public SDT treeQuery( * @param oldDvs * @return */ - public DataValue instantiate(Word prefix, - ParameterizedSymbol ps, PIV piv, ParValuation pval, - Constants constants, - SDTGuard guard, Parameter param, Set oldDvs); + DataValue instantiate(Word prefix, + ParameterizedSymbol ps, PIV piv, ParValuation pval, + Constants constants, + SDTGuard guard, Parameter param, Set oldDvs); - public SuffixValueRestriction restrictSuffixValue(SuffixValue suffixValue, Word prefix, Word suffix, Constants consts); + SuffixValueRestriction restrictSuffixValue(SuffixValue suffixValue, Word prefix, Word suffix, Constants consts); - public SuffixValueRestriction restrictSuffixValue(SDTGuard guard, Map prior); + SuffixValueRestriction restrictSuffixValue(SDTGuard guard, Map prior); - public boolean guardRevealsRegister(SDTGuard guard, SymbolicDataValue registers); + boolean guardRevealsRegister(SDTGuard guard, SymbolicDataValue registers); } diff --git a/src/main/java/de/learnlib/ralib/theory/equality/DisequalityGuard.java b/src/main/java/de/learnlib/ralib/theory/equality/DisequalityGuard.java index 7752b390..c63e9858 100644 --- a/src/main/java/de/learnlib/ralib/theory/equality/DisequalityGuard.java +++ b/src/main/java/de/learnlib/ralib/theory/equality/DisequalityGuard.java @@ -21,7 +21,6 @@ import java.util.Objects; import java.util.Set; -import de.learnlib.ralib.automata.guards.Relation; import de.learnlib.ralib.data.SymbolicDataValue; import de.learnlib.ralib.data.VarMapping; import de.learnlib.ralib.theory.SDTGuard; @@ -39,7 +38,7 @@ public class DisequalityGuard extends SDTIfGuard { public DisequalityGuard( SymbolicDataValue.SuffixValue param, SymbolicDataValue reg) { - super(param, reg, Relation.NOT_EQUALS); + super(param, reg); } public DisequalityGuard(DisequalityGuard other) { @@ -85,7 +84,6 @@ public int hashCode() { int hash = 5; hash = 59 * hash + Objects.hashCode(this.parameter); hash = 59 * hash + Objects.hashCode(this.register); - hash = 59 * hash + Objects.hashCode(this.relation); hash = 59 * hash + Objects.hashCode(this.getClass()); return hash; @@ -103,9 +101,6 @@ public boolean equals(Object obj) { if (!Objects.equals(this.register, other.register)) { return false; } - if (!Objects.equals(this.relation, other.relation)) { - return false; - } return Objects.equals(this.parameter, other.parameter); } diff --git a/src/main/java/de/learnlib/ralib/theory/equality/EqualRestriction.java b/src/main/java/de/learnlib/ralib/theory/equality/EqualRestriction.java index 343bb345..ed9a0a64 100644 --- a/src/main/java/de/learnlib/ralib/theory/equality/EqualRestriction.java +++ b/src/main/java/de/learnlib/ralib/theory/equality/EqualRestriction.java @@ -4,7 +4,6 @@ import java.util.Objects; import java.util.Set; -import de.learnlib.ralib.automata.guards.Relation; import de.learnlib.ralib.data.SymbolicDataValue; import de.learnlib.ralib.data.SymbolicDataValue.SuffixValue; import de.learnlib.ralib.theory.FreshSuffixValue; @@ -68,9 +67,8 @@ public String toString() { @Override public boolean equals(Object obj) { - if (!(obj instanceof EqualRestriction)) + if (!(obj instanceof EqualRestriction other)) return false; - EqualRestriction other = (EqualRestriction)obj; return super.equals(obj) && equalParam.equals(other.equalParam); } diff --git a/src/main/java/de/learnlib/ralib/theory/equality/EqualityGuard.java b/src/main/java/de/learnlib/ralib/theory/equality/EqualityGuard.java index e7266957..b7dac1c6 100644 --- a/src/main/java/de/learnlib/ralib/theory/equality/EqualityGuard.java +++ b/src/main/java/de/learnlib/ralib/theory/equality/EqualityGuard.java @@ -21,7 +21,6 @@ import java.util.Objects; import java.util.Set; -import de.learnlib.ralib.automata.guards.Relation; import de.learnlib.ralib.data.SymbolicDataValue; import de.learnlib.ralib.data.SymbolicDataValue.SuffixValue; import de.learnlib.ralib.data.VarMapping; @@ -40,7 +39,7 @@ public class EqualityGuard extends SDTIfGuard { public EqualityGuard(SuffixValue param, SymbolicDataValue reg) { - super(param, reg, Relation.EQUALS); + super(param, reg); } public EqualityGuard(EqualityGuard other) { @@ -80,7 +79,6 @@ public int hashCode() { int hash = 5; hash = 59 * hash + Objects.hashCode(parameter); hash = 59 * hash + Objects.hashCode(register); - hash = 59 * hash + Objects.hashCode(relation); hash = 59 * hash + Objects.hashCode(getClass()); return hash; @@ -98,9 +96,6 @@ public boolean equals(Object obj) { if (!Objects.equals(this.register, other.register)) { return false; } - if (!Objects.equals(this.relation, other.relation)) { - return false; - } return Objects.equals(this.parameter, other.parameter); } diff --git a/src/main/java/de/learnlib/ralib/theory/equality/EqualityTheory.java b/src/main/java/de/learnlib/ralib/theory/equality/EqualityTheory.java index 6bfa5e4f..6c2f31f3 100644 --- a/src/main/java/de/learnlib/ralib/theory/equality/EqualityTheory.java +++ b/src/main/java/de/learnlib/ralib/theory/equality/EqualityTheory.java @@ -107,7 +107,7 @@ private Map mergeGuards(Map eqs, SDTAndGuard + "\nSDT : " + eqSdt.toString() + "\nto SDT : " + deqSdt.toString()); List ds = new ArrayList<>(); ds.add(eqGuard); - LOGGER.trace("remapping: " + ds.toString()); + LOGGER.trace("remapping: " + ds); if (!(eqSdt.isEquivalentUnder(deqSdt, ds))) { LOGGER.trace("--> not eq."); deqList.add(eqGuard.toDeqGuard()); @@ -234,7 +234,7 @@ public SDT treeQuery(Word prefix, SymbolicSuffix suffix, WordVa // prepare by picking up the prefix values List prefixValues = Arrays.asList(DataWords.valsOf(prefix)); - LOGGER.trace("prefix list " + prefixValues.toString()); + LOGGER.trace("prefix list " + prefixValues); List diseqList = new ArrayList(); for (DataValue newDv : potential) { @@ -246,7 +246,7 @@ public SDT treeQuery(Word prefix, SymbolicSuffix suffix, WordVa ifSuffixValues.putAll(suffixValues); // copy the suffix valuation EqualityGuard eqGuard = pickupDataValue(newDv, prefixValues, currentParam, values, constants); - LOGGER.trace("eqGuard is: " + eqGuard.toString()); + LOGGER.trace("eqGuard is: " + eqGuard); diseqList.add(new DisequalityGuard(currentParam, eqGuard.getRegister())); // construct the equality guard // find the data value in the prefix @@ -277,7 +277,7 @@ public SDT treeQuery(Word prefix, SymbolicSuffix suffix, WordVa SDT elseOracleSdt = oracle.treeQuery(prefix, suffix, elseValues, pir, constants, elseSuffixValues); SDTAndGuard deqGuard = new SDTAndGuard(currentParam, (diseqList.toArray(new DisequalityGuard[] {}))); - LOGGER.trace("diseq guard = " + deqGuard.toString()); + LOGGER.trace("diseq guard = " + deqGuard); // merge the guards merged = mergeGuards(tempKids, deqGuard, elseOracleSdt); @@ -297,7 +297,7 @@ public SDT treeQuery(Word prefix, SymbolicSuffix suffix, WordVa LOGGER.trace("temporary guards = " + tempKids.keySet()); LOGGER.trace("merged guards = " + merged.keySet()); - LOGGER.trace("merged pivs = " + pir.toString()); + LOGGER.trace("merged pivs = " + pir); // clear the temporary map of children tempKids.clear(); @@ -325,8 +325,8 @@ private EqualityGuard pickupDataValue(DataValue newDv, List prefixVal // first index of the data value in the prefixvalues list newDv_i = prefixValues.indexOf(newDv) + 1; Register newDv_r = new Register(type, newDv_i); - LOGGER.trace("current param = " + currentParam.toString()); - LOGGER.trace("New register = " + newDv_r.toString()); + LOGGER.trace("current param = " + currentParam); + LOGGER.trace("New register = " + newDv_r); return new EqualityGuard(currentParam, newDv_r); } // if the data value isn't in the prefix, @@ -344,20 +344,19 @@ public DataValue instantiate(Word prefix, ParameterizedSymbol p Constants constants, SDTGuard guard, Parameter param, Set oldDvs) { List prefixValues = Arrays.asList(DataWords.valsOf(prefix)); - LOGGER.trace("prefix values : " + prefixValues.toString()); + LOGGER.trace("prefix values : " + prefixValues); DataType type = param.getDataType(); Deque guards = new LinkedList<>(); guards.add(guard); while(!guards.isEmpty()) { SDTGuard current = guards.remove(); - if (current instanceof EqualityGuard) { - LOGGER.trace("equality guard " + current.toString()); - EqualityGuard eqGuard = (EqualityGuard) current; + if (current instanceof EqualityGuard eqGuard) { + LOGGER.trace("equality guard " + current); SymbolicDataValue ereg = eqGuard.getRegister(); if (ereg.isRegister()) { LOGGER.trace("piv: " + piv.toString() - + " " + ereg.toString() + " " + param.toString()); + + " " + ereg + " " + param); Parameter p = piv.getOneKey((Register) ereg); LOGGER.trace("p: " + p.toString()); int idx = p.getId(); @@ -377,7 +376,7 @@ public DataValue instantiate(Word prefix, ParameterizedSymbol p pval.values(type)); if (!potSet.isEmpty()) { - LOGGER.trace("potSet = " + potSet.toString()); + LOGGER.trace("potSet = " + potSet); } else { LOGGER.trace("potSet is empty"); } diff --git a/src/main/java/de/learnlib/ralib/theory/equality/UniqueEqualityTheory.java b/src/main/java/de/learnlib/ralib/theory/equality/UniqueEqualityTheory.java index 364fda8b..6bb345b3 100644 --- a/src/main/java/de/learnlib/ralib/theory/equality/UniqueEqualityTheory.java +++ b/src/main/java/de/learnlib/ralib/theory/equality/UniqueEqualityTheory.java @@ -86,13 +86,13 @@ public DataValue instantiate(Word prefix, ParameterizedSymbol p Constants constants, SDTGuard guard, SymbolicDataValue.Parameter param, Set oldDvs) { List prefixValues = Arrays.asList(DataWords.valsOf(prefix)); - LOGGER.trace(Category.QUERY, "prefix values : {}", prefixValues.toString()); + LOGGER.trace(Category.QUERY, "prefix values : {}", prefixValues); DataType type = param.getDataType(); Collection potSet = DataWords.joinValsToSet(constants.values(type), DataWords.valSet(prefix, type), pval.values(type)); if (!potSet.isEmpty()) { - LOGGER.trace(Category.DATASTRUCTURE, "potSet = {}", potSet.toString()); + LOGGER.trace(Category.DATASTRUCTURE, "potSet = {}", potSet); } else { LOGGER.trace(Category.DATASTRUCTURE, "potSet is empty"); } diff --git a/src/main/java/de/learnlib/ralib/theory/inequality/InequalityTheoryWithEq.java b/src/main/java/de/learnlib/ralib/theory/inequality/InequalityTheoryWithEq.java index 66f888c6..1b5eff01 100644 --- a/src/main/java/de/learnlib/ralib/theory/inequality/InequalityTheoryWithEq.java +++ b/src/main/java/de/learnlib/ralib/theory/inequality/InequalityTheoryWithEq.java @@ -165,9 +165,8 @@ private void addSafely(Collection guards, SDTGuard guard, List guards, SDTGuard guard, List guards, SDTGuard guard, List guards, Collection prohibited) { for (SDTGuard p : prohibited) { - if (guards.contains(p)) { - guards.remove(p); - } + guards.remove(p); } //System.out.println("guards after removing " + prohibited + " :: " + guards); } @@ -247,10 +243,9 @@ private List> mergeOneWithSet(List> inAndOut, SDTGua prohibited.add(target); processed = true; } - } else if (target instanceof IntervalGuard) { + } else if (target instanceof IntervalGuard iGuard) { // System.out.println(target + " is iGuard"); // if it is an interval guard, check if the set contains flipped - IntervalGuard iGuard = (IntervalGuard) target; if (!iGuard.isIntervalGuard()) { IntervalGuard flipped = iGuard.flip(); // System.out.println("flipped: " + flipped); @@ -540,8 +535,7 @@ private Map, SDT> modGuardLists(SDTGuard refGuard, SDT refSDT, Ma //newParMap.put(newHeadList, newSDT); } - if (refGuard instanceof IntervalGuard && !merged) { - IntervalGuard iRefGuard = (IntervalGuard) refGuard; + if (refGuard instanceof IntervalGuard iRefGuard && !merged) { if (!iRefGuard.isIntervalGuard()) { EqualityGuard eqGuard = iRefGuard.toEqGuard(); if (newHeadList.contains(eqGuard)) { @@ -654,7 +648,7 @@ private Map, SDT> partitionGuards(Map refMap) { private SDT getJoinedSDT(EqualityGuard guard, SDT deqSDT, SDT eqSDT) { //boolean canJoin = false; - EqualityGuard eqGuard = (EqualityGuard) guard; + EqualityGuard eqGuard = guard; List ds = new ArrayList(); ds.add(eqGuard); // System.out.println("checking if T" + deqSDT + " is eq to O" + eqSDT + " under " + eqGuard); @@ -815,8 +809,7 @@ private PIV keepMem(Map guardMap) { if (r instanceof Register) { ret.put(p, (Register) r); } - } else if (mg instanceof IntervalGuard) { - IntervalGuard iGuard = (IntervalGuard) mg; + } else if (mg instanceof IntervalGuard iGuard) { if (!iGuard.isBiggerGuard()) { SymbolicDataValue r = iGuard.getRightReg(); Parameter p = new Parameter(r.getDataType(), r.getId()); @@ -1169,8 +1162,7 @@ public DataValue instantiate( // LOGGER.trace("prefix values : " + prefixValues.toString()); - if (guard instanceof EqualityGuard) { - EqualityGuard eqGuard = (EqualityGuard) guard; + if (guard instanceof EqualityGuard eqGuard) { SymbolicDataValue ereg = eqGuard.getRegister(); if (ereg.isRegister()) { // LOGGER.trace("piv: " + piv.toString() + " " + ereg.toString() + " " + param.toString()); @@ -1180,9 +1172,9 @@ public DataValue instantiate( returnThis = prefixValues.get(idx - 1); } else if (ereg.isSuffixValue()) { Parameter p = new Parameter(type, ereg.getId()); - returnThis = (DataValue) pval.get(p); + returnThis = pval.get(p); } else if (ereg.isConstant()) { - returnThis = (DataValue) constants.get((SymbolicDataValue.Constant) ereg); + returnThis = constants.get((SymbolicDataValue.Constant) ereg); } } else if (guard instanceof SDTTrueGuard || guard instanceof DisequalityGuard) { diff --git a/src/main/java/de/learnlib/ralib/theory/inequality/IntervalGuard.java b/src/main/java/de/learnlib/ralib/theory/inequality/IntervalGuard.java index d371706d..80839654 100644 --- a/src/main/java/de/learnlib/ralib/theory/inequality/IntervalGuard.java +++ b/src/main/java/de/learnlib/ralib/theory/inequality/IntervalGuard.java @@ -24,7 +24,6 @@ import java.util.Objects; import java.util.Set; -import de.learnlib.ralib.automata.guards.Relation; import de.learnlib.ralib.data.SymbolicDataValue; import de.learnlib.ralib.data.SymbolicDataValue.SuffixValue; import de.learnlib.ralib.data.VarMapping; @@ -113,9 +112,9 @@ public String toString() { return "(" + this.getParameter().toString() + "<" + this.rightLimit.toString() + ")"; } if (rightLimit == null) { - return "(" + this.getParameter().toString() + ">" + this.leftLimit.toString() + ")"; + return "(" + this.getParameter().toString() + ">" + this.leftLimit + ")"; } - return "(" + leftLimit.toString() + "<" + this.getParameter().toString() + "<" + this.rightLimit.toString() + ")"; + return "(" + leftLimit + "<" + this.getParameter().toString() + "<" + this.rightLimit + ")"; } public Set getAllRegs() { @@ -268,12 +267,11 @@ public Set mergeWith(SDTGuard other, List regPotent Set guards = new LinkedHashSet<>(); if (other instanceof IntervalGuard) { guards.addAll(this.mergeIntervals((IntervalGuard) other)); - } else if (other instanceof DisequalityGuard) { - DisequalityGuard dGuard = (DisequalityGuard) other; + } else if (other instanceof DisequalityGuard dGuard) { if ((this.isBiggerGuard() && this.leftLimit.equals(dGuard.getRegister())) || (this.isSmallerGuard() && this.rightLimit.equals(dGuard.getRegister()))) { - guards.add((DisequalityGuard) other); + guards.add(other); } else { guards.add(this); @@ -365,7 +363,7 @@ public boolean equals(Object obj) { @Override public List unwrap() { - return Collections.singletonList((SDTGuard) this); + return Collections.singletonList(this); } @Override diff --git a/src/main/java/de/learnlib/ralib/tools/IOSimulator.java b/src/main/java/de/learnlib/ralib/tools/IOSimulator.java index d9992c72..1e75efad 100644 --- a/src/main/java/de/learnlib/ralib/tools/IOSimulator.java +++ b/src/main/java/de/learnlib/ralib/tools/IOSimulator.java @@ -173,7 +173,7 @@ public void setup(Configuration config) throws ConfigurationException { } final ParameterizedSymbol ERROR - = new OutputSymbol("_io_err", new DataType[]{}); + = new OutputSymbol("_io_err"); IOOracle back = new SULOracle(sulLearn, ERROR); IOCache ioCache = new IOCache(back); diff --git a/src/main/java/de/learnlib/ralib/tools/RaLibTool.java b/src/main/java/de/learnlib/ralib/tools/RaLibTool.java index c0aa491f..eff1b368 100644 --- a/src/main/java/de/learnlib/ralib/tools/RaLibTool.java +++ b/src/main/java/de/learnlib/ralib/tools/RaLibTool.java @@ -25,12 +25,12 @@ */ public interface RaLibTool { - public String description(); + String description(); - public String help(); + String help(); - public void setup(Configuration config) throws ConfigurationException; + void setup(Configuration config) throws ConfigurationException; - public void run() throws RaLibToolException; + void run() throws RaLibToolException; } diff --git a/src/main/java/de/learnlib/ralib/tools/classanalyzer/ClasssAnalyzerDataWordSUL.java b/src/main/java/de/learnlib/ralib/tools/classanalyzer/ClasssAnalyzerDataWordSUL.java index f8f8f1c3..c9ff222b 100644 --- a/src/main/java/de/learnlib/ralib/tools/classanalyzer/ClasssAnalyzerDataWordSUL.java +++ b/src/main/java/de/learnlib/ralib/tools/classanalyzer/ClasssAnalyzerDataWordSUL.java @@ -103,8 +103,7 @@ public PSymbolInstance step(PSymbolInstance i) throws SULException { try { ret = act.invoke(sul, params); } catch (Throwable ex) { - if (ex instanceof InvocationTargetException) { - InvocationTargetException iex = (InvocationTargetException) ex; + if (ex instanceof InvocationTargetException iex) { return new PSymbolInstance(new SpecialSymbols.ErrorSymbol( iex.getTargetException())); } else { diff --git a/src/main/java/de/learnlib/ralib/tools/classanalyzer/SpecialSymbols.java b/src/main/java/de/learnlib/ralib/tools/classanalyzer/SpecialSymbols.java index b3a6a86c..d4ae0a36 100644 --- a/src/main/java/de/learnlib/ralib/tools/classanalyzer/SpecialSymbols.java +++ b/src/main/java/de/learnlib/ralib/tools/classanalyzer/SpecialSymbols.java @@ -52,7 +52,7 @@ public boolean equals(Object obj) { } return getClass() == obj.getClass(); } - }; + } public static final ErrorSymbol ERROR = new ErrorSymbol(new Exception("__dummy")); diff --git a/src/main/java/de/learnlib/ralib/tools/classanalyzer/TypedTheory.java b/src/main/java/de/learnlib/ralib/tools/classanalyzer/TypedTheory.java index 7a446202..1a2ad985 100644 --- a/src/main/java/de/learnlib/ralib/tools/classanalyzer/TypedTheory.java +++ b/src/main/java/de/learnlib/ralib/tools/classanalyzer/TypedTheory.java @@ -26,9 +26,9 @@ */ public interface TypedTheory extends Theory { - public void setType(DataType type); + void setType(DataType type); - public void setUseSuffixOpt(boolean useit); + void setUseSuffixOpt(boolean useit); - public void setCheckForFreshOutputs(boolean doit, IOOracle oracle); + void setCheckForFreshOutputs(boolean doit, IOOracle oracle); } diff --git a/src/main/java/de/learnlib/ralib/tools/config/ConfigurationOption.java b/src/main/java/de/learnlib/ralib/tools/config/ConfigurationOption.java index 06605634..7e2e0aa1 100644 --- a/src/main/java/de/learnlib/ralib/tools/config/ConfigurationOption.java +++ b/src/main/java/de/learnlib/ralib/tools/config/ConfigurationOption.java @@ -62,7 +62,7 @@ public boolean isOptional() { @Override public String toString() { - return "" + this.key + (optional ? "(optional)" : "") + ": " + this.description + + return this.key + (optional ? "(optional)" : "") + ": " + this.description + (optional ? ", default: " + this.defaultValue : ""); } @@ -84,7 +84,7 @@ public Boolean parse(Configuration c) throws ConfigurationException { } String value = c.getProperty(getKey()); - return !value.toLowerCase().equals("false"); + return !value.equalsIgnoreCase("false"); } } diff --git a/src/main/java/de/learnlib/ralib/tools/theories/DoubleInequalityTheory.java b/src/main/java/de/learnlib/ralib/tools/theories/DoubleInequalityTheory.java index cf3061c2..e1fa18cb 100644 --- a/src/main/java/de/learnlib/ralib/tools/theories/DoubleInequalityTheory.java +++ b/src/main/java/de/learnlib/ralib/tools/theories/DoubleInequalityTheory.java @@ -106,17 +106,16 @@ private List> instantiateGuard(SDTGuard g, Valuation val) { // pick up the register SymbolicDataValue si = ((SDTIfGuard) g).getRegister(); // get the register value from the valuation - DataValue sdi = new DataValue(type, (BigDecimal) val.getValue(si)); + DataValue sdi = new DataValue(type, val.getValue(si)); // add the register value as a constant gov.nasa.jpf.constraints.expressions.Constant wm = new gov.nasa.jpf.constraints.expressions.Constant(BuiltinTypes.DECIMAL, (sdi.getValue())); // add the constant equivalence expression to the list eList.add(new NumericBooleanExpression(wm, NumericComparator.EQ, si)); - } else if (g instanceof IntervalGuard) { - IntervalGuard iGuard = (IntervalGuard) g; + } else if (g instanceof IntervalGuard iGuard) { if (!iGuard.isBiggerGuard()) { SymbolicDataValue r = iGuard.getRightReg(); - DataValue ri = new DataValue(type, (BigDecimal) val.getValue(r)); + DataValue ri = new DataValue(type, val.getValue(r)); gov.nasa.jpf.constraints.expressions.Constant wm = new gov.nasa.jpf.constraints.expressions.Constant(BuiltinTypes.DECIMAL, (ri.getValue())); // add the constant equivalence expression to the list eList.add(new NumericBooleanExpression(wm, NumericComparator.EQ, r)); @@ -124,7 +123,7 @@ private List> instantiateGuard(SDTGuard g, Valuation val) { } if (!iGuard.isSmallerGuard()) { SymbolicDataValue l = iGuard.getLeftReg(); - DataValue li = new DataValue(type, (BigDecimal) val.getValue(l)); + DataValue li = new DataValue(type, val.getValue(l)); gov.nasa.jpf.constraints.expressions.Constant wm = new gov.nasa.jpf.constraints.expressions.Constant(BuiltinTypes.DECIMAL, (li.getValue())); // add the constant equivalence expression to the list eList.add(new NumericBooleanExpression(wm, NumericComparator.EQ, l)); @@ -167,7 +166,7 @@ public DataValue instantiate(SDTGuard g, Valuation val, Constants c, Collection< } if (newVal.containsValueFor(sp)) { - DataValue spDouble = new DataValue(type, (BigDecimal)newVal.getValue(sp)); + DataValue spDouble = new DataValue(type, newVal.getValue(sp)); gov.nasa.jpf.constraints.expressions.Constant spw = new gov.nasa.jpf.constraints.expressions.Constant(BuiltinTypes.DECIMAL, (spDouble.getValue())); Expression spExpr = new NumericBooleanExpression(spw, NumericComparator.EQ, sp); eList.add(spExpr); @@ -184,7 +183,7 @@ public DataValue instantiate(SDTGuard g, Valuation val, Constants c, Collection< if (res == Result.SAT) { // System.out.println("SAT!!"); // System.out.println(newVal.getValue(sp.toVariable()) + " " + newVal.getValue(sp.toVariable()).getClass()); - DataValue d = new DataValue(type, (BigDecimal)(newVal.getValue(sp))); + DataValue d = new DataValue(type, newVal.getValue(sp)); //System.out.println("return d: " + d.toString()); return d;//new DataValue(doubleType, d); } else { diff --git a/src/main/java/de/learnlib/ralib/words/PSymbolInstance.java b/src/main/java/de/learnlib/ralib/words/PSymbolInstance.java index cd1b59c7..0b44858b 100644 --- a/src/main/java/de/learnlib/ralib/words/PSymbolInstance.java +++ b/src/main/java/de/learnlib/ralib/words/PSymbolInstance.java @@ -17,6 +17,7 @@ package de.learnlib.ralib.words; import java.util.Arrays; +import java.util.Objects; import de.learnlib.ralib.data.DataValue; @@ -65,7 +66,7 @@ public boolean equals(Object obj) { return false; } final PSymbolInstance other = (PSymbolInstance) obj; - if (this.baseSymbol != other.baseSymbol && (this.baseSymbol == null || !this.baseSymbol.equals(other.baseSymbol))) { + if (!Objects.equals(this.baseSymbol, other.baseSymbol)) { return false; } return Arrays.deepEquals(this.parameterValues, other.parameterValues); diff --git a/src/main/java/de/learnlib/ralib/words/ParameterizedSymbol.java b/src/main/java/de/learnlib/ralib/words/ParameterizedSymbol.java index 46e8a63c..4cf72f8d 100644 --- a/src/main/java/de/learnlib/ralib/words/ParameterizedSymbol.java +++ b/src/main/java/de/learnlib/ralib/words/ParameterizedSymbol.java @@ -17,6 +17,7 @@ package de.learnlib.ralib.words; import java.util.Arrays; +import java.util.Objects; import de.learnlib.ralib.data.DataType; @@ -60,7 +61,7 @@ public boolean equals(Object obj) { return false; } final ParameterizedSymbol other = (ParameterizedSymbol) obj; - if ((this.name == null) ? (other.name != null) : !this.name.equals(other.name)) { + if (!Objects.equals(this.name, other.name)) { return false; } return Arrays.deepEquals(this.ptypes, other.ptypes); diff --git a/src/test/java/de/learnlib/ralib/CacheDataWordOracle.java b/src/test/java/de/learnlib/ralib/CacheDataWordOracle.java index 89da9cbc..c03ac7f8 100644 --- a/src/test/java/de/learnlib/ralib/CacheDataWordOracle.java +++ b/src/test/java/de/learnlib/ralib/CacheDataWordOracle.java @@ -19,7 +19,7 @@ */ public class CacheDataWordOracle extends QueryCounter implements DataWordOracle { - private static Logger LOGGER = LoggerFactory.getLogger(CacheDataWordOracle.class); + private static final Logger LOGGER = LoggerFactory.getLogger(CacheDataWordOracle.class); private static class CacheNode { final Map next = new LinkedHashMap<>(); @@ -27,7 +27,7 @@ private static class CacheNode { } private final CacheNode root = new CacheNode(); - private DataWordOracle oracle; + private final DataWordOracle oracle; public CacheDataWordOracle(DataWordOracle oracle) { this.oracle = oracle; diff --git a/src/test/java/de/learnlib/ralib/RaLibLearningExperimentRunner.java b/src/test/java/de/learnlib/ralib/RaLibLearningExperimentRunner.java index 33f9606f..cbe54f25 100644 --- a/src/test/java/de/learnlib/ralib/RaLibLearningExperimentRunner.java +++ b/src/test/java/de/learnlib/ralib/RaLibLearningExperimentRunner.java @@ -36,7 +36,7 @@ public class RaLibLearningExperimentRunner { private long seed; - private Logger logger; + private final Logger logger; /** * RA Learning Algorithm default settings @@ -150,7 +150,7 @@ public Hypothesis run(RaLearningAlgorithmName algorithmName, DataWordOracle data } int check = 0; - while (true && check < 100) { + while (check < 100) { check++; learner.learn(); Hypothesis hyp = learner.getHypothesis(); diff --git a/src/test/java/de/learnlib/ralib/RaLibTestSuite.java b/src/test/java/de/learnlib/ralib/RaLibTestSuite.java index a1956612..63ebddb0 100644 --- a/src/test/java/de/learnlib/ralib/RaLibTestSuite.java +++ b/src/test/java/de/learnlib/ralib/RaLibTestSuite.java @@ -34,7 +34,7 @@ public abstract class RaLibTestSuite { protected final ParameterizedSymbol ERROR = - new OutputSymbol("_io_err", new DataType[]{}); + new OutputSymbol("_io_err"); protected static final Logger logger = Logger.getLogger("UnitTest"); diff --git a/src/test/java/de/learnlib/ralib/RandomWalk.java b/src/test/java/de/learnlib/ralib/RandomWalk.java index 9e119e56..c81508ba 100644 --- a/src/test/java/de/learnlib/ralib/RandomWalk.java +++ b/src/test/java/de/learnlib/ralib/RandomWalk.java @@ -27,15 +27,15 @@ */ public class RandomWalk implements IOEquivalenceOracle { - private Map teachers; - private Random rand; - private long maxRuns; + private final Map teachers; + private final Random rand; + private final long maxRuns; private int depth = 10; private double resetProbability = 0.1; private double freshProbability = 0.5; - private List symbols; - private DataWordOracle wordOracle; - private Constants consts; + private final List symbols; + private final DataWordOracle wordOracle; + private final Constants consts; public RandomWalk(Random rand, DataWordOracle membershipOracle, double resetProbability, double newDataProbability, long maxRuns, int maxDepth, Map teachers, Constants consts, diff --git a/src/test/java/de/learnlib/ralib/automata/KeygenAutomatonTest.java b/src/test/java/de/learnlib/ralib/automata/KeygenAutomatonTest.java index f20e1df8..b335e3da 100644 --- a/src/test/java/de/learnlib/ralib/automata/KeygenAutomatonTest.java +++ b/src/test/java/de/learnlib/ralib/automata/KeygenAutomatonTest.java @@ -61,61 +61,61 @@ public void testHasTrace() { Assert.assertTrue(ra.accepts(test1)); Word test2 = Word.epsilon(); - test2 = test2.append(new PSymbolInstance(I_PUT, new DataValue[] { new DataValue(T_VAL, BigDecimal.ONE)} )); - test2 = test2.append(new PSymbolInstance(O_PUT, new DataValue[] { new DataValue(T_KEY, BigDecimal.ONE) })); + test2 = test2.append(new PSymbolInstance(I_PUT, new DataValue(T_VAL, BigDecimal.ONE))); + test2 = test2.append(new PSymbolInstance(O_PUT, new DataValue(T_KEY, BigDecimal.ONE))); logger.log(Level.FINE, "test2: {0}", test2); Assert.assertTrue(ra.accepts(test2)); Word test3 = Word.epsilon(); - test3 = test3.append(new PSymbolInstance(I_PUT, new DataValue[] { new DataValue(T_VAL, BigDecimal.ONE)} )); - test3 = test3.append(new PSymbolInstance(O_PUT, new DataValue[] { new DataValue(T_KEY, BigDecimal.ONE) })); - test3 = test3.append(new PSymbolInstance(I_GET, new DataValue[] { new DataValue(T_KEY, BigDecimal.ONE)} )); - test3 = test3.append(new PSymbolInstance(O_GET, new DataValue[] { new DataValue(T_VAL, BigDecimal.ONE) })); + test3 = test3.append(new PSymbolInstance(I_PUT, new DataValue(T_VAL, BigDecimal.ONE))); + test3 = test3.append(new PSymbolInstance(O_PUT, new DataValue(T_KEY, BigDecimal.ONE))); + test3 = test3.append(new PSymbolInstance(I_GET, new DataValue(T_KEY, BigDecimal.ONE))); + test3 = test3.append(new PSymbolInstance(O_GET, new DataValue(T_VAL, BigDecimal.ONE))); logger.log(Level.FINE, "test3: {0}", test3); Assert.assertTrue(ra.accepts(test3)); Word test4 = Word.epsilon(); - test4 = test4.append(new PSymbolInstance(I_PUT, new DataValue[] { new DataValue(T_VAL, BigDecimal.ONE)} )); - test4 = test4.append(new PSymbolInstance(O_PUT, new DataValue[] { new DataValue(T_KEY, BigDecimal.ONE) })); - test4 = test4.append(new PSymbolInstance(I_GET, new DataValue[] { new DataValue(T_KEY, new BigDecimal(2))} )); - test4 = test4.append(new PSymbolInstance(O_NULL, new DataValue[] { })); + test4 = test4.append(new PSymbolInstance(I_PUT, new DataValue(T_VAL, BigDecimal.ONE))); + test4 = test4.append(new PSymbolInstance(O_PUT, new DataValue(T_KEY, BigDecimal.ONE))); + test4 = test4.append(new PSymbolInstance(I_GET, new DataValue(T_KEY, new BigDecimal(2)))); + test4 = test4.append(new PSymbolInstance(O_NULL)); logger.log(Level.FINE, "test4: {0}", test4); Assert.assertTrue(ra.accepts(test4)); Word test5 = Word.epsilon(); - test5 = test5.append(new PSymbolInstance(I_PUT, new DataValue[] { new DataValue(T_VAL, BigDecimal.ONE)} )); - test5 = test5.append(new PSymbolInstance(O_PUT, new DataValue[] { new DataValue(T_KEY, BigDecimal.ONE) })); - test5 = test5.append(new PSymbolInstance(I_PUT, new DataValue[] { new DataValue(T_VAL, new BigDecimal(2))} )); - test5 = test5.append(new PSymbolInstance(O_PUT, new DataValue[] { new DataValue(T_KEY, new BigDecimal(2)) })); - test5 = test5.append(new PSymbolInstance(I_GET, new DataValue[] { new DataValue(T_KEY, BigDecimal.ONE)} )); - test5 = test5.append(new PSymbolInstance(O_GET, new DataValue[] { new DataValue(T_VAL, BigDecimal.ONE) })); - test5 = test5.append(new PSymbolInstance(I_GET, new DataValue[] { new DataValue(T_KEY, new BigDecimal(2))} )); - test5 = test5.append(new PSymbolInstance(O_GET, new DataValue[] { new DataValue(T_VAL, new BigDecimal(2)) })); + test5 = test5.append(new PSymbolInstance(I_PUT, new DataValue(T_VAL, BigDecimal.ONE))); + test5 = test5.append(new PSymbolInstance(O_PUT, new DataValue(T_KEY, BigDecimal.ONE))); + test5 = test5.append(new PSymbolInstance(I_PUT, new DataValue(T_VAL, new BigDecimal(2)))); + test5 = test5.append(new PSymbolInstance(O_PUT, new DataValue(T_KEY, new BigDecimal(2)))); + test5 = test5.append(new PSymbolInstance(I_GET, new DataValue(T_KEY, BigDecimal.ONE))); + test5 = test5.append(new PSymbolInstance(O_GET, new DataValue(T_VAL, BigDecimal.ONE))); + test5 = test5.append(new PSymbolInstance(I_GET, new DataValue(T_KEY, new BigDecimal(2)))); + test5 = test5.append(new PSymbolInstance(O_GET, new DataValue(T_VAL, new BigDecimal(2)))); logger.log(Level.FINE, "test5: {0}", test5); Assert.assertTrue(ra.accepts(test5)); Word test6 = Word.epsilon(); - test6 = test6.append(new PSymbolInstance(I_PUT, new DataValue[] { new DataValue(T_VAL, BigDecimal.ONE)} )); - test6 = test6.append(new PSymbolInstance(O_PUT, new DataValue[] { new DataValue(T_KEY, BigDecimal.ONE) })); - test6 = test6.append(new PSymbolInstance(I_PUT, new DataValue[] { new DataValue(T_VAL, new BigDecimal(2))} )); - test6 = test6.append(new PSymbolInstance(O_PUT, new DataValue[] { new DataValue(T_KEY, new BigDecimal(2)) })); - test6 = test6.append(new PSymbolInstance(I_GET, new DataValue[] { new DataValue(T_KEY, new BigDecimal(3))} )); + test6 = test6.append(new PSymbolInstance(I_PUT, new DataValue(T_VAL, BigDecimal.ONE))); + test6 = test6.append(new PSymbolInstance(O_PUT, new DataValue(T_KEY, BigDecimal.ONE))); + test6 = test6.append(new PSymbolInstance(I_PUT, new DataValue(T_VAL, new BigDecimal(2)))); + test6 = test6.append(new PSymbolInstance(O_PUT, new DataValue(T_KEY, new BigDecimal(2)))); + test6 = test6.append(new PSymbolInstance(I_GET, new DataValue(T_KEY, new BigDecimal(3)))); logger.log(Level.FINE, "test6: {0}", test6); - Assert.assertTrue(!ra.accepts(test6)); + Assert.assertFalse(ra.accepts(test6)); Word test7 = Word.epsilon(); - test7 = test7.append(new PSymbolInstance(I_PUT, new DataValue[] { new DataValue(T_VAL, BigDecimal.ONE)} )); - test7 = test7.append(new PSymbolInstance(O_PUT, new DataValue[] { new DataValue(T_KEY, BigDecimal.ONE) })); - test7 = test7.append(new PSymbolInstance(I_PUT, new DataValue[] { new DataValue(T_VAL, new BigDecimal(2))} )); - test7 = test7.append(new PSymbolInstance(O_PUT, new DataValue[] { new DataValue(T_KEY, BigDecimal.ONE) })); + test7 = test7.append(new PSymbolInstance(I_PUT, new DataValue(T_VAL, BigDecimal.ONE))); + test7 = test7.append(new PSymbolInstance(O_PUT, new DataValue(T_KEY, BigDecimal.ONE))); + test7 = test7.append(new PSymbolInstance(I_PUT, new DataValue(T_VAL, new BigDecimal(2)))); + test7 = test7.append(new PSymbolInstance(O_PUT, new DataValue(T_KEY, BigDecimal.ONE))); logger.log(Level.FINE, "test7: {0}", test7); - Assert.assertTrue(!ra.accepts(test7)); + Assert.assertFalse(ra.accepts(test7)); } @BeforeClass diff --git a/src/test/java/de/learnlib/ralib/automata/LoginAutomatonTest.java b/src/test/java/de/learnlib/ralib/automata/LoginAutomatonTest.java index dabf36fc..8c9384f7 100644 --- a/src/test/java/de/learnlib/ralib/automata/LoginAutomatonTest.java +++ b/src/test/java/de/learnlib/ralib/automata/LoginAutomatonTest.java @@ -50,19 +50,15 @@ public void testHasTrace() { Assert.assertFalse(ra.accepts(test1)); Word test2 = Word.epsilon(); - test2 = test2.append(new PSymbolInstance(I_REGISTER, new DataValue[] { - new DataValue(T_UID, BigDecimal.ONE), new DataValue(T_PWD, new BigDecimal(2) )})); - test2 = test2.append(new PSymbolInstance(I_LOGIN, new DataValue[] { - new DataValue(T_UID, BigDecimal.ONE), new DataValue(T_PWD, new BigDecimal(2) )})); + test2 = test2.append(new PSymbolInstance(I_REGISTER, new DataValue(T_UID, BigDecimal.ONE), new DataValue(T_PWD, new BigDecimal(2) ))); + test2 = test2.append(new PSymbolInstance(I_LOGIN, new DataValue(T_UID, BigDecimal.ONE), new DataValue(T_PWD, new BigDecimal(2) ))); logger.log(Level.FINE, "test2: {0}", test2); Assert.assertTrue(ra.accepts(test2)); Word test3 = Word.epsilon(); - test3 = test3.append(new PSymbolInstance(I_REGISTER, new DataValue[] { - new DataValue(T_UID, BigDecimal.ONE), new DataValue(T_PWD, new BigDecimal(2) )})); - test3 = test3.append(new PSymbolInstance(I_LOGIN, new DataValue[] { - new DataValue(T_UID, BigDecimal.ONE), new DataValue(T_PWD, new BigDecimal(3) )})); + test3 = test3.append(new PSymbolInstance(I_REGISTER, new DataValue(T_UID, BigDecimal.ONE), new DataValue(T_PWD, new BigDecimal(2) ))); + test3 = test3.append(new PSymbolInstance(I_LOGIN, new DataValue(T_UID, BigDecimal.ONE), new DataValue(T_PWD, new BigDecimal(3) ))); logger.log(Level.FINE, "test3: {0}", test3); Assert.assertFalse(ra.accepts(test3)); diff --git a/src/test/java/de/learnlib/ralib/automata/xml/OutputTest.java b/src/test/java/de/learnlib/ralib/automata/xml/OutputTest.java index f38d2364..9f005a56 100644 --- a/src/test/java/de/learnlib/ralib/automata/xml/OutputTest.java +++ b/src/test/java/de/learnlib/ralib/automata/xml/OutputTest.java @@ -70,21 +70,21 @@ public void testModelswithOutput() { DataType intType = TestUtil.getType("int", loader.getDataTypes()); ParameterizedSymbol inv = new InputSymbol( - "IINVITE", new DataType[] {intType}); + "IINVITE", intType); ParameterizedSymbol o100 = new OutputSymbol( - "O100", new DataType[] {intType}); + "O100", intType); DataValue d0 = new DataValue(intType, BigDecimal.ZERO); DataValue d1 = new DataValue(intType, BigDecimal.ONE); Word test1 = Word.fromSymbols( - new PSymbolInstance(inv, new DataValue[] {d0}), - new PSymbolInstance(o100, new DataValue[] {d0})); + new PSymbolInstance(inv, d0), + new PSymbolInstance(o100, d0)); Word test2 = Word.fromSymbols( - new PSymbolInstance(inv, new DataValue[] {d0}), - new PSymbolInstance(o100, new DataValue[] {d1})); + new PSymbolInstance(inv, d0), + new PSymbolInstance(o100, d1)); logger.log(Level.FINE, "Test 1: {0}", test1); logger.log(Level.FINE, "Test 2: {0}", test2); diff --git a/src/test/java/de/learnlib/ralib/dt/DTTest.java b/src/test/java/de/learnlib/ralib/dt/DTTest.java index 261dbb7e..fbf9ceda 100644 --- a/src/test/java/de/learnlib/ralib/dt/DTTest.java +++ b/src/test/java/de/learnlib/ralib/dt/DTTest.java @@ -172,9 +172,9 @@ public void siftTest() { DTLeaf leafPush1Pop2 = dt.sift(prePush1Pop2, true); DTLeaf leafPushPushPop = dt.sift(prePushPushPop, true); - Assert.assertTrue(leafPush1Pop1.getAccessSequence().equals(accessEps)); - Assert.assertTrue(leafPush1Pop2.getAccessSequence().equals(accessPop)); - Assert.assertTrue(leafPushPushPop.getAccessSequence().equals(accessPush)); + Assert.assertEquals(accessEps, leafPush1Pop1.getAccessSequence()); + Assert.assertEquals(accessPop, leafPush1Pop2.getAccessSequence()); + Assert.assertEquals(accessPush, leafPushPushPop.getAccessSequence()); // test en passant discovery dt = buildSimpleTree(mto); @@ -227,10 +227,10 @@ public void splitTest() { // assert new leaf added for PUSH(0) DTLeaf leafPush = dt.getLeaf(prePush); - Assert.assertTrue(leafPush.getAccessSequence().equals(prePush)); + Assert.assertEquals(prePush, leafPush.getAccessSequence()); // assert epsilon and push(0) are both children of inner node pop - Assert.assertTrue(leafEps.getParent().getSuffix().equals(suffPop)); - Assert.assertTrue(leafPush.getParent().getSuffix().equals(suffPop)); + Assert.assertEquals(suffPop, leafEps.getParent().getSuffix()); + Assert.assertEquals(suffPop, leafPush.getParent().getSuffix()); } } diff --git a/src/test/java/de/learnlib/ralib/dt/RegisterConsistencyTest.java b/src/test/java/de/learnlib/ralib/dt/RegisterConsistencyTest.java index cc88834c..cc2a9049 100644 --- a/src/test/java/de/learnlib/ralib/dt/RegisterConsistencyTest.java +++ b/src/test/java/de/learnlib/ralib/dt/RegisterConsistencyTest.java @@ -40,7 +40,7 @@ public class RegisterConsistencyTest extends RaLibTestSuite { private static final DataType T_INT = new DataType("int"); private static final InputSymbol A = - new InputSymbol("a", new DataType[] {T_INT}); + new InputSymbol("a", T_INT); private static class DummyDT extends DT { @@ -76,8 +76,8 @@ public SymbolicSuffixRestrictionBuilder getRestrictionBuilder() { } - private DTLeaf prefixLeaf; - private DTLeaf leaf; + private final DTLeaf prefixLeaf; + private final DTLeaf leaf; public SymbolicSuffix addedSuffix = null; @@ -168,7 +168,7 @@ public void testSymmetry() { boolean consistent = leafWord.checkRegisterConsistency(dt, consts, null); Assert.assertFalse(consistent); - Assert.assertTrue(symSuffixExpected.getActions().equals(dt.addedSuffix.getActions())); + Assert.assertEquals(dt.addedSuffix.getActions(), symSuffixExpected.getActions()); } } diff --git a/src/test/java/de/learnlib/ralib/example/keygen/MapAutomatonExample.java b/src/test/java/de/learnlib/ralib/example/keygen/MapAutomatonExample.java index 43ac8450..ba9d668e 100644 --- a/src/test/java/de/learnlib/ralib/example/keygen/MapAutomatonExample.java +++ b/src/test/java/de/learnlib/ralib/example/keygen/MapAutomatonExample.java @@ -46,19 +46,19 @@ public final class MapAutomatonExample { public static final DataType T_VAL = new DataType("T_val"); public static final InputSymbol I_PUT = - new InputSymbol("put", new DataType[] {T_VAL}); + new InputSymbol("put", T_VAL); public static final InputSymbol I_GET = - new InputSymbol("get", new DataType[] {T_KEY}); + new InputSymbol("get", T_KEY); public static final OutputSymbol O_PUT = - new OutputSymbol("o_p", new DataType[] {T_KEY}); + new OutputSymbol("o_p", T_KEY); public static final OutputSymbol O_GET = - new OutputSymbol("o_g", new DataType[] {T_VAL}); + new OutputSymbol("o_g", T_VAL); public static final OutputSymbol O_NULL = - new OutputSymbol("null", new DataType[] {}); + new OutputSymbol("null"); public static final RegisterAutomaton AUTOMATON = buildAutomaton(); diff --git a/src/test/java/de/learnlib/ralib/example/list/BoundedList.java b/src/test/java/de/learnlib/ralib/example/list/BoundedList.java index 61bbd8da..6cbd24e7 100644 --- a/src/test/java/de/learnlib/ralib/example/list/BoundedList.java +++ b/src/test/java/de/learnlib/ralib/example/list/BoundedList.java @@ -14,8 +14,8 @@ public class BoundedList { public static final BigDecimal NULL_VALUE = BigDecimal.ZERO; private boolean useNull = false; - private LinkedList list; - private int maxCapacity; + private final LinkedList list; + private final int maxCapacity; public BoundedList() { this(DEFAULT_MAX_CAPACITY, DEFAULT_USE_NULL); diff --git a/src/test/java/de/learnlib/ralib/example/list/BoundedListDataWordOracle.java b/src/test/java/de/learnlib/ralib/example/list/BoundedListDataWordOracle.java index b1b293a4..8d9b5356 100644 --- a/src/test/java/de/learnlib/ralib/example/list/BoundedListDataWordOracle.java +++ b/src/test/java/de/learnlib/ralib/example/list/BoundedListDataWordOracle.java @@ -20,13 +20,13 @@ public class BoundedListDataWordOracle implements DataWordOracle { public static final DataType INT_TYPE= new DataType("int"); - public static final InputSymbol PUSH = new InputSymbol("push", new DataType[]{INT_TYPE}); - public static final InputSymbol INSERT = new InputSymbol("insert", new DataType[]{INT_TYPE, INT_TYPE}); - public static final InputSymbol POP = new InputSymbol("pop", new DataType[]{INT_TYPE}); - public static final InputSymbol CONTAINS = new InputSymbol("contains", new DataType[]{INT_TYPE}); + public static final InputSymbol PUSH = new InputSymbol("push", INT_TYPE); + public static final InputSymbol INSERT = new InputSymbol("insert", INT_TYPE, INT_TYPE); + public static final InputSymbol POP = new InputSymbol("pop", INT_TYPE); + public static final InputSymbol CONTAINS = new InputSymbol("contains", INT_TYPE); - private Supplier factory; + private final Supplier factory; public BoundedListDataWordOracle(Supplier factory) { this.factory = factory; diff --git a/src/test/java/de/learnlib/ralib/example/llambda/LLambdaAutomatonExample.java b/src/test/java/de/learnlib/ralib/example/llambda/LLambdaAutomatonExample.java index b075dc73..51344b23 100644 --- a/src/test/java/de/learnlib/ralib/example/llambda/LLambdaAutomatonExample.java +++ b/src/test/java/de/learnlib/ralib/example/llambda/LLambdaAutomatonExample.java @@ -16,10 +16,10 @@ public class LLambdaAutomatonExample { public static final InputSymbol A = - new InputSymbol("a", new DataType[] {}); + new InputSymbol("a"); public static final InputSymbol B = - new InputSymbol("b", new DataType[] {}); + new InputSymbol("b"); public static final RegisterAutomaton AUTOMATON = buildAutomaton(); diff --git a/src/test/java/de/learnlib/ralib/example/login/FreshMultiLogin.java b/src/test/java/de/learnlib/ralib/example/login/FreshMultiLogin.java index 871c86f4..b02506d9 100644 --- a/src/test/java/de/learnlib/ralib/example/login/FreshMultiLogin.java +++ b/src/test/java/de/learnlib/ralib/example/login/FreshMultiLogin.java @@ -96,7 +96,7 @@ public boolean IChangePassword(java.math.BigDecimal uid, java.math.BigDecimal pw return false; } - public static void main(String args[]) { + public static void main(String[] args) { Class cls = FreshMultiLogin.class; for (Method meth : cls.getMethods()) { System.out.println(Arrays.asList(meth.getParameterTypes())); diff --git a/src/test/java/de/learnlib/ralib/example/login/LoginAutomatonExample.java b/src/test/java/de/learnlib/ralib/example/login/LoginAutomatonExample.java index 2fd5a732..9ab0d5f7 100644 --- a/src/test/java/de/learnlib/ralib/example/login/LoginAutomatonExample.java +++ b/src/test/java/de/learnlib/ralib/example/login/LoginAutomatonExample.java @@ -44,13 +44,13 @@ public final class LoginAutomatonExample { public static final DataType T_PWD = new DataType("T_pwd"); public static final InputSymbol I_REGISTER = - new InputSymbol("register", new DataType[] {T_UID, T_PWD}); + new InputSymbol("register", T_UID, T_PWD); public static final InputSymbol I_LOGIN = - new InputSymbol("login", new DataType[] {T_UID, T_PWD}); + new InputSymbol("login", T_UID, T_PWD); public static final InputSymbol I_LOGOUT = - new InputSymbol("logout", new DataType[] {}); + new InputSymbol("logout"); public static final RegisterAutomaton AUTOMATON = buildAutomaton(); diff --git a/src/test/java/de/learnlib/ralib/example/priority/PQWrapper.java b/src/test/java/de/learnlib/ralib/example/priority/PQWrapper.java index d507b973..ed898cd2 100644 --- a/src/test/java/de/learnlib/ralib/example/priority/PQWrapper.java +++ b/src/test/java/de/learnlib/ralib/example/priority/PQWrapper.java @@ -39,7 +39,7 @@ public void setCapacity(int capacity) { @Override public boolean offer(Object e) { - return (this.size() < capacity) ? super.offer(e) : false; + return this.size() < capacity && super.offer(e); } } diff --git a/src/test/java/de/learnlib/ralib/example/priority/PriorityQueueOracle.java b/src/test/java/de/learnlib/ralib/example/priority/PriorityQueueOracle.java index 8f78aed4..a1c0443a 100644 --- a/src/test/java/de/learnlib/ralib/example/priority/PriorityQueueOracle.java +++ b/src/test/java/de/learnlib/ralib/example/priority/PriorityQueueOracle.java @@ -36,10 +36,10 @@ public final class PriorityQueueOracle implements DataWordOracle { public static final DataType doubleType = new DataType("DOUBLE"); - public static final InputSymbol POLL = new InputSymbol("poll", new DataType[]{doubleType}); - public static final InputSymbol OFFER = new InputSymbol("offer", new DataType[]{doubleType}); + public static final InputSymbol POLL = new InputSymbol("poll", doubleType); + public static final InputSymbol OFFER = new InputSymbol("offer", doubleType); - private int capacity; + private final int capacity; public PriorityQueueOracle(int capacity) { this.capacity = capacity; @@ -64,7 +64,7 @@ public void processQueries(Collection> answer[i] = false; //try { PSymbolInstance psi = query.getInput().getSymbol(i); - DataValue d = (DataValue) psi.getParameterValues()[0]; + DataValue d = psi.getParameterValues()[0]; if (psi.getBaseSymbol().equals(OFFER) && queue.size() < capacity) { queue.offer(d.getValue()); answer[i] = true; diff --git a/src/test/java/de/learnlib/ralib/example/priority/PriorityQueueSUL.java b/src/test/java/de/learnlib/ralib/example/priority/PriorityQueueSUL.java index e9300f25..e93069f5 100644 --- a/src/test/java/de/learnlib/ralib/example/priority/PriorityQueueSUL.java +++ b/src/test/java/de/learnlib/ralib/example/priority/PriorityQueueSUL.java @@ -33,10 +33,10 @@ public class PriorityQueueSUL extends DataWordSUL { new DataType("DOUBLE"); public static final ParameterizedSymbol POLL = - new InputSymbol("poll", new DataType[]{}); + new InputSymbol("poll"); public static final ParameterizedSymbol OFFER = - new InputSymbol("offer", new DataType[]{DOUBLE_TYPE}); + new InputSymbol("offer", DOUBLE_TYPE); public final ParameterizedSymbol[] getInputSymbols() { @@ -44,16 +44,16 @@ public final ParameterizedSymbol[] getInputSymbols() { } public static final ParameterizedSymbol ERROR = - new OutputSymbol("_io_err", new DataType[]{}); + new OutputSymbol("_io_err"); public static final ParameterizedSymbol OUTPUT = - new OutputSymbol("_out", new DataType[]{DOUBLE_TYPE}); + new OutputSymbol("_out", DOUBLE_TYPE); public static final ParameterizedSymbol OK = - new OutputSymbol("_ok", new DataType[]{}); + new OutputSymbol("_ok"); public static final ParameterizedSymbol NOK = - new OutputSymbol("_not_ok", new DataType[]{}); + new OutputSymbol("_not_ok"); public final ParameterizedSymbol[] getActionSymbols() { return new ParameterizedSymbol[] { POLL, OFFER, OUTPUT, OK, NOK, ERROR }; @@ -61,7 +61,7 @@ public final ParameterizedSymbol[] getActionSymbols() { private PQWrapper pqueue; - private int capacity; + private final int capacity; public PriorityQueueSUL() { capacity = PQWrapper.CAPACITY; diff --git a/src/test/java/de/learnlib/ralib/example/repeater/Repeater.java b/src/test/java/de/learnlib/ralib/example/repeater/Repeater.java index 6da8f92b..74a3488f 100644 --- a/src/test/java/de/learnlib/ralib/example/repeater/Repeater.java +++ b/src/test/java/de/learnlib/ralib/example/repeater/Repeater.java @@ -34,10 +34,10 @@ public Integer repeat(Integer p) { repeats++; return max_repeats > 0 && repeats > max_repeats ? null - : Integer.valueOf(p); + : p; } - latest = Integer.valueOf(p); + latest = p; repeats = 1; - return Integer.valueOf(p); + return p; } } diff --git a/src/test/java/de/learnlib/ralib/example/repeater/RepeaterSUL.java b/src/test/java/de/learnlib/ralib/example/repeater/RepeaterSUL.java index a3eab846..908021af 100644 --- a/src/test/java/de/learnlib/ralib/example/repeater/RepeaterSUL.java +++ b/src/test/java/de/learnlib/ralib/example/repeater/RepeaterSUL.java @@ -16,14 +16,14 @@ public class RepeaterSUL extends DataWordSUL { new DataType("int"); public static final ParameterizedSymbol IPUT = - new InputSymbol("put", new DataType[] {TINT}); + new InputSymbol("put", TINT); public static final ParameterizedSymbol OECHO = - new OutputSymbol("echo", new DataType[] {TINT}); + new OutputSymbol("echo", TINT); public static final ParameterizedSymbol ONOK = - new OutputSymbol("nok", new DataType[] {}); + new OutputSymbol("nok"); public static final ParameterizedSymbol ERROR = - new OutputSymbol("_io_err", new DataType[]{}); + new OutputSymbol("_io_err"); public final ParameterizedSymbol[] getInputSymbols() { return new ParameterizedSymbol[] { IPUT }; @@ -34,8 +34,8 @@ public final ParameterizedSymbol[] getActionSymbols() { } private Repeater repeater; - private int max_repeats; - private int capacity; + private final int max_repeats; + private final int capacity; public RepeaterSUL() { max_repeats = Repeater.MAX_REPEATS; diff --git a/src/test/java/de/learnlib/ralib/example/sdts/LoginExampleSDT.java b/src/test/java/de/learnlib/ralib/example/sdts/LoginExampleSDT.java index 1a2392a7..a8e2bbd5 100644 --- a/src/test/java/de/learnlib/ralib/example/sdts/LoginExampleSDT.java +++ b/src/test/java/de/learnlib/ralib/example/sdts/LoginExampleSDT.java @@ -31,7 +31,7 @@ */ public class LoginExampleSDT implements SymbolicDecisionTree { - public static enum SDTClass {ACCEPT, REJECT, LOGIN}; + public enum SDTClass {ACCEPT, REJECT, LOGIN} private final SDTClass clazz; diff --git a/src/test/java/de/learnlib/ralib/example/sdts/LoginExampleTreeOracle.java b/src/test/java/de/learnlib/ralib/example/sdts/LoginExampleTreeOracle.java index 49842ed0..83e79c52 100644 --- a/src/test/java/de/learnlib/ralib/example/sdts/LoginExampleTreeOracle.java +++ b/src/test/java/de/learnlib/ralib/example/sdts/LoginExampleTreeOracle.java @@ -56,10 +56,10 @@ */ public class LoginExampleTreeOracle implements TreeOracle { - public static enum State { + public enum State { INIT, REGISTER, LOGIN, ERROR - }; + } private final Register rUid; private final Register rPwd; diff --git a/src/test/java/de/learnlib/ralib/example/stack/StackAutomatonExample.java b/src/test/java/de/learnlib/ralib/example/stack/StackAutomatonExample.java index 698abfea..14d58bd9 100644 --- a/src/test/java/de/learnlib/ralib/example/stack/StackAutomatonExample.java +++ b/src/test/java/de/learnlib/ralib/example/stack/StackAutomatonExample.java @@ -23,10 +23,10 @@ public class StackAutomatonExample { public static final DataType T_INT = new DataType("T_int"); public static final InputSymbol I_PUSH = - new InputSymbol("push", new DataType[] {T_INT}); + new InputSymbol("push", T_INT); public static final InputSymbol I_POP = - new InputSymbol("pop", new DataType[] {T_INT}); + new InputSymbol("pop", T_INT); public static final RegisterAutomaton AUTOMATON = buildAutomaton(); diff --git a/src/test/java/de/learnlib/ralib/learning/QueryStatisticsTest.java b/src/test/java/de/learnlib/ralib/learning/QueryStatisticsTest.java index 0c2731ac..b07b2d24 100644 --- a/src/test/java/de/learnlib/ralib/learning/QueryStatisticsTest.java +++ b/src/test/java/de/learnlib/ralib/learning/QueryStatisticsTest.java @@ -14,7 +14,7 @@ public class QueryStatisticsTest extends RaLibTestSuite { - public static final InputSymbol A = new InputSymbol("a", new DataType[] {}); + public static final InputSymbol A = new InputSymbol("a"); @Test public void counterexampleStatisticsTest() { diff --git a/src/test/java/de/learnlib/ralib/learning/SymbolicSuffixTest.java b/src/test/java/de/learnlib/ralib/learning/SymbolicSuffixTest.java index d0108256..17ba3611 100644 --- a/src/test/java/de/learnlib/ralib/learning/SymbolicSuffixTest.java +++ b/src/test/java/de/learnlib/ralib/learning/SymbolicSuffixTest.java @@ -51,16 +51,16 @@ public void concatTest() { DataType intType = TestUtil.getType("int", loader.getDataTypes()); ParameterizedSymbol iput = new InputSymbol( - "IPut", new DataType[] {intType}); + "IPut", intType); ParameterizedSymbol iget = new InputSymbol( - "IGet", new DataType[] {}); + "IGet"); ParameterizedSymbol oget = new OutputSymbol( - "OGet", new DataType[] {intType}); + "OGet", intType); ParameterizedSymbol ook = new OutputSymbol( - "OOK", new DataType[] {}); + "OOK"); DataValue d0 = new DataValue(intType, BigDecimal.ZERO); DataValue d1 = new DataValue(intType, BigDecimal.ONE); diff --git a/src/test/java/de/learnlib/ralib/learning/ralambda/IOHandlingTest.java b/src/test/java/de/learnlib/ralib/learning/ralambda/IOHandlingTest.java index 625dad4c..b538b15e 100644 --- a/src/test/java/de/learnlib/ralib/learning/ralambda/IOHandlingTest.java +++ b/src/test/java/de/learnlib/ralib/learning/ralambda/IOHandlingTest.java @@ -62,15 +62,15 @@ static class IORAExamples { static final DataType ID = new DataType("id"); - static final OutputSymbol NOK = new OutputSymbol("NOK", new DataType[] {}); + static final OutputSymbol NOK = new OutputSymbol("NOK"); - static final OutputSymbol OK = new OutputSymbol("OK", new DataType[] {}); + static final OutputSymbol OK = new OutputSymbol("OK"); - static final InputSymbol IN = new InputSymbol("in", new DataType[] { ID }); + static final InputSymbol IN = new InputSymbol("in", ID); - static final OutputSymbol ERROR = new OutputSymbol("ERROR", new DataType[] {}); + static final OutputSymbol ERROR = new OutputSymbol("ERROR"); - static final OutputSymbol OUT = new OutputSymbol("OUT", new DataType[] { ID }); + static final OutputSymbol OUT = new OutputSymbol("OUT", ID); private IORAExamples() { } diff --git a/src/test/java/de/learnlib/ralib/learning/ralambda/LearnABPOutputTest.java b/src/test/java/de/learnlib/ralib/learning/ralambda/LearnABPOutputTest.java index 5d7b880b..9f650a94 100644 --- a/src/test/java/de/learnlib/ralib/learning/ralambda/LearnABPOutputTest.java +++ b/src/test/java/de/learnlib/ralib/learning/ralambda/LearnABPOutputTest.java @@ -112,7 +112,7 @@ public void learnABPOutput() { inputs); int check = 0; - while (true && check < 100) { + while (check < 100) { check++; ralambda.learn(); @@ -146,7 +146,7 @@ public void learnABPOutput() { } Assert.assertTrue(model.accepts(ce.getInput())); - Assert.assertTrue(!hyp.accepts(ce.getInput())); + Assert.assertFalse(hyp.accepts(ce.getInput())); ralambda.addCounterexample(ce); } diff --git a/src/test/java/de/learnlib/ralib/learning/ralambda/LearnMixedIOTest.java b/src/test/java/de/learnlib/ralib/learning/ralambda/LearnMixedIOTest.java index 2837ae88..c73772c5 100644 --- a/src/test/java/de/learnlib/ralib/learning/ralambda/LearnMixedIOTest.java +++ b/src/test/java/de/learnlib/ralib/learning/ralambda/LearnMixedIOTest.java @@ -129,7 +129,7 @@ public void learnMixedIO() { IOCounterExamplePrefixFinder pref = new IOCounterExamplePrefixFinder(ioOracle); int check = 0; - while (true && check < 100) { + while (check < 100) { check++; rastar.learn(); @@ -147,7 +147,7 @@ public void learnMixedIO() { ce = pref.optimizeCE(ce.getInput(), hyp); Assert.assertTrue(model.accepts(ce.getInput())); - Assert.assertTrue(!hyp.accepts(ce.getInput())); + Assert.assertFalse(hyp.accepts(ce.getInput())); rastar.addCounterexample(ce); } diff --git a/src/test/java/de/learnlib/ralib/learning/ralambda/LearnPQIOTest.java b/src/test/java/de/learnlib/ralib/learning/ralambda/LearnPQIOTest.java index 65c6d4df..069ccb26 100644 --- a/src/test/java/de/learnlib/ralib/learning/ralambda/LearnPQIOTest.java +++ b/src/test/java/de/learnlib/ralib/learning/ralambda/LearnPQIOTest.java @@ -136,7 +136,7 @@ private Hypothesis learnPQ(long seed, Map teachers, Constants IOCounterExamplePrefixFinder pref = new IOCounterExamplePrefixFinder(ioOracle); int check = 0; - while (true && check < 100) { + while (check < 100) { check++; rastar.learn(); Hypothesis hyp = rastar.getHypothesis(); diff --git a/src/test/java/de/learnlib/ralib/learning/ralambda/LearnPadlock.java b/src/test/java/de/learnlib/ralib/learning/ralambda/LearnPadlock.java index 70160557..00beefbe 100644 --- a/src/test/java/de/learnlib/ralib/learning/ralambda/LearnPadlock.java +++ b/src/test/java/de/learnlib/ralib/learning/ralambda/LearnPadlock.java @@ -44,7 +44,7 @@ public class LearnPadlock extends RaLibTestSuite { static final DataType DIGIT = new DataType("id"); - static final InputSymbol IN = new InputSymbol("in", new DataType[] { DIGIT }); + static final InputSymbol IN = new InputSymbol("in", DIGIT); private static RegisterAutomaton buildAutomaton() { MutableRegisterAutomaton ra = new MutableRegisterAutomaton(); diff --git a/src/test/java/de/learnlib/ralib/learning/ralambda/LearnPalindromeIOTest.java b/src/test/java/de/learnlib/ralib/learning/ralambda/LearnPalindromeIOTest.java index ec80882c..be4072dd 100644 --- a/src/test/java/de/learnlib/ralib/learning/ralambda/LearnPalindromeIOTest.java +++ b/src/test/java/de/learnlib/ralib/learning/ralambda/LearnPalindromeIOTest.java @@ -81,7 +81,7 @@ public void learnPalindromeIO() { model, teachers, consts, true, actions); int check = 0; - while (true && check < 10) { + while (check < 10) { check++; ralambda.learn(); @@ -98,7 +98,7 @@ public void learnPalindromeIO() { } Assert.assertTrue(model.accepts(ce.getInput())); - Assert.assertTrue(!hyp.accepts(ce.getInput())); + Assert.assertFalse(hyp.accepts(ce.getInput())); ralambda.addCounterexample(ce); } diff --git a/src/test/java/de/learnlib/ralib/learning/ralambda/LearnSipIOTest.java b/src/test/java/de/learnlib/ralib/learning/ralambda/LearnSipIOTest.java index cd7e2e95..51dc065b 100644 --- a/src/test/java/de/learnlib/ralib/learning/ralambda/LearnSipIOTest.java +++ b/src/test/java/de/learnlib/ralib/learning/ralambda/LearnSipIOTest.java @@ -108,7 +108,7 @@ public void learnSipIO() { IOCounterExamplePrefixFinder pref = new IOCounterExamplePrefixFinder(ioOracle); int check = 0; - while (true && check < 100) { + while (check < 100) { check++; ralambda.learn(); Hypothesis hyp = ralambda.getHypothesis(); @@ -125,7 +125,7 @@ public void learnSipIO() { ce = pref.optimizeCE(ce.getInput(), hyp); Assert.assertTrue(model.accepts(ce.getInput())); - Assert.assertTrue(!hyp.accepts(ce.getInput())); + Assert.assertFalse(hyp.accepts(ce.getInput())); ralambda.addCounterexample(ce); } diff --git a/src/test/java/de/learnlib/ralib/learning/ralambda/TestDistinguishingSuffixOptimization.java b/src/test/java/de/learnlib/ralib/learning/ralambda/TestDistinguishingSuffixOptimization.java index 24d2553c..cd535e48 100644 --- a/src/test/java/de/learnlib/ralib/learning/ralambda/TestDistinguishingSuffixOptimization.java +++ b/src/test/java/de/learnlib/ralib/learning/ralambda/TestDistinguishingSuffixOptimization.java @@ -36,9 +36,9 @@ public class TestDistinguishingSuffixOptimization { private static final InputSymbol A = - new InputSymbol("a", new DataType[] {}); + new InputSymbol("a"); private static final InputSymbol B = - new InputSymbol("b", new DataType[] {}); + new InputSymbol("b"); private RegisterAutomaton buildAutomaton() { MutableRegisterAutomaton ra = new MutableRegisterAutomaton(); diff --git a/src/test/java/de/learnlib/ralib/learning/ralambda/TestOutputSuffixes.java b/src/test/java/de/learnlib/ralib/learning/ralambda/TestOutputSuffixes.java index 3393866c..c4aaf1c4 100644 --- a/src/test/java/de/learnlib/ralib/learning/ralambda/TestOutputSuffixes.java +++ b/src/test/java/de/learnlib/ralib/learning/ralambda/TestOutputSuffixes.java @@ -81,7 +81,7 @@ public void testSIPOutputSuffixesPresent() { RaDT radt = new RaDT(mto, hypFactory, mlo, consts, true, actions); radt.learn(); - String ces[] = {"IINVITE[1[int]] O100[1[int]] / true", + String[] ces = {"IINVITE[1[int]] O100[1[int]] / true", "IINVITE[0[int]] O100[0[int]] IPRACK[0[int]] O200[0[int]] / true"}; Deque> ceQueue = TestUnknownMemorable.buildSIPCEs(ces, actions); @@ -93,7 +93,7 @@ public void testSIPOutputSuffixesPresent() { Set outputs = Sets.difference(Set.of(actions), Set.of(inputs)); - String wordStr[] = {"IINVITE[0[int]] O100[0[int]] IPRACK[0[int]] / true"}; + String[] wordStr = {"IINVITE[0[int]] O100[0[int]] IPRACK[0[int]] / true"}; ceQueue = TestUnknownMemorable.buildSIPCEs(wordStr, actions); Word word = ceQueue.getFirst().getInput(); diff --git a/src/test/java/de/learnlib/ralib/learning/ralambda/TestSymmetry.java b/src/test/java/de/learnlib/ralib/learning/ralambda/TestSymmetry.java index 4324887a..feeeabb3 100644 --- a/src/test/java/de/learnlib/ralib/learning/ralambda/TestSymmetry.java +++ b/src/test/java/de/learnlib/ralib/learning/ralambda/TestSymmetry.java @@ -43,8 +43,8 @@ public class TestSymmetry extends RaLibTestSuite { private static final DataType T_INT = new DataType("int"); - private static final InputSymbol A = new InputSymbol("a", new DataType[] {T_INT}); - private static final InputSymbol B = new InputSymbol("b", new DataType[] {T_INT}); + private static final InputSymbol A = new InputSymbol("a", T_INT); + private static final InputSymbol B = new InputSymbol("b", T_INT); @Test public void learnSymmetryExampleCT2() { diff --git a/src/test/java/de/learnlib/ralib/learning/ralambda/TestUnknownMemorable.java b/src/test/java/de/learnlib/ralib/learning/ralambda/TestUnknownMemorable.java index b55a99a4..4eaf5d5e 100644 --- a/src/test/java/de/learnlib/ralib/learning/ralambda/TestUnknownMemorable.java +++ b/src/test/java/de/learnlib/ralib/learning/ralambda/TestUnknownMemorable.java @@ -60,24 +60,24 @@ public class TestUnknownMemorable extends RaLibTestSuite { private static final DataType T_INT = new DataType("int"); private static final InputSymbol IPUT = - new InputSymbol("put", new DataType[] {T_INT}); + new InputSymbol("put", T_INT); private static final InputSymbol IQUERY = - new InputSymbol("query", new DataType[] {}); + new InputSymbol("query"); private static final InputSymbol IHELLO = - new InputSymbol("hello", new DataType[] {}); + new InputSymbol("hello"); private static final OutputSymbol OECHO = - new OutputSymbol("echo", new DataType[] {T_INT}); + new OutputSymbol("echo", T_INT); private static final OutputSymbol OYES = - new OutputSymbol("yes", new DataType[] {T_INT}); + new OutputSymbol("yes", T_INT); private static final OutputSymbol ONO = - new OutputSymbol("no", new DataType[] {T_INT}); + new OutputSymbol("no", T_INT); private static final OutputSymbol OHELLO = - new OutputSymbol("hello", new DataType[] {}); + new OutputSymbol("hello"); private static final OutputSymbol ONOREPLY = - new OutputSymbol("noreply", new DataType[] {}); + new OutputSymbol("noreply"); private static final OutputSymbol ONOK = - new OutputSymbol("nok", new DataType[] {}); + new OutputSymbol("nok"); private RegisterAutomaton buildAutomaton() { MutableRegisterAutomaton ra = new MutableRegisterAutomaton(); @@ -191,7 +191,7 @@ public void testUnknownMemorable() { ConstraintSolver solver = new ConstraintSolver(); DataWordSUL sul = new SimulatorSUL(ra, teachers, consts); - final ParameterizedSymbol ERROR = new OutputSymbol("_io_err", new DataType[]{}); + final ParameterizedSymbol ERROR = new OutputSymbol("_io_err"); IOOracle ioOracle = new SULOracle(sul, ERROR); IOCache ioCache = new IOCache(ioOracle); diff --git a/src/test/java/de/learnlib/ralib/learning/rastar/LearnMixedIOTest.java b/src/test/java/de/learnlib/ralib/learning/rastar/LearnMixedIOTest.java index 92eabd81..c4f84636 100644 --- a/src/test/java/de/learnlib/ralib/learning/rastar/LearnMixedIOTest.java +++ b/src/test/java/de/learnlib/ralib/learning/rastar/LearnMixedIOTest.java @@ -128,7 +128,7 @@ public void learnMixedIO() { IOCounterExamplePrefixFinder pref = new IOCounterExamplePrefixFinder(ioOracle); int check = 0; - while (true && check < 100) { + while (check < 100) { check++; rastar.learn(); @@ -146,7 +146,7 @@ public void learnMixedIO() { ce = pref.optimizeCE(ce.getInput(), hyp); Assert.assertTrue(model.accepts(ce.getInput())); - Assert.assertTrue(!hyp.accepts(ce.getInput())); + Assert.assertFalse(hyp.accepts(ce.getInput())); rastar.addCounterexample(ce); } diff --git a/src/test/java/de/learnlib/ralib/learning/rastar/LearnPQIOTest.java b/src/test/java/de/learnlib/ralib/learning/rastar/LearnPQIOTest.java index 8f280dae..09696634 100644 --- a/src/test/java/de/learnlib/ralib/learning/rastar/LearnPQIOTest.java +++ b/src/test/java/de/learnlib/ralib/learning/rastar/LearnPQIOTest.java @@ -104,7 +104,7 @@ public void learnLoginExampleIO() { IOCounterExamplePrefixFinder pref = new IOCounterExamplePrefixFinder(ioOracle); int check = 0; - while (true && check < 100) { + while (check < 100) { check++; rastar.learn(); Hypothesis hyp = rastar.getHypothesis(); diff --git a/src/test/java/de/learnlib/ralib/learning/rastar/LearnPalindromeIOTest.java b/src/test/java/de/learnlib/ralib/learning/rastar/LearnPalindromeIOTest.java index 73112af7..8b4bd603 100644 --- a/src/test/java/de/learnlib/ralib/learning/rastar/LearnPalindromeIOTest.java +++ b/src/test/java/de/learnlib/ralib/learning/rastar/LearnPalindromeIOTest.java @@ -100,7 +100,7 @@ public void learnPalindromeIO() { model, teachers, consts, true, actions); int check = 0; - while (true && check < 10) { + while (check < 10) { check++; rastar.learn(); @@ -117,7 +117,7 @@ public void learnPalindromeIO() { } Assert.assertTrue(model.accepts(ce.getInput())); - Assert.assertTrue(!hyp.accepts(ce.getInput())); + Assert.assertFalse(hyp.accepts(ce.getInput())); rastar.addCounterexample(ce); } diff --git a/src/test/java/de/learnlib/ralib/learning/rastar/LearnSipIOTest.java b/src/test/java/de/learnlib/ralib/learning/rastar/LearnSipIOTest.java index 5be08ddd..93544946 100644 --- a/src/test/java/de/learnlib/ralib/learning/rastar/LearnSipIOTest.java +++ b/src/test/java/de/learnlib/ralib/learning/rastar/LearnSipIOTest.java @@ -115,7 +115,7 @@ public void learnSipIO() { IOCounterExamplePrefixFinder pref = new IOCounterExamplePrefixFinder(ioOracle); int check = 0; - while (true && check < 100) { + while (check < 100) { check++; rastar.learn(); @@ -133,7 +133,7 @@ public void learnSipIO() { ce = pref.optimizeCE(ce.getInput(), hyp); Assert.assertTrue(model.accepts(ce.getInput())); - Assert.assertTrue(!hyp.accepts(ce.getInput())); + Assert.assertFalse(hyp.accepts(ce.getInput())); rastar.addCounterexample(ce); } diff --git a/src/test/java/de/learnlib/ralib/oracles/mto/ConstantsSDTBranchingTest.java b/src/test/java/de/learnlib/ralib/oracles/mto/ConstantsSDTBranchingTest.java index 9a48a101..f9fbc275 100644 --- a/src/test/java/de/learnlib/ralib/oracles/mto/ConstantsSDTBranchingTest.java +++ b/src/test/java/de/learnlib/ralib/oracles/mto/ConstantsSDTBranchingTest.java @@ -82,16 +82,16 @@ public void testModelswithOutput() { // "IAck", new DataType[] {intType}); ParameterizedSymbol iin = new InputSymbol( - "IIn", new DataType[] {intType}); + "IIn", intType); ParameterizedSymbol ook = new OutputSymbol( - "OOK", new DataType[] {}); + "OOK"); ParameterizedSymbol isend = new InputSymbol( - "ISendFrame", new DataType[] {}); + "ISendFrame"); ParameterizedSymbol oframe = new OutputSymbol( - "OFrame", new DataType[] {intType, intType}); + "OFrame", intType, intType); DataValue d2 = new DataValue(intType, new BigDecimal(2)); //DataValue c1 = new DataValue(intType, BigDecimal.ZERO); diff --git a/src/test/java/de/learnlib/ralib/oracles/mto/FreshValuesTest.java b/src/test/java/de/learnlib/ralib/oracles/mto/FreshValuesTest.java index 0aeb2c67..ffc105d0 100644 --- a/src/test/java/de/learnlib/ralib/oracles/mto/FreshValuesTest.java +++ b/src/test/java/de/learnlib/ralib/oracles/mto/FreshValuesTest.java @@ -91,19 +91,19 @@ public void testModelswithOutput() { ParameterizedSymbol iput = new InputSymbol( - "IPut", new DataType[] {intType}); + "IPut", intType); ParameterizedSymbol iget = new InputSymbol( - "IGet", new DataType[] {intType}); + "IGet", intType); ParameterizedSymbol oput = new OutputSymbol( - "OPut", new DataType[] {intType}); + "OPut", intType); // ParameterizedSymbol oget = new OutputSymbol( // "OGet", new DataType[] {intType}); ParameterizedSymbol onok = new OutputSymbol( - "ONOK", new DataType[] {}); + "ONOK"); DataValue d0 = new DataValue(intType, BigDecimal.ZERO); DataValue d1 = new DataValue(intType, BigDecimal.ONE); diff --git a/src/test/java/de/learnlib/ralib/oracles/mto/InstantiateSymbolicWordTest.java b/src/test/java/de/learnlib/ralib/oracles/mto/InstantiateSymbolicWordTest.java index 98752581..02f013b9 100644 --- a/src/test/java/de/learnlib/ralib/oracles/mto/InstantiateSymbolicWordTest.java +++ b/src/test/java/de/learnlib/ralib/oracles/mto/InstantiateSymbolicWordTest.java @@ -94,8 +94,8 @@ public void testInstantiateStack() { public void testInstantiateWithSuffixOpt() { MutableRegisterAutomaton ra = new MutableRegisterAutomaton(); - InputSymbol A = new InputSymbol("a", new DataType[] {T_INT}); - InputSymbol B = new InputSymbol("b", new DataType[] {T_INT}); + InputSymbol A = new InputSymbol("a", T_INT); + InputSymbol B = new InputSymbol("b", T_INT); RALocation l0 = ra.addInitialState(); RALocation l1 = ra.addState(); diff --git a/src/test/java/de/learnlib/ralib/oracles/mto/LoginBranchingTest.java b/src/test/java/de/learnlib/ralib/oracles/mto/LoginBranchingTest.java index 0ef8a655..ce1897dd 100644 --- a/src/test/java/de/learnlib/ralib/oracles/mto/LoginBranchingTest.java +++ b/src/test/java/de/learnlib/ralib/oracles/mto/LoginBranchingTest.java @@ -85,20 +85,20 @@ public void testBranching() { DataType uid = TestUtil.getType("uid", loader.getDataTypes()); DataType pwd = TestUtil.getType("pwd", loader.getDataTypes()); - ParameterizedSymbol reg = new InputSymbol("IRegister", new DataType[] { uid, pwd }); + ParameterizedSymbol reg = new InputSymbol("IRegister", uid, pwd); - ParameterizedSymbol log = new InputSymbol("ILogin", new DataType[] { uid, pwd }); + ParameterizedSymbol log = new InputSymbol("ILogin", uid, pwd); - ParameterizedSymbol ok = new OutputSymbol("OOK", new DataType[] {}); + ParameterizedSymbol ok = new OutputSymbol("OOK"); DataValue u = new DataValue(uid, BigDecimal.ZERO); DataValue p = new DataValue(pwd, BigDecimal.ZERO); - Word prefix = Word.fromSymbols(new PSymbolInstance(reg, new DataValue[] { u, p }), - new PSymbolInstance(ok, new DataValue[] {})); + Word prefix = Word.fromSymbols(new PSymbolInstance(reg, u, p), + new PSymbolInstance(ok)); - Word suffix = Word.fromSymbols(new PSymbolInstance(log, new DataValue[] { u, p }), - new PSymbolInstance(ok, new DataValue[] {})); + Word suffix = Word.fromSymbols(new PSymbolInstance(log, u, p), + new PSymbolInstance(ok)); SymbolicSuffix symSuffix = new SymbolicSuffix(prefix, suffix); diff --git a/src/test/java/de/learnlib/ralib/oracles/mto/MultiSDTBranchingTest.java b/src/test/java/de/learnlib/ralib/oracles/mto/MultiSDTBranchingTest.java index 5cf72493..c4529223 100644 --- a/src/test/java/de/learnlib/ralib/oracles/mto/MultiSDTBranchingTest.java +++ b/src/test/java/de/learnlib/ralib/oracles/mto/MultiSDTBranchingTest.java @@ -78,16 +78,16 @@ public void testModelswithOutput() { DataType intType = TestUtil.getType("int", loader.getDataTypes()); ParameterizedSymbol ipr = new InputSymbol( - "IPRACK", new DataType[]{intType}); + "IPRACK", intType); ParameterizedSymbol inv = new InputSymbol( - "IINVITE", new DataType[]{intType}); + "IINVITE", intType); ParameterizedSymbol o100 = new OutputSymbol( - "O100", new DataType[]{intType}); + "O100", intType); ParameterizedSymbol o200 = new OutputSymbol( - "O200", new DataType[]{intType}); + "O200", intType); DataValue d0 = new DataValue(intType, BigDecimal.ZERO); DataValue d1 = new DataValue(intType, BigDecimal.ONE); diff --git a/src/test/java/de/learnlib/ralib/oracles/mto/MultipleSpecialCasesTest.java b/src/test/java/de/learnlib/ralib/oracles/mto/MultipleSpecialCasesTest.java index 673f5f6d..43dbc984 100644 --- a/src/test/java/de/learnlib/ralib/oracles/mto/MultipleSpecialCasesTest.java +++ b/src/test/java/de/learnlib/ralib/oracles/mto/MultipleSpecialCasesTest.java @@ -75,16 +75,16 @@ public void testModelswithOutput() { DataType intType = TestUtil.getType("int", loader.getDataTypes()); ParameterizedSymbol igc = new InputSymbol( - "IGetChallenge", new DataType[] {}); + "IGetChallenge"); ParameterizedSymbol icb = new InputSymbol( - "ICompleteBAC", new DataType[] {}); + "ICompleteBAC"); ParameterizedSymbol irf = new InputSymbol( - "IReadFile", new DataType[] {intType}); + "IReadFile", intType); ParameterizedSymbol ook = new OutputSymbol( - "OOK", new DataType[] {}); + "OOK"); DataValue d0 = consts.values().iterator().next(); diff --git a/src/test/java/de/learnlib/ralib/oracles/mto/NonFreeSuffixValuesTest.java b/src/test/java/de/learnlib/ralib/oracles/mto/NonFreeSuffixValuesTest.java index f5394f88..daeb4b75 100644 --- a/src/test/java/de/learnlib/ralib/oracles/mto/NonFreeSuffixValuesTest.java +++ b/src/test/java/de/learnlib/ralib/oracles/mto/NonFreeSuffixValuesTest.java @@ -90,16 +90,16 @@ public void testModelswithOutputFifo() { DataType intType = TestUtil.getType("int", loader.getDataTypes()); ParameterizedSymbol iput = new InputSymbol( - "IPut", new DataType[] {intType}); + "IPut", intType); ParameterizedSymbol iget = new InputSymbol( - "IGet", new DataType[] {}); + "IGet"); ParameterizedSymbol oget = new OutputSymbol( - "OGet", new DataType[] {intType}); + "OGet", intType); ParameterizedSymbol ook = new OutputSymbol( - "OOK", new DataType[] {}); + "OOK"); DataValue d0 = new DataValue(intType, BigDecimal.ZERO); DataValue d1 = new DataValue(intType, BigDecimal.ONE); @@ -182,10 +182,10 @@ public void testModelswithOutputPalindrome() { DataType intType = TestUtil.getType("int", loader.getDataTypes()); ParameterizedSymbol i4 = new InputSymbol( - "IPalindrome4", new DataType[] {intType, intType, intType, intType}); + "IPalindrome4", intType, intType, intType, intType); ParameterizedSymbol oyes = new OutputSymbol( - "OYes", new DataType[] {}); + "OYes"); DataValue d0 = new DataValue(intType, BigDecimal.ZERO); DataValue d1 = new DataValue(intType, BigDecimal.ONE); diff --git a/src/test/java/de/learnlib/ralib/oracles/mto/OptimizedSymbolicSuffixBuilderTest.java b/src/test/java/de/learnlib/ralib/oracles/mto/OptimizedSymbolicSuffixBuilderTest.java index 575a03f4..8383092a 100644 --- a/src/test/java/de/learnlib/ralib/oracles/mto/OptimizedSymbolicSuffixBuilderTest.java +++ b/src/test/java/de/learnlib/ralib/oracles/mto/OptimizedSymbolicSuffixBuilderTest.java @@ -271,7 +271,7 @@ private void equalsSuffixesFromConcretePrefixSuffix(Word word, Word sub = word.prefix(word.length() - suffixLength); Word prefix = word.prefix(sub.length()+1); SymbolicSuffix expected = new SymbolicSuffix(sub, suffix); - actual = builder.extendSuffix(prefix, (SDT) tqr.getSdt(), (PIV) tqr.getPiv(), actual); + actual = builder.extendSuffix(prefix, (SDT) tqr.getSdt(), tqr.getPiv(), actual); Assert.assertEquals(actual, expected); tqr = mto.treeQuery(sub, expected); } diff --git a/src/test/java/de/learnlib/ralib/oracles/mto/SIPSDTMergingTest.java b/src/test/java/de/learnlib/ralib/oracles/mto/SIPSDTMergingTest.java index 770071b6..1ca98206 100644 --- a/src/test/java/de/learnlib/ralib/oracles/mto/SIPSDTMergingTest.java +++ b/src/test/java/de/learnlib/ralib/oracles/mto/SIPSDTMergingTest.java @@ -77,22 +77,22 @@ public void testModelswithOutput() { DataType intType = TestUtil.getType("int", loader.getDataTypes()); ParameterizedSymbol ipr = new InputSymbol( - "IPRACK", new DataType[] {intType}); + "IPRACK", intType); ParameterizedSymbol inv = new InputSymbol( - "IINVITE", new DataType[] {intType}); + "IINVITE", intType); ParameterizedSymbol inil = new InputSymbol( - "Inil", new DataType[] {}); + "Inil"); ParameterizedSymbol o100 = new OutputSymbol( - "O100", new DataType[] {intType}); + "O100", intType); ParameterizedSymbol o486 = new OutputSymbol( - "O486", new DataType[] {intType}); + "O486", intType); ParameterizedSymbol o481 = new OutputSymbol( - "O481", new DataType[] {intType}); + "O481", intType); DataValue d0 = new DataValue(intType, BigDecimal.ZERO); DataValue d1 = new DataValue(intType, BigDecimal.ONE); diff --git a/src/test/java/de/learnlib/ralib/oracles/mto/SecondSDTBranchingTest.java b/src/test/java/de/learnlib/ralib/oracles/mto/SecondSDTBranchingTest.java index c9131ffa..53a0bcf0 100644 --- a/src/test/java/de/learnlib/ralib/oracles/mto/SecondSDTBranchingTest.java +++ b/src/test/java/de/learnlib/ralib/oracles/mto/SecondSDTBranchingTest.java @@ -84,19 +84,19 @@ public void testModelswithOutput() { DataType intType = TestUtil.getType("int", loader.getDataTypes()); ParameterizedSymbol ipr = new InputSymbol( - "IPRACK", new DataType[] {intType}); + "IPRACK", intType); ParameterizedSymbol inv = new InputSymbol( - "IINVITE", new DataType[] {intType}); + "IINVITE", intType); ParameterizedSymbol o100 = new OutputSymbol( - "O100", new DataType[] {intType}); + "O100", intType); ParameterizedSymbol o200 = new OutputSymbol( - "O200", new DataType[] {intType}); + "O200", intType); ParameterizedSymbol o481 = new OutputSymbol( - "O481", new DataType[] {intType}); + "O481", intType); DataValue d0 = new DataValue(intType, BigDecimal.ZERO); DataValue d1 = new DataValue(intType, BigDecimal.ONE); diff --git a/src/test/java/de/learnlib/ralib/oracles/mto/UntypedBranchingTest.java b/src/test/java/de/learnlib/ralib/oracles/mto/UntypedBranchingTest.java index fde7cd59..29760cfb 100644 --- a/src/test/java/de/learnlib/ralib/oracles/mto/UntypedBranchingTest.java +++ b/src/test/java/de/learnlib/ralib/oracles/mto/UntypedBranchingTest.java @@ -106,24 +106,24 @@ public void testBranching() { DataType intType = TestUtil.getType("int", loader.getDataTypes()); ParameterizedSymbol reg = new InputSymbol( - "IRegister", new DataType[] {intType, intType}); + "IRegister", intType, intType); ParameterizedSymbol log = new InputSymbol( - "ILogin", new DataType[] {intType, intType}); + "ILogin", intType, intType); ParameterizedSymbol ok = new OutputSymbol( - "OOK", new DataType[] {}); + "OOK"); DataValue u = new DataValue(intType, BigDecimal.ZERO); DataValue p = new DataValue(intType, BigDecimal.ONE); Word prefix = Word.fromSymbols( - new PSymbolInstance(reg, new DataValue[] {u, p}), - new PSymbolInstance(ok, new DataValue[] {})); + new PSymbolInstance(reg, u, p), + new PSymbolInstance(ok)); Word suffix = Word.fromSymbols( - new PSymbolInstance(log, new DataValue[] {u, p}), - new PSymbolInstance(ok, new DataValue[] {})); + new PSymbolInstance(log, u, p), + new PSymbolInstance(ok)); SymbolicSuffix symSuffix = new SymbolicSuffix(prefix, suffix); diff --git a/src/test/java/de/learnlib/ralib/theory/TestIneqOutputTree.java b/src/test/java/de/learnlib/ralib/theory/TestIneqOutputTree.java index 56283ced..752f96aa 100644 --- a/src/test/java/de/learnlib/ralib/theory/TestIneqOutputTree.java +++ b/src/test/java/de/learnlib/ralib/theory/TestIneqOutputTree.java @@ -68,7 +68,7 @@ public void post() { @Override public PSymbolInstance step(PSymbolInstance i) throws SULException { return new PSymbolInstance(OUT, new DataValue(TYPE, - ((BigDecimal)i.getParameterValues()[0].getValue()).add(BigDecimal.ONE))); + i.getParameterValues()[0].getValue().add(BigDecimal.ONE))); } } diff --git a/src/test/java/de/learnlib/ralib/theory/TestTreeOracle.java b/src/test/java/de/learnlib/ralib/theory/TestTreeOracle.java index ebfb472d..1db71f34 100644 --- a/src/test/java/de/learnlib/ralib/theory/TestTreeOracle.java +++ b/src/test/java/de/learnlib/ralib/theory/TestTreeOracle.java @@ -58,10 +58,10 @@ public void testTreeOracle() { // define parameterized symbols final ParameterizedSymbol register = new InputSymbol( - "register", new DataType[] {userType, passType}); + "register", userType, passType); final ParameterizedSymbol login = new InputSymbol( - "login", new DataType[] {userType, passType}); + "login", userType, passType); //final ParameterizedSymbol change = new InputSymbol( // "change", new DataType[] {passType}); diff --git a/src/test/java/de/learnlib/ralib/words/TestWords.java b/src/test/java/de/learnlib/ralib/words/TestWords.java index 418399a7..e541cec0 100644 --- a/src/test/java/de/learnlib/ralib/words/TestWords.java +++ b/src/test/java/de/learnlib/ralib/words/TestWords.java @@ -53,7 +53,7 @@ public void testSymbolicSuffix1() { DataType intType = new DataType("int"); - ParameterizedSymbol a = new InputSymbol("a", new DataType[]{intType}); + ParameterizedSymbol a = new InputSymbol("a", intType); DataValue i1 = new DataValue(intType, BigDecimal.ONE); DataValue i2 = new DataValue(intType, new BigDecimal(2)); From 06ed2178d846fbcc8a30349d443b54ad73a445cc Mon Sep 17 00:00:00 2001 From: Falk Howar Date: Fri, 21 Feb 2025 18:07:59 +0100 Subject: [PATCH 06/26] remove unused code and extract merge from SDTGuard --- .../de/learnlib/ralib/oracles/mto/SDT.java | 40 -------- .../de/learnlib/ralib/theory/SDTAndGuard.java | 5 - .../de/learnlib/ralib/theory/SDTGuard.java | 2 - .../learnlib/ralib/theory/SDTGuardUtil.java | 92 +++++++++++++++++++ .../de/learnlib/ralib/theory/SDTOrGuard.java | 29 ------ .../learnlib/ralib/theory/SDTTrueGuard.java | 11 --- .../theory/equality/DisequalityGuard.java | 21 ----- .../ralib/theory/equality/EqualityGuard.java | 25 ----- .../inequality/InequalityTheoryWithEq.java | 11 +-- .../theory/inequality/IntervalGuard.java | 46 +--------- 10 files changed, 98 insertions(+), 184 deletions(-) create mode 100644 src/main/java/de/learnlib/ralib/theory/SDTGuardUtil.java diff --git a/src/main/java/de/learnlib/ralib/oracles/mto/SDT.java b/src/main/java/de/learnlib/ralib/oracles/mto/SDT.java index 30d4ae89..8bc96b4c 100644 --- a/src/main/java/de/learnlib/ralib/oracles/mto/SDT.java +++ b/src/main/java/de/learnlib/ralib/oracles/mto/SDT.java @@ -69,46 +69,6 @@ Set getRegisters() { return registers; } - public Set getRegisters(SymbolicDataValue dv) { - Set registers = new LinkedHashSet<>(); - if (this instanceof SDTLeaf) - return registers; - for (Map.Entry e : children.entrySet()) { - e.getKey().getComparands(dv).stream().filter((x) -> (x.isRegister())).forEach((x) -> { registers.add((Register)x); } ); - registers.addAll(e.getValue().getRegisters(dv)); - } - return registers; - } - - public Set getComparands(SymbolicDataValue dv) { - Set comparands = new LinkedHashSet<>(); - if (this instanceof SDTLeaf) - return comparands; - for (Map.Entry e : children.entrySet()) { - SDTGuard g = e.getKey(); - Set guardComparands = g.getComparands(dv); - if (!guardComparands.isEmpty()) { - comparands.addAll(guardComparands); - } - comparands.addAll(e.getValue().getComparands(dv)); - } - return comparands; - } - - public Set getSDTGuards(SuffixValue sv) { - Set guards = new LinkedHashSet<>(); - if (this instanceof SDTLeaf) - return guards; - for (Map.Entry e : children.entrySet()) { - SDTGuard guard = e.getKey(); - if (guard.getParameter().equals(sv)) { - guards.add(guard); - } - guards.addAll(e.getValue().getSDTGuards(sv)); - } - return guards; - } - public int getHeight() { if (this instanceof SDTLeaf || children.size() == 0) { return 0; diff --git a/src/main/java/de/learnlib/ralib/theory/SDTAndGuard.java b/src/main/java/de/learnlib/ralib/theory/SDTAndGuard.java index 083a081c..688a31ae 100644 --- a/src/main/java/de/learnlib/ralib/theory/SDTAndGuard.java +++ b/src/main/java/de/learnlib/ralib/theory/SDTAndGuard.java @@ -99,11 +99,6 @@ public SDTGuard relabel(VarMapping relabelling) { return new SDTAndGuard(sv, gg.toArray(new SDTIfGuard[]{})); } - @Override - public Set mergeWith(SDTGuard other, List regPotential) { - throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. - } - @Override public SDTAndGuard copy() { return new SDTAndGuard(this); diff --git a/src/main/java/de/learnlib/ralib/theory/SDTGuard.java b/src/main/java/de/learnlib/ralib/theory/SDTGuard.java index 6586257c..eefc892a 100644 --- a/src/main/java/de/learnlib/ralib/theory/SDTGuard.java +++ b/src/main/java/de/learnlib/ralib/theory/SDTGuard.java @@ -56,8 +56,6 @@ public SDTGuard(SDTGuard other) { public abstract SDTGuard relabel(VarMapping relabelling); - public abstract Set mergeWith(SDTGuard other, List regPotential); - public abstract SDTGuard copy(); } diff --git a/src/main/java/de/learnlib/ralib/theory/SDTGuardUtil.java b/src/main/java/de/learnlib/ralib/theory/SDTGuardUtil.java new file mode 100644 index 00000000..913484f4 --- /dev/null +++ b/src/main/java/de/learnlib/ralib/theory/SDTGuardUtil.java @@ -0,0 +1,92 @@ +package de.learnlib.ralib.theory; + +import de.learnlib.ralib.data.SymbolicDataValue; +import de.learnlib.ralib.theory.equality.DisequalityGuard; +import de.learnlib.ralib.theory.equality.EqualityGuard; +import de.learnlib.ralib.theory.equality.EqualityTheory; +import de.learnlib.ralib.theory.inequality.IntervalGuard; + +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Set; + +public class SDTGuardUtil { + + public static Set mergeWith(SDTGuard thisGuard, SDTGuard other, + List regPotential) { + + if (thisGuard instanceof IntervalGuard) { + IntervalGuard intervalGuard = (IntervalGuard) thisGuard; + Set guards = new LinkedHashSet<>(); + if (other instanceof IntervalGuard) { + guards.addAll(intervalGuard.mergeIntervals((IntervalGuard) other)); + } else if (other instanceof DisequalityGuard dGuard) { + if ((intervalGuard.isBiggerGuard() && intervalGuard.leftLimit.equals(dGuard.getRegister())) + || (intervalGuard.isSmallerGuard() && intervalGuard.rightLimit.equals(dGuard.getRegister()))) { + + guards.add(other); + } + else { + guards.add(intervalGuard); + guards.add(other); + } + // special case for equality guards + } else { + guards.add(intervalGuard); + guards.add(other); + } + return guards; + } + + if (thisGuard instanceof DisequalityGuard) { + DisequalityGuard disequalityGuard = (DisequalityGuard) thisGuard; + Set guards = new LinkedHashSet<>(); + if (other instanceof EqualityGuard) { + if (!(other.equals(disequalityGuard.toDeqGuard()))) { + guards.add(disequalityGuard); + guards.add(other); + } + } + else if (other instanceof DisequalityGuard) { + guards.add(disequalityGuard); + guards.add(other); + } + else { + guards.addAll(mergeWith(other, disequalityGuard, regPotential)); + } + return guards; + } + + if (thisGuard instanceof EqualityGuard) { + EqualityGuard equalityGuard = (EqualityGuard) thisGuard; + Set guards = new LinkedHashSet<>(); + if (other instanceof DisequalityGuard) { + if (!(other.equals(equalityGuard.toDeqGuard()))) { + guards.add(equalityGuard); + guards.add(other); + } + } else if (other instanceof EqualityGuard) { + if (!(equalityGuard.equals(other))) { + guards.add(other); + } + guards.add(equalityGuard); + } else if (other instanceof SDTOrGuard) { + for (SDTGuard s : ((SDTOrGuard)other).getGuards()) { + guards.addAll(mergeWith(equalityGuard, s, regPotential)); + } + }else { + //System.out.println("attempt to merge " + this + " with " + other); + guards.addAll(mergeWith(other, equalityGuard, regPotential)); + + } + return guards; + } + + if (thisGuard instanceof SDTOrGuard) { + return mergeWith(other, thisGuard, regPotential); + } + + throw new RuntimeException("this should not happen"); + } + +} diff --git a/src/main/java/de/learnlib/ralib/theory/SDTOrGuard.java b/src/main/java/de/learnlib/ralib/theory/SDTOrGuard.java index c2e50d42..73b79ef1 100644 --- a/src/main/java/de/learnlib/ralib/theory/SDTOrGuard.java +++ b/src/main/java/de/learnlib/ralib/theory/SDTOrGuard.java @@ -98,38 +98,9 @@ public SDTGuard relabel(VarMapping relabelling) { return new SDTOrGuard(sv, gg.toArray(new SDTGuard[]{})); } - @Override - public Set mergeWith(SDTGuard other, List regPotential) { - return other.mergeWith(this, regPotential); - } - @Override public SDTOrGuard copy() { return new SDTOrGuard(this); } - //@Override - //public SDTGuard mergeWith(Set _merged) { - // return null; - //} -// Set merged = new LinkedHashSet<>(); -// merged.addAll(_merged); -// for (SDTGuard x : this.getGuards()) { -// if (x instanceof SDTIfGuard) { -// SDTGuard newGuard = x.mergeWith(merged); -// } -// } -// if (merged.isEmpty()) { -// return new SDTTrueGuard(this.parameter); -// } else { -// SDTGuard[] mergedArr = merged.toArray(new SDTGuard[]{}); -// if (mergedArr.length == 1) { -// return mergedArr[0]; -// } -// else { -// return new SDTOrGuard(this.parameter, mergedArr); -// } -// -// } -// } } diff --git a/src/main/java/de/learnlib/ralib/theory/SDTTrueGuard.java b/src/main/java/de/learnlib/ralib/theory/SDTTrueGuard.java index 3c8aa211..bfde63d1 100644 --- a/src/main/java/de/learnlib/ralib/theory/SDTTrueGuard.java +++ b/src/main/java/de/learnlib/ralib/theory/SDTTrueGuard.java @@ -83,11 +83,6 @@ public int hashCode() { return hash; } - @Override - public Set mergeWith(SDTGuard other, List regPotential) { - throw new IllegalStateException("trying to merge true guard"); - } - @Override public Set getComparands(SymbolicDataValue dv) { return new LinkedHashSet<>(); @@ -98,10 +93,4 @@ public SDTTrueGuard copy() { return new SDTTrueGuard(this); } - -// @Override -// public SDTGuard mergeWith(Set _merged) { -// return new SDTOrGuard(this.parameter, _merged.toArray(new SDTGuard[]{})); -// -// } } diff --git a/src/main/java/de/learnlib/ralib/theory/equality/DisequalityGuard.java b/src/main/java/de/learnlib/ralib/theory/equality/DisequalityGuard.java index c63e9858..c58fe68a 100644 --- a/src/main/java/de/learnlib/ralib/theory/equality/DisequalityGuard.java +++ b/src/main/java/de/learnlib/ralib/theory/equality/DisequalityGuard.java @@ -104,27 +104,6 @@ public boolean equals(Object obj) { return Objects.equals(this.parameter, other.parameter); } - @Override - public Set mergeWith(SDTGuard other, List regPotential) { - Set guards = new LinkedHashSet<>(); - if (other instanceof EqualityGuard) { - if (!(other.equals(this.toDeqGuard()))) { - guards.add(this); - guards.add(other); - } - } - else if (other instanceof DisequalityGuard) { - guards.add(this); - guards.add(other); - } - else { -// System.out.println("attempt to merge " + this + " with " + other); - guards.addAll(other.mergeWith(this, regPotential)); - - } - return guards; - } - @Override public SDTGuard copy() { return new DisequalityGuard(this); diff --git a/src/main/java/de/learnlib/ralib/theory/equality/EqualityGuard.java b/src/main/java/de/learnlib/ralib/theory/equality/EqualityGuard.java index b7dac1c6..339b7d22 100644 --- a/src/main/java/de/learnlib/ralib/theory/equality/EqualityGuard.java +++ b/src/main/java/de/learnlib/ralib/theory/equality/EqualityGuard.java @@ -105,31 +105,6 @@ public Expression toExpr() { NumericComparator.EQ, parameter); } - @Override - public Set mergeWith(SDTGuard other, List regPotential) { - Set guards = new LinkedHashSet<>(); - if (other instanceof DisequalityGuard) { - if (!(other.equals(this.toDeqGuard()))) { - guards.add(this); - guards.add(other); - } - } else if (other instanceof EqualityGuard) { - if (!(this.equals(other))) { - guards.add(other); - } - guards.add(this); - } else if (other instanceof SDTOrGuard) { - for (SDTGuard s : ((SDTOrGuard)other).getGuards()) { - guards.addAll(this.mergeWith(s, regPotential)); - } - }else { - //System.out.println("attempt to merge " + this + " with " + other); - guards.addAll(other.mergeWith(this, regPotential)); - - } - return guards; - } - @Override public EqualityGuard copy() { return new EqualityGuard(this); diff --git a/src/main/java/de/learnlib/ralib/theory/inequality/InequalityTheoryWithEq.java b/src/main/java/de/learnlib/ralib/theory/inequality/InequalityTheoryWithEq.java index 1b5eff01..128820d4 100644 --- a/src/main/java/de/learnlib/ralib/theory/inequality/InequalityTheoryWithEq.java +++ b/src/main/java/de/learnlib/ralib/theory/inequality/InequalityTheoryWithEq.java @@ -41,12 +41,7 @@ import de.learnlib.ralib.oracles.mto.SDT; import de.learnlib.ralib.oracles.mto.SDTConstructor; import de.learnlib.ralib.oracles.mto.SDTLeaf; -import de.learnlib.ralib.theory.SDTAndGuard; -import de.learnlib.ralib.theory.SDTGuard; -import de.learnlib.ralib.theory.SDTIfGuard; -import de.learnlib.ralib.theory.SDTOrGuard; -import de.learnlib.ralib.theory.SDTTrueGuard; -import de.learnlib.ralib.theory.Theory; +import de.learnlib.ralib.theory.*; import de.learnlib.ralib.theory.equality.DisequalityGuard; import de.learnlib.ralib.theory.equality.EqualityGuard; import de.learnlib.ralib.words.DataWords; @@ -172,7 +167,7 @@ private void addSafely(Collection guards, SDTGuard guard, List> mergeOneWithSet(List> inAndOut, SDTGua Set refSet = new LinkedHashSet<>(); refSet.add(target); refSet.add(m); - Set mWithTarget = target.mergeWith(m, regPotential); + Set mWithTarget = SDTGuardUtil.mergeWith(target, m, regPotential); // System.out.println("merging: " + target + " + " + m + " --> " + mWithTarget + ", " + refSet.containsAll(mWithTarget)); if (!mWithTarget.contains(target)) { prohibited.add(target); diff --git a/src/main/java/de/learnlib/ralib/theory/inequality/IntervalGuard.java b/src/main/java/de/learnlib/ralib/theory/inequality/IntervalGuard.java index 80839654..49d0ce0d 100644 --- a/src/main/java/de/learnlib/ralib/theory/inequality/IntervalGuard.java +++ b/src/main/java/de/learnlib/ralib/theory/inequality/IntervalGuard.java @@ -41,8 +41,8 @@ */ public class IntervalGuard extends SDTGuard { - private final SymbolicDataValue leftLimit; - private final SymbolicDataValue rightLimit; + public final SymbolicDataValue leftLimit; + public final SymbolicDataValue rightLimit; public IntervalGuard(SuffixValue param, SymbolicDataValue ll, SymbolicDataValue rl) { super(param); @@ -231,7 +231,7 @@ private Set iMergeIntervals(IntervalGuard other) { return guards; } - private Set mergeIntervals(IntervalGuard other) { + public Set mergeIntervals(IntervalGuard other) { // System.out.println("other i-guard: " + other); if (this.isBiggerGuard()) { // System.out.println(this + " is bigger, left limit is: " + this.leftLimit); @@ -251,46 +251,6 @@ private Set mergeIntervals(IntervalGuard other) { } -// private Set mergeWithEquality(EqualityGuard other) { -// Set guards = new LinkedHashSet<>(); -// if (!(other.getRegister().equals(this.leftLimit) || other.getRegister().equals(this.rightLimit))) { -// guards.add(this); -// guards.add(other); -// } else { -// guards.add(new SDTOrGuard(this.parameter, this, other)); -// } -// return guards; -// } - - @Override - public Set mergeWith(SDTGuard other, List regPotential) { - Set guards = new LinkedHashSet<>(); - if (other instanceof IntervalGuard) { - guards.addAll(this.mergeIntervals((IntervalGuard) other)); - } else if (other instanceof DisequalityGuard dGuard) { - if ((this.isBiggerGuard() && this.leftLimit.equals(dGuard.getRegister())) - || (this.isSmallerGuard() && this.rightLimit.equals(dGuard.getRegister()))) { - - guards.add(other); - } - else { - guards.add(this); - guards.add(other); - } - // special case for equality guards - } else //if (other instanceof EqualityGuard) - { - //return this.mergeWithEquality((EqualityGuard) other); - //} - //else { -// System.out.println("guard " + other + " not deq or interval"); - guards.add(this); - guards.add(other); - } -// System.out.println("merged guards are: " + guards); - return guards; - } - @Override public Expression toExpr() { if (leftLimit == null) { From afe8ed67b4e1c271e9048fb60d2cd9ef6d6d9414 Mon Sep 17 00:00:00 2001 From: Falk Howar Date: Fri, 21 Feb 2025 18:18:58 +0100 Subject: [PATCH 07/26] spotless --- .../ralib/automata/xml/RegisterAutomatonExporter.java | 3 +-- .../ralib/automata/xml/RegisterAutomatonImporter.java | 5 ++--- .../de/learnlib/ralib/ceanalysis/PrefixFinder.java | 6 +++--- src/main/java/de/learnlib/ralib/data/DataValue.java | 7 +++---- src/main/java/de/learnlib/ralib/data/ParValuation.java | 1 - .../java/de/learnlib/ralib/data/SymbolicDataValue.java | 6 +++--- src/main/java/de/learnlib/ralib/data/VarMapping.java | 3 +-- src/main/java/de/learnlib/ralib/data/VarValuation.java | 1 - src/main/java/de/learnlib/ralib/dt/DTLeaf.java | 2 +- .../de/learnlib/ralib/learning/AutomatonBuilder.java | 4 ++-- .../ralib/learning/CounterexampleAnalysis.java | 2 +- .../de/learnlib/ralib/learning/ralambda/RaLambda.java | 2 +- .../de/learnlib/ralib/learning/rastar/Component.java | 2 +- .../ralib/oracles/mto/MultiTheorySDTLogicOracle.java | 10 +++++----- .../ralib/oracles/mto/MultiTheoryTreeOracle.java | 6 +++--- src/main/java/de/learnlib/ralib/oracles/mto/SDT.java | 1 - .../java/de/learnlib/ralib/smt/ConstraintSolver.java | 4 ++-- src/main/java/de/learnlib/ralib/smt/SMTUtil.java | 4 ++-- .../java/de/learnlib/ralib/theory/SDTAndGuard.java | 1 - .../java/de/learnlib/ralib/theory/SDTGuardUtil.java | 9 ++++----- src/main/java/de/learnlib/ralib/theory/SDTOrGuard.java | 1 - .../ralib/theory/equality/DisequalityGuard.java | 3 --- .../learnlib/ralib/theory/equality/EqualityGuard.java | 5 ----- src/main/java/de/learnlib/ralib/words/DataWords.java | 6 ++---- src/test/java/de/learnlib/ralib/RaLibTestSuite.java | 1 - src/test/java/de/learnlib/ralib/TestUtil.java | 1 - .../ralib/equivalence/RAEquivalenceTestTest.java | 8 ++++---- .../ralib/example/llambda/LLambdaAutomatonExample.java | 1 - .../learnlib/ralib/example/repeater/RepeaterSUL.java | 4 ++-- .../learnlib/ralib/learning/QueryStatisticsTest.java | 1 - .../ralib/learning/ralambda/IOHandlingTest.java | 9 ++++----- .../ralib/learning/ralambda/LearnABPOutputTest.java | 1 - .../ralib/learning/ralambda/LearnDtlsServerTest.java | 2 +- .../ralib/learning/ralambda/LearnEchoTest.java | 1 - .../ralib/learning/ralambda/LearnLoginTest.java | 1 - .../ralib/learning/ralambda/LearnMixedIOTest.java | 2 +- .../ralib/learning/ralambda/LearnPQIOTest.java | 2 +- .../learnlib/ralib/learning/ralambda/LearnPQTest.java | 2 +- .../learnlib/ralib/learning/ralambda/LearnPadlock.java | 9 ++++----- .../ralib/learning/ralambda/LearnSipIOTest.java | 1 - .../ralambda/TestDistinguishingSuffixOptimization.java | 4 ++-- .../ralib/learning/ralambda/TestOutputSuffixes.java | 1 - .../ralib/learning/ralambda/TestQueryCount.java | 2 +- .../learnlib/ralib/learning/ralambda/TestSymmetry.java | 8 ++++---- .../ralib/learning/ralambda/TestUnknownMemorable.java | 8 ++++---- .../ralib/learning/rastar/LearnMixedIOTest.java | 2 +- .../learnlib/ralib/learning/rastar/LearnPQIOTest.java | 2 +- .../de/learnlib/ralib/learning/rastar/LearnPQTest.java | 2 +- .../ralib/oracles/mto/ConstantsSDTBranchingTest.java | 3 +-- .../de/learnlib/ralib/oracles/mto/FreshValuesTest.java | 2 +- .../ralib/oracles/mto/InstantiateSymbolicWordTest.java | 9 ++++----- .../ralib/oracles/mto/MultiSDTBranchingTest.java | 2 +- .../ralib/oracles/mto/MultipleSpecialCasesTest.java | 2 +- .../ralib/oracles/mto/NonFreeSuffixValuesTest.java | 1 - .../learnlib/ralib/oracles/mto/SIPSDTMergingTest.java | 3 +-- .../ralib/oracles/mto/SecondSDTBranchingTest.java | 2 +- .../ralib/oracles/mto/UntypedBranchingTest.java | 3 +-- .../ralib/theory/EquivalenceClassCoverageTest.java | 1 - .../de/learnlib/ralib/theory/TestEqualityTheory.java | 3 +-- .../java/de/learnlib/ralib/theory/TestIneqEqTree.java | 2 +- .../de/learnlib/ralib/theory/TestIneqOutputTree.java | 2 +- .../java/de/learnlib/ralib/theory/TestTreeOracle.java | 5 ++--- .../ralib/theory/TestUniqueEqualityTheory.java | 3 +-- 63 files changed, 86 insertions(+), 126 deletions(-) diff --git a/src/main/java/de/learnlib/ralib/automata/xml/RegisterAutomatonExporter.java b/src/main/java/de/learnlib/ralib/automata/xml/RegisterAutomatonExporter.java index 6e98b62e..3183ac0c 100644 --- a/src/main/java/de/learnlib/ralib/automata/xml/RegisterAutomatonExporter.java +++ b/src/main/java/de/learnlib/ralib/automata/xml/RegisterAutomatonExporter.java @@ -23,8 +23,6 @@ import java.util.Map; import java.util.Map.Entry; import java.util.Set; - -import gov.nasa.jpf.constraints.api.Expression; import jakarta.xml.bind.JAXB; import de.learnlib.ralib.automata.Assignment; @@ -43,6 +41,7 @@ import de.learnlib.ralib.words.InputSymbol; import de.learnlib.ralib.words.OutputSymbol; import de.learnlib.ralib.words.ParameterizedSymbol; +import gov.nasa.jpf.constraints.api.Expression; /** * diff --git a/src/main/java/de/learnlib/ralib/automata/xml/RegisterAutomatonImporter.java b/src/main/java/de/learnlib/ralib/automata/xml/RegisterAutomatonImporter.java index 774dd5ce..c75db856 100644 --- a/src/main/java/de/learnlib/ralib/automata/xml/RegisterAutomatonImporter.java +++ b/src/main/java/de/learnlib/ralib/automata/xml/RegisterAutomatonImporter.java @@ -27,9 +27,6 @@ import java.util.ListIterator; import java.util.Map; import java.util.Set; - -import gov.nasa.jpf.constraints.api.Expression; -import gov.nasa.jpf.constraints.util.ExpressionUtil; import jakarta.xml.bind.JAXB; import org.slf4j.Logger; @@ -58,6 +55,8 @@ import de.learnlib.ralib.words.InputSymbol; import de.learnlib.ralib.words.OutputSymbol; import de.learnlib.ralib.words.ParameterizedSymbol; +import gov.nasa.jpf.constraints.api.Expression; +import gov.nasa.jpf.constraints.util.ExpressionUtil; import net.automatalib.alphabet.Alphabet; import net.automatalib.alphabet.impl.GrowingMapAlphabet; diff --git a/src/main/java/de/learnlib/ralib/ceanalysis/PrefixFinder.java b/src/main/java/de/learnlib/ralib/ceanalysis/PrefixFinder.java index 24bfe844..e76ad449 100644 --- a/src/main/java/de/learnlib/ralib/ceanalysis/PrefixFinder.java +++ b/src/main/java/de/learnlib/ralib/ceanalysis/PrefixFinder.java @@ -5,9 +5,6 @@ import java.util.Map; import java.util.Set; -import de.learnlib.ralib.smt.SMTUtil; -import gov.nasa.jpf.constraints.api.Expression; -import gov.nasa.jpf.constraints.util.ExpressionUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -32,9 +29,12 @@ import de.learnlib.ralib.oracles.TreeOracle; import de.learnlib.ralib.oracles.TreeQueryResult; import de.learnlib.ralib.oracles.mto.SymbolicSuffixRestrictionBuilder; +import de.learnlib.ralib.smt.SMTUtil; import de.learnlib.ralib.words.DataWords; import de.learnlib.ralib.words.PSymbolInstance; import de.learnlib.ralib.words.ParameterizedSymbol; +import gov.nasa.jpf.constraints.api.Expression; +import gov.nasa.jpf.constraints.util.ExpressionUtil; import net.automatalib.word.Word; public class PrefixFinder { diff --git a/src/main/java/de/learnlib/ralib/data/DataValue.java b/src/main/java/de/learnlib/ralib/data/DataValue.java index ec0c05c8..cf71e095 100644 --- a/src/main/java/de/learnlib/ralib/data/DataValue.java +++ b/src/main/java/de/learnlib/ralib/data/DataValue.java @@ -16,13 +16,12 @@ */ package de.learnlib.ralib.data; -import gov.nasa.jpf.constraints.expressions.Constant; -import gov.nasa.jpf.constraints.types.BuiltinTypes; -import gov.nasa.jpf.constraints.types.Type; - import java.math.BigDecimal; import java.util.Objects; +import gov.nasa.jpf.constraints.expressions.Constant; +import gov.nasa.jpf.constraints.types.BuiltinTypes; + /** * RaLib extension of SMT constant values that * retains user-annotated type information diff --git a/src/main/java/de/learnlib/ralib/data/ParValuation.java b/src/main/java/de/learnlib/ralib/data/ParValuation.java index 9ddfa964..9e5fe66f 100644 --- a/src/main/java/de/learnlib/ralib/data/ParValuation.java +++ b/src/main/java/de/learnlib/ralib/data/ParValuation.java @@ -20,7 +20,6 @@ import de.learnlib.ralib.data.util.SymbolicDataValueGenerator.ParameterGenerator; import de.learnlib.ralib.words.PSymbolInstance; -import gov.nasa.jpf.constraints.api.Valuation; import net.automatalib.word.Word; /** diff --git a/src/main/java/de/learnlib/ralib/data/SymbolicDataValue.java b/src/main/java/de/learnlib/ralib/data/SymbolicDataValue.java index 660d0e17..5be18110 100644 --- a/src/main/java/de/learnlib/ralib/data/SymbolicDataValue.java +++ b/src/main/java/de/learnlib/ralib/data/SymbolicDataValue.java @@ -16,12 +16,12 @@ */ package de.learnlib.ralib.data; -import gov.nasa.jpf.constraints.api.Variable; -import gov.nasa.jpf.constraints.types.BuiltinTypes; - import java.math.BigDecimal; import java.util.Objects; +import gov.nasa.jpf.constraints.api.Variable; +import gov.nasa.jpf.constraints.types.BuiltinTypes; + /** * Symbolic Data Values (Parameters, registers, etc.). * diff --git a/src/main/java/de/learnlib/ralib/data/VarMapping.java b/src/main/java/de/learnlib/ralib/data/VarMapping.java index 30426e93..63c5bcc7 100644 --- a/src/main/java/de/learnlib/ralib/data/VarMapping.java +++ b/src/main/java/de/learnlib/ralib/data/VarMapping.java @@ -16,10 +16,9 @@ */ package de.learnlib.ralib.data; -import com.google.common.base.Function; - import java.util.*; + /** * maps symbolic data values to symbolic data values. * diff --git a/src/main/java/de/learnlib/ralib/data/VarValuation.java b/src/main/java/de/learnlib/ralib/data/VarValuation.java index a82c4a62..3ffaf8e7 100644 --- a/src/main/java/de/learnlib/ralib/data/VarValuation.java +++ b/src/main/java/de/learnlib/ralib/data/VarValuation.java @@ -16,7 +16,6 @@ */ package de.learnlib.ralib.data; -import java.util.Optional; /** * A valuation of registers. diff --git a/src/main/java/de/learnlib/ralib/dt/DTLeaf.java b/src/main/java/de/learnlib/ralib/dt/DTLeaf.java index da1e7d3c..71c39cd0 100644 --- a/src/main/java/de/learnlib/ralib/dt/DTLeaf.java +++ b/src/main/java/de/learnlib/ralib/dt/DTLeaf.java @@ -14,7 +14,6 @@ import com.google.common.collect.Iterators; import com.google.common.collect.Sets; -import gov.nasa.jpf.constraints.api.Expression; import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; @@ -44,6 +43,7 @@ import de.learnlib.ralib.words.InputSymbol; import de.learnlib.ralib.words.PSymbolInstance; import de.learnlib.ralib.words.ParameterizedSymbol; +import gov.nasa.jpf.constraints.api.Expression; import net.automatalib.word.Word; public class DTLeaf extends DTNode implements LocationComponent { diff --git a/src/main/java/de/learnlib/ralib/learning/AutomatonBuilder.java b/src/main/java/de/learnlib/ralib/learning/AutomatonBuilder.java index 56c15689..195a4d29 100644 --- a/src/main/java/de/learnlib/ralib/learning/AutomatonBuilder.java +++ b/src/main/java/de/learnlib/ralib/learning/AutomatonBuilder.java @@ -20,8 +20,6 @@ import java.util.Map; import java.util.Map.Entry; -import de.learnlib.ralib.smt.SMTUtil; -import gov.nasa.jpf.constraints.api.Expression; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -40,9 +38,11 @@ import de.learnlib.ralib.dt.DTHyp; import de.learnlib.ralib.learning.rastar.RaStar; import de.learnlib.ralib.oracles.Branching; +import de.learnlib.ralib.smt.SMTUtil; import de.learnlib.ralib.words.DataWords; import de.learnlib.ralib.words.PSymbolInstance; import de.learnlib.ralib.words.ParameterizedSymbol; +import gov.nasa.jpf.constraints.api.Expression; import net.automatalib.word.Word; /** diff --git a/src/main/java/de/learnlib/ralib/learning/CounterexampleAnalysis.java b/src/main/java/de/learnlib/ralib/learning/CounterexampleAnalysis.java index 770e274c..79188bcf 100644 --- a/src/main/java/de/learnlib/ralib/learning/CounterexampleAnalysis.java +++ b/src/main/java/de/learnlib/ralib/learning/CounterexampleAnalysis.java @@ -18,7 +18,6 @@ import java.util.Map; -import gov.nasa.jpf.constraints.api.Expression; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -33,6 +32,7 @@ import de.learnlib.ralib.oracles.mto.SymbolicSuffixRestrictionBuilder; import de.learnlib.ralib.words.PSymbolInstance; import de.learnlib.ralib.words.ParameterizedSymbol; +import gov.nasa.jpf.constraints.api.Expression; import net.automatalib.word.Word; /** diff --git a/src/main/java/de/learnlib/ralib/learning/ralambda/RaLambda.java b/src/main/java/de/learnlib/ralib/learning/ralambda/RaLambda.java index 75baa052..2fb7b9a7 100644 --- a/src/main/java/de/learnlib/ralib/learning/ralambda/RaLambda.java +++ b/src/main/java/de/learnlib/ralib/learning/ralambda/RaLambda.java @@ -9,7 +9,6 @@ import java.util.Map; import java.util.Set; -import gov.nasa.jpf.constraints.api.Expression; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -49,6 +48,7 @@ import de.learnlib.ralib.smt.ConstraintSolver; import de.learnlib.ralib.words.PSymbolInstance; import de.learnlib.ralib.words.ParameterizedSymbol; +import gov.nasa.jpf.constraints.api.Expression; import net.automatalib.word.Word; public class RaLambda implements RaLearningAlgorithm { diff --git a/src/main/java/de/learnlib/ralib/learning/rastar/Component.java b/src/main/java/de/learnlib/ralib/learning/rastar/Component.java index 3f55a478..185a2744 100644 --- a/src/main/java/de/learnlib/ralib/learning/rastar/Component.java +++ b/src/main/java/de/learnlib/ralib/learning/rastar/Component.java @@ -25,7 +25,6 @@ import java.util.Map; import java.util.Map.Entry; -import gov.nasa.jpf.constraints.api.Expression; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -46,6 +45,7 @@ import de.learnlib.ralib.words.InputSymbol; import de.learnlib.ralib.words.PSymbolInstance; import de.learnlib.ralib.words.ParameterizedSymbol; +import gov.nasa.jpf.constraints.api.Expression; import net.automatalib.word.Word; /** diff --git a/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheorySDTLogicOracle.java b/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheorySDTLogicOracle.java index e5e17dfd..85bab22b 100644 --- a/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheorySDTLogicOracle.java +++ b/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheorySDTLogicOracle.java @@ -18,11 +18,6 @@ import java.util.Map; -import de.learnlib.ralib.smt.SMTUtil; -import gov.nasa.jpf.constraints.api.Expression; -import gov.nasa.jpf.constraints.api.Variable; -import gov.nasa.jpf.constraints.expressions.Negation; -import gov.nasa.jpf.constraints.util.ExpressionUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -38,9 +33,14 @@ import de.learnlib.ralib.learning.SymbolicDecisionTree; import de.learnlib.ralib.oracles.SDTLogicOracle; import de.learnlib.ralib.smt.ConstraintSolver; +import de.learnlib.ralib.smt.SMTUtil; import de.learnlib.ralib.theory.SDTGuard; import de.learnlib.ralib.words.DataWords; import de.learnlib.ralib.words.PSymbolInstance; +import gov.nasa.jpf.constraints.api.Expression; +import gov.nasa.jpf.constraints.api.Variable; +import gov.nasa.jpf.constraints.expressions.Negation; +import gov.nasa.jpf.constraints.util.ExpressionUtil; import net.automatalib.word.Word; /** diff --git a/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheoryTreeOracle.java b/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheoryTreeOracle.java index 213626d6..a9168031 100644 --- a/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheoryTreeOracle.java +++ b/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheoryTreeOracle.java @@ -30,9 +30,6 @@ import com.google.common.collect.Sets; -import de.learnlib.ralib.smt.SMTUtil; -import gov.nasa.jpf.constraints.api.Expression; -import gov.nasa.jpf.constraints.util.ExpressionUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -63,6 +60,7 @@ import de.learnlib.ralib.oracles.TreeQueryResult; import de.learnlib.ralib.oracles.mto.MultiTheoryBranching.Node; import de.learnlib.ralib.smt.ConstraintSolver; +import de.learnlib.ralib.smt.SMTUtil; import de.learnlib.ralib.theory.SDTAndGuard; import de.learnlib.ralib.theory.SDTGuard; import de.learnlib.ralib.theory.SDTTrueGuard; @@ -71,6 +69,8 @@ import de.learnlib.ralib.words.DataWords; import de.learnlib.ralib.words.PSymbolInstance; import de.learnlib.ralib.words.ParameterizedSymbol; +import gov.nasa.jpf.constraints.api.Expression; +import gov.nasa.jpf.constraints.util.ExpressionUtil; import net.automatalib.common.util.Pair; import net.automatalib.word.Word; diff --git a/src/main/java/de/learnlib/ralib/oracles/mto/SDT.java b/src/main/java/de/learnlib/ralib/oracles/mto/SDT.java index 8bc96b4c..26a1fe72 100644 --- a/src/main/java/de/learnlib/ralib/oracles/mto/SDT.java +++ b/src/main/java/de/learnlib/ralib/oracles/mto/SDT.java @@ -30,7 +30,6 @@ import de.learnlib.ralib.data.Mapping; import de.learnlib.ralib.data.SymbolicDataValue; import de.learnlib.ralib.data.SymbolicDataValue.Register; -import de.learnlib.ralib.data.SymbolicDataValue.SuffixValue; import de.learnlib.ralib.data.VarMapping; import de.learnlib.ralib.learning.SymbolicDecisionTree; import de.learnlib.ralib.smt.SMTUtil; diff --git a/src/main/java/de/learnlib/ralib/smt/ConstraintSolver.java b/src/main/java/de/learnlib/ralib/smt/ConstraintSolver.java index 8cca20fd..3958a683 100644 --- a/src/main/java/de/learnlib/ralib/smt/ConstraintSolver.java +++ b/src/main/java/de/learnlib/ralib/smt/ConstraintSolver.java @@ -16,14 +16,14 @@ */ package de.learnlib.ralib.smt; +import java.util.Properties; + import de.learnlib.ralib.data.DataValue; import de.learnlib.ralib.data.Mapping; import de.learnlib.ralib.data.SymbolicDataValue; import gov.nasa.jpf.constraints.api.Expression; import gov.nasa.jpf.constraints.solvers.nativez3.NativeZ3SolverProvider; -import java.util.Properties; - /** * * @author falk diff --git a/src/main/java/de/learnlib/ralib/smt/SMTUtil.java b/src/main/java/de/learnlib/ralib/smt/SMTUtil.java index 529e59ee..718cfd28 100644 --- a/src/main/java/de/learnlib/ralib/smt/SMTUtil.java +++ b/src/main/java/de/learnlib/ralib/smt/SMTUtil.java @@ -1,5 +1,7 @@ package de.learnlib.ralib.smt; +import java.util.*; + import de.learnlib.ralib.data.DataValue; import de.learnlib.ralib.data.Mapping; import de.learnlib.ralib.data.SymbolicDataValue; @@ -11,8 +13,6 @@ import gov.nasa.jpf.constraints.types.BuiltinTypes; import gov.nasa.jpf.constraints.util.ExpressionUtil; -import java.util.*; - public class SMTUtil { public static Valuation compose(Mapping... varVals) { diff --git a/src/main/java/de/learnlib/ralib/theory/SDTAndGuard.java b/src/main/java/de/learnlib/ralib/theory/SDTAndGuard.java index 688a31ae..03325901 100644 --- a/src/main/java/de/learnlib/ralib/theory/SDTAndGuard.java +++ b/src/main/java/de/learnlib/ralib/theory/SDTAndGuard.java @@ -19,7 +19,6 @@ import java.util.ArrayList; import java.util.List; import java.util.Objects; -import java.util.Set; import de.learnlib.ralib.data.SymbolicDataValue; import de.learnlib.ralib.data.SymbolicDataValue.SuffixValue; diff --git a/src/main/java/de/learnlib/ralib/theory/SDTGuardUtil.java b/src/main/java/de/learnlib/ralib/theory/SDTGuardUtil.java index 913484f4..7e56775a 100644 --- a/src/main/java/de/learnlib/ralib/theory/SDTGuardUtil.java +++ b/src/main/java/de/learnlib/ralib/theory/SDTGuardUtil.java @@ -1,15 +1,14 @@ package de.learnlib.ralib.theory; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Set; + import de.learnlib.ralib.data.SymbolicDataValue; import de.learnlib.ralib.theory.equality.DisequalityGuard; import de.learnlib.ralib.theory.equality.EqualityGuard; -import de.learnlib.ralib.theory.equality.EqualityTheory; import de.learnlib.ralib.theory.inequality.IntervalGuard; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Set; - public class SDTGuardUtil { public static Set mergeWith(SDTGuard thisGuard, SDTGuard other, diff --git a/src/main/java/de/learnlib/ralib/theory/SDTOrGuard.java b/src/main/java/de/learnlib/ralib/theory/SDTOrGuard.java index 73b79ef1..93d1156d 100644 --- a/src/main/java/de/learnlib/ralib/theory/SDTOrGuard.java +++ b/src/main/java/de/learnlib/ralib/theory/SDTOrGuard.java @@ -19,7 +19,6 @@ import java.util.ArrayList; import java.util.List; import java.util.Objects; -import java.util.Set; import de.learnlib.ralib.data.SymbolicDataValue; import de.learnlib.ralib.data.SymbolicDataValue.SuffixValue; diff --git a/src/main/java/de/learnlib/ralib/theory/equality/DisequalityGuard.java b/src/main/java/de/learnlib/ralib/theory/equality/DisequalityGuard.java index c58fe68a..b8523cf4 100644 --- a/src/main/java/de/learnlib/ralib/theory/equality/DisequalityGuard.java +++ b/src/main/java/de/learnlib/ralib/theory/equality/DisequalityGuard.java @@ -16,10 +16,7 @@ */ package de.learnlib.ralib.theory.equality; -import java.util.LinkedHashSet; -import java.util.List; import java.util.Objects; -import java.util.Set; import de.learnlib.ralib.data.SymbolicDataValue; import de.learnlib.ralib.data.VarMapping; diff --git a/src/main/java/de/learnlib/ralib/theory/equality/EqualityGuard.java b/src/main/java/de/learnlib/ralib/theory/equality/EqualityGuard.java index 339b7d22..f5f541ab 100644 --- a/src/main/java/de/learnlib/ralib/theory/equality/EqualityGuard.java +++ b/src/main/java/de/learnlib/ralib/theory/equality/EqualityGuard.java @@ -16,17 +16,12 @@ */ package de.learnlib.ralib.theory.equality; -import java.util.LinkedHashSet; -import java.util.List; import java.util.Objects; -import java.util.Set; import de.learnlib.ralib.data.SymbolicDataValue; import de.learnlib.ralib.data.SymbolicDataValue.SuffixValue; import de.learnlib.ralib.data.VarMapping; -import de.learnlib.ralib.theory.SDTGuard; import de.learnlib.ralib.theory.SDTIfGuard; -import de.learnlib.ralib.theory.SDTOrGuard; import gov.nasa.jpf.constraints.api.Expression; import gov.nasa.jpf.constraints.expressions.NumericBooleanExpression; import gov.nasa.jpf.constraints.expressions.NumericComparator; diff --git a/src/main/java/de/learnlib/ralib/words/DataWords.java b/src/main/java/de/learnlib/ralib/words/DataWords.java index b3f3cfc3..2ba3f904 100644 --- a/src/main/java/de/learnlib/ralib/words/DataWords.java +++ b/src/main/java/de/learnlib/ralib/words/DataWords.java @@ -19,7 +19,6 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; -import java.util.Iterator; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; @@ -32,7 +31,6 @@ import de.learnlib.ralib.data.ParValuation; import de.learnlib.ralib.data.SymbolicDataValue.Parameter; import de.learnlib.ralib.data.SymbolicDataValue.Register; -import de.learnlib.ralib.data.SymbolicDataValue.SuffixValue; import de.learnlib.ralib.data.VarValuation; import de.learnlib.ralib.data.util.SymbolicDataValueGenerator.ParameterGenerator; import net.automatalib.word.Word; @@ -100,7 +98,7 @@ public static DataType[] typesOf(Word word) { /** * returns set of unique data values of some type in a data word. * - * @param + * @param * @param word * @param t * @return @@ -119,7 +117,7 @@ public static Set valSet(Word word, DataType t) { /** * - * @param + * @param * @param in * @return */ diff --git a/src/test/java/de/learnlib/ralib/RaLibTestSuite.java b/src/test/java/de/learnlib/ralib/RaLibTestSuite.java index 63ebddb0..2ed335af 100644 --- a/src/test/java/de/learnlib/ralib/RaLibTestSuite.java +++ b/src/test/java/de/learnlib/ralib/RaLibTestSuite.java @@ -23,7 +23,6 @@ import org.testng.annotations.BeforeMethod; import org.testng.annotations.BeforeSuite; -import de.learnlib.ralib.data.DataType; import de.learnlib.ralib.words.OutputSymbol; import de.learnlib.ralib.words.ParameterizedSymbol; diff --git a/src/test/java/de/learnlib/ralib/TestUtil.java b/src/test/java/de/learnlib/ralib/TestUtil.java index a76995fc..acb93859 100644 --- a/src/test/java/de/learnlib/ralib/TestUtil.java +++ b/src/test/java/de/learnlib/ralib/TestUtil.java @@ -37,7 +37,6 @@ import de.learnlib.ralib.sul.SULOracle; import de.learnlib.ralib.theory.Theory; import de.learnlib.ralib.words.ParameterizedSymbol; -import gov.nasa.jpf.constraints.solvers.ConstraintSolverFactory; /** * diff --git a/src/test/java/de/learnlib/ralib/equivalence/RAEquivalenceTestTest.java b/src/test/java/de/learnlib/ralib/equivalence/RAEquivalenceTestTest.java index 74b21e4c..b6bd8198 100644 --- a/src/test/java/de/learnlib/ralib/equivalence/RAEquivalenceTestTest.java +++ b/src/test/java/de/learnlib/ralib/equivalence/RAEquivalenceTestTest.java @@ -8,10 +8,6 @@ import java.util.LinkedHashMap; import java.util.Map; -import gov.nasa.jpf.constraints.api.Expression; -import gov.nasa.jpf.constraints.expressions.NumericBooleanExpression; -import gov.nasa.jpf.constraints.expressions.NumericComparator; -import gov.nasa.jpf.constraints.util.ExpressionUtil; import org.testng.Assert; import org.testng.annotations.Test; @@ -32,6 +28,10 @@ import de.learnlib.ralib.theory.Theory; import de.learnlib.ralib.tools.theories.IntegerEqualityTheory; import de.learnlib.ralib.words.PSymbolInstance; +import gov.nasa.jpf.constraints.api.Expression; +import gov.nasa.jpf.constraints.expressions.NumericBooleanExpression; +import gov.nasa.jpf.constraints.expressions.NumericComparator; +import gov.nasa.jpf.constraints.util.ExpressionUtil; public class RAEquivalenceTestTest { @Test diff --git a/src/test/java/de/learnlib/ralib/example/llambda/LLambdaAutomatonExample.java b/src/test/java/de/learnlib/ralib/example/llambda/LLambdaAutomatonExample.java index 51344b23..5bb2e395 100644 --- a/src/test/java/de/learnlib/ralib/example/llambda/LLambdaAutomatonExample.java +++ b/src/test/java/de/learnlib/ralib/example/llambda/LLambdaAutomatonExample.java @@ -5,7 +5,6 @@ import de.learnlib.ralib.automata.MutableRegisterAutomaton; import de.learnlib.ralib.automata.RALocation; import de.learnlib.ralib.automata.RegisterAutomaton; -import de.learnlib.ralib.data.DataType; import de.learnlib.ralib.data.SymbolicDataValue; import de.learnlib.ralib.data.SymbolicDataValue.Register; import de.learnlib.ralib.data.VarMapping; diff --git a/src/test/java/de/learnlib/ralib/example/repeater/RepeaterSUL.java b/src/test/java/de/learnlib/ralib/example/repeater/RepeaterSUL.java index 908021af..66f9d0d3 100644 --- a/src/test/java/de/learnlib/ralib/example/repeater/RepeaterSUL.java +++ b/src/test/java/de/learnlib/ralib/example/repeater/RepeaterSUL.java @@ -1,5 +1,7 @@ package de.learnlib.ralib.example.repeater; +import java.math.BigDecimal; + import de.learnlib.exception.SULException; import de.learnlib.ralib.data.DataType; import de.learnlib.ralib.data.DataValue; @@ -9,8 +11,6 @@ import de.learnlib.ralib.words.PSymbolInstance; import de.learnlib.ralib.words.ParameterizedSymbol; -import java.math.BigDecimal; - public class RepeaterSUL extends DataWordSUL { public static final DataType TINT = new DataType("int"); diff --git a/src/test/java/de/learnlib/ralib/learning/QueryStatisticsTest.java b/src/test/java/de/learnlib/ralib/learning/QueryStatisticsTest.java index b07b2d24..42e3267e 100644 --- a/src/test/java/de/learnlib/ralib/learning/QueryStatisticsTest.java +++ b/src/test/java/de/learnlib/ralib/learning/QueryStatisticsTest.java @@ -6,7 +6,6 @@ import org.testng.annotations.Test; import de.learnlib.ralib.RaLibTestSuite; -import de.learnlib.ralib.data.DataType; import de.learnlib.ralib.sul.DataWordSUL; import de.learnlib.ralib.words.InputSymbol; import de.learnlib.ralib.words.PSymbolInstance; diff --git a/src/test/java/de/learnlib/ralib/learning/ralambda/IOHandlingTest.java b/src/test/java/de/learnlib/ralib/learning/ralambda/IOHandlingTest.java index b538b15e..c72f2008 100644 --- a/src/test/java/de/learnlib/ralib/learning/ralambda/IOHandlingTest.java +++ b/src/test/java/de/learnlib/ralib/learning/ralambda/IOHandlingTest.java @@ -11,10 +11,6 @@ import java.util.Map; import java.util.logging.Level; -import gov.nasa.jpf.constraints.api.Expression; -import gov.nasa.jpf.constraints.expressions.NumericBooleanExpression; -import gov.nasa.jpf.constraints.expressions.NumericComparator; -import gov.nasa.jpf.constraints.util.ExpressionUtil; import org.testng.Assert; import org.testng.annotations.Test; @@ -45,7 +41,6 @@ import de.learnlib.ralib.oracles.mto.MultiTheorySDTLogicOracle; import de.learnlib.ralib.oracles.mto.MultiTheoryTreeOracle; import de.learnlib.ralib.smt.ConstraintSolver; - import de.learnlib.ralib.sul.DataWordSUL; import de.learnlib.ralib.sul.SULOracle; import de.learnlib.ralib.sul.SimulatorSUL; @@ -55,6 +50,10 @@ import de.learnlib.ralib.words.InputSymbol; import de.learnlib.ralib.words.OutputSymbol; import de.learnlib.ralib.words.PSymbolInstance; +import gov.nasa.jpf.constraints.api.Expression; +import gov.nasa.jpf.constraints.expressions.NumericBooleanExpression; +import gov.nasa.jpf.constraints.expressions.NumericComparator; +import gov.nasa.jpf.constraints.util.ExpressionUtil; import net.automatalib.word.Word; public class IOHandlingTest extends RaLibTestSuite { diff --git a/src/test/java/de/learnlib/ralib/learning/ralambda/LearnABPOutputTest.java b/src/test/java/de/learnlib/ralib/learning/ralambda/LearnABPOutputTest.java index 9f650a94..da10dd87 100644 --- a/src/test/java/de/learnlib/ralib/learning/ralambda/LearnABPOutputTest.java +++ b/src/test/java/de/learnlib/ralib/learning/ralambda/LearnABPOutputTest.java @@ -29,7 +29,6 @@ import de.learnlib.ralib.oracles.mto.MultiTheorySDTLogicOracle; import de.learnlib.ralib.oracles.mto.MultiTheoryTreeOracle; import de.learnlib.ralib.smt.ConstraintSolver; - import de.learnlib.ralib.sul.DataWordSUL; import de.learnlib.ralib.sul.SULOracle; import de.learnlib.ralib.sul.SimulatorSUL; diff --git a/src/test/java/de/learnlib/ralib/learning/ralambda/LearnDtlsServerTest.java b/src/test/java/de/learnlib/ralib/learning/ralambda/LearnDtlsServerTest.java index 32193762..32a5c6dd 100644 --- a/src/test/java/de/learnlib/ralib/learning/ralambda/LearnDtlsServerTest.java +++ b/src/test/java/de/learnlib/ralib/learning/ralambda/LearnDtlsServerTest.java @@ -3,7 +3,6 @@ import java.util.LinkedHashMap; import java.util.Map; -import de.learnlib.ralib.smt.ConstraintSolver; import org.testng.Assert; import org.testng.annotations.Test; @@ -19,6 +18,7 @@ import de.learnlib.ralib.learning.Hypothesis; import de.learnlib.ralib.learning.RaLearningAlgorithmName; import de.learnlib.ralib.oracles.SimulatorOracle; +import de.learnlib.ralib.smt.ConstraintSolver; import de.learnlib.ralib.theory.Theory; import de.learnlib.ralib.tools.theories.IntegerEqualityTheory; import de.learnlib.ralib.words.PSymbolInstance; diff --git a/src/test/java/de/learnlib/ralib/learning/ralambda/LearnEchoTest.java b/src/test/java/de/learnlib/ralib/learning/ralambda/LearnEchoTest.java index ef5b116c..c84a3515 100644 --- a/src/test/java/de/learnlib/ralib/learning/ralambda/LearnEchoTest.java +++ b/src/test/java/de/learnlib/ralib/learning/ralambda/LearnEchoTest.java @@ -28,7 +28,6 @@ import de.learnlib.ralib.oracles.mto.MultiTheorySDTLogicOracle; import de.learnlib.ralib.oracles.mto.MultiTheoryTreeOracle; import de.learnlib.ralib.smt.ConstraintSolver; - import de.learnlib.ralib.sul.SULOracle; import de.learnlib.ralib.theory.Theory; import de.learnlib.ralib.tools.theories.IntegerEqualityTheory; diff --git a/src/test/java/de/learnlib/ralib/learning/ralambda/LearnLoginTest.java b/src/test/java/de/learnlib/ralib/learning/ralambda/LearnLoginTest.java index 5fffa0b8..0e7672d7 100644 --- a/src/test/java/de/learnlib/ralib/learning/ralambda/LearnLoginTest.java +++ b/src/test/java/de/learnlib/ralib/learning/ralambda/LearnLoginTest.java @@ -33,7 +33,6 @@ import de.learnlib.ralib.oracles.mto.MultiTheorySDTLogicOracle; import de.learnlib.ralib.oracles.mto.MultiTheoryTreeOracle; import de.learnlib.ralib.smt.ConstraintSolver; - import de.learnlib.ralib.theory.Theory; import de.learnlib.ralib.tools.theories.IntegerEqualityTheory; import de.learnlib.ralib.words.PSymbolInstance; diff --git a/src/test/java/de/learnlib/ralib/learning/ralambda/LearnMixedIOTest.java b/src/test/java/de/learnlib/ralib/learning/ralambda/LearnMixedIOTest.java index c73772c5..1794d381 100644 --- a/src/test/java/de/learnlib/ralib/learning/ralambda/LearnMixedIOTest.java +++ b/src/test/java/de/learnlib/ralib/learning/ralambda/LearnMixedIOTest.java @@ -23,7 +23,6 @@ import java.util.Random; import java.util.logging.Level; -import de.learnlib.ralib.smt.ConstraintSolver; import org.testng.Assert; import org.testng.annotations.Test; @@ -45,6 +44,7 @@ import de.learnlib.ralib.oracles.io.IOOracle; import de.learnlib.ralib.oracles.mto.MultiTheorySDTLogicOracle; import de.learnlib.ralib.oracles.mto.MultiTheoryTreeOracle; +import de.learnlib.ralib.smt.ConstraintSolver; import de.learnlib.ralib.sul.DataWordSUL; import de.learnlib.ralib.sul.SULOracle; import de.learnlib.ralib.sul.SimulatorSUL; diff --git a/src/test/java/de/learnlib/ralib/learning/ralambda/LearnPQIOTest.java b/src/test/java/de/learnlib/ralib/learning/ralambda/LearnPQIOTest.java index 069ccb26..7757937d 100644 --- a/src/test/java/de/learnlib/ralib/learning/ralambda/LearnPQIOTest.java +++ b/src/test/java/de/learnlib/ralib/learning/ralambda/LearnPQIOTest.java @@ -23,7 +23,6 @@ import java.util.Random; import java.util.logging.Level; -import de.learnlib.ralib.smt.ConstraintSolver; import org.testng.Assert; import org.testng.annotations.Test; @@ -46,6 +45,7 @@ import de.learnlib.ralib.oracles.io.IOOracle; import de.learnlib.ralib.oracles.mto.MultiTheorySDTLogicOracle; import de.learnlib.ralib.oracles.mto.MultiTheoryTreeOracle; +import de.learnlib.ralib.smt.ConstraintSolver; import de.learnlib.ralib.sul.SULOracle; import de.learnlib.ralib.theory.Theory; import de.learnlib.ralib.tools.theories.DoubleInequalityTheory; diff --git a/src/test/java/de/learnlib/ralib/learning/ralambda/LearnPQTest.java b/src/test/java/de/learnlib/ralib/learning/ralambda/LearnPQTest.java index cdf532c7..219b08a4 100644 --- a/src/test/java/de/learnlib/ralib/learning/ralambda/LearnPQTest.java +++ b/src/test/java/de/learnlib/ralib/learning/ralambda/LearnPQTest.java @@ -28,7 +28,6 @@ import java.util.Map; import java.util.logging.Level; -import de.learnlib.ralib.smt.ConstraintSolver; import org.testng.Assert; import org.testng.annotations.Test; @@ -48,6 +47,7 @@ import de.learnlib.ralib.oracles.TreeOracleFactory; import de.learnlib.ralib.oracles.mto.MultiTheorySDTLogicOracle; import de.learnlib.ralib.oracles.mto.MultiTheoryTreeOracle; +import de.learnlib.ralib.smt.ConstraintSolver; import de.learnlib.ralib.theory.Theory; import de.learnlib.ralib.tools.theories.DoubleInequalityTheory; import de.learnlib.ralib.words.PSymbolInstance; diff --git a/src/test/java/de/learnlib/ralib/learning/ralambda/LearnPadlock.java b/src/test/java/de/learnlib/ralib/learning/ralambda/LearnPadlock.java index 00beefbe..64ef8f33 100644 --- a/src/test/java/de/learnlib/ralib/learning/ralambda/LearnPadlock.java +++ b/src/test/java/de/learnlib/ralib/learning/ralambda/LearnPadlock.java @@ -5,10 +5,6 @@ import java.util.Map; import java.util.logging.Level; -import gov.nasa.jpf.constraints.api.Expression; -import gov.nasa.jpf.constraints.expressions.NumericBooleanExpression; -import gov.nasa.jpf.constraints.expressions.NumericComparator; -import gov.nasa.jpf.constraints.util.ExpressionUtil; import org.testng.annotations.Test; import de.learnlib.query.DefaultQuery; @@ -34,11 +30,14 @@ import de.learnlib.ralib.oracles.mto.MultiTheorySDTLogicOracle; import de.learnlib.ralib.oracles.mto.MultiTheoryTreeOracle; import de.learnlib.ralib.smt.ConstraintSolver; - import de.learnlib.ralib.theory.Theory; import de.learnlib.ralib.tools.theories.IntegerEqualityTheory; import de.learnlib.ralib.words.InputSymbol; import de.learnlib.ralib.words.PSymbolInstance; +import gov.nasa.jpf.constraints.api.Expression; +import gov.nasa.jpf.constraints.expressions.NumericBooleanExpression; +import gov.nasa.jpf.constraints.expressions.NumericComparator; +import gov.nasa.jpf.constraints.util.ExpressionUtil; import net.automatalib.word.Word; public class LearnPadlock extends RaLibTestSuite { diff --git a/src/test/java/de/learnlib/ralib/learning/ralambda/LearnSipIOTest.java b/src/test/java/de/learnlib/ralib/learning/ralambda/LearnSipIOTest.java index 51dc065b..c2457526 100644 --- a/src/test/java/de/learnlib/ralib/learning/ralambda/LearnSipIOTest.java +++ b/src/test/java/de/learnlib/ralib/learning/ralambda/LearnSipIOTest.java @@ -30,7 +30,6 @@ import de.learnlib.ralib.oracles.mto.MultiTheorySDTLogicOracle; import de.learnlib.ralib.oracles.mto.MultiTheoryTreeOracle; import de.learnlib.ralib.smt.ConstraintSolver; - import de.learnlib.ralib.sul.DataWordSUL; import de.learnlib.ralib.sul.SULOracle; import de.learnlib.ralib.sul.SimulatorSUL; diff --git a/src/test/java/de/learnlib/ralib/learning/ralambda/TestDistinguishingSuffixOptimization.java b/src/test/java/de/learnlib/ralib/learning/ralambda/TestDistinguishingSuffixOptimization.java index cd535e48..58939ee2 100644 --- a/src/test/java/de/learnlib/ralib/learning/ralambda/TestDistinguishingSuffixOptimization.java +++ b/src/test/java/de/learnlib/ralib/learning/ralambda/TestDistinguishingSuffixOptimization.java @@ -4,8 +4,6 @@ import java.util.Map; import java.util.Set; -import gov.nasa.jpf.constraints.api.Expression; -import gov.nasa.jpf.constraints.util.ExpressionUtil; import org.testng.Assert; import org.testng.annotations.Test; @@ -31,6 +29,8 @@ import de.learnlib.ralib.theory.Theory; import de.learnlib.ralib.words.InputSymbol; import de.learnlib.ralib.words.PSymbolInstance; +import gov.nasa.jpf.constraints.api.Expression; +import gov.nasa.jpf.constraints.util.ExpressionUtil; import net.automatalib.word.Word; public class TestDistinguishingSuffixOptimization { diff --git a/src/test/java/de/learnlib/ralib/learning/ralambda/TestOutputSuffixes.java b/src/test/java/de/learnlib/ralib/learning/ralambda/TestOutputSuffixes.java index c4aaf1c4..cc2e937d 100644 --- a/src/test/java/de/learnlib/ralib/learning/ralambda/TestOutputSuffixes.java +++ b/src/test/java/de/learnlib/ralib/learning/ralambda/TestOutputSuffixes.java @@ -27,7 +27,6 @@ import de.learnlib.ralib.oracles.mto.MultiTheorySDTLogicOracle; import de.learnlib.ralib.oracles.mto.MultiTheoryTreeOracle; import de.learnlib.ralib.smt.ConstraintSolver; - import de.learnlib.ralib.sul.DataWordSUL; import de.learnlib.ralib.sul.SULOracle; import de.learnlib.ralib.sul.SimulatorSUL; diff --git a/src/test/java/de/learnlib/ralib/learning/ralambda/TestQueryCount.java b/src/test/java/de/learnlib/ralib/learning/ralambda/TestQueryCount.java index c4117d7e..04a8d9ee 100644 --- a/src/test/java/de/learnlib/ralib/learning/ralambda/TestQueryCount.java +++ b/src/test/java/de/learnlib/ralib/learning/ralambda/TestQueryCount.java @@ -4,7 +4,6 @@ import java.util.LinkedHashMap; import java.util.Map; -import de.learnlib.ralib.smt.ConstraintSolver; import org.testng.Assert; import org.testng.annotations.Test; @@ -24,6 +23,7 @@ import de.learnlib.ralib.oracles.io.IOOracle; import de.learnlib.ralib.oracles.mto.MultiTheorySDTLogicOracle; import de.learnlib.ralib.oracles.mto.MultiTheoryTreeOracle; +import de.learnlib.ralib.smt.ConstraintSolver; import de.learnlib.ralib.sul.SULOracle; import de.learnlib.ralib.theory.Theory; import de.learnlib.ralib.tools.theories.DoubleInequalityTheory; diff --git a/src/test/java/de/learnlib/ralib/learning/ralambda/TestSymmetry.java b/src/test/java/de/learnlib/ralib/learning/ralambda/TestSymmetry.java index feeeabb3..2fb600a8 100644 --- a/src/test/java/de/learnlib/ralib/learning/ralambda/TestSymmetry.java +++ b/src/test/java/de/learnlib/ralib/learning/ralambda/TestSymmetry.java @@ -4,10 +4,6 @@ import java.util.LinkedHashMap; import java.util.Map; -import gov.nasa.jpf.constraints.api.Expression; -import gov.nasa.jpf.constraints.expressions.NumericBooleanExpression; -import gov.nasa.jpf.constraints.expressions.NumericComparator; -import gov.nasa.jpf.constraints.util.ExpressionUtil; import org.testng.Assert; import org.testng.annotations.Test; @@ -37,6 +33,10 @@ import de.learnlib.ralib.tools.theories.IntegerEqualityTheory; import de.learnlib.ralib.words.InputSymbol; import de.learnlib.ralib.words.PSymbolInstance; +import gov.nasa.jpf.constraints.api.Expression; +import gov.nasa.jpf.constraints.expressions.NumericBooleanExpression; +import gov.nasa.jpf.constraints.expressions.NumericComparator; +import gov.nasa.jpf.constraints.util.ExpressionUtil; import net.automatalib.word.Word; public class TestSymmetry extends RaLibTestSuite { diff --git a/src/test/java/de/learnlib/ralib/learning/ralambda/TestUnknownMemorable.java b/src/test/java/de/learnlib/ralib/learning/ralambda/TestUnknownMemorable.java index 4eaf5d5e..4a28c938 100644 --- a/src/test/java/de/learnlib/ralib/learning/ralambda/TestUnknownMemorable.java +++ b/src/test/java/de/learnlib/ralib/learning/ralambda/TestUnknownMemorable.java @@ -11,10 +11,6 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; -import gov.nasa.jpf.constraints.api.Expression; -import gov.nasa.jpf.constraints.expressions.NumericBooleanExpression; -import gov.nasa.jpf.constraints.expressions.NumericComparator; -import gov.nasa.jpf.constraints.util.ExpressionUtil; import org.testng.Assert; import org.testng.annotations.Test; @@ -53,6 +49,10 @@ import de.learnlib.ralib.words.OutputSymbol; import de.learnlib.ralib.words.PSymbolInstance; import de.learnlib.ralib.words.ParameterizedSymbol; +import gov.nasa.jpf.constraints.api.Expression; +import gov.nasa.jpf.constraints.expressions.NumericBooleanExpression; +import gov.nasa.jpf.constraints.expressions.NumericComparator; +import gov.nasa.jpf.constraints.util.ExpressionUtil; import net.automatalib.word.Word; public class TestUnknownMemorable extends RaLibTestSuite { diff --git a/src/test/java/de/learnlib/ralib/learning/rastar/LearnMixedIOTest.java b/src/test/java/de/learnlib/ralib/learning/rastar/LearnMixedIOTest.java index c4f84636..94ef700d 100644 --- a/src/test/java/de/learnlib/ralib/learning/rastar/LearnMixedIOTest.java +++ b/src/test/java/de/learnlib/ralib/learning/rastar/LearnMixedIOTest.java @@ -23,7 +23,6 @@ import java.util.Random; import java.util.logging.Level; -import de.learnlib.ralib.smt.ConstraintSolver; import org.testng.Assert; import org.testng.annotations.Test; @@ -45,6 +44,7 @@ import de.learnlib.ralib.oracles.io.IOOracle; import de.learnlib.ralib.oracles.mto.MultiTheorySDTLogicOracle; import de.learnlib.ralib.oracles.mto.MultiTheoryTreeOracle; +import de.learnlib.ralib.smt.ConstraintSolver; import de.learnlib.ralib.sul.DataWordSUL; import de.learnlib.ralib.sul.SULOracle; import de.learnlib.ralib.sul.SimulatorSUL; diff --git a/src/test/java/de/learnlib/ralib/learning/rastar/LearnPQIOTest.java b/src/test/java/de/learnlib/ralib/learning/rastar/LearnPQIOTest.java index 09696634..6471a56c 100644 --- a/src/test/java/de/learnlib/ralib/learning/rastar/LearnPQIOTest.java +++ b/src/test/java/de/learnlib/ralib/learning/rastar/LearnPQIOTest.java @@ -23,7 +23,6 @@ import java.util.Random; import java.util.logging.Level; -import de.learnlib.ralib.smt.ConstraintSolver; import org.testng.Assert; import org.testng.annotations.Test; @@ -46,6 +45,7 @@ import de.learnlib.ralib.oracles.io.IOOracle; import de.learnlib.ralib.oracles.mto.MultiTheorySDTLogicOracle; import de.learnlib.ralib.oracles.mto.MultiTheoryTreeOracle; +import de.learnlib.ralib.smt.ConstraintSolver; import de.learnlib.ralib.sul.SULOracle; import de.learnlib.ralib.theory.Theory; import de.learnlib.ralib.tools.theories.DoubleInequalityTheory; diff --git a/src/test/java/de/learnlib/ralib/learning/rastar/LearnPQTest.java b/src/test/java/de/learnlib/ralib/learning/rastar/LearnPQTest.java index 7e2f3a2e..9e46e9a5 100644 --- a/src/test/java/de/learnlib/ralib/learning/rastar/LearnPQTest.java +++ b/src/test/java/de/learnlib/ralib/learning/rastar/LearnPQTest.java @@ -26,7 +26,6 @@ import java.util.Map; import java.util.logging.Level; -import de.learnlib.ralib.smt.ConstraintSolver; import org.testng.Assert; import org.testng.annotations.Test; @@ -43,6 +42,7 @@ import de.learnlib.ralib.oracles.TreeOracleFactory; import de.learnlib.ralib.oracles.mto.MultiTheorySDTLogicOracle; import de.learnlib.ralib.oracles.mto.MultiTheoryTreeOracle; +import de.learnlib.ralib.smt.ConstraintSolver; import de.learnlib.ralib.theory.Theory; import de.learnlib.ralib.tools.theories.DoubleInequalityTheory; import de.learnlib.ralib.words.PSymbolInstance; diff --git a/src/test/java/de/learnlib/ralib/oracles/mto/ConstantsSDTBranchingTest.java b/src/test/java/de/learnlib/ralib/oracles/mto/ConstantsSDTBranchingTest.java index f9fbc275..bb7b986d 100644 --- a/src/test/java/de/learnlib/ralib/oracles/mto/ConstantsSDTBranchingTest.java +++ b/src/test/java/de/learnlib/ralib/oracles/mto/ConstantsSDTBranchingTest.java @@ -22,7 +22,6 @@ import java.util.Map; import java.util.logging.Level; -import de.learnlib.ralib.smt.ConstraintSolver; import org.testng.Assert; import org.testng.annotations.Test; @@ -36,7 +35,7 @@ import de.learnlib.ralib.learning.SymbolicSuffix; import de.learnlib.ralib.oracles.Branching; import de.learnlib.ralib.oracles.TreeQueryResult; - +import de.learnlib.ralib.smt.ConstraintSolver; import de.learnlib.ralib.sul.DataWordSUL; import de.learnlib.ralib.sul.SimulatorSUL; import de.learnlib.ralib.theory.Theory; diff --git a/src/test/java/de/learnlib/ralib/oracles/mto/FreshValuesTest.java b/src/test/java/de/learnlib/ralib/oracles/mto/FreshValuesTest.java index ffc105d0..b3d114e9 100644 --- a/src/test/java/de/learnlib/ralib/oracles/mto/FreshValuesTest.java +++ b/src/test/java/de/learnlib/ralib/oracles/mto/FreshValuesTest.java @@ -21,7 +21,6 @@ import java.util.Map; import java.util.logging.Level; -import de.learnlib.ralib.smt.ConstraintSolver; import org.testng.Assert; import org.testng.annotations.Test; @@ -37,6 +36,7 @@ import de.learnlib.ralib.oracles.io.IOCache; import de.learnlib.ralib.oracles.io.IOFilter; import de.learnlib.ralib.oracles.io.IOOracle; +import de.learnlib.ralib.smt.ConstraintSolver; import de.learnlib.ralib.sul.DataWordSUL; import de.learnlib.ralib.sul.SULOracle; import de.learnlib.ralib.sul.SimulatorSUL; diff --git a/src/test/java/de/learnlib/ralib/oracles/mto/InstantiateSymbolicWordTest.java b/src/test/java/de/learnlib/ralib/oracles/mto/InstantiateSymbolicWordTest.java index 02f013b9..c9a63147 100644 --- a/src/test/java/de/learnlib/ralib/oracles/mto/InstantiateSymbolicWordTest.java +++ b/src/test/java/de/learnlib/ralib/oracles/mto/InstantiateSymbolicWordTest.java @@ -9,10 +9,6 @@ import java.util.LinkedHashMap; import java.util.Map; -import gov.nasa.jpf.constraints.api.Expression; -import gov.nasa.jpf.constraints.expressions.NumericBooleanExpression; -import gov.nasa.jpf.constraints.expressions.NumericComparator; -import gov.nasa.jpf.constraints.util.ExpressionUtil; import org.testng.Assert; import org.testng.annotations.Test; @@ -33,11 +29,14 @@ import de.learnlib.ralib.oracles.SimulatorOracle; import de.learnlib.ralib.oracles.TreeQueryResult; import de.learnlib.ralib.smt.ConstraintSolver; - import de.learnlib.ralib.theory.Theory; import de.learnlib.ralib.tools.theories.IntegerEqualityTheory; import de.learnlib.ralib.words.InputSymbol; import de.learnlib.ralib.words.PSymbolInstance; +import gov.nasa.jpf.constraints.api.Expression; +import gov.nasa.jpf.constraints.expressions.NumericBooleanExpression; +import gov.nasa.jpf.constraints.expressions.NumericComparator; +import gov.nasa.jpf.constraints.util.ExpressionUtil; import net.automatalib.word.Word; public class InstantiateSymbolicWordTest { diff --git a/src/test/java/de/learnlib/ralib/oracles/mto/MultiSDTBranchingTest.java b/src/test/java/de/learnlib/ralib/oracles/mto/MultiSDTBranchingTest.java index c4529223..10587c41 100644 --- a/src/test/java/de/learnlib/ralib/oracles/mto/MultiSDTBranchingTest.java +++ b/src/test/java/de/learnlib/ralib/oracles/mto/MultiSDTBranchingTest.java @@ -22,7 +22,6 @@ import java.util.Map; import java.util.logging.Level; -import de.learnlib.ralib.smt.ConstraintSolver; import org.testng.Assert; import org.testng.annotations.Test; @@ -36,6 +35,7 @@ import de.learnlib.ralib.learning.SymbolicSuffix; import de.learnlib.ralib.oracles.Branching; import de.learnlib.ralib.oracles.TreeQueryResult; +import de.learnlib.ralib.smt.ConstraintSolver; import de.learnlib.ralib.sul.DataWordSUL; import de.learnlib.ralib.sul.SimulatorSUL; import de.learnlib.ralib.theory.Theory; diff --git a/src/test/java/de/learnlib/ralib/oracles/mto/MultipleSpecialCasesTest.java b/src/test/java/de/learnlib/ralib/oracles/mto/MultipleSpecialCasesTest.java index 43dbc984..44e41c69 100644 --- a/src/test/java/de/learnlib/ralib/oracles/mto/MultipleSpecialCasesTest.java +++ b/src/test/java/de/learnlib/ralib/oracles/mto/MultipleSpecialCasesTest.java @@ -20,7 +20,6 @@ import java.util.Map; import java.util.logging.Level; -import de.learnlib.ralib.smt.ConstraintSolver; import org.testng.Assert; import org.testng.annotations.Test; @@ -33,6 +32,7 @@ import de.learnlib.ralib.data.DataValue; import de.learnlib.ralib.learning.SymbolicSuffix; import de.learnlib.ralib.oracles.TreeQueryResult; +import de.learnlib.ralib.smt.ConstraintSolver; import de.learnlib.ralib.sul.DataWordSUL; import de.learnlib.ralib.sul.SimulatorSUL; import de.learnlib.ralib.theory.Theory; diff --git a/src/test/java/de/learnlib/ralib/oracles/mto/NonFreeSuffixValuesTest.java b/src/test/java/de/learnlib/ralib/oracles/mto/NonFreeSuffixValuesTest.java index daeb4b75..acad2991 100644 --- a/src/test/java/de/learnlib/ralib/oracles/mto/NonFreeSuffixValuesTest.java +++ b/src/test/java/de/learnlib/ralib/oracles/mto/NonFreeSuffixValuesTest.java @@ -42,7 +42,6 @@ import de.learnlib.ralib.oracles.io.IOFilter; import de.learnlib.ralib.oracles.io.IOOracle; import de.learnlib.ralib.smt.ConstraintSolver; - import de.learnlib.ralib.sul.DataWordSUL; import de.learnlib.ralib.sul.SULOracle; import de.learnlib.ralib.sul.SimulatorSUL; diff --git a/src/test/java/de/learnlib/ralib/oracles/mto/SIPSDTMergingTest.java b/src/test/java/de/learnlib/ralib/oracles/mto/SIPSDTMergingTest.java index 1ca98206..74e46bdc 100644 --- a/src/test/java/de/learnlib/ralib/oracles/mto/SIPSDTMergingTest.java +++ b/src/test/java/de/learnlib/ralib/oracles/mto/SIPSDTMergingTest.java @@ -21,7 +21,6 @@ import java.util.Map; import java.util.logging.Level; -import de.learnlib.ralib.smt.ConstraintSolver; import org.testng.Assert; import org.testng.annotations.Test; @@ -34,7 +33,7 @@ import de.learnlib.ralib.data.DataValue; import de.learnlib.ralib.learning.SymbolicSuffix; import de.learnlib.ralib.oracles.TreeQueryResult; - +import de.learnlib.ralib.smt.ConstraintSolver; import de.learnlib.ralib.sul.DataWordSUL; import de.learnlib.ralib.sul.SimulatorSUL; import de.learnlib.ralib.theory.Theory; diff --git a/src/test/java/de/learnlib/ralib/oracles/mto/SecondSDTBranchingTest.java b/src/test/java/de/learnlib/ralib/oracles/mto/SecondSDTBranchingTest.java index 53a0bcf0..fecd05b4 100644 --- a/src/test/java/de/learnlib/ralib/oracles/mto/SecondSDTBranchingTest.java +++ b/src/test/java/de/learnlib/ralib/oracles/mto/SecondSDTBranchingTest.java @@ -22,7 +22,6 @@ import java.util.Map; import java.util.logging.Level; -import de.learnlib.ralib.smt.ConstraintSolver; import org.testng.Assert; import org.testng.annotations.Test; @@ -41,6 +40,7 @@ import de.learnlib.ralib.learning.SymbolicSuffix; import de.learnlib.ralib.oracles.Branching; import de.learnlib.ralib.oracles.TreeQueryResult; +import de.learnlib.ralib.smt.ConstraintSolver; import de.learnlib.ralib.sul.DataWordSUL; import de.learnlib.ralib.sul.SimulatorSUL; import de.learnlib.ralib.theory.Theory; diff --git a/src/test/java/de/learnlib/ralib/oracles/mto/UntypedBranchingTest.java b/src/test/java/de/learnlib/ralib/oracles/mto/UntypedBranchingTest.java index 29760cfb..01c38f83 100644 --- a/src/test/java/de/learnlib/ralib/oracles/mto/UntypedBranchingTest.java +++ b/src/test/java/de/learnlib/ralib/oracles/mto/UntypedBranchingTest.java @@ -40,7 +40,6 @@ import java.util.Map; import java.util.logging.Level; -import de.learnlib.ralib.smt.ConstraintSolver; import org.testng.Assert; import org.testng.annotations.Test; @@ -61,7 +60,7 @@ import de.learnlib.ralib.learning.SymbolicSuffix; import de.learnlib.ralib.oracles.Branching; import de.learnlib.ralib.oracles.TreeQueryResult; - +import de.learnlib.ralib.smt.ConstraintSolver; import de.learnlib.ralib.sul.DataWordSUL; import de.learnlib.ralib.sul.SimulatorSUL; import de.learnlib.ralib.theory.Theory; diff --git a/src/test/java/de/learnlib/ralib/theory/EquivalenceClassCoverageTest.java b/src/test/java/de/learnlib/ralib/theory/EquivalenceClassCoverageTest.java index 10f0ccb3..f41e8788 100644 --- a/src/test/java/de/learnlib/ralib/theory/EquivalenceClassCoverageTest.java +++ b/src/test/java/de/learnlib/ralib/theory/EquivalenceClassCoverageTest.java @@ -19,7 +19,6 @@ import de.learnlib.ralib.learning.SymbolicSuffix; import de.learnlib.ralib.oracles.mto.MultiTheoryTreeOracle; import de.learnlib.ralib.smt.ConstraintSolver; - import de.learnlib.ralib.theory.inequality.IntervalGuard; import de.learnlib.ralib.tools.theories.DoubleInequalityTheory; import de.learnlib.ralib.tools.theories.IntegerEqualityTheory; diff --git a/src/test/java/de/learnlib/ralib/theory/TestEqualityTheory.java b/src/test/java/de/learnlib/ralib/theory/TestEqualityTheory.java index 2b77ba34..3742da42 100644 --- a/src/test/java/de/learnlib/ralib/theory/TestEqualityTheory.java +++ b/src/test/java/de/learnlib/ralib/theory/TestEqualityTheory.java @@ -28,7 +28,6 @@ import java.util.Map; import java.util.logging.Level; -import de.learnlib.ralib.smt.ConstraintSolver; import org.testng.Assert; import org.testng.annotations.Test; @@ -46,7 +45,7 @@ import de.learnlib.ralib.oracles.SimulatorOracle; import de.learnlib.ralib.oracles.TreeQueryResult; import de.learnlib.ralib.oracles.mto.MultiTheoryTreeOracle; - +import de.learnlib.ralib.smt.ConstraintSolver; import de.learnlib.ralib.tools.theories.IntegerEqualityTheory; import de.learnlib.ralib.words.PSymbolInstance; import net.automatalib.word.Word; diff --git a/src/test/java/de/learnlib/ralib/theory/TestIneqEqTree.java b/src/test/java/de/learnlib/ralib/theory/TestIneqEqTree.java index 8a33279d..5fe12da8 100644 --- a/src/test/java/de/learnlib/ralib/theory/TestIneqEqTree.java +++ b/src/test/java/de/learnlib/ralib/theory/TestIneqEqTree.java @@ -23,7 +23,6 @@ import java.util.Map; import java.util.logging.Level; -import de.learnlib.ralib.smt.ConstraintSolver; import org.testng.Assert; import org.testng.annotations.Test; @@ -41,6 +40,7 @@ import de.learnlib.ralib.oracles.Branching; import de.learnlib.ralib.oracles.TreeQueryResult; import de.learnlib.ralib.oracles.mto.MultiTheoryTreeOracle; +import de.learnlib.ralib.smt.ConstraintSolver; import de.learnlib.ralib.tools.theories.DoubleInequalityTheory; import de.learnlib.ralib.words.PSymbolInstance; import net.automatalib.word.Word; diff --git a/src/test/java/de/learnlib/ralib/theory/TestIneqOutputTree.java b/src/test/java/de/learnlib/ralib/theory/TestIneqOutputTree.java index 752f96aa..d44b747c 100644 --- a/src/test/java/de/learnlib/ralib/theory/TestIneqOutputTree.java +++ b/src/test/java/de/learnlib/ralib/theory/TestIneqOutputTree.java @@ -23,7 +23,6 @@ import java.util.Map; import java.util.logging.Level; -import de.learnlib.ralib.smt.ConstraintSolver; import org.testng.Assert; import org.testng.annotations.Test; @@ -38,6 +37,7 @@ import de.learnlib.ralib.learning.SymbolicSuffix; import de.learnlib.ralib.oracles.TreeQueryResult; import de.learnlib.ralib.oracles.mto.MultiTheoryTreeOracle; +import de.learnlib.ralib.smt.ConstraintSolver; import de.learnlib.ralib.sul.DataWordSUL; import de.learnlib.ralib.tools.theories.DoubleInequalityTheory; import de.learnlib.ralib.words.InputSymbol; diff --git a/src/test/java/de/learnlib/ralib/theory/TestTreeOracle.java b/src/test/java/de/learnlib/ralib/theory/TestTreeOracle.java index 1db71f34..cc1074d7 100644 --- a/src/test/java/de/learnlib/ralib/theory/TestTreeOracle.java +++ b/src/test/java/de/learnlib/ralib/theory/TestTreeOracle.java @@ -23,8 +23,6 @@ import java.util.Map; import java.util.logging.Level; -import de.learnlib.ralib.smt.ConstraintSolver; -import de.learnlib.ralib.tools.theories.IntegerEqualityTheory; import org.testng.Assert; import org.testng.annotations.Test; @@ -37,7 +35,8 @@ import de.learnlib.ralib.oracles.DataWordOracle; import de.learnlib.ralib.oracles.TreeQueryResult; import de.learnlib.ralib.oracles.mto.MultiTheoryTreeOracle; - +import de.learnlib.ralib.smt.ConstraintSolver; +import de.learnlib.ralib.tools.theories.IntegerEqualityTheory; import de.learnlib.ralib.words.InputSymbol; import de.learnlib.ralib.words.PSymbolInstance; import de.learnlib.ralib.words.ParameterizedSymbol; diff --git a/src/test/java/de/learnlib/ralib/theory/TestUniqueEqualityTheory.java b/src/test/java/de/learnlib/ralib/theory/TestUniqueEqualityTheory.java index 54bb21af..5037b101 100644 --- a/src/test/java/de/learnlib/ralib/theory/TestUniqueEqualityTheory.java +++ b/src/test/java/de/learnlib/ralib/theory/TestUniqueEqualityTheory.java @@ -7,7 +7,6 @@ import java.util.Map; import java.util.logging.Level; -import de.learnlib.ralib.smt.ConstraintSolver; import org.testng.Assert; import org.testng.annotations.Test; @@ -20,7 +19,7 @@ import de.learnlib.ralib.oracles.SimulatorOracle; import de.learnlib.ralib.oracles.TreeQueryResult; import de.learnlib.ralib.oracles.mto.MultiTheoryTreeOracle; - +import de.learnlib.ralib.smt.ConstraintSolver; import de.learnlib.ralib.tools.theories.UniqueIntegerEqualityTheory; import de.learnlib.ralib.words.PSymbolInstance; import net.automatalib.word.Word; From 086dfae4e434943bad1370baef5d4b1de2b78bb0 Mon Sep 17 00:00:00 2001 From: Falk Howar Date: Tue, 25 Feb 2025 23:08:57 +0100 Subject: [PATCH 08/26] simplified SDTGuards --- src/main/java/de/learnlib/ralib/dt/DT.java | 3 +- .../oracles/mto/MultiTheoryBranching.java | 2 +- .../mto/MultiTheorySDTLogicOracle.java | 2 +- .../oracles/mto/MultiTheoryTreeOracle.java | 50 +- .../mto/OptimizedSymbolicSuffixBuilder.java | 13 +- .../de/learnlib/ralib/oracles/mto/SDT.java | 64 +-- .../learnlib/ralib/oracles/mto/SDTLeaf.java | 3 +- .../ralib/theory/IntervalGuardUtil.java | 183 ++++++ .../de/learnlib/ralib/theory/SDTAndGuard.java | 106 ---- .../de/learnlib/ralib/theory/SDTGuard.java | 282 +++++++++- .../learnlib/ralib/theory/SDTGuardUtil.java | 49 +- .../de/learnlib/ralib/theory/SDTIfGuard.java | 71 --- .../learnlib/ralib/theory/SDTMultiGuard.java | 126 ----- .../de/learnlib/ralib/theory/SDTOrGuard.java | 105 ---- .../learnlib/ralib/theory/SDTTrueGuard.java | 96 ---- .../ralib/theory/SuffixValueRestriction.java | 8 +- .../theory/equality/DisequalityGuard.java | 110 ---- .../ralib/theory/equality/EqualityGuard.java | 108 ---- .../ralib/theory/equality/EqualityTheory.java | 91 ++- .../theory/equality/UniqueEqualityTheory.java | 3 +- .../inequality/InequalityTheoryWithEq.java | 519 +++--------------- .../theory/inequality/IntervalGuard.java | 334 ----------- .../theories/DoubleInequalityTheory.java | 39 +- .../ralib/dt/RegisterConsistencyTest.java | 21 +- .../OptimizedSymbolicSuffixBuilderTest.java | 263 +++++---- .../theory/EquivalenceClassCoverageTest.java | 3 +- 26 files changed, 832 insertions(+), 1822 deletions(-) create mode 100644 src/main/java/de/learnlib/ralib/theory/IntervalGuardUtil.java delete mode 100644 src/main/java/de/learnlib/ralib/theory/SDTAndGuard.java delete mode 100644 src/main/java/de/learnlib/ralib/theory/SDTIfGuard.java delete mode 100644 src/main/java/de/learnlib/ralib/theory/SDTMultiGuard.java delete mode 100644 src/main/java/de/learnlib/ralib/theory/SDTOrGuard.java delete mode 100644 src/main/java/de/learnlib/ralib/theory/SDTTrueGuard.java delete mode 100644 src/main/java/de/learnlib/ralib/theory/equality/DisequalityGuard.java delete mode 100644 src/main/java/de/learnlib/ralib/theory/equality/EqualityGuard.java delete mode 100644 src/main/java/de/learnlib/ralib/theory/inequality/IntervalGuard.java diff --git a/src/main/java/de/learnlib/ralib/dt/DT.java b/src/main/java/de/learnlib/ralib/dt/DT.java index 55ad234e..653785fb 100644 --- a/src/main/java/de/learnlib/ralib/dt/DT.java +++ b/src/main/java/de/learnlib/ralib/dt/DT.java @@ -30,7 +30,6 @@ import de.learnlib.ralib.oracles.mto.SDTLeaf; import de.learnlib.ralib.oracles.mto.SymbolicSuffixRestrictionBuilder; import de.learnlib.ralib.theory.SDTGuard; -import de.learnlib.ralib.theory.SDTTrueGuard; import de.learnlib.ralib.words.OutputSymbol; import de.learnlib.ralib.words.PSymbolInstance; import de.learnlib.ralib.words.ParameterizedSymbol; @@ -126,7 +125,7 @@ private SDT makeRejectingSDT(OutputSymbol symbol, SuffixValueGenerator sgen, int DataType param = symbol.getPtypes()[paramIndex]; SuffixValue s = sgen.next(param); LinkedHashMap map = new LinkedHashMap(); - map.put(new SDTTrueGuard(s), makeRejectingSDT(symbol, sgen, paramIndex + 1)); + map.put(new SDTGuard.SDTTrueGuard(s), makeRejectingSDT(symbol, sgen, paramIndex + 1)); return new SDT(map); } } diff --git a/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheoryBranching.java b/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheoryBranching.java index 700dfe09..63ca0e4a 100644 --- a/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheoryBranching.java +++ b/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheoryBranching.java @@ -237,7 +237,7 @@ public Map, Expression> getBranches() { List > gExpr = new ArrayList<>(); List gList = entry.getValue(); for (SDTGuard g : gList) { - gExpr.add(renameSuffixValues(g.toExpr())); + gExpr.add(renameSuffixValues(SDTGuard.toExpr(g))); } Expression tg = ExpressionUtil.and( gExpr.stream().toList().toArray(new Expression[]{}) diff --git a/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheorySDTLogicOracle.java b/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheorySDTLogicOracle.java index 85bab22b..075cd9be 100644 --- a/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheorySDTLogicOracle.java +++ b/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheorySDTLogicOracle.java @@ -251,7 +251,7 @@ private boolean accepts(Word word, Word prefix newValuation.put(suffixValue, value); boolean found = false; for (Map.Entry entry : nextSdt.getChildren().entrySet()) { - Expression guardExpr = entry.getKey().toExpr(); + Expression guardExpr = SDTGuard.toExpr(entry.getKey()); if (solver.isSatisfiable(guardExpr, newValuation)) { nextSdt = entry.getValue(); found = true; diff --git a/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheoryTreeOracle.java b/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheoryTreeOracle.java index a9168031..86752177 100644 --- a/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheoryTreeOracle.java +++ b/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheoryTreeOracle.java @@ -61,11 +61,8 @@ import de.learnlib.ralib.oracles.mto.MultiTheoryBranching.Node; import de.learnlib.ralib.smt.ConstraintSolver; import de.learnlib.ralib.smt.SMTUtil; -import de.learnlib.ralib.theory.SDTAndGuard; import de.learnlib.ralib.theory.SDTGuard; -import de.learnlib.ralib.theory.SDTTrueGuard; import de.learnlib.ralib.theory.Theory; -import de.learnlib.ralib.theory.equality.EqualityGuard; import de.learnlib.ralib.words.DataWords; import de.learnlib.ralib.words.PSymbolInstance; import de.learnlib.ralib.words.ParameterizedSymbol; @@ -218,7 +215,7 @@ private Node createFreshNode(int i, Word prefix, ParameterizedS DataType type = ps.getPtypes()[i - 1]; LOGGER.trace(Category.QUERY, "current type: " + type.getName()); Parameter p = new Parameter(type, i); - SDTGuard guard = new SDTTrueGuard(new SuffixValue(type, i)); + SDTGuard guard = new SDTGuard.SDTTrueGuard(new SuffixValue(type, i)); Theory teach = teachers.get(type); DataValue dvi = teach.instantiate(prefix, ps, piv, pval, constants, guard, p, new LinkedHashSet<>()); @@ -376,54 +373,55 @@ public SDTGuard conjoin(SDTGuard guard1, SDTGuard guard2) { if (guard1.equals(guard2)) return guard1; - if (guard1 instanceof SDTTrueGuard) { + if (guard1 instanceof SDTGuard.SDTTrueGuard) { return guard2; } - if (guard2 instanceof SDTTrueGuard) { + if (guard2 instanceof SDTGuard.SDTTrueGuard) { return guard1; } - if (guard1 instanceof SDTAndGuard && guard2 instanceof SDTAndGuard) { - List guards = new ArrayList(((SDTAndGuard) guard1).getGuards()); - guards.addAll(((SDTAndGuard) guard2).getGuards()); - return new SDTAndGuard(guard1.getParameter(), guards.toArray(new SDTGuard[] {})); + if (guard1 instanceof SDTGuard.SDTAndGuard && guard2 instanceof SDTGuard.SDTAndGuard) { + List guards = new ArrayList(((SDTGuard.SDTAndGuard) guard1).conjuncts()); + guards.addAll(((SDTGuard.SDTAndGuard) guard2).conjuncts()); + return new SDTGuard.SDTAndGuard(guard1.getParameter(), guards); } - if (guard1 instanceof SDTAndGuard || guard2 instanceof SDTAndGuard) { - SDTAndGuard andGuard = guard1 instanceof SDTAndGuard ? (SDTAndGuard) guard1 : (SDTAndGuard) guard2; - SDTGuard otherGuard = guard2 instanceof SDTAndGuard ? guard1 : guard2; - SDTGuard[] conjuncts = andGuard.getGuards().toArray(new SDTGuard[andGuard.getGuards().size() + 1]); - conjuncts[conjuncts.length - 1] = otherGuard; - return new SDTAndGuard(guard1.getParameter(), conjuncts); + if (guard1 instanceof SDTGuard.SDTAndGuard || guard2 instanceof SDTGuard.SDTAndGuard) { + SDTGuard.SDTAndGuard andGuard = guard1 instanceof SDTGuard.SDTAndGuard ? + (SDTGuard.SDTAndGuard) guard1 : (SDTGuard.SDTAndGuard) guard2; + SDTGuard otherGuard = guard2 instanceof SDTGuard.SDTAndGuard ? guard1 : guard2; + List conjuncts = andGuard.conjuncts(); + conjuncts.add(otherGuard); + return new SDTGuard.SDTAndGuard(guard1.getParameter(), conjuncts); } - return new SDTAndGuard(guard1.getParameter(), guard1, guard2); + return new SDTGuard.SDTAndGuard(guard1.getParameter(), List.of(guard1, guard2)); } private boolean canBeMerged(SDTGuard a, SDTGuard b, MultiTheorySDTLogicOracle mlo, Mapping valuation) { - if (a.equals(b) || a instanceof SDTTrueGuard || b instanceof SDTTrueGuard) + if (a.equals(b) || a instanceof SDTGuard.SDTTrueGuard || b instanceof SDTGuard.SDTTrueGuard) return true; // FIXME: Falk added this to prevent and of two equals - if (a instanceof EqualityGuard && b instanceof EqualityGuard) + if (a instanceof SDTGuard.EqualityGuard && b instanceof SDTGuard.EqualityGuard) return false; // some quick answers, implemented for compatibility with older theories. - if (a instanceof EqualityGuard) - if (b.equals(((EqualityGuard) a).toDeqGuard())) + if (a instanceof SDTGuard.EqualityGuard) + if (b.equals( SDTGuard.toDeqGuard(a) )) return false; - if (b instanceof EqualityGuard) - if (a.equals(((EqualityGuard) b).toDeqGuard())) + if (b instanceof SDTGuard.EqualityGuard) + if (a.equals( SDTGuard.toDeqGuard(b) )) return false; - return !mlo.areMutuallyExclusive(a.toExpr(), new PIV(), b.toExpr(), new PIV(), valuation); + return !mlo.areMutuallyExclusive(SDTGuard.toExpr(a), new PIV(), SDTGuard.toExpr(b), new PIV(), valuation); } private boolean refines(SDTGuard a, SDTGuard b, MultiTheorySDTLogicOracle mlo, Mapping valuation) { - if (b instanceof SDTTrueGuard) + if (b instanceof SDTGuard.SDTTrueGuard) return true; - boolean ref1 = mlo.doesRefine(a.toExpr(), new PIV(), b.toExpr(), new PIV(), valuation); + boolean ref1 = mlo.doesRefine(SDTGuard.toExpr(a), new PIV(), SDTGuard.toExpr(b), new PIV(), valuation); return ref1; } diff --git a/src/main/java/de/learnlib/ralib/oracles/mto/OptimizedSymbolicSuffixBuilder.java b/src/main/java/de/learnlib/ralib/oracles/mto/OptimizedSymbolicSuffixBuilder.java index 8d3388d2..08fe1329 100644 --- a/src/main/java/de/learnlib/ralib/oracles/mto/OptimizedSymbolicSuffixBuilder.java +++ b/src/main/java/de/learnlib/ralib/oracles/mto/OptimizedSymbolicSuffixBuilder.java @@ -22,6 +22,7 @@ import de.learnlib.ralib.learning.SymbolicSuffix; import de.learnlib.ralib.smt.ConstraintSolver; import de.learnlib.ralib.theory.SDTGuard; +import de.learnlib.ralib.theory.SDTGuardUtil; import de.learnlib.ralib.theory.SuffixValueRestriction; import de.learnlib.ralib.theory.UnrestrictedSuffixValue; import de.learnlib.ralib.words.DataWords; @@ -123,7 +124,7 @@ SymbolicSuffix extendSuffix(Word prefix, List sdtPath SuffixValue oldSV = guard.getParameter(); SuffixValue newSV = new SuffixValue(oldSV.getDataType(), oldSV.getId()+actionArity); renaming.put(oldSV, newSV); - SDTGuard renamedGuard = guard.relabel(renaming); + SDTGuard renamedGuard = SDTGuard.relabel(guard, renaming); SuffixValueRestriction restr = restrictionBuilder.restrictSuffixValue(renamedGuard, restrictions); restrictions.put(newSV, restr); } @@ -179,7 +180,7 @@ private boolean branchContainsRegister(LabeledSDT node, SymbolicDataValue[] regi for (Map.Entry e : node.getChildren().entrySet()) { SDTGuard guard = e.getKey(); LabeledSDT child = e.getValue(); - Set comparands = guard.getComparands(guard.getParameter()); + Set comparands = SDTGuard.getComparands(guard,guard.getParameter()); for (SymbolicDataValue sdv : registers) { if (comparands.contains(sdv)) { return true; @@ -195,7 +196,7 @@ private boolean branchContainsRegister(LabeledSDT node, SymbolicDataValue[] regi private boolean guardOnRegisters(SDTGuard guard, SymbolicDataValue[] registers) { SuffixValue sv = guard.getParameter(); for (SymbolicDataValue r : registers) { - if (guard.getComparands(sv).contains(r)) { + if (SDTGuard.getComparands(guard, sv).contains(r)) { return true; } } @@ -228,7 +229,7 @@ public boolean sdtRevealsRegister(SDT sdt, SymbolicDataValue register) { for (Map.Entry branch : children.entrySet()) { SDTGuard guard = branch.getKey(); SDT s = branch.getValue(); - if (guard.getComparands(guard.getParameter()).contains(register)) { + if (SDTGuard.getComparands(guard, guard.getParameter()).contains(register)) { guards.add(guard); } else { boolean revealed = sdtRevealsRegister(s, register); @@ -274,7 +275,7 @@ private boolean guardsOnRegisterHaveBothOutcomes(SDT sdt, SymbolicDataValue regi Map childrenWithRegister = new LinkedHashMap<>(); for (Map.Entry e : sdt.getChildren().entrySet()) { - if (!e.getKey().getComparands(register).isEmpty()) { + if (!SDTGuard.getComparands(e.getKey(), register).isEmpty()) { childrenWithRegister.put(e.getKey(), e.getValue()); } } @@ -429,7 +430,7 @@ private int score(SymbolicSuffix suffix) { private Expression toGuardExpression(List guards) { List> expr = new ArrayList<>(); for (SDTGuard g : guards) { - expr.add(g.toExpr()); + expr.add(SDTGuard.toExpr(g)); } Expression [] exprArr = new Expression[expr.size()]; return ExpressionUtil.and(expr.toArray(exprArr)); diff --git a/src/main/java/de/learnlib/ralib/oracles/mto/SDT.java b/src/main/java/de/learnlib/ralib/oracles/mto/SDT.java index 26a1fe72..017c7a10 100644 --- a/src/main/java/de/learnlib/ralib/oracles/mto/SDT.java +++ b/src/main/java/de/learnlib/ralib/oracles/mto/SDT.java @@ -33,11 +33,7 @@ import de.learnlib.ralib.data.VarMapping; import de.learnlib.ralib.learning.SymbolicDecisionTree; import de.learnlib.ralib.smt.SMTUtil; -import de.learnlib.ralib.theory.SDTGuard; -import de.learnlib.ralib.theory.SDTIfGuard; -import de.learnlib.ralib.theory.SDTMultiGuard; -import de.learnlib.ralib.theory.SDTTrueGuard; -import de.learnlib.ralib.theory.inequality.IntervalGuard; +import de.learnlib.ralib.theory.*; import gov.nasa.jpf.constraints.api.Expression; import gov.nasa.jpf.constraints.util.ExpressionUtil; @@ -80,27 +76,28 @@ public Set getVariables() { Set variables = new LinkedHashSet<>(); for (Entry e : children.entrySet()) { SDTGuard g = e.getKey(); - if (g instanceof SDTIfGuard) { - SymbolicDataValue r = ((SDTIfGuard) g).getRegister(); + if (g instanceof SDTGuard.EqualityGuard eg) { + SymbolicDataValue r = eg.register(); variables.add(r); - } else if (g instanceof SDTMultiGuard) { - for (SDTGuard ifG : ((SDTMultiGuard) g).getGuards()) { - if (ifG instanceof SDTIfGuard) { - SymbolicDataValue ifr = ((SDTIfGuard) ifG).getRegister(); - variables.add(ifr); - } else if (ifG instanceof SDTMultiGuard) { - Set rSet = ((SDTMultiGuard) ifG).getAllRegs(); - variables.addAll(rSet); - } + } else if (g instanceof SDTGuard.DisequalityGuard dg) { + SymbolicDataValue r = dg.register(); + variables.add(r); + } else if (g instanceof SDTGuard.SDTAndGuard ag) { + for (SDTGuard ifG : ag.conjuncts()) { + variables.addAll(ifG.getRegisters()); } - } else if (g instanceof IntervalGuard iGuard) { + } else if (g instanceof SDTGuard.SDTOrGuard og) { + for (SDTGuard ifG : og.disjuncts()) { + variables.addAll(ifG.getRegisters()); + } + } else if (g instanceof SDTGuard.IntervalGuard iGuard) { if (!iGuard.isBiggerGuard()) { - variables.add(iGuard.getRightReg()); + variables.add(iGuard.rightLimit()); } if (!iGuard.isSmallerGuard()) { - variables.add(iGuard.getLeftReg()); + variables.add(iGuard.leftLimit()); } - } else if (!(g instanceof SDTTrueGuard)) { + } else if (!(g instanceof SDTGuard.SDTTrueGuard)) { throw new RuntimeException("unexpected case"); } SDT child = e.getValue(); @@ -114,14 +111,12 @@ public Set getVariables() { @Override public boolean isAccepting() { - if (this instanceof SDTLeaf) { - return this.isAccepting(); - } else { + for (Map.Entry e : children.entrySet()) { if (!e.getValue().isAccepting()) { return false; } - } + } return true; @@ -154,7 +149,7 @@ public boolean isEquivalent( } public boolean isEquivalentUnder( - SymbolicDecisionTree deqSDT, List ds) { + SymbolicDecisionTree deqSDT, List ds) { if (deqSDT instanceof SDTLeaf) { if (this instanceof SDTLeaf) { return (this.isAccepting() == deqSDT.isAccepting()); @@ -162,8 +157,8 @@ public boolean isEquivalentUnder( return false; } VarMapping eqRenaming = new VarMapping<>(); - for (SDTIfGuard d : ds) { - eqRenaming.put(d.getParameter(), d.getRegister()); + for (SDTGuard.EqualityGuard d : ds) { + eqRenaming.put(d.parameter(), d.register()); } // System.out.println(eqRenaming); // System.out.println(this + " vs " + deqSDT); @@ -171,10 +166,10 @@ public boolean isEquivalentUnder( return x; } - public SDT relabelUnderEq(List ds) { + public SDT relabelUnderEq(List ds) { VarMapping eqRenaming = new VarMapping<>(); - for (SDTIfGuard d : ds) { - eqRenaming.put(d.getParameter(), d.getRegister()); + for (SDTGuard.EqualityGuard d : ds) { + eqRenaming.put(d.parameter(), d.register()); } return (SDT) this.relabel(eqRenaming); } @@ -190,7 +185,7 @@ public SymbolicDecisionTree relabel(VarMapping relabelling) { Map reChildren = new LinkedHashMap<>(); // for each of the kids for (Entry e : thisSdt.children.entrySet()) { - reChildren.put(e.getKey().relabel(relabelling), + reChildren.put(SDTGuard.relabel(e.getKey(), relabelling), (SDT) e.getValue().relabel(relabelling)); } SDT relabelled = new SDT(reChildren); @@ -289,6 +284,7 @@ private boolean regCanUse(SDT other) { private boolean hasPair( SDTGuard thisGuard, SDT thisSdt, Map otherBranches) { for (Map.Entry otherB : otherBranches.entrySet()) { + // FIXME: this should be done semantically! if (thisGuard.equals(otherB.getKey())) { if (thisSdt.canUse(otherB.getValue())) { return true; @@ -340,7 +336,7 @@ Expression getAcceptingPaths(Constants consts) { for (List list : paths) { List> expr = new ArrayList<>(); for (SDTGuard g : list) { - expr.add(g.toExpr()); + expr.add(SDTGuard.toExpr(g)); } Expression con = ExpressionUtil.and( expr.toArray(new Expression[] {})); @@ -362,7 +358,7 @@ Map, Boolean> getGuardExpressions(Constants consts) { List list = e.getKey(); List> expr = new ArrayList<>(); for (SDTGuard g : list) { - expr.add(g.toExpr()); + expr.add(SDTGuard.toExpr(g)); } Expression con = ExpressionUtil.and( expr.toArray(new Expression[] {})); @@ -436,7 +432,7 @@ public SDT copy() { Map cc = new LinkedHashMap<>(); if (children != null) { for (Map.Entry e : children.entrySet()) { - cc.put(e.getKey().copy(), e.getValue().copy()); + cc.put(SDTGuard.copy(e.getKey()), e.getValue().copy()); } } return new SDT(cc); diff --git a/src/main/java/de/learnlib/ralib/oracles/mto/SDTLeaf.java b/src/main/java/de/learnlib/ralib/oracles/mto/SDTLeaf.java index bdb4b6dd..36ecbf19 100644 --- a/src/main/java/de/learnlib/ralib/oracles/mto/SDTLeaf.java +++ b/src/main/java/de/learnlib/ralib/oracles/mto/SDTLeaf.java @@ -27,7 +27,6 @@ import de.learnlib.ralib.data.VarMapping; import de.learnlib.ralib.learning.SymbolicDecisionTree; import de.learnlib.ralib.theory.SDTGuard; -import de.learnlib.ralib.theory.equality.EqualityGuard; /** * Leaf implementation of an SDT. @@ -75,7 +74,7 @@ public SymbolicDecisionTree relabel(VarMapping relabeling) { return this; } - public SDT relabelUnderEq(EqualityGuard e) { + public SDT relabelUnderEq(SDTGuard.EqualityGuard e) { return this; } diff --git a/src/main/java/de/learnlib/ralib/theory/IntervalGuardUtil.java b/src/main/java/de/learnlib/ralib/theory/IntervalGuardUtil.java new file mode 100644 index 00000000..21e1ac7b --- /dev/null +++ b/src/main/java/de/learnlib/ralib/theory/IntervalGuardUtil.java @@ -0,0 +1,183 @@ +/* + * Copyright (C) 2014 falk. + * + * g library 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 2.1 of the License, or (at your option) any later version. + * + * g library 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 g library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301 USA + */ +package de.learnlib.ralib.theory; + +import java.util.LinkedHashSet; +import java.util.Set; + +import de.learnlib.ralib.data.SymbolicDataValue; + +/** + * + * @author falk + */ +final public class IntervalGuardUtil { + + // FIXME: g method should have a better name + public static SDTGuard.EqualityGuard toEqGuard(SDTGuard.IntervalGuard g) { + assert !g.isIntervalGuard(); + SymbolicDataValue r = null; + if (g.isSmallerGuard()) { + r = g.rightLimit(); + } + else { + r = g.leftLimit(); + } + return new SDTGuard.EqualityGuard(g.parameter(),r); + } + + // FIXME: g method should have a better name + public SDTGuard.DisequalityGuard toDeqGuard(SDTGuard.IntervalGuard g) { + assert !g.isIntervalGuard(); + SymbolicDataValue r = null; + if (g.isSmallerGuard()) { + r = g.rightLimit(); + } + else { + r = g.leftLimit(); + } + return new SDTGuard.DisequalityGuard(g.parameter(),r); + } + + // FIXME: g method does not make any sense + public static SDTGuard.IntervalGuard flip(SDTGuard.IntervalGuard g) { + return new SDTGuard.IntervalGuard(g.parameter(), g.rightLimit(), g.leftLimit()); + } + + + // merge bigger with something + private static Set bMergeIntervals(SDTGuard.IntervalGuard g, SDTGuard.IntervalGuard other) { + Set guards = new LinkedHashSet<>(); + SymbolicDataValue l = g.leftLimit(); + if (other.isBiggerGuard()) { + // System.out.println("other " + other + " is bigger"); + guards.add(g); + guards.add(other); + } else if (other.isSmallerGuard()) { +// System.out.println("other " + other + " is smaller"); +// System.out.println("see if " + l + " equals " + other.rightLimit() + "?"); + if (l.equals(other.rightLimit())) { +// System.out.println("yes, adding disequalityguard"); + guards.add(new SDTGuard.DisequalityGuard(g.parameter(), l)); + } else { +// System.out.println("no, merging into interval guard"); +// guards.add(new IntervalGuard(g.parameter, l, other.rightLimit())); + guards.add(g); + guards.add(other); + } + } else { +// System.out.println("other " + other + " is interv"); + + if (l.equals(other.rightLimit())) { + guards.add(new SDTGuard.IntervalGuard(g.parameter(), other.leftLimit(), null)); + guards.add(new SDTGuard.DisequalityGuard(g.parameter(), l)); + } else if (l.equals(other.leftLimit())) { + guards.add(g); + } else { + guards.add(g); + guards.add(other); + } + + } + return guards; + } + + // merge smaller with something + private static Set sMergeIntervals(SDTGuard.IntervalGuard g, SDTGuard.IntervalGuard other) { + Set guards = new LinkedHashSet<>(); + SymbolicDataValue r = g.rightLimit(); + if (other.isBiggerGuard()) { + return bMergeIntervals(other, g); + } else if (other.isSmallerGuard()) { + guards.add(g); + guards.add(other); + } else { + if (r.equals(other.leftLimit())) { + guards.add(new SDTGuard.IntervalGuard(g.parameter(), null, other.rightLimit())); + guards.add(new SDTGuard.DisequalityGuard(g.parameter(), r)); + } else if (r.equals(other.rightLimit())) { + guards.add(g); + } else { + guards.add(g); + guards.add(other); + } + } + return guards; + } + + // merge interval with something + private static Set iMergeIntervals(SDTGuard.IntervalGuard g, SDTGuard.IntervalGuard other) { + Set guards = new LinkedHashSet<>(); + SymbolicDataValue l = g.leftLimit(); + SymbolicDataValue r = g.rightLimit(); + if (other.isBiggerGuard()) { + return bMergeIntervals(other, g); + } else if (other.isSmallerGuard()) { + return sMergeIntervals(other, g); + } else { + SymbolicDataValue oL = other.leftLimit(); + SymbolicDataValue oR = other.rightLimit(); + if (l.equals(oR)) { + if (r.equals(oL)) { + guards.add(new SDTGuard.DisequalityGuard(g.parameter(), l)); + guards.add(new SDTGuard.DisequalityGuard(g.parameter(), r)); + } else { + guards.add(new SDTGuard.IntervalGuard(g.parameter(), oL, r)); + guards.add(new SDTGuard.DisequalityGuard(g.parameter(), l)); + } + } else { + if (r.equals(oL)) { + guards.add(new SDTGuard.IntervalGuard(g.parameter(), l, oR)); + guards.add(new SDTGuard.DisequalityGuard(g.parameter(), r)); + } else { + guards.add(g); + guards.add(other); + } + } + } + return guards; + } + + public static Set mergeIntervals(SDTGuard.IntervalGuard g, SDTGuard.IntervalGuard other) { +// System.out.println("other i-guard: " + other); + + // FIXME: shouldn't bMergeIntervals and sMergeIntervals be symmetric? + + if (g.isBiggerGuard()) { +// System.out.println(g + " is bigger, left limit is: " + g.leftLimit); + Set gs = bMergeIntervals(g, other); +// System.out.println("returningB: " + gs); + return gs; + } + if (g.isSmallerGuard()) { +// System.out.println(g + " is smaller, right limit is: " + g.rightLimit); + Set gs = sMergeIntervals(g, other); +// System.out.println("returningS: " + gs); + return gs; + } + +// System.out.println("is interv"); + return iMergeIntervals(g, other); + + } + + + + +} diff --git a/src/main/java/de/learnlib/ralib/theory/SDTAndGuard.java b/src/main/java/de/learnlib/ralib/theory/SDTAndGuard.java deleted file mode 100644 index 03325901..00000000 --- a/src/main/java/de/learnlib/ralib/theory/SDTAndGuard.java +++ /dev/null @@ -1,106 +0,0 @@ -/* - * Copyright (C) 2014-2015 The LearnLib Contributors - * This file is part of LearnLib, http://www.learnlib.de/. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package de.learnlib.ralib.theory; - -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; - -import de.learnlib.ralib.data.SymbolicDataValue; -import de.learnlib.ralib.data.SymbolicDataValue.SuffixValue; -import de.learnlib.ralib.data.VarMapping; -import gov.nasa.jpf.constraints.api.Expression; -import gov.nasa.jpf.constraints.util.ExpressionUtil; - -@Deprecated -public class SDTAndGuard extends SDTMultiGuard { - - @Override - public int hashCode() { - int hash = 5; - hash = 59 * hash + Objects.hashCode(this.condis); - hash = 59 * hash + Objects.hashCode(this.parameter); - hash = 59 * hash + Objects.hashCode(this.guardSet); - hash = 59 * hash + Objects.hashCode(this.getClass()); - - return hash; - } - - @Override - public boolean equals(Object obj) { - if (obj == null) { - return false; - } - if (getClass() != obj.getClass()) { - return false; - } - final SDTAndGuard other = (SDTAndGuard) obj; - - if (!Objects.equals(this.guardSet, other.guardSet)) { - return false; - } - return Objects.equals(this.parameter, other.parameter); - } - - public SDTAndGuard(SuffixValue param, SDTGuard... ifGuards) { - super(param, ConDis.AND, ifGuards); - } - - public SDTAndGuard(SDTAndGuard other) { - super(other); - } - - private List> toExprList() { - List> exprs = new ArrayList<>(); - for (SDTGuard guard : this.guards) { - exprs.add(guard.toExpr()); - } - return exprs; - } - - @Override - public Expression toExpr() { - List> thisList = this.toExprList(); - if (thisList.isEmpty()) { - return ExpressionUtil.TRUE; - } - if (thisList.size() == 1) { - return thisList.get(0); - } else { - return ExpressionUtil.and(thisList.toArray(new Expression[]{})); - } - } - - @Override - public SDTGuard relabel(VarMapping relabelling) { - SymbolicDataValue.SuffixValue sv - = (SymbolicDataValue.SuffixValue) relabelling.get(getParameter()); - sv = (sv == null) ? getParameter() : sv; - - List gg = new ArrayList<>(); - for (SDTGuard g : this.guards) { - gg.add(g.relabel(relabelling)); - } - return new SDTAndGuard(sv, gg.toArray(new SDTIfGuard[]{})); - } - - @Override - public SDTAndGuard copy() { - return new SDTAndGuard(this); - } - -} diff --git a/src/main/java/de/learnlib/ralib/theory/SDTGuard.java b/src/main/java/de/learnlib/ralib/theory/SDTGuard.java index eefc892a..c7b5f792 100644 --- a/src/main/java/de/learnlib/ralib/theory/SDTGuard.java +++ b/src/main/java/de/learnlib/ralib/theory/SDTGuard.java @@ -16,46 +16,294 @@ */ package de.learnlib.ralib.theory; -import java.util.List; -import java.util.Set; +import java.util.*; import de.learnlib.ralib.data.SymbolicDataValue; import de.learnlib.ralib.data.SymbolicDataValue.SuffixValue; import de.learnlib.ralib.data.VarMapping; import gov.nasa.jpf.constraints.api.Expression; +import gov.nasa.jpf.constraints.expressions.NumericBooleanExpression; +import gov.nasa.jpf.constraints.expressions.NumericComparator; +import gov.nasa.jpf.constraints.util.ExpressionUtil; /** * * @author falk */ -@Deprecated -public abstract class SDTGuard { +public sealed interface SDTGuard permits SDTGuard.DisequalityGuard, SDTGuard.EqualityGuard, SDTGuard.IntervalGuard, SDTGuard.SDTAndGuard, SDTGuard.SDTOrGuard, SDTGuard.SDTTrueGuard { - //TODO: this should probably be a special sdtparameter - protected final SuffixValue parameter; + record SDTTrueGuard(SymbolicDataValue.SuffixValue parameter) implements SDTGuard { + @Override + public String toString() { + return "TRUE: " + parameter; + } - public abstract List unwrap(); + @Override + public SuffixValue getParameter() {return this.parameter; } - public SuffixValue getParameter() { - return this.parameter; + @Override + public Set getRegisters() { return Set.of(); } } - public SDTGuard(SuffixValue param) { + record EqualityGuard(SymbolicDataValue.SuffixValue parameter, SymbolicDataValue register) implements SDTGuard { + @Override + public String toString() { + return "(" + parameter + "=" + register + ")"; + } - this.parameter = param; + @Override + public SuffixValue getParameter() {return this.parameter; } + @Override + public Set getRegisters() { return Set.of(register); } } - public abstract Set getComparands(SymbolicDataValue dv); + record DisequalityGuard(SymbolicDataValue.SuffixValue parameter, SymbolicDataValue register) implements SDTGuard { + @Override + public String toString() { + return "(" + parameter + "!=" +register + ")"; + } - public SDTGuard(SDTGuard other) { - this.parameter = SymbolicDataValue.copy(other.parameter); + @Override + public SuffixValue getParameter() {return this.parameter; } + + @Override + public Set getRegisters() { return Set.of(register); } } - public abstract Expression toExpr(); + record IntervalGuard(SymbolicDataValue.SuffixValue parameter, SymbolicDataValue leftLimit, SymbolicDataValue rightLimit) implements SDTGuard { + @Override + public String toString() { + // TODO: align second case and make one statement + if (leftLimit == null) return "(" + parameter + "<" + this.rightLimit.toString() + ")"; + if (rightLimit == null) return "(" + parameter + ">" + this.leftLimit + ")"; + return "(" + leftLimit + "<" + parameter + "<" + this.rightLimit + ")"; + } + + @Override + public SuffixValue getParameter() {return this.parameter; } + + @Override + public Set getRegisters() { + Set regs = new LinkedHashSet<>(); + if (leftLimit != null) regs.add(leftLimit); + if (rightLimit != null) regs.add(rightLimit); + return regs; + } + + public boolean isSmallerGuard() { + return leftLimit == null; + } + + public boolean isBiggerGuard() { + return rightLimit == null; + } + + public boolean isIntervalGuard() { return (leftLimit != null && rightLimit != null); } + } + + record SDTAndGuard(SymbolicDataValue.SuffixValue parameter, List conjuncts) implements SDTGuard { + @Override + public String toString() { + String p = "ANDCOMPOUND: " + parameter; + if (conjuncts.isEmpty()) { + return p + "empty"; + } + return p + conjuncts; + } + + @Override + public SuffixValue getParameter() {return this.parameter; } + + @Override + public Set getRegisters() { + Set ret = new HashSet<>(); + conjuncts.stream().forEach( x -> ret.addAll(x.getRegisters() )); + return ret; + } + + // FIXME: And guards rely on a set representation for equals and hash code, that seems wrong + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + SDTAndGuard that = (SDTAndGuard) o; + return Objects.equals(parameter, that.parameter) && + Objects.equals(new HashSet<>(conjuncts), new HashSet<>(that.conjuncts)); + } + + @Override + public int hashCode() { + return Objects.hash(parameter, new HashSet<>(conjuncts)); + } + } + + record SDTOrGuard(SymbolicDataValue.SuffixValue parameter, List disjuncts) implements SDTGuard { + @Override + public String toString() { + String p = "ORCOMPOUND: " + parameter; + if (disjuncts.isEmpty()) { + return p + "empty"; + } + return p + disjuncts; + } + + @Override + public SuffixValue getParameter() {return this.parameter; } + + @Override + public Set getRegisters() { + Set ret = new HashSet<>(); + disjuncts.stream().forEach( x -> ret.addAll(x.getRegisters() )); + return ret; + } - public abstract SDTGuard relabel(VarMapping relabelling); + @Override + public List disjuncts() { + return disjuncts; + } - public abstract SDTGuard copy(); + // FIXME: Or guards rely on a set representation for equals and hash code, that seems wrong + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + SDTOrGuard that = (SDTOrGuard) o; + return Objects.equals(parameter, that.parameter) && + Objects.equals(new HashSet<>(disjuncts), new HashSet<>(that.disjuncts)); + } + + @Override + public int hashCode() { + return Objects.hash(parameter, new HashSet<>(disjuncts)); + } + } + + SuffixValue getParameter(); + + Set getRegisters(); + + static Set getComparands(SDTGuard in, SymbolicDataValue dv) { + Set comparands = new LinkedHashSet<>(); + switch (in) { + case SDTGuard.EqualityGuard g: + if (g.parameter.equals(dv)) comparands.add(g.register); + if (g.register.equals(dv)) comparands.add(g.parameter); + return comparands; + case SDTGuard.DisequalityGuard g: + if (g.parameter.equals(dv)) comparands.add(g.register); + if (g.register.equals(dv)) comparands.add(g.parameter); + return comparands; + case SDTGuard.IntervalGuard g: + // FIXME: this was copied from original class but does not seem to make any sense + if (dv.equals(g.leftLimit)) comparands.add(g.rightLimit); + if (dv.equals(g.rightLimit)) comparands.add(g.leftLimit); + return comparands; + case SDTGuard.SDTAndGuard g: + g.conjuncts.forEach((x) -> comparands.addAll(getComparands(x, dv))); + return comparands; + case SDTGuard.SDTOrGuard g: + g.disjuncts.forEach((x) -> comparands.addAll(getComparands(x, dv))); + return comparands; + case SDTGuard.SDTTrueGuard g: + return comparands; + } + } + + // TODO: previously parameters and registers were copied but that is not necessary? + static SDTGuard copy(SDTGuard in) { + switch (in) { + case SDTGuard.EqualityGuard g: + return new SDTGuard.EqualityGuard(g.parameter, g.register); + case SDTGuard.DisequalityGuard g: + return new SDTGuard.DisequalityGuard(g.parameter, g.register); + case SDTGuard.IntervalGuard g: + return new SDTGuard.IntervalGuard(g.parameter, g.leftLimit, g.rightLimit); + case SDTGuard.SDTAndGuard g: + return new SDTGuard.SDTAndGuard(g.parameter, + g.conjuncts.stream().map( x -> copy(x)).toList()); + case SDTGuard.SDTOrGuard g: + return new SDTGuard.SDTOrGuard(g.parameter, + g.disjuncts.stream().map( x -> copy(x)).toList()); + case SDTGuard.SDTTrueGuard g: + return new SDTGuard.SDTTrueGuard(g.parameter); + } + } + + private static T newValueIfExists(VarMapping relabelling, T oldValue) { + if (oldValue == null || oldValue.isConstant()) return oldValue; + T newValue = (T) relabelling.get(oldValue); + return newValue != null ? newValue : oldValue; + } + + static SDTGuard relabel(SDTGuard in, VarMapping remap) { + switch (in) { + case SDTGuard.EqualityGuard g: + return new SDTGuard.EqualityGuard(newValueIfExists(remap, g.parameter), + newValueIfExists(remap, g.register)); + case SDTGuard.DisequalityGuard g: + return new SDTGuard.DisequalityGuard(newValueIfExists(remap, g.parameter), + newValueIfExists(remap, g.register)); + case SDTGuard.IntervalGuard g: + return new SDTGuard.IntervalGuard(newValueIfExists(remap, g.parameter), + newValueIfExists(remap, g.leftLimit), newValueIfExists(remap, g.rightLimit)); + case SDTGuard.SDTAndGuard g: + return new SDTGuard.SDTAndGuard(newValueIfExists(remap, g.parameter), + g.conjuncts.stream().map(ig -> relabel(ig, remap)).toList()); + case SDTGuard.SDTOrGuard g: + return new SDTGuard.SDTOrGuard(newValueIfExists(remap, g.parameter), + g.disjuncts.stream().map(ig -> relabel(ig, remap)).toList()); + case SDTGuard.SDTTrueGuard g: + return new SDTGuard.SDTTrueGuard(newValueIfExists(remap, g.parameter)); + } + } + + static Expression toExpr(SDTGuard in) { + switch (in) { + case SDTGuard.EqualityGuard g: + return new NumericBooleanExpression(g.register, NumericComparator.EQ, g.parameter); + case SDTGuard.DisequalityGuard g: + return new NumericBooleanExpression(g.register, NumericComparator.NE, g.parameter); + case SDTGuard.IntervalGuard g: + if (g.leftLimit == null) return new NumericBooleanExpression(g.parameter, NumericComparator.LT, g.rightLimit); + if (g.rightLimit == null) return new NumericBooleanExpression(g.parameter, NumericComparator.GT, g.leftLimit); + Expression smaller = new NumericBooleanExpression(g.parameter, NumericComparator.LT, g.rightLimit); + Expression bigger = new NumericBooleanExpression(g.parameter, NumericComparator.GT, g.leftLimit); + return ExpressionUtil.and(smaller, bigger); + case SDTGuard.SDTAndGuard g: + List> andList = g.conjuncts.stream().map( x -> toExpr(x)).toList(); + if (andList.isEmpty()) return ExpressionUtil.TRUE; + if (andList.size() == 1) return andList.get(0); + return ExpressionUtil.and(andList.toArray(new Expression[]{})); + case SDTGuard.SDTOrGuard g: + List> orList = g.disjuncts.stream().map( x -> toExpr(x)).toList(); + if (orList.isEmpty()) return ExpressionUtil.TRUE; + if (orList.size() == 1) return orList.get(0); + return ExpressionUtil.or(orList.toArray(new Expression[]{})); + case SDTGuard.SDTTrueGuard g: + return ExpressionUtil.TRUE; + } + } + + static SDTGuard toDeqGuard(SDTGuard in) { + switch (in) { + case SDTGuard.EqualityGuard g: + return new SDTGuard.DisequalityGuard(g.parameter, g.register); + case SDTGuard.DisequalityGuard g: + return new SDTGuard.EqualityGuard(g.parameter, g.register); + case SDTGuard.IntervalGuard g: + // FIXME: copied from old implementation but does not seem to make sense + assert !g.isIntervalGuard(); + SymbolicDataValue r = g.isSmallerGuard() ? g.rightLimit : g.leftLimit; + return new DisequalityGuard(g.parameter,r); + case SDTGuard.SDTAndGuard g: + throw new RuntimeException("not refactored yet"); + case SDTGuard.SDTOrGuard g: + throw new RuntimeException("not refactored yet"); + case SDTGuard.SDTTrueGuard g: + throw new RuntimeException("not refactored yet"); + } + } } diff --git a/src/main/java/de/learnlib/ralib/theory/SDTGuardUtil.java b/src/main/java/de/learnlib/ralib/theory/SDTGuardUtil.java index 7e56775a..5179e1f2 100644 --- a/src/main/java/de/learnlib/ralib/theory/SDTGuardUtil.java +++ b/src/main/java/de/learnlib/ralib/theory/SDTGuardUtil.java @@ -1,27 +1,25 @@ package de.learnlib.ralib.theory; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Set; +import java.util.*; import de.learnlib.ralib.data.SymbolicDataValue; -import de.learnlib.ralib.theory.equality.DisequalityGuard; -import de.learnlib.ralib.theory.equality.EqualityGuard; -import de.learnlib.ralib.theory.inequality.IntervalGuard; +import de.learnlib.ralib.data.VarMapping; public class SDTGuardUtil { + // this is only used by inequality theory and very old code that does not make + // sense to me. Not even sure what merge means in this case? + @Deprecated public static Set mergeWith(SDTGuard thisGuard, SDTGuard other, List regPotential) { - if (thisGuard instanceof IntervalGuard) { - IntervalGuard intervalGuard = (IntervalGuard) thisGuard; + if (thisGuard instanceof SDTGuard.IntervalGuard intervalGuard) { Set guards = new LinkedHashSet<>(); - if (other instanceof IntervalGuard) { - guards.addAll(intervalGuard.mergeIntervals((IntervalGuard) other)); - } else if (other instanceof DisequalityGuard dGuard) { - if ((intervalGuard.isBiggerGuard() && intervalGuard.leftLimit.equals(dGuard.getRegister())) - || (intervalGuard.isSmallerGuard() && intervalGuard.rightLimit.equals(dGuard.getRegister()))) { + if (other instanceof SDTGuard.IntervalGuard) { + guards.addAll(IntervalGuardUtil.mergeIntervals(intervalGuard, (SDTGuard.IntervalGuard) other)); + } else if (other instanceof SDTGuard.DisequalityGuard dGuard) { + if ((intervalGuard.isBiggerGuard() && intervalGuard.leftLimit().equals(dGuard.register())) + || (intervalGuard.isSmallerGuard() && intervalGuard.rightLimit().equals(dGuard.register()))) { guards.add(other); } @@ -37,16 +35,15 @@ public static Set mergeWith(SDTGuard thisGuard, SDTGuard other, return guards; } - if (thisGuard instanceof DisequalityGuard) { - DisequalityGuard disequalityGuard = (DisequalityGuard) thisGuard; + if (thisGuard instanceof SDTGuard.DisequalityGuard disequalityGuard) { Set guards = new LinkedHashSet<>(); - if (other instanceof EqualityGuard) { - if (!(other.equals(disequalityGuard.toDeqGuard()))) { + if (other instanceof SDTGuard.EqualityGuard) { + if (!(other.equals(SDTGuard.toDeqGuard(disequalityGuard)))) { guards.add(disequalityGuard); guards.add(other); } } - else if (other instanceof DisequalityGuard) { + else if (other instanceof SDTGuard.DisequalityGuard) { guards.add(disequalityGuard); guards.add(other); } @@ -56,21 +53,20 @@ else if (other instanceof DisequalityGuard) { return guards; } - if (thisGuard instanceof EqualityGuard) { - EqualityGuard equalityGuard = (EqualityGuard) thisGuard; + if (thisGuard instanceof SDTGuard.EqualityGuard equalityGuard) { Set guards = new LinkedHashSet<>(); - if (other instanceof DisequalityGuard) { - if (!(other.equals(equalityGuard.toDeqGuard()))) { + if (other instanceof SDTGuard.DisequalityGuard) { + if (!(other.equals(SDTGuard.toDeqGuard(equalityGuard)))) { guards.add(equalityGuard); guards.add(other); } - } else if (other instanceof EqualityGuard) { + } else if (other instanceof SDTGuard.EqualityGuard) { if (!(equalityGuard.equals(other))) { guards.add(other); } guards.add(equalityGuard); - } else if (other instanceof SDTOrGuard) { - for (SDTGuard s : ((SDTOrGuard)other).getGuards()) { + } else if (other instanceof SDTGuard.SDTOrGuard orGuard) { + for (SDTGuard s : orGuard.disjuncts()) { guards.addAll(mergeWith(equalityGuard, s, regPotential)); } }else { @@ -81,11 +77,10 @@ else if (other instanceof DisequalityGuard) { return guards; } - if (thisGuard instanceof SDTOrGuard) { + if (thisGuard instanceof SDTGuard.SDTOrGuard) { return mergeWith(other, thisGuard, regPotential); } throw new RuntimeException("this should not happen"); } - } diff --git a/src/main/java/de/learnlib/ralib/theory/SDTIfGuard.java b/src/main/java/de/learnlib/ralib/theory/SDTIfGuard.java deleted file mode 100644 index e8d70366..00000000 --- a/src/main/java/de/learnlib/ralib/theory/SDTIfGuard.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright (C) 2014-2015 The LearnLib Contributors - * This file is part of LearnLib, http://www.learnlib.de/. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package de.learnlib.ralib.theory; - -import java.util.ArrayList; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Set; - -import de.learnlib.ralib.data.SymbolicDataValue; -import de.learnlib.ralib.data.SymbolicDataValue.SuffixValue; -import de.learnlib.ralib.data.VarMapping; - -@Deprecated -public abstract class SDTIfGuard extends SDTGuard { - - protected final SymbolicDataValue register; - - public SymbolicDataValue getRegister() { - return this.register; - } - - @Override - public List unwrap() { - List s = new ArrayList(); - s.add(this); - return s; - } - - protected SDTIfGuard(SuffixValue param, SymbolicDataValue reg) { - super(param); - this.register = reg; - } - - public SDTIfGuard(SDTIfGuard other) { - super(other); - register = SymbolicDataValue.copy(other.register); - } - - public abstract SDTIfGuard toDeqGuard(); - - @Override - public Set getComparands(SymbolicDataValue dv) { - Set comparands = new LinkedHashSet<>(); - if (this.parameter.equals(dv)) - comparands.add(register); - else if (register.equals(dv)) - comparands.add(parameter); - return comparands; - } - - @Override - public abstract SDTIfGuard relabel(VarMapping relabelling); - - - -} diff --git a/src/main/java/de/learnlib/ralib/theory/SDTMultiGuard.java b/src/main/java/de/learnlib/ralib/theory/SDTMultiGuard.java deleted file mode 100644 index 42fc492e..00000000 --- a/src/main/java/de/learnlib/ralib/theory/SDTMultiGuard.java +++ /dev/null @@ -1,126 +0,0 @@ -/* - * Copyright (C) 2014-2015 The LearnLib Contributors - * This file is part of LearnLib, http://www.learnlib.de/. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package de.learnlib.ralib.theory; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Set; - -import de.learnlib.ralib.data.SymbolicDataValue; -import de.learnlib.ralib.data.SymbolicDataValue.SuffixValue; -import gov.nasa.jpf.constraints.api.Expression; - -@Deprecated -public abstract class SDTMultiGuard extends SDTGuard { - - protected enum ConDis { - - AND, OR - } - - protected final List guards; - protected final Set guardSet; - protected final ConDis condis; - - public List getGuards() { - return guards; - } - - @Override - public List unwrap() { - List unwrapped = new ArrayList(); - if (isEmpty()) { - unwrapped.add(asTrueGuard()); - } else if (isSingle()) { - unwrapped.add(getSingle()); - } else { - unwrapped.addAll(guards); - } - return unwrapped; - } - - public boolean isSingle() { - return guards.size() == 1; - } - - public boolean isEmpty() { - return guards.isEmpty(); - } - - public SDTTrueGuard asTrueGuard() { - return new SDTTrueGuard(parameter); - } - - public SDTGuard getSingle() { - assert isSingle(); - return guards.get(0); - } - - public Set getAllRegs() { - Set allRegs = new LinkedHashSet(); - for (SDTGuard g : guards) { - if (g instanceof SDTIfGuard) { - allRegs.add(((SDTIfGuard)g).getRegister()); - } - else if (g instanceof SDTMultiGuard) { - allRegs.addAll(((SDTMultiGuard)g).getAllRegs()); - } - } - return allRegs; - } - - public SDTMultiGuard(SuffixValue param, ConDis condis, SDTGuard... ifGuards) { - super(param); - this.condis = condis; - this.guards = new ArrayList<>(); - this.guards.addAll(Arrays.asList(ifGuards)); - this.guardSet = new LinkedHashSet<>(guards); - } - - public SDTMultiGuard(SDTMultiGuard other) { - super(other); - this.condis = other.condis; - this.guards = new ArrayList<>(); - for (SDTGuard g : other.guards) - guards.add(g.copy()); - this.guardSet = new LinkedHashSet<>(guards); - for (SDTGuard g : other.guards) - guardSet.add(g.copy()); - } - - @Override - public Set getComparands(SymbolicDataValue dv) { - Set comparands = new LinkedHashSet<>(); - guards.forEach((x) -> comparands.addAll(x.getComparands(dv))); - return comparands; - } - - @Override - public abstract Expression toExpr(); - - @Override - public String toString() { - String p = this.condis.toString() + "COMPOUND: " + parameter.toString(); - if (this.guards.isEmpty()) { - return p + "empty"; - } - return p + this.guards; - } - -} diff --git a/src/main/java/de/learnlib/ralib/theory/SDTOrGuard.java b/src/main/java/de/learnlib/ralib/theory/SDTOrGuard.java deleted file mode 100644 index 93d1156d..00000000 --- a/src/main/java/de/learnlib/ralib/theory/SDTOrGuard.java +++ /dev/null @@ -1,105 +0,0 @@ -/* - * Copyright (C) 2014-2015 The LearnLib Contributors - * This file is part of LearnLib, http://www.learnlib.de/. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package de.learnlib.ralib.theory; - -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; - -import de.learnlib.ralib.data.SymbolicDataValue; -import de.learnlib.ralib.data.SymbolicDataValue.SuffixValue; -import de.learnlib.ralib.data.VarMapping; -import gov.nasa.jpf.constraints.api.Expression; -import gov.nasa.jpf.constraints.util.ExpressionUtil; - -@Deprecated -public class SDTOrGuard extends SDTMultiGuard { - - @Override - public int hashCode() { - int hash = 5; - hash = 59 * hash + Objects.hashCode(this.condis); - hash = 59 * hash + Objects.hashCode(this.parameter); - hash = 59 * hash + Objects.hashCode(this.guardSet); - hash = 59 * hash + Objects.hashCode(this.getClass()); - - return hash; - } - - @Override - public boolean equals(Object obj) { - if (obj == null) { - return false; - } - if (getClass() != obj.getClass()) { - return false; - } - final SDTOrGuard other = (SDTOrGuard) obj; - - if (!Objects.equals(this.guardSet, other.guardSet)) { - return false; - } - return Objects.equals(this.parameter, other.parameter); - } - - public SDTOrGuard(SuffixValue param, SDTGuard... ifGuards) { - super(param, ConDis.OR, ifGuards); - } - - public SDTOrGuard(SDTOrGuard other) { - super(other); - } - - private List > toExprList() { - List > exprs = new ArrayList<>(); - for (SDTGuard guard : this.guards) { - exprs.add(guard.toExpr()); - } - return exprs; - } - - @Override - public Expression toExpr() { - List> thisList = this.toExprList(); - if (thisList.isEmpty()) { - return ExpressionUtil.TRUE; - } - if (thisList.size() == 1) { - return thisList.get(0); - } else { - return ExpressionUtil.or(thisList.toArray(new Expression[]{})); - } - } - - @Override - public SDTGuard relabel(VarMapping relabelling) { - SymbolicDataValue.SuffixValue sv = (SymbolicDataValue.SuffixValue) relabelling.get(getParameter()); - sv = (sv == null) ? getParameter() : sv; - - List gg = new ArrayList<>(); - for (SDTGuard g : this.guards) { - gg.add(g.relabel(relabelling)); - } - return new SDTOrGuard(sv, gg.toArray(new SDTGuard[]{})); - } - - @Override - public SDTOrGuard copy() { - return new SDTOrGuard(this); - } - -} diff --git a/src/main/java/de/learnlib/ralib/theory/SDTTrueGuard.java b/src/main/java/de/learnlib/ralib/theory/SDTTrueGuard.java deleted file mode 100644 index bfde63d1..00000000 --- a/src/main/java/de/learnlib/ralib/theory/SDTTrueGuard.java +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright (C) 2014-2015 The LearnLib Contributors - * This file is part of LearnLib, http://www.learnlib.de/. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package de.learnlib.ralib.theory; - -import java.util.ArrayList; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Objects; -import java.util.Set; - -import de.learnlib.ralib.data.SymbolicDataValue; -import de.learnlib.ralib.data.VarMapping; -import gov.nasa.jpf.constraints.api.Expression; -import gov.nasa.jpf.constraints.util.ExpressionUtil; - -/** - * - * @author Stealth - */ -@Deprecated -public class SDTTrueGuard extends SDTGuard { - - public SDTTrueGuard(SymbolicDataValue.SuffixValue param) { - super(param); - } - - public SDTTrueGuard(SDTTrueGuard other) { - super(other); - } - - @Override - public String toString() { - return "TRUE: " + parameter.toString(); - } - - @Override - public List unwrap() { - List s = new ArrayList<>(); - s.add(this); - return s; - } - - @Override - public Expression toExpr() { - return ExpressionUtil.TRUE; - } - - @Override - public SDTGuard relabel(VarMapping relabelling) { - if (relabelling.containsKey(parameter)) { - return new SDTTrueGuard((SymbolicDataValue.SuffixValue) relabelling.get(parameter)); - } - return this; - } - - @Override - public boolean equals(Object obj) { - if (obj == null) { - return false; - } - return getClass() == obj.getClass(); - } - - @Override - public int hashCode() { - int hash = 5; - hash = 59 * hash + Objects.hashCode(this.getClass()); - - return hash; - } - - @Override - public Set getComparands(SymbolicDataValue dv) { - return new LinkedHashSet<>(); - } - - @Override - public SDTTrueGuard copy() { - return new SDTTrueGuard(this); - } - -} diff --git a/src/main/java/de/learnlib/ralib/theory/SuffixValueRestriction.java b/src/main/java/de/learnlib/ralib/theory/SuffixValueRestriction.java index 8afc9f9c..464a0e28 100644 --- a/src/main/java/de/learnlib/ralib/theory/SuffixValueRestriction.java +++ b/src/main/java/de/learnlib/ralib/theory/SuffixValueRestriction.java @@ -9,9 +9,7 @@ import de.learnlib.ralib.data.DataValue; import de.learnlib.ralib.data.SymbolicDataValue; import de.learnlib.ralib.data.SymbolicDataValue.SuffixValue; -import de.learnlib.ralib.theory.equality.DisequalityGuard; import de.learnlib.ralib.theory.equality.EqualRestriction; -import de.learnlib.ralib.theory.equality.EqualityGuard; import de.learnlib.ralib.words.DataWords; import de.learnlib.ralib.words.PSymbolInstance; import gov.nasa.jpf.constraints.api.Expression; @@ -122,11 +120,11 @@ public boolean equals(Object obj) { public static SuffixValueRestriction genericRestriction(SDTGuard guard, Map prior) { SuffixValue suffixValue = guard.getParameter(); // case fresh - if (guard instanceof SDTTrueGuard || guard instanceof DisequalityGuard) { + if (guard instanceof SDTGuard.SDTTrueGuard || guard instanceof SDTGuard.DisequalityGuard) { return new FreshSuffixValue(suffixValue); // case equal to previous suffix value - } else if (guard instanceof EqualityGuard) { - SymbolicDataValue param = ((EqualityGuard) guard).getRegister(); + } else if (guard instanceof SDTGuard.EqualityGuard) { + SymbolicDataValue param = ((SDTGuard.EqualityGuard) guard).register(); if (param instanceof SuffixValue) { SuffixValueRestriction restr = prior.get(param); if (restr instanceof FreshSuffixValue) { diff --git a/src/main/java/de/learnlib/ralib/theory/equality/DisequalityGuard.java b/src/main/java/de/learnlib/ralib/theory/equality/DisequalityGuard.java deleted file mode 100644 index b8523cf4..00000000 --- a/src/main/java/de/learnlib/ralib/theory/equality/DisequalityGuard.java +++ /dev/null @@ -1,110 +0,0 @@ -/* - * Copyright (C) 2014-2015 The LearnLib Contributors - * This file is part of LearnLib, http://www.learnlib.de/. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package de.learnlib.ralib.theory.equality; - -import java.util.Objects; - -import de.learnlib.ralib.data.SymbolicDataValue; -import de.learnlib.ralib.data.VarMapping; -import de.learnlib.ralib.theory.SDTGuard; -import de.learnlib.ralib.theory.SDTIfGuard; -import gov.nasa.jpf.constraints.api.Expression; -import gov.nasa.jpf.constraints.expressions.NumericBooleanExpression; -import gov.nasa.jpf.constraints.expressions.NumericComparator; - -/** - * - * @author falk - */ -@Deprecated -public class DisequalityGuard extends SDTIfGuard { - - public DisequalityGuard( - SymbolicDataValue.SuffixValue param, SymbolicDataValue reg) { - super(param, reg); - } - - public DisequalityGuard(DisequalityGuard other) { - super(other); - } - - @Override - public EqualityGuard toDeqGuard() { - return new EqualityGuard(parameter, register); - } - - @Override - public String toString() { - return "(" + this.getParameter().toString() - + "!=" + this.getRegister().toString() + ")"; - - } - - @Override - public Expression toExpr() { - return new NumericBooleanExpression( - register, NumericComparator.NE, parameter); - } - - @Override - public SDTIfGuard relabel(VarMapping relabelling) { - SymbolicDataValue.SuffixValue sv - = (SymbolicDataValue.SuffixValue) relabelling.get(parameter); - SymbolicDataValue r = null; - sv = (sv == null) ? parameter : sv; - - if (register.isConstant()) { - return new DisequalityGuard(sv, register); - } else { - r = (SymbolicDataValue) relabelling.get(register); - } - r = (r == null) ? register : r; - return new DisequalityGuard(sv, r); - } - - @Override - public int hashCode() { - int hash = 5; - hash = 59 * hash + Objects.hashCode(this.parameter); - hash = 59 * hash + Objects.hashCode(this.register); - hash = 59 * hash + Objects.hashCode(this.getClass()); - - return hash; - } - - @Override - public boolean equals(Object obj) { - if (obj == null) { - return false; - } - if (getClass() != obj.getClass()) { - return false; - } - final DisequalityGuard other = (DisequalityGuard) obj; - if (!Objects.equals(this.register, other.register)) { - return false; - } - return Objects.equals(this.parameter, other.parameter); - } - - @Override - public SDTGuard copy() { - return new DisequalityGuard(this); - } - - -} diff --git a/src/main/java/de/learnlib/ralib/theory/equality/EqualityGuard.java b/src/main/java/de/learnlib/ralib/theory/equality/EqualityGuard.java deleted file mode 100644 index f5f541ab..00000000 --- a/src/main/java/de/learnlib/ralib/theory/equality/EqualityGuard.java +++ /dev/null @@ -1,108 +0,0 @@ -/* - * Copyright (C) 2014-2015 The LearnLib Contributors - * This file is part of LearnLib, http://www.learnlib.de/. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package de.learnlib.ralib.theory.equality; - -import java.util.Objects; - -import de.learnlib.ralib.data.SymbolicDataValue; -import de.learnlib.ralib.data.SymbolicDataValue.SuffixValue; -import de.learnlib.ralib.data.VarMapping; -import de.learnlib.ralib.theory.SDTIfGuard; -import gov.nasa.jpf.constraints.api.Expression; -import gov.nasa.jpf.constraints.expressions.NumericBooleanExpression; -import gov.nasa.jpf.constraints.expressions.NumericComparator; - -/** - * - * @author falk - */ -@Deprecated -public class EqualityGuard extends SDTIfGuard { - - public EqualityGuard(SuffixValue param, SymbolicDataValue reg) { - super(param, reg); - } - - public EqualityGuard(EqualityGuard other) { - super(other); - } - - @Override - public String toString() { - return "(" + this.getParameter().toString() - + "=" + this.getRegister().toString() + ")"; - - } - - @Override - public DisequalityGuard toDeqGuard() { - return new DisequalityGuard(parameter, register); - } - - @Override - public SDTIfGuard relabel(VarMapping relabelling) { - SymbolicDataValue.SuffixValue sv - = (SymbolicDataValue.SuffixValue) relabelling.get(parameter); - SymbolicDataValue r = null; - sv = (sv == null) ? parameter : sv; - - if (register.isConstant()) { - return new EqualityGuard(sv, register); - } else { - r = (SymbolicDataValue) relabelling.get(register); - } - r = (r == null) ? register : r; - return new EqualityGuard(sv, r); - } - - @Override - public int hashCode() { - int hash = 5; - hash = 59 * hash + Objects.hashCode(parameter); - hash = 59 * hash + Objects.hashCode(register); - hash = 59 * hash + Objects.hashCode(getClass()); - - return hash; - } - - @Override - public boolean equals(Object obj) { - if (obj == null) { - return false; - } - if (getClass() != obj.getClass()) { - return false; - } - final EqualityGuard other = (EqualityGuard) obj; - if (!Objects.equals(this.register, other.register)) { - return false; - } - return Objects.equals(this.parameter, other.parameter); - } - - @Override - public Expression toExpr() { - return new NumericBooleanExpression(this.register, - NumericComparator.EQ, parameter); - } - - @Override - public EqualityGuard copy() { - return new EqualityGuard(this); - } - -} diff --git a/src/main/java/de/learnlib/ralib/theory/equality/EqualityTheory.java b/src/main/java/de/learnlib/ralib/theory/equality/EqualityTheory.java index 6c2f31f3..cdf8f678 100644 --- a/src/main/java/de/learnlib/ralib/theory/equality/EqualityTheory.java +++ b/src/main/java/de/learnlib/ralib/theory/equality/EqualityTheory.java @@ -28,6 +28,7 @@ import java.util.Map; import java.util.Set; +import de.learnlib.ralib.theory.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -49,14 +50,6 @@ import de.learnlib.ralib.oracles.mto.SDT; import de.learnlib.ralib.oracles.mto.SDTConstructor; import de.learnlib.ralib.oracles.mto.SDTLeaf; -import de.learnlib.ralib.theory.EquivalenceClassFilter; -import de.learnlib.ralib.theory.SDTAndGuard; -import de.learnlib.ralib.theory.SDTGuard; -import de.learnlib.ralib.theory.SDTIfGuard; -import de.learnlib.ralib.theory.SDTMultiGuard; -import de.learnlib.ralib.theory.SDTTrueGuard; -import de.learnlib.ralib.theory.SuffixValueRestriction; -import de.learnlib.ralib.theory.Theory; import de.learnlib.ralib.words.DataWords; import de.learnlib.ralib.words.OutputSymbol; import de.learnlib.ralib.words.PSymbolInstance; @@ -95,22 +88,22 @@ public List getPotential(List vals) { // given a map from guards to SDTs, merge guards based on whether they can // use another SDT. Base case: always add the 'else' guard first. - private Map mergeGuards(Map eqs, SDTAndGuard deqGuard, SDT deqSdt) { + private Map mergeGuards(Map eqs, SDTGuard.SDTAndGuard deqGuard, SDT deqSdt) { Map retMap = new LinkedHashMap<>(); - List deqList = new ArrayList<>(); - List eqList = new ArrayList<>(); - for (Map.Entry e : eqs.entrySet()) { + List deqList = new ArrayList<>(); + List eqList = new ArrayList<>(); + for (Map.Entry e : eqs.entrySet()) { SDT eqSdt = e.getValue(); - EqualityGuard eqGuard = e.getKey(); + SDTGuard.EqualityGuard eqGuard = e.getKey(); LOGGER.trace("comparing guards: " + eqGuard.toString() + " to " + deqGuard.toString() + "\nSDT : " + eqSdt.toString() + "\nto SDT : " + deqSdt.toString()); - List ds = new ArrayList<>(); + List ds = new ArrayList<>(); ds.add(eqGuard); LOGGER.trace("remapping: " + ds); if (!(eqSdt.isEquivalentUnder(deqSdt, ds))) { LOGGER.trace("--> not eq."); - deqList.add(eqGuard.toDeqGuard()); + deqList.add(SDTGuard.toDeqGuard(eqGuard)); eqList.add(eqGuard); } else { LOGGER.trace("--> equivalent"); @@ -118,16 +111,16 @@ private Map mergeGuards(Map eqs, SDTAndGuard } if (eqList.isEmpty()) { - retMap.put(new SDTTrueGuard(deqGuard.getParameter()), deqSdt); + retMap.put(new SDTGuard.SDTTrueGuard(deqGuard.getParameter()), deqSdt); } else if (eqList.size() == 1) { - EqualityGuard q = eqList.get(0); + SDTGuard.EqualityGuard q = eqList.get(0); retMap.put(q, eqs.get(q)); - retMap.put(q.toDeqGuard(), deqSdt); + retMap.put(SDTGuard.toDeqGuard(q), deqSdt); } else if (eqList.size() > 1) { - for (EqualityGuard q : eqList) { + for (SDTGuard.EqualityGuard q : eqList) { retMap.put(q, eqs.get(q)); } - retMap.put(new SDTAndGuard(deqGuard.getParameter(), deqList.toArray(new SDTIfGuard[] {})), deqSdt); + retMap.put(new SDTGuard.SDTAndGuard(deqGuard.getParameter(), deqList), deqSdt); } assert !retMap.isEmpty(); @@ -140,9 +133,10 @@ private PIV keepMem(Map guardMap) { PIV ret = new PIV(); for (Map.Entry e : guardMap.entrySet()) { SDTGuard mg = e.getKey(); - if (mg instanceof EqualityGuard) { + if (mg instanceof SDTGuard.EqualityGuard eg) { LOGGER.trace(mg.toString()); - SymbolicDataValue r = ((EqualityGuard) mg).getRegister(); + SymbolicDataValue r = eg.register(); + // FIXME: why create new parameter? Parameter p = new Parameter(r.getDataType(), r.getId()); if (r instanceof Register) { ret.put(p, (Register) r); @@ -162,7 +156,7 @@ public SDT treeQuery(Word prefix, SymbolicSuffix suffix, WordVa SuffixValue currentParam = suffix.getSuffixValue(pId); DataType type = currentParam.getDataType(); - Map tempKids = new LinkedHashMap<>(); + Map tempKids = new LinkedHashMap<>(); Collection potSet = DataWords.joinValsToSet(constants.values(type), DataWords.valSet(prefix, type), suffixValues.values(type)); @@ -209,7 +203,7 @@ public SDT treeQuery(Word prefix, SymbolicSuffix suffix, WordVa LOGGER.trace(" single deq SDT : " + sdt.toString()); - Map merged = mergeGuards(tempKids, new SDTAndGuard(currentParam), sdt); + Map merged = mergeGuards(tempKids, new SDTGuard.SDTAndGuard(currentParam, List.of()), sdt); LOGGER.trace("temporary guards = " + tempKids.keySet()); LOGGER.trace("merged guards = " + merged.keySet()); @@ -220,7 +214,7 @@ public SDT treeQuery(Word prefix, SymbolicSuffix suffix, WordVa } else { int maxSufIndex = DataWords.paramLength(suffix.getActions()) + 1; SDT rejSdt = makeRejectingBranch(currentParam.getId() + 1, maxSufIndex, type); - SDTTrueGuard trueGuard = new SDTTrueGuard(currentParam); + SDTGuard.SDTTrueGuard trueGuard = new SDTGuard.SDTTrueGuard(currentParam); Map merged = new LinkedHashMap<>(); merged.put(trueGuard, rejSdt); return new SDT(merged); @@ -236,7 +230,7 @@ public SDT treeQuery(Word prefix, SymbolicSuffix suffix, WordVa LOGGER.trace("prefix list " + prefixValues); - List diseqList = new ArrayList(); + List diseqList = new ArrayList<>(); for (DataValue newDv : potential) { if (filteredEquivClasses.contains(newDv)) { LOGGER.trace(newDv.toString()); @@ -245,9 +239,9 @@ public SDT treeQuery(Word prefix, SymbolicSuffix suffix, WordVa SuffixValuation ifSuffixValues = new SuffixValuation(); ifSuffixValues.putAll(suffixValues); // copy the suffix valuation - EqualityGuard eqGuard = pickupDataValue(newDv, prefixValues, currentParam, values, constants); + SDTGuard.EqualityGuard eqGuard = pickupDataValue(newDv, prefixValues, currentParam, values, constants); LOGGER.trace("eqGuard is: " + eqGuard); - diseqList.add(new DisequalityGuard(currentParam, eqGuard.getRegister())); + diseqList.add(new SDTGuard.DisequalityGuard(currentParam, eqGuard.register())); // construct the equality guard // find the data value in the prefix // this is the valuation of the positions in the suffix @@ -276,7 +270,7 @@ public SDT treeQuery(Word prefix, SymbolicSuffix suffix, WordVa SDT elseOracleSdt = oracle.treeQuery(prefix, suffix, elseValues, pir, constants, elseSuffixValues); - SDTAndGuard deqGuard = new SDTAndGuard(currentParam, (diseqList.toArray(new DisequalityGuard[] {}))); + SDTGuard.SDTAndGuard deqGuard = new SDTGuard.SDTAndGuard(currentParam, diseqList); LOGGER.trace("diseq guard = " + deqGuard); // merge the guards @@ -286,8 +280,8 @@ public SDT treeQuery(Word prefix, SymbolicSuffix suffix, WordVa // TODO: add support for multiple equalities with same outcome assert tempKids.size() == 1; - Iterator> it = tempKids.entrySet().iterator(); - Map.Entry e = it.next(); + Iterator> it = tempKids.entrySet().iterator(); + Map.Entry e = it.next(); merged = new LinkedHashMap(); merged.put(e.getKey(), e.getValue()); } @@ -312,13 +306,13 @@ public SDT treeQuery(Word prefix, SymbolicSuffix suffix, WordVa } // construct equality guard by picking up a data value from the prefix - private EqualityGuard pickupDataValue(DataValue newDv, List prefixValues, SuffixValue currentParam, + private SDTGuard.EqualityGuard pickupDataValue(DataValue newDv, List prefixValues, SuffixValue currentParam, WordValuation ifValues, Constants constants) { DataType type = currentParam.getDataType(); int newDv_i; for (Map.Entry entry : constants.entrySet()) { if (entry.getValue().equals(newDv)) { - return new EqualityGuard(currentParam, entry.getKey()); + return new SDTGuard.EqualityGuard(currentParam, entry.getKey()); } } if (prefixValues.contains(newDv)) { @@ -327,14 +321,14 @@ private EqualityGuard pickupDataValue(DataValue newDv, List prefixVal Register newDv_r = new Register(type, newDv_i); LOGGER.trace("current param = " + currentParam); LOGGER.trace("New register = " + newDv_r); - return new EqualityGuard(currentParam, newDv_r); + return new SDTGuard.EqualityGuard(currentParam, newDv_r); } // if the data value isn't in the prefix, // it is somewhere earlier in the suffix else { int smallest = Collections.min(ifValues.getAllKeys(newDv)); - return new EqualityGuard(currentParam, new SuffixValue(type, smallest)); + return new SDTGuard.EqualityGuard(currentParam, new SuffixValue(type, smallest)); } } @@ -351,9 +345,9 @@ public DataValue instantiate(Word prefix, ParameterizedSymbol p while(!guards.isEmpty()) { SDTGuard current = guards.remove(); - if (current instanceof EqualityGuard eqGuard) { + if (current instanceof SDTGuard.EqualityGuard eqGuard) { LOGGER.trace("equality guard " + current); - SymbolicDataValue ereg = eqGuard.getRegister(); + SymbolicDataValue ereg = eqGuard.register(); if (ereg.isRegister()) { LOGGER.trace("piv: " + piv.toString() + " " + ereg + " " + param); @@ -367,8 +361,8 @@ public DataValue instantiate(Word prefix, ParameterizedSymbol p } else if (ereg.isConstant()) { return constants.get((Constant) ereg); } - } else if (current instanceof SDTAndGuard) { - guards.addAll(((SDTAndGuard) current).getGuards()); + } else if (current instanceof SDTGuard.SDTAndGuard) { + guards.addAll(((SDTGuard.SDTAndGuard) current).conjuncts()); } } @@ -438,7 +432,7 @@ private SDT makeRejectingBranch(int nextSufIndex, int maxIndex, DataType type) { return SDTLeaf.REJECTING; } else { Map map = new LinkedHashMap<>(); - SDTTrueGuard trueGuard = new SDTTrueGuard(new SuffixValue(type, nextSufIndex)); + SDTGuard.SDTTrueGuard trueGuard = new SDTGuard.SDTTrueGuard(new SuffixValue(type, nextSufIndex)); map.put(trueGuard, makeRejectingBranch(nextSufIndex + 1, maxIndex, type)); SDT sdt = new SDT(map); return sdt; @@ -459,17 +453,22 @@ public SuffixValueRestriction restrictSuffixValue(SDTGuard guard, Map prefix, SymbolicSuffix suffix, WordVa sdt = oracle.treeQuery(prefix, suffix, trueValues, pir, constants, trueSuffixValues); LOGGER.trace(Category.QUERY, " single deq SDT : {}", sdt.toString()); - merged.put(new SDTTrueGuard(sv), sdt); + merged.put(new SDTGuard.SDTTrueGuard(sv), sdt); SDT returnSDT = new SDT(merged); return returnSDT; diff --git a/src/main/java/de/learnlib/ralib/theory/inequality/InequalityTheoryWithEq.java b/src/main/java/de/learnlib/ralib/theory/inequality/InequalityTheoryWithEq.java index 128820d4..aa2755fc 100644 --- a/src/main/java/de/learnlib/ralib/theory/inequality/InequalityTheoryWithEq.java +++ b/src/main/java/de/learnlib/ralib/theory/inequality/InequalityTheoryWithEq.java @@ -42,8 +42,6 @@ import de.learnlib.ralib.oracles.mto.SDTConstructor; import de.learnlib.ralib.oracles.mto.SDTLeaf; import de.learnlib.ralib.theory.*; -import de.learnlib.ralib.theory.equality.DisequalityGuard; -import de.learnlib.ralib.theory.equality.EqualityGuard; import de.learnlib.ralib.words.DataWords; import de.learnlib.ralib.words.PSymbolInstance; import de.learnlib.ralib.words.ParameterizedSymbol; @@ -57,92 +55,12 @@ */ public abstract class InequalityTheoryWithEq implements Theory { -// private static final LearnLogger LOGGER -// = LearnLogger.getLogger(InequalityTheoryWithEq.class); - -// private Set setify(SDTGuard... gs) { -// Set guardSet = new LinkedHashSet<>(); -// for (SDTGuard g : gs) { -// // if g is an or guard -// if (g instanceof SDTOrGuard) { -// SDTOrGuard cg = (SDTOrGuard) g; -// for (SDTGuard x : cg.getGuards()) { -// if (x instanceof SDTIfGuard) { -// SDTIfGuard ifX = (SDTIfGuard) x; -// // remove contradicting guards -// if (guardSet.contains(ifX.toDeqGuard())) { -// guardSet.remove(ifX.toDeqGuard()); -// } else { -// guardSet.add(x); -// } -// } -// else { -// guardSet.add(x); -// } -// } -// } else if (g instanceof SDTIfGuard) { -// SDTIfGuard x = (SDTIfGuard) g; -// // if guardset already contains the contradicting guard, remove it -// if (guardSet.contains(x.toDeqGuard())) { -// guardSet.remove(x.toDeqGuard()); -// // if g is a Bigger or Smaller guard, merge into disequality guard -// if (!(g instanceof EqualityGuard)) { -// guardSet.add(new DisequalityGuard( -// x.getParameter(), x.getRegister())); -// } -// } else { -// guardSet.add(x); -// } -// } else if (g instanceof SDTAndGuard) { -// SDTAndGuard ag = (SDTAndGuard) g; -// List ifs = new ArrayList(); -// for (SDTIfGuard x : ag.getGuards()) { -// if (guardSet.contains(x.toDeqGuard())) { -// guardSet.remove(x.toDeqGuard()); -// if (!(g instanceof EqualityGuard)) { -// guardSet.add(new DisequalityGuard( -// x.getParameter(), x.getRegister())); -// } -// } else { -// ifs.add(x); -// } -// } -// if (ifs.size() == 1) { -// guardSet.add(ifs.get(0)); -// } else if (ifs.size() > 1) { -// guardSet.add(new SDTAndGuard(g.getParameter(), -// ifs.toArray(new SDTIfGuard[]{}))); -// } -// -// } -// } -// return guardSet; -// } -// private SDTGuard mergeGuardLists(SDTGuard g1, SDTGuard g2) { -// Set guardSet = (setify(g1, g2)); -// if (guardSet.isEmpty()) { -// return new SDTTrueGuard(g1.getParameter()); -// } else { -// SDTIfGuard[] guardArray = guardSet.toArray(new SDTIfGuard[]{}); -// if (guardArray.length == 1) { -// return guardArray[0]; -// } else { -// return new SDTOrGuard(g1.getParameter(), -// guardSet.toArray(new SDTIfGuard[]{})); -// } -// } -// } -// private List preprocess(List guardList) { -// for (SDTGuard g : guardList) { -// -// } -// } private void addAllSafely(Collection guards, Collection toAdd, List regPotential) { // System.out.println("adding " + toAdd + " to " + guards); for (SDTGuard t : toAdd) { - if (t instanceof SDTOrGuard) { + if (t instanceof SDTGuard.SDTOrGuard og) { // System.out.println("or guard"); - addAllSafely(guards, ((SDTOrGuard) t).getGuards(), regPotential); + addAllSafely(guards, og.disjuncts(), regPotential); // System.out.println(guards); } else { addSafely(guards, t, regPotential); @@ -152,18 +70,18 @@ private void addAllSafely(Collection guards, Collection toAd private void addSafely(Collection guards, SDTGuard guard, List regPotential) { boolean processed = false; - if (guard instanceof SDTIfGuard) { - SDTIfGuard oGuard = ((SDTIfGuard) guard).toDeqGuard(); + if (guard instanceof SDTGuard.EqualityGuard || guard instanceof SDTGuard.DisequalityGuard) { + SDTGuard oGuard = SDTGuard.toDeqGuard(guard); // System.out.println(guard + ": checking if guards contains " + oGuard); if (guards.contains(oGuard)) { // System.out.println("yes, removing " + oGuard); guards.remove(oGuard); processed = true; } - } else if (guard instanceof IntervalGuard iGuard) { + } else if (guard instanceof SDTGuard.IntervalGuard iGuard) { // System.out.println("guard is intervalguard"); if (!iGuard.isIntervalGuard()) { - IntervalGuard flipped = iGuard.flip(); + SDTGuard.IntervalGuard flipped = IntervalGuardUtil.flip(iGuard); // System.out.println("flipped: " + flipped); if (guards.contains(flipped)) { guards.remove(flipped); @@ -171,9 +89,9 @@ private void addSafely(Collection guards, SDTGuard guard, List> mergeOneWithSet(List> inAndOut, SDTGua // if target isn't in guardSet and isn't prohibited if (!(guardSet.contains(target)) && !(prohibited.contains(target))) { - assert !(target instanceof SDTOrGuard && m instanceof SDTOrGuard); + assert !(target instanceof SDTGuard.SDTOrGuard && m instanceof SDTGuard.SDTOrGuard); - if (target instanceof SDTIfGuard) { + if (target instanceof SDTGuard.EqualityGuard || target instanceof SDTGuard.DisequalityGuard) { // if it is an equality or disequality, remove the opposite by adding both to prohibited - SDTIfGuard oGuard = ((SDTIfGuard) target).toDeqGuard(); + SDTGuard oGuard = SDTGuard.toDeqGuard(target); // System.out.println(target + ": checking if guards contains " + oGuard); if (guardSet.contains(oGuard)) { // System.out.println("yes, removing " + oGuard); @@ -238,11 +156,11 @@ private List> mergeOneWithSet(List> inAndOut, SDTGua prohibited.add(target); processed = true; } - } else if (target instanceof IntervalGuard iGuard) { + } else if (target instanceof SDTGuard.IntervalGuard iGuard) { // System.out.println(target + " is iGuard"); // if it is an interval guard, check if the set contains flipped if (!iGuard.isIntervalGuard()) { - IntervalGuard flipped = iGuard.flip(); + SDTGuard.IntervalGuard flipped = IntervalGuardUtil.flip(iGuard); // System.out.println("flipped: " + flipped); // System.out.println("guardSet " + guardSet + " " + guardSet.contains(flipped)); if (guardSet.contains(flipped)) { @@ -250,7 +168,7 @@ private List> mergeOneWithSet(List> inAndOut, SDTGua prohibited.add(target); newInAndOut.add(0, newGuardSet); newInAndOut.add(1, prohibited); - List> nextInAndOut = mergeOneWithSet(newInAndOut, iGuard.toDeqGuard(), regPotential); + List> nextInAndOut = mergeOneWithSet(newInAndOut, SDTGuard.toDeqGuard(iGuard), regPotential); newGuardSet = nextInAndOut.get(0); prohibited = nextInAndOut.get(1);// processed = true; @@ -302,27 +220,7 @@ private List> mergeOneWithSet(List> inAndOut, SDTGua } newInAndOut.add(0, newGuardSet); newInAndOut.add(1, prohibited); -// Set temp = new LinkedHashSet<>(); -// Set prohibited = new LinkedHashSet<>(); -// System.out.println("temp is: " + temp + " and prohibited: " + prohibited); -// for (SDTGuard m : merged) { -// assert !(target instanceof SDTOrGuard && m instanceof SDTOrGuard); -// Set mWithTarget = target.mergeWith(m); -// System.out.println("merging: " + target + " + " + m + " --> " + mWithTarget); -// if (!mWithTarget.contains(target)) { -// prohibited.add(target); -// temp.remove(target); -// } -// if (!mWithTarget.contains(m)) { -// prohibited.add(m); -// temp.remove(target); -// } -// addAllSafely(temp, mWithTarget, prohibited); -// System.out.println("... but after adding " + mWithTarget + " safely: " + temp + " with " + prohibited); -// } -// System.out.println("return: " + temp); -// return temp; -// System.out.println("removing: " + prohibited); + removeProhibited(newGuardSet, prohibited); // System.out.println("... and after removing :: " + newGuardSet); // System.out.println("modified is " + Arrays.toString(addedSomething)); @@ -334,110 +232,6 @@ private List> mergeOneWithSet(List> inAndOut, SDTGua } } -// private Set mergeOneWithSet(Set guardSet, SDTGuard target, List regPotential, Set prohibited) { -// -// //Set prohibited = new LinkedHashSet<>(); -// Set newGuardSet = new LinkedHashSet<>(); -// Boolean[] modified = new Boolean[guardSet.size()]; -// boolean processed = false; -// newGuardSet.addAll(guardSet); -// -// int i = -1; -// for (SDTGuard m : guardSet) { -// System.out.println("guards: " + newGuardSet); -// i++; -// modified[i] = false; -// if (!(guardSet.contains(target)) && !(prohibited.contains(target))) { -// -// assert !(target instanceof SDTOrGuard && m instanceof SDTOrGuard); -// -// if (target instanceof SDTIfGuard) { -// SDTIfGuard oGuard = ((SDTIfGuard) target).toDeqGuard(); -//// System.out.println(guard + ": checking if guards contains " + oGuard); -// if (guardSet.contains(oGuard)) { -//// System.out.println("yes, removing " + oGuard); -// prohibited.add(oGuard); -// prohibited.add(target); -// processed = true; -// } -// } else if (target instanceof IntervalGuard) { -// IntervalGuard iGuard = (IntervalGuard) target; -// if (!iGuard.isIntervalGuard()) { -// IntervalGuard flipped = iGuard.flip(); -// System.out.println("flipped: " + flipped); -// if (guardSet.contains(flipped)) { -// prohibited.add(flipped); -// prohibited.add(target); -// processed = true; -// } -// } -// } -// if (!processed) { -// Set refSet = new LinkedHashSet<>(); -// refSet.add(target); -// refSet.add(m); -// Set mWithTarget = target.mergeWith(m, regPotential); -// System.out.println("merging: " + target + " + " + m + " --> " + mWithTarget + ", " + refSet.equals(mWithTarget)); -// if (!mWithTarget.contains(target)) { -// prohibited.add(target); -// //modified[i] = true; -//// guardSet.remove(target); -// } -// if (!mWithTarget.contains(m)) { -// prohibited.add(m); -// //modified[i] = true; -//// guardSet.remove(target); -// } -// modified[i] = !(refSet.equals(mWithTarget)); -// System.out.println("g: " + guardSet); -// System.out.println("n: " + newGuardSet); -// -// -// if (modified[i] && !(newGuardSet.containsAll(mWithTarget))) { -// for (SDTGuard x : mWithTarget) { -// newGuardSet = mergeOneWithSet(newGuardSet, x, regPotential, prohibited); -// } -// } -// else { -// newGuardSet.addAll(mWithTarget); -// } -// -//// newGuardSet.addAll(mWithTarget); -// System.out.println("into: " + newGuardSet); -// } -// } -// } -//// Set temp = new LinkedHashSet<>(); -//// Set prohibited = new LinkedHashSet<>(); -//// System.out.println("temp is: " + temp + " and prohibited: " + prohibited); -//// for (SDTGuard m : merged) { -//// assert !(target instanceof SDTOrGuard && m instanceof SDTOrGuard); -//// Set mWithTarget = target.mergeWith(m); -//// System.out.println("merging: " + target + " + " + m + " --> " + mWithTarget); -//// if (!mWithTarget.contains(target)) { -//// prohibited.add(target); -//// temp.remove(target); -//// } -//// if (!mWithTarget.contains(m)) { -//// prohibited.add(m); -//// temp.remove(target); -//// } -//// addAllSafely(temp, mWithTarget, prohibited); -//// System.out.println("... but after adding " + mWithTarget + " safely: " + temp + " with " + prohibited); -//// } -//// System.out.println("return: " + temp); -//// return temp; -// System.out.println("removing: " + prohibited); -// removeProhibited(newGuardSet, prohibited); -// System.out.println("... and after removing :: " + newGuardSet); -// System.out.println("modified is " + Arrays.toString(modified)); -// if (hasTrue(modified) && !(guardSet.equals(newGuardSet))) { -// System.out.println("try again"); -// return mergeOneWithSet(newGuardSet, target, regPotential, prohibited); -// } else { -// return newGuardSet; -// } -// } // Returns true if all elements of a boolean array are true. private boolean hasTrue(Boolean[] maybeArr) { boolean maybe = false; @@ -463,11 +257,12 @@ private SDTGuard GuardSetFromList(Set merged, List remaining // if (merged.isEmpty()) { // return new SDTTrueGuard(currentParam); // } else { + // FIXME: fewer transformations SDTGuard[] guardArray = merged.toArray(new SDTGuard[]{}); if ((merged.size() == 1)) { // || hasOnlyEqs(merged)) { return guardArray[0]; } else { - return new SDTOrGuard(currentParam, guardArray); + return new SDTGuard.SDTOrGuard(currentParam, Arrays.stream(guardArray).toList()); } // } @@ -483,24 +278,7 @@ private SDTGuard GuardSetFromList(Set merged, List remaining // ensure that a new OrGuard is returned if there is nothing remaining } -// private Set getHeads(Set> listSets) { -// Set retSet = new LinkedHashSet<>(); -// for (List l : listSets) { -// retSet.add(l.get(0)); -// } -// return retSet; -// } -// private List getListFromHead(SDTGuard guard, Set> listSets) { -// Set heads = getHeads(listSets); -// if (heads.contains(guard)) { -// for (List l : listSets) { -// if (l.get(0).equals(guard)) { -// return l; -// } -// } -// } -// throw new IllegalStateException("not found"); -// } + private Map, SDT> modGuardLists(SDTGuard refGuard, SDT refSDT, Map, SDT> partitionedMap) { boolean merged = false; Map, SDT> newParMap = new LinkedHashMap<>(); @@ -530,12 +308,12 @@ private Map, SDT> modGuardLists(SDTGuard refGuard, SDT refSDT, Ma //newParMap.put(newHeadList, newSDT); } - if (refGuard instanceof IntervalGuard iRefGuard && !merged) { + if (refGuard instanceof SDTGuard.IntervalGuard iRefGuard && !merged) { if (!iRefGuard.isIntervalGuard()) { - EqualityGuard eqGuard = iRefGuard.toEqGuard(); + SDTGuard.EqualityGuard eqGuard = IntervalGuardUtil.toEqGuard(iRefGuard); if (newHeadList.contains(eqGuard)) { // System.out.println("trying Deq " + refGuard + " against " + newHeadList + " with " + eqGuard); - SDT joinedSDT = getJoinedSDT(((IntervalGuard) refGuard).toEqGuard(), refSDT, headSDT); + SDT joinedSDT = getJoinedSDT((IntervalGuardUtil.toEqGuard( (SDTGuard.IntervalGuard) refGuard) ), refSDT, headSDT); if (joinedSDT != null) { // System.out.println("can merge: " + refGuard + " with EQ" + headList); newHeadList.add(refGuard); @@ -547,11 +325,12 @@ private Map, SDT> modGuardLists(SDTGuard refGuard, SDT refSDT, Ma } } else { assert iRefGuard.isIntervalGuard(); - EqualityGuard eqG = null; - if (newHeadList.contains(new EqualityGuard(iRefGuard.getParameter(), iRefGuard.getLeftReg()))) { - eqG = new EqualityGuard(iRefGuard.getParameter(), iRefGuard.getLeftReg()); - } else if (newHeadList.contains(new EqualityGuard(iRefGuard.getParameter(), iRefGuard.getRightReg()))) { - eqG = new EqualityGuard(iRefGuard.getParameter(), iRefGuard.getLeftReg()); + SDTGuard.EqualityGuard eqG = null; + // FIXME: this seems to be a bug as in both cases we use leftlimit? + if (newHeadList.contains(new SDTGuard.EqualityGuard(iRefGuard.getParameter(), iRefGuard.leftLimit()))) { + eqG = new SDTGuard.EqualityGuard(iRefGuard.getParameter(), iRefGuard.leftLimit()); + } else if (newHeadList.contains(new SDTGuard.EqualityGuard(iRefGuard.getParameter(), iRefGuard.rightLimit()))) { + eqG = new SDTGuard.EqualityGuard(iRefGuard.getParameter(), iRefGuard.leftLimit()); } if (eqG != null) { // System.out.println("trying Eq " + refGuard + " against " + newHeadList + " with " + eqG); @@ -567,9 +346,9 @@ private Map, SDT> modGuardLists(SDTGuard refGuard, SDT refSDT, Ma } } - if (refGuard instanceof EqualityGuard && !merged) { + if (refGuard instanceof SDTGuard.EqualityGuard && !merged) { // System.out.println("trying Eq " + refGuard + " against " + newHeadList); - SDT joinedSDT = getJoinedSDT((EqualityGuard) refGuard, headSDT, refSDT); + SDT joinedSDT = getJoinedSDT((SDTGuard.EqualityGuard) refGuard, headSDT, refSDT); if (joinedSDT != null) { // System.out.println("can merge: EQ" + refGuard + " with " + headList); newHeadList.add(0, refGuard); @@ -640,11 +419,11 @@ private Map, SDT> partitionGuards(Map refMap) { // if yes, then add to that list // if no, then start a new list //} - private SDT getJoinedSDT(EqualityGuard guard, SDT deqSDT, SDT eqSDT) { + private SDT getJoinedSDT(SDTGuard.EqualityGuard guard, SDT deqSDT, SDT eqSDT) { //boolean canJoin = false; - EqualityGuard eqGuard = guard; - List ds = new ArrayList(); + SDTGuard.EqualityGuard eqGuard = guard; + List ds = new ArrayList(); ds.add(eqGuard); // System.out.println("checking if T" + deqSDT + " is eq to O" + eqSDT + " under " + eqGuard); @@ -669,7 +448,7 @@ private SDT getJoinedSDT(EqualityGuard guard, SDT deqSDT, SDT eqSDT) { } // } //else if (guard instanceof IntervalGuard) { // IntervalGuard iGuard = (IntervalGuard) guard; -// List ds = new ArrayList(); +// List ds = new ArrayList(); // if (!iGuard.isSmallerGuard()) { // ds.add(new EqualityGuard(iGuard.getParameter(), iGuard.getLeftReg())); // } @@ -683,46 +462,6 @@ private SDT getJoinedSDT(EqualityGuard guard, SDT deqSDT, SDT eqSDT) { return null; } -// private Map mergeGuards(Map unmerged, SuffixValue currentParam, List regPotential) { -// if (unmerged.keySet().size() == 1) { -// assert unmerged.containsKey(new SDTTrueGuard(currentParam)); -// return unmerged; -// } -// Map merged = mergeGuards(new LinkedHashMap(), currentParam, unmerged, regPotential); -// -// if (merged.keySet().size() == 1) { -// -//// System.out.println("unmerged: " + merged); -// // hack?? -//// SDTGuard onlyGuard = merged.keySet().iterator().next(); -//// SDT onlySDT = merged.get(onlyGuard); -//// if (!(onlyGuard instanceof SDTTrueGuard)) { -//// assert onlyGuard instanceof SDTIfGuard; -//// merged.remove(onlyGuard); -//// merged.put(new SDTTrueGuard(currentParam), onlySDT); -//// } -// assert merged.containsKey(new SDTTrueGuard(currentParam)); -// -// } -//// System.out.println("merged: " + merged); -// return merged; -// } -// -// private Map -// mergeGuards(Map first, SuffixValue currentParam, Map second, List regPotential) { -//// System.out.println("comparing " + first + " with " + second); -//// if (!first.keySet().isEmpty() && first.keySet().size() <= second.keySet().size()) { -//// System.out.println("return " + first); -//// return first; -//// } else { -// // if they are not the same size, we want to keep merging them -// Map newSecond = mgGuards(second, currentParam, regPotential); -//// return mergeGuards(second, currentParam, newSecond); -// // } -// return newSecond; -// } - // given a map from guards to SDTs, merge guards based on whether they can - // use another SDT. private Map mgGuards(Map unmerged, SuffixValue currentParam, List regPotential) { assert !unmerged.isEmpty(); @@ -741,10 +480,10 @@ private SDT getJoinedSDT(EqualityGuard guard, SDT deqSDT, SDT eqSDT) { // System.out.println("partitioned map entry: " + par.getKey()); SDTGuard newSDTGuard = GuardSetFromList(new LinkedHashSet(), par.getKey(), currentParam, regPotential); // System.out.println("--> Guard: " + newSDTGuard); - if (newSDTGuard instanceof SDTOrGuard) { - List subguards = ((SDTOrGuard) newSDTGuard).getGuards(); + if (newSDTGuard instanceof SDTGuard.SDTOrGuard) { + List subguards = ((SDTGuard.SDTOrGuard) newSDTGuard).disjuncts(); if (subguards.isEmpty()) { - retMap.put(new SDTTrueGuard(currentParam), par.getValue()); + retMap.put(new SDTGuard.SDTTrueGuard(currentParam), par.getValue()); } else { for (SDTGuard subguard : subguards) { retMap.put(subguard, par.getValue()); @@ -760,53 +499,20 @@ private SDT getJoinedSDT(EqualityGuard guard, SDT deqSDT, SDT eqSDT) { return retMap; } - // given a set of registers and a set of guards, keep only the registers -// that are mentioned in any guard -// private PIV keepMem(Set guardSet) { -// PIV ret = new PIV(); -// -// // 1. create guard list -// Set ifGuards = new LinkedHashSet<>(); -// for (SDTGuard g : guardSet) { -// if (g instanceof SDTIfGuard) { -// ifGuards.add((SDTIfGuard) g); -// } else if (g instanceof SDTOrGuard) { -// ifGuards.addAll(((SDTOrGuard) g).getGuards()); -// } -// } -// -// // 2. determine which registers to keep -// Set tempRegs = new LinkedHashSet<>(); -// for (SDTGuard g : ifGuards) { -// if (g instanceof SDTAndGuard) { -// tempRegs.addAll(((SDTAndGuard) g).getAllRegs()); -// } else if (g instanceof SDTIfGuard) { -// tempRegs.add(((SDTIfGuard) g).getRegister()); -// } -// } -// for (SymbolicDataValue r : tempRegs) { -// Parameter p = new Parameter(r.getType(), r.getId()); -// if (r instanceof Register) { -// ret.put(p, (Register) r); -// } -// } -// return ret; -// } -// private PIV keepMem(Map guardMap) { PIV ret = new PIV(); for (Map.Entry e : guardMap.entrySet()) { SDTGuard mg = e.getKey(); - if (mg instanceof SDTIfGuard) { + if (mg instanceof SDTGuard.EqualityGuard || mg instanceof SDTGuard.DisequalityGuard) { //LOGGER.trace(mg.toString()); - SymbolicDataValue r = ((SDTIfGuard) mg).getRegister(); + SymbolicDataValue r = mg.getRegisters().stream().iterator().next(); Parameter p = new Parameter(r.getDataType(), r.getId()); if (r instanceof Register) { ret.put(p, (Register) r); } - } else if (mg instanceof IntervalGuard iGuard) { + } else if (mg instanceof SDTGuard.IntervalGuard iGuard) { if (!iGuard.isBiggerGuard()) { - SymbolicDataValue r = iGuard.getRightReg(); + SymbolicDataValue r = iGuard.rightLimit(); Parameter p = new Parameter(r.getDataType(), r.getId()); if (r instanceof Register) { ret.put(p, (Register) r); @@ -814,21 +520,21 @@ private PIV keepMem(Map guardMap) { } if (!iGuard.isSmallerGuard()) { - SymbolicDataValue r = iGuard.getLeftReg(); + SymbolicDataValue r = iGuard.leftLimit(); Parameter p = new Parameter(r.getDataType(), r.getId()); if (r instanceof Register) { ret.put(p, (Register) r); } } - } else if (mg instanceof SDTOrGuard) { - Set rSet = ((SDTOrGuard) mg).getAllRegs(); + } else if (mg instanceof SDTGuard.SDTOrGuard) { + Set rSet = ((SDTGuard.SDTOrGuard) mg).getRegisters(); for (SymbolicDataValue r : rSet) { Parameter p = new Parameter(r.getDataType(), r.getId()); if (r instanceof Register) { ret.put(p, (Register) r); } } - } else if (!(mg instanceof SDTTrueGuard)) { + } else if (!(mg instanceof SDTGuard.SDTTrueGuard)) { throw new IllegalStateException("wrong kind of guard"); } } @@ -883,7 +589,7 @@ public SDT treeQuery( SDT elseOracleSdt = oracle.treeQuery( prefix, suffix, elseValues, piv, constants, elseSuffixValues); - tempKids.put(new SDTTrueGuard(currentParam), elseOracleSdt); + tempKids.put(new SDTGuard.SDTTrueGuard(currentParam), elseOracleSdt); } // process each '<' case else { //Parameter p = new Parameter( @@ -897,9 +603,9 @@ public SDT treeQuery( Valuation smVal = new Valuation(); DataValue dvRight = potential.get(0); - IntervalGuard sguard = makeSmallerGuard( + SDTGuard.IntervalGuard sguard = makeSmallerGuard( dvRight, prefixValues, currentParam, smValues, piv); - SymbolicDataValue rsm = sguard.getRightReg(); + SymbolicDataValue rsm = sguard.rightLimit(); // System.out.println("setting valuation, symDV: " + rsm.toVariable() + " dvright: " + dvRight); smVal.setValue(rsm, dvRight.getValue()); DataValue smcv = instantiate( @@ -921,9 +627,9 @@ public SDT treeQuery( Valuation bgVal = new Valuation(); DataValue dvLeft = potential.get(potSize - 1); - IntervalGuard bguard = makeBiggerGuard( + SDTGuard.IntervalGuard bguard = makeBiggerGuard( dvLeft, prefixValues, currentParam, bgValues, piv); - SymbolicDataValue rbg = bguard.getLeftReg(); + SymbolicDataValue rbg = bguard.leftLimit(); bgVal.setValue(rbg, dvLeft.getValue()); DataValue bgcv = instantiate( @@ -954,13 +660,13 @@ public SDT treeQuery( // IntervalGuard biggerGuard = makeBiggerGuard( // dvMLeft, prefixValues, currentParam, // currentValues, piv); - IntervalGuard intervalGuard = makeIntervalGuard( + SDTGuard.IntervalGuard intervalGuard = makeIntervalGuard( dvMLeft, dvMRight, prefixValues, currentParam, currentValues, piv); // IntervalGuard guard = new IntervalGuard( // currentParam, biggerGuard.getLeftReg(), smallerGuard.getRightReg()); - SymbolicDataValue rs = intervalGuard.getRightReg(); - SymbolicDataValue rb = intervalGuard.getLeftReg(); + SymbolicDataValue rs = intervalGuard.rightLimit(); + SymbolicDataValue rb = intervalGuard.leftLimit(); val.setValue(rs, dvMRight.getValue()); val.setValue(rb, dvMLeft.getValue()); @@ -987,7 +693,7 @@ public SDT treeQuery( SuffixValuation ifSuffixValues = new SuffixValuation(); ifSuffixValues.putAll(suffixValues); // copy the suffix valuation - EqualityGuard eqGuard = pickupDataValue(newDv, prefixValues, + SDTGuard.EqualityGuard eqGuard = pickupDataValue(newDv, prefixValues, currentParam, values, constants); // LOGGER.trace("eqGuard is: " + eqGuard.toString()); //construct the equality guard @@ -1021,7 +727,7 @@ public SDT treeQuery( for (SDTGuard g : merged.keySet()) { assert !(g == null); - if (g instanceof SDTTrueGuard) { + if (g instanceof SDTGuard.SDTTrueGuard) { if (merged.keySet().size() != 1) { throw new IllegalStateException("only one true guard allowed: \n" + prefix + " + " + suffix); } @@ -1033,30 +739,30 @@ public SDT treeQuery( return returnSDT; } - private EqualityGuard pickupDataValue(DataValue newDv, + private SDTGuard.EqualityGuard pickupDataValue(DataValue newDv, List prefixValues, SuffixValue currentParam, WordValuation ifValues, Constants constants) { DataType type = currentParam.getDataType(); int newDv_i; for (Map.Entry entry : constants.entrySet()) { if (entry.getValue().equals(newDv)) { - return new EqualityGuard(currentParam, entry.getKey()); + return new SDTGuard.EqualityGuard(currentParam, entry.getKey()); } } if (prefixValues.contains(newDv)) { // first index of the data value in the prefixvalues list newDv_i = prefixValues.indexOf(newDv) + 1; Register newDv_r = new Register(type, newDv_i); - return new EqualityGuard(currentParam, newDv_r); + return new SDTGuard.EqualityGuard(currentParam, newDv_r); } // if the data value isn't in the prefix, it is somewhere earlier in the suffix else { int smallest = Collections.min(ifValues.getAllKeys(newDv)); - return new EqualityGuard(currentParam, new SuffixValue(type, smallest)); + return new SDTGuard.EqualityGuard(currentParam, new SuffixValue(type, smallest)); } } - private IntervalGuard makeSmallerGuard(DataValue smallerDv, + private SDTGuard.IntervalGuard makeSmallerGuard(DataValue smallerDv, List prefixValues, SuffixValue currentParam, WordValuation ifValues, PIV pir) { DataType type = currentParam.getDataType(); @@ -1071,27 +777,27 @@ private IntervalGuard makeSmallerGuard(DataValue smallerDv, } else { newDv_r = new Register(type, newDv_i); } - return new IntervalGuard(currentParam, null, newDv_r); + return new SDTGuard.IntervalGuard(currentParam, null, newDv_r); } // if the data value isn't in the prefix, it is somewhere earlier in the suffix else { int smallest = Collections.min(ifValues.getAllKeys(smallerDv)); - IntervalGuard sg = new IntervalGuard( + SDTGuard.IntervalGuard sg = new SDTGuard.IntervalGuard( currentParam, null, new SuffixValue(type, smallest)); return sg; } } - private IntervalGuard makeIntervalGuard(DataValue biggerDv, + private SDTGuard.IntervalGuard makeIntervalGuard(DataValue biggerDv, DataValue smallerDv, List prefixValues, SuffixValue currentParam, WordValuation ifValues, PIV pir) { - IntervalGuard smallerGuard = makeSmallerGuard(smallerDv, prefixValues, currentParam, ifValues, pir); - IntervalGuard biggerGuard = makeBiggerGuard(biggerDv, prefixValues, currentParam, ifValues, pir); - return new IntervalGuard(currentParam, biggerGuard.getLeftReg(), smallerGuard.getRightReg()); + SDTGuard.IntervalGuard smallerGuard = makeSmallerGuard(smallerDv, prefixValues, currentParam, ifValues, pir); + SDTGuard.IntervalGuard biggerGuard = makeBiggerGuard(biggerDv, prefixValues, currentParam, ifValues, pir); + return new SDTGuard.IntervalGuard(currentParam, biggerGuard.leftLimit(), smallerGuard.rightLimit()); } - private IntervalGuard makeBiggerGuard(DataValue biggerDv, + private SDTGuard.IntervalGuard makeBiggerGuard(DataValue biggerDv, List prefixValues, SuffixValue currentParam, WordValuation ifValues, PIV pir) { DataType type = currentParam.getDataType(); @@ -1106,12 +812,12 @@ private IntervalGuard makeBiggerGuard(DataValue biggerDv, } else { newDv_r = new Register(type, newDv_i); } - return new IntervalGuard(currentParam, newDv_r, null); + return new SDTGuard.IntervalGuard(currentParam, newDv_r, null); } // if the data value isn't in the prefix, it is somewhere earlier in the suffix else { int smallest = Collections.min(ifValues.getAllKeys(biggerDv)); - IntervalGuard bg = new IntervalGuard( + SDTGuard.IntervalGuard bg = new SDTGuard.IntervalGuard( currentParam, new SuffixValue(type, smallest), null); return bg; } @@ -1157,8 +863,8 @@ public DataValue instantiate( // LOGGER.trace("prefix values : " + prefixValues.toString()); - if (guard instanceof EqualityGuard eqGuard) { - SymbolicDataValue ereg = eqGuard.getRegister(); + if (guard instanceof SDTGuard.EqualityGuard eqGuard) { + SymbolicDataValue ereg = eqGuard.register(); if (ereg.isRegister()) { // LOGGER.trace("piv: " + piv.toString() + " " + ereg.toString() + " " + param.toString()); Parameter p = piv.getOneKey((Register) ereg); @@ -1171,7 +877,7 @@ public DataValue instantiate( } else if (ereg.isConstant()) { returnThis = constants.get((SymbolicDataValue.Constant) ereg); } - } else if (guard instanceof SDTTrueGuard || guard instanceof DisequalityGuard) { + } else if (guard instanceof SDTGuard.SDTTrueGuard || guard instanceof SDTGuard.DisequalityGuard) { Collection potSet = DataWords.joinValsToSet( constants.values(type), @@ -1187,35 +893,36 @@ public DataValue instantiate( pval.values(type)); Valuation val = new Valuation(); //System.out.println("already used = " + alreadyUsedValues); - if (guard instanceof IntervalGuard) { - IntervalGuard iGuard = (IntervalGuard) guard; + if (guard instanceof SDTGuard.IntervalGuard) { + SDTGuard.IntervalGuard iGuard = (SDTGuard.IntervalGuard) guard; if (!iGuard.isBiggerGuard()) { - SymbolicDataValue r = iGuard.getRightReg(); + SymbolicDataValue r = iGuard.rightLimit(); DataValue regVal = getRegisterValue(r, piv, prefixValues, constants, pval); val.setValue(r, regVal.getValue()); } if (!iGuard.isSmallerGuard()) { - SymbolicDataValue l = iGuard.getLeftReg(); + SymbolicDataValue l = iGuard.leftLimit(); DataValue regVal = getRegisterValue(l, piv, prefixValues, constants, pval); val.setValue(l, regVal.getValue()); } //instantiate(guard, val, param, constants); - } else if (guard instanceof SDTIfGuard) { - SymbolicDataValue r = ((SDTIfGuard) guard).getRegister(); + } else if (guard instanceof SDTGuard.EqualityGuard || guard instanceof SDTGuard.DisequalityGuard) { + // FIXME: hacky way of getting register + SymbolicDataValue r = guard.getRegisters().stream().iterator().next(); DataValue regVal = getRegisterValue(r, piv, prefixValues, constants, pval); val.setValue(r, regVal.getValue()); - } else if (guard instanceof SDTOrGuard) { - SDTGuard iGuard = ((SDTOrGuard) guard).getGuards().get(0); + } else if (guard instanceof SDTGuard.SDTOrGuard) { + SDTGuard iGuard = ((SDTGuard.SDTOrGuard) guard).disjuncts().get(0); returnThis = instantiate(iGuard, val, constants, alreadyUsedValues); - } else if (guard instanceof SDTAndGuard) { - assert ((SDTAndGuard) guard).getGuards().stream().allMatch(g -> g instanceof DisequalityGuard); - SDTGuard aGuard = ((SDTAndGuard) guard).getGuards().get(0); + } else if (guard instanceof SDTGuard.SDTAndGuard) { + assert ((SDTGuard.SDTAndGuard) guard).conjuncts().stream().allMatch(g -> g instanceof SDTGuard.DisequalityGuard); + SDTGuard aGuard = ((SDTGuard.SDTAndGuard) guard).conjuncts().get(0); @@ -1225,8 +932,8 @@ public DataValue instantiate( } // } -// } else if (iGuard instanceof SDTIfGuard) { -// SymbolicDataValue r = ((SDTIfGuard) iGuard).getRegister(); +// } else if (iGuard instanceof SDTGuard.SDTIfGuard) { +// SymbolicDataValue r = ((SDTGuard.SDTIfGuard) iGuard).getRegister(); // DataValue regVal = getRegisterValue(r, piv, // prefixValues, constants, pval); // val.setValue(r.toVariable(), regVal); @@ -1254,60 +961,4 @@ public DataValue instantiate( return returnThis; } -// @Override -// public DataValue instantiate( -// Word prefix, -// ParameterizedSymbol ps, PIV piv, -// ParValuation pval, -// Constants constants, -// SDTGuard guard, -// Parameter param) { -// -// DataType type = param.getType(); -// -// List prefixValues = Arrays.asList(DataWords.valsOf(prefix)); -// -// LOGGER.trace("prefix values : " + prefixValues.toString()); -// -// if (guard instanceof EqualityGuard) { -// EqualityGuard eqGuard = (EqualityGuard) guard; -// SymbolicDataValue ereg = eqGuard.getRegister(); -// DataValue x = getRegisterValue( -// ereg, piv, prefixValues, constants, pval); -// return x; -// } else if ((guard instanceof SDTTrueGuard) -// || guard instanceof DisequalityGuard) { -// -// Collection potSet = DataWords.joinValsToSet( -// constants.values(type), -// DataWords.valSet(prefix, type), -// pval.values(type)); -// -// return this.getFreshValue(new ArrayList(potSet)); -// } else { -// Collection alreadyUsedValues -// = DataWords.joinValsToSet( -// constants.values(type), -// DataWords.valSet(prefix, type), -// pval.values(type)); -// Valuation val = new Valuation(); -// if (guard instanceof SDTIfGuard) { -// SymbolicDataValue r = (((SDTIfGuard) guard).getRegister()); -// DataValue regVal = getRegisterValue(r, piv, -// prefixValues, constants, pval); -// -// val.setValue(r.toVariable(), regVal); -// //instantiate(guard, val, param, constants); -// } else if (guard instanceof SDTMultiGuard) { -// for (SDTIfGuard ifGuard : ((SDTMultiGuard) guard).getGuards()) { -// SymbolicDataValue r = ifGuard.getRegister(); -// DataValue regVal = getRegisterValue(r, piv, -// prefixValues, constants, pval); -// val.setValue(r.toVariable(), regVal); -// } -// } -// return instantiate(guard, val, constants, alreadyUsedValues); -// } -// -// } } diff --git a/src/main/java/de/learnlib/ralib/theory/inequality/IntervalGuard.java b/src/main/java/de/learnlib/ralib/theory/inequality/IntervalGuard.java deleted file mode 100644 index 49d0ce0d..00000000 --- a/src/main/java/de/learnlib/ralib/theory/inequality/IntervalGuard.java +++ /dev/null @@ -1,334 +0,0 @@ -/* - * Copyright (C) 2014 falk. - * - * This library 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 2.1 of the License, or (at your option) any later version. - * - * This library 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 this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, - * MA 02110-1301 USA - */ -package de.learnlib.ralib.theory.inequality; - -import java.util.Collections; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Objects; -import java.util.Set; - -import de.learnlib.ralib.data.SymbolicDataValue; -import de.learnlib.ralib.data.SymbolicDataValue.SuffixValue; -import de.learnlib.ralib.data.VarMapping; -import de.learnlib.ralib.theory.SDTGuard; -import de.learnlib.ralib.theory.equality.DisequalityGuard; -import de.learnlib.ralib.theory.equality.EqualityGuard; -import gov.nasa.jpf.constraints.api.Expression; -import gov.nasa.jpf.constraints.expressions.NumericBooleanExpression; -import gov.nasa.jpf.constraints.expressions.NumericComparator; -import gov.nasa.jpf.constraints.util.ExpressionUtil; - -/** - * - * @author falk - */ -public class IntervalGuard extends SDTGuard { - - public final SymbolicDataValue leftLimit; - public final SymbolicDataValue rightLimit; - - public IntervalGuard(SuffixValue param, SymbolicDataValue ll, SymbolicDataValue rl) { - super(param); - leftLimit = ll; - rightLimit = rl; - } - - public IntervalGuard(IntervalGuard other) { - super(other); - leftLimit = other.leftLimit;//.copy(); - rightLimit = other.rightLimit;//.copy(); - } - - public EqualityGuard toEqGuard() { - assert !isIntervalGuard(); - SymbolicDataValue r = null; - if (isSmallerGuard()) { - r = rightLimit; - } - else { - r = leftLimit; - } - return new EqualityGuard(this.parameter,r); - } - - public DisequalityGuard toDeqGuard() { - assert !isIntervalGuard(); - SymbolicDataValue r = null; - if (isSmallerGuard()) { - r = rightLimit; - } - else { - r = leftLimit; - } - return new DisequalityGuard(this.parameter,r); - } - - public IntervalGuard flip() { - return new IntervalGuard(parameter, rightLimit, leftLimit); - } - - public boolean isSmallerGuard() { - return leftLimit == null; - } - - public boolean isBiggerGuard() { - return rightLimit == null; - } - - public boolean isIntervalGuard() { - return (leftLimit != null && rightLimit != null); - } - - @Override - public Set getComparands(SymbolicDataValue dv) { - Set comparands = new LinkedHashSet<>(); - if (dv.equals(leftLimit)) - comparands.add(rightLimit); - else if (dv.equals(rightLimit)) - comparands.add(leftLimit); - return comparands; - } - - @Override - public String toString() { - if (leftLimit == null) { - return "(" + this.getParameter().toString() + "<" + this.rightLimit.toString() + ")"; - } - if (rightLimit == null) { - return "(" + this.getParameter().toString() + ">" + this.leftLimit + ")"; - } - return "(" + leftLimit + "<" + this.getParameter().toString() + "<" + this.rightLimit + ")"; - } - - public Set getAllRegs() { - Set regs = new LinkedHashSet<>(); - if (leftLimit != null) { - regs.add(leftLimit); - } - if (rightLimit != null) { - regs.add(rightLimit); - } - return regs; - } - - public SymbolicDataValue getLeftReg() { - assert !isSmallerGuard(); - return leftLimit; - } - - public SymbolicDataValue getRightReg() { - assert !isBiggerGuard(); - return rightLimit; - } - - // merge bigger with something - private Set bMergeIntervals(IntervalGuard other) { - Set guards = new LinkedHashSet<>(); - SymbolicDataValue l = this.getLeftReg(); - if (other.isBiggerGuard()) { - // System.out.println("other " + other + " is bigger"); - guards.add(this); - guards.add(other); - } else if (other.isSmallerGuard()) { -// System.out.println("other " + other + " is smaller"); -// System.out.println("see if " + l + " equals " + other.getRightReg() + "?"); - if (l.equals(other.getRightReg())) { -// System.out.println("yes, adding disequalityguard"); - guards.add(new DisequalityGuard(this.parameter, l)); - } else { -// System.out.println("no, merging into interval guard"); -// guards.add(new IntervalGuard(this.parameter, l, other.getRightReg())); - guards.add(this); - guards.add(other); - } - } else { -// System.out.println("other " + other + " is interv"); - - if (l.equals(other.getRightReg())) { - guards.add(new IntervalGuard(this.parameter, other.getLeftReg(), null)); - guards.add(new DisequalityGuard(this.parameter, l)); - } else if (l.equals(other.getLeftReg())) { - guards.add(this); - } else { - guards.add(this); - guards.add(other); - } - - } - return guards; - } - - // merge smaller with something - private Set sMergeIntervals(IntervalGuard other) { - Set guards = new LinkedHashSet<>(); - SymbolicDataValue r = this.getRightReg(); - if (other.isBiggerGuard()) { - return other.bMergeIntervals(this); - } else if (other.isSmallerGuard()) { - guards.add(this); - guards.add(other); - } else { - if (r.equals(other.getLeftReg())) { - guards.add(new IntervalGuard(this.parameter, null, other.getRightReg())); - guards.add(new DisequalityGuard(this.parameter, r)); - } else if (r.equals(other.getRightReg())) { - guards.add(this); - } else { - guards.add(this); - guards.add(other); - } - } - return guards; - } - - // merge interval with something - private Set iMergeIntervals(IntervalGuard other) { - Set guards = new LinkedHashSet<>(); - SymbolicDataValue l = this.getLeftReg(); - SymbolicDataValue r = this.getRightReg(); - if (other.isBiggerGuard()) { - return other.bMergeIntervals(this); - } else if (other.isSmallerGuard()) { - return other.sMergeIntervals(this); - } else { - SymbolicDataValue oL = other.getLeftReg(); - SymbolicDataValue oR = other.getRightReg(); - if (l.equals(oR)) { - if (r.equals(oL)) { - guards.add(new DisequalityGuard(this.parameter, l)); - guards.add(new DisequalityGuard(this.parameter, r)); - } else { - guards.add(new IntervalGuard(this.parameter, oL, r)); - guards.add(new DisequalityGuard(this.parameter, l)); - } - } else { - if (r.equals(oL)) { - guards.add(new IntervalGuard(this.parameter, l, oR)); - guards.add(new DisequalityGuard(this.parameter, r)); - } else { - guards.add(this); - guards.add(other); - } - } - } - return guards; - } - - public Set mergeIntervals(IntervalGuard other) { -// System.out.println("other i-guard: " + other); - if (this.isBiggerGuard()) { -// System.out.println(this + " is bigger, left limit is: " + this.leftLimit); - Set gs = this.bMergeIntervals(other); -// System.out.println("returningB: " + gs); - return gs; - } - if (this.isSmallerGuard()) { -// System.out.println(this + " is smaller, right limit is: " + this.rightLimit); - Set gs = this.sMergeIntervals(other); -// System.out.println("returningS: " + gs); - return gs; - } - -// System.out.println("is interv"); - return this.iMergeIntervals(other); - - } - - @Override - public Expression toExpr() { - if (leftLimit == null) { - return new NumericBooleanExpression(parameter, NumericComparator.LT, rightLimit); - } - if (rightLimit == null) { - return new NumericBooleanExpression(parameter, NumericComparator.GT, leftLimit); - } else { - Expression smaller = new NumericBooleanExpression(parameter, NumericComparator.LT, rightLimit); - Expression bigger = new NumericBooleanExpression(parameter, NumericComparator.GT, leftLimit); - return ExpressionUtil.and(smaller, bigger); - } - } - - @Override - public SDTGuard relabel(VarMapping relabelling) { - SymbolicDataValue.SuffixValue sv - = (SymbolicDataValue.SuffixValue) relabelling.get(parameter); - SymbolicDataValue r = null; - SymbolicDataValue l = null; - sv = (sv == null) ? parameter : sv; - - if (!isBiggerGuard()) { - if (rightLimit.isConstant()) { - r = rightLimit; - } else { - r = (SymbolicDataValue) relabelling.get(rightLimit); - } - r = (r == null) ? rightLimit : r; - } - if (!isSmallerGuard()) { - if (leftLimit.isConstant()) { - l = leftLimit; - } else { - l = (SymbolicDataValue) relabelling.get(leftLimit); - } - l = (l == null) ? leftLimit : l; - } - return new IntervalGuard(sv, l, r); - } - - @Override - public int hashCode() { - int hash = 5; - hash = 59 * hash + Objects.hashCode(parameter); - hash = 59 * hash + Objects.hashCode(leftLimit); - hash = 59 * hash + Objects.hashCode(rightLimit); - hash = 59 * hash + Objects.hashCode(getClass()); - - return hash; - } - - @Override - public boolean equals(Object obj) { - if (obj == null) { - return false; - } - if (getClass() != obj.getClass()) { - return false; - } - final IntervalGuard other = (IntervalGuard) obj; - if (!Objects.equals(this.rightLimit, other.rightLimit)) { - return false; - } - if (!Objects.equals(this.leftLimit, other.leftLimit)) { - return false; - } - return Objects.equals(this.parameter, other.parameter); - } - - @Override - public List unwrap() { - return Collections.singletonList(this); - } - - @Override - public IntervalGuard copy() { - return new IntervalGuard(this); - } - -} diff --git a/src/main/java/de/learnlib/ralib/tools/theories/DoubleInequalityTheory.java b/src/main/java/de/learnlib/ralib/tools/theories/DoubleInequalityTheory.java index e1fa18cb..ffb9ffff 100644 --- a/src/main/java/de/learnlib/ralib/tools/theories/DoubleInequalityTheory.java +++ b/src/main/java/de/learnlib/ralib/tools/theories/DoubleInequalityTheory.java @@ -32,13 +32,9 @@ import de.learnlib.ralib.data.SymbolicDataValue.SuffixValue; import de.learnlib.ralib.oracles.io.IOOracle; import de.learnlib.ralib.theory.SDTGuard; -import de.learnlib.ralib.theory.SDTIfGuard; -import de.learnlib.ralib.theory.SDTOrGuard; import de.learnlib.ralib.theory.SuffixValueRestriction; import de.learnlib.ralib.theory.UnrestrictedSuffixValue; -import de.learnlib.ralib.theory.equality.EqualityGuard; import de.learnlib.ralib.theory.inequality.InequalityTheoryWithEq; -import de.learnlib.ralib.theory.inequality.IntervalGuard; import de.learnlib.ralib.tools.classanalyzer.TypedTheory; import de.learnlib.ralib.words.PSymbolInstance; import gov.nasa.jpf.constraints.api.ConstraintSolver; @@ -102,9 +98,9 @@ public List getPotential(List dvs) { private List> instantiateGuard(SDTGuard g, Valuation val) { List> eList = new ArrayList>(); - if (g instanceof SDTIfGuard) { + if (g instanceof SDTGuard.EqualityGuard eualityGuard) { // pick up the register - SymbolicDataValue si = ((SDTIfGuard) g).getRegister(); + SymbolicDataValue si = eualityGuard.register(); // get the register value from the valuation DataValue sdi = new DataValue(type, val.getValue(si)); // add the register value as a constant @@ -112,9 +108,21 @@ private List> instantiateGuard(SDTGuard g, Valuation val) { // add the constant equivalence expression to the list eList.add(new NumericBooleanExpression(wm, NumericComparator.EQ, si)); - } else if (g instanceof IntervalGuard iGuard) { + } else if (g instanceof SDTGuard.DisequalityGuard disequalityGuard) { + // pick up the register + SymbolicDataValue si = disequalityGuard.register(); + // get the register value from the valuation + DataValue sdi = new DataValue(type, val.getValue(si)); + // add the register value as a constant + gov.nasa.jpf.constraints.expressions.Constant wm = new gov.nasa.jpf.constraints.expressions.Constant(BuiltinTypes.DECIMAL, (sdi.getValue())); + // add the constant equivalence expression to the list + eList.add(new NumericBooleanExpression(wm, NumericComparator.EQ, si)); + throw new RuntimeException("this seems to be wrong ..."); + + } else if (g instanceof SDTGuard.IntervalGuard iGuard) { if (!iGuard.isBiggerGuard()) { - SymbolicDataValue r = iGuard.getRightReg(); + SymbolicDataValue r = iGuard.rightLimit(); + assert r != null; DataValue ri = new DataValue(type, val.getValue(r)); gov.nasa.jpf.constraints.expressions.Constant wm = new gov.nasa.jpf.constraints.expressions.Constant(BuiltinTypes.DECIMAL, (ri.getValue())); // add the constant equivalence expression to the list @@ -122,7 +130,8 @@ private List> instantiateGuard(SDTGuard g, Valuation val) { } if (!iGuard.isSmallerGuard()) { - SymbolicDataValue l = iGuard.getLeftReg(); + SymbolicDataValue l = iGuard.leftLimit(); + assert l != null; DataValue li = new DataValue(type, val.getValue(l)); gov.nasa.jpf.constraints.expressions.Constant wm = new gov.nasa.jpf.constraints.expressions.Constant(BuiltinTypes.DECIMAL, (li.getValue())); // add the constant equivalence expression to the list @@ -139,20 +148,20 @@ public DataValue instantiate(SDTGuard g, Valuation val, Constants c, Collection< SymbolicDataValue.SuffixValue sp = g.getParameter(); Valuation newVal = new Valuation(); newVal.putAll(val); - Expression x = g.toExpr(); + Expression x = SDTGuard.toExpr(g); Result res; - if (g instanceof EqualityGuard) { + if (g instanceof SDTGuard.EqualityGuard) { //System.out.println("SOLVING: " + x); res = solver.solve(x, newVal); } else { List> eList = new ArrayList<>(); // add the guard - eList.add(g.toExpr()); + eList.add(SDTGuard.toExpr(g)); eList.addAll(instantiateGuard(g, val)); - if (g instanceof SDTOrGuard) { + if (g instanceof SDTGuard.SDTOrGuard og) { // for all registers, pick them up - for (SDTGuard subg : ((SDTOrGuard) g).getGuards()) { - if (!(subg instanceof EqualityGuard)) { + for (SDTGuard subg : og.disjuncts()) { + if (!(subg instanceof SDTGuard.EqualityGuard)) { eList.addAll(instantiateGuard(subg, val)); } } diff --git a/src/test/java/de/learnlib/ralib/dt/RegisterConsistencyTest.java b/src/test/java/de/learnlib/ralib/dt/RegisterConsistencyTest.java index cc2a9049..4ebb8175 100644 --- a/src/test/java/de/learnlib/ralib/dt/RegisterConsistencyTest.java +++ b/src/test/java/de/learnlib/ralib/dt/RegisterConsistencyTest.java @@ -1,8 +1,10 @@ package de.learnlib.ralib.dt; import java.math.BigDecimal; +import java.util.List; import java.util.Map; +import de.learnlib.ralib.theory.SDTGuard; import org.testng.Assert; import org.testng.annotations.Test; @@ -25,11 +27,6 @@ import de.learnlib.ralib.oracles.mto.SDT; import de.learnlib.ralib.oracles.mto.SDTLeaf; import de.learnlib.ralib.oracles.mto.SymbolicSuffixRestrictionBuilder; -import de.learnlib.ralib.theory.SDTAndGuard; -import de.learnlib.ralib.theory.SDTOrGuard; -import de.learnlib.ralib.theory.SDTTrueGuard; -import de.learnlib.ralib.theory.equality.DisequalityGuard; -import de.learnlib.ralib.theory.equality.EqualityGuard; import de.learnlib.ralib.words.InputSymbol; import de.learnlib.ralib.words.PSymbolInstance; import de.learnlib.ralib.words.ParameterizedSymbol; @@ -142,14 +139,14 @@ public void testSymmetry() { SDT sdtEps = SDTLeaf.ACCEPTING; SDT sdtPrefix = new SDT(Map.of( - new SDTOrGuard(s1, new EqualityGuard(s1, r1), new EqualityGuard(s1, r2)), SDTLeaf.ACCEPTING, - new SDTAndGuard(s1, new DisequalityGuard(s1, r1), new DisequalityGuard(s1, r2)), SDTLeaf.REJECTING)); + new SDTGuard.SDTOrGuard(s1, List.of(new SDTGuard.EqualityGuard(s1, r1), new SDTGuard.EqualityGuard(s1, r2))), SDTLeaf.ACCEPTING, + new SDTGuard.SDTAndGuard(s1, List.of(new SDTGuard.DisequalityGuard(s1, r1), new SDTGuard.DisequalityGuard(s1, r2))), SDTLeaf.REJECTING)); SDT sdtWord = new SDT(Map.of( - new EqualityGuard(s1, r1), new SDT(Map.of( - new EqualityGuard(s2, r2), SDTLeaf.ACCEPTING, - new DisequalityGuard(s2, r2), SDTLeaf.REJECTING)), - new DisequalityGuard(s1, r1), new SDT(Map.of( - new SDTTrueGuard(s2), SDTLeaf.REJECTING)))); + new SDTGuard.EqualityGuard(s1, r1), new SDT(Map.of( + new SDTGuard.EqualityGuard(s2, r2), SDTLeaf.ACCEPTING, + new SDTGuard.DisequalityGuard(s2, r2), SDTLeaf.REJECTING)), + new SDTGuard.DisequalityGuard(s1, r1), new SDT(Map.of( + new SDTGuard.SDTTrueGuard(s2), SDTLeaf.REJECTING)))); TreeQueryResult tqrEps = new TreeQueryResult(new PIV(), sdtEps); TreeQueryResult tqrPrefix = new TreeQueryResult(pivPrefix, sdtPrefix); diff --git a/src/test/java/de/learnlib/ralib/oracles/mto/OptimizedSymbolicSuffixBuilderTest.java b/src/test/java/de/learnlib/ralib/oracles/mto/OptimizedSymbolicSuffixBuilderTest.java index 8383092a..130d1e80 100644 --- a/src/test/java/de/learnlib/ralib/oracles/mto/OptimizedSymbolicSuffixBuilderTest.java +++ b/src/test/java/de/learnlib/ralib/oracles/mto/OptimizedSymbolicSuffixBuilderTest.java @@ -36,16 +36,11 @@ import de.learnlib.ralib.oracles.TreeQueryResult; import de.learnlib.ralib.smt.ConstraintSolver; import de.learnlib.ralib.theory.FreshSuffixValue; -import de.learnlib.ralib.theory.SDTAndGuard; import de.learnlib.ralib.theory.SDTGuard; -import de.learnlib.ralib.theory.SDTOrGuard; -import de.learnlib.ralib.theory.SDTTrueGuard; import de.learnlib.ralib.theory.SuffixValueRestriction; import de.learnlib.ralib.theory.Theory; import de.learnlib.ralib.theory.UnrestrictedSuffixValue; -import de.learnlib.ralib.theory.equality.DisequalityGuard; import de.learnlib.ralib.theory.equality.EqualRestriction; -import de.learnlib.ralib.theory.equality.EqualityGuard; import de.learnlib.ralib.tools.theories.IntegerEqualityTheory; import de.learnlib.ralib.words.InputSymbol; import de.learnlib.ralib.words.PSymbolInstance; @@ -176,46 +171,46 @@ public void extendDistinguishingSuffixTest() { SymbolicSuffix suffix8 = new SymbolicSuffix(word8a.prefix(2), word8a.suffix(1), restrictionBuilder); SDT sdt1 = new SDT(Map.of( - new EqualityGuard(s1, r1), new SDT(Map.of( - new EqualityGuard(s2, r2), SDTLeaf.ACCEPTING, - new DisequalityGuard(s2, r2), SDTLeaf.REJECTING)), - new DisequalityGuard(s1, r1), new SDT(Map.of( - new SDTTrueGuard(s2), SDTLeaf.REJECTING)))); + new SDTGuard.EqualityGuard(s1, r1), new SDT(Map.of( + new SDTGuard.EqualityGuard(s2, r2), SDTLeaf.ACCEPTING, + new SDTGuard.DisequalityGuard(s2, r2), SDTLeaf.REJECTING)), + new SDTGuard.DisequalityGuard(s1, r1), new SDT(Map.of( + new SDTGuard.SDTTrueGuard(s2), SDTLeaf.REJECTING)))); SDT sdt2 = new SDT(Map.of( - new SDTOrGuard(s1, new EqualityGuard(s1, r1), new EqualityGuard(s1, r2)), new SDT(Map.of( - new SDTTrueGuard(s2), SDTLeaf.ACCEPTING)), - new SDTAndGuard(s1, new DisequalityGuard(s1, r1), new DisequalityGuard(s1, r2)), new SDT(Map.of( - new SDTTrueGuard(s2), SDTLeaf.REJECTING)))); + new SDTGuard.SDTOrGuard(s1, List.of(new SDTGuard.EqualityGuard(s1, r1), new SDTGuard.EqualityGuard(s1, r2))), new SDT(Map.of( + new SDTGuard.SDTTrueGuard(s2), SDTLeaf.ACCEPTING)), + new SDTGuard.SDTAndGuard(s1, List.of(new SDTGuard.DisequalityGuard(s1, r1), new SDTGuard.DisequalityGuard(s1, r2))), new SDT(Map.of( + new SDTGuard.SDTTrueGuard(s2), SDTLeaf.REJECTING)))); SDT sdt3 = new SDT(Map.of( - new EqualityGuard(s1, r1), new SDT(Map.of( - new EqualityGuard(s2, c1), SDTLeaf.ACCEPTING, - new DisequalityGuard(s2, c1), SDTLeaf.REJECTING)), - new DisequalityGuard(s1, r1), new SDT(Map.of( - new SDTTrueGuard(s2), SDTLeaf.REJECTING)))); + new SDTGuard.EqualityGuard(s1, r1), new SDT(Map.of( + new SDTGuard.EqualityGuard(s2, c1), SDTLeaf.ACCEPTING, + new SDTGuard.DisequalityGuard(s2, c1), SDTLeaf.REJECTING)), + new SDTGuard.DisequalityGuard(s1, r1), new SDT(Map.of( + new SDTGuard.SDTTrueGuard(s2), SDTLeaf.REJECTING)))); SDT sdt4 = new SDT(Map.of( - new SDTTrueGuard(s1), new SDT(Map.of( - new EqualityGuard(s2, s1), new SDT(Map.of( - new EqualityGuard(s3, r1), new SDT(Map.of( - new EqualityGuard(s4, r1), SDTLeaf.ACCEPTING, - new DisequalityGuard(s4, r1), SDTLeaf.REJECTING)), - new DisequalityGuard(s3, r1), new SDT(Map.of( - new SDTTrueGuard(s4), SDTLeaf.REJECTING)))), - new DisequalityGuard(s2, s1), new SDT(Map.of( - new SDTTrueGuard(s3), new SDT(Map.of( - new SDTTrueGuard(s4), SDTLeaf.REJECTING)))))))); + new SDTGuard.SDTTrueGuard(s1), new SDT(Map.of( + new SDTGuard.EqualityGuard(s2, s1), new SDT(Map.of( + new SDTGuard.EqualityGuard(s3, r1), new SDT(Map.of( + new SDTGuard.EqualityGuard(s4, r1), SDTLeaf.ACCEPTING, + new SDTGuard.DisequalityGuard(s4, r1), SDTLeaf.REJECTING)), + new SDTGuard.DisequalityGuard(s3, r1), new SDT(Map.of( + new SDTGuard.SDTTrueGuard(s4), SDTLeaf.REJECTING)))), + new SDTGuard.DisequalityGuard(s2, s1), new SDT(Map.of( + new SDTGuard.SDTTrueGuard(s3), new SDT(Map.of( + new SDTGuard.SDTTrueGuard(s4), SDTLeaf.REJECTING)))))))); SDT sdt5 = new SDT(Map.of( - new SDTTrueGuard(s1), new SDT(Map.of( - new EqualityGuard(s2, s1), new SDT(Map.of( - new EqualityGuard(s3, r1), new SDT(Map.of( - new SDTTrueGuard(s4), SDTLeaf.REJECTING)), - new DisequalityGuard(s3, r1), new SDT(Map.of( - new EqualityGuard(s4, s3), SDTLeaf.ACCEPTING, - new DisequalityGuard(s4, s3), SDTLeaf.REJECTING)))))))); + new SDTGuard.SDTTrueGuard(s1), new SDT(Map.of( + new SDTGuard.EqualityGuard(s2, s1), new SDT(Map.of( + new SDTGuard.EqualityGuard(s3, r1), new SDT(Map.of( + new SDTGuard.SDTTrueGuard(s4), SDTLeaf.REJECTING)), + new SDTGuard.DisequalityGuard(s3, r1), new SDT(Map.of( + new SDTGuard.EqualityGuard(s4, s3), SDTLeaf.ACCEPTING, + new SDTGuard.DisequalityGuard(s4, s3), SDTLeaf.REJECTING)))))))); SDT sdt6 = new SDT(Map.of( - new EqualityGuard(s1, r1), SDTLeaf.ACCEPTING, - new DisequalityGuard(s1, r1), SDTLeaf.REJECTING)); + new SDTGuard.EqualityGuard(s1, r1), SDTLeaf.ACCEPTING, + new SDTGuard.DisequalityGuard(s1, r1), SDTLeaf.REJECTING)); SDT sdt7 = new SDT(Map.of( - new SDTTrueGuard(s1), SDTLeaf.REJECTING)); + new SDTGuard.SDTTrueGuard(s1), SDTLeaf.REJECTING)); SymbolicSuffix expected1 = new SymbolicSuffix(word1.prefix(1), word1.suffix(2), restrictionBuilder); SymbolicSuffix actual1 = builder.extendSuffix(word1.prefix(2), sdt1, piv1, suffix1); @@ -352,21 +347,21 @@ public void extendSuffixTest() { SymbolicSuffix suffix4 = new SymbolicSuffix(word4.prefix(2), word4.suffix(1), restrictionBuilder2); List sdtPath1 = new ArrayList<>(); - sdtPath1.add(new EqualityGuard(s1, r1)); - sdtPath1.add(new EqualityGuard(s2, r2)); - sdtPath1.add(new EqualityGuard(s3, r3)); - sdtPath1.add(new EqualityGuard(s4, s1)); - sdtPath1.add(new EqualityGuard(s5, s3)); + sdtPath1.add(new SDTGuard.EqualityGuard(s1, r1)); + sdtPath1.add(new SDTGuard.EqualityGuard(s2, r2)); + sdtPath1.add(new SDTGuard.EqualityGuard(s3, r3)); + sdtPath1.add(new SDTGuard.EqualityGuard(s4, s1)); + sdtPath1.add(new SDTGuard.EqualityGuard(s5, s3)); List sdtPath2 = new ArrayList<>(); - sdtPath2.add(new DisequalityGuard(s1, r1)); - sdtPath2.add(new DisequalityGuard(s2, r2)); - sdtPath2.add(new DisequalityGuard(s3, r3)); - sdtPath2.add(new DisequalityGuard(s4, s1)); - sdtPath2.add(new DisequalityGuard(s5, s3)); + sdtPath2.add(new SDTGuard.DisequalityGuard(s1, r1)); + sdtPath2.add(new SDTGuard.DisequalityGuard(s2, r2)); + sdtPath2.add(new SDTGuard.DisequalityGuard(s3, r3)); + sdtPath2.add(new SDTGuard.DisequalityGuard(s4, s1)); + sdtPath2.add(new SDTGuard.DisequalityGuard(s5, s3)); List sdtPath3 = new ArrayList<>(); - sdtPath3.add(new EqualityGuard(s1, c1)); - sdtPath3.add(new DisequalityGuard(s2, c2)); - sdtPath3.add(new SDTTrueGuard(s3)); + sdtPath3.add(new SDTGuard.EqualityGuard(s1, c1)); + sdtPath3.add(new SDTGuard.DisequalityGuard(s2, c2)); + sdtPath3.add(new SDTGuard.SDTTrueGuard(s3)); List> sdtPaths4 = SDTLeaf.ACCEPTING.getPaths(true); List sdtPath4 = sdtPaths4.get(0); @@ -423,21 +418,21 @@ public void buildOptimizedSuffixTest() { new PSymbolInstance(a, new DataValue(type, BigDecimal.ONE))); SDT sdt1 = new SDT(Map.of( - new EqualityGuard(s1, r1), new SDT(Map.of( - new SDTTrueGuard(s2), new SDT(Map.of( - new EqualityGuard(s3, s2), SDTLeaf.ACCEPTING, - new DisequalityGuard(s3, s2), SDTLeaf.REJECTING + new SDTGuard.EqualityGuard(s1, r1), new SDT(Map.of( + new SDTGuard.SDTTrueGuard(s2), new SDT(Map.of( + new SDTGuard.EqualityGuard(s3, s2), SDTLeaf.ACCEPTING, + new SDTGuard.DisequalityGuard(s3, s2), SDTLeaf.REJECTING )))), - new DisequalityGuard(s1, r1), new SDT(Map.of( - new SDTTrueGuard(s2), new SDT(Map.of( - new SDTTrueGuard(s3), SDTLeaf.ACCEPTING)))))); + new SDTGuard.DisequalityGuard(s1, r1), new SDT(Map.of( + new SDTGuard.SDTTrueGuard(s2), new SDT(Map.of( + new SDTGuard.SDTTrueGuard(s3), SDTLeaf.ACCEPTING)))))); SDT sdt2 = new SDT(Map.of( - new EqualityGuard(s1, r1), new SDT(Map.of( - new SDTTrueGuard(s2), new SDT(Map.of( - new SDTTrueGuard(s3), SDTLeaf.ACCEPTING)))), - new DisequalityGuard(s1, r1), new SDT(Map.of( - new SDTTrueGuard(s2), new SDT(Map.of( - new SDTTrueGuard(s3), SDTLeaf.ACCEPTING)))))); + new SDTGuard.EqualityGuard(s1, r1), new SDT(Map.of( + new SDTGuard.SDTTrueGuard(s2), new SDT(Map.of( + new SDTGuard.SDTTrueGuard(s3), SDTLeaf.ACCEPTING)))), + new SDTGuard.DisequalityGuard(s1, r1), new SDT(Map.of( + new SDTGuard.SDTTrueGuard(s2), new SDT(Map.of( + new SDTGuard.SDTTrueGuard(s3), SDTLeaf.ACCEPTING)))))); PIV piv1 = new PIV(); piv1.put(p1, r1); @@ -459,24 +454,24 @@ public void buildOptimizedSuffixTest() { Word prefix3 = prefix1; Word prefix4 = prefix2; SDT sdt3 = new SDT(Map.of( - new EqualityGuard(s1, r1), new SDT(Map.of( - new SDTTrueGuard(s2), new SDT(Map.of( - new EqualityGuard(s3, s2), SDTLeaf.ACCEPTING, - new DisequalityGuard(s3, s2), SDTLeaf.REJECTING)))), - new DisequalityGuard(s1, r1), new SDT(Map.of( - new SDTTrueGuard(s2), new SDT(Map.of( - new SDTTrueGuard(s3), SDTLeaf.REJECTING)))))); + new SDTGuard.EqualityGuard(s1, r1), new SDT(Map.of( + new SDTGuard.SDTTrueGuard(s2), new SDT(Map.of( + new SDTGuard.EqualityGuard(s3, s2), SDTLeaf.ACCEPTING, + new SDTGuard.DisequalityGuard(s3, s2), SDTLeaf.REJECTING)))), + new SDTGuard.DisequalityGuard(s1, r1), new SDT(Map.of( + new SDTGuard.SDTTrueGuard(s2), new SDT(Map.of( + new SDTGuard.SDTTrueGuard(s3), SDTLeaf.REJECTING)))))); SDT sdt4 = new SDT(Map.of( - new EqualityGuard(s1, r1), new SDT(Map.of( - new EqualityGuard(s2, r2), new SDT(Map.of( - new EqualityGuard(s3, s2), SDTLeaf.ACCEPTING)), - new DisequalityGuard(s2, r2), new SDT(Map.of( - new EqualityGuard(s3, s2), SDTLeaf.REJECTING)))), - new DisequalityGuard(s1, r1), new SDT(Map.of( - new SDTTrueGuard(s2), new SDT(Map.of( - new SDTTrueGuard(s3), SDTLeaf.REJECTING)))))); + new SDTGuard.EqualityGuard(s1, r1), new SDT(Map.of( + new SDTGuard.EqualityGuard(s2, r2), new SDT(Map.of( + new SDTGuard.EqualityGuard(s3, s2), SDTLeaf.ACCEPTING)), + new SDTGuard.DisequalityGuard(s2, r2), new SDT(Map.of( + new SDTGuard.EqualityGuard(s3, s2), SDTLeaf.REJECTING)))), + new SDTGuard.DisequalityGuard(s1, r1), new SDT(Map.of( + new SDTGuard.SDTTrueGuard(s2), new SDT(Map.of( + new SDTGuard.SDTTrueGuard(s3), SDTLeaf.REJECTING)))))); PIV piv3 = new PIV(); piv3.put(p1, r1); @@ -532,11 +527,11 @@ public void extendSuffixRevealingRegistersTest() { SymbolicSuffix suffix1 = new SymbolicSuffix(word1.prefix(2), word1.suffix(2), restrictionBuilder); SymbolicSuffix expectedSuffix1 = new SymbolicSuffix(word1.prefix(1), word1.suffix(3), restrictionBuilder); SDT sdt1 = new SDT(Map.of( - new EqualityGuard(s1, r2), new SDT(Map.of( - new SDTTrueGuard(s2), SDTLeaf.ACCEPTING)), - new DisequalityGuard(s1, r2), new SDT(Map.of( - new EqualityGuard(s2, r1), SDTLeaf.REJECTING, - new DisequalityGuard(s2, r1), SDTLeaf.ACCEPTING)))); + new SDTGuard.EqualityGuard(s1, r2), new SDT(Map.of( + new SDTGuard.SDTTrueGuard(s2), SDTLeaf.ACCEPTING)), + new SDTGuard.DisequalityGuard(s1, r2), new SDT(Map.of( + new SDTGuard.EqualityGuard(s2, r1), SDTLeaf.REJECTING, + new SDTGuard.DisequalityGuard(s2, r1), SDTLeaf.ACCEPTING)))); PIV piv1 = new PIV(); piv1.put(p1, r1); piv1.put(p2, r2); @@ -553,12 +548,12 @@ public void extendSuffixRevealingRegistersTest() { SymbolicSuffix suffix2 = new SymbolicSuffix(word2.prefix(3), word2.suffix(2), restrictionBuilder); SymbolicSuffix expectedSuffix2 = new SymbolicSuffix(word2.prefix(2), word2.suffix(3), restrictionBuilder); SDT sdt2 = new SDT(Map.of( - new EqualityGuard(s1, r2), new SDT(Map.of( - new EqualityGuard(s2, r1), SDTLeaf.ACCEPTING, - new DisequalityGuard(s2, r1), SDTLeaf.REJECTING)), - new DisequalityGuard(s1, r2), new SDT(Map.of( - new EqualityGuard(s2, r1), SDTLeaf.REJECTING, - new DisequalityGuard(s2, r1), SDTLeaf.ACCEPTING)))); + new SDTGuard.EqualityGuard(s1, r2), new SDT(Map.of( + new SDTGuard.EqualityGuard(s2, r1), SDTLeaf.ACCEPTING, + new SDTGuard.DisequalityGuard(s2, r1), SDTLeaf.REJECTING)), + new SDTGuard.DisequalityGuard(s1, r2), new SDT(Map.of( + new SDTGuard.EqualityGuard(s2, r1), SDTLeaf.REJECTING, + new SDTGuard.DisequalityGuard(s2, r1), SDTLeaf.ACCEPTING)))); PIV piv2 = new PIV(); piv2.putAll(piv1); SymbolicSuffix actualSuffix2 = builder.extendSuffix(word2.prefix(2), sdt2, piv2, suffix2, r1, r2); @@ -573,12 +568,12 @@ public void extendSuffixRevealingRegistersTest() { SymbolicSuffix suffix3 = new SymbolicSuffix(word3.prefix(2), word3.suffix(2), restrictionBuilder); SymbolicSuffix expectedSuffix3 = new SymbolicSuffix(word3.prefix(1), word3.suffix(3), restrictionBuilder); SDT sdt3 = new SDT(Map.of( - new EqualityGuard(s1, r1), new SDT(Map.of( - new EqualityGuard(s2, r2), SDTLeaf.ACCEPTING, - new DisequalityGuard(s2, r2), SDTLeaf.REJECTING)), - new DisequalityGuard(s1, r1), new SDT(Map.of( - new EqualityGuard(s2, r3), SDTLeaf.ACCEPTING, - new DisequalityGuard(s2, r3), SDTLeaf.REJECTING)))); + new SDTGuard.EqualityGuard(s1, r1), new SDT(Map.of( + new SDTGuard.EqualityGuard(s2, r2), SDTLeaf.ACCEPTING, + new SDTGuard.DisequalityGuard(s2, r2), SDTLeaf.REJECTING)), + new SDTGuard.DisequalityGuard(s1, r1), new SDT(Map.of( + new SDTGuard.EqualityGuard(s2, r3), SDTLeaf.ACCEPTING, + new SDTGuard.DisequalityGuard(s2, r3), SDTLeaf.REJECTING)))); PIV piv3 = new PIV(); piv3.put(p1, r1); piv3.put(p2, r2); @@ -618,58 +613,58 @@ private void sdtPruneTest() { OptimizedSymbolicSuffixBuilder builder = new OptimizedSymbolicSuffixBuilder(consts, restrictionBuilder); SDT subSDT1 = new SDT(Map.of( - new EqualityGuard(s2, r1), new SDT(Map.of( - new SDTTrueGuard(s3), SDTLeaf.ACCEPTING)), - new DisequalityGuard(s2, r1), new SDT(Map.of( - new EqualityGuard(s3, r1), SDTLeaf.ACCEPTING, - new DisequalityGuard(s3, r1), SDTLeaf.REJECTING)))); + new SDTGuard.EqualityGuard(s2, r1), new SDT(Map.of( + new SDTGuard.SDTTrueGuard(s3), SDTLeaf.ACCEPTING)), + new SDTGuard.DisequalityGuard(s2, r1), new SDT(Map.of( + new SDTGuard.EqualityGuard(s3, r1), SDTLeaf.ACCEPTING, + new SDTGuard.DisequalityGuard(s3, r1), SDTLeaf.REJECTING)))); SDT subSDT2 = new SDT(Map.of( - new SDTTrueGuard(s2), new SDT(Map.of( - new EqualityGuard(s3, r1), SDTLeaf.ACCEPTING, - new DisequalityGuard(s3, r1), SDTLeaf.REJECTING)))); + new SDTGuard.SDTTrueGuard(s2), new SDT(Map.of( + new SDTGuard.EqualityGuard(s3, r1), SDTLeaf.ACCEPTING, + new SDTGuard.DisequalityGuard(s3, r1), SDTLeaf.REJECTING)))); SDT subSDT3 = new SDT(Map.of( - new SDTTrueGuard(s2), new SDT(Map.of( - new SDTTrueGuard(s3), SDTLeaf.REJECTING)))); + new SDTGuard.SDTTrueGuard(s2), new SDT(Map.of( + new SDTGuard.SDTTrueGuard(s3), SDTLeaf.REJECTING)))); SDT sdt1 = new SDT(Map.of( - new EqualityGuard(s1, r2), subSDT1, - new DisequalityGuard(s1, r2), subSDT2)); + new SDTGuard.EqualityGuard(s1, r2), subSDT1, + new SDTGuard.DisequalityGuard(s1, r2), subSDT2)); SDT sdt2 = new SDT(Map.of( - new EqualityGuard(s1, r2), subSDT1, - new DisequalityGuard(s1, r2), subSDT3)); + new SDTGuard.EqualityGuard(s1, r2), subSDT1, + new SDTGuard.DisequalityGuard(s1, r2), subSDT3)); Map branches2 = new LinkedHashMap<>(); for (Map.Entry e : sdt2.getChildren().entrySet()) { - if (e.getKey() instanceof EqualityGuard) + if (e.getKey() instanceof SDTGuard.EqualityGuard) branches2.put(e.getKey(), e.getValue()); } SDT sdt3 = new SDT(Map.of( - new EqualityGuard(s1, r1), new SDT(Map.of( - new EqualityGuard(s2, r1), new SDT(Map.of( - new EqualityGuard(s3, r2), SDTLeaf.ACCEPTING, - new DisequalityGuard(s3, r2), SDTLeaf.REJECTING)), - new DisequalityGuard(s2, r1), new SDT(Map.of( - new SDTTrueGuard(s3), SDTLeaf.REJECTING)))), - new DisequalityGuard(s1, r1), new SDT(Map.of( - new EqualityGuard(s2, r1), new SDT(Map.of( - new EqualityGuard(s3, r2), SDTLeaf.REJECTING, - new DisequalityGuard(s3, r2), SDTLeaf.ACCEPTING)), - new DisequalityGuard(s2, r1), new SDT(Map.of( - new SDTTrueGuard(s3), SDTLeaf.REJECTING)))))); + new SDTGuard.EqualityGuard(s1, r1), new SDT(Map.of( + new SDTGuard.EqualityGuard(s2, r1), new SDT(Map.of( + new SDTGuard.EqualityGuard(s3, r2), SDTLeaf.ACCEPTING, + new SDTGuard.DisequalityGuard(s3, r2), SDTLeaf.REJECTING)), + new SDTGuard.DisequalityGuard(s2, r1), new SDT(Map.of( + new SDTGuard.SDTTrueGuard(s3), SDTLeaf.REJECTING)))), + new SDTGuard.DisequalityGuard(s1, r1), new SDT(Map.of( + new SDTGuard.EqualityGuard(s2, r1), new SDT(Map.of( + new SDTGuard.EqualityGuard(s3, r2), SDTLeaf.REJECTING, + new SDTGuard.DisequalityGuard(s3, r2), SDTLeaf.ACCEPTING)), + new SDTGuard.DisequalityGuard(s2, r1), new SDT(Map.of( + new SDTGuard.SDTTrueGuard(s3), SDTLeaf.REJECTING)))))); SDT expected1 = sdt1; SDT expected2 = new SDT(branches2); SDT expected3 = new SDT(Map.of( - new EqualityGuard(s1, r1), new SDT(Map.of( - new EqualityGuard(s2, r1), new SDT(Map.of( - new EqualityGuard(s3, r2), SDTLeaf.ACCEPTING)), - new DisequalityGuard(s2, r1), new SDT(Map.of( - new SDTTrueGuard(s3), SDTLeaf.REJECTING)))), - new DisequalityGuard(s1, r1), new SDT(Map.of( - new EqualityGuard(s2, r1), new SDT(Map.of( - new DisequalityGuard(s3, r2), SDTLeaf.ACCEPTING)), - new DisequalityGuard(s2, r1), new SDT(Map.of( - new SDTTrueGuard(s3), SDTLeaf.REJECTING)))))); + new SDTGuard.EqualityGuard(s1, r1), new SDT(Map.of( + new SDTGuard.EqualityGuard(s2, r1), new SDT(Map.of( + new SDTGuard.EqualityGuard(s3, r2), SDTLeaf.ACCEPTING)), + new SDTGuard.DisequalityGuard(s2, r1), new SDT(Map.of( + new SDTGuard.SDTTrueGuard(s3), SDTLeaf.REJECTING)))), + new SDTGuard.DisequalityGuard(s1, r1), new SDT(Map.of( + new SDTGuard.EqualityGuard(s2, r1), new SDT(Map.of( + new SDTGuard.DisequalityGuard(s3, r2), SDTLeaf.ACCEPTING)), + new SDTGuard.DisequalityGuard(s2, r1), new SDT(Map.of( + new SDTGuard.SDTTrueGuard(s3), SDTLeaf.REJECTING)))))); SDT actual1 = builder.pruneSDT(sdt1, new SymbolicDataValue[] {r1}); SDT actual2 = builder.pruneSDT(sdt2, new SymbolicDataValue[] {r1}); diff --git a/src/test/java/de/learnlib/ralib/theory/EquivalenceClassCoverageTest.java b/src/test/java/de/learnlib/ralib/theory/EquivalenceClassCoverageTest.java index f41e8788..74ca020f 100644 --- a/src/test/java/de/learnlib/ralib/theory/EquivalenceClassCoverageTest.java +++ b/src/test/java/de/learnlib/ralib/theory/EquivalenceClassCoverageTest.java @@ -19,7 +19,6 @@ import de.learnlib.ralib.learning.SymbolicSuffix; import de.learnlib.ralib.oracles.mto.MultiTheoryTreeOracle; import de.learnlib.ralib.smt.ConstraintSolver; -import de.learnlib.ralib.theory.inequality.IntervalGuard; import de.learnlib.ralib.tools.theories.DoubleInequalityTheory; import de.learnlib.ralib.tools.theories.IntegerEqualityTheory; import de.learnlib.ralib.words.InputSymbol; @@ -344,7 +343,7 @@ private static DataValue generateDecimal(DataValue d1, DataValue d2, DoubleInequ SuffixValue s1 = sgen.next(t); SuffixValue s2 = sgen.next(t); SuffixValue s3 = sgen.next(t); - SDTGuard ig = new IntervalGuard(s3, s1, s2); + SDTGuard ig = new SDTGuard.IntervalGuard(s3, s1, s2); Valuation vals1 = new Valuation(); vals1.setValue(s1, d1.getValue()); vals1.setValue(s2, d2.getValue()); From 573a850422a9876aa803848909c0db279a8b06d8 Mon Sep 17 00:00:00 2001 From: Falk Howar Date: Tue, 25 Feb 2025 23:10:40 +0100 Subject: [PATCH 09/26] increase java version --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index f53bbba1..13c69926 100644 --- a/pom.xml +++ b/pom.xml @@ -123,8 +123,8 @@ org.apache.maven.plugins maven-compiler-plugin - 16 - 16 + 21 + 21 From 9a843826dff35c95bb4a936bae013d339c0b6296 Mon Sep 17 00:00:00 2001 From: Falk Howar Date: Tue, 25 Feb 2025 23:18:59 +0100 Subject: [PATCH 10/26] spotless --- .../ralib/oracles/mto/OptimizedSymbolicSuffixBuilder.java | 1 - src/main/java/de/learnlib/ralib/theory/SDTGuardUtil.java | 1 - .../java/de/learnlib/ralib/theory/equality/EqualityTheory.java | 2 +- src/test/java/de/learnlib/ralib/dt/RegisterConsistencyTest.java | 2 +- 4 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/main/java/de/learnlib/ralib/oracles/mto/OptimizedSymbolicSuffixBuilder.java b/src/main/java/de/learnlib/ralib/oracles/mto/OptimizedSymbolicSuffixBuilder.java index 08fe1329..d9f4d9c3 100644 --- a/src/main/java/de/learnlib/ralib/oracles/mto/OptimizedSymbolicSuffixBuilder.java +++ b/src/main/java/de/learnlib/ralib/oracles/mto/OptimizedSymbolicSuffixBuilder.java @@ -22,7 +22,6 @@ import de.learnlib.ralib.learning.SymbolicSuffix; import de.learnlib.ralib.smt.ConstraintSolver; import de.learnlib.ralib.theory.SDTGuard; -import de.learnlib.ralib.theory.SDTGuardUtil; import de.learnlib.ralib.theory.SuffixValueRestriction; import de.learnlib.ralib.theory.UnrestrictedSuffixValue; import de.learnlib.ralib.words.DataWords; diff --git a/src/main/java/de/learnlib/ralib/theory/SDTGuardUtil.java b/src/main/java/de/learnlib/ralib/theory/SDTGuardUtil.java index 5179e1f2..f1a875ae 100644 --- a/src/main/java/de/learnlib/ralib/theory/SDTGuardUtil.java +++ b/src/main/java/de/learnlib/ralib/theory/SDTGuardUtil.java @@ -3,7 +3,6 @@ import java.util.*; import de.learnlib.ralib.data.SymbolicDataValue; -import de.learnlib.ralib.data.VarMapping; public class SDTGuardUtil { diff --git a/src/main/java/de/learnlib/ralib/theory/equality/EqualityTheory.java b/src/main/java/de/learnlib/ralib/theory/equality/EqualityTheory.java index cdf8f678..3cfe8299 100644 --- a/src/main/java/de/learnlib/ralib/theory/equality/EqualityTheory.java +++ b/src/main/java/de/learnlib/ralib/theory/equality/EqualityTheory.java @@ -28,7 +28,6 @@ import java.util.Map; import java.util.Set; -import de.learnlib.ralib.theory.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -50,6 +49,7 @@ import de.learnlib.ralib.oracles.mto.SDT; import de.learnlib.ralib.oracles.mto.SDTConstructor; import de.learnlib.ralib.oracles.mto.SDTLeaf; +import de.learnlib.ralib.theory.*; import de.learnlib.ralib.words.DataWords; import de.learnlib.ralib.words.OutputSymbol; import de.learnlib.ralib.words.PSymbolInstance; diff --git a/src/test/java/de/learnlib/ralib/dt/RegisterConsistencyTest.java b/src/test/java/de/learnlib/ralib/dt/RegisterConsistencyTest.java index 4ebb8175..6b15a2af 100644 --- a/src/test/java/de/learnlib/ralib/dt/RegisterConsistencyTest.java +++ b/src/test/java/de/learnlib/ralib/dt/RegisterConsistencyTest.java @@ -4,7 +4,6 @@ import java.util.List; import java.util.Map; -import de.learnlib.ralib.theory.SDTGuard; import org.testng.Assert; import org.testng.annotations.Test; @@ -27,6 +26,7 @@ import de.learnlib.ralib.oracles.mto.SDT; import de.learnlib.ralib.oracles.mto.SDTLeaf; import de.learnlib.ralib.oracles.mto.SymbolicSuffixRestrictionBuilder; +import de.learnlib.ralib.theory.SDTGuard; import de.learnlib.ralib.words.InputSymbol; import de.learnlib.ralib.words.PSymbolInstance; import de.learnlib.ralib.words.ParameterizedSymbol; From 951edfd874b1463717ae15002b27f4788a634d1a Mon Sep 17 00:00:00 2001 From: Falk Howar Date: Tue, 25 Feb 2025 23:31:25 +0100 Subject: [PATCH 11/26] Update ci.yml Update JDK version in CI to 21 --- .github/workflows/ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2925ff5b..6d9535a3 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -10,10 +10,10 @@ jobs: steps: - name: Checkout code uses: actions/checkout@v4 - - name: Set up JDK 17 + - name: Set up JDK 21 uses: actions/setup-java@v4 with: - java-version: '17' + java-version: '21' distribution: 'temurin' - name: Compile, check, and run tests run: mvn verify assembly:single From 2ed7ee16b3b2195d3c2222ac33e6b46fb4e398f8 Mon Sep 17 00:00:00 2001 From: Falk Howar Date: Wed, 26 Feb 2025 09:37:57 +0100 Subject: [PATCH 12/26] remove SymbolicDecisionTree interface --- .../ralib/ceanalysis/PrefixFinder.java | 5 +- src/main/java/de/learnlib/ralib/dt/DT.java | 4 +- .../java/de/learnlib/ralib/dt/DTLeaf.java | 36 +++++------ .../learning/CounterexampleAnalysis.java | 3 +- .../ralib/learning/MeasuringOracle.java | 7 ++- .../ralib/learning/SymbolicDecisionTree.java | 62 ------------------- .../ralib/learning/ralambda/RaLambda.java | 14 ++--- .../learnlib/ralib/learning/rastar/Cell.java | 8 +-- .../ralib/learning/rastar/Component.java | 6 +- .../learnlib/ralib/learning/rastar/Row.java | 8 +-- .../ralib/oracles/SDTLogicOracle.java | 12 ++-- .../de/learnlib/ralib/oracles/TreeOracle.java | 14 ++--- .../ralib/oracles/TreeQueryResult.java | 8 +-- .../ralib/oracles/mto/LabeledSDT.java | 2 + .../oracles/mto/MultiTheoryBranching.java | 2 + .../mto/MultiTheorySDTLogicOracle.java | 21 ++++--- .../oracles/mto/MultiTheoryTreeOracle.java | 24 +++---- .../mto/OptimizedSymbolicSuffixBuilder.java | 8 +-- .../ralib/oracles/mto/SDTConstructor.java | 1 + .../ralib/{oracles/mto => theory}/SDT.java | 39 +++++------- .../{oracles/mto => theory}/SDTLeaf.java | 13 ++-- .../java/de/learnlib/ralib/theory/Theory.java | 1 - .../ralib/theory/equality/EqualityTheory.java | 4 +- .../theory/equality/UniqueEqualityTheory.java | 2 +- .../inequality/InequalityTheoryWithEq.java | 4 +- .../ralib/dt/RegisterConsistencyTest.java | 12 ++-- .../ralib/example/sdts/LoginExampleSDT.java | 9 ++- .../example/sdts/LoginExampleTreeOracle.java | 8 +-- .../ralib/learning/rastar/LoggingOracle.java | 8 +-- .../OptimizedSymbolicSuffixBuilderTest.java | 8 +-- .../oracles/mto/SecondSDTBranchingTest.java | 6 +- .../oracles/mto/UntypedBranchingTest.java | 4 +- .../ralib/theory/TestEqualityTheory.java | 3 +- .../learnlib/ralib/theory/TestIneqEqTree.java | 3 +- .../ralib/theory/TestIneqOutputTree.java | 3 +- .../theory/TestUniqueEqualityTheory.java | 3 +- 36 files changed, 153 insertions(+), 222 deletions(-) delete mode 100644 src/main/java/de/learnlib/ralib/learning/SymbolicDecisionTree.java rename src/main/java/de/learnlib/ralib/{oracles/mto => theory}/SDT.java (92%) rename src/main/java/de/learnlib/ralib/{oracles/mto => theory}/SDTLeaf.java (87%) diff --git a/src/main/java/de/learnlib/ralib/ceanalysis/PrefixFinder.java b/src/main/java/de/learnlib/ralib/ceanalysis/PrefixFinder.java index e76ad449..5382f0a5 100644 --- a/src/main/java/de/learnlib/ralib/ceanalysis/PrefixFinder.java +++ b/src/main/java/de/learnlib/ralib/ceanalysis/PrefixFinder.java @@ -5,6 +5,7 @@ import java.util.Map; import java.util.Set; +import de.learnlib.ralib.theory.SDT; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -233,8 +234,8 @@ private void storeCandidateCEs(Word ce, int idx) { } private SymbolicWord candidate(Word prefix, - SymbolicSuffix symSuffix, SymbolicDecisionTree sdtSul, PIV pivSul, - SymbolicDecisionTree sdtHyp, PIV pivHyp, Word ce) { + SymbolicSuffix symSuffix, SDT sdtSul, PIV pivSul, + SDT sdtHyp, PIV pivHyp, Word ce) { Word candidate = null; Expression expr = sdtOracle.getCEGuard(prefix, sdtSul, pivSul, sdtHyp, pivHyp); diff --git a/src/main/java/de/learnlib/ralib/dt/DT.java b/src/main/java/de/learnlib/ralib/dt/DT.java index 653785fb..318c2be3 100644 --- a/src/main/java/de/learnlib/ralib/dt/DT.java +++ b/src/main/java/de/learnlib/ralib/dt/DT.java @@ -26,8 +26,8 @@ import de.learnlib.ralib.oracles.TreeOracle; import de.learnlib.ralib.oracles.TreeQueryResult; import de.learnlib.ralib.oracles.mto.OptimizedSymbolicSuffixBuilder; -import de.learnlib.ralib.oracles.mto.SDT; -import de.learnlib.ralib.oracles.mto.SDTLeaf; +import de.learnlib.ralib.theory.SDT; +import de.learnlib.ralib.theory.SDTLeaf; import de.learnlib.ralib.oracles.mto.SymbolicSuffixRestrictionBuilder; import de.learnlib.ralib.theory.SDTGuard; import de.learnlib.ralib.words.OutputSymbol; diff --git a/src/main/java/de/learnlib/ralib/dt/DTLeaf.java b/src/main/java/de/learnlib/ralib/dt/DTLeaf.java index 71c39cd0..21bc3903 100644 --- a/src/main/java/de/learnlib/ralib/dt/DTLeaf.java +++ b/src/main/java/de/learnlib/ralib/dt/DTLeaf.java @@ -29,7 +29,7 @@ import de.learnlib.ralib.data.util.PIVRemappingIterator; import de.learnlib.ralib.learning.LocationComponent; import de.learnlib.ralib.learning.PrefixContainer; -import de.learnlib.ralib.learning.SymbolicDecisionTree; +import de.learnlib.ralib.theory.SDT; import de.learnlib.ralib.learning.SymbolicSuffix; import de.learnlib.ralib.learning.ralambda.DiscriminationTree; import de.learnlib.ralib.learning.rastar.RaStar; @@ -38,7 +38,7 @@ import de.learnlib.ralib.oracles.TreeOracle; import de.learnlib.ralib.oracles.TreeQueryResult; import de.learnlib.ralib.oracles.mto.OptimizedSymbolicSuffixBuilder; -import de.learnlib.ralib.oracles.mto.SDT; +import de.learnlib.ralib.theory.SDT; import de.learnlib.ralib.words.DataWords; import de.learnlib.ralib.words.InputSymbol; import de.learnlib.ralib.words.PSymbolInstance; @@ -281,11 +281,11 @@ private Pair, Word> startPrefix(DT dt, Sh boolean input = DTLeaf.isInput(mp.getPrefix().lastSymbol().getBaseSymbol()); for (ParameterizedSymbol ps : dt.getInputs()) { - SymbolicDecisionTree[] sdtsP = this.getSDTsForInitialSymbol(mp, ps); + SDT[] sdtsP = this.getSDTsForInitialSymbol(mp, ps); Branching prefixBranching = oracle.getInitialBranching(mp.getPrefix(), ps, mp.getParsInVars(), sdtsP); mp.putBranching(ps, prefixBranching); - SymbolicDecisionTree[] sdtsAS = this.getSDTsForInitialSymbol(this.getPrimePrefix(), ps); + SDT[] sdtsAS = this.getSDTsForInitialSymbol(this.getPrimePrefix(), ps); Branching accessBranching = oracle.getInitialBranching(getAccessSequence(), ps, this.access.getParsInVars(), sdtsAS); @@ -360,7 +360,7 @@ void start(DT dt, boolean ioMode, ParameterizedSymbol... inputs) { boolean input = isInputComponent(); for (ParameterizedSymbol ps : inputs) { - SymbolicDecisionTree[] sdts = this.getSDTsForInitialSymbol(ps); + SDT[] sdts = this.getSDTsForInitialSymbol(ps); Branching b = oracle.getInitialBranching(getAccessSequence(), ps, access.getParsInVars(), sdts); branching.put(ps, b); for (Word prefix : b.getBranches().keySet()) { @@ -387,7 +387,7 @@ boolean updateBranching(DT dt) { private boolean updateBranching(ParameterizedSymbol ps, DiscriminationTree dt) { Branching b = branching.get(ps); - SymbolicDecisionTree[] sdts = getSDTsForInitialSymbol(ps); + SDT[] sdts = getSDTsForInitialSymbol(ps); Branching newB = oracle.updateBranching(access.getPrefix(), ps, b, access.getParsInVars(), sdts); boolean ret = true; @@ -408,7 +408,7 @@ private boolean updateBranching(ParameterizedSymbol ps, DiscriminationTree dt) { private boolean updateBranching(ParameterizedSymbol ps, ShortPrefix sp, DiscriminationTree dt) { Branching b = sp.getBranching(ps); - SymbolicDecisionTree[] sdts = getSDTsForInitialSymbol(sp, ps); + SDT[] sdts = getSDTsForInitialSymbol(sp, ps); Branching newB = oracle.updateBranching(sp.getPrefix(), ps, b, sp.getParsInVars(), sdts); boolean ret = true; @@ -422,22 +422,22 @@ private boolean updateBranching(ParameterizedSymbol ps, ShortPrefix sp, Discrimi return ret; } - private SymbolicDecisionTree[] getSDTsForInitialSymbol(ParameterizedSymbol p) { + private SDT[] getSDTsForInitialSymbol(ParameterizedSymbol p) { return getSDTsForInitialSymbol(this.getPrimePrefix(), p); } - private SymbolicDecisionTree[] getSDTsForInitialSymbol(MappedPrefix mp, ParameterizedSymbol p) { - List sdts = new ArrayList<>(); + private SDT[] getSDTsForInitialSymbol(MappedPrefix mp, ParameterizedSymbol p) { + List sdts = new ArrayList<>(); for (Entry e : mp.getTQRs().entrySet()) { Word acts = e.getKey().getActions(); if (acts.length() > 0 && acts.firstSymbol().equals(p)) { sdts.add(makeConsistent(e.getValue().getSdt(), e.getValue().getPiv(), mp.getParsInVars())); } } - return sdts.toArray(new SymbolicDecisionTree[] {}); + return sdts.toArray(new SDT[] {}); } - private SymbolicDecisionTree makeConsistent(SymbolicDecisionTree sdt, PIV piv, PIV memorable) { + private SDT makeConsistent(SDT sdt, PIV piv, PIV memorable) { VarMapping relabeling = new VarMapping(); for (Entry e : piv.entrySet()) { Register r = memorable.get(e.getKey()); @@ -486,11 +486,11 @@ private boolean checkVariableConsistency(MappedPrefix mp, DT dt, Constants const assert !suffixes.isEmpty(); for (SymbolicSuffix suffix : suffixes) { TreeQueryResult suffixTQR = mp.getTQRs().get(suffix); - SymbolicDecisionTree sdt = suffixTQR.getSdt(); + SDT sdt = suffixTQR.getSdt(); // suffixBuilder == null ==> suffix.isOptimizedGeneric() assert suffixBuilder != null || suffix.isOptimizationGeneric() : "Optimized with restriction builder, but no restriction builder provided"; SymbolicSuffix newSuffix = suffixBuilder != null && sdt instanceof SDT ? - suffixBuilder.extendSuffix(mp.getPrefix(), (SDT)sdt, suffixTQR.getPiv(), suffix, suffixTQR.getPiv().get(p)) : + suffixBuilder.extendSuffix(mp.getPrefix(), sdt, suffixTQR.getPiv(), suffix, suffixTQR.getPiv().get(p)) : new SymbolicSuffix(mp.getPrefix(), suffix, consts); if (prefixSuffixes.contains(newSuffix)) continue; @@ -556,9 +556,9 @@ public boolean checkRegisterConsistency(MappedPrefix mp, DT dt, Constants consts for (Map.Entry e : mp.getTQRs().entrySet()) { PIV piv = e.getValue().getPiv(); if (!Sets.intersection(piv.keySet(), paramsIntersect).isEmpty()) { - SymbolicDecisionTree sdt = e.getValue().getSdt(); + SDT sdt = e.getValue().getSdt(); SymbolicSuffix newSuffix = suffixBuilder != null && sdt instanceof SDT ? - suffixBuilder.extendSuffix(mp.getPrefix(), (SDT)sdt, piv, e.getKey()) : + suffixBuilder.extendSuffix(mp.getPrefix(), sdt, piv, e.getKey()) : new SymbolicSuffix(mp.getPrefix(), e.getKey(), consts); if (!prefixMapped.getTQRs().containsKey(newSuffix)) { dt.addSuffix(newSuffix, prefixLeaf); @@ -576,7 +576,7 @@ public boolean checkRegisterConsistency(MappedPrefix mp, DT dt, Constants consts if (!difference.isEmpty()) { // there are symmetric parameter mappings in the prefix which are not symmetric in mp for (Map.Entry e : mp.getTQRs().entrySet()) { - SymbolicDecisionTree sdt = e.getValue().getSdt(); + SDT sdt = e.getValue().getSdt(); for (VarMapping vm : difference) { VarMapping renaming = new VarMapping<>(); for (Map.Entry paramRenaming : vm.entrySet()) { @@ -586,7 +586,7 @@ public boolean checkRegisterConsistency(MappedPrefix mp, DT dt, Constants consts } if (!sdt.isEquivalent(sdt, renaming)) { SymbolicSuffix newSuffix = suffixBuilder != null && sdt instanceof SDT ? - suffixBuilder.extendSuffix(mp.getPrefix(), (SDT)sdt, e.getValue().getPiv(), e.getKey()) : + suffixBuilder.extendSuffix(mp.getPrefix(), sdt, e.getValue().getPiv(), e.getKey()) : new SymbolicSuffix(mp.getPrefix(), e.getKey(), consts); dt.addSuffix(newSuffix, prefixLeaf); return false; diff --git a/src/main/java/de/learnlib/ralib/learning/CounterexampleAnalysis.java b/src/main/java/de/learnlib/ralib/learning/CounterexampleAnalysis.java index 79188bcf..f16f5bdc 100644 --- a/src/main/java/de/learnlib/ralib/learning/CounterexampleAnalysis.java +++ b/src/main/java/de/learnlib/ralib/learning/CounterexampleAnalysis.java @@ -18,6 +18,7 @@ import java.util.Map; +import de.learnlib.ralib.theory.SDT; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -152,7 +153,7 @@ private IndexResult computeIndex(Word ce, int idx) { } private boolean hypRefinesTransitions(Word prefix, - ParameterizedSymbol action, SymbolicDecisionTree sdtSUL, PIV pivSUL) { + ParameterizedSymbol action, SDT sdtSUL, PIV pivSUL) { Branching branchSul = sulOracle.getInitialBranching(prefix, action, pivSUL, sdtSUL); LocationComponent c = components.get(prefix); diff --git a/src/main/java/de/learnlib/ralib/learning/MeasuringOracle.java b/src/main/java/de/learnlib/ralib/learning/MeasuringOracle.java index 1f318b39..56196c52 100644 --- a/src/main/java/de/learnlib/ralib/learning/MeasuringOracle.java +++ b/src/main/java/de/learnlib/ralib/learning/MeasuringOracle.java @@ -7,6 +7,7 @@ import de.learnlib.ralib.oracles.TreeOracle; import de.learnlib.ralib.oracles.TreeQueryResult; import de.learnlib.ralib.oracles.mto.SymbolicSuffixRestrictionBuilder; +import de.learnlib.ralib.theory.SDT; import de.learnlib.ralib.words.PSymbolInstance; import de.learnlib.ralib.words.ParameterizedSymbol; import net.automatalib.word.Word; @@ -35,19 +36,19 @@ public TreeQueryResult treeQuery(Word prefix, SymbolicSuffix su @Override public Branching getInitialBranching(Word prefix, ParameterizedSymbol ps, PIV piv, - SymbolicDecisionTree... sdts) { + SDT... sdts) { return oracle.getInitialBranching(prefix, ps, piv, sdts); } @Override public Branching updateBranching(Word prefix, ParameterizedSymbol ps, Branching current, PIV piv, - SymbolicDecisionTree... sdts) { + SDT... sdts) { return oracle.updateBranching(prefix, ps, current, piv, sdts); } @Override public Map, Boolean> instantiate(Word prefix, SymbolicSuffix suffix, - SymbolicDecisionTree sdt, PIV piv) { + SDT sdt, PIV piv) { return oracle.instantiate(prefix, suffix, sdt, piv); } diff --git a/src/main/java/de/learnlib/ralib/learning/SymbolicDecisionTree.java b/src/main/java/de/learnlib/ralib/learning/SymbolicDecisionTree.java deleted file mode 100644 index bd239c03..00000000 --- a/src/main/java/de/learnlib/ralib/learning/SymbolicDecisionTree.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright (C) 2014-2015 The LearnLib Contributors - * This file is part of LearnLib, http://www.learnlib.de/. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package de.learnlib.ralib.learning; - - -import de.learnlib.ralib.data.VarMapping; - -/** - * This interface describes the methods that are needed in a symbolic decision - * tree during learning. - * - * @author falk - */ -public interface SymbolicDecisionTree { - - /** - * checks if the tree (under renaming) is equivalent to other tree - * - * @param other - * @param renaming - * @return - */ - boolean isEquivalent(SymbolicDecisionTree other, VarMapping renaming); - - /** - * apply relabeling to tree and return a renamed tree. - * - * @param relabeling - * @return - */ - SymbolicDecisionTree relabel(VarMapping relabeling); - - - /** - * - * @return - */ - //public Set getRegisters(); - - /** - * true if all paths in this tree are accepting - * - * @return - */ - boolean isAccepting(); - - SymbolicDecisionTree copy(); -} diff --git a/src/main/java/de/learnlib/ralib/learning/ralambda/RaLambda.java b/src/main/java/de/learnlib/ralib/learning/ralambda/RaLambda.java index 2fb7b9a7..4ba4120e 100644 --- a/src/main/java/de/learnlib/ralib/learning/ralambda/RaLambda.java +++ b/src/main/java/de/learnlib/ralib/learning/ralambda/RaLambda.java @@ -34,7 +34,7 @@ import de.learnlib.ralib.learning.QueryStatistics; import de.learnlib.ralib.learning.RaLearningAlgorithm; import de.learnlib.ralib.learning.RaLearningAlgorithmName; -import de.learnlib.ralib.learning.SymbolicDecisionTree; +import de.learnlib.ralib.theory.SDT; import de.learnlib.ralib.learning.SymbolicSuffix; import de.learnlib.ralib.learning.rastar.CEAnalysisResult; import de.learnlib.ralib.oracles.Branching; @@ -43,7 +43,7 @@ import de.learnlib.ralib.oracles.TreeOracleFactory; import de.learnlib.ralib.oracles.TreeQueryResult; import de.learnlib.ralib.oracles.mto.OptimizedSymbolicSuffixBuilder; -import de.learnlib.ralib.oracles.mto.SDT; +import de.learnlib.ralib.theory.SDT; import de.learnlib.ralib.oracles.mto.SymbolicSuffixRestrictionBuilder; import de.learnlib.ralib.smt.ConstraintSolver; import de.learnlib.ralib.words.PSymbolInstance; @@ -387,7 +387,7 @@ private boolean checkGuardConsistency() { SymbolicSuffix testSuffix; if (suffixBuilder != null && tqr.getSdt() instanceof SDT) { Register[] differentlyMapped = differentlyMappedRegisters(tqr.getPiv(), otherTQR.getPiv()); - testSuffix = suffixBuilder.extendSuffix(word, (SDT)tqr.getSdt(), tqr.getPiv(), s, differentlyMapped); + testSuffix = suffixBuilder.extendSuffix(word, tqr.getSdt(), tqr.getPiv(), s, differentlyMapped); } else { testSuffix = new SymbolicSuffix(word.prefix(word.length()-1), word.suffix(1), restrictionBuilder); testSuffix = testSuffix.concat(s); @@ -434,12 +434,12 @@ private SymbolicSuffix distinguishingSuffix(Word wa, DTLeaf ca, assert tqrA != null && tqrB != null; - SymbolicDecisionTree sdtA = tqrA.getSdt(); - SymbolicDecisionTree sdtB = tqrB.getSdt(); + SDT sdtA = tqrA.getSdt(); + SDT sdtB = tqrB.getSdt(); if (suffixBuilder != null && solver != null && sdtA instanceof SDT && sdtB instanceof SDT) { -// return suffixBuilder.extendDistinguishingSuffix(wa, (SDT)sdtA, tqrA.getPiv(), wb, (SDT)sdtB, tqrB.getPiv(), v); - SymbolicSuffix suffix = suffixBuilder.distinguishingSuffixFromSDTs(wa, (SDT) sdtA, tqrA.getPiv(), wb, (SDT) sdtB, tqrB.getPiv(), v.getActions(), solver); +// return suffixBuilder.extendDistinguishingSuffix(wa, sdtA, tqrA.getPiv(), wb, sdtB, tqrB.getPiv(), v); + SymbolicSuffix suffix = suffixBuilder.distinguishingSuffixFromSDTs(wa, sdtA, tqrA.getPiv(), wb, sdtB, tqrB.getPiv(), v.getActions(), solver); return suffix; } diff --git a/src/main/java/de/learnlib/ralib/learning/rastar/Cell.java b/src/main/java/de/learnlib/ralib/learning/rastar/Cell.java index c57441e1..fda06ca9 100644 --- a/src/main/java/de/learnlib/ralib/learning/rastar/Cell.java +++ b/src/main/java/de/learnlib/ralib/learning/rastar/Cell.java @@ -21,7 +21,7 @@ import de.learnlib.ralib.data.PIV; import de.learnlib.ralib.data.SymbolicDataValue.Parameter; import de.learnlib.ralib.data.VarMapping; -import de.learnlib.ralib.learning.SymbolicDecisionTree; +import de.learnlib.ralib.theory.SDT; import de.learnlib.ralib.learning.SymbolicSuffix; import de.learnlib.ralib.oracles.TreeOracle; import de.learnlib.ralib.oracles.TreeQueryResult; @@ -41,13 +41,13 @@ final class Cell { private final SymbolicSuffix suffix; - private final SymbolicDecisionTree sdt; + private final SDT sdt; private final PIV parsInVars; // private static Logger LOGGER = LoggerFactory.getLogger(Cell.class); - private Cell(Word prefix, SymbolicSuffix suffix, SymbolicDecisionTree sdt, PIV parsInVars) { + private Cell(Word prefix, SymbolicSuffix suffix, SDT sdt, PIV parsInVars) { this.prefix = prefix; this.suffix = suffix; this.sdt = sdt; @@ -124,7 +124,7 @@ Word getPrefix() { return this.prefix; } - SymbolicDecisionTree getSDT() { + SDT getSDT() { return this.sdt; } diff --git a/src/main/java/de/learnlib/ralib/learning/rastar/Component.java b/src/main/java/de/learnlib/ralib/learning/rastar/Component.java index 185a2744..017289b9 100644 --- a/src/main/java/de/learnlib/ralib/learning/rastar/Component.java +++ b/src/main/java/de/learnlib/ralib/learning/rastar/Component.java @@ -36,7 +36,7 @@ import de.learnlib.ralib.data.util.PIVRemappingIterator; import de.learnlib.ralib.learning.LocationComponent; import de.learnlib.ralib.learning.PrefixContainer; -import de.learnlib.ralib.learning.SymbolicDecisionTree; +import de.learnlib.ralib.theory.SDT; import de.learnlib.ralib.learning.SymbolicSuffix; import de.learnlib.ralib.oracles.Branching; import de.learnlib.ralib.oracles.TreeOracle; @@ -118,7 +118,7 @@ void start(TreeOracle oracle, ParameterizedSymbol... inputs) { continue; } - SymbolicDecisionTree[] sdts = primeRow.getSDTsForInitialSymbol(ps); + SDT[] sdts = primeRow.getSDTsForInitialSymbol(ps); Branching b = oracle.getInitialBranching( getAccessSequence(), ps, primeRow.getParsInVars(), sdts); @@ -178,7 +178,7 @@ boolean updateBranching(TreeOracle oracle) { private boolean updateBranching(ParameterizedSymbol ps, TreeOracle oracle) { Branching b = branching.get(ps); - SymbolicDecisionTree[] sdts = primeRow.getSDTsForInitialSymbol(ps); + SDT[] sdts = primeRow.getSDTsForInitialSymbol(ps); Branching newB = oracle.updateBranching(getAccessSequence(), ps, b, primeRow.getParsInVars(), sdts); boolean ret = true; diff --git a/src/main/java/de/learnlib/ralib/learning/rastar/Row.java b/src/main/java/de/learnlib/ralib/learning/rastar/Row.java index b5201b97..b996fd01 100644 --- a/src/main/java/de/learnlib/ralib/learning/rastar/Row.java +++ b/src/main/java/de/learnlib/ralib/learning/rastar/Row.java @@ -32,7 +32,7 @@ import de.learnlib.ralib.data.VarMapping; import de.learnlib.ralib.data.util.SymbolicDataValueGenerator.RegisterGenerator; import de.learnlib.ralib.learning.PrefixContainer; -import de.learnlib.ralib.learning.SymbolicDecisionTree; +import de.learnlib.ralib.theory.SDT; import de.learnlib.ralib.learning.SymbolicSuffix; import de.learnlib.ralib.oracles.TreeOracle; import de.learnlib.ralib.words.InputSymbol; @@ -124,8 +124,8 @@ SymbolicSuffix getSuffixForMemorable(Parameter p) { throw new IllegalStateException("This line is not supposed to be reached."); } - SymbolicDecisionTree[] getSDTsForInitialSymbol(ParameterizedSymbol ps) { - List sdts = new ArrayList<>(); + SDT[] getSDTsForInitialSymbol(ParameterizedSymbol ps) { + List sdts = new ArrayList<>(); for (Entry c : cells.entrySet()) { Word acts = c.getKey().getActions(); if (acts.length() > 0 && acts.firstSymbol().equals(ps)) { @@ -133,7 +133,7 @@ SymbolicDecisionTree[] getSDTsForInitialSymbol(ParameterizedSymbol ps) { sdts.add(c.getValue().getSDT()); } } - return sdts.toArray(new SymbolicDecisionTree[]{}); + return sdts.toArray(new SDT[]{}); } @Override diff --git a/src/main/java/de/learnlib/ralib/oracles/SDTLogicOracle.java b/src/main/java/de/learnlib/ralib/oracles/SDTLogicOracle.java index 45429fba..d8cf560d 100644 --- a/src/main/java/de/learnlib/ralib/oracles/SDTLogicOracle.java +++ b/src/main/java/de/learnlib/ralib/oracles/SDTLogicOracle.java @@ -21,7 +21,7 @@ import de.learnlib.ralib.data.Mapping; import de.learnlib.ralib.data.PIV; import de.learnlib.ralib.data.SymbolicDataValue; -import de.learnlib.ralib.learning.SymbolicDecisionTree; +import de.learnlib.ralib.theory.SDT; import de.learnlib.ralib.words.PSymbolInstance; import gov.nasa.jpf.constraints.api.Expression; import net.automatalib.word.Word; @@ -55,13 +55,13 @@ public interface SDTLogicOracle { * @return */ boolean hasCounterexample(Word prefix, - SymbolicDecisionTree sdt1, PIV piv1, - SymbolicDecisionTree sdt2, PIV piv2, + SDT sdt1, PIV piv1, + SDT sdt2, PIV piv2, Expression guard, Word rep); Expression getCEGuard(Word prefix, - SymbolicDecisionTree sdt1, PIV piv1, - SymbolicDecisionTree sdt2, PIV piv2); + SDT sdt1, PIV piv1, + SDT sdt2, PIV piv2); /** * checks if one guard refine another guard. @@ -89,5 +89,5 @@ boolean areEquivalent(Expression guard1, PIV piv1, Expression /** * Returns true if the word leads to an accepting leaf on the SDT. */ - boolean accepts(Word word, Word prefix, SymbolicDecisionTree sdt, PIV piv); + boolean accepts(Word word, Word prefix, SDT sdt, PIV piv); } diff --git a/src/main/java/de/learnlib/ralib/oracles/TreeOracle.java b/src/main/java/de/learnlib/ralib/oracles/TreeOracle.java index fa738909..9e5b0f07 100644 --- a/src/main/java/de/learnlib/ralib/oracles/TreeOracle.java +++ b/src/main/java/de/learnlib/ralib/oracles/TreeOracle.java @@ -19,7 +19,7 @@ import java.util.Map; import de.learnlib.ralib.data.PIV; -import de.learnlib.ralib.learning.SymbolicDecisionTree; +import de.learnlib.ralib.theory.SDT; import de.learnlib.ralib.learning.SymbolicSuffix; import de.learnlib.ralib.oracles.mto.SymbolicSuffixRestrictionBuilder; import de.learnlib.ralib.words.PSymbolInstance; @@ -35,7 +35,7 @@ public interface TreeOracle { /** - * performs a tree query, returning a SymbolicDecisionTree + * performs a tree query, returning a SDT * an an Assignment of registers of this tree with parameters * of the prefix. * @@ -47,7 +47,7 @@ TreeQueryResult treeQuery( Word prefix, SymbolicSuffix suffix); /** - * Computes a Branching from a set of SymbolicDecisionTrees. + * Computes a Branching from a set of SDTs. * * @param prefix * @param ps @@ -56,11 +56,11 @@ TreeQueryResult treeQuery( * @return */ Branching getInitialBranching(Word prefix, - ParameterizedSymbol ps, PIV piv, SymbolicDecisionTree... sdts); + ParameterizedSymbol ps, PIV piv, SDT... sdts); /** * Updates and extends an existing Branching - * from a set of SymbolicDecisionTrees. + * from a set of SDTs. * * @param prefix * @param ps @@ -71,10 +71,10 @@ Branching getInitialBranching(Word prefix, */ Branching updateBranching(Word prefix, ParameterizedSymbol ps, Branching current, - PIV piv, SymbolicDecisionTree... sdts); + PIV piv, SDT... sdts); Map, Boolean> instantiate(Word prefix, - SymbolicSuffix suffix, SymbolicDecisionTree sdt, PIV piv); + SymbolicSuffix suffix, SDT sdt, PIV piv); SymbolicSuffixRestrictionBuilder getRestrictionBuilder(); diff --git a/src/main/java/de/learnlib/ralib/oracles/TreeQueryResult.java b/src/main/java/de/learnlib/ralib/oracles/TreeQueryResult.java index cfb9ae35..3e675efe 100644 --- a/src/main/java/de/learnlib/ralib/oracles/TreeQueryResult.java +++ b/src/main/java/de/learnlib/ralib/oracles/TreeQueryResult.java @@ -17,7 +17,7 @@ package de.learnlib.ralib.oracles; import de.learnlib.ralib.data.PIV; -import de.learnlib.ralib.learning.SymbolicDecisionTree; +import de.learnlib.ralib.theory.SDT; /** * Container for result of tree queries. @@ -28,11 +28,11 @@ public class TreeQueryResult { private final PIV piv; - private final SymbolicDecisionTree sdt; + private final SDT sdt; public TreeQueryResult( PIV piv, - SymbolicDecisionTree sdt) { + SDT sdt) { this.piv = piv; this.sdt = sdt; @@ -48,7 +48,7 @@ public PIV getPiv() { /** * @return the sdt */ - public SymbolicDecisionTree getSdt() { + public SDT getSdt() { //System.out.println("getSdt() " + sdt); return sdt; } diff --git a/src/main/java/de/learnlib/ralib/oracles/mto/LabeledSDT.java b/src/main/java/de/learnlib/ralib/oracles/mto/LabeledSDT.java index 360dbe10..00006006 100644 --- a/src/main/java/de/learnlib/ralib/oracles/mto/LabeledSDT.java +++ b/src/main/java/de/learnlib/ralib/oracles/mto/LabeledSDT.java @@ -7,7 +7,9 @@ import java.util.Map.Entry; import java.util.Set; +import de.learnlib.ralib.theory.SDT; import de.learnlib.ralib.theory.SDTGuard; +import de.learnlib.ralib.theory.SDTLeaf; /** * Wrapper around an SDT, which labels each node in the SDT with an integer identifier diff --git a/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheoryBranching.java b/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheoryBranching.java index 63ca0e4a..62802a4d 100644 --- a/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheoryBranching.java +++ b/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheoryBranching.java @@ -29,7 +29,9 @@ import de.learnlib.ralib.data.VarValuation; import de.learnlib.ralib.oracles.Branching; import de.learnlib.ralib.smt.SMTUtil; +import de.learnlib.ralib.theory.SDT; import de.learnlib.ralib.theory.SDTGuard; +import de.learnlib.ralib.theory.SDTLeaf; import de.learnlib.ralib.words.DataWords; import de.learnlib.ralib.words.PSymbolInstance; import de.learnlib.ralib.words.ParameterizedSymbol; diff --git a/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheorySDTLogicOracle.java b/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheorySDTLogicOracle.java index 075cd9be..e7097ce5 100644 --- a/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheorySDTLogicOracle.java +++ b/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheorySDTLogicOracle.java @@ -18,6 +18,7 @@ import java.util.Map; +import de.learnlib.ralib.theory.SDT; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -30,7 +31,7 @@ import de.learnlib.ralib.data.SymbolicDataValue.Register; import de.learnlib.ralib.data.SymbolicDataValue.SuffixValue; import de.learnlib.ralib.data.VarMapping; -import de.learnlib.ralib.learning.SymbolicDecisionTree; +import de.learnlib.ralib.theory.SDT; import de.learnlib.ralib.oracles.SDTLogicOracle; import de.learnlib.ralib.smt.ConstraintSolver; import de.learnlib.ralib.smt.SMTUtil; @@ -61,8 +62,8 @@ public MultiTheorySDTLogicOracle(Constants consts, ConstraintSolver solver) { } @Override - public boolean hasCounterexample(Word prefix, SymbolicDecisionTree sdt1, PIV piv1, - SymbolicDecisionTree sdt2, PIV piv2, Expression guard, Word rep) { + public boolean hasCounterexample(Word prefix, SDT sdt1, PIV piv1, + SDT sdt2, PIV piv2, Expression guard, Word rep) { // Collection join = piv1.values(); @@ -71,8 +72,8 @@ public boolean hasCounterexample(Word prefix, SymbolicDecisionT LOGGER.trace("SDT2: {0}", sdt2); LOGGER.trace("Guard: {0}", guard); - SDT _sdt1 = (SDT) sdt1; - SDT _sdt2 = (SDT) sdt2; + SDT _sdt1 = sdt1; + SDT _sdt2 = sdt2; Expression expr1 = _sdt1.getAcceptingPaths(consts); Expression expr2 = _sdt2.getAcceptingPaths(consts); @@ -112,10 +113,10 @@ public boolean hasCounterexample(Word prefix, SymbolicDecisionT @Override public Expression getCEGuard(Word prefix, - SymbolicDecisionTree sdt1, PIV piv1, SymbolicDecisionTree sdt2, PIV piv2) { + SDT sdt1, PIV piv1, SDT sdt2, PIV piv2) { - SDT _sdt1 = (SDT) sdt1; - SDT _sdt2 = (SDT) sdt2; + SDT _sdt1 = sdt1; + SDT _sdt2 = sdt2; Map, Boolean> exprMap1 = _sdt1.getGuardExpressions(consts); Map, Boolean> exprMap2 = _sdt2.getGuardExpressions(consts); @@ -215,9 +216,9 @@ public boolean areEquivalent(Expression guard1, PIV piv1, Expression word, Word prefix, SymbolicDecisionTree sdt, PIV piv) { + public boolean accepts(Word word, Word prefix, SDT sdt, PIV piv) { assert prefix.isPrefixOf(word) : "invalid prefix"; - SDT _sdt = (SDT) sdt; + SDT _sdt = sdt; assert _sdt.getHeight() == DataWords.paramValLength(word.suffix(word.length() - prefix.length())) : "The height of the tree is not consistent with the number of parameters in the word"; Mapping valuation = new Mapping<>(); diff --git a/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheoryTreeOracle.java b/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheoryTreeOracle.java index 86752177..503edfa1 100644 --- a/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheoryTreeOracle.java +++ b/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheoryTreeOracle.java @@ -30,6 +30,8 @@ import com.google.common.collect.Sets; +import de.learnlib.ralib.theory.SDT; +import de.learnlib.ralib.theory.SDTLeaf; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -52,7 +54,7 @@ import de.learnlib.ralib.data.util.SymbolicDataValueGenerator.ParameterGenerator; import de.learnlib.ralib.data.util.SymbolicDataValueGenerator.RegisterGenerator; import de.learnlib.ralib.data.util.SymbolicDataValueGenerator.SuffixValueGenerator; -import de.learnlib.ralib.learning.SymbolicDecisionTree; +import de.learnlib.ralib.theory.SDT; import de.learnlib.ralib.learning.SymbolicSuffix; import de.learnlib.ralib.oracles.Branching; import de.learnlib.ralib.oracles.DataWordOracle; @@ -104,7 +106,7 @@ public TreeQueryResult treeQuery(Word prefix, SymbolicSuffix su SDT sdt = treeQuery(prefix, suffix, new WordValuation(), pir, constants, new SuffixValuation()); //System.out.println(prefix + " . " + suffix); - //System.out.println(sdt); + //System.out.println; // move registers to 1 ... n VarMapping rename = new VarMapping(); @@ -164,7 +166,7 @@ public SDT treeQuery(Word prefix, SymbolicSuffix suffix, WordVa */ @Override public Branching getInitialBranching(Word prefix, ParameterizedSymbol ps, PIV piv, - SymbolicDecisionTree... sdts) { + SDT... sdts) { LOGGER.info(Category.QUERY, "computing initial branching for {0} after {1}", new Object[] { ps, prefix }); @@ -176,7 +178,7 @@ public Branching getInitialBranching(Word prefix, Parameterized if (sdts[i] instanceof SDTLeaf) { casted[i] = (SDTLeaf) sdts[i]; } else { - casted[i] = (SDT) sdts[i]; + casted[i] = sdts[i]; } } @@ -454,10 +456,10 @@ private Mapping buildValuation(ParValuation parVal @Override public Map, Boolean> instantiate(Word prefix, SymbolicSuffix suffix, - SymbolicDecisionTree sdt, PIV piv) { + SDT sdt, PIV piv) { assert (sdt instanceof SDT); Map, Boolean> words = new LinkedHashMap, Boolean>(); - instantiate(words, prefix, suffix, (SDT) sdt, piv, 0, 0, + instantiate(words, prefix, suffix, sdt, piv, 0, 0, new ParValuation(), new ParameterGenerator(), new ParValuation(), new ParameterGenerator()); return words; } @@ -503,10 +505,10 @@ private void instantiate(Map, Boolean> words, Word prefix, ParameterizedSymbol ps, Branching current, PIV piv, - SymbolicDecisionTree... sdts) { + SDT... sdts) { //System.out.println(current); - //for (SymbolicDecisionTree s: sdts) { + //for (SDT s: sdts) { // System.out.println(s); //} @@ -524,7 +526,7 @@ public Branching updateBranching(Word prefix, ParameterizedSymb if (sdts[i] instanceof SDTLeaf) { casted[i + 1] = (SDTLeaf) sdts[i]; } else { - casted[i + 1] = (SDT) sdts[i].relabel(remapping); + casted[i + 1] = sdts[i].relabel(remapping); } } @@ -541,7 +543,7 @@ public Branching updateBranching(Word prefix, ParameterizedSymb return fluff; } - public boolean accepts(Word prefix, Word suffix, SymbolicDecisionTree sdt, PIV piv) { + public boolean accepts(Word prefix, Word suffix, SDT sdt, PIV piv) { Mapping mapping = new Mapping<>(); mapping.putAll(constants); @@ -564,7 +566,7 @@ public boolean accepts(Word prefix, Word suffi VarValuation vars = DataWords.computeVarValuation(pars, piv); mapping.putAll(vars); - SDT _sdt = (SDT)sdt; + SDT _sdt = sdt; Expression expr = _sdt.getAcceptingPaths(constants); if (expr.equals(ExpressionUtil.FALSE)) return false; diff --git a/src/main/java/de/learnlib/ralib/oracles/mto/OptimizedSymbolicSuffixBuilder.java b/src/main/java/de/learnlib/ralib/oracles/mto/OptimizedSymbolicSuffixBuilder.java index d9f4d9c3..00d1cde0 100644 --- a/src/main/java/de/learnlib/ralib/oracles/mto/OptimizedSymbolicSuffixBuilder.java +++ b/src/main/java/de/learnlib/ralib/oracles/mto/OptimizedSymbolicSuffixBuilder.java @@ -21,9 +21,7 @@ import de.learnlib.ralib.data.util.SymbolicDataValueGenerator; import de.learnlib.ralib.learning.SymbolicSuffix; import de.learnlib.ralib.smt.ConstraintSolver; -import de.learnlib.ralib.theory.SDTGuard; -import de.learnlib.ralib.theory.SuffixValueRestriction; -import de.learnlib.ralib.theory.UnrestrictedSuffixValue; +import de.learnlib.ralib.theory.*; import de.learnlib.ralib.words.DataWords; import de.learnlib.ralib.words.PSymbolInstance; import de.learnlib.ralib.words.ParameterizedSymbol; @@ -339,14 +337,14 @@ public SymbolicSuffix distinguishingSuffixFromSDTs(Word prefix1 for (Register r : piv1.values()) { relabellingSdt1.put(r, rgen.next(r.getDataType())); } - SDT relSdt1 = (SDT) sdt1.relabel(relabellingSdt1); + SDT relSdt1 = sdt1.relabel(relabellingSdt1); PIV relPiv1 = piv1.relabel(relabellingSdt1); VarMapping relabellingSdt2 = new VarMapping<>(); for (Register r : piv2.values()) { relabellingSdt2.put(r, rgen.next(r.getDataType())); } - SDT relSdt2 = (SDT) sdt2.relabel(relabellingSdt2); + SDT relSdt2 = sdt2.relabel(relabellingSdt2); PIV relPiv2 = piv2.relabel(relabellingSdt2); // we build valuations which we use to determine satisfiable paths diff --git a/src/main/java/de/learnlib/ralib/oracles/mto/SDTConstructor.java b/src/main/java/de/learnlib/ralib/oracles/mto/SDTConstructor.java index 2cfe0ea6..28a94e2f 100644 --- a/src/main/java/de/learnlib/ralib/oracles/mto/SDTConstructor.java +++ b/src/main/java/de/learnlib/ralib/oracles/mto/SDTConstructor.java @@ -21,6 +21,7 @@ import de.learnlib.ralib.data.SuffixValuation; import de.learnlib.ralib.data.WordValuation; import de.learnlib.ralib.learning.SymbolicSuffix; +import de.learnlib.ralib.theory.SDT; import de.learnlib.ralib.words.PSymbolInstance; import net.automatalib.word.Word; diff --git a/src/main/java/de/learnlib/ralib/oracles/mto/SDT.java b/src/main/java/de/learnlib/ralib/theory/SDT.java similarity index 92% rename from src/main/java/de/learnlib/ralib/oracles/mto/SDT.java rename to src/main/java/de/learnlib/ralib/theory/SDT.java index 017c7a10..872ed271 100644 --- a/src/main/java/de/learnlib/ralib/oracles/mto/SDT.java +++ b/src/main/java/de/learnlib/ralib/theory/SDT.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package de.learnlib.ralib.oracles.mto; +package de.learnlib.ralib.theory; import java.util.ArrayList; import java.util.Arrays; @@ -31,9 +31,7 @@ import de.learnlib.ralib.data.SymbolicDataValue; import de.learnlib.ralib.data.SymbolicDataValue.Register; import de.learnlib.ralib.data.VarMapping; -import de.learnlib.ralib.learning.SymbolicDecisionTree; import de.learnlib.ralib.smt.SMTUtil; -import de.learnlib.ralib.theory.*; import gov.nasa.jpf.constraints.api.Expression; import gov.nasa.jpf.constraints.util.ExpressionUtil; @@ -42,8 +40,7 @@ * * @author Sofia Cassel */ -@Deprecated -public class SDT implements SymbolicDecisionTree { +public class SDT { private final Map children; @@ -56,7 +53,7 @@ public SDT(Map children) { * * @return */ - Set getRegisters() { + public Set getRegisters() { Set registers = new LinkedHashSet<>(); this.getVariables().stream().filter((x) -> (x.isRegister())).forEach((x) -> { registers.add((Register) x); @@ -109,7 +106,6 @@ public Set getVariables() { return variables; } - @Override public boolean isAccepting() { for (Map.Entry e : children.entrySet()) { @@ -131,25 +127,24 @@ public boolean isAccepting(Mapping vals, Constants return expr.evaluateSMT(SMTUtil.compose(mapping)); } - protected Map getChildren() { + public Map getChildren() { return this.children; } - @Override public boolean isEquivalent( - SymbolicDecisionTree other, VarMapping renaming) { + SDT other, VarMapping renaming) { if (other instanceof SDTLeaf) { return false; } - SDT otherSDT = (SDT) other; - SDT otherRelabeled = (SDT) otherSDT.relabel(renaming); + SDT otherSDT = other; + SDT otherRelabeled = otherSDT.relabel(renaming); boolean regEq = this.regCanUse(otherRelabeled) && otherRelabeled.regCanUse(this); return regEq && this.canUse(otherRelabeled) && otherRelabeled.canUse(this); } public boolean isEquivalentUnder( - SymbolicDecisionTree deqSDT, List ds) { + SDT deqSDT, List ds) { if (deqSDT instanceof SDTLeaf) { if (this instanceof SDTLeaf) { return (this.isAccepting() == deqSDT.isAccepting()); @@ -162,7 +157,7 @@ public boolean isEquivalentUnder( } // System.out.println(eqRenaming); // System.out.println(this + " vs " + deqSDT); - boolean x = this.canUse((SDT) deqSDT.relabel(eqRenaming)); + boolean x = this.canUse( deqSDT.relabel(eqRenaming)); return x; } @@ -171,11 +166,10 @@ public SDT relabelUnderEq(List ds) { for (SDTGuard.EqualityGuard d : ds) { eqRenaming.put(d.parameter(), d.register()); } - return (SDT) this.relabel(eqRenaming); + return this.relabel(eqRenaming); } - @Override - public SymbolicDecisionTree relabel(VarMapping relabelling) { + public SDT relabel(VarMapping relabelling) { //System.out.println("relabeling " + relabelling); SDT thisSdt = this; if (relabelling.isEmpty()) { @@ -186,7 +180,7 @@ public SymbolicDecisionTree relabel(VarMapping relabelling) { // for each of the kids for (Entry e : thisSdt.children.entrySet()) { reChildren.put(SDTGuard.relabel(e.getKey(), relabelling), - (SDT) e.getValue().relabel(relabelling)); + e.getValue().relabel(relabelling)); } SDT relabelled = new SDT(reChildren); assert !relabelled.isEmpty(); @@ -326,7 +320,7 @@ public boolean isEmpty() { return this.getChildren().isEmpty(); } - Expression getAcceptingPaths(Constants consts) { + public Expression getAcceptingPaths(Constants consts) { List> paths = getPaths(new ArrayList()); if (paths.isEmpty()) { @@ -347,7 +341,7 @@ Expression getAcceptingPaths(Constants consts) { return dis; } - Map, Boolean> getGuardExpressions(Constants consts) { + public Map, Boolean> getGuardExpressions(Constants consts) { Map, Boolean> expressions = new LinkedHashMap<>(); Map, Boolean> paths = getAllPaths(new ArrayList()); if (paths.isEmpty()) { @@ -380,7 +374,7 @@ List> getPaths(List path) { return ret; } - List> getPaths(boolean accepting) { + public List> getPaths(boolean accepting) { List> collectedPaths = new ArrayList>(); getPaths(accepting, new ArrayList<>(), this, collectedPaths); return collectedPaths; @@ -401,7 +395,7 @@ private void getPaths(boolean accepting, List path, SDT sdt, List, Boolean> getAllPaths(List path) { + public Map, Boolean> getAllPaths(List path) { Map, Boolean> ret = new LinkedHashMap<>(); for (Entry e : this.children.entrySet()) { List nextPath = new ArrayList<>(path); @@ -427,7 +421,6 @@ private static SDT findFinest(int i, List sdts, SDT curr) { } } - @Override public SDT copy() { Map cc = new LinkedHashMap<>(); if (children != null) { diff --git a/src/main/java/de/learnlib/ralib/oracles/mto/SDTLeaf.java b/src/main/java/de/learnlib/ralib/theory/SDTLeaf.java similarity index 87% rename from src/main/java/de/learnlib/ralib/oracles/mto/SDTLeaf.java rename to src/main/java/de/learnlib/ralib/theory/SDTLeaf.java index 36ecbf19..54763f2f 100644 --- a/src/main/java/de/learnlib/ralib/oracles/mto/SDTLeaf.java +++ b/src/main/java/de/learnlib/ralib/theory/SDTLeaf.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package de.learnlib.ralib.oracles.mto; +package de.learnlib.ralib.theory; import java.util.ArrayList; import java.util.LinkedHashMap; @@ -25,15 +25,12 @@ import de.learnlib.ralib.data.SymbolicDataValue; import de.learnlib.ralib.data.VarMapping; -import de.learnlib.ralib.learning.SymbolicDecisionTree; -import de.learnlib.ralib.theory.SDTGuard; /** * Leaf implementation of an SDT. * * @author falk */ -@Deprecated public class SDTLeaf extends SDT { public static final SDTLeaf ACCEPTING = new SDTLeaf(true); @@ -42,14 +39,14 @@ public class SDTLeaf extends SDT { private final boolean accepting; - private SDTLeaf(boolean accepting) { + protected SDTLeaf(boolean accepting) { super(null); this.accepting = accepting; } @Override public boolean isEquivalent( - SymbolicDecisionTree other, VarMapping renaming) { + SDT other, VarMapping renaming) { return (getClass() == other.getClass() && isAccepting() == other.isAccepting()); } @@ -70,7 +67,7 @@ public String toString() { } @Override - public SymbolicDecisionTree relabel(VarMapping relabeling) { + public SDT relabel(VarMapping relabeling) { return this; } @@ -99,7 +96,7 @@ List> getPaths(List path) { } @Override - Map, Boolean> getAllPaths(List path) { + public Map, Boolean> getAllPaths(List path) { Map, Boolean> ret = new LinkedHashMap<>(); ret.put(path, this.isAccepting()); return ret; diff --git a/src/main/java/de/learnlib/ralib/theory/Theory.java b/src/main/java/de/learnlib/ralib/theory/Theory.java index 4a46254e..c2888657 100644 --- a/src/main/java/de/learnlib/ralib/theory/Theory.java +++ b/src/main/java/de/learnlib/ralib/theory/Theory.java @@ -31,7 +31,6 @@ import de.learnlib.ralib.data.SymbolicDataValue.SuffixValue; import de.learnlib.ralib.data.WordValuation; import de.learnlib.ralib.learning.SymbolicSuffix; -import de.learnlib.ralib.oracles.mto.SDT; import de.learnlib.ralib.oracles.mto.SDTConstructor; import de.learnlib.ralib.words.PSymbolInstance; import de.learnlib.ralib.words.ParameterizedSymbol; diff --git a/src/main/java/de/learnlib/ralib/theory/equality/EqualityTheory.java b/src/main/java/de/learnlib/ralib/theory/equality/EqualityTheory.java index 3cfe8299..cb07f977 100644 --- a/src/main/java/de/learnlib/ralib/theory/equality/EqualityTheory.java +++ b/src/main/java/de/learnlib/ralib/theory/equality/EqualityTheory.java @@ -46,9 +46,9 @@ import de.learnlib.ralib.data.WordValuation; import de.learnlib.ralib.learning.SymbolicSuffix; import de.learnlib.ralib.oracles.io.IOOracle; -import de.learnlib.ralib.oracles.mto.SDT; +import de.learnlib.ralib.theory.SDT; import de.learnlib.ralib.oracles.mto.SDTConstructor; -import de.learnlib.ralib.oracles.mto.SDTLeaf; +import de.learnlib.ralib.theory.SDTLeaf; import de.learnlib.ralib.theory.*; import de.learnlib.ralib.words.DataWords; import de.learnlib.ralib.words.OutputSymbol; diff --git a/src/main/java/de/learnlib/ralib/theory/equality/UniqueEqualityTheory.java b/src/main/java/de/learnlib/ralib/theory/equality/UniqueEqualityTheory.java index 1562256d..a7ca5773 100644 --- a/src/main/java/de/learnlib/ralib/theory/equality/UniqueEqualityTheory.java +++ b/src/main/java/de/learnlib/ralib/theory/equality/UniqueEqualityTheory.java @@ -9,7 +9,7 @@ import de.learnlib.ralib.data.*; import de.learnlib.ralib.learning.SymbolicSuffix; import de.learnlib.ralib.oracles.io.IOOracle; -import de.learnlib.ralib.oracles.mto.SDT; +import de.learnlib.ralib.theory.SDT; import de.learnlib.ralib.oracles.mto.SDTConstructor; import de.learnlib.ralib.theory.SDTGuard; import de.learnlib.ralib.theory.Theory; diff --git a/src/main/java/de/learnlib/ralib/theory/inequality/InequalityTheoryWithEq.java b/src/main/java/de/learnlib/ralib/theory/inequality/InequalityTheoryWithEq.java index aa2755fc..ed820eac 100644 --- a/src/main/java/de/learnlib/ralib/theory/inequality/InequalityTheoryWithEq.java +++ b/src/main/java/de/learnlib/ralib/theory/inequality/InequalityTheoryWithEq.java @@ -38,9 +38,9 @@ import de.learnlib.ralib.data.SymbolicDataValue.SuffixValue; import de.learnlib.ralib.data.WordValuation; import de.learnlib.ralib.learning.SymbolicSuffix; -import de.learnlib.ralib.oracles.mto.SDT; +import de.learnlib.ralib.theory.SDT; import de.learnlib.ralib.oracles.mto.SDTConstructor; -import de.learnlib.ralib.oracles.mto.SDTLeaf; +import de.learnlib.ralib.theory.SDTLeaf; import de.learnlib.ralib.theory.*; import de.learnlib.ralib.words.DataWords; import de.learnlib.ralib.words.PSymbolInstance; diff --git a/src/test/java/de/learnlib/ralib/dt/RegisterConsistencyTest.java b/src/test/java/de/learnlib/ralib/dt/RegisterConsistencyTest.java index 6b15a2af..1e674d2f 100644 --- a/src/test/java/de/learnlib/ralib/dt/RegisterConsistencyTest.java +++ b/src/test/java/de/learnlib/ralib/dt/RegisterConsistencyTest.java @@ -18,13 +18,13 @@ import de.learnlib.ralib.data.util.SymbolicDataValueGenerator.ParameterGenerator; import de.learnlib.ralib.data.util.SymbolicDataValueGenerator.RegisterGenerator; import de.learnlib.ralib.data.util.SymbolicDataValueGenerator.SuffixValueGenerator; -import de.learnlib.ralib.learning.SymbolicDecisionTree; +import de.learnlib.ralib.theory.SDT; import de.learnlib.ralib.learning.SymbolicSuffix; import de.learnlib.ralib.oracles.Branching; import de.learnlib.ralib.oracles.TreeOracle; import de.learnlib.ralib.oracles.TreeQueryResult; -import de.learnlib.ralib.oracles.mto.SDT; -import de.learnlib.ralib.oracles.mto.SDTLeaf; +import de.learnlib.ralib.theory.SDT; +import de.learnlib.ralib.theory.SDTLeaf; import de.learnlib.ralib.oracles.mto.SymbolicSuffixRestrictionBuilder; import de.learnlib.ralib.theory.SDTGuard; import de.learnlib.ralib.words.InputSymbol; @@ -50,19 +50,19 @@ public TreeQueryResult treeQuery(Word prefix, SymbolicSuffix su @Override public Branching getInitialBranching(Word prefix, ParameterizedSymbol ps, PIV piv, - SymbolicDecisionTree... sdts) { + SDT... sdts) { return null; } @Override public Branching updateBranching(Word prefix, ParameterizedSymbol ps, Branching current, - PIV piv, SymbolicDecisionTree... sdts) { + PIV piv, SDT... sdts) { return null; } @Override public Map, Boolean> instantiate(Word prefix, SymbolicSuffix suffix, - SymbolicDecisionTree sdt, PIV piv) { + SDT sdt, PIV piv) { return null; } diff --git a/src/test/java/de/learnlib/ralib/example/sdts/LoginExampleSDT.java b/src/test/java/de/learnlib/ralib/example/sdts/LoginExampleSDT.java index a8e2bbd5..7fd53479 100644 --- a/src/test/java/de/learnlib/ralib/example/sdts/LoginExampleSDT.java +++ b/src/test/java/de/learnlib/ralib/example/sdts/LoginExampleSDT.java @@ -22,14 +22,15 @@ import de.learnlib.ralib.data.SymbolicDataValue; import de.learnlib.ralib.data.SymbolicDataValue.Register; import de.learnlib.ralib.data.VarMapping; -import de.learnlib.ralib.learning.SymbolicDecisionTree; +import de.learnlib.ralib.theory.SDT; import de.learnlib.ralib.learning.SymbolicSuffix; +import de.learnlib.ralib.theory.SDTLeaf; /** * * @author falk */ -public class LoginExampleSDT implements SymbolicDecisionTree { +public class LoginExampleSDT extends SDTLeaf { public enum SDTClass {ACCEPT, REJECT, LOGIN} @@ -40,12 +41,14 @@ public enum SDTClass {ACCEPT, REJECT, LOGIN} private final Set registers; public LoginExampleSDT(SDTClass clazz, SymbolicSuffix suffix, Set registers) { + super(true); this.clazz = clazz; this.suffix = suffix; this.registers = registers; } public LoginExampleSDT(LoginExampleSDT other) { + super(other.isAccepting()); clazz = other.clazz; suffix = new SymbolicSuffix(other.suffix); registers = new LinkedHashSet<>(); @@ -54,7 +57,7 @@ public LoginExampleSDT(LoginExampleSDT other) { } @Override - public boolean isEquivalent(SymbolicDecisionTree other, VarMapping renaming) { + public boolean isEquivalent(SDT other, VarMapping renaming) { if (! other.getClass().equals(this.getClass())) { return false; } diff --git a/src/test/java/de/learnlib/ralib/example/sdts/LoginExampleTreeOracle.java b/src/test/java/de/learnlib/ralib/example/sdts/LoginExampleTreeOracle.java index 83e79c52..b18fae07 100644 --- a/src/test/java/de/learnlib/ralib/example/sdts/LoginExampleTreeOracle.java +++ b/src/test/java/de/learnlib/ralib/example/sdts/LoginExampleTreeOracle.java @@ -35,7 +35,7 @@ import de.learnlib.ralib.data.util.SymbolicDataValueGenerator; import de.learnlib.ralib.data.util.SymbolicDataValueGenerator.RegisterGenerator; import de.learnlib.ralib.example.sdts.LoginExampleSDT.SDTClass; -import de.learnlib.ralib.learning.SymbolicDecisionTree; +import de.learnlib.ralib.theory.SDT; import de.learnlib.ralib.learning.SymbolicSuffix; import de.learnlib.ralib.oracles.Branching; import de.learnlib.ralib.oracles.TreeOracle; @@ -167,7 +167,7 @@ private Word getDefaultExtension( @Override public Branching getInitialBranching(Word prefix, - ParameterizedSymbol ps, PIV piv, SymbolicDecisionTree... sdts) { + ParameterizedSymbol ps, PIV piv, SDT... sdts) { Map, Expression> branches = new LinkedHashMap, Expression>(); Word acts = DataWords.actsOf(prefix); @@ -212,14 +212,14 @@ public Branching getInitialBranching(Word prefix, @Override public Branching updateBranching(Word prefix, ParameterizedSymbol ps, Branching current, - PIV piv, SymbolicDecisionTree... sdts) { + PIV piv, SDT... sdts) { return getInitialBranching(prefix, ps, piv, sdts); } @Override public Map, Boolean> instantiate(Word prefix, - SymbolicSuffix suffix, SymbolicDecisionTree sdt, PIV piv) { + SymbolicSuffix suffix, SDT sdt, PIV piv) { throw new UnsupportedOperationException("Not implemented"); } diff --git a/src/test/java/de/learnlib/ralib/learning/rastar/LoggingOracle.java b/src/test/java/de/learnlib/ralib/learning/rastar/LoggingOracle.java index ded9164f..25c660ea 100644 --- a/src/test/java/de/learnlib/ralib/learning/rastar/LoggingOracle.java +++ b/src/test/java/de/learnlib/ralib/learning/rastar/LoggingOracle.java @@ -20,7 +20,7 @@ import de.learnlib.ralib.data.Constants; import de.learnlib.ralib.data.PIV; -import de.learnlib.ralib.learning.SymbolicDecisionTree; +import de.learnlib.ralib.theory.SDT; import de.learnlib.ralib.learning.SymbolicSuffix; import de.learnlib.ralib.oracles.Branching; import de.learnlib.ralib.oracles.TreeOracle; @@ -50,7 +50,7 @@ public TreeQueryResult treeQuery(Word prefix, SymbolicSuffix su @Override public Branching getInitialBranching(Word prefix, - ParameterizedSymbol ps, PIV piv, SymbolicDecisionTree ... sdts) { + ParameterizedSymbol ps, PIV piv, SDT ... sdts) { //System.out.println("QUERY (initial branching): " + prefix + " and " + ps); return treeoracle.getInitialBranching(prefix, ps, piv, sdts); @@ -59,7 +59,7 @@ public Branching getInitialBranching(Word prefix, @Override public Branching updateBranching(Word prefix, ParameterizedSymbol ps, Branching current, - PIV piv, SymbolicDecisionTree ... sdts) { + PIV piv, SDT ... sdts) { //System.out.println("QUERY (update branching): " + prefix + // " and " + ps + " with " + sdts.length + " sdts"); @@ -70,7 +70,7 @@ public Branching updateBranching(Word prefix, @Override public Map, Boolean> instantiate(Word prefix, - SymbolicSuffix suffix, SymbolicDecisionTree sdt, PIV piv) { + SymbolicSuffix suffix, SDT sdt, PIV piv) { return treeoracle.instantiate(prefix, suffix, sdt, piv); } diff --git a/src/test/java/de/learnlib/ralib/oracles/mto/OptimizedSymbolicSuffixBuilderTest.java b/src/test/java/de/learnlib/ralib/oracles/mto/OptimizedSymbolicSuffixBuilderTest.java index 130d1e80..a329786a 100644 --- a/src/test/java/de/learnlib/ralib/oracles/mto/OptimizedSymbolicSuffixBuilderTest.java +++ b/src/test/java/de/learnlib/ralib/oracles/mto/OptimizedSymbolicSuffixBuilderTest.java @@ -14,6 +14,7 @@ import java.util.Map; import java.util.Set; +import de.learnlib.ralib.theory.*; import org.testng.Assert; import org.testng.annotations.Test; @@ -35,11 +36,6 @@ import de.learnlib.ralib.learning.SymbolicSuffix; import de.learnlib.ralib.oracles.TreeQueryResult; import de.learnlib.ralib.smt.ConstraintSolver; -import de.learnlib.ralib.theory.FreshSuffixValue; -import de.learnlib.ralib.theory.SDTGuard; -import de.learnlib.ralib.theory.SuffixValueRestriction; -import de.learnlib.ralib.theory.Theory; -import de.learnlib.ralib.theory.UnrestrictedSuffixValue; import de.learnlib.ralib.theory.equality.EqualRestriction; import de.learnlib.ralib.tools.theories.IntegerEqualityTheory; import de.learnlib.ralib.words.InputSymbol; @@ -266,7 +262,7 @@ private void equalsSuffixesFromConcretePrefixSuffix(Word word, Word sub = word.prefix(word.length() - suffixLength); Word prefix = word.prefix(sub.length()+1); SymbolicSuffix expected = new SymbolicSuffix(sub, suffix); - actual = builder.extendSuffix(prefix, (SDT) tqr.getSdt(), tqr.getPiv(), actual); + actual = builder.extendSuffix(prefix, tqr.getSdt(), tqr.getPiv(), actual); Assert.assertEquals(actual, expected); tqr = mto.treeQuery(sub, expected); } diff --git a/src/test/java/de/learnlib/ralib/oracles/mto/SecondSDTBranchingTest.java b/src/test/java/de/learnlib/ralib/oracles/mto/SecondSDTBranchingTest.java index fecd05b4..b3fcb6aa 100644 --- a/src/test/java/de/learnlib/ralib/oracles/mto/SecondSDTBranchingTest.java +++ b/src/test/java/de/learnlib/ralib/oracles/mto/SecondSDTBranchingTest.java @@ -36,7 +36,7 @@ import de.learnlib.ralib.data.SymbolicDataValue.Register; import de.learnlib.ralib.data.VarMapping; import de.learnlib.ralib.data.util.SymbolicDataValueGenerator.RegisterGenerator; -import de.learnlib.ralib.learning.SymbolicDecisionTree; +import de.learnlib.ralib.theory.SDT; import de.learnlib.ralib.learning.SymbolicSuffix; import de.learnlib.ralib.oracles.Branching; import de.learnlib.ralib.oracles.TreeQueryResult; @@ -134,8 +134,8 @@ public void testModelswithOutput() { remap.put(r2, r1); PIV piv = tqr2.getPiv(); - SymbolicDecisionTree sdt1 = tqr1.getSdt().relabel(remap); - SymbolicDecisionTree sdt2 = tqr2.getSdt(); + SDT sdt1 = tqr1.getSdt().relabel(remap); + SDT sdt2 = tqr2.getSdt(); logger.log(Level.FINE, "PIV: {0}", piv); logger.log(Level.FINE, "SDT1: {0}", sdt1); diff --git a/src/test/java/de/learnlib/ralib/oracles/mto/UntypedBranchingTest.java b/src/test/java/de/learnlib/ralib/oracles/mto/UntypedBranchingTest.java index 01c38f83..c256f2da 100644 --- a/src/test/java/de/learnlib/ralib/oracles/mto/UntypedBranchingTest.java +++ b/src/test/java/de/learnlib/ralib/oracles/mto/UntypedBranchingTest.java @@ -56,7 +56,7 @@ import de.learnlib.ralib.data.VarMapping; import de.learnlib.ralib.data.util.SymbolicDataValueGenerator.ParameterGenerator; import de.learnlib.ralib.data.util.SymbolicDataValueGenerator.RegisterGenerator; -import de.learnlib.ralib.learning.SymbolicDecisionTree; +import de.learnlib.ralib.theory.SDT; import de.learnlib.ralib.learning.SymbolicSuffix; import de.learnlib.ralib.oracles.Branching; import de.learnlib.ralib.oracles.TreeQueryResult; @@ -133,7 +133,7 @@ public void testBranching() { TreeQueryResult res = mto.treeQuery(prefix, symSuffix); logger.log(Level.FINE, "SDT: {0}", res.getSdt()); - SymbolicDecisionTree sdt = res.getSdt(); + SDT sdt = res.getSdt(); ParameterGenerator pgen = new ParameterGenerator(); RegisterGenerator rgen = new RegisterGenerator(); diff --git a/src/test/java/de/learnlib/ralib/theory/TestEqualityTheory.java b/src/test/java/de/learnlib/ralib/theory/TestEqualityTheory.java index 3742da42..a4b15ba6 100644 --- a/src/test/java/de/learnlib/ralib/theory/TestEqualityTheory.java +++ b/src/test/java/de/learnlib/ralib/theory/TestEqualityTheory.java @@ -38,7 +38,6 @@ import de.learnlib.ralib.data.PIV; import de.learnlib.ralib.data.SymbolicDataValue.Parameter; import de.learnlib.ralib.data.SymbolicDataValue.Register; -import de.learnlib.ralib.learning.SymbolicDecisionTree; import de.learnlib.ralib.learning.SymbolicSuffix; import de.learnlib.ralib.oracles.Branching; import de.learnlib.ralib.oracles.DataWordOracle; @@ -90,7 +89,7 @@ public void testLoginExample1() { logger.log(Level.FINE, "Suffix: {0}", symSuffix); TreeQueryResult res = treeOracle.treeQuery(prefix, symSuffix); - SymbolicDecisionTree sdt = res.getSdt(); + SDT sdt = res.getSdt(); String expectedTree = "[r2, r1]-+\n" + " []-(s1=r2)\n" + diff --git a/src/test/java/de/learnlib/ralib/theory/TestIneqEqTree.java b/src/test/java/de/learnlib/ralib/theory/TestIneqEqTree.java index 5fe12da8..3d39c712 100644 --- a/src/test/java/de/learnlib/ralib/theory/TestIneqEqTree.java +++ b/src/test/java/de/learnlib/ralib/theory/TestIneqEqTree.java @@ -35,7 +35,6 @@ import de.learnlib.ralib.data.SymbolicDataValue.Parameter; import de.learnlib.ralib.data.SymbolicDataValue.Register; import de.learnlib.ralib.example.priority.PriorityQueueSUL; -import de.learnlib.ralib.learning.SymbolicDecisionTree; import de.learnlib.ralib.learning.SymbolicSuffix; import de.learnlib.ralib.oracles.Branching; import de.learnlib.ralib.oracles.TreeQueryResult; @@ -94,7 +93,7 @@ public void testIneqEqTree() { logger.log(Level.FINE, "Suffix: {0}", symSuffix); TreeQueryResult res = mto.treeQuery(prefix, symSuffix); - SymbolicDecisionTree sdt = res.getSdt(); + SDT sdt = res.getSdt(); final String expectedTree = "[r2, r1]-+\n" + " []-(s1!=r2)\n" + diff --git a/src/test/java/de/learnlib/ralib/theory/TestIneqOutputTree.java b/src/test/java/de/learnlib/ralib/theory/TestIneqOutputTree.java index d44b747c..a9a2912c 100644 --- a/src/test/java/de/learnlib/ralib/theory/TestIneqOutputTree.java +++ b/src/test/java/de/learnlib/ralib/theory/TestIneqOutputTree.java @@ -33,7 +33,6 @@ import de.learnlib.ralib.data.DataType; import de.learnlib.ralib.data.DataValue; import de.learnlib.ralib.example.priority.PriorityQueueSUL; -import de.learnlib.ralib.learning.SymbolicDecisionTree; import de.learnlib.ralib.learning.SymbolicSuffix; import de.learnlib.ralib.oracles.TreeQueryResult; import de.learnlib.ralib.oracles.mto.MultiTheoryTreeOracle; @@ -99,7 +98,7 @@ public void testIneqEqTree() { logger.log(Level.FINE, "Suffix: {0}", symSuffix); TreeQueryResult res = mto.treeQuery(prefix, symSuffix); - SymbolicDecisionTree sdt = res.getSdt(); + SDT sdt = res.getSdt(); final String expectedTree = "[r1]-+\n" + " []-(s1 Date: Wed, 26 Feb 2025 09:41:17 +0100 Subject: [PATCH 13/26] spotless --- src/main/java/de/learnlib/ralib/ceanalysis/PrefixFinder.java | 2 +- src/main/java/de/learnlib/ralib/dt/DT.java | 4 ++-- src/main/java/de/learnlib/ralib/dt/DTLeaf.java | 1 - .../de/learnlib/ralib/learning/CounterexampleAnalysis.java | 2 +- .../java/de/learnlib/ralib/learning/ralambda/RaLambda.java | 3 +-- src/main/java/de/learnlib/ralib/learning/rastar/Cell.java | 2 +- .../java/de/learnlib/ralib/learning/rastar/Component.java | 2 +- src/main/java/de/learnlib/ralib/learning/rastar/Row.java | 2 +- src/main/java/de/learnlib/ralib/oracles/TreeOracle.java | 2 +- .../ralib/oracles/mto/MultiTheorySDTLogicOracle.java | 3 +-- .../de/learnlib/ralib/oracles/mto/MultiTheoryTreeOracle.java | 5 ++--- .../de/learnlib/ralib/theory/equality/EqualityTheory.java | 4 ++-- .../learnlib/ralib/theory/equality/UniqueEqualityTheory.java | 2 +- .../ralib/theory/inequality/InequalityTheoryWithEq.java | 4 ++-- .../java/de/learnlib/ralib/dt/RegisterConsistencyTest.java | 5 ++--- .../java/de/learnlib/ralib/example/sdts/LoginExampleSDT.java | 2 +- .../learnlib/ralib/example/sdts/LoginExampleTreeOracle.java | 2 +- .../de/learnlib/ralib/learning/rastar/LoggingOracle.java | 2 +- .../oracles/mto/OptimizedSymbolicSuffixBuilderTest.java | 2 +- .../learnlib/ralib/oracles/mto/SecondSDTBranchingTest.java | 2 +- .../de/learnlib/ralib/oracles/mto/UntypedBranchingTest.java | 2 +- 21 files changed, 25 insertions(+), 30 deletions(-) diff --git a/src/main/java/de/learnlib/ralib/ceanalysis/PrefixFinder.java b/src/main/java/de/learnlib/ralib/ceanalysis/PrefixFinder.java index 5382f0a5..a8a897f2 100644 --- a/src/main/java/de/learnlib/ralib/ceanalysis/PrefixFinder.java +++ b/src/main/java/de/learnlib/ralib/ceanalysis/PrefixFinder.java @@ -5,7 +5,6 @@ import java.util.Map; import java.util.Set; -import de.learnlib.ralib.theory.SDT; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -31,6 +30,7 @@ import de.learnlib.ralib.oracles.TreeQueryResult; import de.learnlib.ralib.oracles.mto.SymbolicSuffixRestrictionBuilder; import de.learnlib.ralib.smt.SMTUtil; +import de.learnlib.ralib.theory.SDT; import de.learnlib.ralib.words.DataWords; import de.learnlib.ralib.words.PSymbolInstance; import de.learnlib.ralib.words.ParameterizedSymbol; diff --git a/src/main/java/de/learnlib/ralib/dt/DT.java b/src/main/java/de/learnlib/ralib/dt/DT.java index 318c2be3..961b8b3a 100644 --- a/src/main/java/de/learnlib/ralib/dt/DT.java +++ b/src/main/java/de/learnlib/ralib/dt/DT.java @@ -26,10 +26,10 @@ import de.learnlib.ralib.oracles.TreeOracle; import de.learnlib.ralib.oracles.TreeQueryResult; import de.learnlib.ralib.oracles.mto.OptimizedSymbolicSuffixBuilder; -import de.learnlib.ralib.theory.SDT; -import de.learnlib.ralib.theory.SDTLeaf; import de.learnlib.ralib.oracles.mto.SymbolicSuffixRestrictionBuilder; +import de.learnlib.ralib.theory.SDT; import de.learnlib.ralib.theory.SDTGuard; +import de.learnlib.ralib.theory.SDTLeaf; import de.learnlib.ralib.words.OutputSymbol; import de.learnlib.ralib.words.PSymbolInstance; import de.learnlib.ralib.words.ParameterizedSymbol; diff --git a/src/main/java/de/learnlib/ralib/dt/DTLeaf.java b/src/main/java/de/learnlib/ralib/dt/DTLeaf.java index 21bc3903..87d6a321 100644 --- a/src/main/java/de/learnlib/ralib/dt/DTLeaf.java +++ b/src/main/java/de/learnlib/ralib/dt/DTLeaf.java @@ -29,7 +29,6 @@ import de.learnlib.ralib.data.util.PIVRemappingIterator; import de.learnlib.ralib.learning.LocationComponent; import de.learnlib.ralib.learning.PrefixContainer; -import de.learnlib.ralib.theory.SDT; import de.learnlib.ralib.learning.SymbolicSuffix; import de.learnlib.ralib.learning.ralambda.DiscriminationTree; import de.learnlib.ralib.learning.rastar.RaStar; diff --git a/src/main/java/de/learnlib/ralib/learning/CounterexampleAnalysis.java b/src/main/java/de/learnlib/ralib/learning/CounterexampleAnalysis.java index f16f5bdc..c5291936 100644 --- a/src/main/java/de/learnlib/ralib/learning/CounterexampleAnalysis.java +++ b/src/main/java/de/learnlib/ralib/learning/CounterexampleAnalysis.java @@ -18,7 +18,6 @@ import java.util.Map; -import de.learnlib.ralib.theory.SDT; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -31,6 +30,7 @@ import de.learnlib.ralib.oracles.TreeOracle; import de.learnlib.ralib.oracles.TreeQueryResult; import de.learnlib.ralib.oracles.mto.SymbolicSuffixRestrictionBuilder; +import de.learnlib.ralib.theory.SDT; import de.learnlib.ralib.words.PSymbolInstance; import de.learnlib.ralib.words.ParameterizedSymbol; import gov.nasa.jpf.constraints.api.Expression; diff --git a/src/main/java/de/learnlib/ralib/learning/ralambda/RaLambda.java b/src/main/java/de/learnlib/ralib/learning/ralambda/RaLambda.java index 4ba4120e..e90c0e63 100644 --- a/src/main/java/de/learnlib/ralib/learning/ralambda/RaLambda.java +++ b/src/main/java/de/learnlib/ralib/learning/ralambda/RaLambda.java @@ -34,7 +34,6 @@ import de.learnlib.ralib.learning.QueryStatistics; import de.learnlib.ralib.learning.RaLearningAlgorithm; import de.learnlib.ralib.learning.RaLearningAlgorithmName; -import de.learnlib.ralib.theory.SDT; import de.learnlib.ralib.learning.SymbolicSuffix; import de.learnlib.ralib.learning.rastar.CEAnalysisResult; import de.learnlib.ralib.oracles.Branching; @@ -43,9 +42,9 @@ import de.learnlib.ralib.oracles.TreeOracleFactory; import de.learnlib.ralib.oracles.TreeQueryResult; import de.learnlib.ralib.oracles.mto.OptimizedSymbolicSuffixBuilder; -import de.learnlib.ralib.theory.SDT; import de.learnlib.ralib.oracles.mto.SymbolicSuffixRestrictionBuilder; import de.learnlib.ralib.smt.ConstraintSolver; +import de.learnlib.ralib.theory.SDT; import de.learnlib.ralib.words.PSymbolInstance; import de.learnlib.ralib.words.ParameterizedSymbol; import gov.nasa.jpf.constraints.api.Expression; diff --git a/src/main/java/de/learnlib/ralib/learning/rastar/Cell.java b/src/main/java/de/learnlib/ralib/learning/rastar/Cell.java index fda06ca9..1d76dd77 100644 --- a/src/main/java/de/learnlib/ralib/learning/rastar/Cell.java +++ b/src/main/java/de/learnlib/ralib/learning/rastar/Cell.java @@ -21,10 +21,10 @@ import de.learnlib.ralib.data.PIV; import de.learnlib.ralib.data.SymbolicDataValue.Parameter; import de.learnlib.ralib.data.VarMapping; -import de.learnlib.ralib.theory.SDT; import de.learnlib.ralib.learning.SymbolicSuffix; import de.learnlib.ralib.oracles.TreeOracle; import de.learnlib.ralib.oracles.TreeQueryResult; +import de.learnlib.ralib.theory.SDT; import de.learnlib.ralib.words.PSymbolInstance; import net.automatalib.word.Word; //import org.slf4j.Logger; diff --git a/src/main/java/de/learnlib/ralib/learning/rastar/Component.java b/src/main/java/de/learnlib/ralib/learning/rastar/Component.java index 017289b9..605c3e18 100644 --- a/src/main/java/de/learnlib/ralib/learning/rastar/Component.java +++ b/src/main/java/de/learnlib/ralib/learning/rastar/Component.java @@ -36,11 +36,11 @@ import de.learnlib.ralib.data.util.PIVRemappingIterator; import de.learnlib.ralib.learning.LocationComponent; import de.learnlib.ralib.learning.PrefixContainer; -import de.learnlib.ralib.theory.SDT; import de.learnlib.ralib.learning.SymbolicSuffix; import de.learnlib.ralib.oracles.Branching; import de.learnlib.ralib.oracles.TreeOracle; import de.learnlib.ralib.oracles.mto.SymbolicSuffixRestrictionBuilder; +import de.learnlib.ralib.theory.SDT; import de.learnlib.ralib.words.DataWords; import de.learnlib.ralib.words.InputSymbol; import de.learnlib.ralib.words.PSymbolInstance; diff --git a/src/main/java/de/learnlib/ralib/learning/rastar/Row.java b/src/main/java/de/learnlib/ralib/learning/rastar/Row.java index b996fd01..9b5fdcdb 100644 --- a/src/main/java/de/learnlib/ralib/learning/rastar/Row.java +++ b/src/main/java/de/learnlib/ralib/learning/rastar/Row.java @@ -32,9 +32,9 @@ import de.learnlib.ralib.data.VarMapping; import de.learnlib.ralib.data.util.SymbolicDataValueGenerator.RegisterGenerator; import de.learnlib.ralib.learning.PrefixContainer; -import de.learnlib.ralib.theory.SDT; import de.learnlib.ralib.learning.SymbolicSuffix; import de.learnlib.ralib.oracles.TreeOracle; +import de.learnlib.ralib.theory.SDT; import de.learnlib.ralib.words.InputSymbol; import de.learnlib.ralib.words.OutputSymbol; import de.learnlib.ralib.words.PSymbolInstance; diff --git a/src/main/java/de/learnlib/ralib/oracles/TreeOracle.java b/src/main/java/de/learnlib/ralib/oracles/TreeOracle.java index 9e5b0f07..01984f44 100644 --- a/src/main/java/de/learnlib/ralib/oracles/TreeOracle.java +++ b/src/main/java/de/learnlib/ralib/oracles/TreeOracle.java @@ -19,9 +19,9 @@ import java.util.Map; import de.learnlib.ralib.data.PIV; -import de.learnlib.ralib.theory.SDT; import de.learnlib.ralib.learning.SymbolicSuffix; import de.learnlib.ralib.oracles.mto.SymbolicSuffixRestrictionBuilder; +import de.learnlib.ralib.theory.SDT; import de.learnlib.ralib.words.PSymbolInstance; import de.learnlib.ralib.words.ParameterizedSymbol; import net.automatalib.word.Word; diff --git a/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheorySDTLogicOracle.java b/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheorySDTLogicOracle.java index e7097ce5..9c3d10ac 100644 --- a/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheorySDTLogicOracle.java +++ b/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheorySDTLogicOracle.java @@ -18,7 +18,6 @@ import java.util.Map; -import de.learnlib.ralib.theory.SDT; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -31,10 +30,10 @@ import de.learnlib.ralib.data.SymbolicDataValue.Register; import de.learnlib.ralib.data.SymbolicDataValue.SuffixValue; import de.learnlib.ralib.data.VarMapping; -import de.learnlib.ralib.theory.SDT; import de.learnlib.ralib.oracles.SDTLogicOracle; import de.learnlib.ralib.smt.ConstraintSolver; import de.learnlib.ralib.smt.SMTUtil; +import de.learnlib.ralib.theory.SDT; import de.learnlib.ralib.theory.SDTGuard; import de.learnlib.ralib.words.DataWords; import de.learnlib.ralib.words.PSymbolInstance; diff --git a/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheoryTreeOracle.java b/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheoryTreeOracle.java index 503edfa1..3eb42623 100644 --- a/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheoryTreeOracle.java +++ b/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheoryTreeOracle.java @@ -30,8 +30,6 @@ import com.google.common.collect.Sets; -import de.learnlib.ralib.theory.SDT; -import de.learnlib.ralib.theory.SDTLeaf; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -54,7 +52,6 @@ import de.learnlib.ralib.data.util.SymbolicDataValueGenerator.ParameterGenerator; import de.learnlib.ralib.data.util.SymbolicDataValueGenerator.RegisterGenerator; import de.learnlib.ralib.data.util.SymbolicDataValueGenerator.SuffixValueGenerator; -import de.learnlib.ralib.theory.SDT; import de.learnlib.ralib.learning.SymbolicSuffix; import de.learnlib.ralib.oracles.Branching; import de.learnlib.ralib.oracles.DataWordOracle; @@ -63,7 +60,9 @@ import de.learnlib.ralib.oracles.mto.MultiTheoryBranching.Node; import de.learnlib.ralib.smt.ConstraintSolver; import de.learnlib.ralib.smt.SMTUtil; +import de.learnlib.ralib.theory.SDT; import de.learnlib.ralib.theory.SDTGuard; +import de.learnlib.ralib.theory.SDTLeaf; import de.learnlib.ralib.theory.Theory; import de.learnlib.ralib.words.DataWords; import de.learnlib.ralib.words.PSymbolInstance; diff --git a/src/main/java/de/learnlib/ralib/theory/equality/EqualityTheory.java b/src/main/java/de/learnlib/ralib/theory/equality/EqualityTheory.java index cb07f977..3a6fc26f 100644 --- a/src/main/java/de/learnlib/ralib/theory/equality/EqualityTheory.java +++ b/src/main/java/de/learnlib/ralib/theory/equality/EqualityTheory.java @@ -46,10 +46,10 @@ import de.learnlib.ralib.data.WordValuation; import de.learnlib.ralib.learning.SymbolicSuffix; import de.learnlib.ralib.oracles.io.IOOracle; -import de.learnlib.ralib.theory.SDT; import de.learnlib.ralib.oracles.mto.SDTConstructor; -import de.learnlib.ralib.theory.SDTLeaf; import de.learnlib.ralib.theory.*; +import de.learnlib.ralib.theory.SDT; +import de.learnlib.ralib.theory.SDTLeaf; import de.learnlib.ralib.words.DataWords; import de.learnlib.ralib.words.OutputSymbol; import de.learnlib.ralib.words.PSymbolInstance; diff --git a/src/main/java/de/learnlib/ralib/theory/equality/UniqueEqualityTheory.java b/src/main/java/de/learnlib/ralib/theory/equality/UniqueEqualityTheory.java index a7ca5773..87d5ec51 100644 --- a/src/main/java/de/learnlib/ralib/theory/equality/UniqueEqualityTheory.java +++ b/src/main/java/de/learnlib/ralib/theory/equality/UniqueEqualityTheory.java @@ -9,8 +9,8 @@ import de.learnlib.ralib.data.*; import de.learnlib.ralib.learning.SymbolicSuffix; import de.learnlib.ralib.oracles.io.IOOracle; -import de.learnlib.ralib.theory.SDT; import de.learnlib.ralib.oracles.mto.SDTConstructor; +import de.learnlib.ralib.theory.SDT; import de.learnlib.ralib.theory.SDTGuard; import de.learnlib.ralib.theory.Theory; import de.learnlib.ralib.words.DataWords; diff --git a/src/main/java/de/learnlib/ralib/theory/inequality/InequalityTheoryWithEq.java b/src/main/java/de/learnlib/ralib/theory/inequality/InequalityTheoryWithEq.java index ed820eac..3706db60 100644 --- a/src/main/java/de/learnlib/ralib/theory/inequality/InequalityTheoryWithEq.java +++ b/src/main/java/de/learnlib/ralib/theory/inequality/InequalityTheoryWithEq.java @@ -38,10 +38,10 @@ import de.learnlib.ralib.data.SymbolicDataValue.SuffixValue; import de.learnlib.ralib.data.WordValuation; import de.learnlib.ralib.learning.SymbolicSuffix; -import de.learnlib.ralib.theory.SDT; import de.learnlib.ralib.oracles.mto.SDTConstructor; -import de.learnlib.ralib.theory.SDTLeaf; import de.learnlib.ralib.theory.*; +import de.learnlib.ralib.theory.SDT; +import de.learnlib.ralib.theory.SDTLeaf; import de.learnlib.ralib.words.DataWords; import de.learnlib.ralib.words.PSymbolInstance; import de.learnlib.ralib.words.ParameterizedSymbol; diff --git a/src/test/java/de/learnlib/ralib/dt/RegisterConsistencyTest.java b/src/test/java/de/learnlib/ralib/dt/RegisterConsistencyTest.java index 1e674d2f..fd47d28d 100644 --- a/src/test/java/de/learnlib/ralib/dt/RegisterConsistencyTest.java +++ b/src/test/java/de/learnlib/ralib/dt/RegisterConsistencyTest.java @@ -18,15 +18,14 @@ import de.learnlib.ralib.data.util.SymbolicDataValueGenerator.ParameterGenerator; import de.learnlib.ralib.data.util.SymbolicDataValueGenerator.RegisterGenerator; import de.learnlib.ralib.data.util.SymbolicDataValueGenerator.SuffixValueGenerator; -import de.learnlib.ralib.theory.SDT; import de.learnlib.ralib.learning.SymbolicSuffix; import de.learnlib.ralib.oracles.Branching; import de.learnlib.ralib.oracles.TreeOracle; import de.learnlib.ralib.oracles.TreeQueryResult; -import de.learnlib.ralib.theory.SDT; -import de.learnlib.ralib.theory.SDTLeaf; import de.learnlib.ralib.oracles.mto.SymbolicSuffixRestrictionBuilder; +import de.learnlib.ralib.theory.SDT; import de.learnlib.ralib.theory.SDTGuard; +import de.learnlib.ralib.theory.SDTLeaf; import de.learnlib.ralib.words.InputSymbol; import de.learnlib.ralib.words.PSymbolInstance; import de.learnlib.ralib.words.ParameterizedSymbol; diff --git a/src/test/java/de/learnlib/ralib/example/sdts/LoginExampleSDT.java b/src/test/java/de/learnlib/ralib/example/sdts/LoginExampleSDT.java index 7fd53479..c98bbe27 100644 --- a/src/test/java/de/learnlib/ralib/example/sdts/LoginExampleSDT.java +++ b/src/test/java/de/learnlib/ralib/example/sdts/LoginExampleSDT.java @@ -22,8 +22,8 @@ import de.learnlib.ralib.data.SymbolicDataValue; import de.learnlib.ralib.data.SymbolicDataValue.Register; import de.learnlib.ralib.data.VarMapping; -import de.learnlib.ralib.theory.SDT; import de.learnlib.ralib.learning.SymbolicSuffix; +import de.learnlib.ralib.theory.SDT; import de.learnlib.ralib.theory.SDTLeaf; /** diff --git a/src/test/java/de/learnlib/ralib/example/sdts/LoginExampleTreeOracle.java b/src/test/java/de/learnlib/ralib/example/sdts/LoginExampleTreeOracle.java index b18fae07..25543ca8 100644 --- a/src/test/java/de/learnlib/ralib/example/sdts/LoginExampleTreeOracle.java +++ b/src/test/java/de/learnlib/ralib/example/sdts/LoginExampleTreeOracle.java @@ -35,12 +35,12 @@ import de.learnlib.ralib.data.util.SymbolicDataValueGenerator; import de.learnlib.ralib.data.util.SymbolicDataValueGenerator.RegisterGenerator; import de.learnlib.ralib.example.sdts.LoginExampleSDT.SDTClass; -import de.learnlib.ralib.theory.SDT; import de.learnlib.ralib.learning.SymbolicSuffix; import de.learnlib.ralib.oracles.Branching; import de.learnlib.ralib.oracles.TreeOracle; import de.learnlib.ralib.oracles.TreeQueryResult; import de.learnlib.ralib.oracles.mto.SymbolicSuffixRestrictionBuilder; +import de.learnlib.ralib.theory.SDT; import de.learnlib.ralib.words.DataWords; import de.learnlib.ralib.words.PSymbolInstance; import de.learnlib.ralib.words.ParameterizedSymbol; diff --git a/src/test/java/de/learnlib/ralib/learning/rastar/LoggingOracle.java b/src/test/java/de/learnlib/ralib/learning/rastar/LoggingOracle.java index 25c660ea..50a50276 100644 --- a/src/test/java/de/learnlib/ralib/learning/rastar/LoggingOracle.java +++ b/src/test/java/de/learnlib/ralib/learning/rastar/LoggingOracle.java @@ -20,12 +20,12 @@ import de.learnlib.ralib.data.Constants; import de.learnlib.ralib.data.PIV; -import de.learnlib.ralib.theory.SDT; import de.learnlib.ralib.learning.SymbolicSuffix; import de.learnlib.ralib.oracles.Branching; import de.learnlib.ralib.oracles.TreeOracle; import de.learnlib.ralib.oracles.TreeQueryResult; import de.learnlib.ralib.oracles.mto.SymbolicSuffixRestrictionBuilder; +import de.learnlib.ralib.theory.SDT; import de.learnlib.ralib.words.PSymbolInstance; import de.learnlib.ralib.words.ParameterizedSymbol; import net.automatalib.word.Word; diff --git a/src/test/java/de/learnlib/ralib/oracles/mto/OptimizedSymbolicSuffixBuilderTest.java b/src/test/java/de/learnlib/ralib/oracles/mto/OptimizedSymbolicSuffixBuilderTest.java index a329786a..e1f78ed9 100644 --- a/src/test/java/de/learnlib/ralib/oracles/mto/OptimizedSymbolicSuffixBuilderTest.java +++ b/src/test/java/de/learnlib/ralib/oracles/mto/OptimizedSymbolicSuffixBuilderTest.java @@ -14,7 +14,6 @@ import java.util.Map; import java.util.Set; -import de.learnlib.ralib.theory.*; import org.testng.Assert; import org.testng.annotations.Test; @@ -36,6 +35,7 @@ import de.learnlib.ralib.learning.SymbolicSuffix; import de.learnlib.ralib.oracles.TreeQueryResult; import de.learnlib.ralib.smt.ConstraintSolver; +import de.learnlib.ralib.theory.*; import de.learnlib.ralib.theory.equality.EqualRestriction; import de.learnlib.ralib.tools.theories.IntegerEqualityTheory; import de.learnlib.ralib.words.InputSymbol; diff --git a/src/test/java/de/learnlib/ralib/oracles/mto/SecondSDTBranchingTest.java b/src/test/java/de/learnlib/ralib/oracles/mto/SecondSDTBranchingTest.java index b3fcb6aa..f48f6bda 100644 --- a/src/test/java/de/learnlib/ralib/oracles/mto/SecondSDTBranchingTest.java +++ b/src/test/java/de/learnlib/ralib/oracles/mto/SecondSDTBranchingTest.java @@ -36,13 +36,13 @@ import de.learnlib.ralib.data.SymbolicDataValue.Register; import de.learnlib.ralib.data.VarMapping; import de.learnlib.ralib.data.util.SymbolicDataValueGenerator.RegisterGenerator; -import de.learnlib.ralib.theory.SDT; import de.learnlib.ralib.learning.SymbolicSuffix; import de.learnlib.ralib.oracles.Branching; import de.learnlib.ralib.oracles.TreeQueryResult; import de.learnlib.ralib.smt.ConstraintSolver; import de.learnlib.ralib.sul.DataWordSUL; import de.learnlib.ralib.sul.SimulatorSUL; +import de.learnlib.ralib.theory.SDT; import de.learnlib.ralib.theory.Theory; import de.learnlib.ralib.tools.theories.IntegerEqualityTheory; import de.learnlib.ralib.words.InputSymbol; diff --git a/src/test/java/de/learnlib/ralib/oracles/mto/UntypedBranchingTest.java b/src/test/java/de/learnlib/ralib/oracles/mto/UntypedBranchingTest.java index c256f2da..0eff04d2 100644 --- a/src/test/java/de/learnlib/ralib/oracles/mto/UntypedBranchingTest.java +++ b/src/test/java/de/learnlib/ralib/oracles/mto/UntypedBranchingTest.java @@ -56,13 +56,13 @@ import de.learnlib.ralib.data.VarMapping; import de.learnlib.ralib.data.util.SymbolicDataValueGenerator.ParameterGenerator; import de.learnlib.ralib.data.util.SymbolicDataValueGenerator.RegisterGenerator; -import de.learnlib.ralib.theory.SDT; import de.learnlib.ralib.learning.SymbolicSuffix; import de.learnlib.ralib.oracles.Branching; import de.learnlib.ralib.oracles.TreeQueryResult; import de.learnlib.ralib.smt.ConstraintSolver; import de.learnlib.ralib.sul.DataWordSUL; import de.learnlib.ralib.sul.SimulatorSUL; +import de.learnlib.ralib.theory.SDT; import de.learnlib.ralib.theory.Theory; import de.learnlib.ralib.tools.theories.IntegerEqualityTheory; import de.learnlib.ralib.words.InputSymbol; From 5c803821a61a6ae7992d300be1930450bc9e2774 Mon Sep 17 00:00:00 2001 From: Kostis Sagonas Date: Wed, 26 Feb 2025 09:52:14 +0100 Subject: [PATCH 14/26] Make code base work with Java 17 --- .github/workflows/ci.yml | 4 ++-- pom.xml | 18 ++++++++++++++---- .../de/learnlib/ralib/theory/SDTGuard.java | 10 ++++++++++ 3 files changed, 26 insertions(+), 6 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6d9535a3..2925ff5b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -10,10 +10,10 @@ jobs: steps: - name: Checkout code uses: actions/checkout@v4 - - name: Set up JDK 21 + - name: Set up JDK 17 uses: actions/setup-java@v4 with: - java-version: '21' + java-version: '17' distribution: 'temurin' - name: Compile, check, and run tests run: mvn verify assembly:single diff --git a/pom.xml b/pom.xml index 13c69926..8ac82461 100644 --- a/pom.xml +++ b/pom.xml @@ -12,8 +12,8 @@ UTF-8 - 1.8 - 1.8 + 17 + 17 3.17.0 @@ -123,8 +123,18 @@ org.apache.maven.plugins maven-compiler-plugin - 21 - 21 + 17 + true + + --enable-preview + + + + + org.apache.maven.plugins + maven-surefire-plugin + + --enable-preview diff --git a/src/main/java/de/learnlib/ralib/theory/SDTGuard.java b/src/main/java/de/learnlib/ralib/theory/SDTGuard.java index c7b5f792..1a9eda7a 100644 --- a/src/main/java/de/learnlib/ralib/theory/SDTGuard.java +++ b/src/main/java/de/learnlib/ralib/theory/SDTGuard.java @@ -209,6 +209,8 @@ static Set getComparands(SDTGuard in, SymbolicDataValue dv) { return comparands; case SDTGuard.SDTTrueGuard g: return comparands; + default: // needed only for Java 17? + throw new RuntimeException("should not be reachable"); } } @@ -229,6 +231,8 @@ static SDTGuard copy(SDTGuard in) { g.disjuncts.stream().map( x -> copy(x)).toList()); case SDTGuard.SDTTrueGuard g: return new SDTGuard.SDTTrueGuard(g.parameter); + default: // needed only for Java 17? + throw new RuntimeException("should not be reachable"); } } @@ -257,6 +261,8 @@ static SDTGuard relabel(SDTGuard in, VarMapping remap) { g.disjuncts.stream().map(ig -> relabel(ig, remap)).toList()); case SDTGuard.SDTTrueGuard g: return new SDTGuard.SDTTrueGuard(newValueIfExists(remap, g.parameter)); + default: // needed only for Java 17? + throw new RuntimeException("should not be reachable"); } } @@ -284,6 +290,8 @@ static Expression toExpr(SDTGuard in) { return ExpressionUtil.or(orList.toArray(new Expression[]{})); case SDTGuard.SDTTrueGuard g: return ExpressionUtil.TRUE; + default: // needed only for Java 17? + throw new RuntimeException("should not be reachable"); } } @@ -304,6 +312,8 @@ static SDTGuard toDeqGuard(SDTGuard in) { throw new RuntimeException("not refactored yet"); case SDTGuard.SDTTrueGuard g: throw new RuntimeException("not refactored yet"); + default: // needed only for Java 17? + throw new RuntimeException("should not be reachable"); } } } From 220049862147bf8e3e73ffdf0ccc15197a1292f0 Mon Sep 17 00:00:00 2001 From: Falk Howar Date: Wed, 26 Feb 2025 10:55:56 +0100 Subject: [PATCH 15/26] improve classanalyzer tests --- .../learnlib/ralib/tools/ClassAnalyzer.java | 7 +- .../learnlib/ralib/tools/ConsoleClient.java | 3 + .../ralib/tools/ClassAnalyzerTest.java | 84 +++++ .../ralib/automata/xml/classanalyzer1.xml | 87 +++++ .../ralib/automata/xml/classanalyzer2.xml | 297 ++++++++++++++++++ .../ralib/automata/xml/classanalyzer3.xml | 61 ++++ 6 files changed, 538 insertions(+), 1 deletion(-) create mode 100644 src/test/resources/de/learnlib/ralib/automata/xml/classanalyzer1.xml create mode 100644 src/test/resources/de/learnlib/ralib/automata/xml/classanalyzer2.xml create mode 100644 src/test/resources/de/learnlib/ralib/automata/xml/classanalyzer3.xml diff --git a/src/main/java/de/learnlib/ralib/tools/ClassAnalyzer.java b/src/main/java/de/learnlib/ralib/tools/ClassAnalyzer.java index b02699fc..080d7bdb 100644 --- a/src/main/java/de/learnlib/ralib/tools/ClassAnalyzer.java +++ b/src/main/java/de/learnlib/ralib/tools/ClassAnalyzer.java @@ -124,6 +124,8 @@ public class ClassAnalyzer extends AbstractToolWithRandomWalk { private IOOracle back; + private Hypothesis hyp = null; + private Map teachers; private final Constants consts = new Constants(); @@ -312,7 +314,6 @@ public void run() throws RaLibToolException { ArrayList ceLengths = new ArrayList<>(); ArrayList ceLengthsShortened = new ArrayList<>(); - Hypothesis hyp = null; int rounds = 0; while (maxRounds < 0 || rounds < maxRounds) { @@ -424,4 +425,8 @@ public String help() { } return sb.toString(); } + + public Hypothesis getHypothesis() { + return hyp; + } } diff --git a/src/main/java/de/learnlib/ralib/tools/ConsoleClient.java b/src/main/java/de/learnlib/ralib/tools/ConsoleClient.java index af969671..cf7a029a 100644 --- a/src/main/java/de/learnlib/ralib/tools/ConsoleClient.java +++ b/src/main/java/de/learnlib/ralib/tools/ConsoleClient.java @@ -138,4 +138,7 @@ else if (args.length == 3 && args[1].equals("-f")) { } } + public RaLibTool getTool() { + return tool; + } } diff --git a/src/test/java/de/learnlib/ralib/tools/ClassAnalyzerTest.java b/src/test/java/de/learnlib/ralib/tools/ClassAnalyzerTest.java index 9e30b5b3..d4eaf43e 100644 --- a/src/test/java/de/learnlib/ralib/tools/ClassAnalyzerTest.java +++ b/src/test/java/de/learnlib/ralib/tools/ClassAnalyzerTest.java @@ -16,10 +16,24 @@ */ package de.learnlib.ralib.tools; +import java.util.LinkedHashMap; +import java.util.Map; + import org.testng.Assert; import org.testng.annotations.Test; +import de.learnlib.query.DefaultQuery; import de.learnlib.ralib.RaLibTestSuite; +import de.learnlib.ralib.TestUtil; +import de.learnlib.ralib.automata.RegisterAutomaton; +import de.learnlib.ralib.automata.xml.RegisterAutomatonImporter; +import de.learnlib.ralib.data.DataType; +import de.learnlib.ralib.equivalence.IOEquivalenceTest; +import de.learnlib.ralib.theory.Theory; +import de.learnlib.ralib.tools.theories.DoubleInequalityTheory; +import de.learnlib.ralib.tools.theories.IntegerEqualityTheory; +import de.learnlib.ralib.words.PSymbolInstance; +import de.learnlib.ralib.words.ParameterizedSymbol; /** * @@ -93,7 +107,33 @@ public void classAnalyzerWithFreshValuesTest() { ConsoleClient cl = new ConsoleClient(options); int ret = cl.run(); Assert.assertEquals(ret, 0); + + RegisterAutomaton hyp = ((ClassAnalyzer) cl.getTool()).getHypothesis(); + + RegisterAutomatonImporter loader = TestUtil.getLoader( + "/de/learnlib/ralib/automata/xml/classanalyzer1.xml"); + + ParameterizedSymbol[] actions = loader.getActions().toArray( + new ParameterizedSymbol[]{}); + + final Map teachers = new LinkedHashMap<>(); + loader.getDataTypes().stream().forEach((t) -> { + IntegerEqualityTheory theory = new IntegerEqualityTheory(t); + theory.setUseSuffixOpt(true); + teachers.put(t, theory); + }); + + IOEquivalenceTest check = new IOEquivalenceTest( + loader.getRegisterAutomaton(), teachers, loader.getConstants(), true, actions); + + DefaultQuery ce = check.findCounterExample(hyp, null); + + Assert.assertTrue(ce.toString().contains("__ERR")); + Assert.assertEquals(hyp.getInputStates().size(), 3); + Assert.assertEquals(hyp.getInputTransitions().size(), 7); + } catch (Throwable t) { + t.printStackTrace(); Assert.fail(t.getClass().getName()); } } @@ -126,6 +166,28 @@ public void classAnalyzerInequalitiesTest() { ConsoleClient cl = new ConsoleClient(options); int ret = cl.run(); Assert.assertEquals(ret, 0); + + RegisterAutomaton hyp = ((ClassAnalyzer) cl.getTool()).getHypothesis(); + + RegisterAutomatonImporter loader = TestUtil.getLoader( + "/de/learnlib/ralib/automata/xml/classanalyzer2.xml"); + + ParameterizedSymbol[] actions = loader.getActions().toArray( + new ParameterizedSymbol[]{}); + + final Map teachers = new LinkedHashMap<>(); + loader.getDataTypes().stream().forEach((t) -> { + DoubleInequalityTheory theory = new DoubleInequalityTheory(t); + theory.setUseSuffixOpt(true); + teachers.put(t, theory); + }); + + IOEquivalenceTest check = new IOEquivalenceTest( + loader.getRegisterAutomaton(), teachers, loader.getConstants(), true, actions); + + boolean equiv = check.findCounterExample(hyp, null) == null; + Assert.assertTrue(equiv); + } catch (Throwable t) { Assert.fail(t.getClass().getName()); } @@ -161,6 +223,28 @@ public void classAnalyzerConstantsTest() { ConsoleClient cl = new ConsoleClient(options); int ret = cl.run(); Assert.assertEquals(ret, 0); + + RegisterAutomaton hyp = ((ClassAnalyzer) cl.getTool()).getHypothesis(); + + RegisterAutomatonImporter loader = TestUtil.getLoader( + "/de/learnlib/ralib/automata/xml/classanalyzer3.xml"); + + ParameterizedSymbol[] actions = loader.getActions().toArray( + new ParameterizedSymbol[]{}); + + final Map teachers = new LinkedHashMap<>(); + loader.getDataTypes().stream().forEach((t) -> { + IntegerEqualityTheory theory = new IntegerEqualityTheory(t); + theory.setUseSuffixOpt(true); + teachers.put(t, theory); + }); + + IOEquivalenceTest check = new IOEquivalenceTest( + loader.getRegisterAutomaton(), teachers, loader.getConstants(), true, actions); + + boolean equiv = check.findCounterExample(hyp, null) == null; + Assert.assertTrue(equiv); + } catch (Throwable t) { Assert.fail(t.getClass().getName()); } diff --git a/src/test/resources/de/learnlib/ralib/automata/xml/classanalyzer1.xml b/src/test/resources/de/learnlib/ralib/automata/xml/classanalyzer1.xml new file mode 100644 index 00000000..4c237f0b --- /dev/null +++ b/src/test/resources/de/learnlib/ralib/automata/xml/classanalyzer1.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + 0 + 0 + 0 + + + + + + + + + + + + + + + + + p1 + + + + + + + + __fresh__ + + + + + + + + + + r2 == p1 + + + + r2 != p1 + + + + + + + + + + + + + + r1 + + + + + + + diff --git a/src/test/resources/de/learnlib/ralib/automata/xml/classanalyzer2.xml b/src/test/resources/de/learnlib/ralib/automata/xml/classanalyzer2.xml new file mode 100644 index 00000000..3f91920f --- /dev/null +++ b/src/test/resources/de/learnlib/ralib/automata/xml/classanalyzer2.xml @@ -0,0 +1,297 @@ + + + + + + + + + + + + + + + + + + + + 0 + 0 + 0 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + p1 + + + + + + + + + + + + + + + + p1 > r1 + + p1 + + + + p1 < r1 + + p1 + r1 + + + + r1 == p1 + + + + + r1 + + + + + + + + + + + + + p1 < r1 + + p1 + r1 + r2 + + + + p1 > r2 + + p1 + + + + p1 < r2 && p1 > r1 + + p1 + r2 + + + + r2 == p1 + + + + r1 == p1 + + + + + + + p1 < r1 + + p1 + r1 + + + + p1 > r1 + + p1 + + + + r1 == p1 + + + + + r2 + r1 + + + + + r1 + + + + + + + + + + + + + + + + p1 < r1 + + p1 + r1 + r2 + + + + p1 > r2 + + p1 + + + + p1 < r2 && p1 > r1 + + p1 + r2 + + + + r2 == p1 + + + + r1 == p1 + + + + + + + p1 < r1 + + p1 + r1 + r2 + + + + p1 < r2 && p1 > r1 + + p1 + r2 + + + + r2 == p1 + + + + p1 > r2 + + + + r1 == p1 + + + + + + + p1 < r1 + + p1 + r1 + + + + p1 > r1 + + p1 + + + + r1 == p1 + + + + + + + p1 < r1 + + p1 + r1 + + + + r1 == p1 + + + + p1 > r1 + + + + + + + + r2 + r3 + r1 + + + + + r2 + r1 + + + + + r1 + + + + + r1 + + + + diff --git a/src/test/resources/de/learnlib/ralib/automata/xml/classanalyzer3.xml b/src/test/resources/de/learnlib/ralib/automata/xml/classanalyzer3.xml new file mode 100644 index 00000000..8a4ee002 --- /dev/null +++ b/src/test/resources/de/learnlib/ralib/automata/xml/classanalyzer3.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + 0 + + + 0 + 0 + + + + + + + + + + + + + p1 + + + + + + + + p1 + + + + + + + + + + + + + + r1 + + + + From e7c288d317ea6773ffc573a5108baca8915f0d46 Mon Sep 17 00:00:00 2001 From: Kostis Sagonas Date: Thu, 27 Feb 2025 22:37:40 +0100 Subject: [PATCH 16/26] Remove or comment out some leftover prints --- .../java/de/learnlib/ralib/data/PIVRemappingIteratorTest.java | 3 --- src/test/java/de/learnlib/ralib/theory/TestTreeOracle.java | 4 ++-- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/src/test/java/de/learnlib/ralib/data/PIVRemappingIteratorTest.java b/src/test/java/de/learnlib/ralib/data/PIVRemappingIteratorTest.java index b320d0cd..a5f02869 100644 --- a/src/test/java/de/learnlib/ralib/data/PIVRemappingIteratorTest.java +++ b/src/test/java/de/learnlib/ralib/data/PIVRemappingIteratorTest.java @@ -53,9 +53,6 @@ public void testOneType() { PIV piv1 = generatePIV(new PIV(), type1, 4); PIV piv2 = generatePIV(new PIV(), type1, 4); - - System.out.println("" + piv1); - int count = 0; for (VarMapping unused : new PIVRemappingIterator(piv1, piv2)) { count++; diff --git a/src/test/java/de/learnlib/ralib/theory/TestTreeOracle.java b/src/test/java/de/learnlib/ralib/theory/TestTreeOracle.java index cc1074d7..c8506fe4 100644 --- a/src/test/java/de/learnlib/ralib/theory/TestTreeOracle.java +++ b/src/test/java/de/learnlib/ralib/theory/TestTreeOracle.java @@ -84,8 +84,8 @@ public void testTreeOracle() { // symbolic data values: s1, s2 (userType, passType) final SymbolicSuffix symSuffix = new SymbolicSuffix(prefix, suffix); - System.out.println("Prefix: " + prefix); - System.out.println("Suffix: " + symSuffix); + //System.out.println("Prefix: " + prefix); + //System.out.println("Suffix: " + symSuffix); // hacked oracle From 7d4384fe0c935f9ce5f249f1a3ed0b6cff8621d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20T=C3=A5quist?= Date: Mon, 10 Mar 2025 15:24:38 +0100 Subject: [PATCH 17/26] add bijection class and new sdt equivalence implementation --- .../de/learnlib/ralib/data/Bijection.java | 145 ++++++++++++++++++ .../java/de/learnlib/ralib/theory/SDT.java | 111 ++++++++++++++ .../de/learnlib/ralib/data/BijectionTest.java | 84 ++++++++++ .../ralib/theory/SDTEquivalenceTest.java | 113 ++++++++++++++ 4 files changed, 453 insertions(+) create mode 100644 src/main/java/de/learnlib/ralib/data/Bijection.java create mode 100644 src/test/java/de/learnlib/ralib/data/BijectionTest.java create mode 100644 src/test/java/de/learnlib/ralib/theory/SDTEquivalenceTest.java diff --git a/src/main/java/de/learnlib/ralib/data/Bijection.java b/src/main/java/de/learnlib/ralib/data/Bijection.java new file mode 100644 index 00000000..5e246a39 --- /dev/null +++ b/src/main/java/de/learnlib/ralib/data/Bijection.java @@ -0,0 +1,145 @@ +package de.learnlib.ralib.data; + +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; +import java.util.Map; +import java.util.Set; + +import de.learnlib.ralib.data.SymbolicDataValue.Register; + +public class Bijection implements Map { + + private final Map injection; + private final Map surjection; + + public Bijection() { + injection = new LinkedHashMap<>(); + surjection = new LinkedHashMap<>(); + } + + public Bijection(Map map) { + this(); + putAll(injection, surjection, map); + } + + @Override + public int size() { + return injection.size(); + } + + @Override + public boolean isEmpty() { + return injection.isEmpty(); + } + + @Override + public boolean containsKey(Object key) { + return injection.containsKey(key); + } + + @Override + public boolean containsValue(Object value) { + return surjection.containsKey(value); + } + + @Override + public Register get(Object key) { + return injection.get(key); + } + + @Override + public Register remove(Object key) { + Register val = get(key); + injection.remove(key); + surjection.remove(val); + return val; + } + + @Override + public void clear() { + injection.clear(); + surjection.clear(); + } + + @Override + public Set keySet() { + return new LinkedHashSet<>(injection.keySet()); + } + + @Override + public Set> entrySet() { + return new LinkedHashSet<>(injection.entrySet()); + } + + @Override + public Register put(Register key, Register value) { + Register existingVal = injection.get(key); + if (existingVal != null && !existingVal.equals(value)) { + remove(key); + } + injection.put(key, value); + surjection.put(value, key); + return existingVal; + } + + @Override + public void putAll(Map map) { + Bijection.putAll(injection, surjection, map); + } + + @Override + public Set values() { + return new LinkedHashSet<>(injection.values()); + } + + public Bijection inverse() { + Bijection bi = new Bijection(); + for (Map.Entry e : injection.entrySet()) { + bi.put(e.getValue(), e.getKey()); + } + return bi; + } + + public Bijection compose(Bijection other) { + Bijection composition = new Bijection(); + for (Map.Entry entry : entrySet()) { + Register val = other.get(entry.getValue()); + if (val == null) { + throw new IllegalArgumentException("Registers mismatch"); + } + composition.put(entry.getKey(), val); + } + return composition; + } + + public VarMapping toVarMapping() { + VarMapping vars = new VarMapping<>(); + vars.putAll(injection); + return vars; + } + + public String toString() { + return injection.toString(); + } + + private static void putAll(Map in, + Map sur, + Map map) { + Set values = new LinkedHashSet<>(map.values()); + if (map.keySet().size() != values.size()) { + throw new IllegalArgumentException("Mismatched size of keyset and valueset"); + } + for (Map.Entry e : map.entrySet()) { + Register key = e.getKey(); + Register val = e.getValue(); + + Register existingVal = in.get(key); + if (existingVal != null && !existingVal.equals(val)) { + sur.remove(val); + } + + in.put(key, val); + sur.put(val, key); + } + } +} diff --git a/src/main/java/de/learnlib/ralib/theory/SDT.java b/src/main/java/de/learnlib/ralib/theory/SDT.java index 872ed271..2a4448e1 100644 --- a/src/main/java/de/learnlib/ralib/theory/SDT.java +++ b/src/main/java/de/learnlib/ralib/theory/SDT.java @@ -25,12 +25,15 @@ import java.util.Map.Entry; import java.util.Set; +import de.learnlib.ralib.data.Bijection; import de.learnlib.ralib.data.Constants; import de.learnlib.ralib.data.DataValue; import de.learnlib.ralib.data.Mapping; import de.learnlib.ralib.data.SymbolicDataValue; import de.learnlib.ralib.data.SymbolicDataValue.Register; import de.learnlib.ralib.data.VarMapping; +import de.learnlib.ralib.data.util.RemappingIterator; +import de.learnlib.ralib.smt.ConstraintSolver; import de.learnlib.ralib.smt.SMTUtil; import gov.nasa.jpf.constraints.api.Expression; import gov.nasa.jpf.constraints.util.ExpressionUtil; @@ -431,4 +434,112 @@ public SDT copy() { return new SDT(cc); } + /** + * Returns true if other is semantically equivalent to this + */ + public boolean isEquivalent(SDT other, ConstraintSolver solver) { + Set registers = getRegisters(); + Set otherRegisters = other.getRegisters(); + if (registers.size() != otherRegisters.size() || + !registers.containsAll(otherRegisters)) { + return false; + } + + Map, Boolean> paths = this.getGuardExpressions(null); + Map, Boolean> otherPaths = other.getGuardExpressions(null); + for (Map.Entry, Boolean> entry : paths.entrySet()) { + Expression upath = entry.getKey(); + boolean acc = entry.getValue(); + for (Map.Entry, Boolean> otherEntry : otherPaths.entrySet()) { + if (otherEntry.getValue() == !acc) { + Expression con = ExpressionUtil.and(upath, otherEntry.getKey()); + if (solver.isSatisfiable(con, new Mapping<>())) { + return false; + } + } + } + } + return true; + } + + /** + * Returns a bijection b such that b and bi agree on the registers in the intersection + * of their domains and such that sdt1 and sdt2 are equivalent under b. + * Returns null if no such bijection can be found. + * + * @param sdt1 + * @param sdt2 + * @param bi + * @param solver + * @return + */ + public static Bijection equivalentUnderBijection(SDT sdt1, SDT sdt2, Bijection bi, ConstraintSolver solver) { + sdt1 = sdt1.relabel(bi.toVarMapping()); + Set regs1 = sdt1.getRegisters(); + Set regs2 = sdt2.getRegisters(); + + if (regs1.size() != regs2.size()) { + return null; + } + + if (regs1.containsAll(regs2)) { + return sdt1.isEquivalent(sdt2, solver) ? bi : null; + } + + Set replace = new LinkedHashSet<>(regs1); + replace.removeAll(bi.values()); + Set by = new LinkedHashSet<>(regs2); + by.removeAll(bi.values()); + + RemappingIterator it = new RemappingIterator(replace, by); + while (it.hasNext()) { + Bijection vars = it.next(); + if (sdt2.isEquivalent(sdt1.relabel(vars.toVarMapping()), solver)) { + Bijection b = new Bijection(); + b.putAll(bi); + b.putAll(vars); + return b; + } + } + + return null; + } + + /** + * Returns a bijection b such that sdt1 and sdt2 are semantically equivalent under b + * + * @param sdt1 + * @param sdt2 + * @param solver + * @return + */ + public static Bijection equivalentUnderBijection(SDT sdt1, SDT sdt2, ConstraintSolver solver) { + return equivalentUnderBijection(sdt1, sdt2, new Bijection(), solver); + } + + /** + * Returns true if sdt1 and sdt2 are semantically equivalent + * + * @param sdt1 + * @param sdt2 + * @param solver + * @return + */ + public static boolean equivalentUnderId(SDT sdt1, SDT sdt2, ConstraintSolver solver) { + return sdt1.isEquivalent(sdt2, solver); + } + + /** + * Returns the set of registers of used by the sdts + * + * @param sdts + * @return + */ + public static Set registersOf(SDT ... sdts) { + Set regs = new LinkedHashSet<>(); + for (SDT sdt : sdts) { + regs.addAll(sdt.getRegisters()); + } + return regs; + } } diff --git a/src/test/java/de/learnlib/ralib/data/BijectionTest.java b/src/test/java/de/learnlib/ralib/data/BijectionTest.java new file mode 100644 index 00000000..5e6be7d2 --- /dev/null +++ b/src/test/java/de/learnlib/ralib/data/BijectionTest.java @@ -0,0 +1,84 @@ +package de.learnlib.ralib.data; + +import java.util.LinkedHashMap; +import java.util.Map; + +import org.testng.Assert; +import org.testng.annotations.Test; + +import de.learnlib.ralib.RaLibTestSuite; +import de.learnlib.ralib.data.SymbolicDataValue.Register; + +public class BijectionTest extends RaLibTestSuite { + + private static final DataType DT = new DataType("type"); + + @Test + public void testBijection() { + Register r1 = new Register(DT, 1); + Register r2 = new Register(DT, 2); + Register r3 = new Register(DT, 3); + + Bijection bi1 = new Bijection(); + bi1.put(r1, r2); + bi1.put(r2, r1); + + Assert.assertTrue(bi1.get(r1).equals(r2)); + Assert.assertTrue(bi1.get(r2).equals(r1)); + + bi1.put(r2, r3); + Assert.assertTrue(bi1.get(r1).equals(r2)); + Assert.assertTrue(bi1.get(r2).equals(r3)); + + Bijection bi2 = bi1.inverse(); + Assert.assertTrue(bi2.get(r2).equals(r1)); + Assert.assertTrue(bi2.get(r3).equals(r2)); + + Bijection bi3 = new Bijection(); + bi3.putAll(bi2); + Assert.assertTrue(bi3.get(r2).equals(r1)); + Assert.assertTrue(bi3.get(r3).equals(r2)); + } + + @Test + public void testCompose() { + Register r1 = new Register(DT, 1); + Register r2 = new Register(DT, 2); + Register r3 = new Register(DT, 3); + Register r4 = new Register(DT, 4); + + Bijection bi1 = new Bijection(); + bi1.put(r1, r2); + bi1.put(r2, r3); + + Bijection bi2 = new Bijection(); + bi2.put(r2, r3); + bi2.put(r3, r4); + + Bijection composition = bi1.compose(bi2); + Assert.assertEquals(composition.size(), 2); + Assert.assertTrue(composition.get(r1).equals(r3)); + Assert.assertTrue(composition.get(r2).equals(r4)); + } + + @Test + public void testException() { + Register r1 = new Register(DT, 1); + Register r2 = new Register(DT, 2); + Register r3 = new Register(DT, 3); + + Map map = new LinkedHashMap<>(); + map.put(r1, r3); + map.put(r2, r3); + + Bijection bi = new Bijection(); + boolean exceptionCaught = false; + try { + bi.putAll(map); + } catch(Exception e) { + exceptionCaught = true; + } + + Assert.assertTrue(exceptionCaught); + } +} diff --git a/src/test/java/de/learnlib/ralib/theory/SDTEquivalenceTest.java b/src/test/java/de/learnlib/ralib/theory/SDTEquivalenceTest.java new file mode 100644 index 00000000..1676f747 --- /dev/null +++ b/src/test/java/de/learnlib/ralib/theory/SDTEquivalenceTest.java @@ -0,0 +1,113 @@ +package de.learnlib.ralib.theory; + +import java.util.Map; + +import org.testng.Assert; +import org.testng.annotations.Test; + +import de.learnlib.ralib.RaLibTestSuite; +import de.learnlib.ralib.data.Bijection; +import de.learnlib.ralib.data.DataType; +import de.learnlib.ralib.data.SymbolicDataValue.Register; +import de.learnlib.ralib.data.SymbolicDataValue.SuffixValue; +import de.learnlib.ralib.smt.ConstraintSolver; + +public class SDTEquivalenceTest extends RaLibTestSuite { + + private static DataType DT = new DataType("int"); + + @Test + public void testEquivalence() { + ConstraintSolver solver = new ConstraintSolver(); + + SuffixValue s1 = new SuffixValue(DT, 1); + SuffixValue s2 = new SuffixValue(DT, 2); + Register r1 = new Register(DT, 1); + Register r2 = new Register(DT, 2); + + SDT sdt1 = new SDT(Map.of( + new SDTGuard.EqualityGuard(s1, r1), SDTLeaf.ACCEPTING, + new SDTGuard.DisequalityGuard(s1, r1), SDTLeaf.REJECTING)); + SDT sdt2 = new SDT(Map.of( + new SDTGuard.EqualityGuard(s1, r1), SDTLeaf.ACCEPTING, + new SDTGuard.DisequalityGuard(s1, r1), SDTLeaf.REJECTING)); + SDT sdt3 = new SDT(Map.of( + new SDTGuard.IntervalGuard(s1, null, r1), SDTLeaf.REJECTING, + new SDTGuard.EqualityGuard(s1, r1), SDTLeaf.ACCEPTING, + new SDTGuard.IntervalGuard(s1, r1, null), SDTLeaf.REJECTING)); + + boolean equiv1 = sdt1.isEquivalent(sdt2, solver); + boolean equiv2 = sdt1.isEquivalent(sdt3, solver); + boolean equiv3 = sdt2.isEquivalent(sdt3, solver); + + Assert.assertTrue(equiv1); + Assert.assertTrue(equiv2); + Assert.assertTrue(equiv3); + + SDT sdt4 = new SDT(Map.of( + new SDTGuard.EqualityGuard(s1, r1), new SDT(Map.of( + new SDTGuard.EqualityGuard(s2, r2), SDTLeaf.ACCEPTING, + new SDTGuard.DisequalityGuard(s2, r2), SDTLeaf.REJECTING)), + new SDTGuard.DisequalityGuard(s1, r1), new SDT(Map.of( + new SDTGuard.EqualityGuard(s2, r2), SDTLeaf.REJECTING, + new SDTGuard.DisequalityGuard(s2, r2), SDTLeaf.ACCEPTING)))); + SDT sdt5 = new SDT(Map.of( + new SDTGuard.EqualityGuard(s1, r1), new SDT(Map.of( + new SDTGuard.SDTTrueGuard(s2), SDTLeaf.REJECTING)), + new SDTGuard.DisequalityGuard(s1, r1), new SDT(Map.of( + new SDTGuard.EqualityGuard(s2, r2), SDTLeaf.REJECTING, + new SDTGuard.DisequalityGuard(s2, r2), SDTLeaf.ACCEPTING)))); + + boolean equiv4 = sdt4.isEquivalent(sdt5, solver); + Assert.assertFalse(equiv4); + } + + @Test + public void testEquivalenceUnderBijection() { + ConstraintSolver solver = new ConstraintSolver(); + + SuffixValue s1 = new SuffixValue(DT, 1); + SuffixValue s2 = new SuffixValue(DT, 2); + Register r1 = new Register(DT, 1); + Register r2 = new Register(DT, 2); + Register r3 = new Register(DT, 3); + Register r4 = new Register(DT, 4); + + SDT sdt1 = new SDT(Map.of( + new SDTGuard.EqualityGuard(s1, r1), new SDT(Map.of( + new SDTGuard.EqualityGuard(s2, r2), SDTLeaf.ACCEPTING, + new SDTGuard.DisequalityGuard(s2, r2), SDTLeaf.REJECTING)), + new SDTGuard.DisequalityGuard(s1, r1), new SDT(Map.of( + new SDTGuard.EqualityGuard(s2, r2), SDTLeaf.REJECTING, + new SDTGuard.DisequalityGuard(s2, r2), SDTLeaf.ACCEPTING)))); + SDT sdt2 = new SDT(Map.of( + new SDTGuard.EqualityGuard(s1, r3), new SDT(Map.of( + new SDTGuard.EqualityGuard(s2, r4), SDTLeaf.ACCEPTING, + new SDTGuard.DisequalityGuard(s2, r4), SDTLeaf.REJECTING)), + new SDTGuard.DisequalityGuard(s1, r3), new SDT(Map.of( + new SDTGuard.EqualityGuard(s2, r4), SDTLeaf.REJECTING, + new SDTGuard.DisequalityGuard(s2, r4), SDTLeaf.ACCEPTING)))); + + Bijection bijection1 = new Bijection(); + bijection1.put(r1, r3); + bijection1.put(r2, r4); + Bijection bijection2 = new Bijection(); + bijection2.put(r1, r3); + + Bijection bi1 = SDT.equivalentUnderBijection(sdt1, sdt2, solver); + Bijection bi2 = SDT.equivalentUnderBijection(sdt1, sdt2, bijection1, solver); + Bijection bi3 = SDT.equivalentUnderBijection(sdt1, sdt2, bijection2, solver); + + Assert.assertEquals(bi1.size(), 2); + Assert.assertEquals(bi1.size(), 2); + Assert.assertTrue(bi1.get(r1).equals(r3)); + + Assert.assertEquals(bi2.size(), 2); + Assert.assertEquals(bi2.size(), 2); + Assert.assertTrue(bi2.get(r1).equals(r3)); + + Assert.assertEquals(bi3.size(), 2); + Assert.assertEquals(bi3.size(), 2); + Assert.assertTrue(bi3.get(r1).equals(r3)); + } +} From 21bf79edffac5e6364369905a3d0144e42c6d433 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20T=C3=A5quist?= Date: Mon, 10 Mar 2025 15:26:53 +0100 Subject: [PATCH 18/26] add class missing in previous commit --- .../ralib/data/util/RemappingIterator.java | 72 +++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 src/main/java/de/learnlib/ralib/data/util/RemappingIterator.java diff --git a/src/main/java/de/learnlib/ralib/data/util/RemappingIterator.java b/src/main/java/de/learnlib/ralib/data/util/RemappingIterator.java new file mode 100644 index 00000000..39be4733 --- /dev/null +++ b/src/main/java/de/learnlib/ralib/data/util/RemappingIterator.java @@ -0,0 +1,72 @@ +package de.learnlib.ralib.data.util; + +import java.util.Iterator; +import java.util.Set; + +import de.learnlib.ralib.data.Bijection; +import de.learnlib.ralib.data.SymbolicDataValue.Register; +import de.learnlib.ralib.data.VarMapping; + +public class RemappingIterator implements Iterable, Iterator { + + private final PermutationIterator permit; + private final Register[] replace; + private final Register[] by; + + private int[] next; + + public RemappingIterator(Set replace, Set by) { + assert by.size() >= replace.size(); + this.replace = replace.toArray(new Register[replace.size()]); + this.by = by.toArray(new Register[by.size()]); + permit = new PermutationIterator(by.size()); + + next = replace.size() > 0 ? advance(this.replace, this.by, permit) : new int[0]; + } + + @Override + public boolean hasNext() { + return next != null; + } + + @Override +// public VarMapping next() { + public Bijection next() { + assert next != null : "No more permutations"; + VarMapping vars = new VarMapping<>(); + for (int i = 0; i < replace.length; i++) { + int index = next[i]; + vars.put(replace[i], by[index]); + } + + next = advance(replace, by, permit); + + return new Bijection(vars); + } + + @Override + public Iterator iterator() { + return this; + } + + private static boolean isValidPermutation(Register[] replace, Register[] by, int[] permutation) { + for (int i = 0; i < permutation.length; i++) { + int index = permutation[i]; + if (!replace[i].getDataType().equals(by[index].getDataType())) { + return false; + } + } + return true; + } + + private static int[] advance(Register[] replace, Register[] by, PermutationIterator permit) { + int[] next = null; + while (permit.hasNext()) { + next = permit.next(); + if (isValidPermutation(replace, by, next)) { + break; + } + } + return next; + } +} From 7e4016dd1fca54bf5b7cadd2501ae5bfa0f3105e Mon Sep 17 00:00:00 2001 From: Falk Howar Date: Tue, 11 Mar 2025 12:23:48 +0100 Subject: [PATCH 19/26] fix mappings and valuations --- .../learnlib/ralib/automata/Assignment.java | 4 +- .../automata/MutableRegisterAutomaton.java | 20 ++--- .../ralib/automata/RegisterAutomaton.java | 10 +-- .../learnlib/ralib/automata/Transition.java | 8 +- .../ralib/automata/output/OutputMapping.java | 2 +- .../automata/output/OutputTransition.java | 10 +-- .../xml/RegisterAutomatonImporter.java | 4 +- .../ralib/ceanalysis/PrefixFinder.java | 6 +- .../de/learnlib/ralib/data/DataValue.java | 3 +- .../java/de/learnlib/ralib/data/Mapping.java | 33 +++---- ...Valuation.java => ParameterValuation.java} | 32 +++---- ...rValuation.java => RegisterValuation.java} | 12 ++- .../learnlib/ralib/data/SuffixValuation.java | 1 - .../ralib/data/SymbolicDataValue.java | 23 ++--- .../de/learnlib/ralib/data/TypedValue.java | 21 +++++ .../de/learnlib/ralib/data/VarMapping.java | 88 ++----------------- src/main/java/de/learnlib/ralib/dt/DTHyp.java | 8 +- .../java/de/learnlib/ralib/dt/DTLeaf.java | 7 +- .../ralib/equivalence/IOEquivalenceTest.java | 48 +++++----- .../ralib/equivalence/RAEquivalenceTest.java | 36 ++++---- .../ralib/learning/AutomatonBuilder.java | 8 +- .../learnlib/ralib/learning/Hypothesis.java | 10 +-- .../learnlib/ralib/learning/SymbolicWord.java | 4 +- .../oracles/mto/MultiTheoryBranching.java | 14 +-- .../oracles/mto/MultiTheoryTreeOracle.java | 38 ++++---- .../de/learnlib/ralib/sul/SimulatorSUL.java | 16 ++-- .../java/de/learnlib/ralib/theory/Theory.java | 4 +- .../ralib/theory/equality/EqualityTheory.java | 6 +- .../theory/equality/UniqueEqualityTheory.java | 2 +- .../inequality/InequalityTheoryWithEq.java | 12 +-- .../de/learnlib/ralib/words/DataWords.java | 12 +-- .../ralib/example/sdts/LoginExampleSDT.java | 4 +- 32 files changed, 207 insertions(+), 299 deletions(-) rename src/main/java/de/learnlib/ralib/data/{ParValuation.java => ParameterValuation.java} (60%) rename src/main/java/de/learnlib/ralib/data/{VarValuation.java => RegisterValuation.java} (75%) create mode 100644 src/main/java/de/learnlib/ralib/data/TypedValue.java diff --git a/src/main/java/de/learnlib/ralib/automata/Assignment.java b/src/main/java/de/learnlib/ralib/automata/Assignment.java index dfc114b1..0fb24ea9 100644 --- a/src/main/java/de/learnlib/ralib/automata/Assignment.java +++ b/src/main/java/de/learnlib/ralib/automata/Assignment.java @@ -37,8 +37,8 @@ public Assignment(VarMapping assignment) this.assignment = assignment; } - public VarValuation compute(VarValuation registers, ParValuation parameters, Constants consts) { - VarValuation val = new VarValuation(); + public RegisterValuation compute(RegisterValuation registers, ParameterValuation parameters, Constants consts) { + RegisterValuation val = new RegisterValuation(); List rNames = assignment.keySet().stream().map(k -> k.getName()).toList(); for (Entry e : registers.entrySet()) { if (!rNames.contains(e.getKey().getName())) { diff --git a/src/main/java/de/learnlib/ralib/automata/MutableRegisterAutomaton.java b/src/main/java/de/learnlib/ralib/automata/MutableRegisterAutomaton.java index 918c5a25..9604c225 100644 --- a/src/main/java/de/learnlib/ralib/automata/MutableRegisterAutomaton.java +++ b/src/main/java/de/learnlib/ralib/automata/MutableRegisterAutomaton.java @@ -23,8 +23,8 @@ import java.util.Set; import de.learnlib.ralib.data.Constants; -import de.learnlib.ralib.data.ParValuation; -import de.learnlib.ralib.data.VarValuation; +import de.learnlib.ralib.data.ParameterValuation; +import de.learnlib.ralib.data.RegisterValuation; import de.learnlib.ralib.words.PSymbolInstance; import de.learnlib.ralib.words.ParameterizedSymbol; import net.automatalib.automaton.MutableDeterministic; @@ -47,7 +47,7 @@ public class MutableRegisterAutomaton extends RegisterAutomaton private final Set locations = new LinkedHashSet<>(); - public MutableRegisterAutomaton(Constants consts, VarValuation initialRegisters) { + public MutableRegisterAutomaton(Constants consts, RegisterValuation initialRegisters) { super(initialRegisters); this.constants = consts; } @@ -87,12 +87,12 @@ public Collection getStates() { } protected List getTransitions(Word dw) { - VarValuation vars = new VarValuation(getInitialRegisters()); + RegisterValuation vars = RegisterValuation.copyOf(getInitialRegisters()); RALocation current = initial; List tseq = new ArrayList<>(); for (PSymbolInstance psi : dw) { - ParValuation pars = new ParValuation(psi); + ParameterValuation pars = ParameterValuation.fromPSymbolInstance(psi); Collection candidates = current.getOut(psi.getBaseSymbol()); @@ -119,13 +119,13 @@ protected List getTransitions(Word dw) { return tseq; } - protected List> getTransitionsAndValuations(Word dw) { - VarValuation vars = new VarValuation(getInitialRegisters()); + protected List> getTransitionsAndValuations(Word dw) { + RegisterValuation vars = RegisterValuation.copyOf(getInitialRegisters()); RALocation current = initial; - List> tvseq = new ArrayList<>(); + List> tvseq = new ArrayList<>(); for (PSymbolInstance psi : dw) { - ParValuation pars = new ParValuation(psi); + ParameterValuation pars = ParameterValuation.fromPSymbolInstance(psi); Collection candidates = current.getOut(psi.getBaseSymbol()); @@ -139,7 +139,7 @@ protected List> getTransitionsAndValuations(Word

{ - private final VarValuation initialRegisters; + private final RegisterValuation initialRegisters; - public RegisterAutomaton(VarValuation initialRegisters) { + public RegisterAutomaton(RegisterValuation initialRegisters) { this.initialRegisters = initialRegisters; } public RegisterAutomaton() { - this(new VarValuation()); + this(new RegisterValuation()); } @@ -75,7 +75,7 @@ public String toString() { /** * @return the initialRegisters */ - public VarValuation getInitialRegisters() { + public RegisterValuation getInitialRegisters() { return initialRegisters; } diff --git a/src/main/java/de/learnlib/ralib/automata/Transition.java b/src/main/java/de/learnlib/ralib/automata/Transition.java index 9310ca8b..ef7d6f72 100644 --- a/src/main/java/de/learnlib/ralib/automata/Transition.java +++ b/src/main/java/de/learnlib/ralib/automata/Transition.java @@ -17,8 +17,8 @@ package de.learnlib.ralib.automata; import de.learnlib.ralib.data.Constants; -import de.learnlib.ralib.data.ParValuation; -import de.learnlib.ralib.data.VarValuation; +import de.learnlib.ralib.data.ParameterValuation; +import de.learnlib.ralib.data.RegisterValuation; import de.learnlib.ralib.smt.SMTUtil; import de.learnlib.ralib.words.ParameterizedSymbol; import gov.nasa.jpf.constraints.api.Expression; @@ -49,11 +49,11 @@ public Transition(ParameterizedSymbol label, Expression guard, this.assignment = assignment; } - public boolean isEnabled(VarValuation registers, ParValuation parameters, Constants consts) { + public boolean isEnabled(RegisterValuation registers, ParameterValuation parameters, Constants consts) { return guard.evaluateSMT(SMTUtil.compose(registers, parameters, consts)); } - public VarValuation execute(VarValuation registers, ParValuation parameters, Constants consts) { + public RegisterValuation execute(RegisterValuation registers, ParameterValuation parameters, Constants consts) { return this.getAssignment().compute(registers, parameters, consts); } diff --git a/src/main/java/de/learnlib/ralib/automata/output/OutputMapping.java b/src/main/java/de/learnlib/ralib/automata/output/OutputMapping.java index 3071113e..00b5ff27 100644 --- a/src/main/java/de/learnlib/ralib/automata/output/OutputMapping.java +++ b/src/main/java/de/learnlib/ralib/automata/output/OutputMapping.java @@ -56,7 +56,7 @@ public OutputMapping(Parameter fresh) { } public OutputMapping(Parameter key, Register value) { - this(new ArrayList(), new VarMapping(key, value)); + this(new ArrayList(), VarMapping.fromPair(key, value)); } public OutputMapping(VarMapping outputs) { diff --git a/src/main/java/de/learnlib/ralib/automata/output/OutputTransition.java b/src/main/java/de/learnlib/ralib/automata/output/OutputTransition.java index e74518ae..51904a8c 100644 --- a/src/main/java/de/learnlib/ralib/automata/output/OutputTransition.java +++ b/src/main/java/de/learnlib/ralib/automata/output/OutputTransition.java @@ -23,12 +23,12 @@ import de.learnlib.ralib.automata.Transition; import de.learnlib.ralib.data.Constants; import de.learnlib.ralib.data.DataValue; -import de.learnlib.ralib.data.ParValuation; +import de.learnlib.ralib.data.ParameterValuation; +import de.learnlib.ralib.data.RegisterValuation; import de.learnlib.ralib.data.SymbolicDataValue; import de.learnlib.ralib.data.SymbolicDataValue.Constant; import de.learnlib.ralib.data.SymbolicDataValue.Parameter; import de.learnlib.ralib.data.SymbolicDataValue.Register; -import de.learnlib.ralib.data.VarValuation; import de.learnlib.ralib.smt.SMTUtil; import de.learnlib.ralib.words.OutputSymbol; import gov.nasa.jpf.constraints.api.Expression; @@ -55,13 +55,13 @@ public OutputTransition(OutputMapping output, OutputSymbol label, RALocation sou this(ExpressionUtil.TRUE, output, label, source, destination, assignment); } - public boolean canBeEnabled(VarValuation registers, Constants consts) { + public boolean canBeEnabled(RegisterValuation registers, Constants consts) { // FIXME: this is not in general safe to do!! (We assume the guard to not have parameters) - return this.guard.evaluateSMT(SMTUtil.compose(registers, new ParValuation(), consts)); + return this.guard.evaluateSMT(SMTUtil.compose(registers, new ParameterValuation(), consts)); } @Override - public boolean isEnabled(VarValuation registers, ParValuation parameters, Constants consts) { + public boolean isEnabled(RegisterValuation registers, ParameterValuation parameters, Constants consts) { // check freshness of parameters ... for (Parameter p : output.getFreshParameters()) { diff --git a/src/main/java/de/learnlib/ralib/automata/xml/RegisterAutomatonImporter.java b/src/main/java/de/learnlib/ralib/automata/xml/RegisterAutomatonImporter.java index c75db856..b38a1ccf 100644 --- a/src/main/java/de/learnlib/ralib/automata/xml/RegisterAutomatonImporter.java +++ b/src/main/java/de/learnlib/ralib/automata/xml/RegisterAutomatonImporter.java @@ -43,12 +43,12 @@ import de.learnlib.ralib.data.Constants; import de.learnlib.ralib.data.DataType; import de.learnlib.ralib.data.DataValue; +import de.learnlib.ralib.data.RegisterValuation; import de.learnlib.ralib.data.SymbolicDataValue; import de.learnlib.ralib.data.SymbolicDataValue.Constant; import de.learnlib.ralib.data.SymbolicDataValue.Parameter; import de.learnlib.ralib.data.SymbolicDataValue.Register; import de.learnlib.ralib.data.VarMapping; -import de.learnlib.ralib.data.VarValuation; import de.learnlib.ralib.data.util.SymbolicDataValueGenerator.ConstantGenerator; import de.learnlib.ralib.data.util.SymbolicDataValueGenerator.ParameterGenerator; import de.learnlib.ralib.data.util.SymbolicDataValueGenerator.RegisterGenerator; @@ -76,7 +76,7 @@ public class RegisterAutomatonImporter { // TRUE input locations, FALSE output locations private final Map locationTypeMap = new LinkedHashMap<>(); - private final VarValuation initialRegs = new VarValuation(); + private final RegisterValuation initialRegs = new RegisterValuation(); private final Constants consts = new Constants(); private MutableRegisterAutomaton iora; diff --git a/src/main/java/de/learnlib/ralib/ceanalysis/PrefixFinder.java b/src/main/java/de/learnlib/ralib/ceanalysis/PrefixFinder.java index a8a897f2..36a18253 100644 --- a/src/main/java/de/learnlib/ralib/ceanalysis/PrefixFinder.java +++ b/src/main/java/de/learnlib/ralib/ceanalysis/PrefixFinder.java @@ -15,7 +15,7 @@ import de.learnlib.ralib.data.DataValue; import de.learnlib.ralib.data.Mapping; import de.learnlib.ralib.data.PIV; -import de.learnlib.ralib.data.ParValuation; +import de.learnlib.ralib.data.ParameterValuation; import de.learnlib.ralib.data.SymbolicDataValue; import de.learnlib.ralib.data.SymbolicDataValue.Parameter; import de.learnlib.ralib.data.SymbolicDataValue.SuffixValue; @@ -259,9 +259,9 @@ private SymbolicWord candidate(Word prefix, } Expression exprR = SMTUtil.renameVars(expr, renaming); - ParValuation pars = new ParValuation(path); + ParameterValuation pars = ParameterValuation.fromPSymbolWord(path); Mapping vals = new Mapping<>(); - vals.putAll(DataWords.computeVarValuation(pars, pivSul)); + vals.putAll(DataWords.computeRegisterValuation(pars, pivSul)); vals.putAll(pars); vals.putAll(consts); diff --git a/src/main/java/de/learnlib/ralib/data/DataValue.java b/src/main/java/de/learnlib/ralib/data/DataValue.java index cf71e095..aebaa4ff 100644 --- a/src/main/java/de/learnlib/ralib/data/DataValue.java +++ b/src/main/java/de/learnlib/ralib/data/DataValue.java @@ -28,7 +28,7 @@ * * @author falk */ -public class DataValue extends Constant { +public class DataValue extends Constant implements TypedValue { protected final DataType type; @@ -64,6 +64,7 @@ public boolean equals(Object obj) { return this.getValue().equals(other.getValue()); } + @Override public DataType getDataType() { return type; } diff --git a/src/main/java/de/learnlib/ralib/data/Mapping.java b/src/main/java/de/learnlib/ralib/data/Mapping.java index 8a1be60f..9fa089db 100644 --- a/src/main/java/de/learnlib/ralib/data/Mapping.java +++ b/src/main/java/de/learnlib/ralib/data/Mapping.java @@ -25,34 +25,34 @@ import java.util.Map; import java.util.Set; +import org.checkerframework.checker.nullness.qual.NonNull; + /** * * @author falk * @param * @param */ -@Deprecated -public class Mapping extends LinkedHashMap +public class Mapping extends LinkedHashMap implements Iterable> { /** * returns the contained values of some type. * - * @param * @param type the type - * @return + * @return all values of type */ - public Collection values(DataType type) { - List list = new ArrayList<>(); - for (DataValue v : values()) { - if (v.type.equals(type)) { + public Collection values(DataType type) { + List list = new ArrayList<>(); + for (V v : values()) { + if (v.getDataType().equals(type)) { list.add(v); } } return list; } - @Override + @NonNull @Override public Iterator> iterator() { return this.entrySet().iterator(); } @@ -75,15 +75,6 @@ public int hashCode() { return hash * this.entrySet().hashCode(); } -// @Override -// public V get(Object key) { -// V v = super.get(key); -// if (v == null) { -// throw new IllegalStateException(); -// } -// return v; -// } - public String toString(String map) { StringBuilder sb = new StringBuilder(); sb.append("["); @@ -94,13 +85,10 @@ public String toString(String map) { return sb.toString(); } - public Set getAllKeys(V value) { + public Set getAllKeysForValue(V value) { Set retKeySet = new LinkedHashSet(); for (Map.Entry entry : this.entrySet()) { - //log.trace("key = " + K); - //log.trace("value = " + entry.getKey().toString()); if (entry.getValue().equals(value)){ - //log.trace(entry.getKey().toString() + " equals " + value.toString()); retKeySet.add(entry.getKey()); } } @@ -111,4 +99,5 @@ public Set getAllKeys(V value) { public String toString() { return toString(">"); } + } diff --git a/src/main/java/de/learnlib/ralib/data/ParValuation.java b/src/main/java/de/learnlib/ralib/data/ParameterValuation.java similarity index 60% rename from src/main/java/de/learnlib/ralib/data/ParValuation.java rename to src/main/java/de/learnlib/ralib/data/ParameterValuation.java index 9e5fe66f..6f3314ba 100644 --- a/src/main/java/de/learnlib/ralib/data/ParValuation.java +++ b/src/main/java/de/learnlib/ralib/data/ParameterValuation.java @@ -16,7 +16,6 @@ */ package de.learnlib.ralib.data; -import java.util.Iterator; import de.learnlib.ralib.data.util.SymbolicDataValueGenerator.ParameterGenerator; import de.learnlib.ralib.words.PSymbolInstance; @@ -27,28 +26,25 @@ * * @author falk */ -@Deprecated -public class ParValuation extends Mapping { +public class ParameterValuation extends Mapping { - public ParValuation() { - - } - - public ParValuation(PSymbolInstance psi) { + public static ParameterValuation fromPSymbolInstance(PSymbolInstance psi) { + ParameterValuation val = new ParameterValuation(); ParameterGenerator pgen = new ParameterGenerator(); for (DataValue dv : psi.getParameterValues()) { - this.put(pgen.next(dv.getDataType()), dv); + val.put(pgen.next(dv.getDataType()), dv); } + return val; } - public ParValuation(Word dw) { - ParameterGenerator pgen = new ParameterGenerator(); - Iterator it = dw.iterator(); - while (it.hasNext()) { - PSymbolInstance psi = it.next(); - for (DataValue dv : psi.getParameterValues()) { - put(pgen.next(dv.getDataType()), dv); - } - } + public static ParameterValuation fromPSymbolWord(Word dw) { + ParameterValuation val = new ParameterValuation(); + ParameterGenerator pgen = new ParameterGenerator(); + for (PSymbolInstance psi : dw) { + for (DataValue dv : psi.getParameterValues()) { + val.put(pgen.next(dv.getDataType()), dv); + } + } + return val; } } diff --git a/src/main/java/de/learnlib/ralib/data/VarValuation.java b/src/main/java/de/learnlib/ralib/data/RegisterValuation.java similarity index 75% rename from src/main/java/de/learnlib/ralib/data/VarValuation.java rename to src/main/java/de/learnlib/ralib/data/RegisterValuation.java index 3ffaf8e7..e0d2083b 100644 --- a/src/main/java/de/learnlib/ralib/data/VarValuation.java +++ b/src/main/java/de/learnlib/ralib/data/RegisterValuation.java @@ -22,16 +22,14 @@ * * @author falk */ -@Deprecated -public class VarValuation extends Mapping { +public class RegisterValuation extends Mapping { - public VarValuation(VarValuation other) { + public static RegisterValuation copyOf(RegisterValuation other) { + RegisterValuation copy = new RegisterValuation(); if (other != null) { - putAll(other); + copy.putAll(other); } - } - - public VarValuation() { + return copy; } } diff --git a/src/main/java/de/learnlib/ralib/data/SuffixValuation.java b/src/main/java/de/learnlib/ralib/data/SuffixValuation.java index 1634e369..16b796b5 100644 --- a/src/main/java/de/learnlib/ralib/data/SuffixValuation.java +++ b/src/main/java/de/learnlib/ralib/data/SuffixValuation.java @@ -20,7 +20,6 @@ * * @author falk */ -@Deprecated public class SuffixValuation extends Mapping { } diff --git a/src/main/java/de/learnlib/ralib/data/SymbolicDataValue.java b/src/main/java/de/learnlib/ralib/data/SymbolicDataValue.java index 5be18110..4c7aebaf 100644 --- a/src/main/java/de/learnlib/ralib/data/SymbolicDataValue.java +++ b/src/main/java/de/learnlib/ralib/data/SymbolicDataValue.java @@ -27,8 +27,8 @@ * * @author falk */ -@Deprecated -public abstract class SymbolicDataValue extends Variable { +public sealed abstract class SymbolicDataValue extends Variable implements TypedValue permits + SymbolicDataValue.Parameter, SymbolicDataValue.Constant, SymbolicDataValue.Register, SymbolicDataValue.SuffixValue { public static final class Parameter extends SymbolicDataValue { @@ -52,8 +52,9 @@ public Constant(DataType dataType, int id) { } /* - * a parameter in a suffix: we should replace those by v_i + * a parameter in a suffix: */ + // todo: we should replace those by v_i public static final class SuffixValue extends SymbolicDataValue { public SuffixValue(DataType dataType, int id) { @@ -65,13 +66,13 @@ public SuffixValue(DataType dataType, int id) { final int id; - // TODO: id needed? private SymbolicDataValue(DataType dataType, int id, String name) { super(BuiltinTypes.DECIMAL, name); this.type = dataType; this.id = id; } + @Override public DataType getDataType() { return this.type; } @@ -80,19 +81,6 @@ public int getId() { return this.id; } - public static T copy(T orig) { - if (orig.isParameter()) { - return (T) new Parameter(orig.type, orig.id); - } else if (orig.isRegister()) { - return (T) new Register(orig.type, orig.id); - } else if (orig.isConstant()) { - return (T) new Constant(orig.type, orig.id); - } else if (orig.isSuffixValue()) { - return (T) new SuffixValue(orig.type, orig.id); - } - throw new RuntimeException("should not be reachable."); - } - @Override public String toString() { return getName(); @@ -137,4 +125,5 @@ public boolean isConstant() { public boolean isSuffixValue() { return this.getClass().equals(SuffixValue.class); } + } diff --git a/src/main/java/de/learnlib/ralib/data/TypedValue.java b/src/main/java/de/learnlib/ralib/data/TypedValue.java new file mode 100644 index 00000000..91bb3273 --- /dev/null +++ b/src/main/java/de/learnlib/ralib/data/TypedValue.java @@ -0,0 +1,21 @@ +/* + * Copyright (C) 2014-2015 The LearnLib Contributors + * This file is part of LearnLib, http://www.learnlib.de/. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package de.learnlib.ralib.data; + +public interface TypedValue { + DataType getDataType(); +} diff --git a/src/main/java/de/learnlib/ralib/data/VarMapping.java b/src/main/java/de/learnlib/ralib/data/VarMapping.java index 63c5bcc7..a7b5ffa8 100644 --- a/src/main/java/de/learnlib/ralib/data/VarMapping.java +++ b/src/main/java/de/learnlib/ralib/data/VarMapping.java @@ -16,9 +16,6 @@ */ package de.learnlib.ralib.data; -import java.util.*; - - /** * maps symbolic data values to symbolic data values. * @@ -27,87 +24,12 @@ * @param * @param */ -@Deprecated -public class VarMapping - extends LinkedHashMap implements Iterable> { - - public VarMapping(SymbolicDataValue ... kvpairs) { - for (int i=0; i Collection values(DataType type) { - List list = new ArrayList<>(); - for (SymbolicDataValue v : values()) { - if (v.type.equals(type)) { - list.add(v); - } - } - return list; - } - - @Override - public Iterator> iterator() { - return this.entrySet().iterator(); - } - - @Override - public boolean equals(Object obj) { - if (obj == null) { - return false; - } - if (getClass() != obj.getClass()) { - return false; - } - final VarMapping other = (VarMapping) obj; - return other.entrySet().equals(entrySet()); - } - - @Override - public int hashCode() { - int hash = 7; - return hash * this.entrySet().hashCode(); - } - -// @Override -// public V get(Object key) { -// V v = super.get(key); -// if (v == null) { -// throw new IllegalStateException(); -// } -// return v; -// } - - public String toString(String map) { - StringBuilder sb = new StringBuilder(); - sb.append("["); - for (Map.Entry e : entrySet()) { - sb.append(e.getKey()).append(map).append(e.getValue()).append(","); - } - sb.append("]"); - return sb.toString(); - } - - public Set getAllKeys(V value) { - Set retKeySet = new LinkedHashSet(); - for (Map.Entry entry : this.entrySet()) { - //log.trace("key = " + K); - //log.trace("value = " + entry.getKey().toString()); - if (entry.getValue().equals(value)){ - //log.trace(entry.getKey().toString() + " equals " + value.toString()); - retKeySet.add(entry.getKey()); - } - } - return retKeySet; - } +public class VarMapping extends Mapping { - @Override - public String toString() { - return toString(">"); + public static VarMapping fromPair(K key, V value) { + VarMapping pairs = new VarMapping<>(); + pairs.put(key, value); + return pairs; } } diff --git a/src/main/java/de/learnlib/ralib/dt/DTHyp.java b/src/main/java/de/learnlib/ralib/dt/DTHyp.java index 2953628e..c0c60832 100644 --- a/src/main/java/de/learnlib/ralib/dt/DTHyp.java +++ b/src/main/java/de/learnlib/ralib/dt/DTHyp.java @@ -7,8 +7,8 @@ import java.util.Set; import de.learnlib.ralib.data.Constants; -import de.learnlib.ralib.data.ParValuation; -import de.learnlib.ralib.data.VarValuation; +import de.learnlib.ralib.data.ParameterValuation; +import de.learnlib.ralib.data.RegisterValuation; import de.learnlib.ralib.learning.Hypothesis; import de.learnlib.ralib.oracles.Branching; import de.learnlib.ralib.smt.SMTUtil; @@ -73,12 +73,12 @@ public Set> possibleAccessSequences(Word } protected List> getDTTransitions(Word dw) { - VarValuation vars = new VarValuation(getInitialRegisters()); + RegisterValuation vars = RegisterValuation.copyOf(getInitialRegisters()); DTLeaf current = dt.getLeaf(Word.epsilon()); List> tseq = new ArrayList<>(); for (PSymbolInstance psi : dw) { - ParValuation pars = new ParValuation(psi); + ParameterValuation pars = ParameterValuation.fromPSymbolInstance(psi); Map, Expression> candidates = current.getBranching(psi.getBaseSymbol()).getBranches(); diff --git a/src/main/java/de/learnlib/ralib/dt/DTLeaf.java b/src/main/java/de/learnlib/ralib/dt/DTLeaf.java index 87d6a321..4b6a39e1 100644 --- a/src/main/java/de/learnlib/ralib/dt/DTLeaf.java +++ b/src/main/java/de/learnlib/ralib/dt/DTLeaf.java @@ -18,14 +18,9 @@ import org.apache.commons.lang3.tuple.Pair; import de.learnlib.ralib.automata.Assignment; -import de.learnlib.ralib.data.Constants; -import de.learnlib.ralib.data.DataValue; -import de.learnlib.ralib.data.Mapping; -import de.learnlib.ralib.data.PIV; -import de.learnlib.ralib.data.SymbolicDataValue; +import de.learnlib.ralib.data.*; import de.learnlib.ralib.data.SymbolicDataValue.Parameter; import de.learnlib.ralib.data.SymbolicDataValue.Register; -import de.learnlib.ralib.data.VarMapping; import de.learnlib.ralib.data.util.PIVRemappingIterator; import de.learnlib.ralib.learning.LocationComponent; import de.learnlib.ralib.learning.PrefixContainer; diff --git a/src/main/java/de/learnlib/ralib/equivalence/IOEquivalenceTest.java b/src/main/java/de/learnlib/ralib/equivalence/IOEquivalenceTest.java index 3dc113c8..4776bd7a 100644 --- a/src/main/java/de/learnlib/ralib/equivalence/IOEquivalenceTest.java +++ b/src/main/java/de/learnlib/ralib/equivalence/IOEquivalenceTest.java @@ -29,10 +29,10 @@ import de.learnlib.ralib.data.Constants; import de.learnlib.ralib.data.DataType; import de.learnlib.ralib.data.DataValue; -import de.learnlib.ralib.data.ParValuation; +import de.learnlib.ralib.data.ParameterValuation; +import de.learnlib.ralib.data.RegisterValuation; import de.learnlib.ralib.data.SymbolicDataValue; import de.learnlib.ralib.data.SymbolicDataValue.Register; -import de.learnlib.ralib.data.VarValuation; import de.learnlib.ralib.data.util.SymbolicDataValueGenerator; import de.learnlib.ralib.theory.Theory; import de.learnlib.ralib.words.DataWords; @@ -80,14 +80,14 @@ private static class Tuple { RALocation sys1loc; RALocation sys2loc; - VarValuation sys1reg; - VarValuation sys2reg; + RegisterValuation sys1reg; + RegisterValuation sys2reg; - public Tuple(RALocation l1, RALocation l2, VarValuation r1, VarValuation r2) { + public Tuple(RALocation l1, RALocation l2, RegisterValuation r1, RegisterValuation r2) { sys1loc = l1; sys2loc = l2; - sys1reg = new VarValuation(r1); - sys2reg = new VarValuation(r2); + sys1reg = RegisterValuation.copyOf(r1); + sys2reg = RegisterValuation.copyOf(r2); } @Override @@ -134,7 +134,7 @@ private boolean compatible(Tuple t1, Tuple t2) } private boolean compareRegister( - VarValuation r1, VarValuation r2, Map vMap) { + RegisterValuation r1, RegisterValuation r2, Map vMap) { for (Map.Entry entry : r1.entrySet()) { @@ -178,16 +178,16 @@ private static class Triple { RALocation sys1loc; RALocation sys2loc; - VarValuation sys1reg; - VarValuation sys2reg; + RegisterValuation sys1reg; + RegisterValuation sys2reg; Word as; Word trace; - public Triple(RALocation l1, RALocation l2, VarValuation r1, VarValuation r2, Word w, Word t) { + public Triple(RALocation l1, RALocation l2, RegisterValuation r1, RegisterValuation r2, Word w, Word t) { sys1loc = l1; sys2loc = l2; - sys1reg = new VarValuation(r1); - sys2reg = new VarValuation(r2); + sys1reg = RegisterValuation.copyOf(r1); + sys2reg = RegisterValuation.copyOf(r2); as = w; trace = t; } @@ -323,7 +323,7 @@ public DefaultQuery findCounterExample( return null; } -// private static boolean hasDoubles(VarValuation r) { +// private static boolean hasDoubles(RegisterValuation r) { // Set s = new LinkedHashSet<>(); // int x = 0; // for (String key : r.getKeys()) { @@ -342,10 +342,10 @@ public DefaultQuery findCounterExample( private Pair executeStep( Triple in, PSymbolInstance psi, Triple out) { - out.sys1reg = new VarValuation(in.sys1reg); - out.sys2reg = new VarValuation(in.sys2reg); + out.sys1reg = RegisterValuation.copyOf(in.sys1reg); + out.sys2reg = RegisterValuation.copyOf(in.sys2reg); - ParValuation pval = new ParValuation(psi); + ParameterValuation pval = ParameterValuation.fromPSymbolInstance(psi); // first sys input RALocation loc1 = null; @@ -395,7 +395,7 @@ private Pair executeStep( // first sys output commit - out.sys1reg = ot1.execute(out.sys1reg, new ParValuation(ret1), consts); + out.sys1reg = ot1.execute(out.sys1reg, ParameterValuation.fromPSymbolInstance(ret1), consts); out.sys1loc = ot1.getDestination(); if (out.sys1loc == null) { @@ -403,7 +403,7 @@ private Pair executeStep( } // second sys output commit - out.sys2reg = ot2.execute(out.sys2reg, new ParValuation(ret2), consts); + out.sys2reg = ot2.execute(out.sys2reg, ParameterValuation.fromPSymbolInstance(ret2), consts); out.sys2loc = ot2.getDestination(); if (out.sys2loc == null) { @@ -415,7 +415,7 @@ private Pair executeStep( private List> getNext(Word w, - ParameterizedSymbol ps, VarValuation r1, //VarValuation r2, + ParameterizedSymbol ps, RegisterValuation r1, //RegisterValuation r2, boolean checkForEqualParameters) { Set potential = new LinkedHashSet<>(); @@ -486,13 +486,13 @@ private Set valSet(Collection in, DataType t) { return out; } - private PSymbolInstance createOutputSymbol(OutputTransition ot, VarValuation register, VarValuation register2) { + private PSymbolInstance createOutputSymbol(OutputTransition ot, RegisterValuation register, RegisterValuation register2) { ParameterizedSymbol ps = ot.getLabel(); OutputMapping mapping = ot.getOutput(); DataValue[] vals = new DataValue[ps.getArity()]; SymbolicDataValueGenerator.ParameterGenerator pgen = new SymbolicDataValueGenerator.ParameterGenerator(); - ParValuation pval = new ParValuation(); + ParameterValuation pval = new ParameterValuation(); int i = 0; for (DataType t : ps.getPtypes()) { SymbolicDataValue.Parameter p = pgen.next(t); @@ -527,7 +527,7 @@ else if (sv.isParameter()) { return new PSymbolInstance(ot.getLabel(), vals); } - private OutputTransition getOutputTransition(RALocation loc, VarValuation reg) { + private OutputTransition getOutputTransition(RALocation loc, RegisterValuation reg) { for (Transition t : loc.getOut()) { OutputTransition ot = (OutputTransition) t; if (ot.canBeEnabled(reg, consts) && ot.getDestination().isAccepting()) { @@ -538,7 +538,7 @@ private OutputTransition getOutputTransition(RALocation loc, VarValuation reg) { } private List computeOld(DataType t, - ParValuation pval, Set stored) { + ParameterValuation pval, Set stored) { stored.addAll(consts.values()); for (DataValue d : pval.values()){ if (d.getDataType().equals(t)) { diff --git a/src/main/java/de/learnlib/ralib/equivalence/RAEquivalenceTest.java b/src/main/java/de/learnlib/ralib/equivalence/RAEquivalenceTest.java index 724ab17c..e8221f9e 100644 --- a/src/main/java/de/learnlib/ralib/equivalence/RAEquivalenceTest.java +++ b/src/main/java/de/learnlib/ralib/equivalence/RAEquivalenceTest.java @@ -27,9 +27,9 @@ import de.learnlib.ralib.data.Constants; import de.learnlib.ralib.data.DataType; import de.learnlib.ralib.data.DataValue; -import de.learnlib.ralib.data.ParValuation; +import de.learnlib.ralib.data.ParameterValuation; +import de.learnlib.ralib.data.RegisterValuation; import de.learnlib.ralib.data.SymbolicDataValue.Register; -import de.learnlib.ralib.data.VarValuation; import de.learnlib.ralib.theory.Theory; import de.learnlib.ralib.words.PSymbolInstance; import de.learnlib.ralib.words.ParameterizedSymbol; @@ -50,14 +50,14 @@ private static class Tuple { RALocation sys1loc; RALocation sys2loc; - VarValuation sys1reg; - VarValuation sys2reg; + RegisterValuation sys1reg; + RegisterValuation sys2reg; - public Tuple(RALocation l1, RALocation l2, VarValuation r1, VarValuation r2) { + public Tuple(RALocation l1, RALocation l2, RegisterValuation r1, RegisterValuation r2) { sys1loc = l1; sys2loc = l2; - sys1reg = new VarValuation(r1); - sys2reg = new VarValuation(r2); + sys1reg = RegisterValuation.copyOf(r1); + sys2reg = RegisterValuation.copyOf(r2); } @Override @@ -104,7 +104,7 @@ private boolean compatible(Tuple t1, Tuple t2) } private boolean compareRegister( - VarValuation r1, VarValuation r2, Map vMap) { + RegisterValuation r1, RegisterValuation r2, Map vMap) { for (Map.Entry entry : r1.entrySet()) { @@ -148,16 +148,16 @@ private static class Triple { RALocation sys1loc; RALocation sys2loc; - VarValuation sys1reg; - VarValuation sys2reg; + RegisterValuation sys1reg; + RegisterValuation sys2reg; Word as; Word trace; - public Triple(RALocation l1, RALocation l2, VarValuation r1, VarValuation r2, Word w, Word t) { + public Triple(RALocation l1, RALocation l2, RegisterValuation r1, RegisterValuation r2, Word w, Word t) { sys1loc = l1; sys2loc = l2; - sys1reg = new VarValuation(r1); - sys2reg = new VarValuation(r2); + sys1reg = RegisterValuation.copyOf(r1); + sys2reg = RegisterValuation.copyOf(r2); as = w; trace = t; } @@ -287,7 +287,7 @@ public DefaultQuery findCounterExample( return null; } -// private static boolean hasDoubles(VarValuation r) { +// private static boolean hasDoubles(RegisterValuation r) { // return false; // Set s = new LinkedHashSet<>(); @@ -306,10 +306,10 @@ public DefaultQuery findCounterExample( // } private void executeStep(Triple in, PSymbolInstance psi, Triple out) { - out.sys1reg = new VarValuation(in.sys1reg); - out.sys2reg = new VarValuation(in.sys2reg); + out.sys1reg = RegisterValuation.copyOf(in.sys1reg); + out.sys2reg = RegisterValuation.copyOf(in.sys2reg); - ParValuation pval = new ParValuation(psi); + ParameterValuation pval = ParameterValuation.fromPSymbolInstance(psi); // first sys input RALocation loc1 = null; @@ -350,7 +350,7 @@ private void executeStep(Triple in, PSymbolInstance psi, Triple out) { private List> getNext(Word w, - ParameterizedSymbol ps, VarValuation r1, + ParameterizedSymbol ps, RegisterValuation r1, boolean checkForEqualParameters) { Set potential = new LinkedHashSet<>(); diff --git a/src/main/java/de/learnlib/ralib/learning/AutomatonBuilder.java b/src/main/java/de/learnlib/ralib/learning/AutomatonBuilder.java index 195a4d29..0292ad7f 100644 --- a/src/main/java/de/learnlib/ralib/learning/AutomatonBuilder.java +++ b/src/main/java/de/learnlib/ralib/learning/AutomatonBuilder.java @@ -29,11 +29,11 @@ import de.learnlib.ralib.automata.Transition; import de.learnlib.ralib.data.Constants; import de.learnlib.ralib.data.PIV; -import de.learnlib.ralib.data.ParValuation; +import de.learnlib.ralib.data.ParameterValuation; +import de.learnlib.ralib.data.RegisterValuation; import de.learnlib.ralib.data.SymbolicDataValue.Parameter; import de.learnlib.ralib.data.SymbolicDataValue.Register; import de.learnlib.ralib.data.VarMapping; -import de.learnlib.ralib.data.VarValuation; import de.learnlib.ralib.dt.DT; import de.learnlib.ralib.dt.DTHyp; import de.learnlib.ralib.learning.rastar.RaStar; @@ -190,8 +190,8 @@ protected Transition createTransition(ParameterizedSymbol action, Expression findMatchingGuard(Word dw, PIV piv, Map, Expression> branches, Constants consts) { - ParValuation pars = new ParValuation(dw); - VarValuation vars = DataWords.computeVarValuation(new ParValuation(dw.prefix(dw.length() - 1)), piv); + ParameterValuation pars = ParameterValuation.fromPSymbolWord(dw); + RegisterValuation vars = DataWords.computeRegisterValuation(ParameterValuation.fromPSymbolWord(dw.prefix(dw.length() - 1)), piv); for (Expression g : branches.values()) { if (g.evaluateSMT(SMTUtil.compose(vars, pars, consts))) { return g; diff --git a/src/main/java/de/learnlib/ralib/learning/Hypothesis.java b/src/main/java/de/learnlib/ralib/learning/Hypothesis.java index 5d7b33bc..27c99097 100644 --- a/src/main/java/de/learnlib/ralib/learning/Hypothesis.java +++ b/src/main/java/de/learnlib/ralib/learning/Hypothesis.java @@ -28,11 +28,11 @@ import de.learnlib.ralib.automata.Transition; import de.learnlib.ralib.automata.TransitionSequenceTransformer; import de.learnlib.ralib.data.Constants; -import de.learnlib.ralib.data.ParValuation; +import de.learnlib.ralib.data.ParameterValuation; +import de.learnlib.ralib.data.RegisterValuation; import de.learnlib.ralib.data.SymbolicDataValue; import de.learnlib.ralib.data.SymbolicDataValue.Register; import de.learnlib.ralib.data.VarMapping; -import de.learnlib.ralib.data.VarValuation; import de.learnlib.ralib.oracles.Branching; import de.learnlib.ralib.smt.SMTUtil; import de.learnlib.ralib.words.PSymbolInstance; @@ -106,9 +106,9 @@ public Word transformTransitionSequence(Word w public Word branchWithSameGuard(Word word, Branching branching) { ParameterizedSymbol ps = word.lastSymbol().getBaseSymbol(); - List> tvseq = getTransitionsAndValuations(word); - VarValuation vars = tvseq.get(tvseq.size()-1).getSecond(); - ParValuation pval = new ParValuation(word.lastSymbol()); + List> tvseq = getTransitionsAndValuations(word); + RegisterValuation vars = tvseq.get(tvseq.size()-1).getSecond(); + ParameterValuation pval = ParameterValuation.fromPSymbolInstance(word.lastSymbol()); for (Map.Entry, Expression> e : branching.getBranches().entrySet()) { if (e.getKey().lastSymbol().getBaseSymbol().equals(ps)) { diff --git a/src/main/java/de/learnlib/ralib/learning/SymbolicWord.java b/src/main/java/de/learnlib/ralib/learning/SymbolicWord.java index 5277faf5..ea326396 100644 --- a/src/main/java/de/learnlib/ralib/learning/SymbolicWord.java +++ b/src/main/java/de/learnlib/ralib/learning/SymbolicWord.java @@ -6,9 +6,9 @@ import de.learnlib.ralib.data.DataValue; import de.learnlib.ralib.data.Mapping; import de.learnlib.ralib.data.PIV; +import de.learnlib.ralib.data.RegisterValuation; import de.learnlib.ralib.data.SymbolicDataValue; import de.learnlib.ralib.data.SymbolicDataValue.SuffixValue; -import de.learnlib.ralib.data.VarValuation; import de.learnlib.ralib.data.util.SymbolicDataValueGenerator.SuffixValueGenerator; import de.learnlib.ralib.words.DataWords; import de.learnlib.ralib.words.PSymbolInstance; @@ -58,7 +58,7 @@ public Mapping computeValuation(Word prefix, ParameterizedSymbol action, Node node, PIV piv, - ParValuation pval, Constants constants, SDT... sdts) { + ParameterValuation pval, Constants constants, SDT... sdts) { this.prefix = prefix; this.action = action; this.node = node; @@ -163,7 +163,7 @@ public SDT buildFakeSDT() { return node.buildFakeSDT(); } - public ParValuation getPval() { + public ParameterValuation getPval() { return pval; } @@ -266,14 +266,14 @@ public Word transformPrefix(Word dw) { DataValue[] dwParamValues = dw.lastSymbol().getParameterValues(); SuffixValue[] params = new SuffixValue[paramSet.size()]; paramSet.toArray(params); - ParValuation vals = new ParValuation(); + ParameterValuation vals = new ParameterValuation(); for (int i=0; i, Expression> branches = getBranches(); Word prefix = null; diff --git a/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheoryTreeOracle.java b/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheoryTreeOracle.java index 3eb42623..91b91c36 100644 --- a/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheoryTreeOracle.java +++ b/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheoryTreeOracle.java @@ -40,14 +40,14 @@ import de.learnlib.ralib.data.DataValue; import de.learnlib.ralib.data.Mapping; import de.learnlib.ralib.data.PIV; -import de.learnlib.ralib.data.ParValuation; +import de.learnlib.ralib.data.ParameterValuation; +import de.learnlib.ralib.data.RegisterValuation; import de.learnlib.ralib.data.SuffixValuation; import de.learnlib.ralib.data.SymbolicDataValue; import de.learnlib.ralib.data.SymbolicDataValue.Parameter; import de.learnlib.ralib.data.SymbolicDataValue.Register; import de.learnlib.ralib.data.SymbolicDataValue.SuffixValue; import de.learnlib.ralib.data.VarMapping; -import de.learnlib.ralib.data.VarValuation; import de.learnlib.ralib.data.WordValuation; import de.learnlib.ralib.data.util.SymbolicDataValueGenerator.ParameterGenerator; import de.learnlib.ralib.data.util.SymbolicDataValueGenerator.RegisterGenerator; @@ -181,7 +181,7 @@ public Branching getInitialBranching(Word prefix, Parameterized } } - MultiTheoryBranching mtb = this.getInitialBranching(prefix, ps, piv, new ParValuation(), casted); + MultiTheoryBranching mtb = this.getInitialBranching(prefix, ps, piv, new ParameterValuation(), casted); LOGGER.trace(Category.QUERY, mtb.toString()); @@ -190,7 +190,7 @@ public Branching getInitialBranching(Word prefix, Parameterized // get the initial branching for the symbol ps after prefix given a certain tree private MultiTheoryBranching getInitialBranching(Word prefix, ParameterizedSymbol ps, PIV piv, - ParValuation pval, SDT... sdts) { + ParameterValuation pval, SDT... sdts) { Node n; if (sdts.length == 0) { @@ -205,7 +205,7 @@ private MultiTheoryBranching getInitialBranching(Word prefix, P } private Node createFreshNode(int i, Word prefix, ParameterizedSymbol ps, PIV piv, - ParValuation pval) { + ParameterValuation pval) { if (i == ps.getArity() + 1) { return new Node(new Parameter(null, i)); @@ -220,7 +220,7 @@ private Node createFreshNode(int i, Word prefix, ParameterizedS Theory teach = teachers.get(type); DataValue dvi = teach.instantiate(prefix, ps, piv, pval, constants, guard, p, new LinkedHashSet<>()); - ParValuation otherPval = new ParValuation(); + ParameterValuation otherPval = new ParameterValuation(); otherPval.putAll(pval); otherPval.put(p, dvi); @@ -231,13 +231,13 @@ private Node createFreshNode(int i, Word prefix, ParameterizedS } } - private Node createNode(int i, Word prefix, ParameterizedSymbol ps, PIV piv, ParValuation pval, + private Node createNode(int i, Word prefix, ParameterizedSymbol ps, PIV piv, ParameterValuation pval, SDT... sdts) { Node n = createNode(i, prefix, ps, piv, pval, new LinkedHashMap<>(), sdts); return n; } - private Node createNode(int i, Word prefix, ParameterizedSymbol ps, PIV piv, ParValuation pval, + private Node createNode(int i, Word prefix, ParameterizedSymbol ps, PIV piv, ParameterValuation pval, Map> oldDvMap, SDT... sdts) { if (i == ps.getArity() + 1) { @@ -283,7 +283,7 @@ private Node createNode(int i, Word prefix, ParameterizedSymbol // guards .distinct().toArray(SDT[]::new); // merge and pick distinct elements - ParValuation otherPval = new ParValuation(); + ParameterValuation otherPval = new ParameterValuation(); otherPval.putAll(pval); otherPval.put(p, dvi); @@ -443,12 +443,12 @@ private Map> getChildren(SDT[] sdts) { return children; } - private Mapping buildValuation(ParValuation parValuation, + private Mapping buildValuation(ParameterValuation ParameterValuation, Word prefix, PIV piv, Constants constants) { Mapping valuation = new Mapping(); DataValue[] values = DataWords.valsOf(prefix); piv.forEach((param, reg) -> valuation.put(reg, values[param.getId() - 1])); - parValuation.forEach((param, dv) -> valuation.put(new SuffixValue(param.getDataType(), param.getId()), dv)); + ParameterValuation.forEach((param, dv) -> valuation.put(new SuffixValue(param.getDataType(), param.getId()), dv)); constants.forEach((c, dv) -> valuation.put(c, dv)); return valuation; } @@ -459,13 +459,13 @@ public Map, Boolean> instantiate(Word pre assert (sdt instanceof SDT); Map, Boolean> words = new LinkedHashMap, Boolean>(); instantiate(words, prefix, suffix, sdt, piv, 0, 0, - new ParValuation(), new ParameterGenerator(), new ParValuation(), new ParameterGenerator()); + new ParameterValuation(), new ParameterGenerator(), new ParameterValuation(), new ParameterGenerator()); return words; } private void instantiate(Map, Boolean> words, Word prefix, SymbolicSuffix suffix, SDT sdt, PIV piv, int aidx, int pidx, - ParValuation pval, ParameterGenerator pgen, ParValuation gpval, ParameterGenerator gpgen) { + ParameterValuation pval, ParameterGenerator pgen, ParameterValuation gpval, ParameterGenerator gpgen) { if (aidx == suffix.getActions().length()) { words.put(prefix, sdt.isAccepting()); } else { @@ -474,17 +474,17 @@ private void instantiate(Map, Boolean> words, Word newPrefix = prefix.append(psi); - instantiate(words, newPrefix, suffix, sdt, piv, aidx+1, 0, new ParValuation(), new ParameterGenerator(), gpval, gpgen); + instantiate(words, newPrefix, suffix, sdt, piv, aidx+1, 0, new ParameterValuation(), new ParameterGenerator(), gpval, gpgen); } else { Parameter p = pgen.next(ps.getPtypes()[pidx]); Parameter gp = gpgen.next(ps.getPtypes()[pidx]); Theory t = teachers.get(ps.getPtypes()[pidx]); for (Map.Entry entry : sdt.getChildren().entrySet()) { DataValue val = t.instantiate(prefix, ps, piv, gpval, constants, entry.getKey(), p, Collections.emptySet()); - ParValuation newPval = new ParValuation(); + ParameterValuation newPval = new ParameterValuation(); newPval.putAll(pval); newPval.put(p, val); - ParValuation newGpval = new ParValuation(); + ParameterValuation newGpval = new ParameterValuation(); newGpval.putAll(gpval); newGpval.put(gp, val); ParameterGenerator newPgen = new ParameterGenerator(); @@ -534,7 +534,7 @@ public Branching updateBranching(Word prefix, ParameterizedSymb newPiv.putAll(oldBranching.getPiv()); newPiv.putAll(relabeledPiv); - ParValuation pval = new ParValuation(); + ParameterValuation pval = new ParameterValuation(); Node n = createNode(1, prefix, ps, newPiv, pval, oldDvs, casted); @@ -561,8 +561,8 @@ public boolean accepts(Word prefix, Word suffi } } - ParValuation pars = DataWords.computeParValuation(prefix); - VarValuation vars = DataWords.computeVarValuation(pars, piv); + ParameterValuation pars = DataWords.computeParameterValuation(prefix); + RegisterValuation vars = DataWords.computeRegisterValuation(pars, piv); mapping.putAll(vars); SDT _sdt = sdt; diff --git a/src/main/java/de/learnlib/ralib/sul/SimulatorSUL.java b/src/main/java/de/learnlib/ralib/sul/SimulatorSUL.java index a4de6299..05a830af 100644 --- a/src/main/java/de/learnlib/ralib/sul/SimulatorSUL.java +++ b/src/main/java/de/learnlib/ralib/sul/SimulatorSUL.java @@ -36,12 +36,12 @@ import de.learnlib.ralib.data.DataType; import de.learnlib.ralib.data.DataValue; import de.learnlib.ralib.data.FreshValue; -import de.learnlib.ralib.data.ParValuation; +import de.learnlib.ralib.data.ParameterValuation; +import de.learnlib.ralib.data.RegisterValuation; import de.learnlib.ralib.data.SymbolicDataValue; import de.learnlib.ralib.data.SymbolicDataValue.Constant; import de.learnlib.ralib.data.SymbolicDataValue.Parameter; import de.learnlib.ralib.data.SymbolicDataValue.Register; -import de.learnlib.ralib.data.VarValuation; import de.learnlib.ralib.data.util.SymbolicDataValueGenerator; import de.learnlib.ralib.theory.Theory; import de.learnlib.ralib.words.DataWords; @@ -61,7 +61,7 @@ public class SimulatorSUL extends DataWordSUL { private final Map teachers; private RALocation loc = null; - private VarValuation register = null; + private RegisterValuation register = null; private Word prefix = null; private static final Logger LOGGER = LoggerFactory.getLogger(SimulatorSUL.class); @@ -96,7 +96,7 @@ public PSymbolInstance step(PSymbolInstance i) throws SULException { boolean found = false; for (Transition t : this.model.getTransitions(loc, i.getBaseSymbol())) { - ParValuation pval = new ParValuation(i); + ParameterValuation pval = ParameterValuation.fromPSymbolInstance(i); if (t.isEnabled(register, pval, consts)) { found = true; register = t.execute(register, pval, consts); @@ -113,7 +113,7 @@ public PSymbolInstance step(PSymbolInstance i) throws SULException { PSymbolInstance out = createOutputSymbol(ot); prefix = prefix.append(out); - register = ot.execute(register, new ParValuation(out), consts); + register = ot.execute(register, ParameterValuation.fromPSymbolInstance(out), consts); loc = ot.getDestination(); return out; } @@ -124,7 +124,7 @@ private PSymbolInstance createOutputSymbol(OutputTransition ot) { DataValue[] vals = new DataValue[ps.getArity()]; SymbolicDataValueGenerator.ParameterGenerator pgen = new SymbolicDataValueGenerator.ParameterGenerator(); - ParValuation pval = new ParValuation(); + ParameterValuation pval = new ParameterValuation(); int i = 0; for (DataType t : ps.getPtypes()) { Parameter p = pgen.next(t); @@ -155,7 +155,7 @@ else if (sv.isParameter()) { return new PSymbolInstance(ot.getLabel(), vals); } - private OutputTransition getOutputTransition(RALocation loc, VarValuation reg) { + private OutputTransition getOutputTransition(RALocation loc, RegisterValuation reg) { for (Transition t : loc.getOut()) { OutputTransition ot = (OutputTransition) t; if (ot.canBeEnabled(reg, consts)) { @@ -165,7 +165,7 @@ private OutputTransition getOutputTransition(RALocation loc, VarValuation reg) { throw new IllegalStateException("No suitable output transition."); } - private List computeOld(DataType t, ParValuation pval) { + private List computeOld(DataType t, ParameterValuation pval) { Set set = new LinkedHashSet<>(); set.addAll(DataWords.valSet(prefix, t)); for (DataValue d : pval.values()){ diff --git a/src/main/java/de/learnlib/ralib/theory/Theory.java b/src/main/java/de/learnlib/ralib/theory/Theory.java index c2888657..e00785e6 100644 --- a/src/main/java/de/learnlib/ralib/theory/Theory.java +++ b/src/main/java/de/learnlib/ralib/theory/Theory.java @@ -24,7 +24,7 @@ import de.learnlib.ralib.data.Constants; import de.learnlib.ralib.data.DataValue; import de.learnlib.ralib.data.PIV; -import de.learnlib.ralib.data.ParValuation; +import de.learnlib.ralib.data.ParameterValuation; import de.learnlib.ralib.data.SuffixValuation; import de.learnlib.ralib.data.SymbolicDataValue; import de.learnlib.ralib.data.SymbolicDataValue.Parameter; @@ -102,7 +102,7 @@ SDT treeQuery( * @return */ DataValue instantiate(Word prefix, - ParameterizedSymbol ps, PIV piv, ParValuation pval, + ParameterizedSymbol ps, PIV piv, ParameterValuation pval, Constants constants, SDTGuard guard, Parameter param, Set oldDvs); diff --git a/src/main/java/de/learnlib/ralib/theory/equality/EqualityTheory.java b/src/main/java/de/learnlib/ralib/theory/equality/EqualityTheory.java index 3a6fc26f..466ef6e0 100644 --- a/src/main/java/de/learnlib/ralib/theory/equality/EqualityTheory.java +++ b/src/main/java/de/learnlib/ralib/theory/equality/EqualityTheory.java @@ -36,7 +36,7 @@ import de.learnlib.ralib.data.DataValue; import de.learnlib.ralib.data.FreshValue; import de.learnlib.ralib.data.PIV; -import de.learnlib.ralib.data.ParValuation; +import de.learnlib.ralib.data.ParameterValuation; import de.learnlib.ralib.data.SuffixValuation; import de.learnlib.ralib.data.SymbolicDataValue; import de.learnlib.ralib.data.SymbolicDataValue.Constant; @@ -327,14 +327,14 @@ private SDTGuard.EqualityGuard pickupDataValue(DataValue newDv, List // it is somewhere earlier in the suffix else { - int smallest = Collections.min(ifValues.getAllKeys(newDv)); + int smallest = Collections.min(ifValues.getAllKeysForValue(newDv)); return new SDTGuard.EqualityGuard(currentParam, new SuffixValue(type, smallest)); } } @Override // instantiate a parameter with a data value - public DataValue instantiate(Word prefix, ParameterizedSymbol ps, PIV piv, ParValuation pval, + public DataValue instantiate(Word prefix, ParameterizedSymbol ps, PIV piv, ParameterValuation pval, Constants constants, SDTGuard guard, Parameter param, Set oldDvs) { List prefixValues = Arrays.asList(DataWords.valsOf(prefix)); diff --git a/src/main/java/de/learnlib/ralib/theory/equality/UniqueEqualityTheory.java b/src/main/java/de/learnlib/ralib/theory/equality/UniqueEqualityTheory.java index 87d5ec51..b91a3795 100644 --- a/src/main/java/de/learnlib/ralib/theory/equality/UniqueEqualityTheory.java +++ b/src/main/java/de/learnlib/ralib/theory/equality/UniqueEqualityTheory.java @@ -81,7 +81,7 @@ public SDT treeQuery(Word prefix, SymbolicSuffix suffix, WordVa @Override // instantiate a parameter with a data value - public DataValue instantiate(Word prefix, ParameterizedSymbol ps, PIV piv, ParValuation pval, + public DataValue instantiate(Word prefix, ParameterizedSymbol ps, PIV piv, ParameterValuation pval, Constants constants, SDTGuard guard, SymbolicDataValue.Parameter param, Set oldDvs) { List prefixValues = Arrays.asList(DataWords.valsOf(prefix)); diff --git a/src/main/java/de/learnlib/ralib/theory/inequality/InequalityTheoryWithEq.java b/src/main/java/de/learnlib/ralib/theory/inequality/InequalityTheoryWithEq.java index 3706db60..8ce7d4b8 100644 --- a/src/main/java/de/learnlib/ralib/theory/inequality/InequalityTheoryWithEq.java +++ b/src/main/java/de/learnlib/ralib/theory/inequality/InequalityTheoryWithEq.java @@ -30,7 +30,7 @@ import de.learnlib.ralib.data.DataType; import de.learnlib.ralib.data.DataValue; import de.learnlib.ralib.data.PIV; -import de.learnlib.ralib.data.ParValuation; +import de.learnlib.ralib.data.ParameterValuation; import de.learnlib.ralib.data.SuffixValuation; import de.learnlib.ralib.data.SymbolicDataValue; import de.learnlib.ralib.data.SymbolicDataValue.Parameter; @@ -757,7 +757,7 @@ private SDTGuard.EqualityGuard pickupDataValue(DataValue newDv, } // if the data value isn't in the prefix, it is somewhere earlier in the suffix else { - int smallest = Collections.min(ifValues.getAllKeys(newDv)); + int smallest = Collections.min(ifValues.getAllKeysForValue(newDv)); return new SDTGuard.EqualityGuard(currentParam, new SuffixValue(type, smallest)); } } @@ -781,7 +781,7 @@ private SDTGuard.IntervalGuard makeSmallerGuard(DataValue smallerDv, } // if the data value isn't in the prefix, it is somewhere earlier in the suffix else { - int smallest = Collections.min(ifValues.getAllKeys(smallerDv)); + int smallest = Collections.min(ifValues.getAllKeysForValue(smallerDv)); SDTGuard.IntervalGuard sg = new SDTGuard.IntervalGuard( currentParam, null, new SuffixValue(type, smallest)); return sg; @@ -816,7 +816,7 @@ private SDTGuard.IntervalGuard makeBiggerGuard(DataValue biggerDv, } // if the data value isn't in the prefix, it is somewhere earlier in the suffix else { - int smallest = Collections.min(ifValues.getAllKeys(biggerDv)); + int smallest = Collections.min(ifValues.getAllKeysForValue(biggerDv)); SDTGuard.IntervalGuard bg = new SDTGuard.IntervalGuard( currentParam, new SuffixValue(type, smallest), null); return bg; @@ -827,7 +827,7 @@ private SDTGuard.IntervalGuard makeBiggerGuard(DataValue biggerDv, private DataValue getRegisterValue(SymbolicDataValue r, PIV piv, List prefixValues, Constants constants, - ParValuation pval) { + ParameterValuation pval) { if (r.isRegister()) { // LOGGER.trace("piv: " + piv + " " + r.toString() + " " + prefixValues); Parameter p = piv.getOneKey((Register) r); @@ -851,7 +851,7 @@ public abstract DataValue instantiate(SDTGuard guard, Valuation val, public DataValue instantiate( Word prefix, ParameterizedSymbol ps, PIV piv, - ParValuation pval, + ParameterValuation pval, Constants constants, SDTGuard guard, Parameter param, diff --git a/src/main/java/de/learnlib/ralib/words/DataWords.java b/src/main/java/de/learnlib/ralib/words/DataWords.java index 2ba3f904..5ae0dba0 100644 --- a/src/main/java/de/learnlib/ralib/words/DataWords.java +++ b/src/main/java/de/learnlib/ralib/words/DataWords.java @@ -28,10 +28,10 @@ import de.learnlib.ralib.data.DataType; import de.learnlib.ralib.data.DataValue; import de.learnlib.ralib.data.PIV; -import de.learnlib.ralib.data.ParValuation; +import de.learnlib.ralib.data.ParameterValuation; +import de.learnlib.ralib.data.RegisterValuation; import de.learnlib.ralib.data.SymbolicDataValue.Parameter; import de.learnlib.ralib.data.SymbolicDataValue.Register; -import de.learnlib.ralib.data.VarValuation; import de.learnlib.ralib.data.util.SymbolicDataValueGenerator.ParameterGenerator; import net.automatalib.word.Word; @@ -236,9 +236,9 @@ public static int paramValLength(Word word) { return length; } - public static ParValuation computeParValuation(Word word) { + public static ParameterValuation computeParameterValuation(Word word) { ParameterGenerator pGen = new ParameterGenerator(); - ParValuation pars = new ParValuation(); + ParameterValuation pars = new ParameterValuation(); for (PSymbolInstance psi : word) { DataType[] dt = psi.getBaseSymbol().getPtypes(); DataValue[] dv = psi.getParameterValues(); @@ -250,8 +250,8 @@ public static ParValuation computeParValuation(Word word) { return pars; } - public static VarValuation computeVarValuation(ParValuation pars, PIV piv) { - VarValuation vars = new VarValuation(); + public static RegisterValuation computeRegisterValuation(ParameterValuation pars, PIV piv) { + RegisterValuation vars = new RegisterValuation(); for (Entry e : pars.entrySet()) { Register r = piv.get(e.getKey()); if (r != null) diff --git a/src/test/java/de/learnlib/ralib/example/sdts/LoginExampleSDT.java b/src/test/java/de/learnlib/ralib/example/sdts/LoginExampleSDT.java index c98bbe27..c87bbe59 100644 --- a/src/test/java/de/learnlib/ralib/example/sdts/LoginExampleSDT.java +++ b/src/test/java/de/learnlib/ralib/example/sdts/LoginExampleSDT.java @@ -19,7 +19,6 @@ import java.util.LinkedHashSet; import java.util.Set; -import de.learnlib.ralib.data.SymbolicDataValue; import de.learnlib.ralib.data.SymbolicDataValue.Register; import de.learnlib.ralib.data.VarMapping; import de.learnlib.ralib.learning.SymbolicSuffix; @@ -52,8 +51,7 @@ public LoginExampleSDT(LoginExampleSDT other) { clazz = other.clazz; suffix = new SymbolicSuffix(other.suffix); registers = new LinkedHashSet<>(); - for (Register r : other.registers) - registers.add(SymbolicDataValue.copy(r)); + registers.addAll(other.registers); } @Override From 316490a19650965258d007e2079d2fb293338320 Mon Sep 17 00:00:00 2001 From: Kostis Sagonas Date: Mon, 17 Mar 2025 21:55:07 +0000 Subject: [PATCH 20/26] Add org.checkerframework:checker-qual to pom.xml --- pom.xml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/pom.xml b/pom.xml index 8ac82461..bee2ac3c 100644 --- a/pom.xml +++ b/pom.xml @@ -16,6 +16,7 @@ 17 + 3.49.1 3.17.0 33.4.0-jre 4.0.2 @@ -163,6 +164,12 @@ ${jaxb-runtime.version} runtime + + + org.checkerframework + checker-qual + ${checker-qual.version} + @@ -217,6 +224,10 @@ jakarta.xml.bind jakarta.xml.bind-api + + org.checkerframework + checker-qual + org.glassfish.jaxb jaxb-runtime From ffa909efa8ad0711b90f7cd7818be4328bcae697 Mon Sep 17 00:00:00 2001 From: Falk Howar Date: Thu, 20 Mar 2025 11:48:34 +0100 Subject: [PATCH 21/26] removed piv --- .../ralib/ceanalysis/PrefixFinder.java | 43 ++-- .../de/learnlib/ralib/data/Bijection.java | 75 +++---- .../java/de/learnlib/ralib/data/DataType.java | 7 +- .../de/learnlib/ralib/data/DataValue.java | 15 +- src/main/java/de/learnlib/ralib/data/PIV.java | 115 ----------- .../ralib/data/RegisterAssignment.java | 20 ++ .../learnlib/ralib/data/SDTGuardElement.java | 24 +++ .../de/learnlib/ralib/data/SDTRelabeling.java | 10 + .../ralib/data/SymbolicDataValue.java | 28 ++- .../ralib/data/util/PIVRemappingIterator.java | 130 ------------ .../ralib/data/util/RemappingIterator.java | 27 +-- src/main/java/de/learnlib/ralib/dt/DT.java | 20 +- .../java/de/learnlib/ralib/dt/DTBranch.java | 26 ++- .../de/learnlib/ralib/dt/DTInnerNode.java | 8 +- .../java/de/learnlib/ralib/dt/DTLeaf.java | 194 ++++++++---------- .../de/learnlib/ralib/dt/MappedPrefix.java | 134 ++++++------ .../java/de/learnlib/ralib/dt/PathResult.java | 111 +++++----- .../java/de/learnlib/ralib/dt/PrefixSet.java | 5 +- .../de/learnlib/ralib/dt/ShortPrefix.java | 10 +- .../ralib/learning/AutomatonBuilder.java | 92 +++++---- .../learning/CounterexampleAnalysis.java | 47 ++--- .../ralib/learning/IOAutomatonBuilder.java | 5 +- .../ralib/learning/LocationComponent.java | 10 +- .../ralib/learning/MeasuringOracle.java | 14 +- .../ralib/learning/PrefixContainer.java | 7 +- .../learnlib/ralib/learning/SymbolicWord.java | 17 +- .../ralib/learning/ralambda/RaLambda.java | 58 +++--- .../learnlib/ralib/learning/rastar/Cell.java | 67 ++---- .../ralib/learning/rastar/Component.java | 60 +++--- .../learning/rastar/ObservationTable.java | 4 +- .../ralib/learning/rastar/RaStar.java | 2 +- .../learnlib/ralib/learning/rastar/Row.java | 86 ++++---- .../ralib/oracles/SDTLogicOracle.java | 40 ++-- .../de/learnlib/ralib/oracles/TreeOracle.java | 10 +- .../ralib/oracles/TreeQueryResult.java | 28 +-- .../oracles/mto/MultiTheoryBranching.java | 45 ++-- .../mto/MultiTheorySDTLogicOracle.java | 72 +++---- .../oracles/mto/MultiTheoryTreeOracle.java | 181 ++++++---------- .../mto/OptimizedSymbolicSuffixBuilder.java | 124 ++++++----- .../ralib/oracles/mto/SDTConstructor.java | 3 +- .../learnlib/ralib/smt/ConstraintSolver.java | 1 + .../ralib/smt/ReplacingValuesVisitor.java | 31 +++ .../java/de/learnlib/ralib/smt/SMTUtil.java | 12 +- .../ralib/theory/IntervalGuardUtil.java | 17 +- .../de/learnlib/ralib/theory/Memorables.java | 58 ++++++ .../java/de/learnlib/ralib/theory/SDT.java | 121 ++++++----- .../de/learnlib/ralib/theory/SDTGuard.java | 52 ++--- .../de/learnlib/ralib/theory/SDTLeaf.java | 13 +- .../ralib/theory/SuffixValueRestriction.java | 7 +- .../java/de/learnlib/ralib/theory/Theory.java | 10 +- .../ralib/theory/equality/EqualityTheory.java | 49 ++--- .../theory/equality/UniqueEqualityTheory.java | 8 +- .../inequality/InequalityTheoryWithEq.java | 171 +++++++-------- .../theories/DoubleInequalityTheory.java | 26 +-- .../de/learnlib/ralib/words/DataWords.java | 16 -- .../ralib/data/PIVRemappingIteratorTest.java | 83 -------- .../de/learnlib/ralib/dt/DTInnerNodeTest.java | 18 +- .../java/de/learnlib/ralib/dt/DTTest.java | 41 ++-- .../ralib/dt/RegisterConsistencyTest.java | 40 ++-- .../ralib/example/sdts/LoginExampleSDT.java | 5 +- .../example/sdts/LoginExampleTreeOracle.java | 23 +-- .../ralib/learning/rastar/CellTest.java | 5 +- .../ralib/learning/rastar/LearnLoginTest.java | 2 + .../learning/rastar/LearnRepeaterTest.java | 96 +++++++++ .../ralib/learning/rastar/LoggingOracle.java | 14 +- .../ralib/learning/rastar/RowTest.java | 13 +- .../mto/ConstantsSDTBranchingTest.java | 7 +- .../ralib/oracles/mto/FreshValuesTest.java | 39 ++-- .../mto/InstantiateSymbolicWordTest.java | 4 +- .../ralib/oracles/mto/LoginBranchingTest.java | 26 ++- .../oracles/mto/MultiSDTBranchingTest.java | 14 +- .../mto/MultiTheorySDTLogicOracleTest.java | 4 +- .../oracles/mto/MultipleSpecialCasesTest.java | 3 +- .../oracles/mto/NonFreeSuffixValuesTest.java | 11 +- .../OptimizedSymbolicSuffixBuilderTest.java | 47 +---- .../ralib/oracles/mto/SIPSDTMergingTest.java | 29 ++- .../oracles/mto/SecondSDTBranchingTest.java | 23 +-- .../oracles/mto/UntypedBranchingTest.java | 22 +- .../ralib/theory/SDTEquivalenceTest.java | 37 ++-- .../ralib/theory/TestEqualityTheory.java | 60 +++--- .../learnlib/ralib/theory/TestIneqEqTree.java | 60 +++--- .../ralib/theory/TestIneqOutputTree.java | 2 +- .../learnlib/ralib/theory/TestTreeOracle.java | 22 +- .../theory/TestUniqueEqualityTheory.java | 11 +- 84 files changed, 1485 insertions(+), 1842 deletions(-) delete mode 100644 src/main/java/de/learnlib/ralib/data/PIV.java create mode 100644 src/main/java/de/learnlib/ralib/data/RegisterAssignment.java create mode 100644 src/main/java/de/learnlib/ralib/data/SDTGuardElement.java create mode 100644 src/main/java/de/learnlib/ralib/data/SDTRelabeling.java delete mode 100644 src/main/java/de/learnlib/ralib/data/util/PIVRemappingIterator.java create mode 100644 src/main/java/de/learnlib/ralib/smt/ReplacingValuesVisitor.java create mode 100644 src/main/java/de/learnlib/ralib/theory/Memorables.java delete mode 100644 src/test/java/de/learnlib/ralib/data/PIVRemappingIteratorTest.java create mode 100644 src/test/java/de/learnlib/ralib/learning/rastar/LearnRepeaterTest.java diff --git a/src/main/java/de/learnlib/ralib/ceanalysis/PrefixFinder.java b/src/main/java/de/learnlib/ralib/ceanalysis/PrefixFinder.java index 36a18253..1cfb1ba9 100644 --- a/src/main/java/de/learnlib/ralib/ceanalysis/PrefixFinder.java +++ b/src/main/java/de/learnlib/ralib/ceanalysis/PrefixFinder.java @@ -5,22 +5,16 @@ import java.util.Map; import java.util.Set; +import de.learnlib.ralib.data.*; +import de.learnlib.ralib.data.util.RemappingIterator; +import de.learnlib.ralib.theory.Memorables; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import de.learnlib.logging.Category; import de.learnlib.query.DefaultQuery; -import de.learnlib.ralib.data.Constants; -import de.learnlib.ralib.data.DataType; -import de.learnlib.ralib.data.DataValue; -import de.learnlib.ralib.data.Mapping; -import de.learnlib.ralib.data.PIV; -import de.learnlib.ralib.data.ParameterValuation; -import de.learnlib.ralib.data.SymbolicDataValue; import de.learnlib.ralib.data.SymbolicDataValue.Parameter; import de.learnlib.ralib.data.SymbolicDataValue.SuffixValue; -import de.learnlib.ralib.data.VarMapping; -import de.learnlib.ralib.data.util.PIVRemappingIterator; import de.learnlib.ralib.data.util.SymbolicDataValueGenerator.ParameterGenerator; import de.learnlib.ralib.data.util.SymbolicDataValueGenerator.SuffixValueGenerator; import de.learnlib.ralib.learning.*; @@ -31,7 +25,6 @@ import de.learnlib.ralib.oracles.mto.SymbolicSuffixRestrictionBuilder; import de.learnlib.ralib.smt.SMTUtil; import de.learnlib.ralib.theory.SDT; -import de.learnlib.ralib.words.DataWords; import de.learnlib.ralib.words.PSymbolInstance; import de.learnlib.ralib.words.ParameterizedSymbol; import gov.nasa.jpf.constraints.api.Expression; @@ -49,7 +42,6 @@ public class PrefixFinder { private final SDTLogicOracle sdtOracle; private final SymbolicSuffixRestrictionBuilder restrictionBuilder; - //private Map, LocationComponent> components; private final Constants consts; @@ -124,17 +116,18 @@ private int findIndex(Word ce) { // different piv sizes // - if (!uPrimeResult.getPiv().typedSize().equals(uAlphaResult.getPiv().typedSize())) { + if (!Memorables.typedSize(uPrimeResult.sdt().getDataValues()).equals( + Memorables.typedSize(uAlphaResult.sdt().getDataValues()))) { continue; } // remapping // - PIVRemappingIterator iterator = new PIVRemappingIterator( - uAlphaResult.getPiv(), uPrimeResult.getPiv()); + RemappingIterator iterator = new RemappingIterator<>( + uAlphaResult.sdt().getDataValues(), uPrimeResult.sdt().getDataValues()); - for (VarMapping m : iterator) { - if (uAlphaResult.getSdt().isEquivalent(uPrimeResult.getSdt(), m)) { + for (Bijection m : iterator) { + if (uAlphaResult.sdt().isEquivalent(uPrimeResult.sdt(), m)) { continue LOC_CHECK; } } @@ -200,12 +193,12 @@ private boolean transitionHasCE(Word ce, int idx) { } boolean hasCE = sdtOracle.hasCounterexample(location, - resHyp.getSdt(), resHyp.getPiv(), - resSul.getSdt(), resSul.getPiv(), + resHyp.sdt(), + resSul.sdt(), ExpressionUtil.TRUE, transition); if (hasCE) { - SymbolicWord sw = candidate(location, symSuffix, resSul.getSdt(), resSul.getPiv(), resHyp.getSdt(), resHyp.getPiv(), ce); + SymbolicWord sw = candidate(location, symSuffix, resSul.sdt(), resHyp.sdt(), ce); // new by falk candidates[idx+1] = sw; return true; @@ -234,13 +227,13 @@ private void storeCandidateCEs(Word ce, int idx) { } private SymbolicWord candidate(Word prefix, - SymbolicSuffix symSuffix, SDT sdtSul, PIV pivSul, - SDT sdtHyp, PIV pivHyp, Word ce) { + SymbolicSuffix symSuffix, SDT sdtSul, + SDT sdtHyp, Word ce) { Word candidate = null; - Expression expr = sdtOracle.getCEGuard(prefix, sdtSul, pivSul, sdtHyp, pivHyp); + Expression expr = sdtOracle.getCEGuard(prefix, sdtSul, sdtHyp); - Map, Boolean> sulPaths = sulOracle.instantiate(prefix, symSuffix, sdtSul, pivSul); + Map, Boolean> sulPaths = sulOracle.instantiate(prefix, symSuffix, sdtSul); for (Word path : sulPaths.keySet()) { ParameterGenerator parGen = new ParameterGenerator(); for (PSymbolInstance psi : prefix) { @@ -261,7 +254,7 @@ private SymbolicWord candidate(Word prefix, ParameterValuation pars = ParameterValuation.fromPSymbolWord(path); Mapping vals = new Mapping<>(); - vals.putAll(DataWords.computeRegisterValuation(pars, pivSul)); + //vals.putAll(DataWords.computeRegisterValuation(pars, pivSul)); vals.putAll(pars); vals.putAll(consts); @@ -279,7 +272,7 @@ public Set> getCounterExamples() { for (Map.Entry e : candidateCEs.entrySet()) { SymbolicWord sw = e.getKey(); TreeQueryResult tqr = e.getValue(); - Map, Boolean> cemaps = sulOracle.instantiate(sw.getPrefix(), sw.getSuffix(), tqr.getSdt(), tqr.getPiv()); + Map, Boolean> cemaps = sulOracle.instantiate(sw.getPrefix(), sw.getSuffix(), tqr.sdt()); for (Map.Entry, Boolean> c : cemaps.entrySet()) { ces.add(new DefaultQuery(c.getKey(), c.getValue())); } diff --git a/src/main/java/de/learnlib/ralib/data/Bijection.java b/src/main/java/de/learnlib/ralib/data/Bijection.java index 5e246a39..68112733 100644 --- a/src/main/java/de/learnlib/ralib/data/Bijection.java +++ b/src/main/java/de/learnlib/ralib/data/Bijection.java @@ -1,28 +1,33 @@ package de.learnlib.ralib.data; -import java.util.LinkedHashMap; -import java.util.LinkedHashSet; -import java.util.Map; -import java.util.Set; +import java.util.*; import de.learnlib.ralib.data.SymbolicDataValue.Register; -public class Bijection implements Map { +public class Bijection implements Map { - private final Map injection; - private final Map surjection; + private final Map injection; + private final Map surjection; public Bijection() { injection = new LinkedHashMap<>(); surjection = new LinkedHashMap<>(); } - public Bijection(Map map) { + public Bijection(Map map) { this(); putAll(injection, surjection, map); } - @Override + public static Bijection identity(List dataValues) { + Bijection bij = new Bijection<>(); + for (DataValue dv : dataValues) { + bij.put(dv, dv); + } + return bij; + } + + @Override public int size() { return injection.size(); } @@ -43,13 +48,13 @@ public boolean containsValue(Object value) { } @Override - public Register get(Object key) { + public T get(Object key) { return injection.get(key); } @Override - public Register remove(Object key) { - Register val = get(key); + public T remove(Object key) { + T val = get(key); injection.remove(key); surjection.remove(val); return val; @@ -62,18 +67,18 @@ public void clear() { } @Override - public Set keySet() { + public Set keySet() { return new LinkedHashSet<>(injection.keySet()); } @Override - public Set> entrySet() { + public Set> entrySet() { return new LinkedHashSet<>(injection.entrySet()); } @Override - public Register put(Register key, Register value) { - Register existingVal = injection.get(key); + public T put(T key, T value) { + T existingVal = injection.get(key); if (existingVal != null && !existingVal.equals(value)) { remove(key); } @@ -83,27 +88,27 @@ public Register put(Register key, Register value) { } @Override - public void putAll(Map map) { + public void putAll(Map map) { Bijection.putAll(injection, surjection, map); } @Override - public Set values() { + public Set values() { return new LinkedHashSet<>(injection.values()); } - public Bijection inverse() { - Bijection bi = new Bijection(); - for (Map.Entry e : injection.entrySet()) { + public Bijection inverse() { + Bijection bi = new Bijection<>(); + for (Map.Entry e : injection.entrySet()) { bi.put(e.getValue(), e.getKey()); } return bi; } - public Bijection compose(Bijection other) { - Bijection composition = new Bijection(); - for (Map.Entry entry : entrySet()) { - Register val = other.get(entry.getValue()); + public Bijection compose(Bijection other) { + Bijection composition = new Bijection<>(); + for (Map.Entry entry : entrySet()) { + T val = other.get(entry.getValue()); if (val == null) { throw new IllegalArgumentException("Registers mismatch"); } @@ -112,8 +117,8 @@ public Bijection compose(Bijection other) { return composition; } - public VarMapping toVarMapping() { - VarMapping vars = new VarMapping<>(); + public Mapping toVarMapping() { + Mapping vars = new Mapping<>(); vars.putAll(injection); return vars; } @@ -122,18 +127,18 @@ public String toString() { return injection.toString(); } - private static void putAll(Map in, - Map sur, - Map map) { - Set values = new LinkedHashSet<>(map.values()); + private static void putAll(Map in, + Map sur, + Map map) { + Set values = new LinkedHashSet<>(map.values()); if (map.keySet().size() != values.size()) { throw new IllegalArgumentException("Mismatched size of keyset and valueset"); } - for (Map.Entry e : map.entrySet()) { - Register key = e.getKey(); - Register val = e.getValue(); + for (Map.Entry e : map.entrySet()) { + U key = e.getKey(); + U val = e.getValue(); - Register existingVal = in.get(key); + U existingVal = in.get(key); if (existingVal != null && !existingVal.equals(val)) { sur.remove(val); } diff --git a/src/main/java/de/learnlib/ralib/data/DataType.java b/src/main/java/de/learnlib/ralib/data/DataType.java index 1b878fbc..7393320d 100644 --- a/src/main/java/de/learnlib/ralib/data/DataType.java +++ b/src/main/java/de/learnlib/ralib/data/DataType.java @@ -23,7 +23,8 @@ * * @author falk */ -public final class DataType { +// todo: make a record? +public final class DataType implements Comparable { /** * name of type (defining member) @@ -57,4 +58,8 @@ public String getName() { return name; } + @Override + public int compareTo(DataType o) { + return this.name.compareTo(o.name); + } } diff --git a/src/main/java/de/learnlib/ralib/data/DataValue.java b/src/main/java/de/learnlib/ralib/data/DataValue.java index aebaa4ff..8ec2ac93 100644 --- a/src/main/java/de/learnlib/ralib/data/DataValue.java +++ b/src/main/java/de/learnlib/ralib/data/DataValue.java @@ -19,6 +19,7 @@ import java.math.BigDecimal; import java.util.Objects; +import gov.nasa.jpf.constraints.api.Expression; import gov.nasa.jpf.constraints.expressions.Constant; import gov.nasa.jpf.constraints.types.BuiltinTypes; @@ -28,7 +29,8 @@ * * @author falk */ -public class DataValue extends Constant implements TypedValue { +public class DataValue extends Constant implements + TypedValue, SDTGuardElement, Comparable { protected final DataType type; @@ -76,4 +78,15 @@ public BigDecimal getValue() { public static DataValue valueOf(String strVal, DataType type) { return new DataValue(type, new BigDecimal(strVal)); } + + @Override + public Expression asExpression() { + return this; + } + + @Override + public int compareTo(DataValue o) { + int tc = this.type.compareTo(o.type); + return tc != 0 ? tc : this.getValue().compareTo(o.getValue()); + } } diff --git a/src/main/java/de/learnlib/ralib/data/PIV.java b/src/main/java/de/learnlib/ralib/data/PIV.java deleted file mode 100644 index 3edc75c0..00000000 --- a/src/main/java/de/learnlib/ralib/data/PIV.java +++ /dev/null @@ -1,115 +0,0 @@ -/* - * Copyright (C) 2014-2015 The LearnLib Contributors - * This file is part of LearnLib, http://www.learnlib.de/. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package de.learnlib.ralib.data; - -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; - -import de.learnlib.ralib.data.SymbolicDataValue.Parameter; -import de.learnlib.ralib.data.SymbolicDataValue.Register; - -/** - * A mapping from parameters to registers. - * - * @author falk - */ -public class PIV extends VarMapping { - - public PIV() { - } - - public PIV relabel(VarMapping relabelling) { - PIV ret = new PIV(); - for (Map.Entry e : this) { - Parameter p = (Parameter) relabelling.get(e.getKey()); - Register r = (Register) relabelling.get(e.getValue()); - ret.put(p == null ? e.getKey() : p, r == null ? e.getValue() : r); - } - return ret; - } - - public Map typedSize() { - Map ret = new LinkedHashMap<>(); - for (Parameter p : keySet()) { - Integer i = ret.get(p.getDataType()); - i = (i == null) ? 1 : i+1; - ret.put(p.getDataType(), i); - } - return ret; - } - - public Map asTypedArrays() { - Map> tmp = new LinkedHashMap<>(); - for (Parameter p : keySet()) { - List list = tmp.get(p.getDataType()); - if (list == null) { - list = new ArrayList<>(); - tmp.put(p.getDataType(), list); - } - list.add(p); - } - - Map ret = new LinkedHashMap<>(); - for (Map.Entry> e : tmp.entrySet()) { - ret.put(e.getKey(), e.getValue().toArray(new Parameter[] {})); - } - return ret; - } - - //FIXME: this method is bogus. There may be more than one value. - public Parameter getOneKey(Register value) { - Parameter retKey = null; - for (Map.Entry entry : this.entrySet()) { -// System.out.println("key = " + entry.getKey().toString()); -// System.out.println("value = " + entry.getValue().toString()); - if (entry.getValue().getId() == value.getId()){ -// System.out.println(entry.getValue().toString() + " equals " + value.toString()); - retKey = entry.getKey(); - break; - } - } - return retKey; - } - - /** - * Creates a remapping from registers from this PIV to the supplied PIV. - */ - public VarMapping createRemapping(PIV to) { - // there should not be any register with id > n - for (Register r : to.values()) { - if (r.getId() > to.size()) { - throw new IllegalStateException("there should not be any register with id > n: " + to); - } - } - - VarMapping map = new VarMapping<>(); - - int id = to.size() + 1; - for (Entry e : this) { - Register rep = to.get(e.getKey()); - if (rep == null) { - rep = new Register(e.getValue().getDataType(), id++); - } - map.put(e.getValue(), rep); - } - - return map; - } -} diff --git a/src/main/java/de/learnlib/ralib/data/RegisterAssignment.java b/src/main/java/de/learnlib/ralib/data/RegisterAssignment.java new file mode 100644 index 00000000..374c1ecd --- /dev/null +++ b/src/main/java/de/learnlib/ralib/data/RegisterAssignment.java @@ -0,0 +1,20 @@ +package de.learnlib.ralib.data; + + +import java.util.Map; + +/** + * A register assigment models which data values + * of a prefix are stored in which registers. + */ +public class RegisterAssignment extends Mapping { + + + public RegisterValuation registerValuation() { + RegisterValuation vars = new RegisterValuation(); + for (Map.Entry e : this.entrySet()) { + vars.put(e.getValue(), e.getKey()); + } + return vars; + } +} diff --git a/src/main/java/de/learnlib/ralib/data/SDTGuardElement.java b/src/main/java/de/learnlib/ralib/data/SDTGuardElement.java new file mode 100644 index 00000000..d808a989 --- /dev/null +++ b/src/main/java/de/learnlib/ralib/data/SDTGuardElement.java @@ -0,0 +1,24 @@ +package de.learnlib.ralib.data; + +import gov.nasa.jpf.constraints.api.Expression; + +import java.math.BigDecimal; + +public interface SDTGuardElement extends TypedValue { + + static boolean isConstant(SDTGuardElement e) { + return e.getClass().equals(SymbolicDataValue.Constant.class); + } + + static boolean isDataValue(SDTGuardElement e) { + return e.getClass().equals(DataValue.class); + } + + static boolean isSuffixValue(SDTGuardElement e) { + return e.getClass().equals(SymbolicDataValue.SuffixValue.class); + } + + Expression asExpression(); + + +} diff --git a/src/main/java/de/learnlib/ralib/data/SDTRelabeling.java b/src/main/java/de/learnlib/ralib/data/SDTRelabeling.java new file mode 100644 index 00000000..82f2f72c --- /dev/null +++ b/src/main/java/de/learnlib/ralib/data/SDTRelabeling.java @@ -0,0 +1,10 @@ +package de.learnlib.ralib.data; + +public class SDTRelabeling extends Mapping { + + public static SDTRelabeling fromBijection(Bijection in) { + SDTRelabeling ret = new SDTRelabeling(); + ret.putAll(in); + return ret; + } +} diff --git a/src/main/java/de/learnlib/ralib/data/SymbolicDataValue.java b/src/main/java/de/learnlib/ralib/data/SymbolicDataValue.java index 4c7aebaf..6f8f200a 100644 --- a/src/main/java/de/learnlib/ralib/data/SymbolicDataValue.java +++ b/src/main/java/de/learnlib/ralib/data/SymbolicDataValue.java @@ -19,6 +19,7 @@ import java.math.BigDecimal; import java.util.Objects; +import gov.nasa.jpf.constraints.api.Expression; import gov.nasa.jpf.constraints.api.Variable; import gov.nasa.jpf.constraints.types.BuiltinTypes; @@ -30,6 +31,9 @@ public sealed abstract class SymbolicDataValue extends Variable implements TypedValue permits SymbolicDataValue.Parameter, SymbolicDataValue.Constant, SymbolicDataValue.Register, SymbolicDataValue.SuffixValue { + /** + * a data parameter of an action + */ public static final class Parameter extends SymbolicDataValue { public Parameter(DataType dataType, int id) { @@ -37,6 +41,9 @@ public Parameter(DataType dataType, int id) { } } + /** + * a register in a register automaton + */ public static final class Register extends SymbolicDataValue { public Register(DataType dataType, int id) { @@ -44,22 +51,35 @@ public Register(DataType dataType, int id) { } } - public static final class Constant extends SymbolicDataValue { + /** + * a named constant in some theory + */ + public static final class Constant extends SymbolicDataValue implements SDTGuardElement { public Constant(DataType dataType, int id) { super(dataType, id, "c" + id); } + + @Override + public Expression asExpression() { + return this; + } } - /* - * a parameter in a suffix: + /** + * a parameter in a suffix or SDT guard */ // todo: we should replace those by v_i - public static final class SuffixValue extends SymbolicDataValue { + public static final class SuffixValue extends SymbolicDataValue implements SDTGuardElement { public SuffixValue(DataType dataType, int id) { super(dataType, id, "s" + id); } + + @Override + public Expression asExpression() { + return this; + } } final DataType type; diff --git a/src/main/java/de/learnlib/ralib/data/util/PIVRemappingIterator.java b/src/main/java/de/learnlib/ralib/data/util/PIVRemappingIterator.java deleted file mode 100644 index d3950be7..00000000 --- a/src/main/java/de/learnlib/ralib/data/util/PIVRemappingIterator.java +++ /dev/null @@ -1,130 +0,0 @@ -/* - * Copyright (C) 2014-2015 The LearnLib Contributors - * This file is part of LearnLib, http://www.learnlib.de/. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package de.learnlib.ralib.data.util; - -import java.util.Iterator; -import java.util.Map; - -import de.learnlib.ralib.data.DataType; -import de.learnlib.ralib.data.PIV; -import de.learnlib.ralib.data.SymbolicDataValue.Parameter; -import de.learnlib.ralib.data.VarMapping; - -/** - * Iterates all possible re-mappings between two VarMappings of the same size. - * - * @author falk - */ -public class PIVRemappingIterator implements Iterable, Iterator { - - private final PIV replace; - - private final PIV by; - - private final PermutationIterator[] iterators; - - private final Parameter[][] replaceParams; - - private final Parameter[][] byParams; - - private boolean init = false; - - public PIVRemappingIterator(PIV replace, PIV by) { - assert replace.typedSize().equals(by.typedSize()); - - this.replace = replace; - this.by = by; - - Map rep_ta = replace.asTypedArrays(); - Map by_ta = by.asTypedArrays(); - - iterators = new PermutationIterator[rep_ta.size()]; - replaceParams = new Parameter[rep_ta.size()][]; - byParams = new Parameter[by_ta.size()][]; - - int idx = 0; - for (Map.Entry entry : rep_ta.entrySet()) { - replaceParams[idx] = entry.getValue(); - byParams[idx] = by_ta.get(entry.getKey()); - iterators[idx] = new PermutationIterator(replaceParams[idx].length); - iterators[idx].next(); - idx++; - } - } - - @Override - public Iterator iterator() { - return this; - } - - @Override - public boolean hasNext() { - if (!init) { - return true; - } - - for (PermutationIterator pi : iterators) { - if (pi.hasNext()) { - return true; - } - } - return false; - } - - @Override - public VarMapping next() { - if (!init) { - init = true; - } else { - advance(); - } - VarMapping map = createMapping(); - return map; - } - - private void advance() { - for (int idx=iterators.length-1; idx>=0; idx--) { - PermutationIterator pi = iterators[idx]; - if (pi.hasNext()) { - pi.next(); - return; - } - iterators[idx] = new PermutationIterator(replaceParams[idx].length); - iterators[idx].next(); - } - } - - private VarMapping createMapping() { - VarMapping ret = new VarMapping(); - for (int idx=0; idx, Iterator { +public class RemappingIterator implements Iterable>, Iterator> { private final PermutationIterator permit; - private final Register[] replace; - private final Register[] by; + private final TypedValue[] replace; + private final TypedValue[] by; private int[] next; - public RemappingIterator(Set replace, Set by) { + public RemappingIterator(Collection replace, Collection by) { assert by.size() >= replace.size(); - this.replace = replace.toArray(new Register[replace.size()]); - this.by = by.toArray(new Register[by.size()]); + this.replace = replace.toArray(new TypedValue[] {}); + this.by = by.toArray(new TypedValue[] {}); permit = new PermutationIterator(by.size()); next = replace.size() > 0 ? advance(this.replace, this.by, permit) : new int[0]; @@ -31,12 +34,12 @@ public boolean hasNext() { @Override // public VarMapping next() { - public Bijection next() { + public Bijection next() { assert next != null : "No more permutations"; - VarMapping vars = new VarMapping<>(); + Mapping vars = new Mapping<>(); for (int i = 0; i < replace.length; i++) { int index = next[i]; - vars.put(replace[i], by[index]); + vars.put( (T) replace[i], (T) by[index]); } next = advance(replace, by, permit); @@ -45,11 +48,11 @@ public Bijection next() { } @Override - public Iterator iterator() { + public Iterator> iterator() { return this; } - private static boolean isValidPermutation(Register[] replace, Register[] by, int[] permutation) { + private static boolean isValidPermutation(TypedValue[] replace, TypedValue[] by, int[] permutation) { for (int i = 0; i < permutation.length; i++) { int index = permutation[i]; if (!replace[i].getDataType().equals(by[index].getDataType())) { @@ -59,7 +62,7 @@ private static boolean isValidPermutation(Register[] replace, Register[] by, int return true; } - private static int[] advance(Register[] replace, Register[] by, PermutationIterator permit) { + private static int[] advance(TypedValue[] replace, TypedValue[] by, PermutationIterator permit) { int[] next = null; while (permit.hasNext()) { next = permit.next(); diff --git a/src/main/java/de/learnlib/ralib/dt/DT.java b/src/main/java/de/learnlib/ralib/dt/DT.java index 961b8b3a..009039a0 100644 --- a/src/main/java/de/learnlib/ralib/dt/DT.java +++ b/src/main/java/de/learnlib/ralib/dt/DT.java @@ -12,11 +12,11 @@ import java.util.Set; import java.util.stream.Collectors; +import de.learnlib.ralib.data.Bijection; import org.apache.commons.lang3.tuple.Pair; import de.learnlib.ralib.data.Constants; import de.learnlib.ralib.data.DataType; -import de.learnlib.ralib.data.PIV; import de.learnlib.ralib.data.SymbolicDataValue.SuffixValue; import de.learnlib.ralib.data.util.SymbolicDataValueGenerator.SuffixValueGenerator; import de.learnlib.ralib.learning.LocationComponent; @@ -24,7 +24,6 @@ import de.learnlib.ralib.learning.ralambda.DiscriminationTree; import de.learnlib.ralib.learning.ralambda.RaLambda; import de.learnlib.ralib.oracles.TreeOracle; -import de.learnlib.ralib.oracles.TreeQueryResult; import de.learnlib.ralib.oracles.mto.OptimizedSymbolicSuffixBuilder; import de.learnlib.ralib.oracles.mto.SymbolicSuffixRestrictionBuilder; import de.learnlib.ralib.theory.SDT; @@ -88,7 +87,7 @@ public DTLeaf sift(Word prefix, boolean add) { if (leaf != null) { return leaf; } - MappedPrefix mp = new MappedPrefix(prefix, new PIV()); + MappedPrefix mp = new MappedPrefix(prefix, new Bijection<>()); DTLeaf result = sift(mp, root, add); return result; } @@ -96,7 +95,7 @@ public DTLeaf sift(Word prefix, boolean add) { public void initialize() { if (ioMode) { DTInnerNode parent = root; - MappedPrefix epsilon = new MappedPrefix(RaLambda.EMPTY_PREFIX, new PIV()); + MappedPrefix epsilon = new MappedPrefix(RaLambda.EMPTY_PREFIX, new Bijection<>()); for (ParameterizedSymbol symbol : inputs) { if (symbol instanceof OutputSymbol) { DTInnerNode outputNode = new DTInnerNode(new SymbolicSuffix(symbol)); @@ -145,7 +144,7 @@ private DTLeaf sift(MappedPrefix mp, DTInnerNode from, boolean add) { //tqr = mp.computeTQR(suffix, oracle); PathResult r = PathResult.computePathResult(oracle, mp, inner.getSuffixes(), ioMode); assert !mp.getTQRs().containsKey(suffix); - mp.addTQR(suffix, r.getTQRforSuffix(suffix)); + mp.addTQR(suffix, r.getSDTforSuffix(suffix)); leaf.setAccessSequence(mp); DTBranch branch = new DTBranch(leaf, r); inner.addBranch(branch); @@ -154,8 +153,9 @@ private DTLeaf sift(MappedPrefix mp, DTInnerNode from, boolean add) { leaf.updateBranching(this); return leaf; } - TreeQueryResult tqr = siftRes.getValue().getTQRforSuffix(suffix); + SDT tqr = siftRes.getValue().getSDTforSuffix(suffix); mp.addTQR(suffix, tqr); + mp.updateRemapping(siftRes.getValue().getRemapping()); if (!siftRes.getKey().isLeaf()) { inner = (DTInnerNode) siftRes.getKey(); } else { @@ -189,7 +189,7 @@ public void split(Word prefix, SymbolicSuffix suffix, DTLeaf le DTLeaf newLeaf = new DTLeaf(mp, oracle); newLeaf.setParent(node); PathResult r = PathResult.computePathResult(oracle, mp, node.getSuffixes(), ioMode); - TreeQueryResult tqr = r.getTQRforSuffix(suffix); + SDT tqr = r.getSDTforSuffix(suffix); assert !mp.getTQRs().containsKey(suffix); mp.addTQR(suffix, tqr); @@ -203,7 +203,7 @@ public void split(Word prefix, SymbolicSuffix suffix, DTLeaf le //TreeQueryResult tqr2 = leaf.getPrimePrefix().computeTQR(suffix, oracle); PathResult r2 = PathResult.computePathResult(oracle, leaf.getPrimePrefix(), node.getSuffixes(), ioMode); - TreeQueryResult tqr2 = r2.getTQRforSuffix(suffix); + SDT tqr2 = r2.getSDTforSuffix(suffix); leaf.getPrimePrefix().addTQR(suffix, tqr2); // assert !tqr.getSdt().isEquivalent(tqr2.getSdt(), new VarMapping<>()); DTBranch b = new DTBranch(leaf, r2); @@ -231,7 +231,7 @@ public void addSuffix(SymbolicSuffix suffix, DTLeaf leaf) { //TreeQueryResult tqr = leaf.getPrimePrefix().computeTQR(suffix, oracle); PathResult r = PathResult.computePathResult(oracle, leaf.getPrimePrefix(), node.getSuffixes(), ioMode); - TreeQueryResult tqr = r.getTQRforSuffix(suffix); + SDT tqr = r.getSDTforSuffix(suffix); assert !leaf.getPrimePrefix().getTQRs().containsKey(suffix); leaf.getPrimePrefix().addTQR(suffix, tqr); @@ -287,7 +287,7 @@ private void resift(DTLeaf leaf) { public boolean checkIOSuffixes() { if (ioMode) { for (DTBranch b : root.getBranches()) { - if (b.getUrap().getTQRforSuffix(root.getSuffix()).getSdt().isAccepting()) + if (b.getUrap().getSDTforSuffix(root.getSuffix()).isAccepting()) return checkIOSuffixes(b.getChild()); } throw new java.lang.RuntimeException("No accepting child of root"); diff --git a/src/main/java/de/learnlib/ralib/dt/DTBranch.java b/src/main/java/de/learnlib/ralib/dt/DTBranch.java index 06730d11..bd448477 100644 --- a/src/main/java/de/learnlib/ralib/dt/DTBranch.java +++ b/src/main/java/de/learnlib/ralib/dt/DTBranch.java @@ -1,7 +1,8 @@ package de.learnlib.ralib.dt; -import de.learnlib.ralib.data.VarMapping; -import de.learnlib.ralib.data.util.PIVRemappingIterator; +import de.learnlib.ralib.data.Bijection; +import de.learnlib.ralib.data.DataValue; +import de.learnlib.ralib.data.util.RemappingIterator; public class DTBranch { @@ -31,20 +32,27 @@ public DTNode getChild() { return child; } - public boolean matches(PathResult r) { + /** + * null if there is no match + * + * @param r + * @return + */ + public Bijection matches(PathResult r) { if (!urap.couldBeEquivalentTo(r)) { - return false; + return null; } - PIVRemappingIterator iterator = new PIVRemappingIterator( - r.getParsInVars(), urap.getParsInVars()); + RemappingIterator iterator = new RemappingIterator<>( + r.memorableValues(), urap.memorableValues()); - for (VarMapping m : iterator) { + for (Bijection m : iterator) { + //System.out.println("m: " + m); if (r.isEquivalentTo(urap, m)) { - return true; + return m; } } - return false; + return null; } PathResult getUrap() { diff --git a/src/main/java/de/learnlib/ralib/dt/DTInnerNode.java b/src/main/java/de/learnlib/ralib/dt/DTInnerNode.java index db7794c8..4ad85054 100644 --- a/src/main/java/de/learnlib/ralib/dt/DTInnerNode.java +++ b/src/main/java/de/learnlib/ralib/dt/DTInnerNode.java @@ -2,6 +2,8 @@ import java.util.*; +import de.learnlib.ralib.data.Bijection; +import de.learnlib.ralib.data.DataValue; import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; @@ -39,11 +41,13 @@ public DTInnerNode(DTInnerNode n) { protected Pair sift(MappedPrefix prefix, TreeOracle oracle, boolean ioMode) { PathResult r = PathResult.computePathResult(oracle, prefix, getSuffixes(), ioMode); for (DTBranch b : branches) { - if (b.matches(r)) { + Bijection remapping = b.matches(r); + if (remapping != null) { + r.setRemapping(remapping); return new ImmutablePair(b.getChild(), r); } } - + r.setRemapping(Bijection.identity(r.memorableValues())); return null; } diff --git a/src/main/java/de/learnlib/ralib/dt/DTLeaf.java b/src/main/java/de/learnlib/ralib/dt/DTLeaf.java index 4b6a39e1..57bc6198 100644 --- a/src/main/java/de/learnlib/ralib/dt/DTLeaf.java +++ b/src/main/java/de/learnlib/ralib/dt/DTLeaf.java @@ -1,27 +1,20 @@ package de.learnlib.ralib.dt; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Iterator; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.Map.Entry; -import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; import com.google.common.collect.Iterators; import com.google.common.collect.Sets; +import de.learnlib.ralib.learning.AutomatonBuilder; import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; import de.learnlib.ralib.automata.Assignment; import de.learnlib.ralib.data.*; -import de.learnlib.ralib.data.SymbolicDataValue.Parameter; import de.learnlib.ralib.data.SymbolicDataValue.Register; -import de.learnlib.ralib.data.util.PIVRemappingIterator; import de.learnlib.ralib.learning.LocationComponent; import de.learnlib.ralib.learning.PrefixContainer; import de.learnlib.ralib.learning.SymbolicSuffix; @@ -66,7 +59,7 @@ public DTLeaf(MappedPrefix as, TreeOracle oracle) { } public DTLeaf(DTLeaf l) { - access = new MappedPrefix(l.access); + access = new MappedPrefix(l.access, l.access.getRemapping()); shortPrefixes = new PrefixSet(l.shortPrefixes); otherPrefixes = new PrefixSet(l.otherPrefixes); branching.putAll(l.branching); @@ -74,11 +67,11 @@ public DTLeaf(DTLeaf l) { } public void addPrefix(Word p) { - otherPrefixes.add(new MappedPrefix(p)); + otherPrefixes.add(new MappedPrefix(p, new Bijection<>())); } public void addPrefix(MappedPrefix p) { - assert p.getParsInVars().size() == access.getParsInVars().size(); + assert p.memorableValues().size() == access.memorableValues().size(); otherPrefixes.add(p); } @@ -86,13 +79,6 @@ void setAccessSequence(MappedPrefix mp) { access = mp; } - public void addShortPrefix(Word prefix, PIV registers) { - if (access == null) - access = new MappedPrefix(prefix, registers); - else - addShortPrefix(new ShortPrefix(prefix, registers)); - } - public void addShortPrefix(ShortPrefix prefix) { if (otherPrefixes.contains(prefix.getPrefix())) otherPrefixes.remove(prefix.getPrefix()); @@ -100,12 +86,6 @@ public void addShortPrefix(ShortPrefix prefix) { shortPrefixes.add(prefix); } - public boolean removeShortPrefix(MappedPrefix p) { - return shortPrefixes.removeIf((e) -> { - return e.getPrefix().equals(p.getPrefix()); - }); - } - public boolean removeShortPrefix(Word p) { return shortPrefixes.remove(p); } @@ -138,8 +118,8 @@ public boolean isLeaf() { @Override public boolean isAccepting() { - TreeQueryResult tqr = access.getTQRs().get(RaStar.EMPTY_SUFFIX); - return tqr.getSdt().isAccepting(); + SDT tqr = access.getTQRs().get(RaStar.EMPTY_SUFFIX); + return tqr.isAccepting(); } MappedPrefix getMappedPrefix(Word p) { @@ -158,14 +138,16 @@ public Word getAccessSequence() { } @Override - public VarMapping getRemapping(PrefixContainer r) { + public Bijection getRemapping(PrefixContainer r) { if (r.getPrefix().equals(this.getAccessSequence())) - return null; + //fixme: should return identity instead + return Bijection.identity(this.access.memorableValues()); MappedPrefix mp = otherPrefixes.get(r.getPrefix()); if (mp == null) mp = shortPrefixes.get(r.getPrefix()); - PIVRemappingIterator it = new PIVRemappingIterator(mp.getParsInVars(), this.access.getParsInVars()); - return it.next(); + + assert mp != null; + return mp.getRemapping(); } @Override @@ -219,13 +201,13 @@ public MappedPrefix getPrefix(Word prefix) { return mp; } - public TreeQueryResult getTQR(Word prefix, SymbolicSuffix suffix) { + public SDT getTQR(Word prefix, SymbolicSuffix suffix) { MappedPrefix mp = getMappedPrefix(prefix); return mp.getTQRs().get(suffix); } - void addTQRs(PIV primePIV, SymbolicSuffix suffix) { - access.updateMemorable(primePIV); + void addTQRs(SymbolicSuffix suffix) { + //access.updateMemorable(primePIV); Iterator it = Iterators.concat(shortPrefixes.iterator(), otherPrefixes.iterator()); while (it.hasNext()) { MappedPrefix mp = it.next(); @@ -233,11 +215,11 @@ void addTQRs(PIV primePIV, SymbolicSuffix suffix) { } } - void addTQRs(PIV primePIV, SymbolicSuffix s, boolean addToAccess) { + void addTQRs(SymbolicSuffix s, boolean addToAccess) { if (addToAccess) { access.computeTQR(s, oracle); } - addTQRs(primePIV, s); + addTQRs(s); } @Override @@ -261,6 +243,7 @@ public Collection getOtherPrefixes() { */ public Pair, Word> elevatePrefix(DT dt, Word prefix, DTHyp hyp, SDTLogicOracle logicOracle) { + assert !shortPrefixes.contains(prefix) : prefix + " is already a short prefix"; MappedPrefix mp = otherPrefixes.get(prefix); assert mp != null : "Cannot elevate prefix that is not contained in leaf " + this + " === " + prefix; ShortPrefix sp = new ShortPrefix(mp); @@ -276,12 +259,11 @@ private Pair, Word> startPrefix(DT dt, Sh for (ParameterizedSymbol ps : dt.getInputs()) { SDT[] sdtsP = this.getSDTsForInitialSymbol(mp, ps); - Branching prefixBranching = oracle.getInitialBranching(mp.getPrefix(), ps, mp.getParsInVars(), sdtsP); + Branching prefixBranching = oracle.getInitialBranching(mp.getPrefix(), ps, sdtsP); mp.putBranching(ps, prefixBranching); SDT[] sdtsAS = this.getSDTsForInitialSymbol(this.getPrimePrefix(), ps); - Branching accessBranching = oracle.getInitialBranching(getAccessSequence(), ps, this.access.getParsInVars(), - sdtsAS); + Branching accessBranching = oracle.getInitialBranching(getAccessSequence(), ps, sdtsAS); assert prefixBranching.getBranches().size() == accessBranching.getBranches().size(); @@ -300,11 +282,10 @@ private Pair, Word> startPrefix(DT dt, Sh break; } } - assert a != null; } else { - a = branchWithSameGuard(p, prefixBranching, mp.getParsInVars(), accessBranching, access.getParsInVars(), logicOracle); + a = branchWithSameGuard(p, prefixBranching, this.getRemapping(mp), accessBranching, logicOracle); } - + assert a != null; DTLeaf leaf = dt.sift(p, true); if (!dt.getLeaf(a).equals(leaf)) { @@ -315,7 +296,7 @@ private Pair, Word> startPrefix(DT dt, Sh return divergance; } - static public Word branchWithSameGuard(Word word, Branching wordBranching, PIV wordPIV, Branching accBranching, PIV accPIV, SDTLogicOracle oracle) { + static public Word branchWithSameGuard(Word word, Branching wordBranching, Bijection remapping, Branching accBranching, SDTLogicOracle oracle) { Word a = null; Expression g = null; for (Entry, Expression> e : wordBranching.getBranches().entrySet()) { @@ -324,15 +305,20 @@ static public Word branchWithSameGuard(Word wo break; } } - + assert g != null; + //System.out.println("w:" + word); + //System.out.println("g: " + g); + //System.out.println("pi: " + remapping); for (Entry, Expression> e : accBranching.getBranches().entrySet()) { Expression ag = e.getValue(); - boolean eq = oracle.areEquivalent(g, accPIV, ag, accPIV, new Mapping()); + //System.out.println("ag: " + ag); + boolean eq = oracle.areEquivalent(ag, remapping, g, new Mapping()); if (eq) { a = e.getKey(); break; } } + assert a != null; return a; } @@ -355,7 +341,7 @@ void start(DT dt, boolean ioMode, ParameterizedSymbol... inputs) { for (ParameterizedSymbol ps : inputs) { SDT[] sdts = this.getSDTsForInitialSymbol(ps); - Branching b = oracle.getInitialBranching(getAccessSequence(), ps, access.getParsInVars(), sdts); + Branching b = oracle.getInitialBranching(getAccessSequence(), ps, sdts); branching.put(ps, b); for (Word prefix : b.getBranches().keySet()) { if (ioMode && (dt.getSink() != null) && (input ^ isInput(ps))) @@ -382,7 +368,7 @@ boolean updateBranching(DT dt) { private boolean updateBranching(ParameterizedSymbol ps, DiscriminationTree dt) { Branching b = branching.get(ps); SDT[] sdts = getSDTsForInitialSymbol(ps); - Branching newB = oracle.updateBranching(access.getPrefix(), ps, b, access.getParsInVars(), sdts); + Branching newB = oracle.updateBranching(access.getPrefix(), ps, b, sdts); boolean ret = true; for (Word prefix : newB.getBranches().keySet()) { @@ -403,7 +389,7 @@ private boolean updateBranching(ParameterizedSymbol ps, DiscriminationTree dt) { private boolean updateBranching(ParameterizedSymbol ps, ShortPrefix sp, DiscriminationTree dt) { Branching b = sp.getBranching(ps); SDT[] sdts = getSDTsForInitialSymbol(sp, ps); - Branching newB = oracle.updateBranching(sp.getPrefix(), ps, b, sp.getParsInVars(), sdts); + Branching newB = oracle.updateBranching(sp.getPrefix(), ps, b, sdts); boolean ret = true; for (Word prefix : newB.getBranches().keySet()) { @@ -422,15 +408,16 @@ private SDT[] getSDTsForInitialSymbol(ParameterizedSymbol p) { private SDT[] getSDTsForInitialSymbol(MappedPrefix mp, ParameterizedSymbol p) { List sdts = new ArrayList<>(); - for (Entry e : mp.getTQRs().entrySet()) { + for (Entry e : mp.getTQRs().entrySet()) { Word acts = e.getKey().getActions(); if (acts.length() > 0 && acts.firstSymbol().equals(p)) { - sdts.add(makeConsistent(e.getValue().getSdt(), e.getValue().getPiv(), mp.getParsInVars())); + sdts.add(e.getValue()); } } return sdts.toArray(new SDT[] {}); } + /* private SDT makeConsistent(SDT sdt, PIV piv, PIV memorable) { VarMapping relabeling = new VarMapping(); for (Entry e : piv.entrySet()) { @@ -439,6 +426,7 @@ private SDT makeConsistent(SDT sdt, PIV piv, PIV memorable) { } return sdt.relabel(relabeling); } + */ public boolean checkVariableConsistency(DT dt, Constants consts, OptimizedSymbolicSuffixBuilder suffixBuilder) { if (!checkVariableConsistency(access, dt, consts, suffixBuilder)) { @@ -466,48 +454,49 @@ private boolean checkVariableConsistency(MappedPrefix mp, DT dt, Constants const DTLeaf prefixLeaf = dt.getLeaf(prefix); MappedPrefix prefixMapped = prefixLeaf.getMappedPrefix(prefix); - PIV memPrefix = prefixMapped.getParsInVars(); - PIV memMP = mp.getParsInVars(); + List memPrefix = prefixMapped.memorableValues(); + List memMP = mp.memorableValues(); int max = DataWords.paramLength(DataWords.actsOf(prefix)); - - for (Parameter p : memMP.keySet()) { - boolean prefixMissingParam = !memPrefix.containsKey(p) || - prefixMapped.missingParameter.contains(p); - if (prefixMissingParam && p.getId() <= max) { - Set prefixSuffixes = prefixMapped.getAllSuffixesForMemorable(p); - Set suffixes = mp.getAllSuffixesForMemorable(p); + List mpVals = Arrays.stream(DataWords.valsOf(mp.getPrefix())).toList(); + + for (DataValue d : memMP) { + boolean prefixMissingParam = !memPrefix.contains(d) || + prefixMapped.missingParameter.contains(d); + if (prefixMissingParam && mpVals.indexOf(d) < max) { + List prefixSuffixes = prefixMapped.getAllSuffixesForMemorable(d); + List suffixes = mp.getAllSuffixesForMemorable(d); assert !suffixes.isEmpty(); for (SymbolicSuffix suffix : suffixes) { - TreeQueryResult suffixTQR = mp.getTQRs().get(suffix); - SDT sdt = suffixTQR.getSdt(); + SDT sdt = mp.getTQRs().get(suffix); // suffixBuilder == null ==> suffix.isOptimizedGeneric() assert suffixBuilder != null || suffix.isOptimizationGeneric() : "Optimized with restriction builder, but no restriction builder provided"; - SymbolicSuffix newSuffix = suffixBuilder != null && sdt instanceof SDT ? - suffixBuilder.extendSuffix(mp.getPrefix(), sdt, suffixTQR.getPiv(), suffix, suffixTQR.getPiv().get(p)) : + SymbolicSuffix newSuffix = suffixBuilder != null ? + suffixBuilder.extendSuffix(mp.getPrefix(), sdt, suffix, d) : new SymbolicSuffix(mp.getPrefix(), suffix, consts); if (prefixSuffixes.contains(newSuffix)) continue; TreeQueryResult tqr = oracle.treeQuery(prefix, newSuffix); - if (tqr.getPiv().containsKey(p)) { + if (tqr.sdt().getDataValues().contains(d)) { dt.addSuffix(newSuffix, prefixLeaf); - mp.missingParameter.remove(p); + mp.missingParameter.remove(d); return false; } } - if (!prefixMapped.missingParameter.contains(p)) { - mp.missingParameter.add(p); + if (!prefixMapped.missingParameter.contains(d)) { + mp.missingParameter.add(d); } } else { - mp.missingParameter.remove(p); + mp.missingParameter.remove(d); } } return true; } + public boolean checkRegisterConsistency(DT dt, Constants consts, OptimizedSymbolicSuffixBuilder suffixBuilder) { - if (access.getParsInVars().isEmpty()) + if (access.memorableValues().isEmpty()) return true; if (!checkRegisterConsistency(access, dt, consts, suffixBuilder)) @@ -530,29 +519,29 @@ public boolean checkRegisterConsistency(MappedPrefix mp, DT dt, Constants consts if (mp.getPrefix().length() < 2) return true; - PIV memMP = mp.getParsInVars(); + Set memMP = Set.of(mp.memorableValues().toArray(new DataValue[0])); if (memMP.isEmpty()) return true; Word prefix = mp.getPrefix().prefix(mp.getPrefix().length() - 1); DTLeaf prefixLeaf = dt.getLeaf(prefix); MappedPrefix prefixMapped = prefixLeaf.getMappedPrefix(prefix); - PIV memPrefix = prefixMapped.getParsInVars(); + Set memPrefix = Set.of(prefixMapped.memorableValues().toArray(new DataValue[0])); - Set paramsIntersect = Sets.intersection(memPrefix.keySet(), memMP.keySet()); - if (prefixMapped.equivalentRenamings(memPrefix.keySet()).size() < 2) + Set paramsIntersect = Sets.intersection(memPrefix, memMP); + if (prefixMapped.equivalentRenamings(memPrefix).size() < 2) return true; // if (renamingsPrefix.size() < 2) // return true; // there are no equivalent renamings if (!paramsIntersect.isEmpty() && paramsIntersect.size() < memPrefix.size()) { // word shares some data values with prefix, but not all - for (Map.Entry e : mp.getTQRs().entrySet()) { - PIV piv = e.getValue().getPiv(); - if (!Sets.intersection(piv.keySet(), paramsIntersect).isEmpty()) { - SDT sdt = e.getValue().getSdt(); + for (Map.Entry e : mp.getTQRs().entrySet()) { + Set piv = Set.of(e.getValue().getDataValues().toArray(new DataValue[0])); + if (!Sets.intersection(piv, paramsIntersect).isEmpty()) { + SDT sdt = e.getValue(); SymbolicSuffix newSuffix = suffixBuilder != null && sdt instanceof SDT ? - suffixBuilder.extendSuffix(mp.getPrefix(), sdt, piv, e.getKey()) : + suffixBuilder.extendSuffix(mp.getPrefix(), sdt, e.getKey()) : new SymbolicSuffix(mp.getPrefix(), e.getKey(), consts); if (!prefixMapped.getTQRs().containsKey(newSuffix)) { dt.addSuffix(newSuffix, prefixLeaf); @@ -562,25 +551,25 @@ public boolean checkRegisterConsistency(MappedPrefix mp, DT dt, Constants consts } } - Set> renamingsPrefix = prefixMapped.equivalentRenamings(paramsIntersect); + Set> renamingsPrefix = prefixMapped.equivalentRenamings(paramsIntersect); if (renamingsPrefix.size() < 2) return true; // there are no equivalent renamings - Set> renamingsMP = mp.equivalentRenamings(paramsIntersect); - Set> difference = Sets.difference(renamingsPrefix, renamingsMP); + Set> renamingsMP = mp.equivalentRenamings(paramsIntersect); + Set> difference = Sets.difference(renamingsPrefix, renamingsMP); if (!difference.isEmpty()) { // there are symmetric parameter mappings in the prefix which are not symmetric in mp - for (Map.Entry e : mp.getTQRs().entrySet()) { - SDT sdt = e.getValue().getSdt(); - for (VarMapping vm : difference) { + for (Map.Entry e : mp.getTQRs().entrySet()) { + SDT sdt = e.getValue(); + for (Bijection vm : difference) { VarMapping renaming = new VarMapping<>(); - for (Map.Entry paramRenaming : vm.entrySet()) { + /*for (Map.Entry paramRenaming : vm.entrySet()) { Register oldRegister = memPrefix.get(paramRenaming.getKey()); Register newRegister = memPrefix.get(paramRenaming.getValue()); renaming.put(oldRegister, newRegister); - } - if (!sdt.isEquivalent(sdt, renaming)) { + }*/ + if (!sdt.isEquivalent(sdt, vm)) { SymbolicSuffix newSuffix = suffixBuilder != null && sdt instanceof SDT ? - suffixBuilder.extendSuffix(mp.getPrefix(), sdt, e.getValue().getPiv(), e.getKey()) : + suffixBuilder.extendSuffix(mp.getPrefix(), sdt, e.getKey()) : new SymbolicSuffix(mp.getPrefix(), e.getKey(), consts); dt.addSuffix(newSuffix, prefixLeaf); return false; @@ -588,7 +577,6 @@ public boolean checkRegisterConsistency(MappedPrefix mp, DT dt, Constants consts } } } - return true; } public boolean isMissingVariable() { @@ -614,31 +602,11 @@ public static boolean isInput(ParameterizedSymbol ps) { } public Assignment getAssignment(Word dest_id, DTLeaf dest_c) { - MappedPrefix r = dest_c.getPrefix(dest_id); - // assignment - VarMapping assignments = new VarMapping(); - int max = DataWords.paramLength(DataWords.actsOf(getAccessSequence())); - PIV parsInVars_Src = getPrimePrefix().getParsInVars(); - PIV parsInVars_Row = r.getParsInVars(); - VarMapping remapping = dest_c.getRemapping(r); - - for (Entry e : parsInVars_Row) { - // param or register - Parameter p = e.getKey(); - // remapping is null for prime rows ... - Register rNew = (remapping == null) ? e.getValue() : (Register) remapping.get(e.getValue()); - if (p.getId() > max) { - Parameter pNew = new Parameter(p.getDataType(), p.getId() - max); - assignments.put(rNew, pNew); - } else { - Register rOld = parsInVars_Src.get(p); - assert rOld != null; - assignments.put(rNew, rOld); - } - } - return new Assignment(assignments); - + RegisterAssignment srcAssign = getPrimePrefix().getAssignment(); + RegisterAssignment dstAssign = dest_c.access.getAssignment(); + Bijection remap = dest_c.getRemapping(r); + return AutomatonBuilder.computeAssignment(r.getPrefix(), srcAssign, dstAssign, remap); } @Override diff --git a/src/main/java/de/learnlib/ralib/dt/MappedPrefix.java b/src/main/java/de/learnlib/ralib/dt/MappedPrefix.java index 9c696b4a..ab88ec91 100644 --- a/src/main/java/de/learnlib/ralib/dt/MappedPrefix.java +++ b/src/main/java/de/learnlib/ralib/dt/MappedPrefix.java @@ -1,82 +1,56 @@ package de.learnlib.ralib.dt; -import java.util.LinkedHashMap; -import java.util.LinkedHashSet; -import java.util.Map; +import java.util.*; import java.util.Map.Entry; -import java.util.Set; -import de.learnlib.ralib.data.PIV; -import de.learnlib.ralib.data.SymbolicDataValue.Parameter; -import de.learnlib.ralib.data.SymbolicDataValue.Register; -import de.learnlib.ralib.data.VarMapping; -import de.learnlib.ralib.data.util.PermutationIterator; +import de.learnlib.ralib.data.*; +import de.learnlib.ralib.data.util.RemappingIterator; +import de.learnlib.ralib.data.util.SymbolicDataValueGenerator; import de.learnlib.ralib.data.util.SymbolicDataValueGenerator.RegisterGenerator; import de.learnlib.ralib.learning.PrefixContainer; import de.learnlib.ralib.learning.SymbolicSuffix; import de.learnlib.ralib.oracles.TreeOracle; import de.learnlib.ralib.oracles.TreeQueryResult; +import de.learnlib.ralib.theory.SDT; import de.learnlib.ralib.words.PSymbolInstance; import net.automatalib.word.Word; public class MappedPrefix implements PrefixContainer { + private final Word prefix; - private final PIV memorable = new PIV(); private final RegisterGenerator regGen = new RegisterGenerator(); - private final Map tqrs = new LinkedHashMap(); - public final Set missingParameter = new LinkedHashSet<>(); - public MappedPrefix(Word prefix) { - this.prefix = prefix; - } + private Bijection remapping; + private final Map tqrs = new LinkedHashMap(); + public final Set missingParameter = new LinkedHashSet<>(); - public MappedPrefix(Word prefix, PIV piv) { + public MappedPrefix(Word prefix, Bijection remapping) { this.prefix = prefix; - updateMemorable(piv); + this.remapping = remapping; } - MappedPrefix(MappedPrefix mp) { + MappedPrefix(MappedPrefix mp, Bijection remapping) { this.prefix = mp.getPrefix(); - updateMemorable(mp.getParsInVars()); tqrs.putAll(mp.getTQRs()); + this.remapping = remapping; } - public Set> equivalentRenamings(Set params) { + public Set> equivalentRenamings(Set params) { - assert memorable.keySet().containsAll(params); + assert new HashSet<>(memorableValues()).containsAll(params); - Parameter[] params_arr = new Parameter[params.size()]; - params_arr = params.toArray(params_arr); - PermutationIterator permutations = new PermutationIterator(params_arr.length); - Set> renamings = new LinkedHashSet<>(); - - LOC: while (permutations.hasNext()) { - int[] perm = permutations.next(); - VarMapping paramRenaming = new VarMapping<>(); - VarMapping registerRenaming = new VarMapping<>(); - for (int i = 0; i < params_arr.length; i++) { - Parameter po = params_arr[i]; - Parameter pr = params_arr[perm[i]]; - paramRenaming.put(params_arr[i], params_arr[perm[i]]); - registerRenaming.put(memorable.get(po), memorable.get(pr)); - } - for (TreeQueryResult tqr : tqrs.values()) { - if (!tqr.getSdt().isEquivalent(tqr.getSdt(), registerRenaming)) + Set> renamings = new LinkedHashSet<>(); + RemappingIterator iter = new RemappingIterator<>(params, params); + LOC: for (Bijection b : iter) { + for (SDT tqr : tqrs.values()) { + if (!tqr.isEquivalent(tqr, b)) continue LOC; } - renamings.add(paramRenaming); + renamings.add(b); } + return renamings; } - void updateMemorable(PIV piv) { - for (Entry e : piv.entrySet()) { - Register r = memorable.get(e.getKey()); - if (r == null) { - r = regGen.next(e.getKey().getDataType()); - memorable.put(e.getKey(), r); - } - } - } /* * Performs a tree query for the (new) suffix and stores it in its internal map. @@ -84,17 +58,17 @@ void updateMemorable(PIV piv) { */ TreeQueryResult computeTQR(SymbolicSuffix suffix, TreeOracle oracle) { TreeQueryResult tqr = oracle.treeQuery(prefix, suffix); - addTQR(suffix, tqr); + addTQR(suffix, tqr.sdt()); return tqr; } - void addTQR(SymbolicSuffix s, TreeQueryResult tqr) { + void addTQR(SymbolicSuffix s, SDT tqr) { if (tqrs.containsKey(s) || tqr == null) return; tqrs.put(s, tqr); - updateMemorable(tqr.getPiv()); + //updateMemorable(tqr.getPiv()); } - public Map getTQRs() { + public Map getTQRs() { return tqrs; } @@ -103,30 +77,52 @@ public Word getPrefix() { return this.prefix; } + public Bijection getRemapping() { + return remapping; + } + + public void updateRemapping(Bijection remapping) { + this.remapping = remapping; + } + + public List memorableValues() { + return this.tqrs.values().stream() + .flatMap(sdt -> sdt.getDataValues().stream()) + .distinct() + .sorted() + .toList(); + } + @Override - public String toString() { - return "{" + prefix.toString() + ", " + memorable + "}"; + public RegisterAssignment getAssignment() { + RegisterAssignment ra = new RegisterAssignment(); + SymbolicDataValueGenerator.RegisterGenerator regGen = + new SymbolicDataValueGenerator.RegisterGenerator(); + + this.memorableValues().forEach( + dv -> ra.put(dv, regGen.next(dv.getDataType())) + ); + + return ra; } @Override - public PIV getParsInVars() { - return memorable; + public String toString() { + return "{" + prefix.toString() + ", " + Arrays.toString(memorableValues().toArray()) + "}"; } - SymbolicSuffix getSuffixForMemorable(Parameter p) { - for (Entry e : tqrs.entrySet()) { - if (e.getValue().getPiv().containsKey(p)) - return e.getKey(); - } - throw new IllegalStateException("This line is not supposed to be reached."); + SymbolicSuffix getSuffixForMemorable(DataValue d) { + return tqrs.entrySet().stream() + .filter(e -> e.getValue().getDataValues().contains(d)) + .findFirst() + .orElseThrow(() -> new IllegalStateException("This line is not supposed to be reached.")) + .getKey(); } - Set getAllSuffixesForMemorable(Parameter p) { - Set suffixes = new LinkedHashSet(); - for (Entry e : tqrs.entrySet()) { - if (e.getValue().getPiv().containsKey(p)) - suffixes.add(e.getKey()); - } - return suffixes; + List getAllSuffixesForMemorable(DataValue d) { + return tqrs.entrySet().stream() + .filter(e -> e.getValue().getDataValues().contains(d)) + .map(Entry::getKey) + .toList(); } } diff --git a/src/main/java/de/learnlib/ralib/dt/PathResult.java b/src/main/java/de/learnlib/ralib/dt/PathResult.java index fb39d828..f608d985 100644 --- a/src/main/java/de/learnlib/ralib/dt/PathResult.java +++ b/src/main/java/de/learnlib/ralib/dt/PathResult.java @@ -3,14 +3,13 @@ import java.util.*; -import de.learnlib.ralib.data.PIV; -import de.learnlib.ralib.data.SymbolicDataValue; -import de.learnlib.ralib.data.VarMapping; +import de.learnlib.ralib.data.*; import de.learnlib.ralib.data.util.SymbolicDataValueGenerator; import de.learnlib.ralib.learning.SymbolicSuffix; import de.learnlib.ralib.learning.rastar.RaStar; import de.learnlib.ralib.oracles.TreeOracle; -import de.learnlib.ralib.oracles.TreeQueryResult; +import de.learnlib.ralib.theory.Memorables; +import de.learnlib.ralib.theory.SDT; import de.learnlib.ralib.words.InputSymbol; import de.learnlib.ralib.words.OutputSymbol; @@ -22,9 +21,9 @@ */ public class PathResult { - private final Map results; + private final Map results; - private final PIV memorable = new PIV(); + private Bijection remapping; private final SymbolicDataValueGenerator.RegisterGenerator regGen = new SymbolicDataValueGenerator.RegisterGenerator(); @@ -35,40 +34,26 @@ private PathResult(boolean ioMode) { this.ioMode = ioMode; } - private void addResult(SymbolicSuffix s, TreeQueryResult tqr) { - - // make sure that pars-in-vars is consistent with - // existing cells in his row - PIV cpv = tqr.getPiv(); - VarMapping relabelling = new VarMapping(); - for (Map.Entry e : cpv.entrySet()) { - SymbolicDataValue.Register r = this.memorable.get(e.getKey()); - if (r == null) { - r = regGen.next(e.getKey().getDataType()); - memorable.put(e.getKey(), r); - } - relabelling.put(e.getValue(), r); - } - - this.results.put(s, new TreeQueryResult(tqr.getPiv().relabel(relabelling), tqr.getSdt().relabel(relabelling))); + private void addResult(SymbolicSuffix s, SDT tqr) { + this.results.put(s, tqr); } - public PIV getParsInVars() { - return this.memorable; + public boolean isEquivalentTo(PathResult other, Bijection renaming) { + return isEquivalentTo(other, SDTRelabeling.fromBijection(renaming)); } - public boolean isEquivalentTo(PathResult other, VarMapping renaming) { + public boolean isEquivalentTo(PathResult other, SDTRelabeling renaming) { if (!couldBeEquivalentTo(other)) { return false; } - if (!this.memorable.relabel(renaming).equals(other.memorable)) { + if (!Memorables.relabel(this.memorableValues(), renaming).equals(other.memorableValues())) { return false; } - for (Map.Entry e : this.results.entrySet()) { - TreeQueryResult c1 = e.getValue(); - TreeQueryResult c2 = other.results.get(e.getKey()); + for (Map.Entry e : this.results.entrySet()) { + SDT c1 = e.getValue(); + SDT c2 = other.results.get(e.getKey()); if (ioMode) { if (c1 == null && c2 == null) { @@ -87,24 +72,19 @@ public boolean isEquivalentTo(PathResult other, VarMapping renaming) { return true; } - boolean isEquivalentTo(TreeQueryResult c1, TreeQueryResult c2, VarMapping renaming) { - if (!couldBeEquivalentTo(c1, c2)) { - return false; - } - - return c1.getPiv().relabel(renaming).equals(c2.getPiv()) && - c1.getSdt().isEquivalent(c2.getSdt(), renaming); - + boolean isEquivalentTo(SDT c1, SDT c2, SDTRelabeling renaming) { + if (!couldBeEquivalentTo(c1, c2)) return false; + return Memorables.relabel(c1.getDataValues(), renaming).equals(c2.getDataValues()) && c2.isEquivalent(c1, renaming); } boolean couldBeEquivalentTo(PathResult other) { - if (!this.memorable.typedSize().equals(other.memorable.typedSize())) { + if (!Memorables.typedSize(this.memorableValues()).equals(Memorables.typedSize(other.memorableValues()))) { return false; } - for (Map.Entry e : this.results.entrySet()) { - TreeQueryResult c1 = e.getValue(); - TreeQueryResult c2 = other.results.get(e.getKey()); + for (Map.Entry e : this.results.entrySet()) { + SDT c1 = e.getValue(); + SDT c2 = other.results.get(e.getKey()); if (ioMode) { if (c1 == null && c2 == null) { @@ -123,8 +103,17 @@ boolean couldBeEquivalentTo(PathResult other) { return true; } - private boolean couldBeEquivalentTo(TreeQueryResult c1, TreeQueryResult c2) { - return c1.getPiv().typedSize().equals(c2.getPiv().typedSize()); + public List memorableValues() { + return results.values().stream() + .flatMap(sdt -> sdt.getDataValues().stream()) + .distinct() + .sorted() + .toList(); + } + + + private boolean couldBeEquivalentTo(SDT c1, SDT c2) { + return Memorables.typedSize(c1.getDataValues()).equals(Memorables.typedSize(c2.getDataValues())); } /** @@ -141,22 +130,22 @@ public static PathResult computePathResult(TreeOracle oracle, PathResult r = new PathResult(ioMode); for (SymbolicSuffix s : suffixes) { //todo: potential for optimization - if (ioMode && s.getActions().length() > 0) { + if (ioMode && !s.getActions().isEmpty()) { // error row - if (prefix.getPrefix().length() > 0 && !r.isAccepting()) { + if (!prefix.getPrefix().isEmpty() && !r.isAccepting()) { //log.log(Level.INFO, "Not adding suffix " + s + " to error row " + r.getPrefix()); continue; } // unmatching suffix - if ((prefix.getPrefix().length() < 1 && (s.getActions().firstSymbol() instanceof OutputSymbol)) - || (prefix.getPrefix().length() > 0 && prefix.getPrefix().lastSymbol().getBaseSymbol() instanceof InputSymbol == s.getActions().firstSymbol() instanceof InputSymbol)) { + if ((prefix.getPrefix().isEmpty() && (s.getActions().firstSymbol() instanceof OutputSymbol)) + || (!prefix.getPrefix().isEmpty() && prefix.getPrefix().lastSymbol().getBaseSymbol() instanceof InputSymbol == s.getActions().firstSymbol() instanceof InputSymbol)) { //log.log(Level.INFO, "Not adding suffix " + s + " to unmatching row " + r.getPrefix()); continue; } } - TreeQueryResult tqr = prefix.getTQRs().get(s); + SDT tqr = prefix.getTQRs().get(s); if (tqr == null) { - tqr = oracle.treeQuery(prefix.getPrefix(), s); + tqr = oracle.treeQuery(prefix.getPrefix(), s).sdt(); } //System.out.println("TQ: " + prefix + " : " + s + " : " + tqr); r.addResult(s, tqr); @@ -165,29 +154,33 @@ public static PathResult computePathResult(TreeOracle oracle, } public boolean isAccepting() { - TreeQueryResult c = this.results.get(RaStar.EMPTY_SUFFIX); - return c.getSdt().isAccepting(); + SDT c = this.results.get(RaStar.EMPTY_SUFFIX); + return c.isAccepting(); + } + + public Bijection getRemapping() { + return remapping; } - public TreeQueryResult getTQRforSuffix(SymbolicSuffix suffix) { + public void setRemapping(Bijection remapping) { + this.remapping = remapping; + } + + public SDT getSDTforSuffix(SymbolicSuffix suffix) { return results.get(suffix); } public PathResult copy() { PathResult r = new PathResult(ioMode); - for (Map.Entry e : this.results.entrySet()) { - r.results.put(e.getKey(), new TreeQueryResult(e.getValue().getPiv(), e.getValue().getSdt().copy())); - } - r.memorable.putAll(this.memorable); + this.results.forEach((key, value) -> r.results.put(key, value.copy())); return r; } @Override public String toString() { StringBuilder sb = new StringBuilder(); - for (Map.Entry e : this.results.entrySet()) { - sb.append("[").append(e.getKey()).append("->").append(e.getValue().getSdt().toString().replaceAll("\\s+", " ")).append("] "); - } + this.results.forEach((key, value) -> sb.append("[").append(key).append("->") + .append(value.toString().replaceAll("\\s+", " ")).append("] ")); return sb.toString(); } } diff --git a/src/main/java/de/learnlib/ralib/dt/PrefixSet.java b/src/main/java/de/learnlib/ralib/dt/PrefixSet.java index 56a8d911..f6d0cac5 100644 --- a/src/main/java/de/learnlib/ralib/dt/PrefixSet.java +++ b/src/main/java/de/learnlib/ralib/dt/PrefixSet.java @@ -6,7 +6,8 @@ import java.util.Set; import java.util.function.Predicate; -import de.learnlib.ralib.data.PIV; +import de.learnlib.ralib.data.Bijection; +import de.learnlib.ralib.data.DataValue; import de.learnlib.ralib.words.PSymbolInstance; import net.automatalib.word.Word; @@ -25,7 +26,7 @@ public void add(MappedPrefix p) { prefixes.add(p); } - public void add(Word p, PIV piv) { + public void add(Word p, Bijection piv) { prefixes.add(new MappedPrefix(p, piv)); } diff --git a/src/main/java/de/learnlib/ralib/dt/ShortPrefix.java b/src/main/java/de/learnlib/ralib/dt/ShortPrefix.java index d0c5e9e3..b1f8b72d 100644 --- a/src/main/java/de/learnlib/ralib/dt/ShortPrefix.java +++ b/src/main/java/de/learnlib/ralib/dt/ShortPrefix.java @@ -3,7 +3,7 @@ import java.util.LinkedHashMap; import java.util.Map; -import de.learnlib.ralib.data.PIV; +import de.learnlib.ralib.data.Bijection; import de.learnlib.ralib.oracles.Branching; import de.learnlib.ralib.words.PSymbolInstance; import de.learnlib.ralib.words.ParameterizedSymbol; @@ -14,15 +14,11 @@ public class ShortPrefix extends MappedPrefix { private final Map branching = new LinkedHashMap(); public ShortPrefix(Word prefix) { - super(prefix); - } - - public ShortPrefix(Word prefix, PIV piv) { - super(prefix, piv); + super(prefix, new Bijection<>()); } public ShortPrefix(MappedPrefix mp) { - super(mp); + super(mp, mp.getRemapping()); } public Map getBranching() { diff --git a/src/main/java/de/learnlib/ralib/learning/AutomatonBuilder.java b/src/main/java/de/learnlib/ralib/learning/AutomatonBuilder.java index 0292ad7f..3207e0e1 100644 --- a/src/main/java/de/learnlib/ralib/learning/AutomatonBuilder.java +++ b/src/main/java/de/learnlib/ralib/learning/AutomatonBuilder.java @@ -20,6 +20,9 @@ import java.util.Map; import java.util.Map.Entry; +import de.learnlib.ralib.data.*; +import de.learnlib.ralib.smt.ReplacingValuesVisitor; +import gov.nasa.jpf.constraints.util.ExpressionUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -27,13 +30,8 @@ import de.learnlib.ralib.automata.Assignment; import de.learnlib.ralib.automata.RALocation; import de.learnlib.ralib.automata.Transition; -import de.learnlib.ralib.data.Constants; -import de.learnlib.ralib.data.PIV; -import de.learnlib.ralib.data.ParameterValuation; -import de.learnlib.ralib.data.RegisterValuation; import de.learnlib.ralib.data.SymbolicDataValue.Parameter; import de.learnlib.ralib.data.SymbolicDataValue.Register; -import de.learnlib.ralib.data.VarMapping; import de.learnlib.ralib.dt.DT; import de.learnlib.ralib.dt.DTHyp; import de.learnlib.ralib.learning.rastar.RaStar; @@ -131,13 +129,18 @@ private void computeTransition(LocationComponent dest_c, PrefixContainer r) { // guard Branching b = src_c.getBranching(action); -// System.out.println("b.getBranches is " + b.getBranches().toString()); -// System.out.println("getting guard for " + r.getPrefix().toString()); + //System.out.println("b.getBranches is " + b.getBranches().toString()); + //System.out.println("getting guard for " + r.getPrefix().toString()); Expression guard = b.getBranches().get(r.getPrefix()); + //System.out.println("assignment: " + src_c.getPrimePrefix().getAssignment()); if (guard == null) { - guard = findMatchingGuard(dest_id, src_c.getPrimePrefix().getParsInVars(), b.getBranches(), consts); + guard = findMatchingGuard(dest_id, src_c.getPrimePrefix().getAssignment(), b.getBranches(), consts); } + ReplacingValuesVisitor rvv = new ReplacingValuesVisitor(); + guard = rvv.apply( guard, src_c.getPrimePrefix().getAssignment()); + + // TODO: better solution // guard is null because r is transition from a short prefix if (automaton instanceof DTHyp && guard == null) @@ -147,32 +150,12 @@ private void computeTransition(LocationComponent dest_c, PrefixContainer r) { assert guard!=null; // assignment - VarMapping assignments = new VarMapping(); - int max = DataWords.paramLength(DataWords.actsOf(src_id)); - PIV parsInVars_Src = src_c.getPrimePrefix().getParsInVars(); - PIV parsInVars_Row = r.getParsInVars(); - VarMapping remapping = dest_c.getRemapping(r); - -// LOGGER.trace(Category.EVENT, "PIV ROW: {}", parsInVars_Row); -// LOGGER.trace(Category.EVENT, "PIV SRC: {}", parsInVars_Src); -// LOGGER.trace(Category.EVENT, "REMAP: {}", remapping); - - //System.out.println(parsInVars_Row); - for (Entry e : parsInVars_Row) { - // param or register - Parameter p = e.getKey(); - // remapping is null for prime rows ... - Register rNew = (remapping == null) ? e.getValue() : (Register) remapping.get(e.getValue()); - if (p.getId() > max) { - Parameter pNew = new Parameter(p.getDataType(), p.getId() - max); - assignments.put(rNew, pNew); - } else { - Register rOld = parsInVars_Src.get(p); - assert rOld != null; - assignments.put(rNew, rOld); - } - } - Assignment assign = new Assignment(assignments); + + RegisterAssignment srcAssign = src_c.getPrimePrefix().getAssignment(); + RegisterAssignment destAssign = dest_c.getPrimePrefix().getAssignment(); + Bijection remapping = dest_c.getRemapping(r); + Assignment assign = computeAssignment(r.getPrefix(), srcAssign, destAssign, remapping); + //System.out.println(assign); // create transition @@ -189,15 +172,48 @@ protected Transition createTransition(ParameterizedSymbol action, Expression findMatchingGuard(Word dw, PIV piv, Map, Expression> branches, Constants consts) { - ParameterValuation pars = ParameterValuation.fromPSymbolWord(dw); - RegisterValuation vars = DataWords.computeRegisterValuation(ParameterValuation.fromPSymbolWord(dw.prefix(dw.length() - 1)), piv); + public static Expression findMatchingGuard(Word dw, RegisterAssignment div, Map, Expression> branches, Constants consts) { + //System.out.println("findMatchingGuard: " + div); + ParameterValuation pars = ParameterValuation.fromPSymbolWord(dw); + //RegisterValuation vars = div.registerValuation(); for (Expression g : branches.values()) { - if (g.evaluateSMT(SMTUtil.compose(vars, pars, consts))) { + if (g.evaluateSMT(SMTUtil.compose(pars, consts))) { return g; } } return null; } + public static Assignment computeAssignment(Word prefix, RegisterAssignment srcAssign, + RegisterAssignment destAssign, Bijection remapping) { + + VarMapping assignments = new VarMapping<>(); + ParameterizedSymbol action = prefix.lastSymbol().getBaseSymbol(); + DataValue[] pvals = DataWords.valsOf(prefix); + for (Entry e : remapping.entrySet()) { + Register rNew = destAssign.get(e.getValue()); + assert rNew != null; + if (srcAssign.containsKey(e.getKey())) { + // has been stored in a register before => copy register to register + Register rOld = srcAssign.get(e.getKey()); + assert rOld != null; + assignments.put(rNew, rOld); + } + else { + // has not been store before => copy parameter to register + int id = 0; + for (int i=0; i< action.getArity(); i++) { + if (pvals[pvals.length-action.getArity()+i].equals(e.getKey())) { + id = i; + break; + } + } + Parameter pNew = new Parameter(e.getKey().getDataType(), id + 1); + assert pNew.getId() > 0; + assignments.put(rNew, pNew); + } + } + return new Assignment(assignments); + } + } diff --git a/src/main/java/de/learnlib/ralib/learning/CounterexampleAnalysis.java b/src/main/java/de/learnlib/ralib/learning/CounterexampleAnalysis.java index c5291936..37d0f3cd 100644 --- a/src/main/java/de/learnlib/ralib/learning/CounterexampleAnalysis.java +++ b/src/main/java/de/learnlib/ralib/learning/CounterexampleAnalysis.java @@ -16,14 +16,16 @@ */ package de.learnlib.ralib.learning; +import java.util.List; import java.util.Map; +import java.util.Set; +import de.learnlib.ralib.data.DataValue; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import de.learnlib.ralib.data.Constants; import de.learnlib.ralib.data.Mapping; -import de.learnlib.ralib.data.PIV; import de.learnlib.ralib.learning.rastar.CEAnalysisResult; import de.learnlib.ralib.oracles.Branching; import de.learnlib.ralib.oracles.SDTLogicOracle; @@ -107,10 +109,8 @@ private IndexResult computeIndex(Word ce, int idx) { LOGGER.trace("SymSuffix: {}", symSuffix); LOGGER.trace("Location: {}", location); LOGGER.trace("Transition: {}", transition); - LOGGER.trace("PIV HYP: {}", resHyp.getPiv()); - LOGGER.trace("SDT HYP: {}", resHyp.getSdt()); - LOGGER.trace("PIV SYS: {}", resSul.getPiv()); - LOGGER.trace("SDT SYS: {}", resSul.getSdt()); + LOGGER.trace("SDT HYP: {}", resHyp.sdt()); + LOGGER.trace("SDT SYS: {}", resSul.sdt()); LOGGER.trace("------------------------------------------------------"); // System.out.println("------------------------------------------------------"); @@ -127,11 +127,12 @@ private IndexResult computeIndex(Word ce, int idx) { LocationComponent c = components.get(location); ParameterizedSymbol act = transition.lastSymbol().getBaseSymbol(); + //System.out.println(c.getBranching(act).getBranches()); Expression g = c.getBranching(act).getBranches().get(transition); boolean hasCE = sdtOracle.hasCounterexample(location, - resHyp.getSdt(), resHyp.getPiv(), //new PIV(location, resHyp.getParsInVars()), - resSul.getSdt(), resSul.getPiv(), //new PIV(location, resSul.getParsInVars()), + resHyp.sdt(), //new PIV(location, resHyp.getParsInVars()), + resSul.sdt(), //new PIV(location, resSul.getParsInVars()), g, transition); if (!hasCE) { @@ -139,11 +140,12 @@ private IndexResult computeIndex(Word ce, int idx) { } // PIV pivSul = new PIV(location, resSul.getParsInVars()); - PIV pivSul = resSul.getPiv(); - PIV pivHyp = c.getPrimePrefix().getParsInVars(); - boolean sulHasMoreRegs = !pivHyp.keySet().containsAll(pivSul.keySet()); + List pivSul = resSul.sdt().getDataValues(); + Set pivHyp = c.getPrimePrefix().getAssignment().keySet(); + + boolean sulHasMoreRegs = !pivHyp.containsAll(pivSul); boolean hypRefinesTransition = - hypRefinesTransitions(location, act, resSul.getSdt(), pivSul); + hypRefinesTransitions(location, act, resSul.sdt()); // System.out.println("sulHasMoreRegs: " + sulHasMoreRegs); // System.out.println("hypRefinesTransition: " + hypRefinesTransition); @@ -153,26 +155,25 @@ private IndexResult computeIndex(Word ce, int idx) { } private boolean hypRefinesTransitions(Word prefix, - ParameterizedSymbol action, SDT sdtSUL, PIV pivSUL) { + ParameterizedSymbol action, SDT sdtSUL) { - Branching branchSul = sulOracle.getInitialBranching(prefix, action, pivSUL, sdtSUL); + Branching branchSul = sulOracle.getInitialBranching(prefix, action, sdtSUL); LocationComponent c = components.get(prefix); Branching branchHyp = c.getBranching(action); -// System.out.println("Branching Hyp:"); -// for (Entry, TransitionGuard> e : branchHyp.getBranches().entrySet()) { -// System.out.println(e.getKey() + " -> " + e.getValue()); -// } -// System.out.println("Branching Sys:"); -// for (Entry, TransitionGuard> e : branchSul.getBranches().entrySet()) { -// System.out.println(e.getKey() + " -> " + e.getValue()); -// } + //System.out.println("Branching Hyp:"); + for (Map.Entry, Expression> e : branchHyp.getBranches().entrySet()) { + System.out.println(e.getKey() + " -> " + e.getValue()); + } + //System.out.println("Branching Sys:"); + for (Map.Entry, Expression> e : branchSul.getBranches().entrySet()) { + //System.out.println(e.getKey() + " -> " + e.getValue()); + } for (Expression guardHyp : branchHyp.getBranches().values()) { boolean refines = false; for (Expression guardSul : branchSul.getBranches().values()) { - if (sdtOracle.doesRefine(guardHyp, c.getPrimePrefix().getParsInVars(), - guardSul, pivSUL, new Mapping<>())) { + if (sdtOracle.doesRefine(guardHyp, guardSul, new Mapping<>())) { refines = true; break; } diff --git a/src/main/java/de/learnlib/ralib/learning/IOAutomatonBuilder.java b/src/main/java/de/learnlib/ralib/learning/IOAutomatonBuilder.java index 59d863f1..0eabc974 100644 --- a/src/main/java/de/learnlib/ralib/learning/IOAutomatonBuilder.java +++ b/src/main/java/de/learnlib/ralib/learning/IOAutomatonBuilder.java @@ -40,6 +40,7 @@ import de.learnlib.ralib.words.PSymbolInstance; import de.learnlib.ralib.words.ParameterizedSymbol; import gov.nasa.jpf.constraints.api.Expression; +import gov.nasa.jpf.constraints.api.Variable; import gov.nasa.jpf.constraints.expressions.NumericBooleanExpression; import gov.nasa.jpf.constraints.expressions.NumericComparator; import gov.nasa.jpf.constraints.expressions.PropositionalCompound; @@ -131,12 +132,12 @@ else if (expr instanceof NumericBooleanExpression nbe) { } else { p = (Parameter) left; - sv = right; + sv = (SymbolicDataValue) right; } } else { p = (Parameter) right; - sv = left; + sv = (SymbolicDataValue) left; } outmap.put(p, sv); diff --git a/src/main/java/de/learnlib/ralib/learning/LocationComponent.java b/src/main/java/de/learnlib/ralib/learning/LocationComponent.java index 95d9d004..6e52dbc0 100644 --- a/src/main/java/de/learnlib/ralib/learning/LocationComponent.java +++ b/src/main/java/de/learnlib/ralib/learning/LocationComponent.java @@ -2,7 +2,7 @@ import java.util.Collection; -import de.learnlib.ralib.data.VarMapping; +import de.learnlib.ralib.data.*; import de.learnlib.ralib.oracles.Branching; import de.learnlib.ralib.words.PSymbolInstance; import de.learnlib.ralib.words.ParameterizedSymbol; @@ -11,7 +11,13 @@ public interface LocationComponent { boolean isAccepting(); Word getAccessSequence(); - VarMapping getRemapping(PrefixContainer r); + + /** + * Remapping under which r becomes identical to the + * primary prefix of this component. + */ + Bijection getRemapping(PrefixContainer r); + Branching getBranching(ParameterizedSymbol action); PrefixContainer getPrimePrefix(); Collection getOtherPrefixes(); diff --git a/src/main/java/de/learnlib/ralib/learning/MeasuringOracle.java b/src/main/java/de/learnlib/ralib/learning/MeasuringOracle.java index 56196c52..ee9d9c6b 100644 --- a/src/main/java/de/learnlib/ralib/learning/MeasuringOracle.java +++ b/src/main/java/de/learnlib/ralib/learning/MeasuringOracle.java @@ -2,7 +2,6 @@ import java.util.Map; -import de.learnlib.ralib.data.PIV; import de.learnlib.ralib.oracles.Branching; import de.learnlib.ralib.oracles.TreeOracle; import de.learnlib.ralib.oracles.TreeQueryResult; @@ -35,21 +34,20 @@ public TreeQueryResult treeQuery(Word prefix, SymbolicSuffix su } @Override - public Branching getInitialBranching(Word prefix, ParameterizedSymbol ps, PIV piv, - SDT... sdts) { - return oracle.getInitialBranching(prefix, ps, piv, sdts); + public Branching getInitialBranching(Word prefix, ParameterizedSymbol ps, SDT... sdts) { + return oracle.getInitialBranching(prefix, ps, sdts); } @Override - public Branching updateBranching(Word prefix, ParameterizedSymbol ps, Branching current, PIV piv, + public Branching updateBranching(Word prefix, ParameterizedSymbol ps, Branching current, SDT... sdts) { - return oracle.updateBranching(prefix, ps, current, piv, sdts); + return oracle.updateBranching(prefix, ps, current, sdts); } @Override public Map, Boolean> instantiate(Word prefix, SymbolicSuffix suffix, - SDT sdt, PIV piv) { - return oracle.instantiate(prefix, suffix, sdt, piv); + SDT sdt) { + return oracle.instantiate(prefix, suffix, sdt); } @Override diff --git a/src/main/java/de/learnlib/ralib/learning/PrefixContainer.java b/src/main/java/de/learnlib/ralib/learning/PrefixContainer.java index f69954a3..7ef006cc 100644 --- a/src/main/java/de/learnlib/ralib/learning/PrefixContainer.java +++ b/src/main/java/de/learnlib/ralib/learning/PrefixContainer.java @@ -1,10 +1,13 @@ package de.learnlib.ralib.learning; -import de.learnlib.ralib.data.PIV; +import de.learnlib.ralib.data.*; import de.learnlib.ralib.words.PSymbolInstance; +import gov.nasa.jpf.constraints.expressions.Constant; import net.automatalib.word.Word; +import java.util.Map; + public interface PrefixContainer { Word getPrefix(); - PIV getParsInVars(); + RegisterAssignment getAssignment(); } diff --git a/src/main/java/de/learnlib/ralib/learning/SymbolicWord.java b/src/main/java/de/learnlib/ralib/learning/SymbolicWord.java index ea326396..f2221557 100644 --- a/src/main/java/de/learnlib/ralib/learning/SymbolicWord.java +++ b/src/main/java/de/learnlib/ralib/learning/SymbolicWord.java @@ -1,18 +1,6 @@ package de.learnlib.ralib.learning; -import java.util.Arrays; - -import de.learnlib.ralib.data.DataType; -import de.learnlib.ralib.data.DataValue; -import de.learnlib.ralib.data.Mapping; -import de.learnlib.ralib.data.PIV; -import de.learnlib.ralib.data.RegisterValuation; -import de.learnlib.ralib.data.SymbolicDataValue; -import de.learnlib.ralib.data.SymbolicDataValue.SuffixValue; -import de.learnlib.ralib.data.util.SymbolicDataValueGenerator.SuffixValueGenerator; -import de.learnlib.ralib.words.DataWords; import de.learnlib.ralib.words.PSymbolInstance; -import de.learnlib.ralib.words.ParameterizedSymbol; import net.automatalib.word.Word; public class SymbolicWord { @@ -32,7 +20,8 @@ public SymbolicSuffix getSuffix() { return suffix; } - public Mapping computeValuation(Word concreteSuffix, PIV piv) { + /* + public Mapping computeValuation(Word concreteSuffix) { Mapping vals = new Mapping<>(); SuffixValueGenerator svGen = new SuffixValueGenerator(); @@ -62,7 +51,7 @@ public Mapping computeValuation(Word word, CEAnalysisResult c Word src_id = word.prefix(word.size() - 1); DTLeaf src_c = dt.getLeaf(src_id); Branching hypBranching = null; - PIV piv = null; + if (src_c.getAccessSequence().equals(src_id)) { hypBranching = src_c.getBranching(word.lastSymbol().getBaseSymbol()); - piv = src_c.getPrimePrefix().getParsInVars(); + //piv = src_c.getPrimePrefix().getParsInVars(); } else { ShortPrefix sp = (ShortPrefix) src_c.getShortPrefixes().get(src_id); hypBranching = sp.getBranching(word.lastSymbol().getBaseSymbol()); - piv = sp.getParsInVars(); + //piv = sp.getParsInVars(); } if (hypBranching.getBranches().containsKey(word)) @@ -272,14 +264,14 @@ private boolean isGuardRefinement(Word word, CEAnalysisResult c tqrSul = sulOracle.treeQuery(word, ceaResult.getSuffix()); } - if (tqrHyp.getSdt().isEquivalent(tqrSul.getSdt(), tqrSul.getPiv())) { + if (tqrHyp.sdt().isEquivalent(tqrSul.sdt(), new SDTRelabeling())) { guardPrefixes.put(word, false); return true; } - Expression guard = AutomatonBuilder.findMatchingGuard(word, piv, hypBranching.getBranches(), consts); + Expression guard = AutomatonBuilder.findMatchingGuard(word, /*FIX */ null, hypBranching.getBranches(), consts); for (Map.Entry, Expression> e : hypBranching.getBranches().entrySet()) { - boolean eq = sdtLogicOracle.areEquivalent(e.getValue(), piv, guard, piv, new Mapping()); + boolean eq = sdtLogicOracle.areEquivalent(e.getValue(), Bijection.identity(tqrSul.sdt().getDataValues()), guard, new Mapping()); if (eq && !e.getKey().equals(word)) { guardPrefixes.put(word, true); return true; @@ -311,8 +303,8 @@ private boolean checkLocationConsistency() { Branching access_b = l.getBranching(psi); Branching prefix_b = sp.getBranching(psi); for (Word ws : prefix_b.getBranches().keySet()) { - Word wa = DTLeaf.branchWithSameGuard(ws, prefix_b, sp.getParsInVars(), access_b, mp.getParsInVars(), sdtLogicOracle); - + Word wa = DTLeaf.branchWithSameGuard(ws, prefix_b, l.getRemapping(sp), access_b, sdtLogicOracle); + //System.out.println("wa: " + wa + ", ws: " + ws); DTLeaf la = dt.getLeaf(wa); DTLeaf ls = dt.getLeaf(ws); if (la != ls) { @@ -320,6 +312,7 @@ private boolean checkLocationConsistency() { if (suffix == null || suffix.length() > v.length()) { suffix = v; } + assert suffix != null; } } } @@ -369,24 +362,26 @@ private boolean checkGuardConsistency() { else { if (!entry.getValue()) { MappedPrefix mp = dest_c.getPrefix(word); - Map branchTQRs = branchLeaf.getPrefix(branch).getTQRs(); - for (Map.Entry e : mp.getTQRs().entrySet()) { - TreeQueryResult tqr = e.getValue(); + Map branchTQRs = branchLeaf.getPrefix(branch).getTQRs(); + for (Map.Entry e : mp.getTQRs().entrySet()) { + SDT tqr = e.getValue(); SymbolicSuffix s = e.getKey(); - TreeQueryResult otherTQR = branchTQRs.get(s); + SDT otherTQR = branchTQRs.get(s); //todo: not sure why this check was not here yet? It happens sometimes ... if (branchTQRs.get(s) == null) { continue; } + if (true) throw new RuntimeException("need to replace PIV"); + /* if (tqr.getSdt().isEquivalent(branchTQRs.get(s).getSdt(), tqr.getPiv())) { if (!tqr.getPiv().equals(otherTQR.getPiv())) { if (suffix == null || suffix.length() > s.length()+1) { SymbolicSuffix testSuffix; - if (suffixBuilder != null && tqr.getSdt() instanceof SDT) { + if (suffixBuilder != null) { Register[] differentlyMapped = differentlyMappedRegisters(tqr.getPiv(), otherTQR.getPiv()); - testSuffix = suffixBuilder.extendSuffix(word, tqr.getSdt(), tqr.getPiv(), s, differentlyMapped); + testSuffix = suffixBuilder.extendSuffix(word, tqr, tqr.getPiv(), s, differentlyMapped); } else { testSuffix = new SymbolicSuffix(word.prefix(word.length()-1), word.suffix(1), restrictionBuilder); testSuffix = testSuffix.concat(s); @@ -399,6 +394,7 @@ private boolean checkGuardConsistency() { } } } + */ } } } @@ -428,17 +424,17 @@ private SymbolicSuffix distinguishingSuffix(Word wa, DTLeaf ca, Word prefixA = wa.prefix(wa.length() - 1); Word prefixB = wb.prefix(wb.length() - 1); - TreeQueryResult tqrA = ca.getTQR(wa, v); - TreeQueryResult tqrB = cb.getTQR(wb, v); + SDT tqrA = ca.getTQR(wa, v); + SDT tqrB = cb.getTQR(wb, v); assert tqrA != null && tqrB != null; - SDT sdtA = tqrA.getSdt(); - SDT sdtB = tqrB.getSdt(); + SDT sdtA = tqrA; + SDT sdtB = tqrB; - if (suffixBuilder != null && solver != null && sdtA instanceof SDT && sdtB instanceof SDT) { -// return suffixBuilder.extendDistinguishingSuffix(wa, sdtA, tqrA.getPiv(), wb, sdtB, tqrB.getPiv(), v); - SymbolicSuffix suffix = suffixBuilder.distinguishingSuffixFromSDTs(wa, sdtA, tqrA.getPiv(), wb, sdtB, tqrB.getPiv(), v.getActions(), solver); + if (suffixBuilder != null && solver != null) { + //return suffixBuilder.extendDistinguishingSuffix(wa, sdtA, wb, sdtB, v); + SymbolicSuffix suffix = suffixBuilder.distinguishingSuffixFromSDTs(wa, sdtA, wb, sdtB, v.getActions(), solver); return suffix; } @@ -467,6 +463,7 @@ private Word branchWithSameGuard(MappedPrefix mp, Branching bra return branching.transformPrefix(dw); } + /* private Register[] differentlyMappedRegisters(PIV piv1, PIV piv2) { Set differentlyMapped = new LinkedHashSet<>(); for (Map.Entry e1 : piv1.entrySet()) { @@ -483,6 +480,7 @@ private Register[] differentlyMappedRegisters(PIV piv1, PIV piv2) { Register[] ret = new Register[differentlyMapped.size()]; return differentlyMapped.toArray(ret); } + */ // private boolean analyzeCounterExampleOld() { // log.logPhase("Analyzing Counterexample"); diff --git a/src/main/java/de/learnlib/ralib/learning/rastar/Cell.java b/src/main/java/de/learnlib/ralib/learning/rastar/Cell.java index 1d76dd77..df25794c 100644 --- a/src/main/java/de/learnlib/ralib/learning/rastar/Cell.java +++ b/src/main/java/de/learnlib/ralib/learning/rastar/Cell.java @@ -16,19 +16,18 @@ */ package de.learnlib.ralib.learning.rastar; -import java.util.Collection; - -import de.learnlib.ralib.data.PIV; -import de.learnlib.ralib.data.SymbolicDataValue.Parameter; -import de.learnlib.ralib.data.VarMapping; +import de.learnlib.ralib.data.DataValue; +import de.learnlib.ralib.data.SDTRelabeling; import de.learnlib.ralib.learning.SymbolicSuffix; import de.learnlib.ralib.oracles.TreeOracle; import de.learnlib.ralib.oracles.TreeQueryResult; +import de.learnlib.ralib.theory.Memorables; import de.learnlib.ralib.theory.SDT; import de.learnlib.ralib.words.PSymbolInstance; import net.automatalib.word.Word; -//import org.slf4j.Logger; -//import org.slf4j.LoggerFactory; + +import java.util.List; + /** * A cell of an observation table. @@ -43,23 +42,10 @@ final class Cell { private final SDT sdt; - private final PIV parsInVars; - -// private static Logger LOGGER = LoggerFactory.getLogger(Cell.class); - - private Cell(Word prefix, SymbolicSuffix suffix, SDT sdt, PIV parsInVars) { + private Cell(Word prefix, SymbolicSuffix suffix, SDT sdt) { this.prefix = prefix; this.suffix = suffix; this.sdt = sdt; - this.parsInVars = parsInVars; - } - - Collection getMemorable() { - return parsInVars.keySet(); - } - - PIV getParsInVars() { - return parsInVars; } /** @@ -68,14 +54,14 @@ PIV getParsInVars() { * @param other * @return */ - boolean isEquivalentTo(Cell other, VarMapping renaming) { + boolean isEquivalentTo(Cell other, SDTRelabeling renaming) { if (!couldBeEquivalentTo(other)) { return false; } boolean check = this.suffix.equals(other.suffix) && - this.parsInVars.relabel(renaming).equals(other.parsInVars) && - this.sdt.isEquivalent(other.sdt, renaming); + Memorables.relabel(this.getMemorableValues(), renaming).equals(other.getMemorableValues()) && + other.sdt.isEquivalent(this.sdt, renaming); // LOGGER.trace(this.sdt + "\nVS\n" + other.sdt + "\n"); // LOGGER.trace(this.suffix + " " + other.suffix); // LOGGER.trace(this.suffix.equals(other.suffix) + " " + this.parsInVars.relabel(renaming).equals(other.parsInVars) + " " + this.sdt.isEquivalent(other.sdt, renaming)); @@ -90,7 +76,7 @@ boolean isEquivalentTo(Cell other, VarMapping renaming) { * @return */ boolean couldBeEquivalentTo(Cell other) { - return this.parsInVars.typedSize().equals(other.parsInVars.typedSize()); + return Memorables.typedSize(this.getMemorableValues()).equals(Memorables.typedSize(other.getMemorableValues())); //TODO: call preliminary checks on SDTs } @@ -102,17 +88,11 @@ boolean couldBeEquivalentTo(Cell other) { * @param suffix * @return */ - static Cell computeCell(TreeOracle oracle, - Word prefix, SymbolicSuffix suffix) { - //System.out.println("START: computecell for " + prefix.toString() + " . " + suffix.toString()); + static Cell computeCell(TreeOracle oracle, Word prefix, SymbolicSuffix suffix) { + //System.out.println("START: computecell for " + prefix.toString() + " . " + suffix.toString()); TreeQueryResult tqr = oracle.treeQuery(prefix, suffix); - Cell c = new Cell(prefix, suffix, tqr.getSdt(), tqr.getPiv()); - //System.out.println("END: computecell " + c.toString()); - //LOGGER.debug("computeCell ...... {0}", c); - - //System.out.println(c); -// assert tqr.getPiv().size() <= 2; - + Cell c = new Cell(prefix, suffix, tqr.sdt()); + //System.out.println("END: computecell " + c.toString()); return c; } @@ -128,22 +108,17 @@ SDT getSDT() { return this.sdt; } + List getMemorableValues() { + return this.sdt.getDataValues(); + } + @Override public String toString() { - return "Cell: " + this.prefix + " / " + this.suffix + " : " + this.parsInVars + - "\n" + this.sdt.toString(); + return "Cell: " + this.prefix + " / " + this.suffix + " :\n" + this.sdt; } void toString(StringBuilder sb) { - sb.append("**** Cell: ").append(this.suffix).append(" : "). - append(this.parsInVars).append("\n"). - append(this.sdt.toString()).append("\n"); - } - - Cell relabel(VarMapping relabelling) { - return new Cell(prefix, suffix, - sdt.relabel(relabelling), - parsInVars.relabel(relabelling)); + sb.append("**** Cell: ").append(this.suffix).append(" : ").append(this.sdt).append("\n"); } boolean isAccepting() { diff --git a/src/main/java/de/learnlib/ralib/learning/rastar/Component.java b/src/main/java/de/learnlib/ralib/learning/rastar/Component.java index 605c3e18..faf0f335 100644 --- a/src/main/java/de/learnlib/ralib/learning/rastar/Component.java +++ b/src/main/java/de/learnlib/ralib/learning/rastar/Component.java @@ -16,24 +16,15 @@ */ package de.learnlib.ralib.learning.rastar; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.LinkedHashMap; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.Map.Entry; +import de.learnlib.ralib.data.*; +import de.learnlib.ralib.data.util.RemappingIterator; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import de.learnlib.logging.Category; -import de.learnlib.ralib.data.Constants; -import de.learnlib.ralib.data.PIV; -import de.learnlib.ralib.data.SymbolicDataValue.Parameter; -import de.learnlib.ralib.data.VarMapping; -import de.learnlib.ralib.data.util.PIVRemappingIterator; import de.learnlib.ralib.learning.LocationComponent; import de.learnlib.ralib.learning.PrefixContainer; import de.learnlib.ralib.learning.SymbolicSuffix; @@ -58,7 +49,7 @@ public class Component implements LocationComponent { private final Row primeRow; - private final Map otherRows = new LinkedHashMap<>(); + private final Map> otherRows = new LinkedHashMap<>(); private final ObservationTable obs; @@ -97,11 +88,11 @@ boolean addRow(Row r) { return false; } - PIVRemappingIterator iterator = new PIVRemappingIterator( - r.getParsInVars(), primeRow.getParsInVars()); + RemappingIterator iterator = new RemappingIterator<>( + r.memorableValues(), primeRow.memorableValues()); - for (VarMapping m : iterator) { - if (r.isEquivalentTo(primeRow, m)) { + for (Bijection m : iterator) { + if (r.isEquivalentTo(primeRow, SDTRelabeling.fromBijection(m))) { this.otherRows.put(r, m); return true; } @@ -120,7 +111,7 @@ void start(TreeOracle oracle, ParameterizedSymbol... inputs) { SDT[] sdts = primeRow.getSDTsForInitialSymbol(ps); Branching b = oracle.getInitialBranching( - getAccessSequence(), ps, primeRow.getParsInVars(), sdts); + getAccessSequence(), ps, sdts); branching.put(ps, b); for (Word prefix : b.getBranches().keySet()) { @@ -138,7 +129,7 @@ void addSuffix(SymbolicSuffix suffix, TreeOracle oracle) { } primeRow.addSuffix(suffix, oracle); - Map otherOld = new LinkedHashMap<>(otherRows); + Map> otherOld = new LinkedHashMap<>(otherRows); otherRows.clear(); List newComponents = new ArrayList<>(); @@ -179,8 +170,7 @@ boolean updateBranching(TreeOracle oracle) { private boolean updateBranching(ParameterizedSymbol ps, TreeOracle oracle) { Branching b = branching.get(ps); SDT[] sdts = primeRow.getSDTsForInitialSymbol(ps); - Branching newB = oracle.updateBranching(getAccessSequence(), ps, b, - primeRow.getParsInVars(), sdts); + Branching newB = oracle.updateBranching(getAccessSequence(), ps, b, sdts); boolean ret = true; LOGGER.trace(Category.DATASTRUCTURE, "OLD: {}", Arrays.toString(b.getBranches().keySet().toArray())); @@ -214,17 +204,19 @@ private boolean checkVariableConsistency(Row r) { } Word prefix = r.getPrefix().prefix(r.getPrefix().length() -1); + Set curData = DataWords.valSet(r.getPrefix().suffix(1)); + Row prefixRow = obs.getComponents().get(prefix).primeRow; - PIV memPrefix = prefixRow.getParsInVars(); - PIV memRow = r.getParsInVars(); + List memPrefix = prefixRow.memorableValues(); + List memRow = r.memorableValues(); int max = DataWords.paramLength(DataWords.actsOf(prefix)); - for (Parameter p : memRow.keySet()) { - // p is used by next but not stored by this and is from this word - if (!memPrefix.containsKey(p) && p.getId() <= max) { - SymbolicSuffix suffix = r.getSuffixForMemorable(p); + for (DataValue d : memRow) { + // d is used by next but not stored by this and is from this word + if (!memPrefix.contains(d) && !curData.contains(d)) { + SymbolicSuffix suffix = r.getSuffixForMemorable(d); SymbolicSuffix newSuffix = new SymbolicSuffix( r.getPrefix(), suffix, restrictionBuilder); @@ -256,8 +248,12 @@ public Branching getBranching(ParameterizedSymbol act) { } @Override - public VarMapping getRemapping(PrefixContainer r) { - return this.otherRows.get(r); + public Bijection getRemapping(PrefixContainer r) { + Row row = (Row) r; + if (r == primeRow) { + return Bijection.identity(row.memorableValues()); + } + return this.otherRows.get( row ); } public Row getPrimeRow() { @@ -284,13 +280,13 @@ public Collection getOtherPrefixes() { @Override public String toString() { return primeRow.getPrefix().toString() + " " + - primeRow.getParsInVars() + " " + + primeRow.getAssignment() + " " + Arrays.toString(this.otherRows.keySet().toArray()); } void toString(StringBuilder sb) { sb.append("********** COMPONENT: ").append(getAccessSequence()).append("\n"); - sb.append("PIV: ").append(this.primeRow.getParsInVars()).append("\n"); + sb.append("PIV: ").append(this.primeRow.getAssignment()).append("\n"); sb.append("******** PREFIXES: ").append("\n"); for (Row r : getOtherRows()) { sb.append(r.getPrefix()).append("\n"); @@ -305,7 +301,7 @@ void toString(StringBuilder sb) { } sb.append("******** ROWS: ").append("\n"); this.primeRow.toString(sb); - for (Entry e : otherRows.entrySet()) { + for (Entry> e : otherRows.entrySet()) { e.getKey().toString(sb); sb.append("==== remapping: ").append(e.getValue()).append("\n"); } diff --git a/src/main/java/de/learnlib/ralib/learning/rastar/ObservationTable.java b/src/main/java/de/learnlib/ralib/learning/rastar/ObservationTable.java index 2924456e..9368544a 100644 --- a/src/main/java/de/learnlib/ralib/learning/rastar/ObservationTable.java +++ b/src/main/java/de/learnlib/ralib/learning/rastar/ObservationTable.java @@ -135,7 +135,7 @@ private boolean checkVariableConsistency() { private void processNewSuffix() { SymbolicSuffix suffix = newSuffixes.poll(); LOGGER.info(Category.EVENT, "Adding suffix to obs: {}", suffix); -// System.out.println("Adding suffix to obs: " + suffix); + System.out.println("Adding suffix to obs: " + suffix); suffixes.add(suffix); for (Component c : components.values()) { c.addSuffix(suffix, oracle); @@ -157,7 +157,7 @@ private void processNewPrefix() { private void processNewComponent() { Component c = newComponents.poll(); - //System.out.println("Adding component to obs: " + c); + System.out.println("Adding component to obs: " + c); components.put(c.getAccessSequence(), c); c.start(oracle, inputs); } diff --git a/src/main/java/de/learnlib/ralib/learning/rastar/RaStar.java b/src/main/java/de/learnlib/ralib/learning/rastar/RaStar.java index fa420f25..2d1efc87 100644 --- a/src/main/java/de/learnlib/ralib/learning/rastar/RaStar.java +++ b/src/main/java/de/learnlib/ralib/learning/rastar/RaStar.java @@ -126,7 +126,7 @@ public void learn() { hyp = ab.toRegisterAutomaton(); //FIXME: the default logging appender cannot log models and data structures - //System.out.println(hyp.toString()); + System.out.println(hyp.toString()); LOGGER.info(Category.MODEL, "{}", hyp); } while (analyzeCounterExample()); diff --git a/src/main/java/de/learnlib/ralib/learning/rastar/Row.java b/src/main/java/de/learnlib/ralib/learning/rastar/Row.java index 9b5fdcdb..1df3d6c3 100644 --- a/src/main/java/de/learnlib/ralib/learning/rastar/Row.java +++ b/src/main/java/de/learnlib/ralib/learning/rastar/Row.java @@ -16,20 +16,19 @@ */ package de.learnlib.ralib.learning.rastar; -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.Map.Entry; +import de.learnlib.ralib.data.*; +import de.learnlib.ralib.data.util.SymbolicDataValueGenerator; +import de.learnlib.ralib.theory.Memorables; +import gov.nasa.jpf.constraints.expressions.Constant; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import de.learnlib.logging.Category; -import de.learnlib.ralib.data.PIV; import de.learnlib.ralib.data.SymbolicDataValue.Parameter; import de.learnlib.ralib.data.SymbolicDataValue.Register; -import de.learnlib.ralib.data.VarMapping; import de.learnlib.ralib.data.util.SymbolicDataValueGenerator.RegisterGenerator; import de.learnlib.ralib.learning.PrefixContainer; import de.learnlib.ralib.learning.SymbolicSuffix; @@ -52,7 +51,7 @@ public class Row implements PrefixContainer { private final Map cells; - private final PIV memorable = new PIV(); + //private final PIV memorable = new PIV(); private final RegisterGenerator regGen = new RegisterGenerator(); @@ -66,24 +65,16 @@ private Row(Word prefix, boolean ioMode) { this.ioMode = ioMode; } -// private Row(Word prefix, List cells, boolean ioMode) { -// this(prefix, ioMode); -// -// for (Cell c : cells) { -// this.cells.put(c.getSuffix(), c); -// } -// } - void addSuffix(SymbolicSuffix suffix, TreeOracle oracle) { - if (ioMode && suffix.getActions().length() > 0) { + if (ioMode && !suffix.getActions().isEmpty()) { // error row - if (getPrefix().length() > 0 && !isAccepting()) { + if (!getPrefix().isEmpty() && !isAccepting()) { LOGGER.info(Category.EVENT, "Not adding suffix {} to error row {}", suffix, getPrefix()); return; } // unmatching suffix - if ((getPrefix().length() < 1 && (suffix.getActions().firstSymbol() instanceof OutputSymbol)) - || (prefix.length() > 0 && prefix.lastSymbol().getBaseSymbol() instanceof InputSymbol == suffix.getActions().firstSymbol() instanceof InputSymbol)) { + if ((getPrefix().isEmpty() && (suffix.getActions().firstSymbol() instanceof OutputSymbol)) + || (!prefix.isEmpty() && prefix.lastSymbol().getBaseSymbol() instanceof InputSymbol == suffix.getActions().firstSymbol() instanceof InputSymbol)) { LOGGER.info(Category.EVENT, "Not adding suffix {} to unmatching row {}", suffix, getPrefix()); return; } @@ -94,34 +85,17 @@ void addSuffix(SymbolicSuffix suffix, TreeOracle oracle) { } private void addCell(Cell c) { - assert c.getPrefix().equals(this.prefix); assert !this.cells.containsKey(c.getSuffix()); - - // make sure that pars-in-vars is consistent with - // existing cells in his row - PIV cpv = c.getParsInVars(); - VarMapping relabelling = new VarMapping(); - for (Entry e : cpv.entrySet()) { - Register r = this.memorable.get(e.getKey()); - if (r == null) { - r = regGen.next(e.getKey().getDataType()); - memorable.put(e.getKey(), r); - } - relabelling.put(e.getValue(), r); - } - - this.cells.put(c.getSuffix(), c.relabel(relabelling)); + this.cells.put(c.getSuffix(), c); } - SymbolicSuffix getSuffixForMemorable(Parameter p) { - for (Entry c : cells.entrySet()) { - if (c.getValue().getParsInVars().containsKey(p)) { - return c.getKey(); - } - } - - throw new IllegalStateException("This line is not supposed to be reached."); + SymbolicSuffix getSuffixForMemorable(DataValue d) { + return cells.entrySet().stream() + .filter(e -> e.getValue().getMemorableValues().contains(d)) + .findFirst() + .orElseThrow(() -> new IllegalStateException("This line is not supposed to be reached.")) + .getKey(); } SDT[] getSDTsForInitialSymbol(ParameterizedSymbol ps) { @@ -136,9 +110,25 @@ SDT[] getSDTsForInitialSymbol(ParameterizedSymbol ps) { return sdts.toArray(new SDT[]{}); } + public List memorableValues() { + return cells.values().stream() + .flatMap(c -> c.getMemorableValues().stream() ) + .distinct() + .sorted() + .toList(); + } + @Override - public PIV getParsInVars() { - return this.memorable; + public RegisterAssignment getAssignment() { + RegisterAssignment ra = new RegisterAssignment(); + SymbolicDataValueGenerator.RegisterGenerator regGen = + new SymbolicDataValueGenerator.RegisterGenerator(); + + this.memorableValues().forEach( + dv -> ra.put(dv, regGen.next(dv.getDataType())) + ); + + return ra; } @Override @@ -153,12 +143,12 @@ public Word getPrefix() { * @param other * @return true if rows are equal */ - boolean isEquivalentTo(Row other, VarMapping renaming) { + boolean isEquivalentTo(Row other, SDTRelabeling renaming) { if (!couldBeEquivalentTo(other)) { return false; } - if (!this.memorable.relabel(renaming).equals(other.memorable)) { + if (!Memorables.relabel(this.memorableValues(), renaming).equals(other.memorableValues())) { return false; } @@ -189,7 +179,7 @@ boolean isEquivalentTo(Row other, VarMapping renaming) { * @return */ boolean couldBeEquivalentTo(Row other) { - if (!this.memorable.typedSize().equals(other.memorable.typedSize())) { + if (!Memorables.typedSize(this.memorableValues()).equals(Memorables.typedSize(other.memorableValues()))) { return false; } diff --git a/src/main/java/de/learnlib/ralib/oracles/SDTLogicOracle.java b/src/main/java/de/learnlib/ralib/oracles/SDTLogicOracle.java index d8cf560d..d0855788 100644 --- a/src/main/java/de/learnlib/ralib/oracles/SDTLogicOracle.java +++ b/src/main/java/de/learnlib/ralib/oracles/SDTLogicOracle.java @@ -17,10 +17,7 @@ package de.learnlib.ralib.oracles; -import de.learnlib.ralib.data.DataValue; -import de.learnlib.ralib.data.Mapping; -import de.learnlib.ralib.data.PIV; -import de.learnlib.ralib.data.SymbolicDataValue; +import de.learnlib.ralib.data.*; import de.learnlib.ralib.theory.SDT; import de.learnlib.ralib.words.PSymbolInstance; import gov.nasa.jpf.constraints.api.Expression; @@ -47,47 +44,48 @@ public interface SDTLogicOracle { * * @param prefix * @param sdt1 - * @param piv1 * @param sdt2 - * @param piv2 * @param guard * @param rep * @return */ boolean hasCounterexample(Word prefix, - SDT sdt1, PIV piv1, - SDT sdt2, PIV piv2, - Expression guard, Word rep); + SDT sdt1, SDT sdt2, Expression guard, Word rep); - Expression getCEGuard(Word prefix, - SDT sdt1, PIV piv1, - SDT sdt2, PIV piv2); + /** + * + * @param prefix + * @param sdt1 + * @param sdt2 + * @return + */ + // TODO: write documentation + Expression getCEGuard(Word prefix, SDT sdt1, SDT sdt2); /** * checks if one guard refine another guard. * * @param refining - * @param pivRefining * @param refined - * @param pivRefined * @return */ - boolean doesRefine(Expression refining, PIV pivRefining, - Expression refined, PIV pivRefined, Mapping valuation); + boolean doesRefine(Expression refining, Expression refined, + Mapping valuation); /** * Returns true if two guards are mutually exclusive (they cannot be both true) */ - boolean areMutuallyExclusive(Expression guard1, PIV piv1, Expression guard2, - PIV piv2, Mapping valuation); + boolean areMutuallyExclusive(Expression guard1, Expression guard2, + Mapping valuation); /** * Returns true if two guards are equivalent (guard1 is true iff guard2 is true) */ - boolean areEquivalent(Expression guard1, PIV piv1, Expression guard2, - PIV piv2, Mapping valuation); + boolean areEquivalent(Expression guard1, Bijection remapping, Expression guard2, + Mapping valuation); /** * Returns true if the word leads to an accepting leaf on the SDT. */ - boolean accepts(Word word, Word prefix, SDT sdt, PIV piv); + // FIXME: this method is only used by tests, mayybe it can go? + boolean accepts(Word word, Word prefix, SDT sdt); } diff --git a/src/main/java/de/learnlib/ralib/oracles/TreeOracle.java b/src/main/java/de/learnlib/ralib/oracles/TreeOracle.java index 01984f44..304f74d6 100644 --- a/src/main/java/de/learnlib/ralib/oracles/TreeOracle.java +++ b/src/main/java/de/learnlib/ralib/oracles/TreeOracle.java @@ -18,7 +18,6 @@ import java.util.Map; -import de.learnlib.ralib.data.PIV; import de.learnlib.ralib.learning.SymbolicSuffix; import de.learnlib.ralib.oracles.mto.SymbolicSuffixRestrictionBuilder; import de.learnlib.ralib.theory.SDT; @@ -51,12 +50,11 @@ TreeQueryResult treeQuery( * * @param prefix * @param ps - * @param piv * @param sdts * @return */ Branching getInitialBranching(Word prefix, - ParameterizedSymbol ps, PIV piv, SDT... sdts); + ParameterizedSymbol ps, SDT... sdts); /** * Updates and extends an existing Branching @@ -65,16 +63,14 @@ Branching getInitialBranching(Word prefix, * @param prefix * @param ps * @param current - * @param piv * @param sdts * @return */ Branching updateBranching(Word prefix, - ParameterizedSymbol ps, Branching current, - PIV piv, SDT... sdts); + ParameterizedSymbol ps, Branching current, SDT... sdts); Map, Boolean> instantiate(Word prefix, - SymbolicSuffix suffix, SDT sdt, PIV piv); + SymbolicSuffix suffix, SDT sdt); SymbolicSuffixRestrictionBuilder getRestrictionBuilder(); diff --git a/src/main/java/de/learnlib/ralib/oracles/TreeQueryResult.java b/src/main/java/de/learnlib/ralib/oracles/TreeQueryResult.java index 3e675efe..20e3c8e3 100644 --- a/src/main/java/de/learnlib/ralib/oracles/TreeQueryResult.java +++ b/src/main/java/de/learnlib/ralib/oracles/TreeQueryResult.java @@ -16,7 +16,6 @@ */ package de.learnlib.ralib.oracles; -import de.learnlib.ralib.data.PIV; import de.learnlib.ralib.theory.SDT; /** @@ -24,31 +23,14 @@ * * @author falk */ -public class TreeQueryResult { - - private final PIV piv; - - private final SDT sdt; - - public TreeQueryResult( - PIV piv, - SDT sdt) { - - this.piv = piv; - this.sdt = sdt; - } - - /** - * @return the piv - */ - public PIV getPiv() { - return piv; - } +// FIXME: remove this class and use SDT directly +public record TreeQueryResult(SDT sdt) { /** * @return the sdt */ - public SDT getSdt() { + @Override + public SDT sdt() { //System.out.println("getSdt() " + sdt); return sdt; } @@ -56,7 +38,7 @@ public SDT getSdt() { @Override public String toString() { - return "TQR[" + piv + ", " + sdt + "]"; + return "TQR[" + sdt + "]"; } } diff --git a/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheoryBranching.java b/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheoryBranching.java index eb2716da..2b0eee1d 100644 --- a/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheoryBranching.java +++ b/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheoryBranching.java @@ -20,7 +20,6 @@ import de.learnlib.ralib.data.Constants; import de.learnlib.ralib.data.DataValue; -import de.learnlib.ralib.data.PIV; import de.learnlib.ralib.data.ParameterValuation; import de.learnlib.ralib.data.RegisterValuation; import de.learnlib.ralib.data.SymbolicDataValue; @@ -29,10 +28,10 @@ import de.learnlib.ralib.data.VarMapping; import de.learnlib.ralib.oracles.Branching; import de.learnlib.ralib.smt.SMTUtil; +import de.learnlib.ralib.theory.Memorables; import de.learnlib.ralib.theory.SDT; import de.learnlib.ralib.theory.SDTGuard; import de.learnlib.ralib.theory.SDTLeaf; -import de.learnlib.ralib.words.DataWords; import de.learnlib.ralib.words.PSymbolInstance; import de.learnlib.ralib.words.ParameterizedSymbol; import gov.nasa.jpf.constraints.api.Expression; @@ -49,16 +48,16 @@ public static class Node { private final boolean isLeaf; - private final Parameter parameter; + private final SuffixValue parameter; private final Map next = new LinkedHashMap<>(); private final Map guards = new LinkedHashMap<>(); - public Node(Parameter parameter) { + public Node(SuffixValue parameter) { this.parameter = parameter; this.isLeaf = true; } - public Node(Parameter parameter, Map next, Map guards) { + public Node(SuffixValue parameter, Map next, Map guards) { this.parameter = parameter; this.next.putAll(next); this.guards.putAll(guards); @@ -87,8 +86,8 @@ void toString(StringBuilder sb, String indentation) { } } - protected Map> collectDVs() { - Map> dvs = new LinkedHashMap(); + protected Map> collectDVs() { + Map> dvs = new LinkedHashMap(); if (!(this.next.keySet()).isEmpty()) { dvs.put(this.parameter, this.next.keySet()); for (Map.Entry e : this.next.entrySet()) { @@ -98,8 +97,8 @@ protected Map> collectDVs() { return dvs; } - protected Map> collectGuards() { - Map> guards = new LinkedHashMap(); + protected Map> collectGuards() { + Map> guards = new LinkedHashMap(); if (!(this.next.keySet()).isEmpty()) { guards.put(this.parameter, new LinkedHashSet(this.guards.values())); for (Map.Entry e : this.next.entrySet()) { @@ -128,34 +127,28 @@ protected SDT buildFakeSDT() { private final Node node; - private final PIV piv; - private final Constants constants; - private final ParameterValuation pval; + private final SDT[] sdts; - public MultiTheoryBranching(Word prefix, ParameterizedSymbol action, Node node, PIV piv, - ParameterValuation pval, Constants constants, SDT... sdts) { + public MultiTheoryBranching(Word prefix, ParameterizedSymbol action, + Node node, Constants constants, SDT... sdts) { this.prefix = prefix; this.action = action; this.node = node; - this.piv = new PIV(); this.constants = constants; - if (piv != null) { - this.piv.putAll(piv); - } - this.pval = pval; + this.sdts = sdts; } public Word getPrefix() { return prefix; } - public Map> getDVs() { + public Map> getDVs() { return this.node.collectDVs(); } - public Map> getParamGuards() { + public Map> getParamGuards() { return node.collectGuards(); } @@ -163,14 +156,6 @@ public SDT buildFakeSDT() { return node.buildFakeSDT(); } - public ParameterValuation getPval() { - return pval; - } - - public PIV getPiv() { - return piv; - } - public Set getGuards() { return collectGuards(this.node, new LinkedHashSet()); } @@ -273,7 +258,7 @@ public Word transformPrefix(Word dw) { Parameter p = new Parameter(s.getDataType(), s.getId()); vals.put(p, dv); } - RegisterValuation vars = DataWords.computeRegisterValuation(ParameterValuation.fromPSymbolWord(getPrefix()), getPiv()); + RegisterValuation vars = Memorables.getAssignment(this.sdts).registerValuation(); Map, Expression> branches = getBranches(); Word prefix = null; diff --git a/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheorySDTLogicOracle.java b/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheorySDTLogicOracle.java index 9c3d10ac..ac44f4a8 100644 --- a/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheorySDTLogicOracle.java +++ b/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheorySDTLogicOracle.java @@ -18,18 +18,13 @@ import java.util.Map; +import de.learnlib.ralib.data.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import de.learnlib.ralib.data.Constants; -import de.learnlib.ralib.data.DataValue; -import de.learnlib.ralib.data.Mapping; -import de.learnlib.ralib.data.PIV; -import de.learnlib.ralib.data.SymbolicDataValue; import de.learnlib.ralib.data.SymbolicDataValue.Parameter; import de.learnlib.ralib.data.SymbolicDataValue.Register; import de.learnlib.ralib.data.SymbolicDataValue.SuffixValue; -import de.learnlib.ralib.data.VarMapping; import de.learnlib.ralib.oracles.SDTLogicOracle; import de.learnlib.ralib.smt.ConstraintSolver; import de.learnlib.ralib.smt.SMTUtil; @@ -61,8 +56,8 @@ public MultiTheorySDTLogicOracle(Constants consts, ConstraintSolver solver) { } @Override - public boolean hasCounterexample(Word prefix, SDT sdt1, PIV piv1, - SDT sdt2, PIV piv2, Expression guard, Word rep) { + public boolean hasCounterexample(Word prefix, SDT sdt1, + SDT sdt2, Expression guard, Word rep) { // Collection join = piv1.values(); @@ -71,23 +66,21 @@ public boolean hasCounterexample(Word prefix, SDT sdt1, PIV piv LOGGER.trace("SDT2: {0}", sdt2); LOGGER.trace("Guard: {0}", guard); - SDT _sdt1 = sdt1; - SDT _sdt2 = sdt2; - - Expression expr1 = _sdt1.getAcceptingPaths(consts); - Expression expr2 = _sdt2.getAcceptingPaths(consts); + Expression expr1 = sdt1.getAcceptingPaths(consts); + Expression expr2 = sdt2.getAcceptingPaths(consts); Expression exprG = guard; + //System.out.println(exprG); + VarMapping gremap = new VarMapping<>(); - for (Variable sv : ExpressionUtil.freeVariables(exprG)) { + for (Variable sv : ExpressionUtil.freeVariables(exprG)) { if (sv instanceof Parameter p) { gremap.put(p, new SuffixValue( p.getDataType(), p.getId())); } } exprG = SMTUtil.renameVars(exprG, gremap); - - VarMapping remap = piv2.createRemapping(piv1); + VarMapping remap = new VarMapping<>(); //piv2.createRemapping(piv1); Expression expr2r = SMTUtil.renameVars(expr2, remap); @@ -111,8 +104,7 @@ public boolean hasCounterexample(Word prefix, SDT sdt1, PIV piv } @Override - public Expression getCEGuard(Word prefix, - SDT sdt1, PIV piv1, SDT sdt2, PIV piv2) { + public Expression getCEGuard(Word prefix, SDT sdt1, SDT sdt2) { SDT _sdt1 = sdt1; SDT _sdt2 = sdt2; @@ -127,8 +119,8 @@ public Expression getCEGuard(Word prefix, Expression expr2 = e2.getKey(); boolean outcome2 = e2.getValue(); if (outcome1 != outcome2) { - VarMapping remap = piv2.createRemapping(piv1); - Expression test = ExpressionUtil.and(expr1, SMTUtil.renameVars(expr2, remap)); + //VarMapping remap = piv2.createRemapping(piv1); + Expression test = ExpressionUtil.and(expr1, expr2); if (solver.isSatisfiable(test, new Mapping<>())) { return expr1; } @@ -139,17 +131,15 @@ public Expression getCEGuard(Word prefix, } @Override - public boolean doesRefine(Expression refining, PIV pivRefining, Expression refined, PIV pivRefined, Mapping valuation) { + public boolean doesRefine(Expression refining, Expression refined, Mapping valuation) { LOGGER.trace("refining: {0}", refining); LOGGER.trace("refined: {0}", refined); - LOGGER.trace("pivRefining: {0}", pivRefining); - LOGGER.trace("pivRefined: {0}", pivRefined); - VarMapping remap = pivRefined.createRemapping(pivRefining); + //VarMapping remap = pivRefined.createRemapping(pivRefining); Expression exprRefining = refining; - Expression exprRefined = SMTUtil.renameVars(refined, remap); + Expression exprRefined = refined; //SMTUtil.renameVars(refined, remap); // is there any case for which refining is true but refined is false? @@ -161,7 +151,7 @@ public boolean doesRefine(Expression refining, PIV pivRefining, Express valWithConsts.putAll(valuation); valWithConsts.putAll(consts); - LOGGER.trace("MAP: " + remap); + //LOGGER.trace("MAP: " + remap); LOGGER.trace("TEST:" + test); boolean r = solver.isSatisfiable(test, valWithConsts); @@ -169,21 +159,16 @@ public boolean doesRefine(Expression refining, PIV pivRefining, Express } @Override - public boolean areMutuallyExclusive(Expression guard1, PIV piv1, Expression guard2, - PIV piv2, Mapping valuation) { + public boolean areMutuallyExclusive(Expression guard1, Expression guard2, + Mapping valuation) { LOGGER.trace("guard1: {0}", guard1); LOGGER.trace("guard2: {0}", guard2); - LOGGER.trace("piv1: {0}", piv1); - LOGGER.trace("piv2: {0}", piv2); - - VarMapping remap = piv2.createRemapping(piv1); Expression exprGuard1 = guard1; - Expression exprGuard2 = SMTUtil.renameVars(guard2, remap); + Expression exprGuard2 = guard2; Expression test = ExpressionUtil.and(exprGuard1, exprGuard2); - LOGGER.trace("MAP: " + remap); LOGGER.trace("TEST:" + test); boolean r = solver.isSatisfiable(test, valuation); @@ -191,23 +176,22 @@ public boolean areMutuallyExclusive(Expression guard1, PIV piv1, Expres } @Override - public boolean areEquivalent(Expression guard1, PIV piv1, Expression guard2, - PIV piv2, Mapping valuation) { + public boolean areEquivalent(Expression guard1, Bijection remapping, Expression guard2, + Mapping valuation) { LOGGER.trace("guard1: {0}", guard1); LOGGER.trace("guard2: {0}", guard2); - LOGGER.trace("piv1: {0}", piv1); - LOGGER.trace("piv2: {0}", piv2); + LOGGER.trace("remapping: {0}", remapping); - VarMapping remap = piv2.createRemapping(piv1); + //Mapping remap = piv2.createRemapping(piv1); - Expression g2relabel = SMTUtil.renameVars(guard2, remap); + Expression g2relabel = SMTUtil.renameVals(guard2, remapping); Expression test = ExpressionUtil.or( ExpressionUtil.and(guard1, new gov.nasa.jpf.constraints.expressions.Negation(g2relabel)), ExpressionUtil.and(new gov.nasa.jpf.constraints.expressions.Negation(guard1), g2relabel) ); - LOGGER.trace("MAP: " + remap); + LOGGER.trace("MAP: " + remapping); LOGGER.trace("TEST:" + test); boolean r = solver.isSatisfiable(test, valuation); @@ -215,18 +199,18 @@ public boolean areEquivalent(Expression guard1, PIV piv1, Expression word, Word prefix, SDT sdt, PIV piv) { + public boolean accepts(Word word, Word prefix, SDT sdt) { assert prefix.isPrefixOf(word) : "invalid prefix"; SDT _sdt = sdt; assert _sdt.getHeight() == DataWords.paramValLength(word.suffix(word.length() - prefix.length())) : "The height of the tree is not consistent with the number of parameters in the word"; Mapping valuation = new Mapping<>(); valuation.putAll(consts); - DataValue[] vals = DataWords.valsOf(prefix); + /*DataValue[] vals = DataWords.valsOf(prefix); for (Map.Entry entry : piv.entrySet()) { DataValue parVal = vals[entry.getKey().getId()-1]; valuation.put(entry.getValue(), parVal); - } + }*/ boolean accepts = accepts(word, prefix, prefix.length(), _sdt, valuation); return accepts; diff --git a/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheoryTreeOracle.java b/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheoryTreeOracle.java index 91b91c36..66fa9d00 100644 --- a/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheoryTreeOracle.java +++ b/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheoryTreeOracle.java @@ -23,7 +23,6 @@ import java.util.LinkedHashSet; import java.util.List; import java.util.Map; -import java.util.Map.Entry; import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -39,19 +38,11 @@ import de.learnlib.ralib.data.DataType; import de.learnlib.ralib.data.DataValue; import de.learnlib.ralib.data.Mapping; -import de.learnlib.ralib.data.PIV; -import de.learnlib.ralib.data.ParameterValuation; -import de.learnlib.ralib.data.RegisterValuation; import de.learnlib.ralib.data.SuffixValuation; import de.learnlib.ralib.data.SymbolicDataValue; -import de.learnlib.ralib.data.SymbolicDataValue.Parameter; -import de.learnlib.ralib.data.SymbolicDataValue.Register; import de.learnlib.ralib.data.SymbolicDataValue.SuffixValue; -import de.learnlib.ralib.data.VarMapping; import de.learnlib.ralib.data.WordValuation; import de.learnlib.ralib.data.util.SymbolicDataValueGenerator.ParameterGenerator; -import de.learnlib.ralib.data.util.SymbolicDataValueGenerator.RegisterGenerator; -import de.learnlib.ralib.data.util.SymbolicDataValueGenerator.SuffixValueGenerator; import de.learnlib.ralib.learning.SymbolicSuffix; import de.learnlib.ralib.oracles.Branching; import de.learnlib.ralib.oracles.DataWordOracle; @@ -59,7 +50,6 @@ import de.learnlib.ralib.oracles.TreeQueryResult; import de.learnlib.ralib.oracles.mto.MultiTheoryBranching.Node; import de.learnlib.ralib.smt.ConstraintSolver; -import de.learnlib.ralib.smt.SMTUtil; import de.learnlib.ralib.theory.SDT; import de.learnlib.ralib.theory.SDTGuard; import de.learnlib.ralib.theory.SDTLeaf; @@ -67,8 +57,6 @@ import de.learnlib.ralib.words.DataWords; import de.learnlib.ralib.words.PSymbolInstance; import de.learnlib.ralib.words.ParameterizedSymbol; -import gov.nasa.jpf.constraints.api.Expression; -import gov.nasa.jpf.constraints.util.ExpressionUtil; import net.automatalib.common.util.Pair; import net.automatalib.word.Word; @@ -101,34 +89,12 @@ public MultiTheoryTreeOracle(DataWordOracle oracle, Map teache @Override public TreeQueryResult treeQuery(Word prefix, SymbolicSuffix suffix) { - PIV pir = new PIV(); - SDT sdt = treeQuery(prefix, suffix, new WordValuation(), pir, constants, new SuffixValuation()); - - //System.out.println(prefix + " . " + suffix); - //System.out.println; - - // move registers to 1 ... n - VarMapping rename = new VarMapping(); - RegisterGenerator gen = new RegisterGenerator(); - Set regs = sdt.getRegisters(); - PIV piv = new PIV(); - - for (Entry e : pir.entrySet()) { - if (regs.contains(e.getValue())) { - Register r = e.getValue(); - rename.put(r, gen.next(r.getDataType())); - piv.put(e.getKey(), (Register) rename.get(r)); - } - } - - TreeQueryResult tqr = new TreeQueryResult(piv, sdt.relabel(rename)); - LOGGER.debug(Category.QUERY, "PIV: {}", piv); - - return tqr; + SDT sdt = treeQuery(prefix, suffix, new WordValuation(), constants, new SuffixValuation()); + return new TreeQueryResult(sdt); } @Override - public SDT treeQuery(Word prefix, SymbolicSuffix suffix, WordValuation values, PIV pir, + public SDT treeQuery(Word prefix, SymbolicSuffix suffix, WordValuation values, Constants constants, SuffixValuation suffixValues) { // System.out.println("prefix = " + prefix + " suffix = " + suffix + " values = " + values); @@ -155,7 +121,7 @@ public SDT treeQuery(Word prefix, SymbolicSuffix suffix, WordVa // make a new tree query for prefix, suffix, prefix valuation, ... // to the correct teacher (given by type of first DV in suffix) - return teach.treeQuery(prefix, suffix, values, pir, constants, suffixValues, this); + return teach.treeQuery(prefix, suffix, values, constants, suffixValues, this); } /** @@ -164,92 +130,69 @@ public SDT treeQuery(Word prefix, SymbolicSuffix suffix, WordVa * */ @Override - public Branching getInitialBranching(Word prefix, ParameterizedSymbol ps, PIV piv, - SDT... sdts) { + public Branching getInitialBranching(Word prefix, ParameterizedSymbol ps, SDT... sdts) { LOGGER.info(Category.QUERY, "computing initial branching for {0} after {1}", new Object[] { ps, prefix }); - // TODO: check if this casting can be avoided by proper use of generics - // TODO: the problem seems to be - // System.out.println("using " + sdts.length + " SDTs"); - SDT[] casted = new SDT[sdts.length]; - for (int i = 0; i < casted.length; i++) { - if (sdts[i] instanceof SDTLeaf) { - casted[i] = (SDTLeaf) sdts[i]; - } else { - casted[i] = sdts[i]; - } - } - - MultiTheoryBranching mtb = this.getInitialBranching(prefix, ps, piv, new ParameterValuation(), casted); - - LOGGER.trace(Category.QUERY, mtb.toString()); - - return mtb; - } - - // get the initial branching for the symbol ps after prefix given a certain tree - private MultiTheoryBranching getInitialBranching(Word prefix, ParameterizedSymbol ps, PIV piv, - ParameterValuation pval, SDT... sdts) { + MultiTheoryBranching mtb; Node n; if (sdts.length == 0) { - n = createFreshNode(1, prefix, ps, piv, pval); - return new MultiTheoryBranching(prefix, ps, n, piv, pval, constants, sdts); + n = createFreshNode(1, prefix, ps, new SuffixValuation()); + mtb = new MultiTheoryBranching(prefix, ps, n, constants, sdts); } else { - n = createNode(1, prefix, ps, piv, pval, sdts); - MultiTheoryBranching fluff = new MultiTheoryBranching(prefix, ps, n, piv, pval, constants, sdts); - return fluff; + n = createNode(1, prefix, ps, new SuffixValuation(), new LinkedHashMap<>(), sdts); + MultiTheoryBranching fluff = new MultiTheoryBranching(prefix, ps, n, constants, sdts); + mtb = fluff; } + LOGGER.trace(Category.QUERY, mtb.toString()); + + return mtb; } - private Node createFreshNode(int i, Word prefix, ParameterizedSymbol ps, PIV piv, - ParameterValuation pval) { + private Node createFreshNode(int i, Word prefix, ParameterizedSymbol ps, SuffixValuation pval) { if (i == ps.getArity() + 1) { - return new Node(new Parameter(null, i)); + return new Node(new SuffixValue(null, i)); } else { Map nextMap = new LinkedHashMap<>(); Map guardMap = new LinkedHashMap<>(); DataType type = ps.getPtypes()[i - 1]; LOGGER.trace(Category.QUERY, "current type: " + type.getName()); - Parameter p = new Parameter(type, i); + SuffixValue p = new SuffixValue(type, i); SDTGuard guard = new SDTGuard.SDTTrueGuard(new SuffixValue(type, i)); Theory teach = teachers.get(type); + DataValue dvi = teach.instantiate(prefix, ps, pval, constants, guard, p, new LinkedHashSet<>()); + pval.put(p, dvi); - DataValue dvi = teach.instantiate(prefix, ps, piv, pval, constants, guard, p, new LinkedHashSet<>()); - ParameterValuation otherPval = new ParameterValuation(); - otherPval.putAll(pval); - otherPval.put(p, dvi); - - nextMap.put(dvi, createFreshNode(i + 1, prefix, ps, piv, otherPval)); + nextMap.put(dvi, createFreshNode(i + 1, prefix, ps, pval)); guardMap.put(dvi, guard); return new Node(p, nextMap, guardMap); } } - private Node createNode(int i, Word prefix, ParameterizedSymbol ps, PIV piv, ParameterValuation pval, + private Node createNode(int i, Word prefix, ParameterizedSymbol ps, SuffixValuation pval, SDT... sdts) { - Node n = createNode(i, prefix, ps, piv, pval, new LinkedHashMap<>(), sdts); + Node n = createNode(i, prefix, ps, pval, new LinkedHashMap<>(), sdts); return n; } - private Node createNode(int i, Word prefix, ParameterizedSymbol ps, PIV piv, ParameterValuation pval, - Map> oldDvMap, SDT... sdts) { + private Node createNode(int i, Word prefix, ParameterizedSymbol ps, SuffixValuation pval, + Map> oldDvMap, SDT... sdts) { if (i == ps.getArity() + 1) { - return new Node(new Parameter(null, i)); + return new Node(new SuffixValue(null, i)); } else { // obtain the data type, teacher, parameter DataType type = ps.getPtypes()[i - 1]; Theory teach = teachers.get(type); - Parameter p = new Parameter(type, i); + SuffixValue p = new SuffixValue(type, i); // valuation - Mapping valuation = buildValuation(pval, prefix, piv, constants); + Mapping valuation = buildValuation(pval, prefix, constants); // the map may contain no old values for p, in which case we use an empty set // (to avoid potential NPE when instantiating guards) @@ -271,7 +214,7 @@ private Node createNode(int i, Word prefix, ParameterizedSymbol Set oldGuards = mergedGuardEntry.getValue(); // first solve using a constraint solver - DataValue dvi = teach.instantiate(prefix, ps, piv, pval, constants, guard, p, oldDvs); + DataValue dvi = teach.instantiate(prefix, ps, pval, constants, guard, p, oldDvs); // if merging of guards is done properly, there should be no case where the // guard cannot be instantiated. assert (dvi != null); @@ -283,11 +226,11 @@ private Node createNode(int i, Word prefix, ParameterizedSymbol // guards .distinct().toArray(SDT[]::new); // merge and pick distinct elements - ParameterValuation otherPval = new ParameterValuation(); + SuffixValuation otherPval = new SuffixValuation(); otherPval.putAll(pval); otherPval.put(p, dvi); - nextMap.put(dvi, createNode(i + 1, prefix, ps, piv, otherPval, oldDvMap, nextLevelSDTs)); + nextMap.put(dvi, createNode(i + 1, prefix, ps, otherPval, oldDvMap, nextLevelSDTs)); if (guardMap.containsKey(dvi)) { throw new IllegalStateException( "Guard instantiated using a dvi that was already used to instantiate a prior guard."); @@ -415,14 +358,14 @@ private boolean canBeMerged(SDTGuard a, SDTGuard b, MultiTheorySDTLogicOracle ml if (b instanceof SDTGuard.EqualityGuard) if (a.equals( SDTGuard.toDeqGuard(b) )) return false; - return !mlo.areMutuallyExclusive(SDTGuard.toExpr(a), new PIV(), SDTGuard.toExpr(b), new PIV(), valuation); + return !mlo.areMutuallyExclusive(SDTGuard.toExpr(a), SDTGuard.toExpr(b), valuation); } private boolean refines(SDTGuard a, SDTGuard b, MultiTheorySDTLogicOracle mlo, Mapping valuation) { if (b instanceof SDTGuard.SDTTrueGuard) return true; - boolean ref1 = mlo.doesRefine(SDTGuard.toExpr(a), new PIV(), SDTGuard.toExpr(b), new PIV(), valuation); + boolean ref1 = mlo.doesRefine(SDTGuard.toExpr(a), SDTGuard.toExpr(b), valuation); return ref1; } @@ -443,29 +386,29 @@ private Map> getChildren(SDT[] sdts) { return children; } - private Mapping buildValuation(ParameterValuation ParameterValuation, - Word prefix, PIV piv, Constants constants) { + private Mapping buildValuation(SuffixValuation suffixValuation, + Word prefix, Constants constants) { Mapping valuation = new Mapping(); - DataValue[] values = DataWords.valsOf(prefix); - piv.forEach((param, reg) -> valuation.put(reg, values[param.getId() - 1])); - ParameterValuation.forEach((param, dv) -> valuation.put(new SuffixValue(param.getDataType(), param.getId()), dv)); - constants.forEach((c, dv) -> valuation.put(c, dv)); + //DataValue[] values = DataWords.valsOf(prefix); + //piv.forEach((param, reg) -> valuation.put(reg, values[param.getId() - 1])); + valuation.putAll(suffixValuation); + valuation.putAll(constants); return valuation; } @Override public Map, Boolean> instantiate(Word prefix, SymbolicSuffix suffix, - SDT sdt, PIV piv) { + SDT sdt) { assert (sdt instanceof SDT); Map, Boolean> words = new LinkedHashMap, Boolean>(); - instantiate(words, prefix, suffix, sdt, piv, 0, 0, - new ParameterValuation(), new ParameterGenerator(), new ParameterValuation(), new ParameterGenerator()); + instantiate(words, prefix, suffix, sdt, 0, 0, + new SuffixValuation(), new ParameterGenerator(), new SuffixValuation(), new ParameterGenerator()); return words; } private void instantiate(Map, Boolean> words, Word prefix, - SymbolicSuffix suffix, SDT sdt, PIV piv, int aidx, int pidx, - ParameterValuation pval, ParameterGenerator pgen, ParameterValuation gpval, ParameterGenerator gpgen) { + SymbolicSuffix suffix, SDT sdt, int aidx, int pidx, + SuffixValuation pval, ParameterGenerator pgen, SuffixValuation gpval, ParameterGenerator gpgen) { if (aidx == suffix.getActions().length()) { words.put(prefix, sdt.isAccepting()); } else { @@ -474,24 +417,24 @@ private void instantiate(Map, Boolean> words, Word newPrefix = prefix.append(psi); - instantiate(words, newPrefix, suffix, sdt, piv, aidx+1, 0, new ParameterValuation(), new ParameterGenerator(), gpval, gpgen); + instantiate(words, newPrefix, suffix, sdt, aidx+1, 0, new SuffixValuation(), new ParameterGenerator(), gpval, gpgen); } else { - Parameter p = pgen.next(ps.getPtypes()[pidx]); - Parameter gp = gpgen.next(ps.getPtypes()[pidx]); + SuffixValue p = new SuffixValue(ps.getPtypes()[pidx], pgen.next(ps.getPtypes()[pidx]).getId()); + SuffixValue gp = new SuffixValue( ps.getPtypes()[pidx], gpgen.next(ps.getPtypes()[pidx]).getId() ); Theory t = teachers.get(ps.getPtypes()[pidx]); for (Map.Entry entry : sdt.getChildren().entrySet()) { - DataValue val = t.instantiate(prefix, ps, piv, gpval, constants, entry.getKey(), p, Collections.emptySet()); - ParameterValuation newPval = new ParameterValuation(); + DataValue val = t.instantiate(prefix, ps, gpval, constants, entry.getKey(), p, Collections.emptySet()); + SuffixValuation newPval = new SuffixValuation(); newPval.putAll(pval); newPval.put(p, val); - ParameterValuation newGpval = new ParameterValuation(); + SuffixValuation newGpval = new SuffixValuation(); newGpval.putAll(gpval); newGpval.put(gp, val); ParameterGenerator newPgen = new ParameterGenerator(); newPgen.set(pgen); ParameterGenerator newGpgen = new ParameterGenerator(); newGpgen.set(gpgen); - instantiate(words, prefix, suffix, entry.getValue(), piv, aidx, pidx+1, newPval, newPgen, newGpval, newGpgen); + instantiate(words, prefix, suffix, entry.getValue(), aidx, pidx+1, newPval, newPgen, newGpval, newGpgen); } } } @@ -503,7 +446,7 @@ private void instantiate(Map, Boolean> words, Word prefix, ParameterizedSymbol ps, Branching current, PIV piv, + public Branching updateBranching(Word prefix, ParameterizedSymbol ps, Branching current, SDT... sdts) { //System.out.println(current); @@ -513,35 +456,29 @@ public Branching updateBranching(Word prefix, ParameterizedSymb MultiTheoryBranching oldBranching = (MultiTheoryBranching) current; - Map> oldDvs = oldBranching.getDVs(); + Map> oldDvs = oldBranching.getDVs(); SDT[] casted = new SDT[sdts.length + 1]; casted[0] = oldBranching.buildFakeSDT(); - VarMapping remapping = piv.createRemapping(oldBranching.getPiv()); - + //VarMapping remapping = piv.createRemapping(oldBranching.getPiv()); + // todo: this can be cleaned up for (int i = 0; i < sdts.length; i++) { if (sdts[i] instanceof SDTLeaf) { casted[i + 1] = (SDTLeaf) sdts[i]; } else { - casted[i + 1] = sdts[i].relabel(remapping); + casted[i + 1] = sdts[i]; } } - PIV relabeledPiv = piv.relabel(remapping); - PIV newPiv = new PIV(); - newPiv.putAll(oldBranching.getPiv()); - newPiv.putAll(relabeledPiv); + Node n = createNode(1, prefix, ps, new SuffixValuation(),oldDvs, casted); - ParameterValuation pval = new ParameterValuation(); - - Node n = createNode(1, prefix, ps, newPiv, pval, oldDvs, casted); - - MultiTheoryBranching fluff = new MultiTheoryBranching(prefix, ps, n, newPiv, pval, constants, casted); + MultiTheoryBranching fluff = new MultiTheoryBranching(prefix, ps, n, constants, casted); return fluff; } + /* public boolean accepts(Word prefix, Word suffix, SDT sdt, PIV piv) { Mapping mapping = new Mapping<>(); mapping.putAll(constants); @@ -581,7 +518,7 @@ public boolean accepts(Word prefix, Word suffi } return expr.evaluateSMT(SMTUtil.compose(mapping)); - } + }*/ public Map getTeachers() { return teachers; diff --git a/src/main/java/de/learnlib/ralib/oracles/mto/OptimizedSymbolicSuffixBuilder.java b/src/main/java/de/learnlib/ralib/oracles/mto/OptimizedSymbolicSuffixBuilder.java index 00d1cde0..46c21ab8 100644 --- a/src/main/java/de/learnlib/ralib/oracles/mto/OptimizedSymbolicSuffixBuilder.java +++ b/src/main/java/de/learnlib/ralib/oracles/mto/OptimizedSymbolicSuffixBuilder.java @@ -1,23 +1,11 @@ package de.learnlib.ralib.oracles.mto; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.LinkedHashMap; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import de.learnlib.ralib.data.Constants; -import de.learnlib.ralib.data.DataType; -import de.learnlib.ralib.data.DataValue; -import de.learnlib.ralib.data.Mapping; -import de.learnlib.ralib.data.PIV; -import de.learnlib.ralib.data.SymbolicDataValue; +import java.util.*; + +import de.learnlib.ralib.data.*; import de.learnlib.ralib.data.SymbolicDataValue.Parameter; import de.learnlib.ralib.data.SymbolicDataValue.Register; import de.learnlib.ralib.data.SymbolicDataValue.SuffixValue; -import de.learnlib.ralib.data.VarMapping; import de.learnlib.ralib.data.util.SymbolicDataValueGenerator; import de.learnlib.ralib.learning.SymbolicSuffix; import de.learnlib.ralib.smt.ConstraintSolver; @@ -59,17 +47,17 @@ public OptimizedSymbolicSuffixBuilder(Constants consts, SymbolicSuffixRestrictio * @param registers - a list of registers that must be revealed by the suffix * @return a new suffix formed by prepending suffix with the last symbol of prefix */ - public SymbolicSuffix extendSuffix(Word prefix, SDT sdt, PIV piv, SymbolicSuffix suffix, Register... registers) { + public SymbolicSuffix extendSuffix(Word prefix, SDT sdt, SymbolicSuffix suffix, DataValue... values) { Word suffixActions = suffix.getActions(); - if (registers.length > 0) { - SymbolicSuffix s = extendSuffixRevealingRegisters(prefix, sdt, piv, suffixActions, registers); + if (values.length > 0) { + SymbolicSuffix s = extendSuffixRevealingRegisters(prefix, sdt, suffixActions, values); return s; } Set> paths = sdt.getAllPaths(new ArrayList<>()).keySet(); SymbolicSuffix coalesced = null; for (List path : paths) { - SymbolicSuffix extended = extendSuffix(prefix, path, piv, suffixActions); + SymbolicSuffix extended = extendSuffix(prefix, path, suffixActions); if (coalesced == null) { coalesced = extended; } else { @@ -79,13 +67,13 @@ public SymbolicSuffix extendSuffix(Word prefix, SDT sdt, PIV pi return coalesced; } - private SymbolicSuffix extendSuffixRevealingRegisters(Word prefix, SDT sdt, PIV piv, Word suffixActions, Register[] registers) { + private SymbolicSuffix extendSuffixRevealingRegisters(Word prefix, SDT sdt, Word suffixActions, DataValue[] registers) { SDT prunedSDT = pruneSDT(sdt, registers); Set> paths = prunedSDT.getAllPaths(new ArrayList<>()).keySet(); assert paths.size() > 0 : "All paths in SDT were pruned"; SymbolicSuffix suffix = null; for (List path : paths) { - SymbolicSuffix extended = extendSuffix(prefix, path, piv, suffixActions); + SymbolicSuffix extended = extendSuffix(prefix, path, suffixActions); if (suffix == null) { suffix = extended; } else { @@ -95,7 +83,7 @@ private SymbolicSuffix extendSuffixRevealingRegisters(Word pref return suffix; } - SymbolicSuffix extendSuffix(Word prefix, List sdtPath, PIV piv, Word suffixActions) { + SymbolicSuffix extendSuffix(Word prefix, List sdtPath, Word suffixActions) { Word sub = prefix.prefix(prefix.length()-1); PSymbolInstance action = prefix.lastSymbol(); ParameterizedSymbol actionSymbol = action.getBaseSymbol(); @@ -108,15 +96,21 @@ SymbolicSuffix extendSuffix(Word prefix, List sdtPath restrictions.put(sv, actionSuffix.getRestriction(sv)); } - VarMapping renaming = new VarMapping<>(); - for (Map.Entry e : piv.entrySet()) { - Parameter p = e.getKey(); - Register r = e.getValue(); - if (p.getId() > subArity) { - SuffixValue sv = new SuffixValue(p.getDataType(), p.getId()-subArity); - renaming.put(r, sv); - } - } + List subVals = Arrays.stream(DataWords.valsOf(sub)).toList(); + SDTRelabeling renaming = new SDTRelabeling(); + sdtPath.stream() + .map(SDTGuard::getRegisters) + .flatMap(Set::stream) + .filter(SDTGuardElement::isDataValue) + .map( x -> (DataValue) x) + .distinct().forEach( d -> { + int dPos = subVals.indexOf(d); + if (dPos >= subArity) { + SuffixValue sv = new SuffixValue(d.getDataType(), dPos+1-subArity); + renaming.put(d, sv); + } + }); + for (SDTGuard guard : sdtPath) { SuffixValue oldSV = guard.getParameter(); SuffixValue newSV = new SuffixValue(oldSV.getDataType(), oldSV.getId()+actionArity); @@ -128,15 +122,16 @@ SymbolicSuffix extendSuffix(Word prefix, List sdtPath Word actions = suffixActions.prepend(actionSymbol); return new SymbolicSuffix(actions, restrictions); + } - SDT pruneSDT(SDT sdt, SymbolicDataValue[] registers) { + SDT pruneSDT(SDT sdt, DataValue[] registers) { LabeledSDT lsdt = new LabeledSDT(0, sdt); LabeledSDT pruned = pruneSDTNode(lsdt, lsdt, registers); return pruned.toUnlabeled(); } - private LabeledSDT pruneSDTNode(LabeledSDT lsdt, LabeledSDT node, SymbolicDataValue[] registers) { + private LabeledSDT pruneSDTNode(LabeledSDT lsdt, LabeledSDT node, DataValue[] registers) { LabeledSDT pruned = lsdt; int nodeLabel = node.getLabel(); for (int label : node.getChildIndices()) { @@ -154,7 +149,7 @@ private LabeledSDT pruneSDTNode(LabeledSDT lsdt, LabeledSDT node, SymbolicDataVa return pruned; } - private LabeledSDT pruneSDTBranch(LabeledSDT lsdt, int label, SymbolicDataValue[] registers) { + private LabeledSDT pruneSDTBranch(LabeledSDT lsdt, int label, DataValue[] registers) { if (branchContainsRegister(lsdt.getNode(label), registers) || guardOnRegisters(lsdt.getGuard(label), registers)) { return lsdt; @@ -162,7 +157,7 @@ private LabeledSDT pruneSDTBranch(LabeledSDT lsdt, int label, SymbolicDataValue[ LabeledSDT pruned = LabeledSDT.pruneBranch(lsdt, label); SDT prunedSDT = pruned.toUnlabeled(); int revealedRegisters = 0; - for (SymbolicDataValue r : registers) { + for (DataValue r : registers) { if (guardsOnRegisterHaveBothOutcomes(prunedSDT, r)) { revealedRegisters++; } @@ -173,12 +168,12 @@ private LabeledSDT pruneSDTBranch(LabeledSDT lsdt, int label, SymbolicDataValue[ return pruned; } - private boolean branchContainsRegister(LabeledSDT node, SymbolicDataValue[] registers) { + private boolean branchContainsRegister(LabeledSDT node, DataValue[] registers) { for (Map.Entry e : node.getChildren().entrySet()) { SDTGuard guard = e.getKey(); LabeledSDT child = e.getValue(); - Set comparands = SDTGuard.getComparands(guard,guard.getParameter()); - for (SymbolicDataValue sdv : registers) { + Set comparands = SDTGuard.getComparands(guard,guard.getParameter()); + for (DataValue sdv : registers) { if (comparands.contains(sdv)) { return true; } @@ -190,9 +185,9 @@ private boolean branchContainsRegister(LabeledSDT node, SymbolicDataValue[] regi return false; } - private boolean guardOnRegisters(SDTGuard guard, SymbolicDataValue[] registers) { + private boolean guardOnRegisters(SDTGuard guard, DataValue[] registers) { SuffixValue sv = guard.getParameter(); - for (SymbolicDataValue r : registers) { + for (DataValue r : registers) { if (SDTGuard.getComparands(guard, sv).contains(r)) { return true; } @@ -266,7 +261,7 @@ public boolean sdtRevealsRegister(SDT sdt, SymbolicDataValue register) { return false; } - private boolean guardsOnRegisterHaveBothOutcomes(SDT sdt, SymbolicDataValue register) { + private boolean guardsOnRegisterHaveBothOutcomes(SDT sdt, DataValue register) { if (sdt instanceof SDTLeaf) return true; @@ -312,14 +307,14 @@ private boolean guardHasBothOutcomes(Map children) { * Provides a one-symbol extension of an (optimized) suffix for two non-empty prefixes leading to inequivalent locations, * based on the SDTs and associated PIVs that revealed the source of the inequivalence. */ - public SymbolicSuffix extendDistinguishingSuffix(Word prefix1, SDT sdt1, PIV piv1, - Word prefix2, SDT sdt2, PIV piv2, SymbolicSuffix suffix) { + public SymbolicSuffix extendDistinguishingSuffix(Word prefix1, SDT sdt1, + Word prefix2, SDT sdt2, SymbolicSuffix suffix) { assert !prefix1.isEmpty() && !prefix2.isEmpty() && prefix1.lastSymbol().getBaseSymbol().equals(prefix2.lastSymbol().getBaseSymbol()); // prefix1 = subprefix1 + sym(d1); prefix2 = subprefix2 + sym(d2) // our new_suffix will be sym(s1) + suffix // we first determine if s1 is free (extended to all parameters in sym, if there are more) - SymbolicSuffix suffix1 = extendSuffix(prefix1, sdt1, piv1, suffix); - SymbolicSuffix suffix2 = extendSuffix(prefix2, sdt2, piv2, suffix); + SymbolicSuffix suffix1 = extendSuffix(prefix1, sdt1, suffix); + SymbolicSuffix suffix2 = extendSuffix(prefix2, sdt2, suffix); return coalesceSuffixes(suffix1, suffix2); } @@ -328,14 +323,16 @@ public SymbolicSuffix extendDistinguishingSuffix(Word prefix1, * Provides an optimized suffix to distinguish two inequivalent locations specified by prefixes, * based on the SDTs and associated PIVs that revealed the source of the inequivalence. */ - public SymbolicSuffix distinguishingSuffixFromSDTs(Word prefix1, SDT sdt1, PIV piv1, - Word prefix2, SDT sdt2, PIV piv2, Word suffixActions, ConstraintSolver solver) { + public SymbolicSuffix distinguishingSuffixFromSDTs(Word prefix1, SDT sdt1, + Word prefix2, SDT sdt2, Word suffixActions, ConstraintSolver solver) { // we relabel SDTs and PIV such that they use different registers - SymbolicDataValueGenerator.RegisterGenerator rgen = new SymbolicDataValueGenerator.RegisterGenerator(); - VarMapping relabellingSdt1 = new VarMapping<>(); - for (Register r : piv1.values()) { - relabellingSdt1.put(r, rgen.next(r.getDataType())); + SymbolicDataValueGenerator.ParameterGenerator rgen = new SymbolicDataValueGenerator.ParameterGenerator(); + SDTRelabeling relabellingSdt1 = new SDTRelabeling(); + /* + if (true) throw new RuntimeException("fix PIV"); + for (Object r : sdt1.getDataValues()) { + relabellingSdt1.put( r, rgen.next( ((TypedValue)r).getDataType())); } SDT relSdt1 = sdt1.relabel(relabellingSdt1); PIV relPiv1 = piv1.relabel(relabellingSdt1); @@ -346,19 +343,19 @@ public SymbolicSuffix distinguishingSuffixFromSDTs(Word prefix1 } SDT relSdt2 = sdt2.relabel(relabellingSdt2); PIV relPiv2 = piv2.relabel(relabellingSdt2); - + */ // we build valuations which we use to determine satisfiable paths - Mapping valuationSdt1 = buildValuation(prefix1, relPiv1, consts); - Mapping valuationSdt2 = buildValuation(prefix2, relPiv2, consts); + Mapping valuationSdt1 = buildValuation(prefix1, consts); + Mapping valuationSdt2 = buildValuation(prefix2, consts); Mapping combined = new Mapping<>(); combined.putAll(valuationSdt1); combined.putAll(valuationSdt2); - SymbolicSuffix suffix = distinguishingSuffixFromSDTs(prefix1, relSdt1, relPiv1, prefix2, relSdt2, relPiv2, combined, suffixActions, solver); + SymbolicSuffix suffix = distinguishingSuffixFromSDTs(prefix1, sdt1, prefix2, sdt2, combined, suffixActions, solver); return suffix; } - private SymbolicSuffix distinguishingSuffixFromSDTs(Word prefix1, SDT sdt1, PIV piv1, - Word prefix2, SDT sdt2, PIV piv2, + private SymbolicSuffix distinguishingSuffixFromSDTs(Word prefix1, SDT sdt1, + Word prefix2, SDT sdt2, Mapping valuation, Word suffixActions, ConstraintSolver solver) { SymbolicSuffix best = null; for (boolean b : new boolean [] {true, false}) { @@ -370,7 +367,7 @@ private SymbolicSuffix distinguishingSuffixFromSDTs(Word prefix for (List pathSdt2 : pathsSdt2) { Expression expr2 = toGuardExpression(pathSdt2); if (solver.isSatisfiable(ExpressionUtil.and(expr1, expr2), valuation)) { - SymbolicSuffix suffix = buildOptimizedSuffix(prefix1, pathSdt1, piv1, prefix2, pathSdt2, piv2, suffixActions); + SymbolicSuffix suffix = buildOptimizedSuffix(prefix1, pathSdt1, prefix2, pathSdt2, suffixActions); best = pickBest(best, suffix); } } @@ -380,11 +377,11 @@ private SymbolicSuffix distinguishingSuffixFromSDTs(Word prefix return best; } - private SymbolicSuffix buildOptimizedSuffix(Word prefix1, List pathSdt1, PIV piv1, - Word prefix2, List pathSdt2, PIV piv2, + private SymbolicSuffix buildOptimizedSuffix(Word prefix1, List pathSdt1, + Word prefix2, List pathSdt2, Word suffixActions) { - SymbolicSuffix suffix1 = extendSuffix(prefix1, pathSdt1, piv1, suffixActions); - SymbolicSuffix suffix2 = extendSuffix(prefix2, pathSdt2, piv2, suffixActions); + SymbolicSuffix suffix1 = extendSuffix(prefix1, pathSdt1, suffixActions); + SymbolicSuffix suffix2 = extendSuffix(prefix2, pathSdt2, suffixActions); return coalesceSuffixes(suffix1, suffix2); } @@ -433,10 +430,9 @@ private Expression toGuardExpression(List guards) { return ExpressionUtil.and(expr.toArray(exprArr)); } - private Mapping buildValuation(Word prefix, PIV piv, Constants constants) { + private Mapping buildValuation(Word prefix, Constants constants) { Mapping valuation = new Mapping(); DataValue[] values = DataWords.valsOf(prefix); - piv.forEach((param, reg) -> valuation.put(reg, values[param.getId() - 1])); constants.forEach((c, dv) -> valuation.put(c, dv)); return valuation; } diff --git a/src/main/java/de/learnlib/ralib/oracles/mto/SDTConstructor.java b/src/main/java/de/learnlib/ralib/oracles/mto/SDTConstructor.java index 28a94e2f..71e71e2e 100644 --- a/src/main/java/de/learnlib/ralib/oracles/mto/SDTConstructor.java +++ b/src/main/java/de/learnlib/ralib/oracles/mto/SDTConstructor.java @@ -17,7 +17,6 @@ package de.learnlib.ralib.oracles.mto; import de.learnlib.ralib.data.Constants; -import de.learnlib.ralib.data.PIV; import de.learnlib.ralib.data.SuffixValuation; import de.learnlib.ralib.data.WordValuation; import de.learnlib.ralib.learning.SymbolicSuffix; @@ -33,6 +32,6 @@ public interface SDTConstructor { SDT treeQuery( Word prefix, SymbolicSuffix suffix, - WordValuation values, PIV piv, + WordValuation values, Constants constants, SuffixValuation suffixValues); } diff --git a/src/main/java/de/learnlib/ralib/smt/ConstraintSolver.java b/src/main/java/de/learnlib/ralib/smt/ConstraintSolver.java index 3958a683..508a1dbf 100644 --- a/src/main/java/de/learnlib/ralib/smt/ConstraintSolver.java +++ b/src/main/java/de/learnlib/ralib/smt/ConstraintSolver.java @@ -34,6 +34,7 @@ public class ConstraintSolver { new NativeZ3SolverProvider().createSolver(new Properties()); public boolean isSatisfiable(Expression expr, Mapping val) { + //System.out.println("isSatisfiable: " + expr); gov.nasa.jpf.constraints.api.ConstraintSolver.Result r = solver.isSatisfiable( SMTUtil.toExpression(expr, val)); return r == gov.nasa.jpf.constraints.api.ConstraintSolver.Result.SAT; } diff --git a/src/main/java/de/learnlib/ralib/smt/ReplacingValuesVisitor.java b/src/main/java/de/learnlib/ralib/smt/ReplacingValuesVisitor.java new file mode 100644 index 00000000..80ddaa76 --- /dev/null +++ b/src/main/java/de/learnlib/ralib/smt/ReplacingValuesVisitor.java @@ -0,0 +1,31 @@ +package de.learnlib.ralib.smt; + +import de.learnlib.ralib.data.*; +import gov.nasa.jpf.constraints.api.Expression; +import gov.nasa.jpf.constraints.api.Variable; +import gov.nasa.jpf.constraints.expressions.Constant; +import gov.nasa.jpf.constraints.util.DuplicatingVisitor; + +import java.util.HashMap; +import java.util.Map; + +public class ReplacingValuesVisitor extends + DuplicatingVisitor, ? extends Expression>> { + + @Override + public Expression visit(Constant v, Map, ? extends Expression> data) { + Expression newVar = data.get(v); + return (newVar != null) ? newVar.requireAs(v.getType()) : v; + } + + public Expression apply(Expression expr, Mapping, ? extends SDTGuardElement> rename) { + Map, Expression> map = new HashMap<>(); + rename.forEach((k, v) -> map.put( k, v.asExpression() )); + return visit(expr, map).requireAs(expr.getType()); + } + + public Expression apply(Expression expr, RegisterAssignment rename) { + Map, Expression> map = new HashMap<>(rename); + return visit(expr, map).requireAs(expr.getType()); + } +} diff --git a/src/main/java/de/learnlib/ralib/smt/SMTUtil.java b/src/main/java/de/learnlib/ralib/smt/SMTUtil.java index 718cfd28..a12c4f7b 100644 --- a/src/main/java/de/learnlib/ralib/smt/SMTUtil.java +++ b/src/main/java/de/learnlib/ralib/smt/SMTUtil.java @@ -2,10 +2,7 @@ import java.util.*; -import de.learnlib.ralib.data.DataValue; -import de.learnlib.ralib.data.Mapping; -import de.learnlib.ralib.data.SymbolicDataValue; -import de.learnlib.ralib.data.VarMapping; +import de.learnlib.ralib.data.*; import gov.nasa.jpf.constraints.api.Expression; import gov.nasa.jpf.constraints.api.Valuation; import gov.nasa.jpf.constraints.api.Variable; @@ -44,6 +41,13 @@ public static Expression renameVars(Expression expr, return replacer.apply(expr, relabelling); } + public static Expression renameVals(Expression expr, Bijection renaming) { + final ReplacingValuesVisitor replacer = new ReplacingValuesVisitor(); + Mapping map = new Mapping<>(); + map.putAll(renaming); + return replacer.apply(expr, map); + } + public static Expression toExpression(Expression expr, Mapping val) { Map map = new HashMap<>(); //Expression guardExpr = toExpression(expr, map); diff --git a/src/main/java/de/learnlib/ralib/theory/IntervalGuardUtil.java b/src/main/java/de/learnlib/ralib/theory/IntervalGuardUtil.java index 21e1ac7b..e48df548 100644 --- a/src/main/java/de/learnlib/ralib/theory/IntervalGuardUtil.java +++ b/src/main/java/de/learnlib/ralib/theory/IntervalGuardUtil.java @@ -21,6 +21,7 @@ import java.util.LinkedHashSet; import java.util.Set; +import de.learnlib.ralib.data.SDTGuardElement; import de.learnlib.ralib.data.SymbolicDataValue; /** @@ -32,7 +33,7 @@ final public class IntervalGuardUtil { // FIXME: g method should have a better name public static SDTGuard.EqualityGuard toEqGuard(SDTGuard.IntervalGuard g) { assert !g.isIntervalGuard(); - SymbolicDataValue r = null; + SDTGuardElement r = null; if (g.isSmallerGuard()) { r = g.rightLimit(); } @@ -45,7 +46,7 @@ public static SDTGuard.EqualityGuard toEqGuard(SDTGuard.IntervalGuard g) { // FIXME: g method should have a better name public SDTGuard.DisequalityGuard toDeqGuard(SDTGuard.IntervalGuard g) { assert !g.isIntervalGuard(); - SymbolicDataValue r = null; + SDTGuardElement r = null; if (g.isSmallerGuard()) { r = g.rightLimit(); } @@ -64,7 +65,7 @@ public static SDTGuard.IntervalGuard flip(SDTGuard.IntervalGuard g) { // merge bigger with something private static Set bMergeIntervals(SDTGuard.IntervalGuard g, SDTGuard.IntervalGuard other) { Set guards = new LinkedHashSet<>(); - SymbolicDataValue l = g.leftLimit(); + SDTGuardElement l = g.leftLimit(); if (other.isBiggerGuard()) { // System.out.println("other " + other + " is bigger"); guards.add(g); @@ -101,7 +102,7 @@ private static Set bMergeIntervals(SDTGuard.IntervalGuard g, SDTGuard. // merge smaller with something private static Set sMergeIntervals(SDTGuard.IntervalGuard g, SDTGuard.IntervalGuard other) { Set guards = new LinkedHashSet<>(); - SymbolicDataValue r = g.rightLimit(); + SDTGuardElement r = g.rightLimit(); if (other.isBiggerGuard()) { return bMergeIntervals(other, g); } else if (other.isSmallerGuard()) { @@ -124,15 +125,15 @@ private static Set sMergeIntervals(SDTGuard.IntervalGuard g, SDTGuard. // merge interval with something private static Set iMergeIntervals(SDTGuard.IntervalGuard g, SDTGuard.IntervalGuard other) { Set guards = new LinkedHashSet<>(); - SymbolicDataValue l = g.leftLimit(); - SymbolicDataValue r = g.rightLimit(); + SDTGuardElement l = g.leftLimit(); + SDTGuardElement r = g.rightLimit(); if (other.isBiggerGuard()) { return bMergeIntervals(other, g); } else if (other.isSmallerGuard()) { return sMergeIntervals(other, g); } else { - SymbolicDataValue oL = other.leftLimit(); - SymbolicDataValue oR = other.rightLimit(); + SDTGuardElement oL = other.leftLimit(); + SDTGuardElement oR = other.rightLimit(); if (l.equals(oR)) { if (r.equals(oL)) { guards.add(new SDTGuard.DisequalityGuard(g.parameter(), l)); diff --git a/src/main/java/de/learnlib/ralib/theory/Memorables.java b/src/main/java/de/learnlib/ralib/theory/Memorables.java new file mode 100644 index 00000000..e999e6de --- /dev/null +++ b/src/main/java/de/learnlib/ralib/theory/Memorables.java @@ -0,0 +1,58 @@ +package de.learnlib.ralib.theory; + +import de.learnlib.ralib.data.DataType; +import de.learnlib.ralib.data.DataValue; +import de.learnlib.ralib.data.RegisterAssignment; +import de.learnlib.ralib.data.SDTRelabeling; +import de.learnlib.ralib.data.util.SymbolicDataValueGenerator; + +import java.util.Arrays; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +public class Memorables { + + public static List relabel(List values, SDTRelabeling relabeling) { + List result = values.stream() + .map(relabeling::get) + .map( d -> (DataValue) d) + .toList(); + + assert result.size() == values.size(); + return result; + } + + public static Map typedSize(List values) { + Map ret = new LinkedHashMap<>(); + values.forEach(v -> { + Integer i = ret.get(v.getDataType()); + i = (i == null) ? 1 : i+1; + ret.put(v.getDataType(), i); + }); + return ret; + } + + // TODO: duplicates code from MappedPrefix + public static List memorableValues(SDT ... sdts) { + return Arrays.stream(sdts) + .flatMap(sdt -> sdt.getDataValues().stream()) + .distinct() + .sorted() + .toList(); + } + + // TODO: duplicates code from MappedPrefix + public static RegisterAssignment getAssignment(SDT ... sdts) { + RegisterAssignment ra = new RegisterAssignment(); + SymbolicDataValueGenerator.RegisterGenerator regGen = + new SymbolicDataValueGenerator.RegisterGenerator(); + + memorableValues(sdts).forEach( + dv -> ra.put(dv, regGen.next(dv.getDataType())) + ); + + return ra; + } + +} diff --git a/src/main/java/de/learnlib/ralib/theory/SDT.java b/src/main/java/de/learnlib/ralib/theory/SDT.java index 2a4448e1..e47e3aba 100644 --- a/src/main/java/de/learnlib/ralib/theory/SDT.java +++ b/src/main/java/de/learnlib/ralib/theory/SDT.java @@ -16,27 +16,20 @@ */ package de.learnlib.ralib.theory; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.LinkedHashMap; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.Map.Entry; -import java.util.Set; -import de.learnlib.ralib.data.Bijection; -import de.learnlib.ralib.data.Constants; -import de.learnlib.ralib.data.DataValue; -import de.learnlib.ralib.data.Mapping; -import de.learnlib.ralib.data.SymbolicDataValue; +import de.learnlib.ralib.data.*; import de.learnlib.ralib.data.SymbolicDataValue.Register; -import de.learnlib.ralib.data.VarMapping; import de.learnlib.ralib.data.util.RemappingIterator; +import de.learnlib.ralib.data.util.SymbolicDataValueGenerator; import de.learnlib.ralib.smt.ConstraintSolver; import de.learnlib.ralib.smt.SMTUtil; +import de.learnlib.ralib.words.DataWords; +import de.learnlib.ralib.words.PSymbolInstance; import gov.nasa.jpf.constraints.api.Expression; import gov.nasa.jpf.constraints.util.ExpressionUtil; +import net.automatalib.word.Word; /** * Implementation of Symbolic Decision Trees. @@ -56,14 +49,35 @@ public SDT(Map children) { * * @return */ + // fixme: SDTs cannot have registers anymore, this should probably be data values! public Set getRegisters() { - Set registers = new LinkedHashSet<>(); - this.getVariables().stream().filter((x) -> (x.isRegister())).forEach((x) -> { - registers.add((Register) x); + Set temp = new LinkedHashSet<>(); + this.getVariables().stream().filter(SDTGuardElement::isDataValue).forEach((x) -> { + temp.add((DataValue) x); }); + + DataValue[] prefixValue = temp.toArray(new DataValue[] {}); + Arrays.sort(prefixValue); + + Set registers = new LinkedHashSet<>(); + SymbolicDataValueGenerator.RegisterGenerator regGen = + new SymbolicDataValueGenerator.RegisterGenerator(); + for (DataValue dv : prefixValue) { + registers.add(regGen.next(dv.getDataType())); + } + return registers; } + public List getDataValues() { + return getVariables().stream() + .filter(SDTGuardElement::isDataValue) + .map( d -> (DataValue) d ) + .distinct() + .sorted() + .toList(); + } + public int getHeight() { if (this instanceof SDTLeaf || children.size() == 0) { return 0; @@ -72,15 +86,15 @@ public int getHeight() { } } - public Set getVariables() { - Set variables = new LinkedHashSet<>(); + public Set getVariables() { + Set variables = new LinkedHashSet<>(); for (Entry e : children.entrySet()) { SDTGuard g = e.getKey(); if (g instanceof SDTGuard.EqualityGuard eg) { - SymbolicDataValue r = eg.register(); + SDTGuardElement r = eg.register(); variables.add(r); } else if (g instanceof SDTGuard.DisequalityGuard dg) { - SymbolicDataValue r = dg.register(); + SDTGuardElement r = dg.register(); variables.add(r); } else if (g instanceof SDTGuard.SDTAndGuard ag) { for (SDTGuard ifG : ag.conjuncts()) { @@ -135,7 +149,16 @@ public Map getChildren() { } public boolean isEquivalent( - SDT other, VarMapping renaming) { + SDT other, Bijection renaming) { + SDT otherSDT = other; + + SDTRelabeling relabelling = new SDTRelabeling(); + relabelling.putAll(renaming); + return isEquivalent(otherSDT, relabelling); + } + + public boolean isEquivalent( + SDT other, SDTRelabeling renaming) { if (other instanceof SDTLeaf) { return false; } @@ -154,7 +177,7 @@ public boolean isEquivalentUnder( } return false; } - VarMapping eqRenaming = new VarMapping<>(); + SDTRelabeling eqRenaming = new SDTRelabeling(); for (SDTGuard.EqualityGuard d : ds) { eqRenaming.put(d.parameter(), d.register()); } @@ -165,14 +188,14 @@ public boolean isEquivalentUnder( } public SDT relabelUnderEq(List ds) { - VarMapping eqRenaming = new VarMapping<>(); + SDTRelabeling eqRenaming = new SDTRelabeling(); for (SDTGuard.EqualityGuard d : ds) { eqRenaming.put(d.parameter(), d.register()); } return this.relabel(eqRenaming); } - public SDT relabel(VarMapping relabelling) { + public SDT relabel(SDTRelabeling relabelling) { //System.out.println("relabeling " + relabelling); SDT thisSdt = this; if (relabelling.isEmpty()) { @@ -329,19 +352,11 @@ public Expression getAcceptingPaths(Constants consts) { if (paths.isEmpty()) { return ExpressionUtil.FALSE; } - Expression dis = null; - for (List list : paths) { - List> expr = new ArrayList<>(); - for (SDTGuard g : list) { - expr.add(SDTGuard.toExpr(g)); - } - Expression con = ExpressionUtil.and( - expr.toArray(new Expression[] {})); - - dis = (dis == null) ? con : ExpressionUtil.or(dis, con); - } - - return dis; + return ExpressionUtil.or( + paths.stream().map(p -> ExpressionUtil.and(p.stream() + .map(SDTGuard::toExpr) + .toArray(Expression[]::new))) + .toArray(Expression[]::new)); } public Map, Boolean> getGuardExpressions(Constants consts) { @@ -438,10 +453,10 @@ public SDT copy() { * Returns true if other is semantically equivalent to this */ public boolean isEquivalent(SDT other, ConstraintSolver solver) { - Set registers = getRegisters(); - Set otherRegisters = other.getRegisters(); + List registers = getDataValues(); + List otherRegisters = other.getDataValues(); if (registers.size() != otherRegisters.size() || - !registers.containsAll(otherRegisters)) { + !new HashSet<>(registers).containsAll(otherRegisters)) { return false; } @@ -473,29 +488,29 @@ public boolean isEquivalent(SDT other, ConstraintSolver solver) { * @param solver * @return */ - public static Bijection equivalentUnderBijection(SDT sdt1, SDT sdt2, Bijection bi, ConstraintSolver solver) { - sdt1 = sdt1.relabel(bi.toVarMapping()); - Set regs1 = sdt1.getRegisters(); - Set regs2 = sdt2.getRegisters(); + public static Bijection equivalentUnderBijection(SDT sdt1, SDT sdt2, Bijection bi, ConstraintSolver solver) { + sdt1 = sdt1.relabel(SDTRelabeling.fromBijection(bi)); + List regs1 = sdt1.getDataValues(); + List regs2 = sdt2.getDataValues(); if (regs1.size() != regs2.size()) { return null; } - if (regs1.containsAll(regs2)) { + if (new HashSet<>(regs1).containsAll(regs2)) { return sdt1.isEquivalent(sdt2, solver) ? bi : null; } - Set replace = new LinkedHashSet<>(regs1); + Set replace = new LinkedHashSet<>(regs1); replace.removeAll(bi.values()); - Set by = new LinkedHashSet<>(regs2); + Set by = new LinkedHashSet<>(regs2); by.removeAll(bi.values()); - RemappingIterator it = new RemappingIterator(replace, by); + RemappingIterator it = new RemappingIterator<>(replace, by); while (it.hasNext()) { - Bijection vars = it.next(); - if (sdt2.isEquivalent(sdt1.relabel(vars.toVarMapping()), solver)) { - Bijection b = new Bijection(); + Bijection vars = it.next(); + if (sdt2.isEquivalent(sdt1.relabel(SDTRelabeling.fromBijection(vars)), solver)) { + Bijection b = new Bijection<>(); b.putAll(bi); b.putAll(vars); return b; @@ -513,8 +528,8 @@ public static Bijection equivalentUnderBijection(SDT sdt1, SDT sdt2, Bijection b * @param solver * @return */ - public static Bijection equivalentUnderBijection(SDT sdt1, SDT sdt2, ConstraintSolver solver) { - return equivalentUnderBijection(sdt1, sdt2, new Bijection(), solver); + public static Bijection equivalentUnderBijection(SDT sdt1, SDT sdt2, ConstraintSolver solver) { + return equivalentUnderBijection(sdt1, sdt2, new Bijection<>(), solver); } /** diff --git a/src/main/java/de/learnlib/ralib/theory/SDTGuard.java b/src/main/java/de/learnlib/ralib/theory/SDTGuard.java index 1a9eda7a..c8c61b6b 100644 --- a/src/main/java/de/learnlib/ralib/theory/SDTGuard.java +++ b/src/main/java/de/learnlib/ralib/theory/SDTGuard.java @@ -18,6 +18,8 @@ import java.util.*; +import de.learnlib.ralib.data.SDTGuardElement; +import de.learnlib.ralib.data.SDTRelabeling; import de.learnlib.ralib.data.SymbolicDataValue; import de.learnlib.ralib.data.SymbolicDataValue.SuffixValue; import de.learnlib.ralib.data.VarMapping; @@ -42,10 +44,10 @@ public String toString() { public SuffixValue getParameter() {return this.parameter; } @Override - public Set getRegisters() { return Set.of(); } + public Set getRegisters() { return Set.of(); } } - record EqualityGuard(SymbolicDataValue.SuffixValue parameter, SymbolicDataValue register) implements SDTGuard { + record EqualityGuard(SymbolicDataValue.SuffixValue parameter, SDTGuardElement register) implements SDTGuard { @Override public String toString() { return "(" + parameter + "=" + register + ")"; @@ -55,10 +57,10 @@ public String toString() { public SuffixValue getParameter() {return this.parameter; } @Override - public Set getRegisters() { return Set.of(register); } + public Set getRegisters() { return Set.of(register); } } - record DisequalityGuard(SymbolicDataValue.SuffixValue parameter, SymbolicDataValue register) implements SDTGuard { + record DisequalityGuard(SymbolicDataValue.SuffixValue parameter, SDTGuardElement register) implements SDTGuard { @Override public String toString() { return "(" + parameter + "!=" +register + ")"; @@ -68,10 +70,10 @@ public String toString() { public SuffixValue getParameter() {return this.parameter; } @Override - public Set getRegisters() { return Set.of(register); } + public Set getRegisters() { return Set.of(register); } } - record IntervalGuard(SymbolicDataValue.SuffixValue parameter, SymbolicDataValue leftLimit, SymbolicDataValue rightLimit) implements SDTGuard { + record IntervalGuard(SymbolicDataValue.SuffixValue parameter, SDTGuardElement leftLimit, SDTGuardElement rightLimit) implements SDTGuard { @Override public String toString() { // TODO: align second case and make one statement @@ -84,8 +86,8 @@ public String toString() { public SuffixValue getParameter() {return this.parameter; } @Override - public Set getRegisters() { - Set regs = new LinkedHashSet<>(); + public Set getRegisters() { + Set regs = new LinkedHashSet<>(); if (leftLimit != null) regs.add(leftLimit); if (rightLimit != null) regs.add(rightLimit); return regs; @@ -116,8 +118,8 @@ public String toString() { public SuffixValue getParameter() {return this.parameter; } @Override - public Set getRegisters() { - Set ret = new HashSet<>(); + public Set getRegisters() { + Set ret = new HashSet<>(); conjuncts.stream().forEach( x -> ret.addAll(x.getRegisters() )); return ret; } @@ -153,8 +155,8 @@ public String toString() { public SuffixValue getParameter() {return this.parameter; } @Override - public Set getRegisters() { - Set ret = new HashSet<>(); + public Set getRegisters() { + Set ret = new HashSet<>(); disjuncts.stream().forEach( x -> ret.addAll(x.getRegisters() )); return ret; } @@ -183,10 +185,10 @@ public int hashCode() { SuffixValue getParameter(); - Set getRegisters(); + Set getRegisters(); - static Set getComparands(SDTGuard in, SymbolicDataValue dv) { - Set comparands = new LinkedHashSet<>(); + static Set getComparands(SDTGuard in, SDTGuardElement dv) { + Set comparands = new LinkedHashSet<>(); switch (in) { case SDTGuard.EqualityGuard g: if (g.parameter.equals(dv)) comparands.add(g.register); @@ -236,13 +238,13 @@ static SDTGuard copy(SDTGuard in) { } } - private static T newValueIfExists(VarMapping relabelling, T oldValue) { - if (oldValue == null || oldValue.isConstant()) return oldValue; + private static T newValueIfExists(SDTRelabeling relabelling, T oldValue) { + if (oldValue == null || SDTGuardElement.isConstant(oldValue)) return oldValue; T newValue = (T) relabelling.get(oldValue); return newValue != null ? newValue : oldValue; } - static SDTGuard relabel(SDTGuard in, VarMapping remap) { + static SDTGuard relabel(SDTGuard in, SDTRelabeling remap) { switch (in) { case SDTGuard.EqualityGuard g: return new SDTGuard.EqualityGuard(newValueIfExists(remap, g.parameter), @@ -269,14 +271,14 @@ static SDTGuard relabel(SDTGuard in, VarMapping remap) { static Expression toExpr(SDTGuard in) { switch (in) { case SDTGuard.EqualityGuard g: - return new NumericBooleanExpression(g.register, NumericComparator.EQ, g.parameter); + return new NumericBooleanExpression(g.register.asExpression(), NumericComparator.EQ, g.parameter); case SDTGuard.DisequalityGuard g: - return new NumericBooleanExpression(g.register, NumericComparator.NE, g.parameter); + return new NumericBooleanExpression(g.register.asExpression(), NumericComparator.NE, g.parameter); case SDTGuard.IntervalGuard g: - if (g.leftLimit == null) return new NumericBooleanExpression(g.parameter, NumericComparator.LT, g.rightLimit); - if (g.rightLimit == null) return new NumericBooleanExpression(g.parameter, NumericComparator.GT, g.leftLimit); - Expression smaller = new NumericBooleanExpression(g.parameter, NumericComparator.LT, g.rightLimit); - Expression bigger = new NumericBooleanExpression(g.parameter, NumericComparator.GT, g.leftLimit); + if (g.leftLimit == null) return new NumericBooleanExpression(g.parameter, NumericComparator.LT, g.rightLimit.asExpression()); + if (g.rightLimit == null) return new NumericBooleanExpression(g.parameter, NumericComparator.GT, g.leftLimit.asExpression()); + Expression smaller = new NumericBooleanExpression(g.parameter, NumericComparator.LT, g.rightLimit.asExpression()); + Expression bigger = new NumericBooleanExpression(g.parameter, NumericComparator.GT, g.leftLimit.asExpression()); return ExpressionUtil.and(smaller, bigger); case SDTGuard.SDTAndGuard g: List> andList = g.conjuncts.stream().map( x -> toExpr(x)).toList(); @@ -304,7 +306,7 @@ static SDTGuard toDeqGuard(SDTGuard in) { case SDTGuard.IntervalGuard g: // FIXME: copied from old implementation but does not seem to make sense assert !g.isIntervalGuard(); - SymbolicDataValue r = g.isSmallerGuard() ? g.rightLimit : g.leftLimit; + SDTGuardElement r = g.isSmallerGuard() ? g.rightLimit : g.leftLimit; return new DisequalityGuard(g.parameter,r); case SDTGuard.SDTAndGuard g: throw new RuntimeException("not refactored yet"); diff --git a/src/main/java/de/learnlib/ralib/theory/SDTLeaf.java b/src/main/java/de/learnlib/ralib/theory/SDTLeaf.java index 54763f2f..5cd367ad 100644 --- a/src/main/java/de/learnlib/ralib/theory/SDTLeaf.java +++ b/src/main/java/de/learnlib/ralib/theory/SDTLeaf.java @@ -23,6 +23,8 @@ import java.util.Map; import java.util.Set; +import de.learnlib.ralib.data.SDTGuardElement; +import de.learnlib.ralib.data.SDTRelabeling; import de.learnlib.ralib.data.SymbolicDataValue; import de.learnlib.ralib.data.VarMapping; @@ -46,7 +48,7 @@ protected SDTLeaf(boolean accepting) { @Override public boolean isEquivalent( - SDT other, VarMapping renaming) { + SDT other, SDTRelabeling renaming) { return (getClass() == other.getClass() && isAccepting() == other.isAccepting()); } @@ -57,7 +59,7 @@ public boolean canUse(SDT other) { return false; } else { - return this.isEquivalent(other, new VarMapping()); + return this.isEquivalent(other, new SDTRelabeling()); } } @@ -67,7 +69,7 @@ public String toString() { } @Override - public SDT relabel(VarMapping relabeling) { + public SDT relabel(SDTRelabeling relabeling) { return this; } @@ -111,4 +113,9 @@ public Set getRegisters() { public SDT copy() { return new SDTLeaf(accepting); } + + @Override + public Set getVariables() { + return new LinkedHashSet<>(); + } } diff --git a/src/main/java/de/learnlib/ralib/theory/SuffixValueRestriction.java b/src/main/java/de/learnlib/ralib/theory/SuffixValueRestriction.java index 464a0e28..9db47c0e 100644 --- a/src/main/java/de/learnlib/ralib/theory/SuffixValueRestriction.java +++ b/src/main/java/de/learnlib/ralib/theory/SuffixValueRestriction.java @@ -4,10 +4,7 @@ import java.util.Objects; import java.util.Set; -import de.learnlib.ralib.data.Constants; -import de.learnlib.ralib.data.DataType; -import de.learnlib.ralib.data.DataValue; -import de.learnlib.ralib.data.SymbolicDataValue; +import de.learnlib.ralib.data.*; import de.learnlib.ralib.data.SymbolicDataValue.SuffixValue; import de.learnlib.ralib.theory.equality.EqualRestriction; import de.learnlib.ralib.words.DataWords; @@ -124,7 +121,7 @@ public static SuffixValueRestriction genericRestriction(SDTGuard guard, Map dv) - * @param piv memorable data values of the prefix (dv <-> itr) * @param constants * @param suffixValues map of already instantiated suffix * data values (sv -> dv) @@ -74,7 +70,6 @@ SDT treeQuery( Word prefix, SymbolicSuffix suffix, WordValuation values, - PIV piv, Constants constants, SuffixValuation suffixValues, SDTConstructor oracle); @@ -93,7 +88,6 @@ SDT treeQuery( * * @param prefix * @param ps - * @param piv * @param pval * @param constants * @param guard @@ -102,9 +96,9 @@ SDT treeQuery( * @return */ DataValue instantiate(Word prefix, - ParameterizedSymbol ps, PIV piv, ParameterValuation pval, + ParameterizedSymbol ps, SuffixValuation pval, Constants constants, - SDTGuard guard, Parameter param, Set oldDvs); + SDTGuard guard, SuffixValue param, Set oldDvs); SuffixValueRestriction restrictSuffixValue(SuffixValue suffixValue, Word prefix, Word suffix, Constants consts); diff --git a/src/main/java/de/learnlib/ralib/theory/equality/EqualityTheory.java b/src/main/java/de/learnlib/ralib/theory/equality/EqualityTheory.java index 466ef6e0..1fbe1f7c 100644 --- a/src/main/java/de/learnlib/ralib/theory/equality/EqualityTheory.java +++ b/src/main/java/de/learnlib/ralib/theory/equality/EqualityTheory.java @@ -28,22 +28,14 @@ import java.util.Map; import java.util.Set; +import de.learnlib.ralib.data.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import de.learnlib.ralib.data.Constants; -import de.learnlib.ralib.data.DataType; -import de.learnlib.ralib.data.DataValue; -import de.learnlib.ralib.data.FreshValue; -import de.learnlib.ralib.data.PIV; -import de.learnlib.ralib.data.ParameterValuation; -import de.learnlib.ralib.data.SuffixValuation; -import de.learnlib.ralib.data.SymbolicDataValue; import de.learnlib.ralib.data.SymbolicDataValue.Constant; import de.learnlib.ralib.data.SymbolicDataValue.Parameter; import de.learnlib.ralib.data.SymbolicDataValue.Register; import de.learnlib.ralib.data.SymbolicDataValue.SuffixValue; -import de.learnlib.ralib.data.WordValuation; import de.learnlib.ralib.learning.SymbolicSuffix; import de.learnlib.ralib.oracles.io.IOOracle; import de.learnlib.ralib.oracles.mto.SDTConstructor; @@ -129,13 +121,14 @@ private Map mergeGuards(Map eqs, SDT // given a set of registers and a set of guards, keep only the registers // that are mentioned in any guard + /* private PIV keepMem(Map guardMap) { PIV ret = new PIV(); for (Map.Entry e : guardMap.entrySet()) { SDTGuard mg = e.getKey(); if (mg instanceof SDTGuard.EqualityGuard eg) { LOGGER.trace(mg.toString()); - SymbolicDataValue r = eg.register(); + SDTGuardElement r = eg.register(); // FIXME: why create new parameter? Parameter p = new Parameter(r.getDataType(), r.getId()); if (r instanceof Register) { @@ -145,10 +138,11 @@ private PIV keepMem(Map guardMap) { } return ret; } + */ // process a tree query @Override - public SDT treeQuery(Word prefix, SymbolicSuffix suffix, WordValuation values, PIV pir, + public SDT treeQuery(Word prefix, SymbolicSuffix suffix, WordValuation values, Constants constants, SuffixValuation suffixValues, SDTConstructor oracle) { int pId = values.size() + 1; @@ -199,7 +193,7 @@ public SDT treeQuery(Word prefix, SymbolicSuffix suffix, WordVa SuffixValuation trueSuffixValues = new SuffixValuation(); trueSuffixValues.putAll(suffixValues); trueSuffixValues.put(currentParam, d); - SDT sdt = oracle.treeQuery(prefix, suffix, trueValues, pir, constants, trueSuffixValues); + SDT sdt = oracle.treeQuery(prefix, suffix, trueValues, constants, trueSuffixValues); LOGGER.trace(" single deq SDT : " + sdt.toString()); @@ -207,7 +201,6 @@ public SDT treeQuery(Word prefix, SymbolicSuffix suffix, WordVa LOGGER.trace("temporary guards = " + tempKids.keySet()); LOGGER.trace("merged guards = " + merged.keySet()); - LOGGER.trace("merged pivs = " + pir.toString()); return new SDT(merged); } @@ -248,7 +241,7 @@ public SDT treeQuery(Word prefix, SymbolicSuffix suffix, WordVa WordValuation ifValues = new WordValuation(); ifValues.putAll(values); ifValues.put(pId, newDv); - SDT eqOracleSdt = oracle.treeQuery(prefix, suffix, ifValues, pir, constants, ifSuffixValues); + SDT eqOracleSdt = oracle.treeQuery(prefix, suffix, ifValues, constants, ifSuffixValues); tempKids.put(eqGuard, eqOracleSdt); } @@ -268,7 +261,7 @@ public SDT treeQuery(Word prefix, SymbolicSuffix suffix, WordVa elseSuffixValues.putAll(suffixValues); elseSuffixValues.put(currentParam, fresh); - SDT elseOracleSdt = oracle.treeQuery(prefix, suffix, elseValues, pir, constants, elseSuffixValues); + SDT elseOracleSdt = oracle.treeQuery(prefix, suffix, elseValues, constants, elseSuffixValues); SDTGuard.SDTAndGuard deqGuard = new SDTGuard.SDTAndGuard(currentParam, diseqList); LOGGER.trace("diseq guard = " + deqGuard); @@ -287,11 +280,10 @@ public SDT treeQuery(Word prefix, SymbolicSuffix suffix, WordVa } // only keep registers that are referenced by the merged guards - pir.putAll(keepMem(merged)); + //pir.putAll(keepMem(merged)); LOGGER.trace("temporary guards = " + tempKids.keySet()); LOGGER.trace("merged guards = " + merged.keySet()); - LOGGER.trace("merged pivs = " + pir); // clear the temporary map of children tempKids.clear(); @@ -321,7 +313,7 @@ private SDTGuard.EqualityGuard pickupDataValue(DataValue newDv, List Register newDv_r = new Register(type, newDv_i); LOGGER.trace("current param = " + currentParam); LOGGER.trace("New register = " + newDv_r); - return new SDTGuard.EqualityGuard(currentParam, newDv_r); + return new SDTGuard.EqualityGuard(currentParam, newDv); } // if the data value isn't in the prefix, // it is somewhere earlier in the suffix @@ -334,8 +326,8 @@ private SDTGuard.EqualityGuard pickupDataValue(DataValue newDv, List @Override // instantiate a parameter with a data value - public DataValue instantiate(Word prefix, ParameterizedSymbol ps, PIV piv, ParameterValuation pval, - Constants constants, SDTGuard guard, Parameter param, Set oldDvs) { + public DataValue instantiate(Word prefix, ParameterizedSymbol ps, SuffixValuation pval, + Constants constants, SDTGuard guard, SuffixValue param, Set oldDvs) { List prefixValues = Arrays.asList(DataWords.valsOf(prefix)); LOGGER.trace("prefix values : " + prefixValues); @@ -347,23 +339,22 @@ public DataValue instantiate(Word prefix, ParameterizedSymbol p SDTGuard current = guards.remove(); if (current instanceof SDTGuard.EqualityGuard eqGuard) { LOGGER.trace("equality guard " + current); - SymbolicDataValue ereg = eqGuard.register(); - if (ereg.isRegister()) { - LOGGER.trace("piv: " + piv.toString() - + " " + ereg + " " + param); - Parameter p = piv.getOneKey((Register) ereg); + SDTGuardElement ereg = eqGuard.register(); + if (SDTGuardElement.isDataValue(ereg)) { + + Parameter p = new Parameter(ereg.getDataType(), prefixValues.indexOf( (DataValue) ereg)+1); LOGGER.trace("p: " + p.toString()); int idx = p.getId(); return prefixValues.get(idx - 1); - } else if (ereg.isSuffixValue()) { - Parameter p = new Parameter(type, ereg.getId()); - return pval.get(p); - } else if (ereg.isConstant()) { + } else if (SDTGuardElement.isSuffixValue(ereg)) { + return pval.get( (SuffixValue) ereg); + } else if (SDTGuardElement.isConstant(ereg)) { return constants.get((Constant) ereg); } } else if (current instanceof SDTGuard.SDTAndGuard) { guards.addAll(((SDTGuard.SDTAndGuard) current).conjuncts()); } + // todo: this only works under the assumption that disjunctions only contain disequality guards } Collection potSet = DataWords.joinValsToSet(constants.values(type), DataWords.valSet(prefix, type), diff --git a/src/main/java/de/learnlib/ralib/theory/equality/UniqueEqualityTheory.java b/src/main/java/de/learnlib/ralib/theory/equality/UniqueEqualityTheory.java index b91a3795..21fadbce 100644 --- a/src/main/java/de/learnlib/ralib/theory/equality/UniqueEqualityTheory.java +++ b/src/main/java/de/learnlib/ralib/theory/equality/UniqueEqualityTheory.java @@ -46,7 +46,7 @@ public List getPotential(List vals) { } @Override - public SDT treeQuery(Word prefix, SymbolicSuffix suffix, WordValuation values, PIV pir, + public SDT treeQuery(Word prefix, SymbolicSuffix suffix, WordValuation values, Constants constants, SuffixValuation suffixValues, SDTConstructor oracle) { int pId = values.size() + 1; @@ -70,7 +70,7 @@ public SDT treeQuery(Word prefix, SymbolicSuffix suffix, WordVa SuffixValuation trueSuffixValues = new SuffixValuation(); trueSuffixValues.putAll(suffixValues); trueSuffixValues.put(sv, d); - sdt = oracle.treeQuery(prefix, suffix, trueValues, pir, constants, trueSuffixValues); + sdt = oracle.treeQuery(prefix, suffix, trueValues, constants, trueSuffixValues); LOGGER.trace(Category.QUERY, " single deq SDT : {}", sdt.toString()); merged.put(new SDTGuard.SDTTrueGuard(sv), sdt); @@ -81,8 +81,8 @@ public SDT treeQuery(Word prefix, SymbolicSuffix suffix, WordVa @Override // instantiate a parameter with a data value - public DataValue instantiate(Word prefix, ParameterizedSymbol ps, PIV piv, ParameterValuation pval, - Constants constants, SDTGuard guard, SymbolicDataValue.Parameter param, Set oldDvs) { + public DataValue instantiate(Word prefix, ParameterizedSymbol ps, SuffixValuation pval, + Constants constants, SDTGuard guard, SymbolicDataValue.SuffixValue param, Set oldDvs) { List prefixValues = Arrays.asList(DataWords.valsOf(prefix)); LOGGER.trace(Category.QUERY, "prefix values : {}", prefixValues); diff --git a/src/main/java/de/learnlib/ralib/theory/inequality/InequalityTheoryWithEq.java b/src/main/java/de/learnlib/ralib/theory/inequality/InequalityTheoryWithEq.java index 8ce7d4b8..3fcf0337 100644 --- a/src/main/java/de/learnlib/ralib/theory/inequality/InequalityTheoryWithEq.java +++ b/src/main/java/de/learnlib/ralib/theory/inequality/InequalityTheoryWithEq.java @@ -16,6 +16,7 @@ */ package de.learnlib.ralib.theory.inequality; +import java.math.BigDecimal; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -26,17 +27,10 @@ import java.util.Map; import java.util.Set; -import de.learnlib.ralib.data.Constants; -import de.learnlib.ralib.data.DataType; -import de.learnlib.ralib.data.DataValue; -import de.learnlib.ralib.data.PIV; -import de.learnlib.ralib.data.ParameterValuation; -import de.learnlib.ralib.data.SuffixValuation; -import de.learnlib.ralib.data.SymbolicDataValue; +import de.learnlib.ralib.data.*; import de.learnlib.ralib.data.SymbolicDataValue.Parameter; import de.learnlib.ralib.data.SymbolicDataValue.Register; import de.learnlib.ralib.data.SymbolicDataValue.SuffixValue; -import de.learnlib.ralib.data.WordValuation; import de.learnlib.ralib.learning.SymbolicSuffix; import de.learnlib.ralib.oracles.mto.SDTConstructor; import de.learnlib.ralib.theory.*; @@ -46,6 +40,7 @@ import de.learnlib.ralib.words.PSymbolInstance; import de.learnlib.ralib.words.ParameterizedSymbol; import gov.nasa.jpf.constraints.api.Valuation; +import gov.nasa.jpf.constraints.api.Variable; import net.automatalib.word.Word; /** @@ -498,21 +493,21 @@ private SDT getJoinedSDT(SDTGuard.EqualityGuard guard, SDT deqSDT, SDT eqSDT) { //System.out.println("-----------------------------------\n" + partitionedMap + "\n-----------------------PARTITIONING-------------------\n" + retMap + "\n---------------------------------"); return retMap; } - + /* private PIV keepMem(Map guardMap) { PIV ret = new PIV(); for (Map.Entry e : guardMap.entrySet()) { SDTGuard mg = e.getKey(); if (mg instanceof SDTGuard.EqualityGuard || mg instanceof SDTGuard.DisequalityGuard) { //LOGGER.trace(mg.toString()); - SymbolicDataValue r = mg.getRegisters().stream().iterator().next(); + SymbolicDataValue r = (SymbolicDataValue) mg.getRegisters().stream().iterator().next(); Parameter p = new Parameter(r.getDataType(), r.getId()); if (r instanceof Register) { ret.put(p, (Register) r); } } else if (mg instanceof SDTGuard.IntervalGuard iGuard) { if (!iGuard.isBiggerGuard()) { - SymbolicDataValue r = iGuard.rightLimit(); + SymbolicDataValue r = (SymbolicDataValue) iGuard.rightLimit(); Parameter p = new Parameter(r.getDataType(), r.getId()); if (r instanceof Register) { ret.put(p, (Register) r); @@ -520,14 +515,16 @@ private PIV keepMem(Map guardMap) { } if (!iGuard.isSmallerGuard()) { - SymbolicDataValue r = iGuard.leftLimit(); + SymbolicDataValue r = (SymbolicDataValue) iGuard.leftLimit(); Parameter p = new Parameter(r.getDataType(), r.getId()); if (r instanceof Register) { ret.put(p, (Register) r); } } } else if (mg instanceof SDTGuard.SDTOrGuard) { - Set rSet = ((SDTGuard.SDTOrGuard) mg).getRegisters(); + // FIXME: this is incorrect now + Set rSet = new LinkedHashSet<>(); + //((SDTGuard.SDTOrGuard) mg).getRegisters(); for (SymbolicDataValue r : rSet) { Parameter p = new Parameter(r.getDataType(), r.getId()); if (r instanceof Register) { @@ -540,13 +537,12 @@ private PIV keepMem(Map guardMap) { } return ret; } - + */ @Override public SDT treeQuery( Word prefix, SymbolicSuffix suffix, WordValuation values, - PIV piv, Constants constants, SuffixValuation suffixValues, SDTConstructor oracle) { @@ -587,7 +583,7 @@ public SDT treeQuery( elseSuffixValues.put(sv, fresh); SDT elseOracleSdt = oracle.treeQuery( - prefix, suffix, elseValues, piv, + prefix, suffix, elseValues, constants, elseSuffixValues); tempKids.put(new SDTGuard.SDTTrueGuard(currentParam), elseOracleSdt); } // process each '<' case @@ -604,17 +600,19 @@ public SDT treeQuery( Valuation smVal = new Valuation(); DataValue dvRight = potential.get(0); SDTGuard.IntervalGuard sguard = makeSmallerGuard( - dvRight, prefixValues, currentParam, smValues, piv); - SymbolicDataValue rsm = sguard.rightLimit(); + dvRight, prefixValues, currentParam, smValues); + SDTGuardElement rsm = sguard.rightLimit(); // System.out.println("setting valuation, symDV: " + rsm.toVariable() + " dvright: " + dvRight); - smVal.setValue(rsm, dvRight.getValue()); + if (SDTGuardElement.isSuffixValue(rsm) || SDTGuardElement.isConstant(rsm)) { + smVal.setValue( (Variable) rsm, dvRight.getValue()); + } DataValue smcv = instantiate( sguard, smVal, constants, potential); smValues.put(pId, smcv); smSuffixValues.put(sv, smcv); SDT smoracleSdt = oracle.treeQuery( - prefix, suffix, smValues, piv, constants, smSuffixValues); + prefix, suffix, smValues, constants, smSuffixValues); tempKids.put(sguard, smoracleSdt); @@ -628,17 +626,18 @@ public SDT treeQuery( DataValue dvLeft = potential.get(potSize - 1); SDTGuard.IntervalGuard bguard = makeBiggerGuard( - dvLeft, prefixValues, currentParam, bgValues, piv); - SymbolicDataValue rbg = bguard.leftLimit(); - - bgVal.setValue(rbg, dvLeft.getValue()); + dvLeft, prefixValues, currentParam, bgValues); + SDTGuardElement rbg = bguard.leftLimit(); + if (SDTGuardElement.isSuffixValue(rbg) || SDTGuardElement.isConstant(rbg)) { + bgVal.setValue( (SymbolicDataValue) rbg, dvLeft.getValue()); + } DataValue bgcv = instantiate( bguard, bgVal, constants, potential); bgValues.put(pId, bgcv); bgSuffixValues.put(sv, bgcv); SDT bgoracleSdt = oracle.treeQuery( - prefix, suffix, bgValues, piv, constants, bgSuffixValues); + prefix, suffix, bgValues, constants, bgSuffixValues); tempKids.put(bguard, bgoracleSdt); @@ -661,15 +660,20 @@ public SDT treeQuery( // dvMLeft, prefixValues, currentParam, // currentValues, piv); SDTGuard.IntervalGuard intervalGuard = makeIntervalGuard( - dvMLeft, dvMRight, prefixValues, currentParam, currentValues, piv); + dvMLeft, dvMRight, prefixValues, currentParam, currentValues); // IntervalGuard guard = new IntervalGuard( // currentParam, biggerGuard.getLeftReg(), smallerGuard.getRightReg()); - SymbolicDataValue rs = intervalGuard.rightLimit(); - SymbolicDataValue rb = intervalGuard.leftLimit(); - - val.setValue(rs, dvMRight.getValue()); - val.setValue(rb, dvMLeft.getValue()); + SDTGuardElement rs = intervalGuard.rightLimit(); + SDTGuardElement rb = intervalGuard.leftLimit(); + if (SDTGuardElement.isSuffixValue(rb) || SDTGuardElement.isConstant(rb)) { + val.setValue( (SymbolicDataValue) rb, dvMLeft.getValue()); + regPotential.add( (SymbolicDataValue) rb); + } + if (SDTGuardElement.isSuffixValue(rs) || SDTGuardElement.isConstant(rs)) { + val.setValue( (SymbolicDataValue) rs, dvMRight.getValue()); + regPotential.add( (SymbolicDataValue) rs); + } DataValue cv = instantiate( intervalGuard, val, constants, potential); @@ -677,12 +681,12 @@ public SDT treeQuery( currentSuffixValues.put(sv, cv); SDT oracleSdt = oracle.treeQuery( - prefix, suffix, currentValues, piv, + prefix, suffix, currentValues, constants, currentSuffixValues); tempKids.put(intervalGuard, oracleSdt); - regPotential.add(i - 1, rb); - regPotential.add(i, rs); + + } } // System.out.println("eq potential is: " + potential); @@ -703,7 +707,7 @@ public SDT treeQuery( ifValues.putAll(values); ifValues.put(pId, newDv); SDT eqOracleSdt = oracle.treeQuery( - prefix, suffix, ifValues, piv, constants, ifSuffixValues); + prefix, suffix, ifValues, constants, ifSuffixValues); tempKids.put(eqGuard, eqOracleSdt); } @@ -717,7 +721,7 @@ public SDT treeQuery( assert !merged.keySet().isEmpty(); // System.out.println("MERGED = " + merged); - piv.putAll(keepMem(merged)); + //piv.putAll(keepMem(merged)); // LOGGER.trace("temporary guards = " + tempKids.keySet()); // LOGGER.trace("merged guards = " + merged.keySet()); @@ -753,7 +757,7 @@ private SDTGuard.EqualityGuard pickupDataValue(DataValue newDv, // first index of the data value in the prefixvalues list newDv_i = prefixValues.indexOf(newDv) + 1; Register newDv_r = new Register(type, newDv_i); - return new SDTGuard.EqualityGuard(currentParam, newDv_r); + return new SDTGuard.EqualityGuard(currentParam, newDv); } // if the data value isn't in the prefix, it is somewhere earlier in the suffix else { @@ -764,20 +768,15 @@ private SDTGuard.EqualityGuard pickupDataValue(DataValue newDv, private SDTGuard.IntervalGuard makeSmallerGuard(DataValue smallerDv, List prefixValues, SuffixValue currentParam, - WordValuation ifValues, PIV pir) { + WordValuation ifValues) { DataType type = currentParam.getDataType(); int newDv_i; if (prefixValues.contains(smallerDv)) { newDv_i = prefixValues.indexOf(smallerDv) + 1; SymbolicDataValue.Parameter newDv_p = new SymbolicDataValue.Parameter(type, newDv_i); - Register newDv_r; - if (pir.containsKey(newDv_p)) { - newDv_r = pir.get(newDv_p); - } else { - newDv_r = new Register(type, newDv_i); - } - return new SDTGuard.IntervalGuard(currentParam, null, newDv_r); + + return new SDTGuard.IntervalGuard(currentParam, null, smallerDv); } // if the data value isn't in the prefix, it is somewhere earlier in the suffix else { @@ -791,28 +790,23 @@ private SDTGuard.IntervalGuard makeSmallerGuard(DataValue smallerDv, private SDTGuard.IntervalGuard makeIntervalGuard(DataValue biggerDv, DataValue smallerDv, List prefixValues, SuffixValue currentParam, - WordValuation ifValues, PIV pir) { - SDTGuard.IntervalGuard smallerGuard = makeSmallerGuard(smallerDv, prefixValues, currentParam, ifValues, pir); - SDTGuard.IntervalGuard biggerGuard = makeBiggerGuard(biggerDv, prefixValues, currentParam, ifValues, pir); + WordValuation ifValues) { + SDTGuard.IntervalGuard smallerGuard = makeSmallerGuard(smallerDv, prefixValues, currentParam, ifValues); + SDTGuard.IntervalGuard biggerGuard = makeBiggerGuard(biggerDv, prefixValues, currentParam, ifValues); return new SDTGuard.IntervalGuard(currentParam, biggerGuard.leftLimit(), smallerGuard.rightLimit()); } private SDTGuard.IntervalGuard makeBiggerGuard(DataValue biggerDv, List prefixValues, SuffixValue currentParam, - WordValuation ifValues, PIV pir) { + WordValuation ifValues) { DataType type = currentParam.getDataType(); int newDv_i; if (prefixValues.contains(biggerDv)) { newDv_i = prefixValues.indexOf(biggerDv) + 1; SymbolicDataValue.Parameter newDv_p = new SymbolicDataValue.Parameter(type, newDv_i); - Register newDv_r; - if (pir.containsKey(newDv_p)) { - newDv_r = pir.get(newDv_p); - } else { - newDv_r = new Register(type, newDv_i); - } - return new SDTGuard.IntervalGuard(currentParam, newDv_r, null); + + return new SDTGuard.IntervalGuard(currentParam, biggerDv, null); } // if the data value isn't in the prefix, it is somewhere earlier in the suffix else { @@ -825,19 +819,17 @@ private SDTGuard.IntervalGuard makeBiggerGuard(DataValue biggerDv, public abstract List getPotential(List vals); - private DataValue getRegisterValue(SymbolicDataValue r, PIV piv, + private DataValue getRegisterValue(SDTGuardElement r, List prefixValues, Constants constants, - ParameterValuation pval) { - if (r.isRegister()) { + SuffixValuation pval) { + if (SDTGuardElement.isDataValue(r)) { // LOGGER.trace("piv: " + piv + " " + r.toString() + " " + prefixValues); - Parameter p = piv.getOneKey((Register) r); // LOGGER.trace("p: " + p.toString()); - int idx = p.getId(); - return prefixValues.get(idx - 1); - } else if (r.isSuffixValue()) { - Parameter p = new Parameter(r.getDataType(), r.getId()); + return (DataValue) r; + } else if (SDTGuardElement.isSuffixValue(r)) { + Parameter p = new Parameter(r.getDataType(), ((SuffixValue)r).getId()); return pval.get(p); - } else if (r.isConstant()) { + } else if (SDTGuardElement.isConstant(r)) { return constants.get((SymbolicDataValue.Constant) r); } else { throw new IllegalStateException("this can't possibly happen"); @@ -850,11 +842,11 @@ public abstract DataValue instantiate(SDTGuard guard, Valuation val, @Override public DataValue instantiate( Word prefix, - ParameterizedSymbol ps, PIV piv, - ParameterValuation pval, + ParameterizedSymbol ps, + SuffixValuation pval, Constants constants, SDTGuard guard, - Parameter param, + SuffixValue param, Set oldDvs) { DataType type = param.getDataType(); @@ -864,17 +856,15 @@ public DataValue instantiate( // LOGGER.trace("prefix values : " + prefixValues.toString()); if (guard instanceof SDTGuard.EqualityGuard eqGuard) { - SymbolicDataValue ereg = eqGuard.register(); - if (ereg.isRegister()) { + SDTGuardElement ereg = eqGuard.register(); + if (SDTGuardElement.isDataValue(ereg)) { // LOGGER.trace("piv: " + piv.toString() + " " + ereg.toString() + " " + param.toString()); - Parameter p = piv.getOneKey((Register) ereg); // LOGGER.trace("p: " + p.toString()); - int idx = p.getId(); - returnThis = prefixValues.get(idx - 1); - } else if (ereg.isSuffixValue()) { - Parameter p = new Parameter(type, ereg.getId()); + returnThis = (DataValue) ereg; + } else if (SDTGuardElement.isSuffixValue(ereg)) { + Parameter p = new Parameter(type, ((SuffixValue)ereg).getId()); returnThis = pval.get(p); - } else if (ereg.isConstant()) { + } else if (SDTGuardElement.isConstant(ereg)) { returnThis = constants.get((SymbolicDataValue.Constant) ereg); } } else if (guard instanceof SDTGuard.SDTTrueGuard || guard instanceof SDTGuard.DisequalityGuard) { @@ -896,26 +886,25 @@ public DataValue instantiate( if (guard instanceof SDTGuard.IntervalGuard) { SDTGuard.IntervalGuard iGuard = (SDTGuard.IntervalGuard) guard; if (!iGuard.isBiggerGuard()) { - SymbolicDataValue r = iGuard.rightLimit(); - DataValue regVal = getRegisterValue(r, piv, - prefixValues, constants, pval); - - val.setValue(r, regVal.getValue()); + SDTGuardElement r = iGuard.rightLimit(); + if (SDTGuardElement.isSuffixValue(r) || SDTGuardElement.isConstant(r)) { + DataValue regVal = getRegisterValue(r, prefixValues, constants, pval); + val.setValue( (Variable) r, regVal.getValue()); + } } if (!iGuard.isSmallerGuard()) { - SymbolicDataValue l = iGuard.leftLimit(); - DataValue regVal = getRegisterValue(l, piv, - prefixValues, constants, pval); - - val.setValue(l, regVal.getValue()); + SDTGuardElement l = iGuard.leftLimit(); + if (SDTGuardElement.isSuffixValue(l) || SDTGuardElement.isConstant(l)) { + DataValue regVal = getRegisterValue(l, prefixValues, constants, pval); + val.setValue( (Variable) l, regVal.getValue()); + } } //instantiate(guard, val, param, constants); } else if (guard instanceof SDTGuard.EqualityGuard || guard instanceof SDTGuard.DisequalityGuard) { // FIXME: hacky way of getting register - SymbolicDataValue r = guard.getRegisters().stream().iterator().next(); - DataValue regVal = getRegisterValue(r, piv, - prefixValues, constants, pval); - val.setValue(r, regVal.getValue()); + SDTGuardElement r = guard.getRegisters().stream().iterator().next(); + DataValue regVal = getRegisterValue(r, prefixValues, constants, pval); + val.setValue( (Variable) r, regVal.getValue()); } else if (guard instanceof SDTGuard.SDTOrGuard) { SDTGuard iGuard = ((SDTGuard.SDTOrGuard) guard).disjuncts().get(0); @@ -924,8 +913,6 @@ public DataValue instantiate( assert ((SDTGuard.SDTAndGuard) guard).conjuncts().stream().allMatch(g -> g instanceof SDTGuard.DisequalityGuard); SDTGuard aGuard = ((SDTGuard.SDTAndGuard) guard).conjuncts().get(0); - - returnThis = instantiate(aGuard, val, constants, alreadyUsedValues); } else { throw new IllegalStateException("only =, != or interval allowed. Got " + guard); diff --git a/src/main/java/de/learnlib/ralib/tools/theories/DoubleInequalityTheory.java b/src/main/java/de/learnlib/ralib/tools/theories/DoubleInequalityTheory.java index ffb9ffff..afdb93d4 100644 --- a/src/main/java/de/learnlib/ralib/tools/theories/DoubleInequalityTheory.java +++ b/src/main/java/de/learnlib/ralib/tools/theories/DoubleInequalityTheory.java @@ -21,14 +21,12 @@ import java.math.BigDecimal; import java.util.*; +import de.learnlib.ralib.data.*; +import gov.nasa.jpf.constraints.api.Variable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import de.learnlib.logging.Category; -import de.learnlib.ralib.data.Constants; -import de.learnlib.ralib.data.DataType; -import de.learnlib.ralib.data.DataValue; -import de.learnlib.ralib.data.SymbolicDataValue; import de.learnlib.ralib.data.SymbolicDataValue.SuffixValue; import de.learnlib.ralib.oracles.io.IOOracle; import de.learnlib.ralib.theory.SDTGuard; @@ -100,7 +98,7 @@ private List> instantiateGuard(SDTGuard g, Valuation val) { List> eList = new ArrayList>(); if (g instanceof SDTGuard.EqualityGuard eualityGuard) { // pick up the register - SymbolicDataValue si = eualityGuard.register(); + SymbolicDataValue si = (SymbolicDataValue) eualityGuard.register(); // get the register value from the valuation DataValue sdi = new DataValue(type, val.getValue(si)); // add the register value as a constant @@ -110,7 +108,7 @@ private List> instantiateGuard(SDTGuard g, Valuation val) { } else if (g instanceof SDTGuard.DisequalityGuard disequalityGuard) { // pick up the register - SymbolicDataValue si = disequalityGuard.register(); + SymbolicDataValue si = (SymbolicDataValue) disequalityGuard.register(); // get the register value from the valuation DataValue sdi = new DataValue(type, val.getValue(si)); // add the register value as a constant @@ -121,21 +119,23 @@ private List> instantiateGuard(SDTGuard g, Valuation val) { } else if (g instanceof SDTGuard.IntervalGuard iGuard) { if (!iGuard.isBiggerGuard()) { - SymbolicDataValue r = iGuard.rightLimit(); + SDTGuardElement r = iGuard.rightLimit(); assert r != null; - DataValue ri = new DataValue(type, val.getValue(r)); + DataValue ri = (r instanceof DataValue) ? (DataValue) r : + new DataValue(type, (BigDecimal) val.getValue( (Variable) r)); gov.nasa.jpf.constraints.expressions.Constant wm = new gov.nasa.jpf.constraints.expressions.Constant(BuiltinTypes.DECIMAL, (ri.getValue())); // add the constant equivalence expression to the list - eList.add(new NumericBooleanExpression(wm, NumericComparator.EQ, r)); + eList.add(new NumericBooleanExpression(wm, NumericComparator.EQ, r.asExpression())); } if (!iGuard.isSmallerGuard()) { - SymbolicDataValue l = iGuard.leftLimit(); + SDTGuardElement l = iGuard.leftLimit(); assert l != null; - DataValue li = new DataValue(type, val.getValue(l)); + DataValue li = (l instanceof DataValue) ? (DataValue) l : + new DataValue(type, (BigDecimal) val.getValue( (Variable) l)); gov.nasa.jpf.constraints.expressions.Constant wm = new gov.nasa.jpf.constraints.expressions.Constant(BuiltinTypes.DECIMAL, (li.getValue())); // add the constant equivalence expression to the list - eList.add(new NumericBooleanExpression(wm, NumericComparator.EQ, l)); + eList.add(new NumericBooleanExpression(wm, NumericComparator.EQ, l.asExpression())); } } @@ -182,7 +182,7 @@ public DataValue instantiate(SDTGuard g, Valuation val, Constants c, Collection< } Expression _x = ExpressionUtil.and(eList); -// System.out.println("SOLVING: " + _x + " with " + newVal); + //System.out.println("SOLVING: " + _x + " with " + newVal); res = solver.solve(_x, newVal); // System.out.println("SOLVING:: " + res + " " + eList + " " + newVal); } diff --git a/src/main/java/de/learnlib/ralib/words/DataWords.java b/src/main/java/de/learnlib/ralib/words/DataWords.java index 5ae0dba0..ac5aa91b 100644 --- a/src/main/java/de/learnlib/ralib/words/DataWords.java +++ b/src/main/java/de/learnlib/ralib/words/DataWords.java @@ -22,16 +22,12 @@ import java.util.LinkedHashSet; import java.util.List; import java.util.Map; -import java.util.Map.Entry; import java.util.Set; import de.learnlib.ralib.data.DataType; import de.learnlib.ralib.data.DataValue; -import de.learnlib.ralib.data.PIV; import de.learnlib.ralib.data.ParameterValuation; -import de.learnlib.ralib.data.RegisterValuation; import de.learnlib.ralib.data.SymbolicDataValue.Parameter; -import de.learnlib.ralib.data.SymbolicDataValue.Register; import de.learnlib.ralib.data.util.SymbolicDataValueGenerator.ParameterGenerator; import net.automatalib.word.Word; @@ -250,16 +246,4 @@ public static ParameterValuation computeParameterValuation(Word return pars; } - public static RegisterValuation computeRegisterValuation(ParameterValuation pars, PIV piv) { - RegisterValuation vars = new RegisterValuation(); - for (Entry e : pars.entrySet()) { - Register r = piv.get(e.getKey()); - if (r != null) - vars.put(r, e.getValue()); - } - return vars; - } - - private DataWords() { - } } diff --git a/src/test/java/de/learnlib/ralib/data/PIVRemappingIteratorTest.java b/src/test/java/de/learnlib/ralib/data/PIVRemappingIteratorTest.java deleted file mode 100644 index a5f02869..00000000 --- a/src/test/java/de/learnlib/ralib/data/PIVRemappingIteratorTest.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright (C) 2014-2015 The LearnLib Contributors - * This file is part of LearnLib, http://www.learnlib.de/. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package de.learnlib.ralib.data; - -import org.testng.Assert; -import org.testng.annotations.Test; - -import de.learnlib.ralib.RaLibTestSuite; -import de.learnlib.ralib.data.util.PIVRemappingIterator; -import de.learnlib.ralib.data.util.SymbolicDataValueGenerator.ParameterGenerator; -import de.learnlib.ralib.data.util.SymbolicDataValueGenerator.RegisterGenerator; - -/** - * - * @author falk - */ -public class PIVRemappingIteratorTest extends RaLibTestSuite { - - public PIVRemappingIteratorTest() { - } - - private PIV generatePIV(PIV piv, DataType t, int size) { - - ParameterGenerator gen_p = new ParameterGenerator(); - RegisterGenerator gen_r = new RegisterGenerator(); - - for (int i = 0; i < size; i++) { - piv.put(gen_p.next(t), gen_r.next(t)); - } - - return piv; - } - - @Test - public void testOneType() { - - DataType type1 = new DataType("type1"); - - PIV piv1 = generatePIV(new PIV(), type1, 4); - PIV piv2 = generatePIV(new PIV(), type1, 4); - - int count = 0; - for (VarMapping unused : new PIVRemappingIterator(piv1, piv2)) { - count++; - } - - Assert.assertEquals(count, 24); - } - - @Test - public void testTwoTypes() { - - DataType type1 = new DataType("type1"); - DataType type2 = new DataType("type2"); - - PIV piv1 = generatePIV(new PIV(), type1, 2); - PIV piv2 = generatePIV(new PIV(), type1, 2); - - piv1 = generatePIV(piv1, type2, 2); - piv2 = generatePIV(piv2, type2, 2); - - int count = 0; - for (VarMapping unused : new PIVRemappingIterator(piv1, piv2)) { - count++; - } - - Assert.assertEquals(count, 4); - } -} diff --git a/src/test/java/de/learnlib/ralib/dt/DTInnerNodeTest.java b/src/test/java/de/learnlib/ralib/dt/DTInnerNodeTest.java index f8818376..5d7609c2 100644 --- a/src/test/java/de/learnlib/ralib/dt/DTInnerNodeTest.java +++ b/src/test/java/de/learnlib/ralib/dt/DTInnerNodeTest.java @@ -9,14 +9,11 @@ import java.util.LinkedHashMap; import java.util.Map; +import de.learnlib.ralib.data.*; import org.testng.Assert; import org.testng.annotations.Test; import de.learnlib.ralib.automata.RegisterAutomaton; -import de.learnlib.ralib.data.Constants; -import de.learnlib.ralib.data.DataType; -import de.learnlib.ralib.data.DataValue; -import de.learnlib.ralib.data.PIV; import de.learnlib.ralib.learning.SymbolicSuffix; import de.learnlib.ralib.oracles.DataWordOracle; import de.learnlib.ralib.oracles.SimulatorOracle; @@ -61,17 +58,18 @@ public void siftTest() { SymbolicSuffix symbSuffix = new SymbolicSuffix(epsilon, suffix); DTInnerNode node = new DTInnerNode(symbSuffix); - DTLeaf child1 = new DTLeaf(new MappedPrefix(epsilon, new PIV()), mto); - DTLeaf child2 = new DTLeaf(new MappedPrefix(push, new PIV()), mto); + DTLeaf child1 = new DTLeaf(new MappedPrefix(epsilon, new Bijection<>()), mto); + DTLeaf child2 = new DTLeaf(new MappedPrefix(push, new Bijection<>()), mto); + + PathResult r1 = PathResult.computePathResult(mto, new MappedPrefix(epsilon, new Bijection<>()), node.getSuffixes(), false); + PathResult r2 = PathResult.computePathResult(mto, new MappedPrefix(push, new Bijection<>()), node.getSuffixes(), false); - PathResult r1 = PathResult.computePathResult(mto, new MappedPrefix(epsilon, new PIV()), node.getSuffixes(), false); - PathResult r2 = PathResult.computePathResult(mto, new MappedPrefix(push, new PIV()), node.getSuffixes(), false); node.addBranch(new DTBranch(child1, r1)); node.addBranch(new DTBranch(child2, r2)); - DTNode test1 = node.sift(new MappedPrefix(p1, new PIV()), mto, false).getKey(); - DTNode test2 = node.sift(new MappedPrefix(p2, new PIV()), mto, false).getKey(); + DTNode test1 = node.sift(new MappedPrefix(p1, new Bijection<>()), mto, false).getKey(); + DTNode test2 = node.sift(new MappedPrefix(p2, new Bijection<>()), mto, false).getKey(); Assert.assertEquals(test1, child1); Assert.assertEquals(test2, child2); diff --git a/src/test/java/de/learnlib/ralib/dt/DTTest.java b/src/test/java/de/learnlib/ralib/dt/DTTest.java index fbf9ceda..774f8b91 100644 --- a/src/test/java/de/learnlib/ralib/dt/DTTest.java +++ b/src/test/java/de/learnlib/ralib/dt/DTTest.java @@ -9,14 +9,11 @@ import java.util.LinkedHashMap; import java.util.Map; +import de.learnlib.ralib.data.*; import org.testng.Assert; import org.testng.annotations.Test; import de.learnlib.ralib.automata.RegisterAutomaton; -import de.learnlib.ralib.data.Constants; -import de.learnlib.ralib.data.DataType; -import de.learnlib.ralib.data.DataValue; -import de.learnlib.ralib.data.PIV; import de.learnlib.ralib.learning.SymbolicSuffix; import de.learnlib.ralib.oracles.DataWordOracle; import de.learnlib.ralib.oracles.SDTLogicOracle; @@ -56,17 +53,17 @@ private DT buildFullTreePrimesOnly(TreeOracle oracle) { DTInnerNode nodePop = new DTInnerNode(suffPop); DTInnerNode nodePush = new DTInnerNode(suffPush); - PathResult rPop = PathResult.computePathResult(oracle, new MappedPrefix(prePop, new PIV()), nodeEps.getSuffixes(), false); - PathResult rEps = PathResult.computePathResult(oracle, new MappedPrefix(epsilon, new PIV()), nodePop.getSuffixes(), false); - PathResult rPush = PathResult.computePathResult(oracle, new MappedPrefix(prePush, new PIV()), nodePush.getSuffixes(), false); - PathResult rPushPush = PathResult.computePathResult(oracle, new MappedPrefix(prePushPush, new PIV()), nodePush.getSuffixes(), false); - PathResult rInnerPop = PathResult.computePathResult(oracle, new MappedPrefix(epsilon, new PIV()), nodeEps.getSuffixes(), false); - PathResult rInnerPush = PathResult.computePathResult(oracle, new MappedPrefix(prePush, new PIV()), nodePop.getSuffixes(), false); - - DTLeaf leafPop = new DTLeaf(new MappedPrefix(prePop, tqrPop.getPiv()), oracle); - DTLeaf leafEps = new DTLeaf(new MappedPrefix(epsilon, tqrEps.getPiv()), oracle); - DTLeaf leafPush = new DTLeaf(new MappedPrefix(prePush, tqrPush.getPiv()), oracle); - DTLeaf leafPushPush = new DTLeaf(new MappedPrefix(prePushPush, tqrPushPush.getPiv()), oracle); + PathResult rPop = PathResult.computePathResult(oracle, new MappedPrefix(prePop, new Bijection<>()), nodeEps.getSuffixes(), false); + PathResult rEps = PathResult.computePathResult(oracle, new MappedPrefix(epsilon, new Bijection<>()), nodePop.getSuffixes(), false); + PathResult rPush = PathResult.computePathResult(oracle, new MappedPrefix(prePush, new Bijection<>()), nodePush.getSuffixes(), false); + PathResult rPushPush = PathResult.computePathResult(oracle, new MappedPrefix(prePushPush, new Bijection<>()), nodePush.getSuffixes(), false); + PathResult rInnerPop = PathResult.computePathResult(oracle, new MappedPrefix(epsilon, new Bijection<>()), nodeEps.getSuffixes(), false); + PathResult rInnerPush = PathResult.computePathResult(oracle, new MappedPrefix(prePush, new Bijection<>()), nodePop.getSuffixes(), false); + + DTLeaf leafPop = new DTLeaf(new MappedPrefix(prePop, new Bijection<>()), oracle); + DTLeaf leafEps = new DTLeaf(new MappedPrefix(epsilon, new Bijection<>()), oracle); + DTLeaf leafPush = new DTLeaf(new MappedPrefix(prePush, new Bijection<>()), oracle); + DTLeaf leafPushPush = new DTLeaf(new MappedPrefix(prePushPush, new Bijection<>()), oracle); leafPop.setParent(nodeEps); leafEps.setParent(nodePop); leafPush.setParent(nodePush); @@ -79,8 +76,8 @@ private DT buildFullTreePrimesOnly(TreeOracle oracle) { DTBranch brInnerPush = new DTBranch(nodePush, rInnerPush); DTBranch brInnerPop = new DTBranch(nodePop, rInnerPop); - leafPush.getPrimePrefix().addTQR(suffPop, oracle.treeQuery(prePush, suffPop)); - leafPushPush.getPrimePrefix().addTQR(suffPop, oracle.treeQuery(prePushPush, suffPop)); + leafPush.getPrimePrefix().addTQR(suffPop, oracle.treeQuery(prePush, suffPop).sdt()); + leafPushPush.getPrimePrefix().addTQR(suffPop, oracle.treeQuery(prePushPush, suffPop).sdt()); nodeEps.addBranch(brPop); nodeEps.addBranch(brInnerPop); @@ -106,12 +103,12 @@ private DT buildSimpleTree(TreeOracle oracle) { DTInnerNode nodeEps = new DTInnerNode(suffEps); DTInnerNode nodePop = new DTInnerNode(suffPop); - PathResult rPop = PathResult.computePathResult(oracle, new MappedPrefix(prePop, new PIV()), nodeEps.getSuffixes(), false); - PathResult rEps = PathResult.computePathResult(oracle, new MappedPrefix(epsilon, new PIV()), nodePop.getSuffixes(), false); - PathResult rInnerPop= PathResult.computePathResult(oracle, new MappedPrefix(epsilon, new PIV()), nodeEps.getSuffixes(), false); + PathResult rPop = PathResult.computePathResult(oracle, new MappedPrefix(prePop, new Bijection<>()), nodeEps.getSuffixes(), false); + PathResult rEps = PathResult.computePathResult(oracle, new MappedPrefix(epsilon, new Bijection<>()), nodePop.getSuffixes(), false); + PathResult rInnerPop= PathResult.computePathResult(oracle, new MappedPrefix(epsilon, new Bijection<>()), nodeEps.getSuffixes(), false); - DTLeaf leafPop = new DTLeaf(new MappedPrefix(prePop, tqrPop.getPiv()), oracle); - DTLeaf leafEps = new DTLeaf(new MappedPrefix(epsilon, tqrEps.getPiv()), oracle); + DTLeaf leafPop = new DTLeaf(new MappedPrefix(prePop, new Bijection<>()), oracle); + DTLeaf leafEps = new DTLeaf(new MappedPrefix(epsilon, new Bijection<>()), oracle); leafPop.setParent(nodeEps); leafEps.setParent(nodePop); diff --git a/src/test/java/de/learnlib/ralib/dt/RegisterConsistencyTest.java b/src/test/java/de/learnlib/ralib/dt/RegisterConsistencyTest.java index fd47d28d..c3dc0a26 100644 --- a/src/test/java/de/learnlib/ralib/dt/RegisterConsistencyTest.java +++ b/src/test/java/de/learnlib/ralib/dt/RegisterConsistencyTest.java @@ -4,16 +4,12 @@ import java.util.List; import java.util.Map; +import de.learnlib.ralib.data.*; import org.testng.Assert; import org.testng.annotations.Test; import de.learnlib.ralib.RaLibTestSuite; -import de.learnlib.ralib.data.Constants; -import de.learnlib.ralib.data.DataType; -import de.learnlib.ralib.data.DataValue; -import de.learnlib.ralib.data.PIV; import de.learnlib.ralib.data.SymbolicDataValue.Parameter; -import de.learnlib.ralib.data.SymbolicDataValue.Register; import de.learnlib.ralib.data.SymbolicDataValue.SuffixValue; import de.learnlib.ralib.data.util.SymbolicDataValueGenerator.ParameterGenerator; import de.learnlib.ralib.data.util.SymbolicDataValueGenerator.RegisterGenerator; @@ -48,20 +44,20 @@ public TreeQueryResult treeQuery(Word prefix, SymbolicSuffix su } @Override - public Branching getInitialBranching(Word prefix, ParameterizedSymbol ps, PIV piv, + public Branching getInitialBranching(Word prefix, ParameterizedSymbol ps, SDT... sdts) { return null; } @Override public Branching updateBranching(Word prefix, ParameterizedSymbol ps, Branching current, - PIV piv, SDT... sdts) { + SDT... sdts) { return null; } @Override public Map, Boolean> instantiate(Word prefix, SymbolicSuffix suffix, - SDT sdt, PIV piv) { + SDT sdt) { return null; } @@ -123,17 +119,11 @@ public void testSymmetry() { Parameter p1 = pgen.next(T_INT); Parameter p2 = pgen.next(T_INT); - Register r1 = rgen.next(T_INT); - Register r2 = rgen.next(T_INT); + DataValue r1 = new DataValue(T_INT, BigDecimal.ZERO); //rgen.next(T_INT); + DataValue r2 = new DataValue(T_INT, BigDecimal.ONE); // rgen.next(T_INT); SuffixValue s1 = svgen.next(T_INT); SuffixValue s2 = svgen.next(T_INT); - PIV pivWord = new PIV(); - pivWord.put(p1, r1); - pivWord.put(p2, r2); - PIV pivPrefix = new PIV(); - pivPrefix.putAll(pivWord); - Constants consts = new Constants(); SDT sdtEps = SDTLeaf.ACCEPTING; @@ -147,17 +137,17 @@ public void testSymmetry() { new SDTGuard.DisequalityGuard(s1, r1), new SDT(Map.of( new SDTGuard.SDTTrueGuard(s2), SDTLeaf.REJECTING)))); - TreeQueryResult tqrEps = new TreeQueryResult(new PIV(), sdtEps); - TreeQueryResult tqrPrefix = new TreeQueryResult(pivPrefix, sdtPrefix); - TreeQueryResult tqrWord = new TreeQueryResult(pivWord, sdtWord); + TreeQueryResult tqrEps = new TreeQueryResult(sdtEps); + TreeQueryResult tqrPrefix = new TreeQueryResult(sdtPrefix); + TreeQueryResult tqrWord = new TreeQueryResult( sdtWord); - MappedPrefix mpWord = new MappedPrefix(word, pivWord); - MappedPrefix mpPrefix = new MappedPrefix(prefix, pivPrefix); + MappedPrefix mpWord = new MappedPrefix(word, Bijection.identity(sdtWord.getDataValues())); + MappedPrefix mpPrefix = new MappedPrefix(prefix, Bijection.identity(sdtPrefix.getDataValues())); - mpWord.addTQR(new SymbolicSuffix(Word.epsilon(), Word.epsilon()), tqrEps); - mpWord.addTQR(symSuffixWord, tqrWord); - mpPrefix.addTQR(symSuffixEps, tqrEps); - mpPrefix.addTQR(symSuffixPrefix, tqrPrefix); + mpWord.addTQR(new SymbolicSuffix(Word.epsilon(), Word.epsilon()), tqrEps.sdt()); + mpWord.addTQR(symSuffixWord, tqrWord.sdt()); + mpPrefix.addTQR(symSuffixEps, tqrEps.sdt()); + mpPrefix.addTQR(symSuffixPrefix, tqrPrefix.sdt()); DummyDT dt = new DummyDT(mpWord, mpPrefix); DTLeaf leafWord = dt.getLeaf(word); diff --git a/src/test/java/de/learnlib/ralib/example/sdts/LoginExampleSDT.java b/src/test/java/de/learnlib/ralib/example/sdts/LoginExampleSDT.java index c87bbe59..931f4556 100644 --- a/src/test/java/de/learnlib/ralib/example/sdts/LoginExampleSDT.java +++ b/src/test/java/de/learnlib/ralib/example/sdts/LoginExampleSDT.java @@ -19,6 +19,7 @@ import java.util.LinkedHashSet; import java.util.Set; +import de.learnlib.ralib.data.SDTRelabeling; import de.learnlib.ralib.data.SymbolicDataValue.Register; import de.learnlib.ralib.data.VarMapping; import de.learnlib.ralib.learning.SymbolicSuffix; @@ -55,7 +56,7 @@ public LoginExampleSDT(LoginExampleSDT other) { } @Override - public boolean isEquivalent(SDT other, VarMapping renaming) { + public boolean isEquivalent(SDT other, SDTRelabeling renaming) { if (! other.getClass().equals(this.getClass())) { return false; } @@ -67,7 +68,7 @@ public boolean isEquivalent(SDT other, VarMapping renaming) { } @Override - public LoginExampleSDT relabel(VarMapping relabelling) { + public LoginExampleSDT relabel(SDTRelabeling relabelling) { return this; } diff --git a/src/test/java/de/learnlib/ralib/example/sdts/LoginExampleTreeOracle.java b/src/test/java/de/learnlib/ralib/example/sdts/LoginExampleTreeOracle.java index 25543ca8..41a848ad 100644 --- a/src/test/java/de/learnlib/ralib/example/sdts/LoginExampleTreeOracle.java +++ b/src/test/java/de/learnlib/ralib/example/sdts/LoginExampleTreeOracle.java @@ -29,7 +29,6 @@ import de.learnlib.ralib.data.Constants; import de.learnlib.ralib.data.DataValue; -import de.learnlib.ralib.data.PIV; import de.learnlib.ralib.data.SymbolicDataValue; import de.learnlib.ralib.data.SymbolicDataValue.Register; import de.learnlib.ralib.data.util.SymbolicDataValueGenerator; @@ -75,7 +74,7 @@ public TreeQueryResult treeQuery( Word prefix, SymbolicSuffix suffix) { if (prefix.length() < 1) { - return new TreeQueryResult(new PIV(), + return new TreeQueryResult( new LoginExampleSDT(SDTClass.REJECT, suffix, new LinkedHashSet())); } @@ -115,7 +114,7 @@ public TreeQueryResult treeQuery( } if (state == State.ERROR) { - return new TreeQueryResult(new PIV(), + return new TreeQueryResult( new LoginExampleSDT(SDTClass.REJECT, suffix, new LinkedHashSet())); } @@ -141,15 +140,7 @@ public TreeQueryResult treeQuery( break; } - PIV piv = new PIV(); - SymbolicDataValueGenerator.ParameterGenerator pgen = - new SymbolicDataValueGenerator.ParameterGenerator(); - if (uid != null && clazz == SDTClass.LOGIN) { - piv.put(pgen.next(T_UID), rUid); - piv.put(pgen.next(T_PWD), rPwd); - } - - return new TreeQueryResult(piv, + return new TreeQueryResult( new LoginExampleSDT(clazz, suffix, new LinkedHashSet())); } @@ -167,7 +158,7 @@ private Word getDefaultExtension( @Override public Branching getInitialBranching(Word prefix, - ParameterizedSymbol ps, PIV piv, SDT... sdts) { + ParameterizedSymbol ps, SDT... sdts) { Map, Expression> branches = new LinkedHashMap, Expression>(); Word acts = DataWords.actsOf(prefix); @@ -212,14 +203,14 @@ public Branching getInitialBranching(Word prefix, @Override public Branching updateBranching(Word prefix, ParameterizedSymbol ps, Branching current, - PIV piv, SDT... sdts) { + SDT... sdts) { - return getInitialBranching(prefix, ps, piv, sdts); + return getInitialBranching(prefix, ps, sdts); } @Override public Map, Boolean> instantiate(Word prefix, - SymbolicSuffix suffix, SDT sdt, PIV piv) { + SymbolicSuffix suffix, SDT sdt) { throw new UnsupportedOperationException("Not implemented"); } diff --git a/src/test/java/de/learnlib/ralib/learning/rastar/CellTest.java b/src/test/java/de/learnlib/ralib/learning/rastar/CellTest.java index 9de0fef9..64006ea3 100644 --- a/src/test/java/de/learnlib/ralib/learning/rastar/CellTest.java +++ b/src/test/java/de/learnlib/ralib/learning/rastar/CellTest.java @@ -26,6 +26,7 @@ import java.util.Arrays; import java.util.logging.Level; +import de.learnlib.ralib.data.SDTRelabeling; import org.testng.Assert; import org.testng.annotations.Test; @@ -72,11 +73,11 @@ public void testCellCreation() { Cell c = Cell.computeCell(oracle, prefix, symSuffix); - logger.log(Level.FINE, "Memorable: {0}", Arrays.toString(c.getMemorable().toArray())); + logger.log(Level.FINE, "Memorable: {0}", Arrays.toString(c.getMemorableValues().toArray())); logger.log(Level.FINE, "Cell: {0}", c.toString()); Assert.assertTrue(c.couldBeEquivalentTo(c)); - Assert.assertTrue(c.isEquivalentTo(c, new VarMapping())); + Assert.assertTrue(c.isEquivalentTo(c, new SDTRelabeling())); } diff --git a/src/test/java/de/learnlib/ralib/learning/rastar/LearnLoginTest.java b/src/test/java/de/learnlib/ralib/learning/rastar/LearnLoginTest.java index 70e3d0a7..21921781 100644 --- a/src/test/java/de/learnlib/ralib/learning/rastar/LearnLoginTest.java +++ b/src/test/java/de/learnlib/ralib/learning/rastar/LearnLoginTest.java @@ -81,6 +81,7 @@ public void learnLoginExample() { rastar.learn(); RegisterAutomaton hyp = rastar.getHypothesis(); + System.out.println(hyp); logger.log(Level.FINE, "HYP1: {0}", hyp); Word ce = Word.fromSymbols( @@ -93,6 +94,7 @@ public void learnLoginExample() { rastar.learn(); hyp = rastar.getHypothesis(); + System.out.println(hyp); logger.log(Level.FINE, "HYP2: {0}", hyp); Assert.assertEquals(hyp.getStates().size(), 3); diff --git a/src/test/java/de/learnlib/ralib/learning/rastar/LearnRepeaterTest.java b/src/test/java/de/learnlib/ralib/learning/rastar/LearnRepeaterTest.java new file mode 100644 index 00000000..822515dc --- /dev/null +++ b/src/test/java/de/learnlib/ralib/learning/rastar/LearnRepeaterTest.java @@ -0,0 +1,96 @@ +package de.learnlib.ralib.learning.rastar; + +import de.learnlib.query.DefaultQuery; +import de.learnlib.ralib.RaLibTestSuite; +import de.learnlib.ralib.automata.RegisterAutomaton; +import de.learnlib.ralib.data.Constants; +import de.learnlib.ralib.data.DataType; +import de.learnlib.ralib.data.DataValue; +import de.learnlib.ralib.example.repeater.Repeater; +import de.learnlib.ralib.example.repeater.RepeaterSUL; +import de.learnlib.ralib.learning.Measurements; +import de.learnlib.ralib.learning.QueryStatistics; +import de.learnlib.ralib.learning.ralambda.RaLambda; +import de.learnlib.ralib.oracles.SimulatorOracle; +import de.learnlib.ralib.oracles.TreeOracleFactory; +import de.learnlib.ralib.oracles.io.IOCache; +import de.learnlib.ralib.oracles.io.IOFilter; +import de.learnlib.ralib.oracles.io.IOOracle; +import de.learnlib.ralib.oracles.mto.MultiTheorySDTLogicOracle; +import de.learnlib.ralib.oracles.mto.MultiTheoryTreeOracle; +import de.learnlib.ralib.smt.ConstraintSolver; +import de.learnlib.ralib.sul.SULOracle; +import de.learnlib.ralib.theory.Theory; +import de.learnlib.ralib.tools.theories.IntegerEqualityTheory; +import de.learnlib.ralib.words.PSymbolInstance; +import net.automatalib.word.Word; +import org.testng.Assert; +import org.testng.annotations.Test; + +import java.math.BigDecimal; +import java.util.LinkedHashMap; +import java.util.Map; + +import static de.learnlib.ralib.example.repeater.RepeaterSUL.*; + +public class LearnRepeaterTest extends RaLibTestSuite { + + @Test + public void learnRepeaterTest() { + + Constants consts = new Constants(); + + final Map teachers = new LinkedHashMap<>(); + IntegerEqualityTheory theory = new IntegerEqualityTheory(TINT); + theory.setUseSuffixOpt(true); + teachers.put(TINT, theory); + + RepeaterSUL sul = new RepeaterSUL(); + IOOracle ioOracle = new SULOracle(sul, RepeaterSUL.ERROR); + IOCache ioCache = new IOCache(ioOracle); + IOFilter oracle = new IOFilter(ioCache, sul.getInputSymbols()); + + ConstraintSolver solver = new ConstraintSolver(); + + MultiTheoryTreeOracle mto = + new MultiTheoryTreeOracle(oracle, teachers, consts, solver); + MultiTheorySDTLogicOracle mlo = + new MultiTheorySDTLogicOracle(consts, solver); + + TreeOracleFactory hypFactory = (RegisterAutomaton hyp) -> + new MultiTheoryTreeOracle(new SimulatorOracle(hyp), teachers, consts, solver); + + Measurements measurements = new Measurements(); + QueryStatistics stats = new QueryStatistics(measurements, ioOracle); + + RaStar learner = new RaStar(mto, hypFactory, mlo, consts, true, sul.getActionSymbols()); + learner.setStatisticCounter(stats); + + learner.learn(); + + Repeater repeater = new Repeater(); + Assert.assertEquals(repeater.repeat(0), (Integer)0); + Assert.assertEquals(repeater.repeat(0), (Integer)0); + Assert.assertNull(repeater.repeat(0)); + + Word ce = + Word.fromSymbols(new PSymbolInstance(IPUT, new DataValue(TINT, BigDecimal.ZERO)), + new PSymbolInstance(OECHO, new DataValue(TINT, BigDecimal.ZERO)), + new PSymbolInstance(IPUT, new DataValue(TINT, BigDecimal.ZERO)), + new PSymbolInstance(OECHO, new DataValue(TINT, BigDecimal.ZERO)), + new PSymbolInstance(IPUT, new DataValue(TINT, BigDecimal.ZERO)), + new PSymbolInstance(OECHO, new DataValue(TINT, BigDecimal.ZERO))); + + learner.addCounterexample(new DefaultQuery(ce, false)); + + learner.learn(); + + String str = stats.toString(); + Assert.assertTrue(str.contains("Counterexamples: 1")); + Assert.assertTrue(str.contains("CE max length: 6")); + Assert.assertTrue(str.contains("CE Analysis: {TQ: 0, Resets: 7, Inputs: 0}")); + Assert.assertTrue(str.contains("Processing / Refinement: {TQ: 0, Resets: 7, Inputs: 0}")); + Assert.assertTrue(str.contains("Other: {TQ: 0, Resets: 1, Inputs: 0}")); + Assert.assertTrue(str.contains("Total: {TQ: 0, Resets: 15, Inputs: 0}")); + } +} diff --git a/src/test/java/de/learnlib/ralib/learning/rastar/LoggingOracle.java b/src/test/java/de/learnlib/ralib/learning/rastar/LoggingOracle.java index 50a50276..9bbd45d6 100644 --- a/src/test/java/de/learnlib/ralib/learning/rastar/LoggingOracle.java +++ b/src/test/java/de/learnlib/ralib/learning/rastar/LoggingOracle.java @@ -19,7 +19,6 @@ import java.util.Map; import de.learnlib.ralib.data.Constants; -import de.learnlib.ralib.data.PIV; import de.learnlib.ralib.learning.SymbolicSuffix; import de.learnlib.ralib.oracles.Branching; import de.learnlib.ralib.oracles.TreeOracle; @@ -50,28 +49,27 @@ public TreeQueryResult treeQuery(Word prefix, SymbolicSuffix su @Override public Branching getInitialBranching(Word prefix, - ParameterizedSymbol ps, PIV piv, SDT ... sdts) { + ParameterizedSymbol ps, SDT ... sdts) { //System.out.println("QUERY (initial branching): " + prefix + " and " + ps); - return treeoracle.getInitialBranching(prefix, ps, piv, sdts); + return treeoracle.getInitialBranching(prefix, ps, sdts); } @Override public Branching updateBranching(Word prefix, - ParameterizedSymbol ps, Branching current, - PIV piv, SDT ... sdts) { + ParameterizedSymbol ps, Branching current, SDT ... sdts) { //System.out.println("QUERY (update branching): " + prefix + // " and " + ps + " with " + sdts.length + " sdts"); - Branching b = treeoracle.updateBranching(prefix, ps, current, piv, sdts); + Branching b = treeoracle.updateBranching(prefix, ps, current, sdts); //System.out.println(b.getBranches().size()); return b; } @Override public Map, Boolean> instantiate(Word prefix, - SymbolicSuffix suffix, SDT sdt, PIV piv) { - return treeoracle.instantiate(prefix, suffix, sdt, piv); + SymbolicSuffix suffix, SDT sdt) { + return treeoracle.instantiate(prefix, suffix, sdt); } @Override diff --git a/src/test/java/de/learnlib/ralib/learning/rastar/RowTest.java b/src/test/java/de/learnlib/ralib/learning/rastar/RowTest.java index d477c3f4..7db31b39 100644 --- a/src/test/java/de/learnlib/ralib/learning/rastar/RowTest.java +++ b/src/test/java/de/learnlib/ralib/learning/rastar/RowTest.java @@ -25,13 +25,14 @@ import java.util.Arrays; import java.util.logging.Level; +import de.learnlib.ralib.data.Bijection; +import de.learnlib.ralib.data.SDTRelabeling; +import de.learnlib.ralib.data.util.RemappingIterator; import org.testng.Assert; import org.testng.annotations.Test; import de.learnlib.ralib.RaLibTestSuite; import de.learnlib.ralib.data.DataValue; -import de.learnlib.ralib.data.VarMapping; -import de.learnlib.ralib.data.util.PIVRemappingIterator; import de.learnlib.ralib.example.sdts.LoginExampleTreeOracle; import de.learnlib.ralib.learning.SymbolicSuffix; import de.learnlib.ralib.words.PSymbolInstance; @@ -79,9 +80,9 @@ public void testRowEquivalence() { Row r1 = Row.computeRow(oracle, prefix1, Arrays.asList(suffixes), false); Row r2 = Row.computeRow(oracle, prefix2, Arrays.asList(suffixes), false); - VarMapping renaming = null; - for (VarMapping map : new PIVRemappingIterator(r1.getParsInVars(), r2.getParsInVars())) { - if (r1.isEquivalentTo(r2, map)) { + Bijection renaming = null; + for (Bijection map : new RemappingIterator<>(r1.memorableValues(), r2.memorableValues())) { + if (r2.isEquivalentTo(r1, SDTRelabeling.fromBijection(map))) { renaming = map; break; } @@ -89,7 +90,7 @@ public void testRowEquivalence() { Assert.assertNotNull(renaming); Assert.assertTrue(r1.couldBeEquivalentTo(r2)); - Assert.assertTrue(r1.isEquivalentTo(r2, renaming)); + Assert.assertTrue(r2.isEquivalentTo(r1, SDTRelabeling.fromBijection(renaming))); } diff --git a/src/test/java/de/learnlib/ralib/oracles/mto/ConstantsSDTBranchingTest.java b/src/test/java/de/learnlib/ralib/oracles/mto/ConstantsSDTBranchingTest.java index bb7b986d..75531d3f 100644 --- a/src/test/java/de/learnlib/ralib/oracles/mto/ConstantsSDTBranchingTest.java +++ b/src/test/java/de/learnlib/ralib/oracles/mto/ConstantsSDTBranchingTest.java @@ -110,12 +110,11 @@ public void testModelswithOutput() { logger.log(Level.FINE, "Suffix: {0}", symSuffix1); TreeQueryResult tqr = mto.treeQuery(prefix, symSuffix1); - logger.log(Level.FINE, "PIV: {0}", tqr.getPiv()); - logger.log(Level.FINE, "SDT: {0}", tqr.getSdt()); + logger.log(Level.FINE, "SDT: {0}", tqr.sdt()); - final String expected = "[(('r1' == 'p1') && ('c1' == 'p2')), (('r1' == 'p1') && ('c1' != 'p2')), (('r1' != 'p1') && true)]"; + final String expected = "[((2 == 'p1') && ('c1' == 'p2')), ((2 == 'p1') && ('c1' != 'p2')), ((2 != 'p1') && true)]"; - Branching b = mto.getInitialBranching(prefix, oframe, tqr.getPiv(), tqr.getSdt()); + Branching b = mto.getInitialBranching(prefix, oframe, tqr.sdt()); String bString = Arrays.toString(b.getBranches().values().toArray()); Assert.assertEquals(b.getBranches().size(), 3); diff --git a/src/test/java/de/learnlib/ralib/oracles/mto/FreshValuesTest.java b/src/test/java/de/learnlib/ralib/oracles/mto/FreshValuesTest.java index b3d114e9..63966919 100644 --- a/src/test/java/de/learnlib/ralib/oracles/mto/FreshValuesTest.java +++ b/src/test/java/de/learnlib/ralib/oracles/mto/FreshValuesTest.java @@ -137,31 +137,30 @@ public void testModelswithOutput() { logger.log(Level.FINE, "Suffix: {0}", symSuffix); TreeQueryResult tqr = mto.treeQuery(prefix1, symSuffix); - String tree = tqr.getSdt().toString(); + String tree = tqr.sdt().toString(); - logger.log(Level.FINE, "PIV: {0}", tqr.getPiv()); logger.log(Level.FINE, "SDT: {0}", tree); final String expectedTree = "[r1]-+\n" + -" []-(s1=r1)\n" + -" | []-TRUE: s2\n" + -" | []-TRUE: s3\n" + -" | []-TRUE: s4\n" + -" | []-TRUE: s5\n" + -" | [Leaf-]\n" + -" +-(s1!=r1)\n" + -" []-TRUE: s2\n" + -" []-TRUE: s3\n" + -" []-(s4=r1)\n" + -" | []-TRUE: s5\n" + -" | [Leaf-]\n" + -" +-(s4=s3)\n" + -" | []-TRUE: s5\n" + -" | [Leaf-]\n" + -" +-ANDCOMPOUND: s4[(s4!=r1), (s4!=s3)]\n" + -" []-TRUE: s5\n" + -" [Leaf+]\n"; + " []-(s1=1[int])\n" + + " | []-TRUE: s2\n" + + " | []-TRUE: s3\n" + + " | []-TRUE: s4\n" + + " | []-TRUE: s5\n" + + " | [Leaf-]\n" + + " +-(s1!=1[int])\n" + + " []-TRUE: s2\n" + + " []-TRUE: s3\n" + + " []-(s4=1[int])\n" + + " | []-TRUE: s5\n" + + " | [Leaf-]\n" + + " +-(s4=s3)\n" + + " | []-TRUE: s5\n" + + " | [Leaf-]\n" + + " +-ANDCOMPOUND: s4[(s4!=1[int]), (s4!=s3)]\n" + + " []-TRUE: s5\n" + + " [Leaf+]\n"; Assert.assertEquals(tree, expectedTree); } diff --git a/src/test/java/de/learnlib/ralib/oracles/mto/InstantiateSymbolicWordTest.java b/src/test/java/de/learnlib/ralib/oracles/mto/InstantiateSymbolicWordTest.java index c9a63147..70fe340e 100644 --- a/src/test/java/de/learnlib/ralib/oracles/mto/InstantiateSymbolicWordTest.java +++ b/src/test/java/de/learnlib/ralib/oracles/mto/InstantiateSymbolicWordTest.java @@ -64,7 +64,7 @@ public void testInstantiateStack() { TreeQueryResult tqr = mto.treeQuery(prefix, symbSuffix); - Map, Boolean> words = mto.instantiate(prefix, symbSuffix, tqr.getSdt(), tqr.getPiv()); + Map, Boolean> words = mto.instantiate(prefix, symbSuffix, tqr.sdt()); Word p1 = Word.fromSymbols( new PSymbolInstance(I_PUSH, new DataValue(T_INT, BigDecimal.ZERO)), @@ -151,7 +151,7 @@ public void testInstantiateWithSuffixOpt() { SymbolicSuffix symSuffix = new SymbolicSuffix(prefix, suffix); TreeQueryResult tqr = mto.treeQuery(prefix, symSuffix); - Map, Boolean> words = mto.instantiate(prefix, symSuffix, tqr.getSdt(), tqr.getPiv()); + Map, Boolean> words = mto.instantiate(prefix, symSuffix, tqr.sdt()); Assert.assertEquals(words.size(), 1); diff --git a/src/test/java/de/learnlib/ralib/oracles/mto/LoginBranchingTest.java b/src/test/java/de/learnlib/ralib/oracles/mto/LoginBranchingTest.java index ce1897dd..d9e04229 100644 --- a/src/test/java/de/learnlib/ralib/oracles/mto/LoginBranchingTest.java +++ b/src/test/java/de/learnlib/ralib/oracles/mto/LoginBranchingTest.java @@ -38,7 +38,6 @@ import de.learnlib.ralib.data.Constants; import de.learnlib.ralib.data.DataType; import de.learnlib.ralib.data.DataValue; -import de.learnlib.ralib.data.PIV; import de.learnlib.ralib.learning.SymbolicSuffix; import de.learnlib.ralib.oracles.Branching; import de.learnlib.ralib.oracles.DataWordOracle; @@ -107,13 +106,12 @@ public void testBranching() { logger.log(Level.FINE, "Sym. Suffix: {0}", symSuffix); TreeQueryResult tqr = mto.treeQuery(prefix, symSuffix); - logger.log(Level.FINE, "PIV: {0}", tqr.getPiv()); - logger.log(Level.FINE, "SDT: {0}", tqr.getSdt()); + logger.log(Level.FINE, "SDT: {0}", tqr.sdt()); // initial branching bug // Regression: Why does the last word in the set have a password val. of 2 - Branching bug1 = mto.getInitialBranching(prefix, log, tqr.getPiv(), tqr.getSdt()); + Branching bug1 = mto.getInitialBranching(prefix, log, tqr.sdt()); final String expectedKeyset = "[IRegister[0[uid], 0[pwd]] OOK[] ILogin[0[uid], 0[pwd]]," + " IRegister[0[uid], 0[pwd]] OOK[] ILogin[0[uid], 1[pwd]]," + " IRegister[0[uid], 0[pwd]] OOK[] ILogin[1[uid], 1[pwd]]]"; @@ -124,8 +122,8 @@ public void testBranching() { // updated branching bug // Regression: This keyset has only one word, there should be three. - Branching bug2 = mto.getInitialBranching(prefix, log, new PIV()); - bug2 = mto.updateBranching(prefix, log, bug2, tqr.getPiv(), tqr.getSdt()); + Branching bug2 = mto.getInitialBranching(prefix, log); + bug2 = mto.updateBranching(prefix, log, bug2, tqr.sdt()); String keyset2 = Arrays.toString(bug2.getBranches().keySet().toArray()); Assert.assertEquals(keyset2, expectedKeyset); @@ -161,9 +159,9 @@ public void testUpdateRefinedBranching() { TreeQueryResult tqr2 = mto.treeQuery(prefix, suffix2); - Branching initial = mto.getInitialBranching(prefix, I_LOGIN, new PIV()); - Branching finer = mto.updateBranching(prefix, I_LOGIN, initial, tqr1.getPiv(), tqr1.getSdt()); - Branching actual = mto.updateBranching(prefix, I_LOGIN, finer, tqr1.getPiv(), tqr2.getSdt()); + Branching initial = mto.getInitialBranching(prefix, I_LOGIN); + Branching finer = mto.updateBranching(prefix, I_LOGIN, initial, tqr1.sdt()); + Branching actual = mto.updateBranching(prefix, I_LOGIN, finer, tqr2.sdt()); Assert.assertEquals(actual.getBranches().toString(), finer.getBranches().toString()); } @@ -197,9 +195,9 @@ public void testInitialBranchingWithSDTs() { TreeQueryResult tqr2 = mto.treeQuery(prefix, suffix2); - Branching initialFiner = mto.getInitialBranching(prefix, I_LOGIN, tqr1.getPiv(), tqr1.getSdt(), tqr2.getSdt()); - Branching initial = mto.getInitialBranching(prefix, I_LOGIN, new PIV()); - Branching finer = mto.updateBranching(prefix, I_LOGIN, initial, tqr1.getPiv(), tqr1.getSdt()); + Branching initialFiner = mto.getInitialBranching(prefix, I_LOGIN, tqr1.sdt(), tqr2.sdt()); + Branching initial = mto.getInitialBranching(prefix, I_LOGIN); + Branching finer = mto.updateBranching(prefix, I_LOGIN, initial, tqr1.sdt()); Assert.assertEquals(initialFiner.getBranches().toString(), finer.getBranches().toString()); } @@ -229,8 +227,8 @@ public void testUpdateBranchingNoSDTsMeansNoUpdate() { TreeQueryResult tqr2 = mto.treeQuery(prefix, suffix2); - Branching initialFiner = mto.getInitialBranching(prefix, I_LOGIN, tqr1.getPiv(), tqr1.getSdt(), tqr2.getSdt()); - Branching update = mto.updateBranching(prefix, I_LOGIN, initialFiner, tqr1.getPiv()); + Branching initialFiner = mto.getInitialBranching(prefix, I_LOGIN, tqr1.sdt(), tqr2.sdt()); + Branching update = mto.updateBranching(prefix, I_LOGIN, initialFiner); Assert.assertEquals(update.getBranches().toString(), initialFiner.getBranches().toString()); } diff --git a/src/test/java/de/learnlib/ralib/oracles/mto/MultiSDTBranchingTest.java b/src/test/java/de/learnlib/ralib/oracles/mto/MultiSDTBranchingTest.java index 10587c41..079d2e71 100644 --- a/src/test/java/de/learnlib/ralib/oracles/mto/MultiSDTBranchingTest.java +++ b/src/test/java/de/learnlib/ralib/oracles/mto/MultiSDTBranchingTest.java @@ -129,27 +129,25 @@ public void testModelswithOutput() { TreeQueryResult tqr1 = mto.treeQuery(prefix, symSuffix1); TreeQueryResult tqr2 = mto.treeQuery(prefix, symSuffix2); - logger.log(Level.FINE, "PIV 1: {0}", tqr1.getPiv()); - logger.log(Level.FINE, "SDT 1: {0}", tqr1.getSdt()); - logger.log(Level.FINE, "PIV 2: {0}", tqr2.getPiv()); - logger.log(Level.FINE, "SDT 2: {0}", tqr2.getSdt()); + logger.log(Level.FINE, "SDT 1: {0}", tqr1.sdt()); + logger.log(Level.FINE, "SDT 2: {0}", tqr2.sdt()); - Branching b1 = mto.getInitialBranching(prefix, o100, tqr1.getPiv(), tqr1.getSdt()); + Branching b1 = mto.getInitialBranching(prefix, o100, tqr1.sdt()); logger.log(Level.FINE, "B.1 initial: {0}", Arrays.toString(b1.getBranches().values().toArray())); Assert.assertEquals(b1.getBranches().size(), 2); - b1 = mto.updateBranching(prefix, o100, b1, tqr1.getPiv(), tqr1.getSdt(), tqr2.getSdt()); + b1 = mto.updateBranching(prefix, o100, b1, tqr1.sdt(), tqr2.sdt()); logger.log(Level.FINE, "B.1 updated: {0}", Arrays.toString(b1.getBranches().values().toArray())); Assert.assertEquals(b1.getBranches().size(), 2); - Branching b2 = mto.getInitialBranching(prefix, o100, tqr2.getPiv(), tqr2.getSdt()); + Branching b2 = mto.getInitialBranching(prefix, o100, tqr2.sdt()); logger.log(Level.FINE, "B.2 initial: {0}", Arrays.toString(b2.getBranches().values().toArray())); Assert.assertEquals(b2.getBranches().size(), 1); - b2 = mto.updateBranching(prefix, o100, b2, tqr1.getPiv(), tqr2.getSdt(), tqr1.getSdt()); + b2 = mto.updateBranching(prefix, o100, b2, tqr2.sdt(), tqr1.sdt()); logger.log(Level.FINE, "B.2 updated: {0}", Arrays.toString(b2.getBranches().values().toArray())); Assert.assertEquals(b2.getBranches().size(), 2); diff --git a/src/test/java/de/learnlib/ralib/oracles/mto/MultiTheorySDTLogicOracleTest.java b/src/test/java/de/learnlib/ralib/oracles/mto/MultiTheorySDTLogicOracleTest.java index 68e275ab..3ee80f46 100644 --- a/src/test/java/de/learnlib/ralib/oracles/mto/MultiTheorySDTLogicOracleTest.java +++ b/src/test/java/de/learnlib/ralib/oracles/mto/MultiTheorySDTLogicOracleTest.java @@ -60,7 +60,7 @@ public void acceptsTest() { Word suffix = acceptedWord.suffix(acceptedWord.length() - prefix.length()); SymbolicSuffix symSuffix = new SymbolicSuffix(prefix, suffix); TreeQueryResult query = sulTreeOracle.treeQuery(prefix, symSuffix); - Assert.assertTrue(slo.accepts(acceptedWord, prefix, query.getSdt(), query.getPiv())); + Assert.assertTrue(slo.accepts(acceptedWord, prefix, query.sdt())); List> rejectedSuffixes = Arrays.asList( Word.fromSymbols( new PSymbolInstance(I_LOGIN, new DataValue(T_UID, BigDecimal.ONE), new DataValue(T_PWD, BigDecimal.ZERO)), @@ -73,7 +73,7 @@ public void acceptsTest() { for (Word rejectedSuffix : rejectedSuffixes) { Word rejectedWord = prefix.concat(rejectedSuffix); - Assert.assertFalse(slo.accepts(rejectedWord, prefix, query.getSdt(), query.getPiv())); + Assert.assertFalse(slo.accepts(rejectedWord, prefix, query.sdt())); } } } diff --git a/src/test/java/de/learnlib/ralib/oracles/mto/MultipleSpecialCasesTest.java b/src/test/java/de/learnlib/ralib/oracles/mto/MultipleSpecialCasesTest.java index 44e41c69..549daace 100644 --- a/src/test/java/de/learnlib/ralib/oracles/mto/MultipleSpecialCasesTest.java +++ b/src/test/java/de/learnlib/ralib/oracles/mto/MultipleSpecialCasesTest.java @@ -106,9 +106,8 @@ public void testModelswithOutput() { logger.log(Level.FINE, "Suffix: {0}", symSuffix); TreeQueryResult tqr = mto.treeQuery(prefix, symSuffix); - String tree = tqr.getSdt().toString(); + String tree = tqr.sdt().toString(); - logger.log(Level.FINE, "PIV: {0}", tqr.getPiv()); logger.log(Level.FINE, "SDT: {0}", tree); String expectedTree = "[]-+\n" + diff --git a/src/test/java/de/learnlib/ralib/oracles/mto/NonFreeSuffixValuesTest.java b/src/test/java/de/learnlib/ralib/oracles/mto/NonFreeSuffixValuesTest.java index acad2991..aa2d9da3 100644 --- a/src/test/java/de/learnlib/ralib/oracles/mto/NonFreeSuffixValuesTest.java +++ b/src/test/java/de/learnlib/ralib/oracles/mto/NonFreeSuffixValuesTest.java @@ -133,18 +133,18 @@ public void testModelswithOutputFifo() { String expectedTree = "[r1, r2]-+\n" + " []-TRUE: s1\n" + " []-TRUE: s2\n" + - " []-(s3=r1)\n" + - " | []-(s4=r2)\n" + + " []-(s3=0[int])\n" + + " | []-(s4=1[int])\n" + " | | []-(s5=s1)\n" + " | | []-(s6=s2)\n" + " | | | [Leaf+]\n" + " | | +-(s6!=s2)\n" + " | | [Leaf-]\n" + - " | +-(s4!=r2)\n" + + " | +-(s4!=1[int])\n" + " | []-(s5=s1)\n" + " | []-TRUE: s6\n" + " | [Leaf-]\n" + - " +-(s3!=r1)\n" + + " +-(s3!=0[int])\n" + " []-TRUE: s4\n" + " []-(s5=s1)\n" + " []-TRUE: s6\n" + @@ -271,9 +271,8 @@ private void checkTreeForSuffix(Word prefix, SymbolicSuffix suf logger.log(Level.FINE, "Suffix: {0}", suffix); TreeQueryResult tqr = mto.treeQuery(prefix, suffix); - String tree = tqr.getSdt().toString(); + String tree = tqr.sdt().toString(); - logger.log(Level.FINE, "PIV: {0}", tqr.getPiv()); logger.log(Level.FINE, "SDT: {0}",tree); Assert.assertEquals(tree, expectedTree); diff --git a/src/test/java/de/learnlib/ralib/oracles/mto/OptimizedSymbolicSuffixBuilderTest.java b/src/test/java/de/learnlib/ralib/oracles/mto/OptimizedSymbolicSuffixBuilderTest.java index e1f78ed9..9138be25 100644 --- a/src/test/java/de/learnlib/ralib/oracles/mto/OptimizedSymbolicSuffixBuilderTest.java +++ b/src/test/java/de/learnlib/ralib/oracles/mto/OptimizedSymbolicSuffixBuilderTest.java @@ -1,49 +1,7 @@ package de.learnlib.ralib.oracles.mto; -import static de.learnlib.ralib.example.list.BoundedListDataWordOracle.CONTAINS; -import static de.learnlib.ralib.example.list.BoundedListDataWordOracle.INSERT; -import static de.learnlib.ralib.example.list.BoundedListDataWordOracle.INT_TYPE; -import static de.learnlib.ralib.example.list.BoundedListDataWordOracle.POP; -import static de.learnlib.ralib.example.list.BoundedListDataWordOracle.PUSH; -import static de.learnlib.ralib.example.list.BoundedListDataWordOracle.dv; - -import java.math.BigDecimal; -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import org.testng.Assert; -import org.testng.annotations.Test; - -import de.learnlib.ralib.data.Constants; -import de.learnlib.ralib.data.DataType; -import de.learnlib.ralib.data.DataValue; -import de.learnlib.ralib.data.PIV; -import de.learnlib.ralib.data.SymbolicDataValue; -import de.learnlib.ralib.data.SymbolicDataValue.Parameter; -import de.learnlib.ralib.data.SymbolicDataValue.Register; -import de.learnlib.ralib.data.SymbolicDataValue.SuffixValue; -import de.learnlib.ralib.data.util.SymbolicDataValueGenerator; -import de.learnlib.ralib.data.util.SymbolicDataValueGenerator.ConstantGenerator; -import de.learnlib.ralib.data.util.SymbolicDataValueGenerator.ParameterGenerator; -import de.learnlib.ralib.data.util.SymbolicDataValueGenerator.RegisterGenerator; -import de.learnlib.ralib.data.util.SymbolicDataValueGenerator.SuffixValueGenerator; -import de.learnlib.ralib.example.list.BoundedList; -import de.learnlib.ralib.example.list.BoundedListDataWordOracle; -import de.learnlib.ralib.learning.SymbolicSuffix; -import de.learnlib.ralib.oracles.TreeQueryResult; -import de.learnlib.ralib.smt.ConstraintSolver; -import de.learnlib.ralib.theory.*; -import de.learnlib.ralib.theory.equality.EqualRestriction; -import de.learnlib.ralib.tools.theories.IntegerEqualityTheory; -import de.learnlib.ralib.words.InputSymbol; -import de.learnlib.ralib.words.PSymbolInstance; -import net.automatalib.word.Word; - public class OptimizedSymbolicSuffixBuilderTest { - +/* @Test public void extendDistinguishingSuffixTest() { BoundedListDataWordOracle dwOracle = new BoundedListDataWordOracle(() -> new BoundedList(2, false)); @@ -251,7 +209,7 @@ public void extendDistinguishingSuffixTest() { /* * Checks for equality optimized suffixes built by prepending using an SDT against those built from concrete prefix/suffix - */ + * / private void equalsSuffixesFromConcretePrefixSuffix(Word word, MultiTheoryTreeOracle mto, Constants consts) { OptimizedSymbolicSuffixBuilder builder = new OptimizedSymbolicSuffixBuilder(consts); TreeQueryResult tqr = mto.treeQuery(word, new SymbolicSuffix(Word.epsilon())); @@ -718,4 +676,5 @@ public void testCoalesce() { SymbolicSuffix suffixActual = builder.coalesceSuffixes(suffix1, suffix2); Assert.assertEquals(suffixActual, suffixExpected); } + */ } diff --git a/src/test/java/de/learnlib/ralib/oracles/mto/SIPSDTMergingTest.java b/src/test/java/de/learnlib/ralib/oracles/mto/SIPSDTMergingTest.java index 74e46bdc..e994d7d8 100644 --- a/src/test/java/de/learnlib/ralib/oracles/mto/SIPSDTMergingTest.java +++ b/src/test/java/de/learnlib/ralib/oracles/mto/SIPSDTMergingTest.java @@ -116,25 +116,24 @@ public void testModelswithOutput() { logger.log(Level.FINE, "Suffix: {0}", symSuffix); TreeQueryResult tqr = mto.treeQuery(prefix, symSuffix); - String tree = tqr.getSdt().toString(); + String tree = tqr.sdt().toString(); - logger.log(Level.FINE, "PIV: {0}", tqr.getPiv()); logger.log(Level.FINE, "SDT: {0}",tree); final String expectedTree = "[r1, r2]-+\n" + -" []-(s1=r1)\n" + -" | []-(s2=r2)\n" + -" | | []-TRUE: s3\n" + -" | | [Leaf-]\n" + -" | +-(s2!=r2)\n" + -" | []-(s3=s2)\n" + -" | | [Leaf+]\n" + -" | +-(s3!=s2)\n" + -" | [Leaf-]\n" + -" +-(s1!=r1)\n" + -" []-TRUE: s2\n" + -" []-TRUE: s3\n" + -" [Leaf-]\n"; + " []-(s1=1[int])\n" + + " | []-(s2=0[int])\n" + + " | | []-TRUE: s3\n" + + " | | [Leaf-]\n" + + " | +-(s2!=0[int])\n" + + " | []-(s3=s2)\n" + + " | | [Leaf+]\n" + + " | +-(s3!=s2)\n" + + " | [Leaf-]\n" + + " +-(s1!=1[int])\n" + + " []-TRUE: s2\n" + + " []-TRUE: s3\n" + + " [Leaf-]\n"; Assert.assertEquals(tree, expectedTree); } diff --git a/src/test/java/de/learnlib/ralib/oracles/mto/SecondSDTBranchingTest.java b/src/test/java/de/learnlib/ralib/oracles/mto/SecondSDTBranchingTest.java index f48f6bda..25b092fb 100644 --- a/src/test/java/de/learnlib/ralib/oracles/mto/SecondSDTBranchingTest.java +++ b/src/test/java/de/learnlib/ralib/oracles/mto/SecondSDTBranchingTest.java @@ -22,6 +22,7 @@ import java.util.Map; import java.util.logging.Level; +import de.learnlib.ralib.data.*; import org.testng.Assert; import org.testng.annotations.Test; @@ -29,12 +30,7 @@ import de.learnlib.ralib.TestUtil; import de.learnlib.ralib.automata.RegisterAutomaton; import de.learnlib.ralib.automata.xml.RegisterAutomatonImporter; -import de.learnlib.ralib.data.Constants; -import de.learnlib.ralib.data.DataType; -import de.learnlib.ralib.data.DataValue; -import de.learnlib.ralib.data.PIV; import de.learnlib.ralib.data.SymbolicDataValue.Register; -import de.learnlib.ralib.data.VarMapping; import de.learnlib.ralib.data.util.SymbolicDataValueGenerator.RegisterGenerator; import de.learnlib.ralib.learning.SymbolicSuffix; import de.learnlib.ralib.oracles.Branching; @@ -129,26 +125,25 @@ public void testModelswithOutput() { RegisterGenerator rgen = new RegisterGenerator(); Register r1 = rgen.next(intType); Register r2 = rgen.next(intType); - VarMapping remap = new VarMapping(); + SDTRelabeling remap = new SDTRelabeling(); + /* remap.put(r1, r2); remap.put(r2, r1); + */ + SDT sdt1 = tqr1.sdt().relabel(remap); + SDT sdt2 = tqr2.sdt(); - PIV piv = tqr2.getPiv(); - SDT sdt1 = tqr1.getSdt().relabel(remap); - SDT sdt2 = tqr2.getSdt(); - - logger.log(Level.FINE, "PIV: {0}", piv); logger.log(Level.FINE, "SDT1: {0}", sdt1); logger.log(Level.FINE, "SDT2: {0}", sdt2); // combine branching 1+2 - Branching b = mto.getInitialBranching(prefix, o100, piv, sdt1); - b = mto.updateBranching(prefix, o100, b, piv, sdt1, sdt2); + Branching b = mto.getInitialBranching(prefix, o100, sdt1); + b = mto.updateBranching(prefix, o100, b, sdt1, sdt2); String guards = Arrays.toString(b.getBranches().values().toArray()); logger.log(Level.FINE, "Guards: {0}", guards); - final String expected = "[('r2' == 'p1'), ('r2' != 'p1')]"; + final String expected = "[(1 == 'p1'), (1 != 'p1')]"; Assert.assertEquals(guards, expected); } diff --git a/src/test/java/de/learnlib/ralib/oracles/mto/UntypedBranchingTest.java b/src/test/java/de/learnlib/ralib/oracles/mto/UntypedBranchingTest.java index 0eff04d2..abb55510 100644 --- a/src/test/java/de/learnlib/ralib/oracles/mto/UntypedBranchingTest.java +++ b/src/test/java/de/learnlib/ralib/oracles/mto/UntypedBranchingTest.java @@ -40,6 +40,7 @@ import java.util.Map; import java.util.logging.Level; +import de.learnlib.ralib.data.*; import org.testng.Assert; import org.testng.annotations.Test; @@ -47,13 +48,8 @@ import de.learnlib.ralib.TestUtil; import de.learnlib.ralib.automata.RegisterAutomaton; import de.learnlib.ralib.automata.xml.RegisterAutomatonImporter; -import de.learnlib.ralib.data.Constants; -import de.learnlib.ralib.data.DataType; -import de.learnlib.ralib.data.DataValue; -import de.learnlib.ralib.data.PIV; import de.learnlib.ralib.data.SymbolicDataValue.Parameter; import de.learnlib.ralib.data.SymbolicDataValue.Register; -import de.learnlib.ralib.data.VarMapping; import de.learnlib.ralib.data.util.SymbolicDataValueGenerator.ParameterGenerator; import de.learnlib.ralib.data.util.SymbolicDataValueGenerator.RegisterGenerator; import de.learnlib.ralib.learning.SymbolicSuffix; @@ -131,9 +127,9 @@ public void testBranching() { logger.log(Level.FINE, "{0}", symSuffix); TreeQueryResult res = mto.treeQuery(prefix, symSuffix); - logger.log(Level.FINE, "SDT: {0}", res.getSdt()); + logger.log(Level.FINE, "SDT: {0}", res.sdt()); - SDT sdt = res.getSdt(); + SDT sdt = res.sdt(); ParameterGenerator pgen = new ParameterGenerator(); RegisterGenerator rgen = new RegisterGenerator(); @@ -143,18 +139,12 @@ public void testBranching() { Register r1 = rgen.next(intType); Register r2 = rgen.next(intType); - VarMapping map = new VarMapping(); - map.put(r1, r2); - map.put(r2, r1); - - PIV piv = new PIV(); - piv.put(p2, r1); - piv.put(p1, r2); + SDTRelabeling map = new SDTRelabeling(); sdt = sdt.relabel(map); - Branching bug2 = mto.getInitialBranching(prefix, log, new PIV()); - bug2 = mto.updateBranching(prefix, log, bug2, piv, sdt); + Branching bug2 = mto.getInitialBranching(prefix, log); + bug2 = mto.updateBranching(prefix, log, bug2, sdt); // This set had only one word, there should be three Assert.assertEquals(bug2.getBranches().size(), 3); diff --git a/src/test/java/de/learnlib/ralib/theory/SDTEquivalenceTest.java b/src/test/java/de/learnlib/ralib/theory/SDTEquivalenceTest.java index 1676f747..2a818df0 100644 --- a/src/test/java/de/learnlib/ralib/theory/SDTEquivalenceTest.java +++ b/src/test/java/de/learnlib/ralib/theory/SDTEquivalenceTest.java @@ -1,7 +1,9 @@ package de.learnlib.ralib.theory; +import java.math.BigDecimal; import java.util.Map; +import de.learnlib.ralib.data.DataValue; import org.testng.Assert; import org.testng.annotations.Test; @@ -22,8 +24,8 @@ public void testEquivalence() { SuffixValue s1 = new SuffixValue(DT, 1); SuffixValue s2 = new SuffixValue(DT, 2); - Register r1 = new Register(DT, 1); - Register r2 = new Register(DT, 2); + DataValue r1 = new DataValue(DT, BigDecimal.ONE); + DataValue r2 = new DataValue(DT, BigDecimal.valueOf(2.0)); SDT sdt1 = new SDT(Map.of( new SDTGuard.EqualityGuard(s1, r1), SDTLeaf.ACCEPTING, @@ -68,10 +70,10 @@ public void testEquivalenceUnderBijection() { SuffixValue s1 = new SuffixValue(DT, 1); SuffixValue s2 = new SuffixValue(DT, 2); - Register r1 = new Register(DT, 1); - Register r2 = new Register(DT, 2); - Register r3 = new Register(DT, 3); - Register r4 = new Register(DT, 4); + DataValue r1 = new DataValue(DT, BigDecimal.valueOf(1.0)); + DataValue r2 = new DataValue(DT, BigDecimal.valueOf(2.0)); + DataValue r3 = new DataValue(DT, BigDecimal.valueOf(3.0)); + DataValue r4 = new DataValue(DT, BigDecimal.valueOf(4.0)); SDT sdt1 = new SDT(Map.of( new SDTGuard.EqualityGuard(s1, r1), new SDT(Map.of( @@ -88,26 +90,29 @@ public void testEquivalenceUnderBijection() { new SDTGuard.EqualityGuard(s2, r4), SDTLeaf.REJECTING, new SDTGuard.DisequalityGuard(s2, r4), SDTLeaf.ACCEPTING)))); - Bijection bijection1 = new Bijection(); + Bijection bijection1 = new Bijection<>(); bijection1.put(r1, r3); bijection1.put(r2, r4); - Bijection bijection2 = new Bijection(); + Bijection bijection2 = new Bijection<>(); bijection2.put(r1, r3); - Bijection bi1 = SDT.equivalentUnderBijection(sdt1, sdt2, solver); - Bijection bi2 = SDT.equivalentUnderBijection(sdt1, sdt2, bijection1, solver); - Bijection bi3 = SDT.equivalentUnderBijection(sdt1, sdt2, bijection2, solver); + Bijection bi1 = SDT.equivalentUnderBijection(sdt1, sdt2, solver); + Bijection bi2 = SDT.equivalentUnderBijection(sdt1, sdt2, bijection1, solver); + Bijection bi3 = SDT.equivalentUnderBijection(sdt1, sdt2, bijection2, solver); Assert.assertEquals(bi1.size(), 2); Assert.assertEquals(bi1.size(), 2); - Assert.assertTrue(bi1.get(r1).equals(r3)); + Assert.assertEquals(r3, bi1.get(r1)); + assert bi2 != null; + Assert.assertEquals(bi2.size(), 2); Assert.assertEquals(bi2.size(), 2); - Assert.assertEquals(bi2.size(), 2); - Assert.assertTrue(bi2.get(r1).equals(r3)); + Assert.assertEquals(r3, bi2.get(r1)); + assert bi3 != null; + Assert.assertEquals(bi3.size(), 2); Assert.assertEquals(bi3.size(), 2); - Assert.assertEquals(bi3.size(), 2); - Assert.assertTrue(bi3.get(r1).equals(r3)); + Assert.assertEquals(r3, bi3.get(r1)); } + } diff --git a/src/test/java/de/learnlib/ralib/theory/TestEqualityTheory.java b/src/test/java/de/learnlib/ralib/theory/TestEqualityTheory.java index a4b15ba6..40139d0e 100644 --- a/src/test/java/de/learnlib/ralib/theory/TestEqualityTheory.java +++ b/src/test/java/de/learnlib/ralib/theory/TestEqualityTheory.java @@ -35,9 +35,6 @@ import de.learnlib.ralib.data.Constants; import de.learnlib.ralib.data.DataType; import de.learnlib.ralib.data.DataValue; -import de.learnlib.ralib.data.PIV; -import de.learnlib.ralib.data.SymbolicDataValue.Parameter; -import de.learnlib.ralib.data.SymbolicDataValue.Register; import de.learnlib.ralib.learning.SymbolicSuffix; import de.learnlib.ralib.oracles.Branching; import de.learnlib.ralib.oracles.DataWordOracle; @@ -89,41 +86,38 @@ public void testLoginExample1() { logger.log(Level.FINE, "Suffix: {0}", symSuffix); TreeQueryResult res = treeOracle.treeQuery(prefix, symSuffix); - SDT sdt = res.getSdt(); - - String expectedTree = "[r2, r1]-+\n" + -" []-(s1=r2)\n" + -" | []-(s2=r1)\n" + -" | | []-(s3=r2)\n" + -" | | | []-(s4=r1)\n" + -" | | | | [Leaf+]\n" + -" | | | +-(s4!=r1)\n" + -" | | | [Leaf-]\n" + -" | | +-(s3!=r2)\n" + -" | | []-TRUE: s4\n" + -" | | [Leaf-]\n" + -" | +-(s2!=r1)\n" + -" | []-TRUE: s3\n" + -" | []-TRUE: s4\n" + -" | [Leaf-]\n" + -" +-(s1!=r2)\n" + -" []-TRUE: s2\n" + -" []-TRUE: s3\n" + -" []-TRUE: s4\n" + -" [Leaf-]\n"; + SDT sdt = res.sdt(); + + String expectedTree = "[r1, r2]-+\n" + + " []-(s1=1[T_uid])\n" + + " | []-(s2=1[T_pwd])\n" + + " | | []-(s3=1[T_uid])\n" + + " | | | []-(s4=1[T_pwd])\n" + + " | | | | [Leaf+]\n" + + " | | | +-(s4!=1[T_pwd])\n" + + " | | | [Leaf-]\n" + + " | | +-(s3!=1[T_uid])\n" + + " | | []-TRUE: s4\n" + + " | | [Leaf-]\n" + + " | +-(s2!=1[T_pwd])\n" + + " | []-TRUE: s3\n" + + " | []-TRUE: s4\n" + + " | [Leaf-]\n" + + " +-(s1!=1[T_uid])\n" + + " []-TRUE: s2\n" + + " []-TRUE: s3\n" + + " []-TRUE: s4\n" + + " [Leaf-]\n"; String tree = sdt.toString(); Assert.assertEquals(tree, expectedTree); logger.log(Level.FINE, "final SDT: \n{0}", tree); - Parameter p1 = new Parameter(T_UID, 1); - Parameter p2 = new Parameter(T_PWD, 2); - - PIV testPiv = new PIV(); - testPiv.put(p1, new Register(T_UID, 1)); - testPiv.put(p2, new Register(T_PWD, 2)); - - Branching b = treeOracle.getInitialBranching(prefix, I_LOGIN, testPiv, sdt); + Branching b = treeOracle.getInitialBranching(prefix, I_LOGIN, sdt); + Assert.assertEquals(b.getBranches().toString(), + "{register[1[T_uid], 1[T_pwd]] login[1[T_uid], 1[T_pwd]]=((1 == 'p1') && (1 == 'p2')), " + + "register[1[T_uid], 1[T_pwd]] login[1[T_uid], 2[T_pwd]]=((1 == 'p1') && (1 != 'p2')), " + + "register[1[T_uid], 1[T_pwd]] login[2[T_uid], 2[T_pwd]]=((1 != 'p1') && true)}"); Assert.assertEquals(b.getBranches().size(), 3); logger.log(Level.FINE, "initial branching: \n{0}", b.getBranches().toString()); diff --git a/src/test/java/de/learnlib/ralib/theory/TestIneqEqTree.java b/src/test/java/de/learnlib/ralib/theory/TestIneqEqTree.java index 3d39c712..b870eca2 100644 --- a/src/test/java/de/learnlib/ralib/theory/TestIneqEqTree.java +++ b/src/test/java/de/learnlib/ralib/theory/TestIneqEqTree.java @@ -31,9 +31,6 @@ import de.learnlib.ralib.data.Constants; import de.learnlib.ralib.data.DataType; import de.learnlib.ralib.data.DataValue; -import de.learnlib.ralib.data.PIV; -import de.learnlib.ralib.data.SymbolicDataValue.Parameter; -import de.learnlib.ralib.data.SymbolicDataValue.Register; import de.learnlib.ralib.example.priority.PriorityQueueSUL; import de.learnlib.ralib.learning.SymbolicSuffix; import de.learnlib.ralib.oracles.Branching; @@ -93,45 +90,36 @@ public void testIneqEqTree() { logger.log(Level.FINE, "Suffix: {0}", symSuffix); TreeQueryResult res = mto.treeQuery(prefix, symSuffix); - SDT sdt = res.getSdt(); - - final String expectedTree = "[r2, r1]-+\n" + -" []-(s1!=r2)\n" + -" | []-TRUE: s2\n" + -" | []-TRUE: s3\n" + -" | [Leaf-]\n" + -" +-(s1=r2)\n" + -" []-(s2=r1)\n" + -" | []-(s3!=s2)\n" + -" | | [Leaf-]\n" + -" | +-(s3=s2)\n" + -" | [Leaf+]\n" + -" +-(s2r1)\n" + -" []-(s3!=r1)\n" + -" | [Leaf-]\n" + -" +-(s3=r1)\n" + -" [Leaf+]\n"; + SDT sdt = res.sdt(); + + final String expectedTree = "[r1, r2]-+\n" + + " []-(s1!=1.0[DOUBLE])\n" + + " | []-TRUE: s2\n" + + " | []-TRUE: s3\n" + + " | [Leaf-]\n" + + " +-(s1=1.0[DOUBLE])\n" + + " []-(s2=2.0[DOUBLE])\n" + + " | []-(s3!=s2)\n" + + " | | [Leaf-]\n" + + " | +-(s3=s2)\n" + + " | [Leaf+]\n" + + " +-(s2<2.0[DOUBLE])\n" + + " | []-(s3!=s2)\n" + + " | | [Leaf-]\n" + + " | +-(s3=s2)\n" + + " | [Leaf+]\n" + + " +-(s2>2.0[DOUBLE])\n" + + " []-(s3!=2.0[DOUBLE])\n" + + " | [Leaf-]\n" + + " +-(s3=2.0[DOUBLE])\n" + + " [Leaf+]\n"; String tree = sdt.toString(); Assert.assertEquals(tree, expectedTree); logger.log(Level.FINE, "final SDT: \n{0}", tree); - Parameter p1 = new Parameter(PriorityQueueSUL.DOUBLE_TYPE, 1); - Parameter p2 = new Parameter(PriorityQueueSUL.DOUBLE_TYPE, 2); - Parameter p3 = new Parameter(PriorityQueueSUL.DOUBLE_TYPE, 3); - - PIV testPiv = new PIV(); - testPiv.put(p1, new Register(PriorityQueueSUL.DOUBLE_TYPE, 1)); - testPiv.put(p2, new Register(PriorityQueueSUL.DOUBLE_TYPE, 2)); - testPiv.put(p3, new Register(PriorityQueueSUL.DOUBLE_TYPE, 3)); - Branching b = mto.getInitialBranching( - prefix, PriorityQueueSUL.OFFER, testPiv, sdt); + prefix, PriorityQueueSUL.OFFER, sdt); Assert.assertEquals(b.getBranches().size(), 2); logger.log(Level.FINE, "initial branching: \n{0}", b.getBranches().toString()); diff --git a/src/test/java/de/learnlib/ralib/theory/TestIneqOutputTree.java b/src/test/java/de/learnlib/ralib/theory/TestIneqOutputTree.java index a9a2912c..9cbc1202 100644 --- a/src/test/java/de/learnlib/ralib/theory/TestIneqOutputTree.java +++ b/src/test/java/de/learnlib/ralib/theory/TestIneqOutputTree.java @@ -98,7 +98,7 @@ public void testIneqEqTree() { logger.log(Level.FINE, "Suffix: {0}", symSuffix); TreeQueryResult res = mto.treeQuery(prefix, symSuffix); - SDT sdt = res.getSdt(); + SDT sdt = res.sdt(); final String expectedTree = "[r1]-+\n" + " []-(s1> TreeQueryResult res = treeOracle.treeQuery(prefix, symSuffix); - String expectedTree = "[r2, r1]-+\n" + -" []-(s1=r2)\n" + -" | []-(s2=r1)\n" + -" | | [Leaf+]\n" + -" | +-(s2!=r1)\n" + -" | [Leaf-]\n" + -" +-(s1!=r2)\n" + -" []-TRUE: s2\n" + -" [Leaf-]\n"; - - String tree = res.getSdt().toString(); + String expectedTree = "[r1, r2]-+\n" + + " []-(s1=1[userType])\n" + + " | []-(s2=0[passType])\n" + + " | | [Leaf+]\n" + + " | +-(s2!=0[passType])\n" + + " | [Leaf-]\n" + + " +-(s1!=1[userType])\n" + + " []-TRUE: s2\n" + + " [Leaf-]\n"; + + String tree = res.sdt().toString(); Assert.assertEquals(tree, expectedTree); logger.log(Level.FINE, "final SDT: \n{0}", tree); diff --git a/src/test/java/de/learnlib/ralib/theory/TestUniqueEqualityTheory.java b/src/test/java/de/learnlib/ralib/theory/TestUniqueEqualityTheory.java index d9e08c7d..24cd8969 100644 --- a/src/test/java/de/learnlib/ralib/theory/TestUniqueEqualityTheory.java +++ b/src/test/java/de/learnlib/ralib/theory/TestUniqueEqualityTheory.java @@ -59,7 +59,7 @@ public void testLoginExample1() { logger.log(Level.FINE, "Suffix: {0}", symSuffix); TreeQueryResult res = treeOracle.treeQuery(prefix, symSuffix); - SDT sdt = res.getSdt(); + SDT sdt = res.sdt(); String expectedTree = "[]-+\n" + " []-TRUE: s1\n" + @@ -72,14 +72,7 @@ public void testLoginExample1() { Assert.assertEquals(tree, expectedTree); logger.log(Level.FINE, "final SDT: \n{0}", tree); - SymbolicDataValue.Parameter p1 = new SymbolicDataValue.Parameter(T_UID, 1); - SymbolicDataValue.Parameter p2 = new SymbolicDataValue.Parameter(T_PWD, 2); - - PIV testPiv = new PIV(); - testPiv.put(p1, new SymbolicDataValue.Register(T_UID, 1)); - testPiv.put(p2, new SymbolicDataValue.Register(T_PWD, 2)); - - Branching b = treeOracle.getInitialBranching(prefix, I_LOGIN, testPiv, sdt); + Branching b = treeOracle.getInitialBranching(prefix, I_LOGIN, sdt); Assert.assertEquals(b.getBranches().size(), 1); logger.log(Level.FINE, "initial branching: \n{0}", b.getBranches().toString()); From a29591852277ca9b25030ae816001a16701856a9 Mon Sep 17 00:00:00 2001 From: Kostis Sagonas Date: Thu, 20 Mar 2025 11:53:25 +0100 Subject: [PATCH 22/26] Fix spelling error in SDTLogicOracle.java --- src/main/java/de/learnlib/ralib/oracles/SDTLogicOracle.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/de/learnlib/ralib/oracles/SDTLogicOracle.java b/src/main/java/de/learnlib/ralib/oracles/SDTLogicOracle.java index d0855788..d4783fd4 100644 --- a/src/main/java/de/learnlib/ralib/oracles/SDTLogicOracle.java +++ b/src/main/java/de/learnlib/ralib/oracles/SDTLogicOracle.java @@ -86,6 +86,6 @@ boolean areEquivalent(Expression guard1, Bijection remapping /** * Returns true if the word leads to an accepting leaf on the SDT. */ - // FIXME: this method is only used by tests, mayybe it can go? + // FIXME: this method is only used by tests, maybe it can go? boolean accepts(Word word, Word prefix, SDT sdt); } From 66f63edde2c92dca49a2a154fc8baa5207af6b5b Mon Sep 17 00:00:00 2001 From: Kostis Sagonas Date: Thu, 20 Mar 2025 11:55:42 +0100 Subject: [PATCH 23/26] Fix spelling error in RegisterAssignment.java --- src/main/java/de/learnlib/ralib/data/RegisterAssignment.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/de/learnlib/ralib/data/RegisterAssignment.java b/src/main/java/de/learnlib/ralib/data/RegisterAssignment.java index 374c1ecd..cf724aad 100644 --- a/src/main/java/de/learnlib/ralib/data/RegisterAssignment.java +++ b/src/main/java/de/learnlib/ralib/data/RegisterAssignment.java @@ -4,12 +4,11 @@ import java.util.Map; /** - * A register assigment models which data values + * A register assignment models which data values * of a prefix are stored in which registers. */ public class RegisterAssignment extends Mapping { - public RegisterValuation registerValuation() { RegisterValuation vars = new RegisterValuation(); for (Map.Entry e : this.entrySet()) { From d5b2aa9111d666d5754fd5dc705af0efcb6ebddd Mon Sep 17 00:00:00 2001 From: Falk Howar Date: Thu, 20 Mar 2025 22:03:17 +0100 Subject: [PATCH 24/26] fixed some bugs --- .../ralib/ceanalysis/PrefixFinder.java | 13 +- .../de/learnlib/ralib/data/Bijection.java | 1 - .../learnlib/ralib/data/SDTGuardElement.java | 4 +- .../ralib/data/util/RemappingIterator.java | 3 - src/main/java/de/learnlib/ralib/dt/DT.java | 7 +- src/main/java/de/learnlib/ralib/dt/DTHyp.java | 6 + .../de/learnlib/ralib/dt/DTInnerNode.java | 4 +- .../java/de/learnlib/ralib/dt/DTLeaf.java | 2 +- .../ralib/learning/AutomatonBuilder.java | 5 +- .../learning/CounterexampleAnalysis.java | 4 +- .../learnlib/ralib/learning/Hypothesis.java | 22 +- .../ralib/learning/IOAutomatonBuilder.java | 1 - .../ralib/learning/PrefixContainer.java | 4 +- .../ralib/learning/ralambda/RaLambda.java | 13 +- .../learnlib/ralib/learning/rastar/Cell.java | 4 +- .../ralib/learning/rastar/Component.java | 4 +- .../learning/rastar/ObservationTable.java | 4 +- .../ralib/learning/rastar/RaStar.java | 2 +- .../learnlib/ralib/learning/rastar/Row.java | 9 +- .../mto/MultiTheorySDTLogicOracle.java | 2 +- .../oracles/mto/MultiTheoryTreeOracle.java | 2 +- .../mto/OptimizedSymbolicSuffixBuilder.java | 5 +- .../ralib/smt/ReplacingValuesVisitor.java | 12 +- .../java/de/learnlib/ralib/smt/SMTUtil.java | 7 + .../ralib/theory/IntervalGuardUtil.java | 1 - .../de/learnlib/ralib/theory/Memorables.java | 10 +- .../java/de/learnlib/ralib/theory/SDT.java | 3 - .../de/learnlib/ralib/theory/SDTGuard.java | 1 - .../de/learnlib/ralib/theory/SDTLeaf.java | 1 - .../ralib/theory/equality/EqualityTheory.java | 2 +- .../inequality/InequalityTheoryWithEq.java | 5 +- .../theories/DoubleInequalityTheory.java | 4 +- .../de/learnlib/ralib/dt/DTInnerNodeTest.java | 2 +- .../java/de/learnlib/ralib/dt/DTTest.java | 2 +- .../ralib/dt/RegisterConsistencyTest.java | 2 +- .../ralib/example/sdts/LoginExampleSDT.java | 1 - .../learning/ralambda/LearnRepeaterTest.java | 1 + .../ralib/learning/ralambda/TestSymmetry.java | 7 +- .../ralib/learning/rastar/CellTest.java | 3 +- .../learning/rastar/LearnRepeaterTest.java | 18 +- .../ralib/learning/rastar/RowTest.java | 6 +- .../OptimizedSymbolicSuffixBuilderTest.java | 219 ++++++++++-------- .../oracles/mto/SecondSDTBranchingTest.java | 2 +- .../oracles/mto/UntypedBranchingTest.java | 2 +- .../ralib/theory/SDTEquivalenceTest.java | 3 +- 45 files changed, 231 insertions(+), 204 deletions(-) diff --git a/src/main/java/de/learnlib/ralib/ceanalysis/PrefixFinder.java b/src/main/java/de/learnlib/ralib/ceanalysis/PrefixFinder.java index 1cfb1ba9..ef2f8671 100644 --- a/src/main/java/de/learnlib/ralib/ceanalysis/PrefixFinder.java +++ b/src/main/java/de/learnlib/ralib/ceanalysis/PrefixFinder.java @@ -1,20 +1,16 @@ package de.learnlib.ralib.ceanalysis; -import java.util.LinkedHashMap; -import java.util.LinkedHashSet; -import java.util.Map; -import java.util.Set; +import java.util.*; -import de.learnlib.ralib.data.*; -import de.learnlib.ralib.data.util.RemappingIterator; -import de.learnlib.ralib.theory.Memorables; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import de.learnlib.logging.Category; import de.learnlib.query.DefaultQuery; +import de.learnlib.ralib.data.*; import de.learnlib.ralib.data.SymbolicDataValue.Parameter; import de.learnlib.ralib.data.SymbolicDataValue.SuffixValue; +import de.learnlib.ralib.data.util.RemappingIterator; import de.learnlib.ralib.data.util.SymbolicDataValueGenerator.ParameterGenerator; import de.learnlib.ralib.data.util.SymbolicDataValueGenerator.SuffixValueGenerator; import de.learnlib.ralib.learning.*; @@ -24,6 +20,7 @@ import de.learnlib.ralib.oracles.TreeQueryResult; import de.learnlib.ralib.oracles.mto.SymbolicSuffixRestrictionBuilder; import de.learnlib.ralib.smt.SMTUtil; +import de.learnlib.ralib.theory.Memorables; import de.learnlib.ralib.theory.SDT; import de.learnlib.ralib.words.PSymbolInstance; import de.learnlib.ralib.words.ParameterizedSymbol; @@ -124,7 +121,7 @@ private int findIndex(Word ce) { // remapping // RemappingIterator iterator = new RemappingIterator<>( - uAlphaResult.sdt().getDataValues(), uPrimeResult.sdt().getDataValues()); + uPrimeResult.sdt().getDataValues(), uAlphaResult.sdt().getDataValues()); for (Bijection m : iterator) { if (uAlphaResult.sdt().isEquivalent(uPrimeResult.sdt(), m)) { diff --git a/src/main/java/de/learnlib/ralib/data/Bijection.java b/src/main/java/de/learnlib/ralib/data/Bijection.java index 68112733..ab7cf356 100644 --- a/src/main/java/de/learnlib/ralib/data/Bijection.java +++ b/src/main/java/de/learnlib/ralib/data/Bijection.java @@ -2,7 +2,6 @@ import java.util.*; -import de.learnlib.ralib.data.SymbolicDataValue.Register; public class Bijection implements Map { diff --git a/src/main/java/de/learnlib/ralib/data/SDTGuardElement.java b/src/main/java/de/learnlib/ralib/data/SDTGuardElement.java index d808a989..8d7eae90 100644 --- a/src/main/java/de/learnlib/ralib/data/SDTGuardElement.java +++ b/src/main/java/de/learnlib/ralib/data/SDTGuardElement.java @@ -1,9 +1,9 @@ package de.learnlib.ralib.data; -import gov.nasa.jpf.constraints.api.Expression; - import java.math.BigDecimal; +import gov.nasa.jpf.constraints.api.Expression; + public interface SDTGuardElement extends TypedValue { static boolean isConstant(SDTGuardElement e) { diff --git a/src/main/java/de/learnlib/ralib/data/util/RemappingIterator.java b/src/main/java/de/learnlib/ralib/data/util/RemappingIterator.java index 10d87bd1..03c7333e 100644 --- a/src/main/java/de/learnlib/ralib/data/util/RemappingIterator.java +++ b/src/main/java/de/learnlib/ralib/data/util/RemappingIterator.java @@ -2,13 +2,10 @@ import java.util.Collection; import java.util.Iterator; -import java.util.Set; import de.learnlib.ralib.data.Bijection; import de.learnlib.ralib.data.Mapping; -import de.learnlib.ralib.data.SymbolicDataValue.Register; import de.learnlib.ralib.data.TypedValue; -import de.learnlib.ralib.data.VarMapping; public class RemappingIterator implements Iterable>, Iterator> { diff --git a/src/main/java/de/learnlib/ralib/dt/DT.java b/src/main/java/de/learnlib/ralib/dt/DT.java index 009039a0..72b1df02 100644 --- a/src/main/java/de/learnlib/ralib/dt/DT.java +++ b/src/main/java/de/learnlib/ralib/dt/DT.java @@ -12,9 +12,9 @@ import java.util.Set; import java.util.stream.Collectors; -import de.learnlib.ralib.data.Bijection; import org.apache.commons.lang3.tuple.Pair; +import de.learnlib.ralib.data.Bijection; import de.learnlib.ralib.data.Constants; import de.learnlib.ralib.data.DataType; import de.learnlib.ralib.data.SymbolicDataValue.SuffixValue; @@ -83,6 +83,7 @@ public DT(DT dt) { @Override public DTLeaf sift(Word prefix, boolean add) { + //System.out.println("SIFT: " + prefix + ", add: " + add); DTLeaf leaf = getLeaf(prefix); if (leaf != null) { return leaf; @@ -145,6 +146,7 @@ private DTLeaf sift(MappedPrefix mp, DTInnerNode from, boolean add) { PathResult r = PathResult.computePathResult(oracle, mp, inner.getSuffixes(), ioMode); assert !mp.getTQRs().containsKey(suffix); mp.addTQR(suffix, r.getSDTforSuffix(suffix)); + mp.updateRemapping(Bijection.identity(mp.memorableValues())); leaf.setAccessSequence(mp); DTBranch branch = new DTBranch(leaf, r); inner.addBranch(branch); @@ -192,6 +194,7 @@ public void split(Word prefix, SymbolicSuffix suffix, DTLeaf le SDT tqr = r.getSDTforSuffix(suffix); assert !mp.getTQRs().containsKey(suffix); mp.addTQR(suffix, tqr); + mp.updateRemapping(Bijection.identity(mp.memorableValues())); DTBranch newBranch = new DTBranch(newLeaf, r); node.addBranch(newBranch); @@ -205,6 +208,7 @@ public void split(Word prefix, SymbolicSuffix suffix, DTLeaf le PathResult r2 = PathResult.computePathResult(oracle, leaf.getPrimePrefix(), node.getSuffixes(), ioMode); SDT tqr2 = r2.getSDTforSuffix(suffix); leaf.getPrimePrefix().addTQR(suffix, tqr2); + leaf.getPrimePrefix().updateRemapping(Bijection.identity(leaf.getPrimePrefix().memorableValues())); // assert !tqr.getSdt().isEquivalent(tqr2.getSdt(), new VarMapping<>()); DTBranch b = new DTBranch(leaf, r2); leaf.setParent(node); @@ -234,6 +238,7 @@ public void addSuffix(SymbolicSuffix suffix, DTLeaf leaf) { SDT tqr = r.getSDTforSuffix(suffix); assert !leaf.getPrimePrefix().getTQRs().containsKey(suffix); leaf.getPrimePrefix().addTQR(suffix, tqr); + leaf.getPrimePrefix().updateRemapping(Bijection.identity(leaf.getPrimePrefix().memorableValues())); DTBranch newBranch = new DTBranch(leaf, r); node.addBranch(newBranch); diff --git a/src/main/java/de/learnlib/ralib/dt/DTHyp.java b/src/main/java/de/learnlib/ralib/dt/DTHyp.java index c0c60832..30df87ae 100644 --- a/src/main/java/de/learnlib/ralib/dt/DTHyp.java +++ b/src/main/java/de/learnlib/ralib/dt/DTHyp.java @@ -8,6 +8,7 @@ import de.learnlib.ralib.data.Constants; import de.learnlib.ralib.data.ParameterValuation; +import de.learnlib.ralib.data.RegisterAssignment; import de.learnlib.ralib.data.RegisterValuation; import de.learnlib.ralib.learning.Hypothesis; import de.learnlib.ralib.oracles.Branching; @@ -87,9 +88,12 @@ protected List> getDTTransitions(Word dw) return null; } + RegisterAssignment ra = current.getPrimePrefix().getAssignment(); + boolean found = false; for (Map.Entry, Expression> e : candidates.entrySet()) { Expression g = e.getValue(); + g = SMTUtil.valsToRegisters(g, ra); if (g.evaluateSMT(SMTUtil.compose(vars, pars, this.constants))) { Word w = e.getKey(); vars = current.getAssignment(w, dt.getLeaf(w)).compute(vars, pars, this.constants); @@ -110,6 +114,7 @@ protected List> getDTTransitions(Word dw) @Override public Word transformTransitionSequence(Word word) { List> tseq = getDTTransitions(word); + assert tseq.size() == word.size(); if (tseq == null) return dt.getLeaf(word).getAccessSequence(); return tseq.get(tseq.size() - 1); @@ -126,6 +131,7 @@ public Word transformTransitionSequence(Word w if (leaf.getAccessSequence().equals(location)) { Word tseq = transformTransitionSequence(word); + //System.out.println("TSEQ: " + tseq); if (tseq == null) { ParameterizedSymbol ps = suffix.firstSymbol().getBaseSymbol(); for (Word p : leaf.getBranching(ps).getBranches().keySet()) { diff --git a/src/main/java/de/learnlib/ralib/dt/DTInnerNode.java b/src/main/java/de/learnlib/ralib/dt/DTInnerNode.java index 4ad85054..038c5b07 100644 --- a/src/main/java/de/learnlib/ralib/dt/DTInnerNode.java +++ b/src/main/java/de/learnlib/ralib/dt/DTInnerNode.java @@ -2,11 +2,11 @@ import java.util.*; -import de.learnlib.ralib.data.Bijection; -import de.learnlib.ralib.data.DataValue; import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; +import de.learnlib.ralib.data.Bijection; +import de.learnlib.ralib.data.DataValue; import de.learnlib.ralib.learning.SymbolicSuffix; import de.learnlib.ralib.oracles.TreeOracle; diff --git a/src/main/java/de/learnlib/ralib/dt/DTLeaf.java b/src/main/java/de/learnlib/ralib/dt/DTLeaf.java index 57bc6198..c41d1be4 100644 --- a/src/main/java/de/learnlib/ralib/dt/DTLeaf.java +++ b/src/main/java/de/learnlib/ralib/dt/DTLeaf.java @@ -8,13 +8,13 @@ import com.google.common.collect.Iterators; import com.google.common.collect.Sets; -import de.learnlib.ralib.learning.AutomatonBuilder; import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; import de.learnlib.ralib.automata.Assignment; import de.learnlib.ralib.data.*; import de.learnlib.ralib.data.SymbolicDataValue.Register; +import de.learnlib.ralib.learning.AutomatonBuilder; import de.learnlib.ralib.learning.LocationComponent; import de.learnlib.ralib.learning.PrefixContainer; import de.learnlib.ralib.learning.SymbolicSuffix; diff --git a/src/main/java/de/learnlib/ralib/learning/AutomatonBuilder.java b/src/main/java/de/learnlib/ralib/learning/AutomatonBuilder.java index 3207e0e1..6494baa2 100644 --- a/src/main/java/de/learnlib/ralib/learning/AutomatonBuilder.java +++ b/src/main/java/de/learnlib/ralib/learning/AutomatonBuilder.java @@ -20,9 +20,6 @@ import java.util.Map; import java.util.Map.Entry; -import de.learnlib.ralib.data.*; -import de.learnlib.ralib.smt.ReplacingValuesVisitor; -import gov.nasa.jpf.constraints.util.ExpressionUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -30,12 +27,14 @@ import de.learnlib.ralib.automata.Assignment; import de.learnlib.ralib.automata.RALocation; import de.learnlib.ralib.automata.Transition; +import de.learnlib.ralib.data.*; import de.learnlib.ralib.data.SymbolicDataValue.Parameter; import de.learnlib.ralib.data.SymbolicDataValue.Register; import de.learnlib.ralib.dt.DT; import de.learnlib.ralib.dt.DTHyp; import de.learnlib.ralib.learning.rastar.RaStar; import de.learnlib.ralib.oracles.Branching; +import de.learnlib.ralib.smt.ReplacingValuesVisitor; import de.learnlib.ralib.smt.SMTUtil; import de.learnlib.ralib.words.DataWords; import de.learnlib.ralib.words.PSymbolInstance; diff --git a/src/main/java/de/learnlib/ralib/learning/CounterexampleAnalysis.java b/src/main/java/de/learnlib/ralib/learning/CounterexampleAnalysis.java index 37d0f3cd..7469679e 100644 --- a/src/main/java/de/learnlib/ralib/learning/CounterexampleAnalysis.java +++ b/src/main/java/de/learnlib/ralib/learning/CounterexampleAnalysis.java @@ -20,11 +20,11 @@ import java.util.Map; import java.util.Set; -import de.learnlib.ralib.data.DataValue; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import de.learnlib.ralib.data.Constants; +import de.learnlib.ralib.data.DataValue; import de.learnlib.ralib.data.Mapping; import de.learnlib.ralib.learning.rastar.CEAnalysisResult; import de.learnlib.ralib.oracles.Branching; @@ -163,7 +163,7 @@ private boolean hypRefinesTransitions(Word prefix, //System.out.println("Branching Hyp:"); for (Map.Entry, Expression> e : branchHyp.getBranches().entrySet()) { - System.out.println(e.getKey() + " -> " + e.getValue()); + //System.out.println(e.getKey() + " -> " + e.getValue()); } //System.out.println("Branching Sys:"); for (Map.Entry, Expression> e : branchSul.getBranches().entrySet()) { diff --git a/src/main/java/de/learnlib/ralib/learning/Hypothesis.java b/src/main/java/de/learnlib/ralib/learning/Hypothesis.java index 27c99097..32a02861 100644 --- a/src/main/java/de/learnlib/ralib/learning/Hypothesis.java +++ b/src/main/java/de/learnlib/ralib/learning/Hypothesis.java @@ -27,12 +27,8 @@ import de.learnlib.ralib.automata.RALocation; import de.learnlib.ralib.automata.Transition; import de.learnlib.ralib.automata.TransitionSequenceTransformer; -import de.learnlib.ralib.data.Constants; -import de.learnlib.ralib.data.ParameterValuation; -import de.learnlib.ralib.data.RegisterValuation; -import de.learnlib.ralib.data.SymbolicDataValue; +import de.learnlib.ralib.data.*; import de.learnlib.ralib.data.SymbolicDataValue.Register; -import de.learnlib.ralib.data.VarMapping; import de.learnlib.ralib.oracles.Branching; import de.learnlib.ralib.smt.SMTUtil; import de.learnlib.ralib.words.PSymbolInstance; @@ -93,8 +89,8 @@ public boolean isAccessSequence(Word word) { public Word transformTransitionSequence(Word word) { List tseq = getTransitions(word); //System.out.println("TSEQ: " + tseq); - if (tseq == null) - return null; + assert tseq.size() == word.length(); + if (tseq == null) return null; Transition last = tseq.get(tseq.size() -1); return transitionSequences.get(last); } @@ -112,9 +108,15 @@ public Word branchWithSameGuard(Word word, Bra for (Map.Entry, Expression> e : branching.getBranches().entrySet()) { if (e.getKey().lastSymbol().getBaseSymbol().equals(ps)) { - if (e.getValue().evaluateSMT(SMTUtil.compose(vars, pval, constants))) { - return e.getKey(); - } + Word prefix = e.getKey().prefix(e.getKey().size()-1); + RegisterValuation varsRef = getTransitionsAndValuations(prefix).get(getTransitionsAndValuations(prefix).size()-1).getSecond(); + //System.out.println(varsRef); + RegisterAssignment ra = new RegisterAssignment(); + varsRef.forEach((key, value) -> ra.put(value, key)); + Expression guard = SMTUtil.valsToRegisters(e.getValue(), ra); + if (guard.evaluateSMT(SMTUtil.compose(vars, pval, constants))) { + return e.getKey(); + } } } return null; diff --git a/src/main/java/de/learnlib/ralib/learning/IOAutomatonBuilder.java b/src/main/java/de/learnlib/ralib/learning/IOAutomatonBuilder.java index 0eabc974..ab8cfd65 100644 --- a/src/main/java/de/learnlib/ralib/learning/IOAutomatonBuilder.java +++ b/src/main/java/de/learnlib/ralib/learning/IOAutomatonBuilder.java @@ -40,7 +40,6 @@ import de.learnlib.ralib.words.PSymbolInstance; import de.learnlib.ralib.words.ParameterizedSymbol; import gov.nasa.jpf.constraints.api.Expression; -import gov.nasa.jpf.constraints.api.Variable; import gov.nasa.jpf.constraints.expressions.NumericBooleanExpression; import gov.nasa.jpf.constraints.expressions.NumericComparator; import gov.nasa.jpf.constraints.expressions.PropositionalCompound; diff --git a/src/main/java/de/learnlib/ralib/learning/PrefixContainer.java b/src/main/java/de/learnlib/ralib/learning/PrefixContainer.java index 7ef006cc..595ca9c9 100644 --- a/src/main/java/de/learnlib/ralib/learning/PrefixContainer.java +++ b/src/main/java/de/learnlib/ralib/learning/PrefixContainer.java @@ -1,12 +1,10 @@ package de.learnlib.ralib.learning; + import de.learnlib.ralib.data.*; import de.learnlib.ralib.words.PSymbolInstance; -import gov.nasa.jpf.constraints.expressions.Constant; import net.automatalib.word.Word; -import java.util.Map; - public interface PrefixContainer { Word getPrefix(); RegisterAssignment getAssignment(); diff --git a/src/main/java/de/learnlib/ralib/learning/ralambda/RaLambda.java b/src/main/java/de/learnlib/ralib/learning/ralambda/RaLambda.java index 8cb547df..6c49f4f6 100644 --- a/src/main/java/de/learnlib/ralib/learning/ralambda/RaLambda.java +++ b/src/main/java/de/learnlib/ralib/learning/ralambda/RaLambda.java @@ -7,13 +7,13 @@ import java.util.LinkedList; import java.util.Map; -import de.learnlib.ralib.data.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import de.learnlib.logging.Category; import de.learnlib.query.DefaultQuery; import de.learnlib.ralib.ceanalysis.PrefixFinder; +import de.learnlib.ralib.data.*; import de.learnlib.ralib.dt.DT; import de.learnlib.ralib.dt.DTHyp; import de.learnlib.ralib.dt.DTLeaf; @@ -154,7 +154,7 @@ private boolean analyzeCounterExample() { if (candidateCEs.isEmpty()) { prefixFinder = null; if (counterexamples.isEmpty()) { - assert noShortPrefixes() && !dt.isMissingParameter(); + assert noShortPrefixes() || !dt.isMissingParameter(); return false; } else { @@ -179,6 +179,7 @@ private boolean analyzeCounterExample() { ce = ces.poll(); boolean hypce = hyp.accepts(ce.getInput()); boolean sulce = ce.getOutput(); + //System.out.println("ce: " + ce + " - " + sulce + " vs. " + hypce); foundce = hypce != sulce; } @@ -194,6 +195,7 @@ private boolean analyzeCounterExample() { Word ceWord = ce.getInput(); CEAnalysisResult result = prefixFinder.analyzeCounterexample(ceWord); Word transition = result.getPrefix(); // u alpha(d) + //System.out.println("new prefix: " + transition); for (DefaultQuery q : prefixFinder.getCounterExamples()) { if (!candidateCEs.contains(q)) @@ -233,7 +235,7 @@ private boolean analyzeCounterExample() { if (noShortPrefixes() && !dt.isMissingParameter()) { buildNewHypothesis(); } - + //System.out.println(hyp); return true; } @@ -447,8 +449,9 @@ private SymbolicSuffix distinguishingSuffix(Word wa, DTLeaf ca, private boolean noShortPrefixes() { for (DTLeaf l : dt.getLeaves()) { - if (!l.getShortPrefixes().isEmpty()) - return false; + if (!l.getShortPrefixes().isEmpty()) { + return false; + } } return true; } diff --git a/src/main/java/de/learnlib/ralib/learning/rastar/Cell.java b/src/main/java/de/learnlib/ralib/learning/rastar/Cell.java index df25794c..7b765264 100644 --- a/src/main/java/de/learnlib/ralib/learning/rastar/Cell.java +++ b/src/main/java/de/learnlib/ralib/learning/rastar/Cell.java @@ -16,6 +16,8 @@ */ package de.learnlib.ralib.learning.rastar; +import java.util.List; + import de.learnlib.ralib.data.DataValue; import de.learnlib.ralib.data.SDTRelabeling; import de.learnlib.ralib.learning.SymbolicSuffix; @@ -26,8 +28,6 @@ import de.learnlib.ralib.words.PSymbolInstance; import net.automatalib.word.Word; -import java.util.List; - /** * A cell of an observation table. diff --git a/src/main/java/de/learnlib/ralib/learning/rastar/Component.java b/src/main/java/de/learnlib/ralib/learning/rastar/Component.java index faf0f335..61917563 100644 --- a/src/main/java/de/learnlib/ralib/learning/rastar/Component.java +++ b/src/main/java/de/learnlib/ralib/learning/rastar/Component.java @@ -19,12 +19,12 @@ import java.util.*; import java.util.Map.Entry; -import de.learnlib.ralib.data.*; -import de.learnlib.ralib.data.util.RemappingIterator; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import de.learnlib.logging.Category; +import de.learnlib.ralib.data.*; +import de.learnlib.ralib.data.util.RemappingIterator; import de.learnlib.ralib.learning.LocationComponent; import de.learnlib.ralib.learning.PrefixContainer; import de.learnlib.ralib.learning.SymbolicSuffix; diff --git a/src/main/java/de/learnlib/ralib/learning/rastar/ObservationTable.java b/src/main/java/de/learnlib/ralib/learning/rastar/ObservationTable.java index 9368544a..4bc50f70 100644 --- a/src/main/java/de/learnlib/ralib/learning/rastar/ObservationTable.java +++ b/src/main/java/de/learnlib/ralib/learning/rastar/ObservationTable.java @@ -135,7 +135,7 @@ private boolean checkVariableConsistency() { private void processNewSuffix() { SymbolicSuffix suffix = newSuffixes.poll(); LOGGER.info(Category.EVENT, "Adding suffix to obs: {}", suffix); - System.out.println("Adding suffix to obs: " + suffix); + //System.out.println("Adding suffix to obs: " + suffix); suffixes.add(suffix); for (Component c : components.values()) { c.addSuffix(suffix, oracle); @@ -157,7 +157,7 @@ private void processNewPrefix() { private void processNewComponent() { Component c = newComponents.poll(); - System.out.println("Adding component to obs: " + c); + //System.out.println("Adding component to obs: " + c); components.put(c.getAccessSequence(), c); c.start(oracle, inputs); } diff --git a/src/main/java/de/learnlib/ralib/learning/rastar/RaStar.java b/src/main/java/de/learnlib/ralib/learning/rastar/RaStar.java index 2d1efc87..fa420f25 100644 --- a/src/main/java/de/learnlib/ralib/learning/rastar/RaStar.java +++ b/src/main/java/de/learnlib/ralib/learning/rastar/RaStar.java @@ -126,7 +126,7 @@ public void learn() { hyp = ab.toRegisterAutomaton(); //FIXME: the default logging appender cannot log models and data structures - System.out.println(hyp.toString()); + //System.out.println(hyp.toString()); LOGGER.info(Category.MODEL, "{}", hyp); } while (analyzeCounterExample()); diff --git a/src/main/java/de/learnlib/ralib/learning/rastar/Row.java b/src/main/java/de/learnlib/ralib/learning/rastar/Row.java index 1df3d6c3..1a5c0c97 100644 --- a/src/main/java/de/learnlib/ralib/learning/rastar/Row.java +++ b/src/main/java/de/learnlib/ralib/learning/rastar/Row.java @@ -19,20 +19,17 @@ import java.util.*; import java.util.Map.Entry; -import de.learnlib.ralib.data.*; -import de.learnlib.ralib.data.util.SymbolicDataValueGenerator; -import de.learnlib.ralib.theory.Memorables; -import gov.nasa.jpf.constraints.expressions.Constant; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import de.learnlib.logging.Category; -import de.learnlib.ralib.data.SymbolicDataValue.Parameter; -import de.learnlib.ralib.data.SymbolicDataValue.Register; +import de.learnlib.ralib.data.*; +import de.learnlib.ralib.data.util.SymbolicDataValueGenerator; import de.learnlib.ralib.data.util.SymbolicDataValueGenerator.RegisterGenerator; import de.learnlib.ralib.learning.PrefixContainer; import de.learnlib.ralib.learning.SymbolicSuffix; import de.learnlib.ralib.oracles.TreeOracle; +import de.learnlib.ralib.theory.Memorables; import de.learnlib.ralib.theory.SDT; import de.learnlib.ralib.words.InputSymbol; import de.learnlib.ralib.words.OutputSymbol; diff --git a/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheorySDTLogicOracle.java b/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheorySDTLogicOracle.java index ac44f4a8..a6a23232 100644 --- a/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheorySDTLogicOracle.java +++ b/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheorySDTLogicOracle.java @@ -18,10 +18,10 @@ import java.util.Map; -import de.learnlib.ralib.data.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import de.learnlib.ralib.data.*; import de.learnlib.ralib.data.SymbolicDataValue.Parameter; import de.learnlib.ralib.data.SymbolicDataValue.Register; import de.learnlib.ralib.data.SymbolicDataValue.SuffixValue; diff --git a/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheoryTreeOracle.java b/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheoryTreeOracle.java index 66fa9d00..01f10f7a 100644 --- a/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheoryTreeOracle.java +++ b/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheoryTreeOracle.java @@ -399,7 +399,7 @@ private Mapping buildValuation(SuffixValuation suf @Override public Map, Boolean> instantiate(Word prefix, SymbolicSuffix suffix, SDT sdt) { - assert (sdt instanceof SDT); + Map, Boolean> words = new LinkedHashMap, Boolean>(); instantiate(words, prefix, suffix, sdt, 0, 0, new SuffixValuation(), new ParameterGenerator(), new SuffixValuation(), new ParameterGenerator()); diff --git a/src/main/java/de/learnlib/ralib/oracles/mto/OptimizedSymbolicSuffixBuilder.java b/src/main/java/de/learnlib/ralib/oracles/mto/OptimizedSymbolicSuffixBuilder.java index 46c21ab8..c8a48567 100644 --- a/src/main/java/de/learnlib/ralib/oracles/mto/OptimizedSymbolicSuffixBuilder.java +++ b/src/main/java/de/learnlib/ralib/oracles/mto/OptimizedSymbolicSuffixBuilder.java @@ -3,8 +3,6 @@ import java.util.*; import de.learnlib.ralib.data.*; -import de.learnlib.ralib.data.SymbolicDataValue.Parameter; -import de.learnlib.ralib.data.SymbolicDataValue.Register; import de.learnlib.ralib.data.SymbolicDataValue.SuffixValue; import de.learnlib.ralib.data.util.SymbolicDataValueGenerator; import de.learnlib.ralib.learning.SymbolicSuffix; @@ -42,7 +40,6 @@ public OptimizedSymbolicSuffixBuilder(Constants consts, SymbolicSuffixRestrictio * * @param prefix (last symbol will be prepended to suffix) * @param sdt - * @param piv * @param suffix * @param registers - a list of registers that must be revealed by the suffix * @return a new suffix formed by prepending suffix with the last symbol of prefix @@ -96,7 +93,7 @@ SymbolicSuffix extendSuffix(Word prefix, List sdtPath restrictions.put(sv, actionSuffix.getRestriction(sv)); } - List subVals = Arrays.stream(DataWords.valsOf(sub)).toList(); + List subVals = Arrays.stream(DataWords.valsOf(prefix)).toList(); SDTRelabeling renaming = new SDTRelabeling(); sdtPath.stream() .map(SDTGuard::getRegisters) diff --git a/src/main/java/de/learnlib/ralib/smt/ReplacingValuesVisitor.java b/src/main/java/de/learnlib/ralib/smt/ReplacingValuesVisitor.java index 80ddaa76..38f41398 100644 --- a/src/main/java/de/learnlib/ralib/smt/ReplacingValuesVisitor.java +++ b/src/main/java/de/learnlib/ralib/smt/ReplacingValuesVisitor.java @@ -1,14 +1,13 @@ package de.learnlib.ralib.smt; +import java.util.HashMap; +import java.util.Map; + import de.learnlib.ralib.data.*; import gov.nasa.jpf.constraints.api.Expression; -import gov.nasa.jpf.constraints.api.Variable; import gov.nasa.jpf.constraints.expressions.Constant; import gov.nasa.jpf.constraints.util.DuplicatingVisitor; -import java.util.HashMap; -import java.util.Map; - public class ReplacingValuesVisitor extends DuplicatingVisitor, ? extends Expression>> { @@ -24,6 +23,11 @@ public Expression apply(Expression expr, Mapping return visit(expr, map).requireAs(expr.getType()); } + public Expression applyRegs(Expression expr, Mapping, SymbolicDataValue.Register> rename) { + Map, Expression> map = new HashMap<>(rename); + return visit(expr, map).requireAs(expr.getType()); + } + public Expression apply(Expression expr, RegisterAssignment rename) { Map, Expression> map = new HashMap<>(rename); return visit(expr, map).requireAs(expr.getType()); diff --git a/src/main/java/de/learnlib/ralib/smt/SMTUtil.java b/src/main/java/de/learnlib/ralib/smt/SMTUtil.java index a12c4f7b..8edca9be 100644 --- a/src/main/java/de/learnlib/ralib/smt/SMTUtil.java +++ b/src/main/java/de/learnlib/ralib/smt/SMTUtil.java @@ -48,6 +48,13 @@ public static Expression renameVals(Expression expr, Bijection return replacer.apply(expr, map); } + public static Expression valsToRegisters(Expression expr, RegisterAssignment ra) { + final ReplacingValuesVisitor replacer = new ReplacingValuesVisitor(); + Mapping map = new Mapping<>(); + map.putAll(ra); + return replacer.applyRegs(expr, map); + } + public static Expression toExpression(Expression expr, Mapping val) { Map map = new HashMap<>(); //Expression guardExpr = toExpression(expr, map); diff --git a/src/main/java/de/learnlib/ralib/theory/IntervalGuardUtil.java b/src/main/java/de/learnlib/ralib/theory/IntervalGuardUtil.java index e48df548..e51f3b9c 100644 --- a/src/main/java/de/learnlib/ralib/theory/IntervalGuardUtil.java +++ b/src/main/java/de/learnlib/ralib/theory/IntervalGuardUtil.java @@ -22,7 +22,6 @@ import java.util.Set; import de.learnlib.ralib.data.SDTGuardElement; -import de.learnlib.ralib.data.SymbolicDataValue; /** * diff --git a/src/main/java/de/learnlib/ralib/theory/Memorables.java b/src/main/java/de/learnlib/ralib/theory/Memorables.java index e999e6de..9569ab71 100644 --- a/src/main/java/de/learnlib/ralib/theory/Memorables.java +++ b/src/main/java/de/learnlib/ralib/theory/Memorables.java @@ -1,16 +1,16 @@ package de.learnlib.ralib.theory; +import java.util.Arrays; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + import de.learnlib.ralib.data.DataType; import de.learnlib.ralib.data.DataValue; import de.learnlib.ralib.data.RegisterAssignment; import de.learnlib.ralib.data.SDTRelabeling; import de.learnlib.ralib.data.util.SymbolicDataValueGenerator; -import java.util.Arrays; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; - public class Memorables { public static List relabel(List values, SDTRelabeling relabeling) { diff --git a/src/main/java/de/learnlib/ralib/theory/SDT.java b/src/main/java/de/learnlib/ralib/theory/SDT.java index e47e3aba..e3ae0c4b 100644 --- a/src/main/java/de/learnlib/ralib/theory/SDT.java +++ b/src/main/java/de/learnlib/ralib/theory/SDT.java @@ -25,11 +25,8 @@ import de.learnlib.ralib.data.util.SymbolicDataValueGenerator; import de.learnlib.ralib.smt.ConstraintSolver; import de.learnlib.ralib.smt.SMTUtil; -import de.learnlib.ralib.words.DataWords; -import de.learnlib.ralib.words.PSymbolInstance; import gov.nasa.jpf.constraints.api.Expression; import gov.nasa.jpf.constraints.util.ExpressionUtil; -import net.automatalib.word.Word; /** * Implementation of Symbolic Decision Trees. diff --git a/src/main/java/de/learnlib/ralib/theory/SDTGuard.java b/src/main/java/de/learnlib/ralib/theory/SDTGuard.java index c8c61b6b..250555e8 100644 --- a/src/main/java/de/learnlib/ralib/theory/SDTGuard.java +++ b/src/main/java/de/learnlib/ralib/theory/SDTGuard.java @@ -22,7 +22,6 @@ import de.learnlib.ralib.data.SDTRelabeling; import de.learnlib.ralib.data.SymbolicDataValue; import de.learnlib.ralib.data.SymbolicDataValue.SuffixValue; -import de.learnlib.ralib.data.VarMapping; import gov.nasa.jpf.constraints.api.Expression; import gov.nasa.jpf.constraints.expressions.NumericBooleanExpression; import gov.nasa.jpf.constraints.expressions.NumericComparator; diff --git a/src/main/java/de/learnlib/ralib/theory/SDTLeaf.java b/src/main/java/de/learnlib/ralib/theory/SDTLeaf.java index 5cd367ad..97778b91 100644 --- a/src/main/java/de/learnlib/ralib/theory/SDTLeaf.java +++ b/src/main/java/de/learnlib/ralib/theory/SDTLeaf.java @@ -26,7 +26,6 @@ import de.learnlib.ralib.data.SDTGuardElement; import de.learnlib.ralib.data.SDTRelabeling; import de.learnlib.ralib.data.SymbolicDataValue; -import de.learnlib.ralib.data.VarMapping; /** * Leaf implementation of an SDT. diff --git a/src/main/java/de/learnlib/ralib/theory/equality/EqualityTheory.java b/src/main/java/de/learnlib/ralib/theory/equality/EqualityTheory.java index 1fbe1f7c..4ea791d3 100644 --- a/src/main/java/de/learnlib/ralib/theory/equality/EqualityTheory.java +++ b/src/main/java/de/learnlib/ralib/theory/equality/EqualityTheory.java @@ -28,10 +28,10 @@ import java.util.Map; import java.util.Set; -import de.learnlib.ralib.data.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import de.learnlib.ralib.data.*; import de.learnlib.ralib.data.SymbolicDataValue.Constant; import de.learnlib.ralib.data.SymbolicDataValue.Parameter; import de.learnlib.ralib.data.SymbolicDataValue.Register; diff --git a/src/main/java/de/learnlib/ralib/theory/inequality/InequalityTheoryWithEq.java b/src/main/java/de/learnlib/ralib/theory/inequality/InequalityTheoryWithEq.java index 3fcf0337..6831a040 100644 --- a/src/main/java/de/learnlib/ralib/theory/inequality/InequalityTheoryWithEq.java +++ b/src/main/java/de/learnlib/ralib/theory/inequality/InequalityTheoryWithEq.java @@ -16,7 +16,6 @@ */ package de.learnlib.ralib.theory.inequality; -import java.math.BigDecimal; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -862,11 +861,11 @@ public DataValue instantiate( // LOGGER.trace("p: " + p.toString()); returnThis = (DataValue) ereg; } else if (SDTGuardElement.isSuffixValue(ereg)) { - Parameter p = new Parameter(type, ((SuffixValue)ereg).getId()); - returnThis = pval.get(p); + returnThis = pval.get( ereg ); } else if (SDTGuardElement.isConstant(ereg)) { returnThis = constants.get((SymbolicDataValue.Constant) ereg); } + assert returnThis != null; } else if (guard instanceof SDTGuard.SDTTrueGuard || guard instanceof SDTGuard.DisequalityGuard) { Collection potSet = DataWords.joinValsToSet( diff --git a/src/main/java/de/learnlib/ralib/tools/theories/DoubleInequalityTheory.java b/src/main/java/de/learnlib/ralib/tools/theories/DoubleInequalityTheory.java index afdb93d4..21490915 100644 --- a/src/main/java/de/learnlib/ralib/tools/theories/DoubleInequalityTheory.java +++ b/src/main/java/de/learnlib/ralib/tools/theories/DoubleInequalityTheory.java @@ -21,12 +21,11 @@ import java.math.BigDecimal; import java.util.*; -import de.learnlib.ralib.data.*; -import gov.nasa.jpf.constraints.api.Variable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import de.learnlib.logging.Category; +import de.learnlib.ralib.data.*; import de.learnlib.ralib.data.SymbolicDataValue.SuffixValue; import de.learnlib.ralib.oracles.io.IOOracle; import de.learnlib.ralib.theory.SDTGuard; @@ -39,6 +38,7 @@ import gov.nasa.jpf.constraints.api.ConstraintSolver.Result; import gov.nasa.jpf.constraints.api.Expression; import gov.nasa.jpf.constraints.api.Valuation; +import gov.nasa.jpf.constraints.api.Variable; import gov.nasa.jpf.constraints.expressions.NumericBooleanExpression; import gov.nasa.jpf.constraints.expressions.NumericComparator; import gov.nasa.jpf.constraints.solvers.nativez3.NativeZ3SolverProvider; diff --git a/src/test/java/de/learnlib/ralib/dt/DTInnerNodeTest.java b/src/test/java/de/learnlib/ralib/dt/DTInnerNodeTest.java index 5d7609c2..4dadd3cb 100644 --- a/src/test/java/de/learnlib/ralib/dt/DTInnerNodeTest.java +++ b/src/test/java/de/learnlib/ralib/dt/DTInnerNodeTest.java @@ -9,11 +9,11 @@ import java.util.LinkedHashMap; import java.util.Map; -import de.learnlib.ralib.data.*; import org.testng.Assert; import org.testng.annotations.Test; import de.learnlib.ralib.automata.RegisterAutomaton; +import de.learnlib.ralib.data.*; import de.learnlib.ralib.learning.SymbolicSuffix; import de.learnlib.ralib.oracles.DataWordOracle; import de.learnlib.ralib.oracles.SimulatorOracle; diff --git a/src/test/java/de/learnlib/ralib/dt/DTTest.java b/src/test/java/de/learnlib/ralib/dt/DTTest.java index 774f8b91..ee19f0f6 100644 --- a/src/test/java/de/learnlib/ralib/dt/DTTest.java +++ b/src/test/java/de/learnlib/ralib/dt/DTTest.java @@ -9,11 +9,11 @@ import java.util.LinkedHashMap; import java.util.Map; -import de.learnlib.ralib.data.*; import org.testng.Assert; import org.testng.annotations.Test; import de.learnlib.ralib.automata.RegisterAutomaton; +import de.learnlib.ralib.data.*; import de.learnlib.ralib.learning.SymbolicSuffix; import de.learnlib.ralib.oracles.DataWordOracle; import de.learnlib.ralib.oracles.SDTLogicOracle; diff --git a/src/test/java/de/learnlib/ralib/dt/RegisterConsistencyTest.java b/src/test/java/de/learnlib/ralib/dt/RegisterConsistencyTest.java index c3dc0a26..ff88ad76 100644 --- a/src/test/java/de/learnlib/ralib/dt/RegisterConsistencyTest.java +++ b/src/test/java/de/learnlib/ralib/dt/RegisterConsistencyTest.java @@ -4,11 +4,11 @@ import java.util.List; import java.util.Map; -import de.learnlib.ralib.data.*; import org.testng.Assert; import org.testng.annotations.Test; import de.learnlib.ralib.RaLibTestSuite; +import de.learnlib.ralib.data.*; import de.learnlib.ralib.data.SymbolicDataValue.Parameter; import de.learnlib.ralib.data.SymbolicDataValue.SuffixValue; import de.learnlib.ralib.data.util.SymbolicDataValueGenerator.ParameterGenerator; diff --git a/src/test/java/de/learnlib/ralib/example/sdts/LoginExampleSDT.java b/src/test/java/de/learnlib/ralib/example/sdts/LoginExampleSDT.java index 931f4556..c29839e3 100644 --- a/src/test/java/de/learnlib/ralib/example/sdts/LoginExampleSDT.java +++ b/src/test/java/de/learnlib/ralib/example/sdts/LoginExampleSDT.java @@ -21,7 +21,6 @@ import de.learnlib.ralib.data.SDTRelabeling; import de.learnlib.ralib.data.SymbolicDataValue.Register; -import de.learnlib.ralib.data.VarMapping; import de.learnlib.ralib.learning.SymbolicSuffix; import de.learnlib.ralib.theory.SDT; import de.learnlib.ralib.theory.SDTLeaf; diff --git a/src/test/java/de/learnlib/ralib/learning/ralambda/LearnRepeaterTest.java b/src/test/java/de/learnlib/ralib/learning/ralambda/LearnRepeaterTest.java index f8c7a977..3f8fabbd 100644 --- a/src/test/java/de/learnlib/ralib/learning/ralambda/LearnRepeaterTest.java +++ b/src/test/java/de/learnlib/ralib/learning/ralambda/LearnRepeaterTest.java @@ -89,6 +89,7 @@ public void learnRepeaterTest() { learner.learn(); String str = stats.toString(); + System.out.println(str); Assert.assertTrue(str.contains("Counterexamples: 1")); Assert.assertTrue(str.contains("CE max length: 6")); Assert.assertTrue(str.contains("CE Analysis: {TQ: 0, Resets: 7, Inputs: 0}")); diff --git a/src/test/java/de/learnlib/ralib/learning/ralambda/TestSymmetry.java b/src/test/java/de/learnlib/ralib/learning/ralambda/TestSymmetry.java index 2fb600a8..796a11cb 100644 --- a/src/test/java/de/learnlib/ralib/learning/ralambda/TestSymmetry.java +++ b/src/test/java/de/learnlib/ralib/learning/ralambda/TestSymmetry.java @@ -72,6 +72,8 @@ public void learnSymmetryExampleCT2() { learner.setSolver(solver); learner.learn(); + System.out.println(learner.getHypothesis().toString()); + Word ce = Word.fromSymbols(new PSymbolInstance(A, new DataValue(T_INT, BigDecimal.ONE)), new PSymbolInstance(A, new DataValue(T_INT, new BigDecimal(2) )), @@ -79,6 +81,8 @@ public void learnSymmetryExampleCT2() { learner.addCounterexample(new DefaultQuery<>(ce, true)); learner.learn(); + System.out.println(learner.getHypothesis().toString()); + Hypothesis hyp = learner.getHypothesis(); // System.out.println(hyp.toString()); // System.out.println(learner.getDT()); @@ -205,6 +209,7 @@ public void learnSymmetryExampleCT() { learner.setSolver(solver); learner.learn(); + System.out.println(learner.getHypothesis().toString()); Word ce = Word.fromSymbols( new PSymbolInstance(A, new DataValue(T_INT, BigDecimal.ONE)), @@ -216,7 +221,7 @@ public void learnSymmetryExampleCT() { learner.learn(); Hypothesis hyp = learner.getHypothesis(); - // System.out.println(learner.getHypothesis().toString()); + System.out.println(learner.getHypothesis().toString()); ce = Word.fromSymbols( new PSymbolInstance(A, new DataValue(T_INT, BigDecimal.ONE)), diff --git a/src/test/java/de/learnlib/ralib/learning/rastar/CellTest.java b/src/test/java/de/learnlib/ralib/learning/rastar/CellTest.java index 64006ea3..5042e667 100644 --- a/src/test/java/de/learnlib/ralib/learning/rastar/CellTest.java +++ b/src/test/java/de/learnlib/ralib/learning/rastar/CellTest.java @@ -26,13 +26,12 @@ import java.util.Arrays; import java.util.logging.Level; -import de.learnlib.ralib.data.SDTRelabeling; import org.testng.Assert; import org.testng.annotations.Test; import de.learnlib.ralib.RaLibTestSuite; import de.learnlib.ralib.data.DataValue; -import de.learnlib.ralib.data.VarMapping; +import de.learnlib.ralib.data.SDTRelabeling; import de.learnlib.ralib.example.sdts.LoginExampleTreeOracle; import de.learnlib.ralib.learning.SymbolicSuffix; import de.learnlib.ralib.words.PSymbolInstance; diff --git a/src/test/java/de/learnlib/ralib/learning/rastar/LearnRepeaterTest.java b/src/test/java/de/learnlib/ralib/learning/rastar/LearnRepeaterTest.java index 822515dc..d0002b06 100644 --- a/src/test/java/de/learnlib/ralib/learning/rastar/LearnRepeaterTest.java +++ b/src/test/java/de/learnlib/ralib/learning/rastar/LearnRepeaterTest.java @@ -1,5 +1,14 @@ package de.learnlib.ralib.learning.rastar; +import static de.learnlib.ralib.example.repeater.RepeaterSUL.*; + +import java.math.BigDecimal; +import java.util.LinkedHashMap; +import java.util.Map; + +import org.testng.Assert; +import org.testng.annotations.Test; + import de.learnlib.query.DefaultQuery; import de.learnlib.ralib.RaLibTestSuite; import de.learnlib.ralib.automata.RegisterAutomaton; @@ -10,7 +19,6 @@ import de.learnlib.ralib.example.repeater.RepeaterSUL; import de.learnlib.ralib.learning.Measurements; import de.learnlib.ralib.learning.QueryStatistics; -import de.learnlib.ralib.learning.ralambda.RaLambda; import de.learnlib.ralib.oracles.SimulatorOracle; import de.learnlib.ralib.oracles.TreeOracleFactory; import de.learnlib.ralib.oracles.io.IOCache; @@ -24,14 +32,6 @@ import de.learnlib.ralib.tools.theories.IntegerEqualityTheory; import de.learnlib.ralib.words.PSymbolInstance; import net.automatalib.word.Word; -import org.testng.Assert; -import org.testng.annotations.Test; - -import java.math.BigDecimal; -import java.util.LinkedHashMap; -import java.util.Map; - -import static de.learnlib.ralib.example.repeater.RepeaterSUL.*; public class LearnRepeaterTest extends RaLibTestSuite { diff --git a/src/test/java/de/learnlib/ralib/learning/rastar/RowTest.java b/src/test/java/de/learnlib/ralib/learning/rastar/RowTest.java index 7db31b39..9b7361aa 100644 --- a/src/test/java/de/learnlib/ralib/learning/rastar/RowTest.java +++ b/src/test/java/de/learnlib/ralib/learning/rastar/RowTest.java @@ -25,14 +25,14 @@ import java.util.Arrays; import java.util.logging.Level; -import de.learnlib.ralib.data.Bijection; -import de.learnlib.ralib.data.SDTRelabeling; -import de.learnlib.ralib.data.util.RemappingIterator; import org.testng.Assert; import org.testng.annotations.Test; import de.learnlib.ralib.RaLibTestSuite; +import de.learnlib.ralib.data.Bijection; import de.learnlib.ralib.data.DataValue; +import de.learnlib.ralib.data.SDTRelabeling; +import de.learnlib.ralib.data.util.RemappingIterator; import de.learnlib.ralib.example.sdts.LoginExampleTreeOracle; import de.learnlib.ralib.learning.SymbolicSuffix; import de.learnlib.ralib.words.PSymbolInstance; diff --git a/src/test/java/de/learnlib/ralib/oracles/mto/OptimizedSymbolicSuffixBuilderTest.java b/src/test/java/de/learnlib/ralib/oracles/mto/OptimizedSymbolicSuffixBuilderTest.java index 9138be25..114bceab 100644 --- a/src/test/java/de/learnlib/ralib/oracles/mto/OptimizedSymbolicSuffixBuilderTest.java +++ b/src/test/java/de/learnlib/ralib/oracles/mto/OptimizedSymbolicSuffixBuilderTest.java @@ -1,7 +1,34 @@ package de.learnlib.ralib.oracles.mto; +import static de.learnlib.ralib.example.list.BoundedListDataWordOracle.*; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +import org.testng.Assert; +import org.testng.annotations.Test; + +import de.learnlib.ralib.data.Constants; +import de.learnlib.ralib.data.DataType; +import de.learnlib.ralib.data.DataValue; +import de.learnlib.ralib.data.SymbolicDataValue; +import de.learnlib.ralib.data.util.SymbolicDataValueGenerator; +import de.learnlib.ralib.example.list.BoundedList; +import de.learnlib.ralib.example.list.BoundedListDataWordOracle; +import de.learnlib.ralib.learning.SymbolicSuffix; +import de.learnlib.ralib.oracles.TreeQueryResult; +import de.learnlib.ralib.smt.ConstraintSolver; +import de.learnlib.ralib.theory.*; +import de.learnlib.ralib.tools.theories.IntegerEqualityTheory; +import de.learnlib.ralib.words.InputSymbol; +import de.learnlib.ralib.words.PSymbolInstance; +import net.automatalib.word.Word; + public class OptimizedSymbolicSuffixBuilderTest { -/* + @Test public void extendDistinguishingSuffixTest() { BoundedListDataWordOracle dwOracle = new BoundedListDataWordOracle(() -> new BoundedList(2, false)); @@ -30,35 +57,25 @@ public void extendDistinguishingSuffixTest() { OptimizedSymbolicSuffixBuilder builder = new OptimizedSymbolicSuffixBuilder(consts, restrictionBuilder); - SuffixValueGenerator svGen = new SuffixValueGenerator(); - SuffixValue s1 = svGen.next(INT_TYPE); - SuffixValue s2 = svGen.next(INT_TYPE); - SuffixValue s3 = svGen.next(INT_TYPE); - SuffixValue s4 = svGen.next(INT_TYPE); + SymbolicDataValueGenerator.SuffixValueGenerator svGen = + new SymbolicDataValueGenerator.SuffixValueGenerator(); - RegisterGenerator rGen = new RegisterGenerator(); - Register r1 = rGen.next(INT_TYPE); - Register r2 = rGen.next(INT_TYPE); + SymbolicDataValue.SuffixValue s1 = svGen.next(INT_TYPE); + SymbolicDataValue.SuffixValue s2 = svGen.next(INT_TYPE); + SymbolicDataValue.SuffixValue s3 = svGen.next(INT_TYPE); + SymbolicDataValue.SuffixValue s4 = svGen.next(INT_TYPE); - ParameterGenerator pGen = new ParameterGenerator(); - Parameter p1 = pGen.next(INT_TYPE); - Parameter p2 = pGen.next(INT_TYPE); - Parameter p3 = pGen.next(INT_TYPE); - Parameter p4 = pGen.next(INT_TYPE); + SymbolicDataValueGenerator.RegisterGenerator rGen + = new SymbolicDataValueGenerator.RegisterGenerator(); - ConstantGenerator cGen = new ConstantGenerator(); + SymbolicDataValueGenerator.ConstantGenerator cGen = + new SymbolicDataValueGenerator.ConstantGenerator(); SymbolicDataValue.Constant c1 = cGen.next(INT_TYPE); - PIV piv1 = new PIV(); - piv1.put(p1, r1); - piv1.put(p3, r2); - PIV piv2 = new PIV(); - piv2.put(p3, r1); - piv2.put(p4, r2); - PIV piv3 = new PIV(); - piv3.put(p2, r1); - PIV piv5 = new PIV(); - piv5.put(p1, r1); + DataValue d0 = new DataValue(INT_TYPE, BigDecimal.ZERO); + DataValue d1 = new DataValue(INT_TYPE, BigDecimal.ONE); + DataValue d2 = new DataValue(INT_TYPE, new BigDecimal(2)); + DataValue d3 = new DataValue(INT_TYPE, new BigDecimal(3)); Constants consts2 = new Constants(); consts2.put(c1, new DataValue(INT_TYPE,new BigDecimal(2))); @@ -123,31 +140,42 @@ public void extendDistinguishingSuffixTest() { SymbolicSuffix suffix6 = new SymbolicSuffix(word6.prefix(1), word6.suffix(1), restrictionBuilder); SymbolicSuffix suffix7 = new SymbolicSuffix(word7a.prefix(3), word7a.suffix(1), restrictionBuilder); SymbolicSuffix suffix8 = new SymbolicSuffix(word8a.prefix(2), word8a.suffix(1), restrictionBuilder); - + /* + PIV piv1 = new PIV(); + piv1.put(p1, r1); // 0 + piv1.put(p3, r2); // 1 + PIV piv2 = new PIV(); + piv2.put(p3, r1); // 2 + piv2.put(p4, r2); // 3 + PIV piv3 = new PIV(); + piv3.put(p2, r1); // 1 + PIV piv5 = new PIV(); + piv5.put(p1, r1); // 0 + */ SDT sdt1 = new SDT(Map.of( - new SDTGuard.EqualityGuard(s1, r1), new SDT(Map.of( - new SDTGuard.EqualityGuard(s2, r2), SDTLeaf.ACCEPTING, - new SDTGuard.DisequalityGuard(s2, r2), SDTLeaf.REJECTING)), - new SDTGuard.DisequalityGuard(s1, r1), new SDT(Map.of( + new SDTGuard.EqualityGuard(s1, d0), new SDT(Map.of( + new SDTGuard.EqualityGuard(s2, d1), SDTLeaf.ACCEPTING, + new SDTGuard.DisequalityGuard(s2, d1), SDTLeaf.REJECTING)), + new SDTGuard.DisequalityGuard(s1, d0), new SDT(Map.of( new SDTGuard.SDTTrueGuard(s2), SDTLeaf.REJECTING)))); SDT sdt2 = new SDT(Map.of( - new SDTGuard.SDTOrGuard(s1, List.of(new SDTGuard.EqualityGuard(s1, r1), new SDTGuard.EqualityGuard(s1, r2))), new SDT(Map.of( + new SDTGuard.SDTOrGuard(s1, List.of(new SDTGuard.EqualityGuard(s1, d2), new SDTGuard.EqualityGuard(s1, d3))), new SDT(Map.of( new SDTGuard.SDTTrueGuard(s2), SDTLeaf.ACCEPTING)), - new SDTGuard.SDTAndGuard(s1, List.of(new SDTGuard.DisequalityGuard(s1, r1), new SDTGuard.DisequalityGuard(s1, r2))), new SDT(Map.of( + new SDTGuard.SDTAndGuard(s1, List.of(new SDTGuard.DisequalityGuard(s1, d2), new SDTGuard.DisequalityGuard(s1, d3))), new SDT(Map.of( new SDTGuard.SDTTrueGuard(s2), SDTLeaf.REJECTING)))); SDT sdt3 = new SDT(Map.of( - new SDTGuard.EqualityGuard(s1, r1), new SDT(Map.of( + new SDTGuard.EqualityGuard(s1, d1), new SDT(Map.of( new SDTGuard.EqualityGuard(s2, c1), SDTLeaf.ACCEPTING, new SDTGuard.DisequalityGuard(s2, c1), SDTLeaf.REJECTING)), - new SDTGuard.DisequalityGuard(s1, r1), new SDT(Map.of( + new SDTGuard.DisequalityGuard(s1, d1), new SDT(Map.of( new SDTGuard.SDTTrueGuard(s2), SDTLeaf.REJECTING)))); SDT sdt4 = new SDT(Map.of( new SDTGuard.SDTTrueGuard(s1), new SDT(Map.of( new SDTGuard.EqualityGuard(s2, s1), new SDT(Map.of( - new SDTGuard.EqualityGuard(s3, r1), new SDT(Map.of( - new SDTGuard.EqualityGuard(s4, r1), SDTLeaf.ACCEPTING, - new SDTGuard.DisequalityGuard(s4, r1), SDTLeaf.REJECTING)), - new SDTGuard.DisequalityGuard(s3, r1), new SDT(Map.of( + new SDTGuard.EqualityGuard(s3, d0), new SDT(Map.of( + new SDTGuard.EqualityGuard(s4, d0), SDTLeaf.ACCEPTING, + new SDTGuard.DisequalityGuard(s4, d0), SDTLeaf.REJECTING)), + new SDTGuard.DisequalityGuard(s3, d0), new SDT(Map.of( new SDTGuard.SDTTrueGuard(s4), SDTLeaf.REJECTING)))), new SDTGuard.DisequalityGuard(s2, s1), new SDT(Map.of( new SDTGuard.SDTTrueGuard(s3), new SDT(Map.of( @@ -155,24 +183,24 @@ public void extendDistinguishingSuffixTest() { SDT sdt5 = new SDT(Map.of( new SDTGuard.SDTTrueGuard(s1), new SDT(Map.of( new SDTGuard.EqualityGuard(s2, s1), new SDT(Map.of( - new SDTGuard.EqualityGuard(s3, r1), new SDT(Map.of( + new SDTGuard.EqualityGuard(s3, d0), new SDT(Map.of( new SDTGuard.SDTTrueGuard(s4), SDTLeaf.REJECTING)), - new SDTGuard.DisequalityGuard(s3, r1), new SDT(Map.of( + new SDTGuard.DisequalityGuard(s3, d0), new SDT(Map.of( new SDTGuard.EqualityGuard(s4, s3), SDTLeaf.ACCEPTING, new SDTGuard.DisequalityGuard(s4, s3), SDTLeaf.REJECTING)))))))); SDT sdt6 = new SDT(Map.of( - new SDTGuard.EqualityGuard(s1, r1), SDTLeaf.ACCEPTING, - new SDTGuard.DisequalityGuard(s1, r1), SDTLeaf.REJECTING)); + new SDTGuard.EqualityGuard(s1, d2), SDTLeaf.ACCEPTING, + new SDTGuard.DisequalityGuard(s1, d2), SDTLeaf.REJECTING)); SDT sdt7 = new SDT(Map.of( new SDTGuard.SDTTrueGuard(s1), SDTLeaf.REJECTING)); SymbolicSuffix expected1 = new SymbolicSuffix(word1.prefix(1), word1.suffix(2), restrictionBuilder); - SymbolicSuffix actual1 = builder.extendSuffix(word1.prefix(2), sdt1, piv1, suffix1); + SymbolicSuffix actual1 = builder.extendSuffix(word1.prefix(2), sdt1, suffix1); Assert.assertEquals(actual1, expected1); - SymbolicSuffix actual2 = builder.extendSuffix(word2.prefix(2), sdt2, piv2, suffix2); + SymbolicSuffix actual2 = builder.extendSuffix(word2.prefix(2), sdt2, suffix2); // SuffixValue[] actualSV2 = actual2.getDataValues().toArray(new SuffixValue[actual2.getDataValues().size()]); - Map expectedRestr2 = new LinkedHashMap<>(); + Map expectedRestr2 = new LinkedHashMap<>(); expectedRestr2.put(s1, new FreshSuffixValue(s1)); expectedRestr2.put(s2, new FreshSuffixValue(s2)); expectedRestr2.put(s3, new UnrestrictedSuffixValue(s3)); @@ -182,34 +210,34 @@ public void extendDistinguishingSuffixTest() { // Assert.assertEquals(actual2.toString(), "[s3]((a[s1, s2] a[s3, s4]))"); SymbolicSuffix expected3 = new SymbolicSuffix(word3.prefix(1), word3.suffix(2), restrictionBuilder2); - SymbolicSuffix actual3 = builder.extendSuffix(word3.prefix(2), sdt3, piv3, suffix3); + SymbolicSuffix actual3 = builder.extendSuffix(word3.prefix(2), sdt3, suffix3); Assert.assertEquals(actual3, expected3); SymbolicSuffix expected4 = new SymbolicSuffix(word4.prefix(1), word4.suffix(5), restrictionBuilder); - SymbolicSuffix actual4 = builder.extendSuffix(word4.prefix(2), sdt4, piv5, suffix4); + SymbolicSuffix actual4 = builder.extendSuffix(word4.prefix(2), sdt4, suffix4); Assert.assertEquals(actual4, expected4); SymbolicSuffix expected5 = new SymbolicSuffix(word5.prefix(1), word5.suffix(5), restrictionBuilder); - SymbolicSuffix actual5 = builder.extendSuffix(word5.prefix(2), sdt5, piv5, suffix5); + SymbolicSuffix actual5 = builder.extendSuffix(word5.prefix(2), sdt5, suffix5); Assert.assertEquals(actual5, expected5); SymbolicSuffix expected6 = new SymbolicSuffix(Word.epsilon(), word6, restrictionBuilder); - SymbolicSuffix actual6 = builder.extendSuffix(word6.prefix(1), sdt6, piv5, suffix6); + SymbolicSuffix actual6 = builder.extendSuffix(word6.prefix(1), sdt6, suffix6); Assert.assertEquals(actual6, expected6); OptimizedSymbolicSuffixBuilder constBuilder = new OptimizedSymbolicSuffixBuilder(consts2, restrictionBuilder2); SymbolicSuffix expected7 = new SymbolicSuffix(word7b.prefix(2), word7b.suffix(2), restrictionBuilder2); - SymbolicSuffix actual7 = constBuilder.extendDistinguishingSuffix(word7a.prefix(3), SDTLeaf.ACCEPTING, new PIV(), word7b.prefix(3), SDTLeaf.REJECTING, new PIV(), suffix7); + SymbolicSuffix actual7 = constBuilder.extendDistinguishingSuffix(word7a.prefix(3), SDTLeaf.ACCEPTING, word7b.prefix(3), SDTLeaf.REJECTING, suffix7); Assert.assertEquals(actual7, expected7); SymbolicSuffix expected8 = new SymbolicSuffix(word8c.prefix(1), word8c.suffix(2), restrictionBuilder); - SymbolicSuffix actual8 = builder.extendDistinguishingSuffix(word8a.prefix(2), sdt6, piv3, word8b.prefix(2), sdt7, new PIV(), suffix8); + SymbolicSuffix actual8 = builder.extendDistinguishingSuffix(word8a.prefix(2), sdt6, word8b.prefix(2), sdt7, suffix8); Assert.assertEquals(actual8, expected8); } /* * Checks for equality optimized suffixes built by prepending using an SDT against those built from concrete prefix/suffix - * / + */ private void equalsSuffixesFromConcretePrefixSuffix(Word word, MultiTheoryTreeOracle mto, Constants consts) { OptimizedSymbolicSuffixBuilder builder = new OptimizedSymbolicSuffixBuilder(consts); TreeQueryResult tqr = mto.treeQuery(word, new SymbolicSuffix(Word.epsilon())); @@ -220,7 +248,7 @@ private void equalsSuffixesFromConcretePrefixSuffix(Word word, Word sub = word.prefix(word.length() - suffixLength); Word prefix = word.prefix(sub.length()+1); SymbolicSuffix expected = new SymbolicSuffix(sub, suffix); - actual = builder.extendSuffix(prefix, tqr.getSdt(), tqr.getPiv(), actual); + actual = builder.extendSuffix(prefix, tqr.sdt(), actual); Assert.assertEquals(actual, expected); tqr = mto.treeQuery(sub, expected); } @@ -238,33 +266,22 @@ public void extendSuffixTest() { InputSymbol A = new InputSymbol("a", type, type); InputSymbol B = new InputSymbol("b", type); InputSymbol C = new InputSymbol("c"); - SuffixValueGenerator sgen = new SymbolicDataValueGenerator.SuffixValueGenerator(); - SuffixValue s1 = sgen.next(type); - SuffixValue s2 = sgen.next(type); - SuffixValue s3 = sgen.next(type); - SuffixValue s4 = sgen.next(type); - SuffixValue s5 = sgen.next(type); - - RegisterGenerator rgen = new SymbolicDataValueGenerator.RegisterGenerator(); - Register r1 = rgen.next(type); - Register r2 = rgen.next(type); - Register r3 = rgen.next(type); - - ParameterGenerator pgen = new SymbolicDataValueGenerator.ParameterGenerator(); - Parameter p1 = pgen.next(type); - pgen.next(type); - Parameter p3 = pgen.next(type); - Parameter p4 = pgen.next(type); - - ConstantGenerator cGen = new ConstantGenerator(); + SymbolicDataValueGenerator.SuffixValueGenerator sgen = + new SymbolicDataValueGenerator.SuffixValueGenerator(); + SymbolicDataValue.SuffixValue s1 = sgen.next(type); + SymbolicDataValue.SuffixValue s2 = sgen.next(type); + SymbolicDataValue.SuffixValue s3 = sgen.next(type); + SymbolicDataValue.SuffixValue s4 = sgen.next(type); + SymbolicDataValue.SuffixValue s5 = sgen.next(type); + + SymbolicDataValueGenerator.ConstantGenerator cGen = + new SymbolicDataValueGenerator.ConstantGenerator(); SymbolicDataValue.Constant c1 = cGen.next(INT_TYPE); SymbolicDataValue.Constant c2 = cGen.next(INT_TYPE); - PIV piv1 = new PIV(); - piv1.put(p1, r1); - piv1.put(p3, r2); - piv1.put(p4, r3); - PIV piv2 = new PIV(); + DataValue d0 = new DataValue(INT_TYPE, BigDecimal.ZERO); + DataValue d1 = new DataValue(INT_TYPE, BigDecimal.ONE); + DataValue d2 = new DataValue(INT_TYPE, new BigDecimal(2)); Constants consts1 = new Constants(); Constants consts2 = new Constants(); @@ -300,16 +317,20 @@ public void extendSuffixTest() { SymbolicSuffix suffix3 = new SymbolicSuffix(word3.prefix(2), word3.suffix(2), restrictionBuilder2); SymbolicSuffix suffix4 = new SymbolicSuffix(word4.prefix(2), word4.suffix(1), restrictionBuilder2); + // piv1.put(p1, r1); /0 + // piv1.put(p3, r2); /1 + // piv1.put(p4, r3); /2 + List sdtPath1 = new ArrayList<>(); - sdtPath1.add(new SDTGuard.EqualityGuard(s1, r1)); - sdtPath1.add(new SDTGuard.EqualityGuard(s2, r2)); - sdtPath1.add(new SDTGuard.EqualityGuard(s3, r3)); + sdtPath1.add(new SDTGuard.EqualityGuard(s1, d0)); + sdtPath1.add(new SDTGuard.EqualityGuard(s2, d1)); + sdtPath1.add(new SDTGuard.EqualityGuard(s3, d2)); sdtPath1.add(new SDTGuard.EqualityGuard(s4, s1)); sdtPath1.add(new SDTGuard.EqualityGuard(s5, s3)); List sdtPath2 = new ArrayList<>(); - sdtPath2.add(new SDTGuard.DisequalityGuard(s1, r1)); - sdtPath2.add(new SDTGuard.DisequalityGuard(s2, r2)); - sdtPath2.add(new SDTGuard.DisequalityGuard(s3, r3)); + sdtPath2.add(new SDTGuard.DisequalityGuard(s1, d0)); + sdtPath2.add(new SDTGuard.DisequalityGuard(s2, d1)); + sdtPath2.add(new SDTGuard.DisequalityGuard(s3, d2)); sdtPath2.add(new SDTGuard.DisequalityGuard(s4, s1)); sdtPath2.add(new SDTGuard.DisequalityGuard(s5, s3)); List sdtPath3 = new ArrayList<>(); @@ -324,7 +345,7 @@ public void extendSuffixTest() { ConstraintSolver solver = new ConstraintSolver(); SymbolicSuffix expected1 = new SymbolicSuffix(word1.prefix(1), word1.suffix(4), restrictionBuilder1); - SymbolicSuffix actual1 = builder1.extendSuffix(word1.prefix(2), sdtPath1, piv1, suffix1.getActions()); + SymbolicSuffix actual1 = builder1.extendSuffix(word1.prefix(2), sdtPath1, suffix1.getActions()); Assert.assertEquals(actual1, expected1); // this test does not seem to be correct, it needs to be examined more closely @@ -333,13 +354,13 @@ public void extendSuffixTest() { // Assert.assertEquals(actual2, expected2); SymbolicSuffix expected3 = new SymbolicSuffix(word3.prefix(1), word3.suffix(3), restrictionBuilder2); - SymbolicSuffix actual3 = builder1.extendSuffix(word3.prefix(2), sdtPath3, piv2, suffix3.getActions()); + SymbolicSuffix actual3 = builder1.extendSuffix(word3.prefix(2), sdtPath3, suffix3.getActions()); Assert.assertEquals(actual3, expected3); - SymbolicSuffix actual4 = builder2.extendSuffix(word4.prefix(2), sdtPath4, new PIV(), suffix4.getActions()); + SymbolicSuffix actual4 = builder2.extendSuffix(word4.prefix(2), sdtPath4, suffix4.getActions()); Assert.assertEquals(actual4.getFreeValues().size(), 1); } - +/* @Test public void buildOptimizedSuffixTest() { @@ -351,11 +372,11 @@ public void buildOptimizedSuffixTest() { IntegerEqualityTheory dit = new IntegerEqualityTheory(type); teachers.put(type, dit); - SuffixValueGenerator sgen = new SymbolicDataValueGenerator.SuffixValueGenerator(); - SuffixValue s1 = sgen.next(type); - SuffixValue s2 = sgen.next(type); - SuffixValue s3 = sgen.next(type); - SuffixValue s4 = sgen.next(type); + SymbolicDataValueGenerator.SuffixValueGenerator sgen = new SymbolicDataValueGenerator.SuffixValueGenerator(); + SymbolicDataValue.SuffixValue s1 = sgen.next(type); + SymbolicDataValue.SuffixValue s2 = sgen.next(type); + SymbolicDataValue.SuffixValue s3 = sgen.next(type); + SymbolicDataValue.SuffixValue s4 = sgen.next(type); RegisterGenerator rgen = new SymbolicDataValueGenerator.RegisterGenerator(); Register r1 = rgen.next(type); @@ -396,7 +417,7 @@ public void buildOptimizedSuffixTest() { OptimizedSymbolicSuffixBuilder builder = new OptimizedSymbolicSuffixBuilder(consts); SymbolicSuffix suffix12 = builder.distinguishingSuffixFromSDTs(prefix1, sdt1, piv1, prefix2, sdt2, piv2, Word.fromSymbols(a, a, a), new ConstraintSolver()); - Map expectedRestr12 = new LinkedHashMap<>(); + Map expectedRestr12 = new LinkedHashMap<>(); expectedRestr12.put(s1, new FreshSuffixValue(s1)); expectedRestr12.put(s2, new EqualRestriction(s2, s1)); expectedRestr12.put(s3, new FreshSuffixValue(s3)); @@ -435,7 +456,7 @@ public void buildOptimizedSuffixTest() { SymbolicSuffix suffix34 = builder.distinguishingSuffixFromSDTs(prefix3, sdt3, piv3, prefix4, sdt4, piv4, Word.fromSymbols(a, a, a), new ConstraintSolver()); - Map expectedRestr34 = new LinkedHashMap<>(); + Map expectedRestr34 = new LinkedHashMap<>(); expectedRestr34.put(s1, new FreshSuffixValue(s1)); expectedRestr34.put(s2, new UnrestrictedSuffixValue(s2)); expectedRestr34.put(s3, new FreshSuffixValue(s3)); @@ -547,10 +568,10 @@ private void sdtPruneTest() { IntegerEqualityTheory dit = new IntegerEqualityTheory(type); teachers.put(type, dit); - SuffixValueGenerator sgen = new SymbolicDataValueGenerator.SuffixValueGenerator(); - SuffixValue s1 = sgen.next(type); - SuffixValue s2 = sgen.next(type); - SuffixValue s3 = sgen.next(type); + SymbolicDataValueGenerator.SuffixValueGenerator sgen = new SymbolicDataValueGenerator.SuffixValueGenerator(); + SymbolicDataValue.SuffixValue s1 = sgen.next(type); + SymbolicDataValue.SuffixValue s2 = sgen.next(type); + SymbolicDataValue.SuffixValue s3 = sgen.next(type); RegisterGenerator rgen = new SymbolicDataValueGenerator.RegisterGenerator(); Register r1 = rgen.next(type); @@ -676,5 +697,5 @@ public void testCoalesce() { SymbolicSuffix suffixActual = builder.coalesceSuffixes(suffix1, suffix2); Assert.assertEquals(suffixActual, suffixExpected); } - */ +*/ } diff --git a/src/test/java/de/learnlib/ralib/oracles/mto/SecondSDTBranchingTest.java b/src/test/java/de/learnlib/ralib/oracles/mto/SecondSDTBranchingTest.java index 25b092fb..da0ebb2f 100644 --- a/src/test/java/de/learnlib/ralib/oracles/mto/SecondSDTBranchingTest.java +++ b/src/test/java/de/learnlib/ralib/oracles/mto/SecondSDTBranchingTest.java @@ -22,7 +22,6 @@ import java.util.Map; import java.util.logging.Level; -import de.learnlib.ralib.data.*; import org.testng.Assert; import org.testng.annotations.Test; @@ -30,6 +29,7 @@ import de.learnlib.ralib.TestUtil; import de.learnlib.ralib.automata.RegisterAutomaton; import de.learnlib.ralib.automata.xml.RegisterAutomatonImporter; +import de.learnlib.ralib.data.*; import de.learnlib.ralib.data.SymbolicDataValue.Register; import de.learnlib.ralib.data.util.SymbolicDataValueGenerator.RegisterGenerator; import de.learnlib.ralib.learning.SymbolicSuffix; diff --git a/src/test/java/de/learnlib/ralib/oracles/mto/UntypedBranchingTest.java b/src/test/java/de/learnlib/ralib/oracles/mto/UntypedBranchingTest.java index abb55510..2bd4a96a 100644 --- a/src/test/java/de/learnlib/ralib/oracles/mto/UntypedBranchingTest.java +++ b/src/test/java/de/learnlib/ralib/oracles/mto/UntypedBranchingTest.java @@ -40,7 +40,6 @@ import java.util.Map; import java.util.logging.Level; -import de.learnlib.ralib.data.*; import org.testng.Assert; import org.testng.annotations.Test; @@ -48,6 +47,7 @@ import de.learnlib.ralib.TestUtil; import de.learnlib.ralib.automata.RegisterAutomaton; import de.learnlib.ralib.automata.xml.RegisterAutomatonImporter; +import de.learnlib.ralib.data.*; import de.learnlib.ralib.data.SymbolicDataValue.Parameter; import de.learnlib.ralib.data.SymbolicDataValue.Register; import de.learnlib.ralib.data.util.SymbolicDataValueGenerator.ParameterGenerator; diff --git a/src/test/java/de/learnlib/ralib/theory/SDTEquivalenceTest.java b/src/test/java/de/learnlib/ralib/theory/SDTEquivalenceTest.java index 2a818df0..5d63b69a 100644 --- a/src/test/java/de/learnlib/ralib/theory/SDTEquivalenceTest.java +++ b/src/test/java/de/learnlib/ralib/theory/SDTEquivalenceTest.java @@ -3,14 +3,13 @@ import java.math.BigDecimal; import java.util.Map; -import de.learnlib.ralib.data.DataValue; import org.testng.Assert; import org.testng.annotations.Test; import de.learnlib.ralib.RaLibTestSuite; import de.learnlib.ralib.data.Bijection; import de.learnlib.ralib.data.DataType; -import de.learnlib.ralib.data.SymbolicDataValue.Register; +import de.learnlib.ralib.data.DataValue; import de.learnlib.ralib.data.SymbolicDataValue.SuffixValue; import de.learnlib.ralib.smt.ConstraintSolver; From fc107f7c7b78b50e133c00a812f724e4da31dc22 Mon Sep 17 00:00:00 2001 From: Falk Howar Date: Fri, 21 Mar 2025 15:25:14 +0100 Subject: [PATCH 25/26] memorables as set --- .../java/de/learnlib/ralib/data/Bijection.java | 2 +- src/main/java/de/learnlib/ralib/dt/DT.java | 6 +++--- src/main/java/de/learnlib/ralib/dt/DTLeaf.java | 11 +++++------ .../java/de/learnlib/ralib/dt/MappedPrefix.java | 7 +++---- .../java/de/learnlib/ralib/dt/PathResult.java | 7 +++---- .../ralib/learning/CounterexampleAnalysis.java | 3 +-- .../de/learnlib/ralib/learning/rastar/Cell.java | 4 ++-- .../learnlib/ralib/learning/rastar/Component.java | 4 ++-- .../de/learnlib/ralib/learning/rastar/Row.java | 7 +++---- .../ralib/oracles/mto/MultiTheoryTreeOracle.java | 1 + .../java/de/learnlib/ralib/theory/Memorables.java | 14 ++++++-------- src/main/java/de/learnlib/ralib/theory/SDT.java | 15 +++++++-------- .../theory/inequality/InequalityTheoryWithEq.java | 8 ++++---- .../ralib/learning/ralambda/TestSymmetry.java | 5 ++--- 14 files changed, 43 insertions(+), 51 deletions(-) diff --git a/src/main/java/de/learnlib/ralib/data/Bijection.java b/src/main/java/de/learnlib/ralib/data/Bijection.java index ab7cf356..1cd1ddec 100644 --- a/src/main/java/de/learnlib/ralib/data/Bijection.java +++ b/src/main/java/de/learnlib/ralib/data/Bijection.java @@ -18,7 +18,7 @@ public Bijection(Map map) { putAll(injection, surjection, map); } - public static Bijection identity(List dataValues) { + public static Bijection identity(Set dataValues) { Bijection bij = new Bijection<>(); for (DataValue dv : dataValues) { bij.put(dv, dv); diff --git a/src/main/java/de/learnlib/ralib/dt/DT.java b/src/main/java/de/learnlib/ralib/dt/DT.java index 72b1df02..45a3afdc 100644 --- a/src/main/java/de/learnlib/ralib/dt/DT.java +++ b/src/main/java/de/learnlib/ralib/dt/DT.java @@ -172,13 +172,12 @@ private DTLeaf sift(MappedPrefix mp, DTInnerNode from, boolean add) { leaf.addPrefix(mp); } } - return leaf; } @Override public void split(Word prefix, SymbolicSuffix suffix, DTLeaf leaf) { - + //System.out.println("SPLIT: " + prefix + ", " + suffix + ", " + leaf); // add new inner node DTBranch branch = leaf.getParentBranch(); DTInnerNode node = new DTInnerNode(suffix); @@ -247,7 +246,8 @@ public void addSuffix(SymbolicSuffix suffix, DTLeaf leaf) { leaf.getMappedExtendedPrefixes(prefixes); for (MappedPrefix prefix : prefixes) { leaf.removePrefix(prefix.getPrefix()); - sift(prefix, node, true); + DTLeaf l = sift(prefix, node, true); + //System.out.println("SIFTED: " + prefix + " to " + l); } leaf.updateBranching(this); diff --git a/src/main/java/de/learnlib/ralib/dt/DTLeaf.java b/src/main/java/de/learnlib/ralib/dt/DTLeaf.java index c41d1be4..2b5cabb5 100644 --- a/src/main/java/de/learnlib/ralib/dt/DTLeaf.java +++ b/src/main/java/de/learnlib/ralib/dt/DTLeaf.java @@ -13,7 +13,6 @@ import de.learnlib.ralib.automata.Assignment; import de.learnlib.ralib.data.*; -import de.learnlib.ralib.data.SymbolicDataValue.Register; import de.learnlib.ralib.learning.AutomatonBuilder; import de.learnlib.ralib.learning.LocationComponent; import de.learnlib.ralib.learning.PrefixContainer; @@ -454,8 +453,8 @@ private boolean checkVariableConsistency(MappedPrefix mp, DT dt, Constants const DTLeaf prefixLeaf = dt.getLeaf(prefix); MappedPrefix prefixMapped = prefixLeaf.getMappedPrefix(prefix); - List memPrefix = prefixMapped.memorableValues(); - List memMP = mp.memorableValues(); + Set memPrefix = prefixMapped.memorableValues(); + Set memMP = mp.memorableValues(); int max = DataWords.paramLength(DataWords.actsOf(prefix)); List mpVals = Arrays.stream(DataWords.valsOf(mp.getPrefix())).toList(); @@ -540,7 +539,7 @@ public boolean checkRegisterConsistency(MappedPrefix mp, DT dt, Constants consts Set piv = Set.of(e.getValue().getDataValues().toArray(new DataValue[0])); if (!Sets.intersection(piv, paramsIntersect).isEmpty()) { SDT sdt = e.getValue(); - SymbolicSuffix newSuffix = suffixBuilder != null && sdt instanceof SDT ? + SymbolicSuffix newSuffix = suffixBuilder != null ? suffixBuilder.extendSuffix(mp.getPrefix(), sdt, e.getKey()) : new SymbolicSuffix(mp.getPrefix(), e.getKey(), consts); if (!prefixMapped.getTQRs().containsKey(newSuffix)) { @@ -561,14 +560,14 @@ public boolean checkRegisterConsistency(MappedPrefix mp, DT dt, Constants consts for (Map.Entry e : mp.getTQRs().entrySet()) { SDT sdt = e.getValue(); for (Bijection vm : difference) { - VarMapping renaming = new VarMapping<>(); + //VarMapping renaming = new VarMapping<>(); /*for (Map.Entry paramRenaming : vm.entrySet()) { Register oldRegister = memPrefix.get(paramRenaming.getKey()); Register newRegister = memPrefix.get(paramRenaming.getValue()); renaming.put(oldRegister, newRegister); }*/ if (!sdt.isEquivalent(sdt, vm)) { - SymbolicSuffix newSuffix = suffixBuilder != null && sdt instanceof SDT ? + SymbolicSuffix newSuffix = suffixBuilder != null ? suffixBuilder.extendSuffix(mp.getPrefix(), sdt, e.getKey()) : new SymbolicSuffix(mp.getPrefix(), e.getKey(), consts); dt.addSuffix(newSuffix, prefixLeaf); diff --git a/src/main/java/de/learnlib/ralib/dt/MappedPrefix.java b/src/main/java/de/learnlib/ralib/dt/MappedPrefix.java index ab88ec91..447d130b 100644 --- a/src/main/java/de/learnlib/ralib/dt/MappedPrefix.java +++ b/src/main/java/de/learnlib/ralib/dt/MappedPrefix.java @@ -2,6 +2,7 @@ import java.util.*; import java.util.Map.Entry; +import java.util.stream.Collectors; import de.learnlib.ralib.data.*; import de.learnlib.ralib.data.util.RemappingIterator; @@ -85,12 +86,10 @@ public void updateRemapping(Bijection remapping) { this.remapping = remapping; } - public List memorableValues() { + public Set memorableValues() { return this.tqrs.values().stream() .flatMap(sdt -> sdt.getDataValues().stream()) - .distinct() - .sorted() - .toList(); + .collect(Collectors.toSet()); } @Override diff --git a/src/main/java/de/learnlib/ralib/dt/PathResult.java b/src/main/java/de/learnlib/ralib/dt/PathResult.java index f608d985..822a0a14 100644 --- a/src/main/java/de/learnlib/ralib/dt/PathResult.java +++ b/src/main/java/de/learnlib/ralib/dt/PathResult.java @@ -2,6 +2,7 @@ import java.util.*; +import java.util.stream.Collectors; import de.learnlib.ralib.data.*; import de.learnlib.ralib.data.util.SymbolicDataValueGenerator; @@ -103,12 +104,10 @@ boolean couldBeEquivalentTo(PathResult other) { return true; } - public List memorableValues() { + public Set memorableValues() { return results.values().stream() .flatMap(sdt -> sdt.getDataValues().stream()) - .distinct() - .sorted() - .toList(); + .collect(Collectors.toSet()); } diff --git a/src/main/java/de/learnlib/ralib/learning/CounterexampleAnalysis.java b/src/main/java/de/learnlib/ralib/learning/CounterexampleAnalysis.java index 7469679e..fd1265e6 100644 --- a/src/main/java/de/learnlib/ralib/learning/CounterexampleAnalysis.java +++ b/src/main/java/de/learnlib/ralib/learning/CounterexampleAnalysis.java @@ -16,7 +16,6 @@ */ package de.learnlib.ralib.learning; -import java.util.List; import java.util.Map; import java.util.Set; @@ -140,7 +139,7 @@ private IndexResult computeIndex(Word ce, int idx) { } // PIV pivSul = new PIV(location, resSul.getParsInVars()); - List pivSul = resSul.sdt().getDataValues(); + Set pivSul = resSul.sdt().getDataValues(); Set pivHyp = c.getPrimePrefix().getAssignment().keySet(); boolean sulHasMoreRegs = !pivHyp.containsAll(pivSul); diff --git a/src/main/java/de/learnlib/ralib/learning/rastar/Cell.java b/src/main/java/de/learnlib/ralib/learning/rastar/Cell.java index 7b765264..ccfa27ef 100644 --- a/src/main/java/de/learnlib/ralib/learning/rastar/Cell.java +++ b/src/main/java/de/learnlib/ralib/learning/rastar/Cell.java @@ -16,7 +16,7 @@ */ package de.learnlib.ralib.learning.rastar; -import java.util.List; +import java.util.Set; import de.learnlib.ralib.data.DataValue; import de.learnlib.ralib.data.SDTRelabeling; @@ -108,7 +108,7 @@ SDT getSDT() { return this.sdt; } - List getMemorableValues() { + Set getMemorableValues() { return this.sdt.getDataValues(); } diff --git a/src/main/java/de/learnlib/ralib/learning/rastar/Component.java b/src/main/java/de/learnlib/ralib/learning/rastar/Component.java index 61917563..8618285d 100644 --- a/src/main/java/de/learnlib/ralib/learning/rastar/Component.java +++ b/src/main/java/de/learnlib/ralib/learning/rastar/Component.java @@ -208,8 +208,8 @@ private boolean checkVariableConsistency(Row r) { Row prefixRow = obs.getComponents().get(prefix).primeRow; - List memPrefix = prefixRow.memorableValues(); - List memRow = r.memorableValues(); + Set memPrefix = prefixRow.memorableValues(); + Set memRow = r.memorableValues(); int max = DataWords.paramLength(DataWords.actsOf(prefix)); diff --git a/src/main/java/de/learnlib/ralib/learning/rastar/Row.java b/src/main/java/de/learnlib/ralib/learning/rastar/Row.java index 1a5c0c97..1570fedf 100644 --- a/src/main/java/de/learnlib/ralib/learning/rastar/Row.java +++ b/src/main/java/de/learnlib/ralib/learning/rastar/Row.java @@ -18,6 +18,7 @@ import java.util.*; import java.util.Map.Entry; +import java.util.stream.Collectors; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -107,12 +108,10 @@ SDT[] getSDTsForInitialSymbol(ParameterizedSymbol ps) { return sdts.toArray(new SDT[]{}); } - public List memorableValues() { + public Set memorableValues() { return cells.values().stream() .flatMap(c -> c.getMemorableValues().stream() ) - .distinct() - .sorted() - .toList(); + .collect(Collectors.toSet()); } @Override diff --git a/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheoryTreeOracle.java b/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheoryTreeOracle.java index 01f10f7a..3edd5215 100644 --- a/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheoryTreeOracle.java +++ b/src/main/java/de/learnlib/ralib/oracles/mto/MultiTheoryTreeOracle.java @@ -90,6 +90,7 @@ public MultiTheoryTreeOracle(DataWordOracle oracle, Map teache @Override public TreeQueryResult treeQuery(Word prefix, SymbolicSuffix suffix) { SDT sdt = treeQuery(prefix, suffix, new WordValuation(), constants, new SuffixValuation()); + //System.out.println(sdt); return new TreeQueryResult(sdt); } diff --git a/src/main/java/de/learnlib/ralib/theory/Memorables.java b/src/main/java/de/learnlib/ralib/theory/Memorables.java index 9569ab71..289b6658 100644 --- a/src/main/java/de/learnlib/ralib/theory/Memorables.java +++ b/src/main/java/de/learnlib/ralib/theory/Memorables.java @@ -1,9 +1,7 @@ package de.learnlib.ralib.theory; -import java.util.Arrays; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; +import java.util.*; +import java.util.stream.Collectors; import de.learnlib.ralib.data.DataType; import de.learnlib.ralib.data.DataValue; @@ -13,17 +11,17 @@ public class Memorables { - public static List relabel(List values, SDTRelabeling relabeling) { - List result = values.stream() + public static Set relabel(Set values, SDTRelabeling relabeling) { + Set result = values.stream() .map(relabeling::get) .map( d -> (DataValue) d) - .toList(); + .collect(Collectors.toSet()); assert result.size() == values.size(); return result; } - public static Map typedSize(List values) { + public static Map typedSize(Set values) { Map ret = new LinkedHashMap<>(); values.forEach(v -> { Integer i = ret.get(v.getDataType()); diff --git a/src/main/java/de/learnlib/ralib/theory/SDT.java b/src/main/java/de/learnlib/ralib/theory/SDT.java index e3ae0c4b..90f9e141 100644 --- a/src/main/java/de/learnlib/ralib/theory/SDT.java +++ b/src/main/java/de/learnlib/ralib/theory/SDT.java @@ -18,6 +18,7 @@ import java.util.*; import java.util.Map.Entry; +import java.util.stream.Collectors; import de.learnlib.ralib.data.*; import de.learnlib.ralib.data.SymbolicDataValue.Register; @@ -66,13 +67,11 @@ public Set getRegisters() { return registers; } - public List getDataValues() { + public Set getDataValues() { return getVariables().stream() .filter(SDTGuardElement::isDataValue) .map( d -> (DataValue) d ) - .distinct() - .sorted() - .toList(); + .collect(Collectors.toSet()); } public int getHeight() { @@ -450,8 +449,8 @@ public SDT copy() { * Returns true if other is semantically equivalent to this */ public boolean isEquivalent(SDT other, ConstraintSolver solver) { - List registers = getDataValues(); - List otherRegisters = other.getDataValues(); + Set registers = getDataValues(); + Set otherRegisters = other.getDataValues(); if (registers.size() != otherRegisters.size() || !new HashSet<>(registers).containsAll(otherRegisters)) { return false; @@ -487,8 +486,8 @@ public boolean isEquivalent(SDT other, ConstraintSolver solver) { */ public static Bijection equivalentUnderBijection(SDT sdt1, SDT sdt2, Bijection bi, ConstraintSolver solver) { sdt1 = sdt1.relabel(SDTRelabeling.fromBijection(bi)); - List regs1 = sdt1.getDataValues(); - List regs2 = sdt2.getDataValues(); + Set regs1 = sdt1.getDataValues(); + Set regs2 = sdt2.getDataValues(); if (regs1.size() != regs2.size()) { return null; diff --git a/src/main/java/de/learnlib/ralib/theory/inequality/InequalityTheoryWithEq.java b/src/main/java/de/learnlib/ralib/theory/inequality/InequalityTheoryWithEq.java index 6831a040..74181f62 100644 --- a/src/main/java/de/learnlib/ralib/theory/inequality/InequalityTheoryWithEq.java +++ b/src/main/java/de/learnlib/ralib/theory/inequality/InequalityTheoryWithEq.java @@ -276,7 +276,7 @@ private SDTGuard GuardSetFromList(Set merged, List remaining private Map, SDT> modGuardLists(SDTGuard refGuard, SDT refSDT, Map, SDT> partitionedMap) { boolean merged = false; Map, SDT> newParMap = new LinkedHashMap<>(); -// System.out.println("modGuardLists for refGuard " + refGuard + ", refSDT " + refSDT + ", map: " + partitionedMap); + //System.out.println("modGuardLists for refGuard " + refGuard + ", refSDT " + refSDT + ", map: " + partitionedMap); for (Map.Entry, SDT> par : partitionedMap.entrySet()) { // merged = false; // System.out.println("par: " + par); @@ -324,13 +324,13 @@ private Map, SDT> modGuardLists(SDTGuard refGuard, SDT refSDT, Ma if (newHeadList.contains(new SDTGuard.EqualityGuard(iRefGuard.getParameter(), iRefGuard.leftLimit()))) { eqG = new SDTGuard.EqualityGuard(iRefGuard.getParameter(), iRefGuard.leftLimit()); } else if (newHeadList.contains(new SDTGuard.EqualityGuard(iRefGuard.getParameter(), iRefGuard.rightLimit()))) { - eqG = new SDTGuard.EqualityGuard(iRefGuard.getParameter(), iRefGuard.leftLimit()); + eqG = new SDTGuard.EqualityGuard(iRefGuard.getParameter(), iRefGuard.rightLimit()); } if (eqG != null) { -// System.out.println("trying Eq " + refGuard + " against " + newHeadList + " with " + eqG); + System.out.println("trying Eq " + refGuard + " against " + newHeadList + " with " + eqG); SDT joinedSDT = getJoinedSDT(eqG, refSDT, headSDT); if (joinedSDT != null) { -// System.out.println("can merge: EQ" + headList + " with " + refGuard); + System.out.println("can merge: EQ" + headList + " with " + refGuard); newHeadList.add(refGuard); newSDT = joinedSDT; merged = true; diff --git a/src/test/java/de/learnlib/ralib/learning/ralambda/TestSymmetry.java b/src/test/java/de/learnlib/ralib/learning/ralambda/TestSymmetry.java index 796a11cb..9cba225f 100644 --- a/src/test/java/de/learnlib/ralib/learning/ralambda/TestSymmetry.java +++ b/src/test/java/de/learnlib/ralib/learning/ralambda/TestSymmetry.java @@ -209,7 +209,6 @@ public void learnSymmetryExampleCT() { learner.setSolver(solver); learner.learn(); - System.out.println(learner.getHypothesis().toString()); Word ce = Word.fromSymbols( new PSymbolInstance(A, new DataValue(T_INT, BigDecimal.ONE)), @@ -221,7 +220,6 @@ public void learnSymmetryExampleCT() { learner.learn(); Hypothesis hyp = learner.getHypothesis(); - System.out.println(learner.getHypothesis().toString()); ce = Word.fromSymbols( new PSymbolInstance(A, new DataValue(T_INT, BigDecimal.ONE)), @@ -229,7 +227,7 @@ public void learnSymmetryExampleCT() { new PSymbolInstance(B, new DataValue(T_INT, new BigDecimal(3))), new PSymbolInstance(B, new DataValue(T_INT, new BigDecimal(2)))); - Assert.assertTrue(hyp.accepts(ce)); + Assert.assertEquals(sul.accepts(ce), hyp.accepts(ce)); } private RegisterAutomaton buildCT() { @@ -258,6 +256,7 @@ private RegisterAutomaton buildCT() { storeR1Mapping.put(r1, p1); VarMapping storeR2Mapping = new VarMapping(); storeR2Mapping.put(r2, p1); + storeR2Mapping.put(r1, r1); VarMapping storeR1R2Mapping = new VarMapping(); storeR1R2Mapping.put(r2, r1); storeR1R2Mapping.put(r1, p1); From 45ed014f6a786d81b25dda710528bf189e83f0b0 Mon Sep 17 00:00:00 2001 From: Falk Howar Date: Fri, 21 Mar 2025 16:01:37 +0100 Subject: [PATCH 26/26] two more small bugs --- .../learnlib/ralib/learning/AutomatonBuilder.java | 14 +++++++++++++- .../theory/inequality/InequalityTheoryWithEq.java | 3 +-- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/main/java/de/learnlib/ralib/learning/AutomatonBuilder.java b/src/main/java/de/learnlib/ralib/learning/AutomatonBuilder.java index 6494baa2..32815a5b 100644 --- a/src/main/java/de/learnlib/ralib/learning/AutomatonBuilder.java +++ b/src/main/java/de/learnlib/ralib/learning/AutomatonBuilder.java @@ -20,6 +20,7 @@ import java.util.Map; import java.util.Map.Entry; +import de.learnlib.ralib.learning.rastar.Component; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -114,7 +115,18 @@ private void computeTransition(LocationComponent dest_c, PrefixContainer r) { Word dest_id = dest_c.getAccessSequence(); Word src_id = r.getPrefix().prefix(r.getPrefix().length() -1); - LocationComponent src_c = this.components.get(src_id); + + assert src_id != null; + LocationComponent src_c = null; + for (LocationComponent c : this.components.values()) { + if (c.getPrimePrefix().getPrefix().equals(src_id) || c.getOtherPrefixes().stream().map(PrefixContainer::getPrefix).toList().contains(src_id)) { + src_id = c.getAccessSequence(); + src_c = c; + break; + } + } + //this.components.get(src_id); + assert src_c != null; // if (src_c == null && automaton instanceof DTHyp) // return; diff --git a/src/main/java/de/learnlib/ralib/theory/inequality/InequalityTheoryWithEq.java b/src/main/java/de/learnlib/ralib/theory/inequality/InequalityTheoryWithEq.java index 74181f62..df4183fb 100644 --- a/src/main/java/de/learnlib/ralib/theory/inequality/InequalityTheoryWithEq.java +++ b/src/main/java/de/learnlib/ralib/theory/inequality/InequalityTheoryWithEq.java @@ -826,8 +826,7 @@ private DataValue getRegisterValue(SDTGuardElement r, // LOGGER.trace("p: " + p.toString()); return (DataValue) r; } else if (SDTGuardElement.isSuffixValue(r)) { - Parameter p = new Parameter(r.getDataType(), ((SuffixValue)r).getId()); - return pval.get(p); + return pval.get( (SuffixValue) r); } else if (SDTGuardElement.isConstant(r)) { return constants.get((SymbolicDataValue.Constant) r); } else {