Skip to content

Commit

Permalink
(#330) fixed SCCs coloring
Browse files Browse the repository at this point in the history
  • Loading branch information
xendalm committed Jun 15, 2024
1 parent 968f233 commit 7d04e97
Show file tree
Hide file tree
Showing 3 changed files with 18 additions and 7 deletions.
1 change: 1 addition & 0 deletions apps/UnitTestsApp/src/UnitTests.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
1 change: 1 addition & 0 deletions libs/Objects/include/Objects/MemoryCommon.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
#include <iostream>
#include <optional>
#include <string>
#include <tuple>
#include <unordered_map>
#include <unordered_set>
#include <utility>
Expand Down
23 changes: 16 additions & 7 deletions libs/Objects/src/MemoryFiniteAutomaton.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1592,7 +1592,8 @@ optional<bool> MemoryFiniteAutomaton::bisimilarity_checker(const MemoryFiniteAut
vector<set<set<pair<int, set<int>>>>> colored_SCCs(N);
for (int i = 0; i < N; i++) {
for (const auto& SCC : SCCs[i]) {
unordered_set<int> colors_to_ignore;
unordered_set<int> colors_to_ignore_mandatory;
unordered_set<int> colors_to_ignore_optional;
for (auto state : SCC) {
unordered_set<int> cur_colors_to_ignore;
unordered_set<int> colors_of_internal_transitions;
Expand All @@ -1614,18 +1615,26 @@ optional<bool> 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<pair<int, set<int>>> colored_SCC;
for (auto j : SCC) {
unordered_set<int> 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<int>(j_colors.begin(), j_colors.end())});
vector<unordered_set<int>> 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<int> 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);
Expand Down

0 comments on commit 7d04e97

Please sign in to comment.