From 92da0f8878813ea30d636dc895450af996e567ad Mon Sep 17 00:00:00 2001 From: Alexander Delman Date: Wed, 12 Jun 2024 08:38:33 +0300 Subject: [PATCH] (#330) SCCs coloring fix --- apps/UnitTestsApp/src/UnitTests.cpp | 2 +- libs/Objects/src/MemoryFiniteAutomaton.cpp | 23 ++++++++++++---------- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/apps/UnitTestsApp/src/UnitTests.cpp b/apps/UnitTestsApp/src/UnitTests.cpp index 46930ae2..68a4417d 100644 --- a/apps/UnitTestsApp/src/UnitTests.cpp +++ b/apps/UnitTestsApp/src/UnitTests.cpp @@ -781,12 +781,12 @@ 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}, // несовпадение по решающим действиям {"[a|b]:1c(a|b)&1", "(a|b)c[a|b]:1&1", false}, // несовпадение CG {"[aa]:1&1", "[|aa]:1&1", false}, {"[a*]:1a&1", "[a*a]:1&1", false}, - {"([a|]:1*&1)*", "([aa*|]:1&1)*", false}, }; for_each(tests.begin(), tests.end(), [](const Test& test) { diff --git a/libs/Objects/src/MemoryFiniteAutomaton.cpp b/libs/Objects/src/MemoryFiniteAutomaton.cpp index f6303e3c..d077dca0 100644 --- a/libs/Objects/src/MemoryFiniteAutomaton.cpp +++ b/libs/Objects/src/MemoryFiniteAutomaton.cpp @@ -1581,26 +1581,29 @@ optional MemoryFiniteAutomaton::bisimilarity_checker(const MemoryFiniteAut for (const auto& SCC : SCCs[i]) { unordered_set colors_to_ignore; for (auto state : SCC) { - unordered_set state_colors_to_ignore; - bool has_transitions_without_actions = false; + unordered_set cur_colors_to_ignore; + unordered_set colors_of_internal_transitions; for (const auto& [symbol, symbol_transitions] : mfas[i]->states[state].transitions) { for (const auto& tr : symbol_transitions) { if (SCC.count(tr.to)) { if (tr.memory_actions.empty()) { - state_colors_to_ignore.clear(); - has_transitions_without_actions = true; - break; + for (auto color : mfa_colors[i][state]) { + if (mfa_colors[i][tr.to].find(color) != + mfa_colors[i][tr.to].end()) { + colors_of_internal_transitions.insert(color); + } + } } for (const auto& [cell, action] : tr.memory_actions) - state_colors_to_ignore.insert(cell); + if (mfa_colors[i][state].count(cell)) + cur_colors_to_ignore.insert(cell); } } - if (has_transitions_without_actions) - break; } - colors_to_ignore.insert(state_colors_to_ignore.begin(), - state_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()); } set>> colored_SCC;