@@ -25,19 +25,21 @@ std::vector<TTA::StateChange> TTASuccessorGenerator::GetNextTickStates(const TTA
2525 return tta.GetNextTickStates (nondeterminism_strategy_t ::VERIFICATION);
2626}
2727
28- std::vector<VariablePredicate> TTASuccessorGenerator::GetInterestingVariablePredicatesInState (const TTA &ttaState) {
28+ std::vector<std::vector< VariablePredicate> > TTASuccessorGenerator::GetInterestingVariablePredicatesInState (const TTA &ttaState) {
2929 // Get all edges that we may be able to take.
3030 auto currentEdges = ttaState.GetCurrentEdges ();
3131 // Filter over the "interesting" edges
3232 currentEdges.erase (std::remove_if (currentEdges.begin (), currentEdges.end (),
3333 [](const auto & edge){ return !edge.ContainsExternalChecks (); }), currentEdges.end ());
3434 // Extract predicates based on the guards of those edges
35- std::vector<VariablePredicate> preds {};
35+ std::vector<std::vector< VariablePredicate>> all_preds {};
3636 for (auto & edge : currentEdges) {
37+ std::vector<VariablePredicate> preds{};
3738 for (auto & expr : edge.externalGuardCollection )
3839 preds.push_back (ConvertFromGuardExpression (expr, ttaState));
40+ all_preds.push_back (preds);
3941 }
40- return preds ; // TODO: Check for uniqueness and/or satisfiability
42+ return all_preds ; // TODO: Check for uniqueness and/or satisfiability
4143}
4244
4345VariablePredicate TTASuccessorGenerator::ConvertFromGuardExpression (const TTA::GuardExpression &expressionTree, const TTA& ttaState) {
@@ -193,35 +195,25 @@ std::vector<TTA::StateChange> BFSCrossProduct(const VariableValueVector& a, cons
193195std::vector<TTA::StateChange> TTASuccessorGenerator::GetNextTockStates (const TTA& ttaState) {
194196 // Get all the interesting variable predicates
195197 auto interestingVarPredicates = GetInterestingVariablePredicatesInState (ttaState);
196- if (interestingVarPredicates.empty ())
198+ std::vector<TTA::StateChange> return_value{};
199+ for (auto & preds : interestingVarPredicates) {
200+ auto changes = GetNextTockStatesFromPredicates (preds, ttaState.GetSymbols ());
201+ return_value.insert (return_value.end (), changes.begin (), changes.end ());
202+ }
203+ return return_value;
204+ }
205+
206+ std::vector<TTA::StateChange> TTASuccessorGenerator::GetNextTockStatesFromPredicates (const std::vector<VariablePredicate>& predicates, const TTA::SymbolMap& symbols) {
207+ if (predicates.empty ())
197208 return {};
198209 VariableValueVector positives{};
199210 VariableValueVector negatives{};
200- for (auto & predicate : interestingVarPredicates ) {
211+ for (auto & predicate : predicates ) {
201212 positives.emplace_back (predicate.variable , predicate.GetValueOverTheEdge ());
202213 negatives.emplace_back (predicate.variable , predicate.GetValueOnTheEdge ());
203214 }
204- int limit = -1 ;
205- auto size = interestingVarPredicates.size ();
206- if (CLIConfig::getInstance ()[" explosion-limit" ])
207- limit = CLIConfig::getInstance ()[" explosion-limit" ].as_integer ();
215+ auto size = predicates.size ();
208216 spdlog::trace (" Size of the set of interesting changes is {0}, this means you will get {1} new states" ,
209217 size, static_cast <int >(pow (2 , size)));
210- if (size < limit || limit == -1 )
211- return SymbolsCrossProduct (positives, negatives, size, ttaState.GetSymbols ());
212- spdlog::warn (" The Tock explosion was too large, trying a weaker strategy - This will likely result in wrong answers." );
213- // TODO: This is technically incorrect. These state changes may have an effect on the reachable state space if they are applied together
214- std::vector<TTA::StateChange> allChanges{};
215- for (auto & positive : positives) {
216- TTA::StateChange stP{}; // Positive path
217- AssignVariable (stP.symbols , ttaState.GetSymbols (), positive.varname , positive.symbol );
218- allChanges.push_back (stP);
219- }
220- for (auto & negative : negatives) {
221- TTA::StateChange stN{}; // Negative path
222- AssignVariable (stN.symbols , ttaState.GetSymbols (), negative.varname , negative.symbol );
223- allChanges.push_back (stN);
224- }
225- spdlog::trace (" Amount of Tock changes: {0}" , allChanges.size ());
226- return allChanges;
218+ return SymbolsCrossProduct (positives, negatives, size, symbols);
227219}
0 commit comments