LCOV - code coverage report
Current view: top level - lts/test - lts_test.cpp (source / functions) Hit Total Coverage
Test: mcrl2_coverage.info.cleaned Lines: 309 339 91.2 %
Date: 2024-04-19 03:43:27 Functions: 32 33 97.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : // Author(s): anonymous
       2             : // Copyright: see the accompanying file COPYING or copy at
       3             : // https://github.com/mCRL2org/mCRL2/blob/master/COPYING
       4             : //
       5             : // Distributed under the Boost Software License, Version 1.0.
       6             : // (See accompanying file LICENSE_1_0.txt or copy at
       7             : // http://www.boost.org/LICENSE_1_0.txt)
       8             : //
       9             : /// \file lts_test.cpp
      10             : /// \brief Add your file description here.
      11             : 
      12             : #define BOOST_TEST_MODULE lts_test
      13             : #include <boost/test/included/unit_test.hpp>
      14             : 
      15             : #include "mcrl2/lts/lts_algorithm.h"
      16             : 
      17             : using namespace mcrl2;
      18             : 
      19             : class expected_sizes
      20             : {
      21             :   public:
      22             :     std::size_t states_plain, transitions_plain, labels_plain;
      23             :     std::size_t states_bisimulation, transitions_bisimulation, labels_bisimulation;
      24             :     std::size_t states_branching_bisimulation, transitions_branching_bisimulation, labels_branching_bisimulation;
      25             :     std::size_t states_divergence_preserving_branching_bisimulation, transitions_divergence_preserving_branching_bisimulation, labels_divergence_preserving_branching_bisimulation;
      26             :     std::size_t states_weak_bisimulation, transitions_weak_bisimulation, labels_weak_bisimulation;
      27             :     std::size_t states_divergence_preserving_weak_bisimulation, transitions_divergence_preserving_weak_bisimulation, labels_divergence_preserving_weak_bisimulation;
      28             :     std::size_t states_simulation, transitions_simulation, labels_simulation;
      29             :     std::size_t states_trace_equivalence, transitions_trace_equivalence, labels_trace_equivalence;
      30             :     std::size_t states_weak_trace_equivalence, transitions_weak_trace_equivalence, labels_weak_trace_equivalence;
      31             :     std::size_t states_determinisation, transitions_determinisation, labels_determinisation;
      32             :     bool is_deterministic;
      33             : };
      34             : 
      35         118 : static void test_lts(const std::string& test_description,
      36             :               const lts::lts_aut_t& l,
      37             :               std::size_t expected_label_count,
      38             :               std::size_t expected_state_count,
      39             :               std::size_t expected_transition_count
      40             :              )
      41             : {
      42         118 :   std::cerr << "LPS test: " << test_description << " -----------------------------------------------\n";
      43         118 :   BOOST_CHECK(l.num_action_labels() == expected_label_count);
      44         118 :   if (l.num_action_labels() != expected_label_count)
      45             :   {
      46           0 :     std::cerr << "Expected # of labels " << expected_label_count << " Actual # " << l.num_action_labels() << "\n";
      47             :   }
      48         118 :   BOOST_CHECK(l.num_states() == expected_state_count);
      49         118 :   if (l.num_states() != expected_state_count)
      50             :   {
      51           0 :     std::cerr << "Expected # of states " << expected_state_count << " Actual # " << l.num_states() << "\n";
      52             :   }
      53         118 :   BOOST_CHECK(l.num_transitions() == expected_transition_count);
      54         118 :   if (l.num_transitions() != expected_transition_count)
      55             :   {
      56           0 :     std::cerr << "Expected # of transitions " << expected_transition_count << " Actual # " << l.num_transitions() << "\n";
      57             :   }
      58         118 : }
      59             : 
      60           5 : static void reduce_lts_in_various_ways(const std::string& test_description,
      61             :                                        const std::string& lts,
      62             :                                        const expected_sizes& expected)
      63             : {
      64           5 :   std::istringstream is(lts);
      65           5 :   lts::lts_aut_t l_in;
      66           5 :   l_in.load(is);
      67           5 :   test_lts(test_description + " (plain input)",l_in, expected.labels_plain,expected.states_plain, expected.transitions_plain);
      68           5 :   lts::lts_aut_t l=l_in;
      69           5 :   reduce(l,lts::lts_eq_none);
      70           5 :   test_lts(test_description + " (no reduction)",l, expected.labels_plain,expected.states_plain, expected.transitions_plain);
      71           5 :   l=l_in;
      72           5 :   reduce(l,lts::lts_eq_bisim);
      73           5 :   test_lts(test_description + " (bisimulation [Jansen/Groote/Keiren/Wijs 2019])",l, expected.labels_bisimulation,expected.states_bisimulation, expected.transitions_bisimulation);
      74           5 :   l=l_in;
      75           5 :   reduce(l,lts::lts_eq_bisim_gv);
      76           5 :   test_lts(test_description + " (bisimulation [Groote/Vaandrager 1990])",l, expected.labels_bisimulation,expected.states_bisimulation, expected.transitions_bisimulation);
      77           5 :   l=l_in;
      78           5 :   reduce(l,lts::lts_eq_bisim_gjkw);
      79           5 :   test_lts(test_description + " (bisimulation [Groote/Jansen/Keiren/Wijs 2017)",l, expected.labels_bisimulation,expected.states_bisimulation, expected.transitions_bisimulation);
      80           5 :   l=l_in;
      81           5 :   reduce(l,lts::lts_eq_bisim_sigref);
      82           5 :   test_lts(test_description + " (bisimulation signature [Blom/Orzan 2003])",l, expected.labels_bisimulation,expected.states_bisimulation, expected.transitions_bisimulation);
      83           5 :   l=l_in;
      84           5 :   reduce(l,lts::lts_eq_branching_bisim);
      85           5 :   test_lts(test_description + " (branching bisimulation [Jansen/Groote/Keiren/Wijs 2019])",l, expected.labels_branching_bisimulation,expected.states_branching_bisimulation, expected.transitions_branching_bisimulation);
      86           5 :   l=l_in;
      87           5 :   reduce(l,lts::lts_eq_branching_bisim_gv);
      88           5 :   test_lts(test_description + " (branching bisimulation [Groote/Vaandrager 1990])",l, expected.labels_branching_bisimulation,expected.states_branching_bisimulation, expected.transitions_branching_bisimulation);
      89           5 :   l=l_in;
      90           5 :   reduce(l,lts::lts_eq_branching_bisim_gjkw);
      91           5 :   test_lts(test_description + " (branching bisimulation [Groote/Jansen/Keiren/Wijs 2017])",l, expected.labels_branching_bisimulation,expected.states_branching_bisimulation, expected.transitions_branching_bisimulation);
      92           5 :   l=l_in;
      93           5 :   reduce(l,lts::lts_eq_branching_bisim_sigref);
      94           5 :   test_lts(test_description + " (branching bisimulation signature [Blom/Orzan 2003])",l, expected.labels_branching_bisimulation,expected.states_branching_bisimulation, expected.transitions_branching_bisimulation);
      95           5 :   l=l_in;
      96           5 :   reduce(l,lts::lts_eq_divergence_preserving_branching_bisim);
      97           5 :   test_lts(test_description + " (divergence-preserving branching bisimulation [Jansen/Groote/Keiren/Wijs 2019])",l,
      98           5 :                                       expected.labels_divergence_preserving_branching_bisimulation,
      99           5 :                                       expected.states_divergence_preserving_branching_bisimulation,
     100           5 :                                       expected.transitions_divergence_preserving_branching_bisimulation);
     101           5 :   l=l_in;
     102           5 :   reduce(l,lts::lts_eq_divergence_preserving_branching_bisim_gv);
     103           5 :   test_lts(test_description + " (divergence-preserving branching bisimulation [Groote/Vaandrager 1990])",l,
     104           5 :                                       expected.labels_divergence_preserving_branching_bisimulation,
     105           5 :                                       expected.states_divergence_preserving_branching_bisimulation,
     106           5 :                                       expected.transitions_divergence_preserving_branching_bisimulation);
     107           5 :   l=l_in;
     108           5 :   reduce(l,lts::lts_eq_divergence_preserving_branching_bisim_gjkw);
     109           5 :   test_lts(test_description + " (divergence-preserving branching bisimulation [Groote/Jansen/Keiren/Wijs 2017])",l,
     110           5 :                                      expected.labels_divergence_preserving_branching_bisimulation,
     111           5 :                                      expected.states_divergence_preserving_branching_bisimulation,
     112           5 :                                      expected.transitions_divergence_preserving_branching_bisimulation);
     113           5 :   l=l_in;
     114           5 :   reduce(l,lts::lts_eq_divergence_preserving_branching_bisim_sigref);
     115           5 :   test_lts(test_description + " (divergence-preserving branching bisimulation signature [Blom/Orzan 2003])",l,
     116           5 :                                       expected.labels_divergence_preserving_branching_bisimulation,
     117           5 :                                       expected.states_divergence_preserving_branching_bisimulation,
     118           5 :                                       expected.transitions_divergence_preserving_branching_bisimulation);
     119           5 :   l=l_in;
     120           5 :   reduce(l,lts::lts_eq_weak_bisim);
     121           5 :   test_lts(test_description + " (weak bisimulation)",l, expected.labels_weak_bisimulation,expected.states_weak_bisimulation, expected.transitions_weak_bisimulation);
     122           5 :   l=l_in;
     123           5 :   reduce(l,lts::lts_eq_divergence_preserving_weak_bisim);
     124           5 :   test_lts(test_description + " (divergence-preserving weak bisimulation)",l,
     125           5 :                                       expected.labels_divergence_preserving_weak_bisimulation,
     126           5 :                                       expected.states_divergence_preserving_weak_bisimulation,
     127           5 :                                       expected.transitions_divergence_preserving_weak_bisimulation);
     128           5 :   l=l_in;
     129           5 :   reduce(l,lts::lts_eq_sim);
     130           5 :   test_lts(test_description + " (simulation equivalence)",l, expected.labels_simulation,expected.states_simulation, expected.transitions_simulation);
     131           5 :   l=l_in;
     132           5 :   reduce(l,lts::lts_eq_trace);
     133           5 :   test_lts(test_description + " (trace equivalence)",l, expected.labels_trace_equivalence,expected.states_trace_equivalence, expected.transitions_trace_equivalence);
     134           5 :   l=l_in;
     135           5 :   reduce(l,lts::lts_eq_weak_trace);
     136           5 :   test_lts(test_description + " (weak trace equivalence)",l, expected.labels_weak_trace_equivalence,expected.states_weak_trace_equivalence, expected.transitions_weak_trace_equivalence);
     137           5 :   l=l_in;
     138           5 :   if (expected.is_deterministic)
     139             :   {
     140           3 :     BOOST_CHECK(is_deterministic(l));
     141             :   }
     142             :   else
     143             :   {
     144           2 :     BOOST_CHECK(!is_deterministic(l));
     145             :   }
     146             : 
     147           5 :   reduce(l,lts::lts_red_determinisation);
     148           5 :   test_lts(test_description + " (determinisation)",l, expected.labels_determinisation,expected.states_determinisation, expected.transitions_determinisation);
     149           5 :   BOOST_CHECK(is_deterministic(l));
     150           5 : }
     151             : 
     152           2 : BOOST_AUTO_TEST_CASE(reduce_simple_loop)
     153             : {
     154             :   std::string SIMPLE_AUT =
     155             :     "des (0,2,2)\n"
     156             :     "(0,\"a\",1)\n"
     157           1 :     "(1,\"a\",0)\n"
     158             :     ;
     159             : 
     160             :   expected_sizes expected;
     161           1 :   expected.states_plain=2; expected.transitions_plain=2; expected.labels_plain=2;
     162           1 :   expected.states_bisimulation=1, expected.transitions_bisimulation=1, expected.labels_bisimulation=2;
     163           1 :   expected.states_branching_bisimulation=1, expected.transitions_branching_bisimulation=1, expected.labels_branching_bisimulation=2;
     164           1 :   expected.states_divergence_preserving_branching_bisimulation=1, expected.transitions_divergence_preserving_branching_bisimulation=1, expected.labels_divergence_preserving_branching_bisimulation=2;
     165           1 :   expected.states_weak_bisimulation=1, expected.transitions_weak_bisimulation=1, expected.labels_weak_bisimulation=2;
     166           1 :   expected.states_divergence_preserving_weak_bisimulation=1, expected.transitions_divergence_preserving_weak_bisimulation=1, expected.labels_divergence_preserving_weak_bisimulation=3;
     167           1 :   expected.states_simulation=1, expected.transitions_simulation=1, expected.labels_simulation=2;
     168           1 :   expected.states_trace_equivalence=1, expected.transitions_trace_equivalence=1, expected.labels_trace_equivalence=2;
     169           1 :   expected.states_weak_trace_equivalence=1, expected.transitions_weak_trace_equivalence=1, expected.labels_weak_trace_equivalence=2;
     170           1 :   expected.states_determinisation=2, expected.transitions_determinisation=2, expected.labels_determinisation=2;
     171           1 :   expected.is_deterministic=true;
     172             : 
     173           1 :   reduce_lts_in_various_ways("Simple loop", SIMPLE_AUT, expected);
     174           1 : }
     175             : 
     176           2 : BOOST_AUTO_TEST_CASE(reduce_simple_loop_with_tau)
     177             : {
     178             :   std::string SIMPLE_AUT =
     179             :     "des (0,2,2)\n"
     180             :     "(0,\"a\",1)\n"
     181           1 :     "(1,\"tau\",0)\n"
     182             :     ;
     183             : 
     184             :   expected_sizes expected;
     185           1 :   expected.states_plain=2; expected.transitions_plain=2; expected.labels_plain=2;
     186           1 :   expected.states_bisimulation=2, expected.transitions_bisimulation=2, expected.labels_bisimulation=2;
     187           1 :   expected.states_branching_bisimulation=1, expected.transitions_branching_bisimulation=1, expected.labels_branching_bisimulation=2;
     188           1 :   expected.states_divergence_preserving_branching_bisimulation=1, expected.transitions_divergence_preserving_branching_bisimulation=1, expected.labels_divergence_preserving_branching_bisimulation=2;
     189           1 :   expected.states_weak_bisimulation=1, expected.transitions_weak_bisimulation=1, expected.labels_weak_bisimulation=2;
     190           1 :   expected.states_divergence_preserving_weak_bisimulation=1, expected.transitions_divergence_preserving_weak_bisimulation=1, expected.labels_divergence_preserving_weak_bisimulation=3;
     191           1 :   expected.states_simulation=2, expected.transitions_simulation=2, expected.labels_simulation=2;
     192           1 :   expected.states_trace_equivalence=2, expected.transitions_trace_equivalence=2, expected.labels_trace_equivalence=2;
     193           1 :   expected.states_weak_trace_equivalence=1, expected.transitions_weak_trace_equivalence=1, expected.labels_weak_trace_equivalence=2;
     194           1 :   expected.states_determinisation=2, expected.transitions_determinisation=2, expected.labels_determinisation=2;
     195           1 :   expected.is_deterministic=true;
     196             : 
     197           1 :   reduce_lts_in_various_ways("Simple loop with tau", SIMPLE_AUT, expected);
     198           1 : }
     199             : 
     200             : /* The example below was encountered by David Jansen. The problem is that
     201             :  * for branching bisimulations the tau may supersede the b, not leading to the
     202             :  * necessary splitting into two equivalence classes. */
     203           2 : BOOST_AUTO_TEST_CASE(tricky_example_for_branching_bisimulation)
     204             : {
     205             :   std::string TRICKY_BB =
     206             :     "des (0,3,2)\n"
     207             :     "(0,\"a\",1)\n"
     208             :     "(1,\"b\",0)\n"
     209           1 :     "(1,\"tau\",0)\n"
     210             :     ;
     211             : 
     212             :   expected_sizes expected;
     213           1 :   expected.states_plain=2; expected.transitions_plain=3; expected.labels_plain=3;
     214           1 :   expected.states_bisimulation=2, expected.transitions_bisimulation=3, expected.labels_bisimulation=3;
     215           1 :   expected.states_branching_bisimulation=2, expected.transitions_branching_bisimulation=3, expected.labels_branching_bisimulation=3;
     216           1 :   expected.states_divergence_preserving_branching_bisimulation=2, expected.transitions_divergence_preserving_branching_bisimulation=3, expected.labels_divergence_preserving_branching_bisimulation=3;
     217           1 :   expected.states_weak_bisimulation=2, expected.transitions_weak_bisimulation=3, expected.labels_weak_bisimulation=3;
     218           1 :   expected.states_divergence_preserving_weak_bisimulation=2, expected.transitions_divergence_preserving_weak_bisimulation=3, expected.labels_divergence_preserving_weak_bisimulation=4;
     219           1 :   expected.states_simulation=2, expected.transitions_simulation=3, expected.labels_simulation=3;
     220           1 :   expected.states_trace_equivalence=2, expected.transitions_trace_equivalence=3, expected.labels_trace_equivalence=3;
     221           1 :   expected.states_weak_trace_equivalence=2, expected.transitions_weak_trace_equivalence=3, expected.labels_weak_trace_equivalence=3;
     222           1 :   expected.states_determinisation=2, expected.transitions_determinisation=3, expected.labels_determinisation=3;
     223           1 :   expected.is_deterministic=true;
     224             : 
     225           1 :   reduce_lts_in_various_ways("Tricky example for branching bisimulation", TRICKY_BB, expected);
     226           1 : }
     227             : 
     228             : 
     229           2 : BOOST_AUTO_TEST_CASE(reduce_abp)
     230             : {
     231             :   std::string ABP_AUT =
     232             :     "des (0,92,74)\n"
     233             :     "(0,\"r1(d1)\",1)\n"
     234             :     "(0,\"r1(d2)\",2)\n"
     235             :     "(1,\"tau\",3)\n"
     236             :     "(2,\"tau\",4)\n"
     237             :     "(3,\"tau\",5)\n"
     238             :     "(3,\"tau\",6)\n"
     239             :     "(4,\"tau\",7)\n"
     240             :     "(4,\"tau\",8)\n"
     241             :     "(5,\"tau\",9)\n"
     242             :     "(6,\"tau\",10)\n"
     243             :     "(7,\"tau\",11)\n"
     244             :     "(8,\"tau\",12)\n"
     245             :     "(9,\"tau\",13)\n"
     246             :     "(10,\"s4(d1)\",14)\n"
     247             :     "(11,\"tau\",15)\n"
     248             :     "(12,\"s4(d2)\",16)\n"
     249             :     "(13,\"tau\",17)\n"
     250             :     "(13,\"tau\",18)\n"
     251             :     "(14,\"tau\",19)\n"
     252             :     "(15,\"tau\",20)\n"
     253             :     "(15,\"tau\",21)\n"
     254             :     "(16,\"tau\",22)\n"
     255             :     "(17,\"tau\",1)\n"
     256             :     "(18,\"tau\",1)\n"
     257             :     "(19,\"tau\",23)\n"
     258             :     "(19,\"tau\",24)\n"
     259             :     "(20,\"tau\",2)\n"
     260             :     "(21,\"tau\",2)\n"
     261             :     "(22,\"tau\",25)\n"
     262             :     "(22,\"tau\",26)\n"
     263             :     "(23,\"tau\",27)\n"
     264             :     "(24,\"tau\",28)\n"
     265             :     "(25,\"tau\",29)\n"
     266             :     "(26,\"tau\",28)\n"
     267             :     "(27,\"tau\",30) \n"
     268             :     "(28,\"r1(d1)\",31)\n"
     269             :     "(28,\"r1(d2)\",32)\n"
     270             :     "(29,\"tau\",33)\n"
     271             :     "(30,\"tau\",34)\n"
     272             :     "(30,\"tau\",35)\n"
     273             :     "(31,\"tau\",36)\n"
     274             :     "(32,\"tau\",37)\n"
     275             :     "(33,\"tau\",38)\n"
     276             :     "(33,\"tau\",39)\n"
     277             :     "(34,\"tau\",40)\n"
     278             :     "(35,\"tau\",40)\n"
     279             :     "(36,\"tau\",41)\n"
     280             :     "(36,\"tau\",42)\n"
     281             :     "(37,\"tau\",43)\n"
     282             :     "(37,\"tau\",44)\n"
     283             :     "(38,\"tau\",45)\n"
     284             :     "(39,\"tau\",45)\n"
     285             :     "(40,\"tau\",19)\n"
     286             :     "(41,\"tau\",46)\n"
     287             :     "(42,\"tau\",47)\n"
     288             :     "(43,\"tau\",48)\n"
     289             :     "(44,\"tau\",49)\n"
     290             :     "(45,\"tau\",22)\n"
     291             :     "(46,\"tau\",50)\n"
     292             :     "(47,\"s4(d1)\",51)\n"
     293             :     "(48,\"tau\",52)\n"
     294             :     "(49,\"s4(d2)\",53)\n"
     295             :     "(50,\"tau\",54)\n"
     296             :     "(50,\"tau\",55)\n"
     297             :     "(51,\"tau\",56)\n"
     298             :     "(52,\"tau\",57)\n"
     299             :     "(52,\"tau\",58)\n"
     300             :     "(53,\"tau\",59)\n"
     301             :     "(54,\"tau\",31)\n"
     302             :     "(55,\"tau\",31)\n"
     303             :     "(56,\"tau\",60)\n"
     304             :     "(56,\"tau\",61)\n"
     305             :     "(57,\"tau\",32)\n"
     306             :     "(58,\"tau\",32)\n"
     307             :     "(59,\"tau\",62)\n"
     308             :     "(59,\"tau\",63)\n"
     309             :     "(60,\"tau\",64)\n"
     310             :     "(61,\"tau\",0)\n"
     311             :     "(62,\"tau\",65)\n"
     312             :     "(63,\"tau\",0)\n"
     313             :     "(64,\"tau\",66)\n"
     314             :     "(65,\"tau\",67)\n"
     315             :     "(66,\"tau\",68)\n"
     316             :     "(66,\"tau\",69)\n"
     317             :     "(67,\"tau\",70)\n"
     318             :     "(67,\"tau\",71)\n"
     319             :     "(68,\"tau\",72)\n"
     320             :     "(69,\"tau\",72)\n"
     321             :     "(70,\"tau\",73)\n"
     322             :     "(71,\"tau\",73)\n"
     323             :     "(72,\"tau\",56)\n"
     324           1 :     "(73,\"tau\",59)\n"
     325             :     ;
     326             : 
     327             :   expected_sizes expected;
     328           1 :   expected.states_plain=74; expected.transitions_plain=92; expected.labels_plain=5;
     329           1 :   expected.states_bisimulation=24, expected.transitions_bisimulation=28, expected.labels_bisimulation=5;
     330           1 :   expected.states_branching_bisimulation=3, expected.transitions_branching_bisimulation=4, expected.labels_branching_bisimulation=5;
     331           1 :   expected.states_divergence_preserving_branching_bisimulation=6, expected.transitions_divergence_preserving_branching_bisimulation=10, expected.labels_divergence_preserving_branching_bisimulation=5;
     332           1 :   expected.states_weak_bisimulation=3, expected.transitions_weak_bisimulation=4, expected.labels_weak_bisimulation=5;
     333           1 :   expected.states_divergence_preserving_weak_bisimulation=6, expected.transitions_divergence_preserving_weak_bisimulation=10, expected.labels_divergence_preserving_weak_bisimulation=6;
     334           1 :   expected.states_simulation=24, expected.transitions_simulation=28, expected.labels_simulation=5;
     335           1 :   expected.states_trace_equivalence=19, expected.transitions_trace_equivalence=24, expected.labels_trace_equivalence=5;
     336           1 :   expected.states_weak_trace_equivalence=3, expected.transitions_weak_trace_equivalence=4, expected.labels_weak_trace_equivalence=5;
     337           1 :   expected.states_determinisation=53, expected.transitions_determinisation=66, expected.labels_determinisation=5;
     338           1 :   expected.is_deterministic=false;
     339             : 
     340           1 :   reduce_lts_in_various_ways("Alternating bit protocol", ABP_AUT, expected);
     341           1 : }
     342             : 
     343             : // Peterson's protocol has the interesting property that the number of states modulo branching bisimulation
     344             : // differs from the number of states modulo weak bisimulation, as observed by Rob van Glabbeek.
     345           2 : BOOST_AUTO_TEST_CASE(reduce_peterson)
     346             : {
     347             :   std::string PETERSON_AUT =
     348             :     "des (0,59,35)\n"
     349             :     "(0,\"wish(1)\",1)\n"
     350             :     "(0,\"wish(0)\",2)\n"
     351             :     "(1,\"tau\",3)\n"
     352             :     "(1,\"wish(0)\",4)\n"
     353             :     "(2,\"wish(1)\",4)\n"
     354             :     "(2,\"tau\",5)\n"
     355             :     "(3,\"tau\",6)\n"
     356             :     "(3,\"wish(0)\",7)\n"
     357             :     "(4,\"tau\",7)\n"
     358             :     "(4,\"tau\",8)\n"
     359             :     "(5,\"wish(1)\",8)\n"
     360             :     "(6,\"enter(1)\",9)\n"
     361             :     "(6,\"wish(0)\",10)\n"
     362             :     "(7,\"tau\",11)\n"
     363             :     "(8,\"tau\",12)\n"
     364             :     "(9,\"leave(1)\",13)\n"
     365             :     "(9,\"wish(0)\",14)\n"
     366             :     "(10,\"enter(1)\",14)\n"
     367             :     "(10,\"tau\",15)\n"
     368             :     "(11,\"tau\",15)\n"
     369             :     "(12,\"tau\",16)\n"
     370             :     "(13,\"tau\",17)\n"
     371             :     "(13,\"wish(0)\",18)\n"
     372             :     "(14,\"leave(1)\",18)\n"
     373             :     "(14,\"tau\",19)\n"
     374             :     "(15,\"enter(1)\",19)\n"
     375             :     "(16,\"enter(0)\",20)\n"
     376             :     "(17,\"wish(1)\",1)\n"
     377             :     "(17,\"wish(0)\",21)\n"
     378             :     "(18,\"tau\",21)\n"
     379             :     "(18,\"tau\",22)\n"
     380             :     "(19,\"leave(1)\",22)\n"
     381             :     "(20,\"leave(0)\",23)\n"
     382             :     "(21,\"wish(1)\",4)\n"
     383             :     "(21,\"tau\",24)\n"
     384             :     "(22,\"tau\",24)\n"
     385             :     "(23,\"tau\",3)\n"
     386             :     "(24,\"wish(1)\",8)\n"
     387             :     "(24,\"tau\",25)\n"
     388             :     "(25,\"enter(0)\",26)\n"
     389             :     "(25,\"wish(1)\",27)\n"
     390             :     "(26,\"leave(0)\",28)\n"
     391             :     "(26,\"wish(1)\",29)\n"
     392             :     "(27,\"enter(0)\",29)\n"
     393             :     "(27,\"tau\",16)\n"
     394             :     "(28,\"wish(1)\",30)\n"
     395             :     "(28,\"tau\",31)\n"
     396             :     "(29,\"leave(0)\",30)\n"
     397             :     "(29,\"tau\",20)\n"
     398             :     "(30,\"tau\",23)\n"
     399             :     "(30,\"tau\",32)\n"
     400             :     "(31,\"wish(1)\",32)\n"
     401             :     "(31,\"wish(0)\",33)\n"
     402             :     "(32,\"tau\",3)\n"
     403             :     "(32,\"wish(0)\",34)\n"
     404             :     "(33,\"wish(1)\",34)\n"
     405             :     "(33,\"tau\",24)\n"
     406             :     "(34,\"tau\",7)\n"
     407           1 :     "(34,\"tau\",8)\n"
     408             :     ;
     409             : 
     410             :   expected_sizes expected;
     411           1 :   expected.states_plain=35; expected.transitions_plain=59; expected.labels_plain=7;
     412           1 :   expected.states_bisimulation=31, expected.transitions_bisimulation=51, expected.labels_bisimulation=7;
     413           1 :   expected.states_branching_bisimulation=21, expected.transitions_branching_bisimulation=37, expected.labels_branching_bisimulation=7;
     414           1 :   expected.states_divergence_preserving_branching_bisimulation=21, expected.transitions_divergence_preserving_branching_bisimulation=37, expected.labels_divergence_preserving_branching_bisimulation=7;
     415           1 :   expected.states_weak_bisimulation=19, expected.transitions_weak_bisimulation=33, expected.labels_weak_bisimulation=7;
     416           1 :   expected.states_divergence_preserving_weak_bisimulation=19, expected.transitions_divergence_preserving_weak_bisimulation=33, expected.labels_divergence_preserving_weak_bisimulation=8;
     417           1 :   expected.states_simulation=31, expected.transitions_simulation=49, expected.labels_simulation=7;
     418           1 :   expected.states_trace_equivalence=34, expected.transitions_trace_equivalence=52, expected.labels_trace_equivalence=7;
     419           1 :   expected.states_weak_trace_equivalence=18, expected.transitions_weak_trace_equivalence=29, expected.labels_weak_trace_equivalence=7;
     420           1 :   expected.states_determinisation=40, expected.transitions_determinisation=63, expected.labels_determinisation=7;
     421           1 :   expected.is_deterministic=false;
     422             : 
     423           1 :   reduce_lts_in_various_ways("Peterson protocol", PETERSON_AUT, expected);
     424           1 : }
     425             : 
     426           2 : BOOST_AUTO_TEST_CASE(test_reachability)
     427             : {
     428             :   std::string REACH =
     429             :     "des (0,4,5)       \n"
     430             :     "(0,\"reachable\",1)\n"
     431             :     "(1,\"reachable1\",2)\n"
     432             :     "(1,\"reachable2\",3)\n"
     433           1 :     "(4,\"unreachable\",0)\n"
     434             :     ;
     435             : 
     436           1 :   std::size_t expected_label_count = 5;
     437           1 :   std::size_t expected_state_count = 5;
     438           1 :   std::size_t expected_transition_count = 4;
     439             : 
     440           1 :   std::istringstream is(REACH);
     441           1 :   lts::lts_aut_t l_reach;
     442           1 :   l_reach.load(is);
     443           1 :   test_lts("reach test",l_reach, expected_label_count, expected_state_count, expected_transition_count);
     444           1 :   BOOST_CHECK(!reachability_check(l_reach,false));
     445           1 :   reachability_check(l_reach,true);
     446           1 :   test_lts("reach test after reachability reduction",l_reach, expected_label_count-1, expected_state_count-1, expected_transition_count-1);
     447           1 :   BOOST_CHECK(reachability_check(l_reach,false));
     448           1 : }
     449             : 
     450             : // The example below caused failures in the GW mlogn branching bisimulation
     451             : // algorithm when cleaning the code up.
     452           2 : BOOST_AUTO_TEST_CASE(failing_test_groote_wijs_algorithm)
     453             : {
     454             :   std::string GWLTS =
     455             :     "des(0,29,10)\n"
     456             :     "(0,\"a\",5)\n"
     457             :     "(1,\"a\",3)\n"
     458             :     "(2,\"a\",6)\n"
     459             :     "(3,\"a\",8)\n"
     460             :     "(4,\"a\",5)\n"
     461             :     "(5,\"a\",6)\n"
     462             :     "(6,\"a\",4)\n"
     463             :     "(7,\"a\",8)\n"
     464             :     "(8,\"a\",9)\n"
     465             :     "(9,\"a\",6)\n"
     466             :     "(0,\"b\",9)\n"
     467             :     "(1,\"b\",3)\n"
     468             :     "(2,\"b\",3)\n"
     469             :     "(3,\"b\",7)\n"
     470             :     "(4,\"b\",9)\n"
     471             :     "(5,\"b\",8)\n"
     472             :     "(6,\"b\",5)\n"
     473             :     "(7,\"b\",9)\n"
     474             :     "(8,\"b\",1)\n"
     475             :     "(9,\"b\",6)\n"
     476             :     "(6,\"c\",7)\n"
     477             :     "(8,\"c\",9)\n"
     478             :     "(2,\"d\",7)\n"
     479             :     "(3,\"d\",2)\n"
     480             :     "(5,\"d\",6)\n"
     481             :     "(7,\"d\",4)\n"
     482             :     "(8,\"tau\",0)\n"
     483             :     "(4,\"tau\",1)\n"
     484           1 :     "(3,\"tau\",7)\n"
     485             :     ;
     486             : 
     487           1 :   std::size_t expected_label_count = 5;
     488           1 :   std::size_t expected_state_count = 10;
     489           1 :   std::size_t expected_transition_count = 29;
     490             : 
     491           1 :   std::istringstream is(GWLTS);
     492           1 :   lts::lts_aut_t l_gw;
     493           1 :   l_gw.load(is);
     494           1 :   lts::lts_aut_t l=l_gw;
     495           1 :   reduce(l,lts::lts_eq_branching_bisim);
     496           1 :   test_lts("gw problem (branching bisimulation [Jansen/Groote/Keiren/Wijs 2019])",l,expected_label_count, expected_state_count, expected_transition_count);
     497           1 :   l=l_gw;
     498           1 :   reduce(l,lts::lts_eq_branching_bisim_gv);
     499           1 :   test_lts("gw problem (branching bisimulation [Groote/Vaandrager 1990])",l,expected_label_count, expected_state_count, expected_transition_count);
     500           1 :   l=l_gw;
     501           1 :   reduce(l,lts::lts_eq_branching_bisim_gjkw);
     502           1 :   test_lts("gw problem (branching bisimulation [Groote/Jansen/Keiren/Wijs 2017])",l,expected_label_count, expected_state_count, expected_transition_count);
     503           1 :   l=l_gw;
     504           1 :   reduce(l,lts::lts_eq_branching_bisim_sigref);
     505           1 :   test_lts("gw problem (branching bisimulation signature [Blom/Orzan 2003])",l,expected_label_count, expected_state_count, expected_transition_count);
     506           1 : }
     507             : 
     508             : // The following counterexample was taken from
     509             : // Jansen/Keiren: Stuttering equivalence is too slow! Eprint arXiv: 1603.05789,
     510             : // 2016. http://arxiv.org/abs/1603.05789
     511             : // It has not been implemented fully. The problem is that it is difficult to
     512             : // prescribe the order in which refinements have to be done.
     513             : 
     514           0 : void counterexample_jk_1(std::size_t k)
     515             : {
     516             :     // numbering scheme of states:
     517             :     // states 0..k-1 are the blue squares
     518             :     // state k is the orange circle
     519             :     // states k+1..2k are the red triangles
     520             :     // states 2k+1 and 2k+2 are the grey pentagons
     521             :     // The grey diamonds are inserted as extra Kripke states.
     522             : 
     523           0 :     assert(1 < k);
     524           0 :     std::string CJK1 = "des(0," + std::to_string(5*k+2) + "," + std::to_string(2*k+3) + ")\n";
     525             : 
     526           0 :     for (std::size_t i = 0; i < k; ++i)
     527             :     {
     528           0 :         CJK1 += "(" + std::to_string(k) + ",a" + std::to_string(i) + "," + std::to_string(k) + ")\n"
     529           0 :                 "(" + std::to_string(k) + ",tau," + std::to_string(i) + ")\n"
     530           0 :                 "(0,a" + std::to_string(i) + "," + std::to_string(k) + ")\n";
     531             :     }
     532           0 :     for (std::size_t i = k-1; i > 0; --i)
     533             :     {
     534           0 :         CJK1 += "(" + std::to_string(i) + ",tau," + std::to_string(i-1) + ")\n"
     535           0 :                 "(" + std::to_string(i+k+1) + ",tau," + std::to_string(i+k) + ")\n";
     536             :     }
     537           0 :     CJK1 += "(" + std::to_string(k+1) + ",tau," + std::to_string(k) + ")\n"
     538           0 :             "(" + std::to_string(2*k+1) + ",a," + std::to_string(2*k+2) + ")\n"
     539           0 :             "(" + std::to_string(k) + ",tau," + std::to_string(2*k+1) + ")\n"
     540           0 :             "(0,tau," + std::to_string(2*k+2) + ")\n";
     541             : 
     542           0 :     std::size_t expected_label_count = k+2;
     543           0 :     std::size_t expected_state_count = 4;
     544           0 :     std::size_t expected_transition_count = 10;
     545             : 
     546           0 :     std::istringstream is(CJK1);
     547           0 :     lts::lts_aut_t l_cjk1;
     548           0 :     l_cjk1.load(is);
     549           0 :     lts::lts_aut_t l=l_cjk1;
     550           0 :     reduce(l,lts::lts_eq_branching_bisim);
     551           0 :     test_lts("counterexample JK 1 (branching bisimulation [Groote/Jansen/Keiren/Wijs 2017])",l,expected_label_count, expected_state_count, expected_transition_count);
     552           0 :     l=l_cjk1;
     553           0 :     reduce(l,lts::lts_eq_branching_bisim_gv);
     554           0 :     test_lts("counterexample JK 1 (branching bisimulation [Groote/Vaandrager 1990])",l,expected_label_count, expected_state_count, expected_transition_count);
     555           0 : }
     556             : 
     557             : 
     558             : // The following LTS is a counterexample to the algorithm to postprocess new
     559             : // bottom states.  Found the error in November 2016.
     560             : // The central part of the model consists of states 0--3.  The algorithm will
     561             : // split w. r. t. the constellation for "a"-labelled transitions.  This makes
     562             : // state 1 blue and the other states red.  Also, state 2 will become a new
     563             : // bottom state.  After that, it should split for "b"-labelled transitions, so
     564             : // that state 3 will get into a separate block;  however, it will not find this
     565             : // label.
     566             : 
     567             : // If the algorithm later splits w. r. t. "b", then the final result would
     568             : // still be correct.  The model is therefore sensitive to the order in which
     569             : // transitions appear.  To remove this sensitivity, I added copies of the
     570             : // states for other permutations.
     571             : 
     572             : // In the meantime, the bug is corrected:  this is why the first part of the
     573             : // algorithm now follows a much simpler line than previously.
     574           2 : BOOST_AUTO_TEST_CASE(counterexample_postprocessing)
     575             : {
     576             :   std::string POSTPROCESS_AUT =
     577             :     "des(0,33,13)\n"
     578             :     "(0,\"a\",0)\n"
     579             :     "(0,\"b\",0)\n"
     580             :     "(0,\"c\",0)\n"
     581             : 
     582             :     "(1,\"b\",0)\n"
     583             :     "(1,\"c\",0)\n"
     584             :     "(2,\"tau\",1)\n"
     585             :     "(2,\"a\",0)\n"
     586             :     "(3,\"tau\",2)\n"
     587             :     "(3,\"a\",0)\n"
     588             :     "(3,\"b\",0)\n"
     589             :     "(4,\"tau\",2)\n" // state 3 copied, with b and c swapped
     590             :     "(4,\"a\",0)\n"
     591             :     "(4,\"c\",0)\n"
     592             : 
     593             :     "(5,\"a\",0)\n" // states 1-4 copied, with a and b swapped
     594             :     "(5,\"c\",0)\n"
     595             :     "(6,\"tau\",5)\n"
     596             :     "(6,\"b\",0)\n"
     597             :     "(7,\"tau\",6)\n"
     598             :     "(7,\"a\",0)\n"
     599             :     "(7,\"b\",0)\n"
     600             :     "(8,\"tau\",6)\n"
     601             :     "(8,\"b\",0)\n"
     602             :     "(8,\"c\",0)\n"
     603             : 
     604             :     "(9,\"a\",0)\n" // states 1-4 copied, with a and c swapped
     605             :     "(9,\"b\",0)\n"
     606             :     "(10,\"tau\",9)\n"
     607             :     "(10,\"c\",0)\n"
     608             :     "(11,\"tau\",10)\n"
     609             :     "(11,\"b\",0)\n"
     610             :     "(11,\"c\",0)\n"
     611             :     "(12,\"tau\",10)\n"
     612             :     "(12,\"a\",0)\n"
     613           1 :     "(12,\"c\",0)\n"
     614             :     ;
     615             : 
     616           1 :   std::size_t expected_label_count = 4;
     617           1 :   std::size_t expected_state_count = 13;
     618           1 :   std::size_t expected_transition_count = 33;
     619             : 
     620           1 :   std::istringstream is(POSTPROCESS_AUT);
     621           1 :   lts::lts_aut_t l_gw;
     622           1 :   l_gw.load(is);
     623           1 :   lts::lts_aut_t l=l_gw;
     624           1 :   reduce(l,lts::lts_eq_branching_bisim);
     625           1 :   test_lts("postprocessing problem (branching bisimulation [Jansen/Groote/Keiren/Wijs 2019])",l,expected_label_count, expected_state_count, expected_transition_count);
     626           1 :   l=l_gw;
     627           1 :   reduce(l,lts::lts_eq_branching_bisim_gv);
     628           1 :   test_lts("postprocessing problem (branching bisimulation [Groote/Vaandrager 1990])",l,expected_label_count, expected_state_count, expected_transition_count);
     629           1 :   l=l_gw;
     630           1 :   reduce(l,lts::lts_eq_branching_bisim_gjkw);
     631           1 :   test_lts("postprocessing problem (branching bisimulation [Groote/Jansen/Keiren/Wijs 2017])",l,expected_label_count, expected_state_count, expected_transition_count);
     632           1 :   l=l_gw;
     633           1 :   reduce(l,lts::lts_eq_branching_bisim_sigref);
     634           1 :   test_lts("postprocessing problem (branching bisimulation signature [Blom/Orzan 2003])",l,expected_label_count, expected_state_count, expected_transition_count);
     635           1 : }
     636             : 
     637           2 : BOOST_AUTO_TEST_CASE(regression_delete_old_bb_slice)
     638             : {
     639             :   std::string POSTPROCESS_AUT =
     640             :     "des(0,163,100)\n"
     641             :     "(33,\"a\",79)\n"
     642             :     "(87,\"a\",2)\n"
     643             :     "(4,\"b\",35)\n"
     644             :     "(13,\"b\",10)\n"
     645             :     "(15,\"b\",32)\n"
     646             :     "(31,\"b\",3)\n"
     647             :     "(35,\"b\",86)\n"
     648             :     "(47,\"b\",73)\n"
     649             :     "(61,\"b\",10)\n"
     650             :     "(67,\"b\",59)\n"
     651             :     "(81,\"b\",38)\n"
     652             :     "(89,\"b\",77)\n"
     653             :     "(94,\"b\",34)\n"
     654             :     "(20,\"tau\",10)\n"
     655             :     "(65,\"tau\",61)\n"
     656             :     "(38,\"tau\",64)\n"
     657             :     "(86,\"tau\",41)\n"
     658             :     "(18,\"tau\",55)\n"
     659             :     "(50,\"tau\",65)\n"
     660             :     "(28,\"tau\",50)\n"
     661             :     "(29,\"tau\",55)\n"
     662             :     "(43,\"tau\",85)\n"
     663             :     "(93,\"tau\",8)\n"
     664             :     "(54,\"tau\",72)\n"
     665             :     "(52,\"tau\",47)\n"
     666             :     "(7,\"tau\",36)\n"
     667             :     "(6,\"tau\",60)\n"
     668             :     "(48,\"tau\",43)\n"
     669             :     "(77,\"tau\",68)\n"
     670             :     "(90,\"tau\",34)\n"
     671             :     "(18,\"tau\",21)\n"
     672             :     "(18,\"tau\",56)\n"
     673             :     "(36,\"tau\",70)\n"
     674             :     "(54,\"tau\",28)\n"
     675             :     "(62,\"tau\",40)\n"
     676             :     "(5,\"tau\",18)\n"
     677             :     "(91,\"tau\",47)\n"
     678             :     "(42,\"tau\",27)\n"
     679             :     "(34,\"tau\",70)\n"
     680             :     "(23,\"tau\",63)\n"
     681             :     "(19,\"tau\",70)\n"
     682             :     "(39,\"tau\",43)\n"
     683             :     "(86,\"tau\",34)\n"
     684             :     "(25,\"tau\",73)\n"
     685             :     "(16,\"tau\",4)\n"
     686             :     "(34,\"tau\",30)\n"
     687             :     "(70,\"tau\",20)\n"
     688             :     "(30,\"tau\",22)\n"
     689             :     "(51,\"tau\",97)\n"
     690             :     "(5,\"tau\",67)\n"
     691             :     "(80,\"tau\",13)\n"
     692             :     "(66,\"tau\",59)\n"
     693             :     "(24,\"tau\",23)\n"
     694             :     "(95,\"tau\",82)\n"
     695             :     "(5,\"tau\",2)\n"
     696             :     "(82,\"tau\",9)\n"
     697             :     "(40,\"tau\",46)\n"
     698             :     "(94,\"tau\",31)\n"
     699             :     "(19,\"tau\",96)\n"
     700             :     "(34,\"tau\",32)\n"
     701             :     "(62,\"tau\",24)\n"
     702             :     "(74,\"tau\",8)\n"
     703             :     "(9,\"tau\",76)\n"
     704             :     "(98,\"tau\",50)\n"
     705             :     "(25,\"tau\",62)\n"
     706             :     "(89,\"tau\",95)\n"
     707             :     "(1,\"tau\",56)\n"
     708             :     "(44,\"tau\",66)\n"
     709             :     "(1,\"tau\",45)\n"
     710             :     "(73,\"tau\",60)\n"
     711             :     "(70,\"tau\",98)\n"
     712             :     "(36,\"tau\",14)\n"
     713             :     "(18,\"tau\",27)\n"
     714             :     "(87,\"tau\",27)\n"
     715             :     "(65,\"tau\",17)\n"
     716             :     "(57,\"tau\",97)\n"
     717             :     "(98,\"tau\",8)\n"
     718             :     "(29,\"tau\",25)\n"
     719             :     "(59,\"tau\",97)\n"
     720             :     "(1,\"tau\",94)\n"
     721             :     "(30,\"tau\",74)\n"
     722             :     "(53,\"tau\",90)\n"
     723             :     "(50,\"tau\",19)\n"
     724             :     "(41,\"tau\",81)\n"
     725             :     "(73,\"tau\",97)\n"
     726             :     "(97,\"tau\",62)\n"
     727             :     "(40,\"tau\",59)\n"
     728             :     "(33,\"tau\",86)\n"
     729             :     "(16,\"tau\",47)\n"
     730             :     "(50,\"tau\",72)\n"
     731             :     "(90,\"tau\",68)\n"
     732             :     "(90,\"tau\",63)\n"
     733             :     "(17,\"tau\",75)\n"
     734             :     "(70,\"tau\",49)\n"
     735             :     "(85,\"tau\",33)\n"
     736             :     "(25,\"tau\",52)\n"
     737             :     "(63,\"tau\",99)\n"
     738             :     "(22,\"tau\",29)\n"
     739             :     "(47,\"tau\",31)\n"
     740             :     "(39,\"tau\",88)\n"
     741             :     "(41,\"tau\",88)\n"
     742             :     "(49,\"tau\",83)\n"
     743             :     "(60,\"tau\",34)\n"
     744             :     "(85,\"tau\",59)\n"
     745             :     "(12,\"tau\",6)\n"
     746             :     "(47,\"tau\",99)\n"
     747             :     "(47,\"tau\",23)\n"
     748             :     "(77,\"tau\",73)\n"
     749             :     "(78,\"tau\",55)\n"
     750             :     "(7,\"tau\",6)\n"
     751             :     "(0,\"tau\",67)\n"
     752             :     "(66,\"tau\",12)\n"
     753             :     "(75,\"tau\",31)\n"
     754             :     "(25,\"tau\",80)\n"
     755             :     "(53,\"tau\",35)\n"
     756             :     "(83,\"tau\",79)\n"
     757             :     "(74,\"tau\",88)\n"
     758             :     "(57,\"tau\",80)\n"
     759             :     "(7,\"tau\",77)\n"
     760             :     "(77,\"tau\",8)\n"
     761             :     "(87,\"tau\",1)\n"
     762             :     "(59,\"tau\",54)\n"
     763             :     "(66,\"tau\",33)\n"
     764             :     "(86,\"tau\",80)\n"
     765             :     "(90,\"tau\",30)\n"
     766             :     "(1,\"tau\",4)\n"
     767             :     "(47,\"tau\",78)\n"
     768             :     "(75,\"tau\",47)\n"
     769             :     "(26,\"tau\",7)\n"
     770             :     "(6,\"tau\",93)\n"
     771             :     "(51,\"tau\",14)\n"
     772             :     "(7,\"tau\",77)\n"
     773             :     "(13,\"tau\",67)\n"
     774             :     "(65,\"tau\",77)\n"
     775             :     "(41,\"tau\",39)\n"
     776             :     "(91,\"tau\",96)\n"
     777             :     "(69,\"tau\",38)\n"
     778             :     "(71,\"tau\",77)\n"
     779             :     "(81,\"tau\",56)\n"
     780             :     "(53,\"tau\",44)\n"
     781             :     "(50,\"tau\",88)\n"
     782             :     "(65,\"tau\",4)\n"
     783             :     "(39,\"tau\",49)\n"
     784             :     "(82,\"tau\",93)\n"
     785             :     "(20,\"tau\",13)\n"
     786             :     "(4,\"tau\",49)\n"
     787             :     "(16,\"tau\",6)\n"
     788             :     "(42,\"tau\",9)\n"
     789             :     "(74,\"tau\",3)\n"
     790             :     "(17,\"tau\",21)\n"
     791             :     "(7,\"tau\",80)\n"
     792             :     "(58,\"tau\",84)\n"
     793             :     "(74,\"tau\",62)\n"
     794             :     "(81,\"tau\",58)\n"
     795             :     "(19,\"tau\",87)\n"
     796             :     "(42,\"tau\",45)\n"
     797             :     "(26,\"tau\",30)\n"
     798             :     "(57,\"tau\",87)\n"
     799             :     "(57,\"tau\",96)\n"
     800             :     "(34,\"tau\",32)\n"
     801             :     "(43,\"tau\",11)\n"
     802             :     "(53,\"tau\",35)\n"
     803           1 :     "(30,\"tau\",56)\n"
     804             :     ;
     805             : 
     806           1 :   std::size_t expected_label_count = 3;
     807           1 :   std::size_t expected_state_count = 17;
     808           1 :   std::size_t expected_transition_count = 43;
     809             : 
     810           1 :   std::istringstream is(POSTPROCESS_AUT);
     811           1 :   lts::lts_aut_t l_gw;
     812           1 :   l_gw.load(is);
     813           1 :   lts::lts_aut_t l=l_gw;
     814           1 :   reduce(l,lts::lts_eq_divergence_preserving_branching_bisim);
     815           1 :   test_lts("regression test for GJKW bug (branching bisimulation [Jansen/Groote/Keiren/Wijs 2019])",l,expected_label_count, expected_state_count, expected_transition_count);
     816           1 :   l=l_gw;
     817           1 :   reduce(l,lts::lts_eq_divergence_preserving_branching_bisim_gv);
     818           1 :   test_lts("regression test for GJKW bug (branching bisimulation [Groote/Vaandrager 1990])",l,expected_label_count, expected_state_count, expected_transition_count);
     819           1 :   l=l_gw;
     820           1 :   reduce(l,lts::lts_eq_divergence_preserving_branching_bisim_gjkw);
     821           1 :   test_lts("regression test for GJKW bug (branching bisimulation [Groote/Jansen/Keiren/Wijs 2017])",l,expected_label_count, expected_state_count, expected_transition_count);
     822           1 :   l=l_gw;
     823           1 :   reduce(l,lts::lts_eq_divergence_preserving_branching_bisim_sigref);
     824           1 :   test_lts("regression test for GJKW bug (branching bisimulation signature [Blom/Orzan 2003])",l,expected_label_count, expected_state_count, expected_transition_count);
     825           1 : }
     826             : 
     827           2 : BOOST_AUTO_TEST_CASE(is_deterministic_test1)
     828             : {
     829             :   std::string automaton =
     830             :     "des(0,2,2)\n"
     831             :     "(0,\"a\",1)\n"
     832           1 :     "(0,\"a\",1)\n";
     833             : 
     834           1 :   std::istringstream is(automaton);
     835           1 :   lts::lts_aut_t l_det;
     836           1 :   l_det.load(is);
     837           1 :   BOOST_CHECK(is_deterministic(l_det));
     838           1 : }
     839             : 
     840           2 : BOOST_AUTO_TEST_CASE(is_deterministic_test2)
     841             : {
     842             :   std::string automaton =
     843             :     "des(0,2,2)\n"
     844             :     "(0,\"a\",1)\n"
     845           1 :     "(0,\"a\",0)\n";
     846             : 
     847           1 :   std::istringstream is(automaton);
     848           1 :   lts::lts_aut_t l_det;
     849           1 :   l_det.load(is);
     850           1 :   BOOST_CHECK(!is_deterministic(l_det));
     851           1 : }
     852             : 
     853           2 : BOOST_AUTO_TEST_CASE(hide_actions1)
     854             : {
     855             :   std::string automaton =
     856             :      "des (0,4,3)\n"
     857             :      "(0,\"<state>\",1)\n"
     858             :      "(1,\"return|hello\",2)\n"
     859             :      "(1,\"return\",2)\n"
     860           1 :      "(2,\"world\",1)\n";
     861             : 
     862           1 :   std::istringstream is(automaton);
     863           1 :   lts::lts_aut_t l;
     864           1 :   l.load(is);
     865           2 :   std::vector<std::string>hidden_actions(1,"hello");
     866           1 :   l.apply_hidden_actions(hidden_actions);
     867           1 :   reduce(l,lts::lts_eq_bisim);
     868           1 :   std::size_t expected_label_count = 5;
     869           1 :   std::size_t expected_state_count = 3;
     870           1 :   std::size_t expected_transition_count = 3;
     871           1 :   test_lts("regression test for GJKW bug (branching bisimulation [Jansen/Groote/Keiren/Wijs 2019])",l,expected_label_count, expected_state_count, expected_transition_count);
     872           1 : }
     873             : 
     874             : 
     875           2 : BOOST_AUTO_TEST_CASE(hide_actions2)
     876             : {
     877             :   std::string automaton =
     878             :      "des (0,4,3)\n"
     879             :      "(0,\"state\",1)\n"
     880             :      "(1,\"hello\",2)\n"
     881             :      "(0,\"return\",2)\n"
     882           1 :      "(2,\"world\",1)\n";
     883             : 
     884           1 :   std::istringstream is(automaton);
     885           1 :   lts::lts_aut_t l;
     886           1 :   l.load(is);
     887           2 :   std::vector<std::string>hidden_actions(1,"hello");
     888           1 :   l.apply_hidden_actions(hidden_actions);
     889           1 :   reduce(l,lts::lts_eq_branching_bisim);
     890           1 :   std::size_t expected_label_count = 5;
     891           1 :   std::size_t expected_state_count = 2;
     892           1 :   std::size_t expected_transition_count = 3;
     893           1 :   test_lts("regression test for GJKW bug (branching bisimulation [Jansen/Groote/Keiren/Wijs 2019])",l,expected_label_count, expected_state_count, expected_transition_count);
     894           1 : }
     895             : 
     896           2 : BOOST_AUTO_TEST_CASE(hide_actions3)
     897             : {
     898             :   std::string automaton =
     899             :      "des (0,4,3)\n"
     900             :      "(0,\"<state>\",1)\n"
     901             :      "(1,\"return|hello\",2)\n"
     902             :      "(1,\"return\",2)\n"
     903           1 :      "(2,\"world\",1)\n";
     904             : 
     905           1 :   std::istringstream is(automaton);
     906           1 :   lts::lts_aut_t l;
     907           1 :   l.load(is);
     908           2 :   std::vector<std::string>hidden_actions(1,"hello");
     909           1 :   l.record_hidden_actions(hidden_actions);
     910           1 :   reduce(l,lts::lts_eq_bisim);
     911           1 :   std::size_t expected_label_count = 5;
     912           1 :   std::size_t expected_state_count = 3;
     913           1 :   std::size_t expected_transition_count = 3;
     914           1 :   test_lts("regression test for GJKW bug (branching bisimulation [Jansen/Groote/Keiren/Wijs 2019])",l,expected_label_count, expected_state_count, expected_transition_count);
     915           1 : }
     916             : 
     917             : 
     918           2 : BOOST_AUTO_TEST_CASE(hide_actions4)
     919             : {
     920             :   std::string automaton =
     921             :      "des (0,4,3)\n"
     922             :      "(0,\"state\",1)\n"
     923             :      "(1,\"hello\",2)\n"
     924             :      "(0,\"return\",2)\n"
     925           1 :      "(2,\"world\",1)\n";
     926             : 
     927           1 :   std::istringstream is(automaton);
     928           1 :   lts::lts_aut_t l;
     929           1 :   l.load(is);
     930           2 :   std::vector<std::string>hidden_actions(1,"hello");
     931           1 :   l.record_hidden_actions(hidden_actions);
     932           1 :   reduce(l,lts::lts_eq_branching_bisim);
     933           1 :   std::size_t expected_label_count = 5;
     934           1 :   std::size_t expected_state_count = 2;
     935           1 :   std::size_t expected_transition_count = 3;
     936           1 :   test_lts("regression test for GJKW bug (branching bisimulation [Jansen/Groote/Keiren/Wijs 2019])",l,expected_label_count, expected_state_count, expected_transition_count);
     937           1 : }
     938             : 

Generated by: LCOV version 1.14