diff --git a/boost_tests/explicit_engine_test.cpp b/boost_tests/explicit_engine_test.cpp index 0a55c93e8..f0369293c 100644 --- a/boost_tests/explicit_engine_test.cpp +++ b/boost_tests/explicit_engine_test.cpp @@ -16,18 +16,23 @@ BOOST_AUTO_TEST_CASE(DirectoryTest) { BOOST_REQUIRE(getenv("TEST_FILES")); } -void test_explicit_engine(const char* fn, ExplicitColoredModelChecker::Result expected, size_t quid = 0) { +void test_explicit_engine(const char* fn, ExplicitColoredModelChecker::Result expected, size_t quid = 0, + uint32_t kbound = 4, const char* expectedOutput = nullptr) { std::string model = std::string("/models/explicit-engine/") + fn + ".pnml"; std::string query = std::string("/models/explicit-engine/") + fn + ".xml"; std::set qnums{quid}; auto [queries, querynames, sset, options] = load_explicit(model, query, qnums); - options.kbound = 4; + options.kbound = kbound; ExplicitColoredModelChecker checker(sset, std::cout); - - auto result = checker.checkQuery(queries[0], options); + std::ostringstream output; + ColoredResultPrinter printer(quid, output, querynames[0], options.seed(), output); + auto result = checker.checkQuery(queries[0], options, expectedOutput ? &printer : nullptr); BOOST_REQUIRE_EQUAL(expected, result); + if (expectedOutput) { + BOOST_REQUIRE(output.str().find(expectedOutput) != std::string::npos); + } } BOOST_AUTO_TEST_CASE(SubtractionWithVars, * utf::timeout(5)) { @@ -37,3 +42,9 @@ BOOST_AUTO_TEST_CASE(SubtractionWithVars, * utf::timeout(5)) { BOOST_AUTO_TEST_CASE(ReferendumColoredSubtraction, * utf::timeout(5)) { test_explicit_engine("referendum_colored_subtraction", ExplicitColoredModelChecker::Result::SATISFIED); } + +BOOST_AUTO_TEST_CASE(KBound, * utf::timeout(5)) { + test_explicit_engine("referendum_colored_subtraction", ExplicitColoredModelChecker::Result::UNSATISFIED, 1, 9, + "FORMULA Ten voting tokens are reachable FALSE"); + test_explicit_engine("referendum_colored_subtraction", ExplicitColoredModelChecker::Result::SATISFIED, 1, 10); +} diff --git a/boost_tests/models/explicit-engine/referendum_colored_subtraction.xml b/boost_tests/models/explicit-engine/referendum_colored_subtraction.xml index 11b6091ff..51be9b88a 100644 --- a/boost_tests/models/explicit-engine/referendum_colored_subtraction.xml +++ b/boost_tests/models/explicit-engine/referendum_colored_subtraction.xml @@ -22,4 +22,21 @@ + + + Ten voting tokens are reachable + Ten voting tokens are reachable + + + + + + Referendum_colored_voting + + 10 + + + + + diff --git a/include/PetriEngine/ExplicitColored/Algorithms/ExplicitWorklist.h b/include/PetriEngine/ExplicitColored/Algorithms/ExplicitWorklist.h index 6509f7a74..360ecdcf6 100644 --- a/include/PetriEngine/ExplicitColored/Algorithms/ExplicitWorklist.h +++ b/include/PetriEngine/ExplicitColored/Algorithms/ExplicitWorklist.h @@ -36,10 +36,11 @@ namespace PetriEngine::ExplicitColored { const std::unordered_map& placeNameIndices, const std::unordered_map& transitionNameIndices, size_t seed, - bool createTrace + bool createTrace, + uint32_t kbound ); - bool check(Strategy searchStrategy, ColoredSuccessorGeneratorOption coloredSuccessorGeneratorOption); + Reachability::AbstractHandler::Result check(Strategy searchStrategy, ColoredSuccessorGeneratorOption coloredSuccessorGeneratorOption); [[nodiscard]] const SearchStatistics& GetSearchStatistics() const; std::optional getCounterExampleId() const; std::optional> getTraceTo(uint64_t counterExampleId) const; @@ -50,26 +51,28 @@ namespace PetriEngine::ExplicitColored { const ColoredPetriNet& _net; const ColoredSuccessorGenerator _successorGenerator; const size_t _seed; + uint32_t _kbound; bool _fullStatespace = true; bool _createTrace; StateMap _stateMap; SearchStatistics _searchStatistics; template - [[nodiscard]] bool _search(Strategy searchStrategy); + [[nodiscard]] Reachability::AbstractHandler::Result _search(Strategy searchStrategy); [[nodiscard]] bool _check(const ColoredPetriNetMarking& state, size_t id) const; + [[nodiscard]] uint64_t _tokenCount(const ColoredPetriNetMarking& marking) const; template - [[nodiscard]] bool _dfs(); + [[nodiscard]] Reachability::AbstractHandler::Result _dfs(); template - [[nodiscard]] bool _bfs(); + [[nodiscard]] Reachability::AbstractHandler::Result _bfs(); template - [[nodiscard]] bool _rdfs(); + [[nodiscard]] Reachability::AbstractHandler::Result _rdfs(); template - [[nodiscard]] bool _bestfs(); + [[nodiscard]] Reachability::AbstractHandler::Result _bestfs(); template