From 7d04e972535156c668b61fa8742ce4b00449601a Mon Sep 17 00:00:00 2001 From: Alexander Delman Date: Sat, 15 Jun 2024 16:46:40 +0300 Subject: [PATCH] (#330) fixed SCCs coloring --- apps/UnitTestsApp/src/UnitTests.cpp | 1 + libs/Objects/include/Objects/MemoryCommon.h | 1 + libs/Objects/src/MemoryFiniteAutomaton.cpp | 23 ++++++++++++++------- 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/apps/UnitTestsApp/src/UnitTests.cpp b/apps/UnitTestsApp/src/UnitTests.cpp index 68a4417d..92cb2f46 100644 --- a/apps/UnitTestsApp/src/UnitTests.cpp +++ b/apps/UnitTestsApp/src/UnitTests.cpp @@ -782,6 +782,7 @@ TEST(TestBisimilar, MFA_Bisimilar) { {"[a]:1*&1", "[a*]:1*&1", false}, {"[a]:1*[a*]:1&1", "[a|]:1*&1", false}, {"([a|]:1*&1)*", "([aa*|]:1&1)*", false}, + {"b*[a*]:1*&1", "b*[a*]:1&1", false}, // несовпадение по решающим действиям {"[a|b]:1c(a|b)&1", "(a|b)c[a|b]:1&1", false}, // несовпадение CG diff --git a/libs/Objects/include/Objects/MemoryCommon.h b/libs/Objects/include/Objects/MemoryCommon.h index a764bc16..8fa8bdbe 100644 --- a/libs/Objects/include/Objects/MemoryCommon.h +++ b/libs/Objects/include/Objects/MemoryCommon.h @@ -2,6 +2,7 @@ #include #include #include +#include #include #include #include diff --git a/libs/Objects/src/MemoryFiniteAutomaton.cpp b/libs/Objects/src/MemoryFiniteAutomaton.cpp index d8bbc7ec..a66c4561 100644 --- a/libs/Objects/src/MemoryFiniteAutomaton.cpp +++ b/libs/Objects/src/MemoryFiniteAutomaton.cpp @@ -1592,7 +1592,8 @@ optional MemoryFiniteAutomaton::bisimilarity_checker(const MemoryFiniteAut vector>>>> colored_SCCs(N); for (int i = 0; i < N; i++) { for (const auto& SCC : SCCs[i]) { - unordered_set colors_to_ignore; + unordered_set colors_to_ignore_mandatory; + unordered_set colors_to_ignore_optional; for (auto state : SCC) { unordered_set cur_colors_to_ignore; unordered_set colors_of_internal_transitions; @@ -1614,18 +1615,26 @@ optional MemoryFiniteAutomaton::bisimilarity_checker(const MemoryFiniteAut } } } + colors_to_ignore_optional.insert(cur_colors_to_ignore.begin(), + cur_colors_to_ignore.end()); for (const auto& color : colors_of_internal_transitions) cur_colors_to_ignore.erase(color); - colors_to_ignore.insert(cur_colors_to_ignore.begin(), cur_colors_to_ignore.end()); + colors_to_ignore_mandatory.insert(cur_colors_to_ignore.begin(), + cur_colors_to_ignore.end()); } set>> colored_SCC; for (auto j : SCC) { - unordered_set j_colors; - for (auto color : mfa_colors[i][j]) - if (!colors_to_ignore.count(color)) - j_colors.insert(color); - colored_SCC.insert({ab_classes[i][j], set(j_colors.begin(), j_colors.end())}); + vector> colors_to_ignore = {colors_to_ignore_mandatory}; + if (!colors_to_ignore_optional.empty()) + colors_to_ignore.emplace_back(colors_to_ignore_optional); + for (const auto& ignore : colors_to_ignore) { + unordered_set j_colors; + for (auto color : mfa_colors[i][j]) + if (!ignore.count(color)) + j_colors.insert(color); + colored_SCC.insert({ab_classes[i][j], {j_colors.begin(), j_colors.end()}}); + } } if (!colored_SCC.empty()) colored_SCCs[i].insert(colored_SCC);