diff options
author | 宋文武 <iyzsong@member.fsf.org> | 2023-08-17 18:38:23 +0800 |
---|---|---|
committer | 宋文武 <iyzsong@member.fsf.org> | 2023-08-17 18:38:23 +0800 |
commit | 0ffbdf34567aedb0ae6cef6b869370a415cfaa65 (patch) | |
tree | 76425d441657ffbc6cfe996144cda706eb997a12 /gnu/packages/patches/mcrl2-fix-1687.patch | |
parent | d9320de5aa9b77adf5fa31c6429ec8eb08c24458 (diff) | |
parent | 1b2d43fe016848ea2ec16ff18cbc14340944fc4e (diff) | |
download | guix-0ffbdf34567aedb0ae6cef6b869370a415cfaa65.tar.gz guix-0ffbdf34567aedb0ae6cef6b869370a415cfaa65.zip |
Merge remote-tracking branch 'origin/master' into kde-updates
Diffstat (limited to 'gnu/packages/patches/mcrl2-fix-1687.patch')
-rw-r--r-- | gnu/packages/patches/mcrl2-fix-1687.patch | 337 |
1 files changed, 0 insertions, 337 deletions
diff --git a/gnu/packages/patches/mcrl2-fix-1687.patch b/gnu/packages/patches/mcrl2-fix-1687.patch deleted file mode 100644 index 449ecbf638..0000000000 --- a/gnu/packages/patches/mcrl2-fix-1687.patch +++ /dev/null @@ -1,337 +0,0 @@ -Taken from upstream: - https://github.com/mCRL2org/mCRL2/commit/f38998be5198236bc5bf5a957b0e132d6d6d8bee - -Fixes bug in ltsconvert: - https://listserver.tue.nl/pipermail/mcrl2-users/2022-June/000395.html - -From f38998be5198236bc5bf5a957b0e132d6d6d8bee Mon Sep 17 00:00:00 2001 -From: Jan Friso Groote <J.F.Groote@tue.nl> -Date: Tue, 28 Jun 2022 12:27:47 +0200 -Subject: [PATCH] Solved bug report #1687 - -Hidden actions were not properly recognized in ltsconvert. Multiactions -that were partly hidden compared with the default action label, and had -to be compared with a tau-action. This caused multiple tau-actions to be -listed in the list of actions of an lts, and this caused other tools to -go astray. - -The code to rename actions has completely be rewritten. - -This should solve #1687. - -A test have been added. ---- - libraries/lts/include/mcrl2/lts/lts.h | 95 ++++++++++++++++++++++--- - libraries/lts/test/lts_test.cpp | 61 ++++++++-------- - tools/release/ltsconvert/ltsconvert.cpp | 3 +- - 3 files changed, 116 insertions(+), 43 deletions(-) - -diff --git a/libraries/lts/include/mcrl2/lts/lts.h b/libraries/lts/include/mcrl2/lts/lts.h -index 095031e7c..8562eb900 100644 ---- a/libraries/lts/include/mcrl2/lts/lts.h -+++ b/libraries/lts/include/mcrl2/lts/lts.h -@@ -25,6 +25,7 @@ - #include <algorithm> - #include <cassert> - #include <set> -+#include <map> - #include "mcrl2/lts/transition.h" - #include "mcrl2/lts/lts_type.h" - -@@ -482,40 +483,112 @@ class lts: public LTS_BASE - return; - } - -+ std::map<labels_size_type, labels_size_type> action_rename_map; - for (labels_size_type i=0; i< num_action_labels(); ++i) - { - ACTION_LABEL_T a=action_label(i); - a.hide_actions(tau_actions); -- if (a==ACTION_LABEL_T()) -+ if (a==ACTION_LABEL_T::tau_action()) - { -- m_hidden_label_set.insert(i); -+ if (i!=const_tau_label_index) -+ { -+ m_hidden_label_set.insert(i); -+ } - } - else if (a!=action_label(i)) - { -- set_action_label(i,a); -+ /* In this the action_label i is changed by the tau_actions but not renamed to tau. -+ We check whether a maps onto another action label index. If yes, it is added to -+ the rename map, and we explicitly rename transition labels with this label afterwards. -+ If no, we rename the action label. -+ */ -+ bool found=false; -+ for (labels_size_type j=0; !found && j< num_action_labels(); ++j) -+ { -+ if (a==action_label(j)) -+ { -+ if (i!=j) -+ { -+ action_rename_map[i]=j; -+ } -+ found=true; -+ } -+ } -+ if (!found) // a!=action_label(j) for any j, then rename action_label(i) to a. -+ { -+ set_action_label(i,a); -+ } -+ } -+ } -+ -+ if (action_rename_map.size()>0) // Check whether there are action labels that must be renamed, and -+ { -+ for(transition& t: m_transitions) -+ { -+ auto i = action_rename_map.find(t.label()); -+ if (i!=action_rename_map.end()) -+ { -+ t=transition(t.from(),i->second,t.to()); -+ } - } - } - } - -- /** \brief Apply the recorded actions that are renamed to internal actions to the lts. -- * \details After hiding actions, it checks whether action labels are -- * equal and merges actions with the same labels in the lts. -+ /** \brief Rename the hidden actions in the lts. -+ * \details Multiactions can be partially renamed. I.e. a|b becomes a if b is hidden. -+ * In such a case the new action a is mapped onto an existing action a; if such -+ * a label a does not exist, the action a|b is renamed to a. - * \param[in] tau_actions Vector with strings indicating which actions must be - * transformed to tau's */ -- void apply_hidden_actions(void) -+ void apply_hidden_actions(const std::vector<std::string>& tau_actions) - { -- if (m_hidden_label_set.size()>0) // Check whether there is something to rename. -+ if (tau_actions.size()==0) -+ { -+ return; -+ } -+ -+ std::map<labels_size_type, labels_size_type> action_rename_map; -+ for (labels_size_type i=0; i< num_action_labels(); ++i) -+ { -+ ACTION_LABEL_T a=action_label(i); -+ a.hide_actions(tau_actions); -+#ifndef NDEBUG -+ ACTION_LABEL_T b=a; -+ b.hide_actions(tau_actions); -+ assert(a==b); // hide_actions applied twice yields the same result as applying it once. -+#endif -+ bool found=false; -+ for (labels_size_type j=0; !found && j< num_action_labels(); ++j) -+ { -+ if (a==action_label(j)) -+ { -+ if (i!=j) -+ { -+ action_rename_map[i]=j; -+ } -+ found=true; -+ } -+ } -+ if (!found) // a!=action_label(j) for any j, then rename action_label(i) to a. -+ { -+ set_action_label(i,a); -+ } -+ } -+ -+ -+ if (action_rename_map.size()>0) // Check whether there is something to rename. - { - for(transition& t: m_transitions) - { -- if (m_hidden_label_set.count(t.label())) -+ auto i = action_rename_map.find(t.label()); -+ if (i!=action_rename_map.end()) - { -- t=transition(t.from(),tau_label_index(),t.to()); -+ t=transition(t.from(),i->second,t.to()); - } - } -- m_hidden_label_set.clear(); // Empty the hidden label set. - } - } -+ - /** \brief Checks whether this LTS has state values associated with its states. - * \retval true if the LTS has state information; - * \retval false otherwise. -diff --git a/libraries/lts/test/lts_test.cpp b/libraries/lts/test/lts_test.cpp -index 5840393d9..ad69f6275 100644 ---- a/libraries/lts/test/lts_test.cpp -+++ b/libraries/lts/test/lts_test.cpp -@@ -149,7 +149,7 @@ static void reduce_lts_in_various_ways(const std::string& test_description, - BOOST_CHECK(is_deterministic(l)); - } - --static void reduce_simple_loop() -+BOOST_AUTO_TEST_CASE(reduce_simple_loop) - { - std::string SIMPLE_AUT = - "des (0,2,2)\n" -@@ -173,7 +173,7 @@ static void reduce_simple_loop() - reduce_lts_in_various_ways("Simple loop", SIMPLE_AUT, expected); - } - --static void reduce_simple_loop_with_tau() -+BOOST_AUTO_TEST_CASE(reduce_simple_loop_with_tau) - { - std::string SIMPLE_AUT = - "des (0,2,2)\n" -@@ -200,7 +200,7 @@ static void reduce_simple_loop_with_tau() - /* The example below was encountered by David Jansen. The problem is that - * for branching bisimulations the tau may supersede the b, not leading to the - * necessary splitting into two equivalence classes. */ --static void tricky_example_for_branching_bisimulation() -+BOOST_AUTO_TEST_CASE(tricky_example_for_branching_bisimulation) - { - std::string TRICKY_BB = - "des (0,3,2)\n" -@@ -226,7 +226,7 @@ static void tricky_example_for_branching_bisimulation() - } - - --static void reduce_abp() -+BOOST_AUTO_TEST_CASE(reduce_abp) - { - std::string ABP_AUT = - "des (0,92,74)\n" -@@ -342,7 +342,7 @@ static void reduce_abp() - - // Peterson's protocol has the interesting property that the number of states modulo branching bisimulation - // differs from the number of states modulo weak bisimulation, as observed by Rob van Glabbeek. --static void reduce_peterson() -+BOOST_AUTO_TEST_CASE(reduce_peterson) - { - std::string PETERSON_AUT = - "des (0,59,35)\n" -@@ -423,7 +423,7 @@ static void reduce_peterson() - reduce_lts_in_various_ways("Peterson protocol", PETERSON_AUT, expected); - } - --static void test_reachability() -+BOOST_AUTO_TEST_CASE(test_reachability) - { - std::string REACH = - "des (0,4,5) \n" -@@ -449,7 +449,7 @@ static void test_reachability() - - // The example below caused failures in the GW mlogn branching bisimulation - // algorithm when cleaning the code up. --static void failing_test_groote_wijs_algorithm() -+BOOST_AUTO_TEST_CASE(failing_test_groote_wijs_algorithm) - { - std::string GWLTS = - "des(0,29,10)\n" -@@ -511,7 +511,7 @@ static void failing_test_groote_wijs_algorithm() - // It has not been implemented fully. The problem is that it is difficult to - // prescribe the order in which refinements have to be done. - --static void counterexample_jk_1(std::size_t k) -+void counterexample_jk_1(std::size_t k) - { - // numbering scheme of states: - // states 0..k-1 are the blue squares -@@ -571,7 +571,7 @@ static void counterexample_jk_1(std::size_t k) - - // In the meantime, the bug is corrected: this is why the first part of the - // algorithm now follows a much simpler line than previously. --static void counterexample_postprocessing() -+BOOST_AUTO_TEST_CASE(counterexample_postprocessing) - { - std::string POSTPROCESS_AUT = - "des(0,33,13)\n" -@@ -634,7 +634,7 @@ static void counterexample_postprocessing() - test_lts("postprocessing problem (branching bisimulation signature [Blom/Orzan 2003])",l,expected_label_count, expected_state_count, expected_transition_count); - } - --static void regression_delete_old_bb_slice() -+BOOST_AUTO_TEST_CASE(regression_delete_old_bb_slice) - { - std::string POSTPROCESS_AUT = - "des(0,163,100)\n" -@@ -824,7 +824,7 @@ static void regression_delete_old_bb_slice() - test_lts("regression test for GJKW bug (branching bisimulation signature [Blom/Orzan 2003])",l,expected_label_count, expected_state_count, expected_transition_count); - } - --void is_deterministic_test1() -+BOOST_AUTO_TEST_CASE(is_deterministic_test1) - { - std::string automaton = - "des(0,2,2)\n" -@@ -837,7 +837,7 @@ void is_deterministic_test1() - BOOST_CHECK(is_deterministic(l_det)); - } - --void is_deterministic_test2() -+BOOST_AUTO_TEST_CASE(is_deterministic_test2) - { - std::string automaton = - "des(0,2,2)\n" -@@ -850,24 +850,25 @@ void is_deterministic_test2() - BOOST_CHECK(!is_deterministic(l_det)); - } - --void test_is_deterministic() -+BOOST_AUTO_TEST_CASE(hide_actions1) - { -- is_deterministic_test1(); -- is_deterministic_test2(); --} -+ std::string automaton = -+ "des (0,4,3)\n" -+ "(0,\"<state>\",1)\n" -+ "(1,\"return|hello\",2)\n" -+ "(1,\"return\",2)\n" -+ "(2,\"world\",1)\n"; -+ -+ std::istringstream is(automaton); -+ lts::lts_aut_t l; -+ l.load(is); -+ std::vector<std::string>hidden_actions(1,"hello"); -+ l.apply_hidden_actions(hidden_actions); -+ reduce(l,lts::lts_eq_bisim); -+ std::size_t expected_label_count = 5; -+ std::size_t expected_state_count = 3; -+ std::size_t expected_transition_count = 3; -+ test_lts("regression test for GJKW bug (branching bisimulation [Jansen/Groote/Keiren/Wijs 2019])",l,expected_label_count, expected_state_count, expected_transition_count); -+ - --BOOST_AUTO_TEST_CASE(test_main) --{ -- reduce_simple_loop(); -- reduce_simple_loop_with_tau(); -- tricky_example_for_branching_bisimulation(); -- reduce_abp(); -- reduce_peterson(); -- test_reachability(); -- test_is_deterministic(); -- failing_test_groote_wijs_algorithm(); -- counterexample_jk_1(3); -- counterexample_postprocessing(); -- regression_delete_old_bb_slice(); -- // TODO: Add groote wijs branching bisimulation and add weak bisimulation tests. For the last Peterson is a good candidate. - } -diff --git a/tools/release/ltsconvert/ltsconvert.cpp b/tools/release/ltsconvert/ltsconvert.cpp -index 231deabe2..5645d31d1 100644 ---- a/tools/release/ltsconvert/ltsconvert.cpp -+++ b/tools/release/ltsconvert/ltsconvert.cpp -@@ -123,8 +123,7 @@ class ltsconvert_tool : public input_output_tool - - LTS_TYPE l; - l.load(tool_options.infilename); -- l.record_hidden_actions(tool_options.tau_actions); -- l.apply_hidden_actions(); -+ l.apply_hidden_actions(tool_options.tau_actions); - - if (tool_options.check_reach) - { --- -2.35.1 - |