73#ifndef MCRL2_LTS_DETAIL_CHECK_COMPLEXITY_H
74#define MCRL2_LTS_DETAIL_CHECK_COMPLEXITY_H
98#include "mcrl2/utilities/logger.h"
100namespace mcrl2::lts::
detail
109using state_type =
std::size_t;
110#define STATE_TYPE_MIN (std::numeric_limits<state_type>::min())
111#define STATE_TYPE_MAX (std::numeric_limits<state_type>::max())
119using trans_type =
std::size_t;
120#define TRANS_TYPE_MIN (std::numeric_limits<trans_type>::min())
121#define TRANS_TYPE_MAX (std::numeric_limits<trans_type>::max())
141 if constexpr (
sizeof(
unsigned) ==
sizeof(size))
143 return static_cast<
int>(
sizeof(size) * CHAR_BIT - 1 - __builtin_clz(size));
145 else if constexpr (
sizeof(
unsigned long) ==
sizeof(size))
147 return static_cast<
int>(
sizeof(size) * CHAR_BIT - 1 - __builtin_clzl(size));
149 else if constexpr(
sizeof(
unsigned long long) ==
sizeof(size))
151 return static_cast<
int>(
sizeof(size) * CHAR_BIT - 1 - __builtin_clzll(size));
154 return (
int)
std::log2(size);
157#if !defined(NDEBUG) || defined(COUNT_WORK_BALANCE)
480 #define DONT_COUNT_TEMPORARY (std::numeric_limits<unsigned char>::max()-1
)
518 static void wait(trans_type units = 1)
530 assert(0 <= sensible_work);
531 assert(std::cmp_less_equal(no_of_waiting_cycles, sensible_work));
541 sensible_work +=
static_cast<signed_trans_type>(units);
549 sensible_work -=
static_cast<signed_trans_type>(units);
562 assert(-1 <= sensible_work);
572 enum counter_type FirstPostprocessCounter = FirstTempCounter>
575 static_assert(FirstCounter < FirstTempCounter);
576 static_assert(FirstTempCounter <= FirstPostprocessCounter);
577 static_assert(FirstPostprocessCounter <=
581 std::array<
unsigned char, LastCounter - FirstCounter + 1>
counters{};
596 assert(FirstTempCounter <= ctr);
597 assert(ctr < FirstPostprocessCounter);
606 assert(
counters[ctr - FirstCounter] <= 1);
647 finalise_work_units(counters[from - FirstCounter]);
656 std::memset(counters.data(),
'\0',
sizeof(counters));
675 unsigned const max_value)
678 if (ctr < FirstTempCounter || ctr >= FirstPostprocessCounter)
680 return complexity_ok;
683 if (FirstCounter > ctr || ctr > LastCounter)
685 mCRL2log(log::error) <<
"Error 20: counter \""
686 << work_names[ctr - BLOCK_MIN] <<
"\" is not available in ";
689 assert(max_value <= (ctr < FirstTempCounter ?
log_n : 1U));
690 if (
counters[ctr - FirstCounter] >= max_value)
692 mCRL2log(log::error) <<
"Error 1: counter \""
693 << work_names[ctr - BLOCK_MIN] <<
"\" exceeded "
694 "maximum value (" << max_value <<
") for ";
698 counters[ctr - FirstCounter] = max_value;
725 assert(FirstTempCounter <= from);
726 assert(from < FirstPostprocessCounter);
727 assert(FirstCounter <= to);
728 assert(to < FirstTempCounter || FirstPostprocessCounter <= to);
729 assert(to <= LastCounter);
730 assert(max_value <= (to < FirstTempCounter ?
log_n : 1U));
731 if (0 ==
counters[from - FirstCounter])
735 if (
counters[to - FirstCounter] >= max_value)
737 mCRL2log(log::error) <<
"Error 2: counter \""
738 << work_names[to - BLOCK_MIN] <<
"\" exceeded "
739 "maximum value (" << max_value <<
") for ";
743 counters[to - FirstCounter] = max_value;
744 assert(1 ==
counters[from - FirstCounter]);
747 (
void) to; (
void) max_value;
789 unsigned const max_B)
792 assert(max_C <= max_B);
797 assert(counters[ctr - BLOCK_MIN] <= max_C);
798 counters[ctr - BLOCK_MIN] = max_C;
800 assert(max_B <=
log_n);
805 assert(counters[ctr - BLOCK_MIN] <= max_B);
806 counters[ctr - BLOCK_MIN] = max_B;
809 (
void) max_C; (
void) max_B;
840 assert(max_targetC <=
log_n);
844 assert(counters[ctr - B_TO_C_MIN] <= max_targetC);
845 counters[ctr - B_TO_C_MIN] = max_targetC;
850 if (counters[ctr - B_TO_C_MIN] > 0)
852 mCRL2log(log::error) <<
"Error 3: counter \""
853 << work_names[ctr - BLOCK_MIN] <<
"\" exceeded "
854 "maximum value (" << 0 <<
") for ";
883 return counters[for_all_constellations_C_not_in_R_from_RfnB_4_4 -
904 counters[for_all_constellations_C_not_in_R_from_RfnB_4_4 -
938 assert(max_B <=
log_n);
942 assert(counters[ctr - STATE_MIN] <= max_B);
943 counters[ctr - STATE_MIN] = max_B;
950 if (counters[ctr - STATE_MIN] > 0)
952 mCRL2log(log::error) <<
"Error 4: counter \""
953 << work_names[ctr - BLOCK_MIN] <<
"\" exceeded "
954 "maximum value (" << 0 <<
") for ";
964 if (counters[ctr - STATE_MIN] > (
unsigned) bottom)
966 mCRL2log(log::error) <<
"Error 5: counter \""
967 << work_names[ctr - BLOCK_MIN] <<
"\" exceeded "
968 "maximum value (" << (
unsigned) bottom <<
") for ";
971 counters[ctr - STATE_MIN] = (
unsigned) bottom;
974 (
void) max_B; (
void) bottom;
1018 unsigned const max_targetC,
1019 unsigned const max_targetB,
bool const source_bottom)
1022 assert(max_targetC <= max_targetB);
1027 assert(counters[ctr - TRANS_MIN] <= max_targetC);
1028 counters[ctr - TRANS_MIN] = max_targetC;
1030 assert(max_sourceB <=
log_n);
1035 assert(counters[ctr - TRANS_MIN] <= max_sourceB);
1036 counters[ctr - TRANS_MIN] = max_sourceB;
1038 assert(max_targetB <=
log_n);
1042 assert(counters[ctr - TRANS_MIN] <= max_targetB);
1043 counters[ctr - TRANS_MIN] = max_targetB;
1049 if (counters[ctr - TRANS_MIN] > 0)
1051 mCRL2log(log::error) <<
"Error 6: counter \""
1052 << work_names[ctr - BLOCK_MIN] <<
"\" exceeded "
1053 "maximum value (" << 0 <<
") for ";
1059 assert((
unsigned) source_bottom <= 1);
1063 if (counters[ctr - TRANS_MIN] > (
unsigned) source_bottom)
1065 mCRL2log(log::error) <<
"Error 7: counter \""
1066 << work_names[ctr - BLOCK_MIN] <<
"\" exceeded "
1067 "maximum value (" << (
unsigned) source_bottom <<
") for ";
1070 counters[ctr - TRANS_MIN] = (
unsigned) source_bottom;
1073 (
void) max_sourceB; (
void) max_targetC; (
void) max_targetB;
1074 (
void) source_bottom;
1100 unsigned const max_value)
1105 return add_work(ctr, max_value);
1108 assert(1 == max_value);
1109 if (0 == counters[ctr - TRANS_MIN])
1115 mCRL2log(log::error) <<
"Error 8: counter \""
1116 << work_names[ctr - BLOCK_MIN] <<
"\" exceeded "
1117 "maximum value (" << max_value <<
") for ";
1120 (
void) ctr; (
void) max_value;
1121 return complexity_ok;
1151 assert((
log_n + 1U) / 2U <= max_block);
1152 if (max_block >
log_n)
1155 << max_block <<
" exceeded log_n == "
1156 << (
unsigned)
log_n <<
" for ";
1159 assert(max_block <=
log_n);
1164 assert(counters[ctr - BLOCK_dnj_MIN] <= max_block);
1165 counters[ctr - BLOCK_dnj_MIN] = max_block;
1170 assert(counters[ctr - BLOCK_dnj_MIN] <= 1);
1171 counters[ctr - BLOCK_dnj_MIN] = 1;
1204 assert((
log_n + 1U) / 2U <= max_block);
1205 assert(max_block <=
log_n);
1209 assert(counters[ctr - STATE_dnj_MIN] <= max_block);
1210 counters[ctr - STATE_dnj_MIN] = max_block;
1215 assert(counters[ctr - STATE_dnj_MIN] <= 0);
1221 assert(counters[ctr - STATE_dnj_MIN] <= (
unsigned) bottom);
1222 counters[ctr - STATE_dnj_MIN] = (
unsigned) bottom;
1225 (
void) max_block; (
void) bottom;
1253 assert(max_bunch <=
log_n);
1257 assert(counters[ctr - BUNCH_dnj_MIN] <= max_bunch);
1258 counters[ctr - BUNCH_dnj_MIN] = max_bunch;
1291 assert(max_bunch <=
log_n);
1296 if (counters[ctr - BLOCK_BUNCH_dnj_MIN] > max_bunch)
1298 mCRL2log(log::error) <<
"Error 12: counter \""
1299 << work_names[ctr - BLOCK_MIN] <<
"\" exceeded "
1300 "maximum value (" << (
unsigned) max_bunch <<
") for ";
1303 assert(counters[ctr - BLOCK_BUNCH_dnj_MIN] <= max_bunch);
1304 counters[ctr - BLOCK_BUNCH_dnj_MIN] = max_bunch;
1309 if (counters[ctr - BLOCK_BUNCH_dnj_MIN] > 0)
1311 mCRL2log(log::error) <<
"Error 13: counter \""
1312 << work_names[ctr - BLOCK_MIN] <<
"\" exceeded "
1313 "maximum value (" << (
unsigned) 0 <<
") for ";
1316 assert(counters[ctr - BLOCK_BUNCH_dnj_MIN] <= 0);
1328 return counters[BLOCK_BUNCH_dnj_MIN_TEMP-BLOCK_BUNCH_dnj_MIN] > 0;
1333 counters[BLOCK_BUNCH_dnj_MIN_TEMP - BLOCK_BUNCH_dnj_MIN] = 0;
1360 unsigned const max_target_block,
bool const bottom)
1363 assert((
log_n + 1U) / 2U <= max_source_block);
1364 assert(max_source_block <=
log_n);
1369 assert(counters[ctr - TRANS_dnj_MIN] <= max_source_block);
1370 counters[ctr - TRANS_dnj_MIN] = max_source_block;
1372 assert((
log_n + 1U) / 2U <= max_target_block);
1373 assert(max_target_block <=
log_n);
1378 assert(counters[ctr - TRANS_dnj_MIN] <= max_target_block);
1379 counters[ctr - TRANS_dnj_MIN] = max_target_block;
1384 assert(counters[ctr - TRANS_dnj_MIN] <= 0);
1390 if (counters[ctr - TRANS_dnj_MIN] > (
unsigned) bottom)
1392 mCRL2log(log::error) <<
"Error 11: counter \""
1393 << work_names[ctr - BLOCK_MIN] <<
"\" exceeded "
1394 "maximum value (" << (
unsigned) bottom <<
") for ";
1397 counters[ctr - TRANS_dnj_MIN] = (
unsigned) bottom;
1400 (
void) max_source_block; (
void) max_target_block; (
void) bottom;
1426 unsigned const max_value)
1431 return add_work(ctr, max_value);
1434 assert(1 == max_value);
1435 if (0 == counters[ctr - TRANS_dnj_MIN])
1441 mCRL2log(log::error) <<
"Error 9: counter \""
1442 << work_names[ctr - BLOCK_MIN] <<
"\" exceeded "
1443 "maximum value (" << max_value <<
") for ";
1446 (
void) ctr; (
void) max_value;
1447 return complexity_ok;
1474 unsigned const max_B)
1477 assert(max_C <= max_B);
1478 assert(max_B <=
log_n);
1484 assert(counters[ctr - BLOCK_gj_MIN] <= max_C);
1485 counters[ctr - BLOCK_gj_MIN] = max_C;
1489 assert(counters[ctr - BLOCK_gj_MIN] <= max_B);
1490 counters[ctr - BLOCK_gj_MIN] = max_B;
1493 (
void) max_C; (
void) max_B;
1521 unsigned max_targetC)
1524 assert(max_sourceC <=
log_n);
1525 assert(max_targetC <=
log_n);
1531 assert(counters[ctr - BLC_gj_MIN] <= max_sourceC);
1532 counters[ctr - BLC_gj_MIN] = max_sourceC;
1536 assert(counters[ctr - BLC_gj_MIN] <= max_targetC);
1537 counters[ctr - BLC_gj_MIN] = max_targetC;
1540 (
void) max_sourceC; (
void) max_targetC;
1576 assert(max_B <=
log_n);
1581 if (counters[ctr - STATE_gj_MIN] > max_B)
1583 mCRL2log(log::error) <<
"Error 21: counter \""
1584 << work_names[ctr - BLOCK_MIN] <<
"\" exceeded "
1585 "maximum value (" << max_B <<
") for ";
1588 assert(counters[ctr - STATE_gj_MIN] <= max_B);
1589 counters[ctr - STATE_gj_MIN] = max_B;
1595 if (counters[ctr - STATE_gj_MIN] > 0)
1597 mCRL2log(log::error) <<
"Error 15: counter \""
1598 << work_names[ctr - BLOCK_MIN] <<
"\" exceeded "
1599 "maximum value (" << 0 <<
") for ";
1606 assert((
unsigned) bottom <= 1);
1610 if (counters[ctr - STATE_gj_MIN] > (
unsigned) bottom)
1612 mCRL2log(log::error) <<
"Error 16: counter \""
1613 << work_names[ctr - BLOCK_MIN] <<
"\" exceeded "
1614 "maximum value (" << (
unsigned) bottom <<
") for ";
1617 counters[ctr - STATE_gj_MIN] = (
unsigned) bottom;
1623 assert(counters[ctr - STATE_gj_MIN] <= 1);
1626 (
void) max_B; (
void) bottom;
1670 unsigned const max_targetC,
1671 unsigned const max_targetB,
bool const source_bottom)
1674 assert(max_sourceB <=
log_n);
1675 assert(max_targetB <=
log_n);
1676 assert(max_targetC <= max_targetB);
1682 assert(counters[ctr - TRANS_gj_MIN] <= max_sourceB);
1683 counters[ctr - TRANS_gj_MIN] = max_sourceB;
1689 assert(counters[ctr - TRANS_gj_MIN] <= max_targetB);
1690 counters[ctr - TRANS_gj_MIN] = max_targetB;
1695 assert(counters[ctr - TRANS_gj_MIN] <= max_targetC);
1696 counters[ctr - TRANS_gj_MIN] = max_targetC;
1701 assert(counters[ctr - TRANS_gj_MIN] <= log_n);
1707 if (counters[ctr - TRANS_gj_MIN] > 0)
1709 mCRL2log(log::error) <<
"Error 17: counter \""
1710 << work_names[ctr - BLOCK_MIN] <<
"\" exceeded "
1711 "maximum value (" << 0 <<
") for ";
1720 if (counters[ctr - TRANS_gj_MIN] > (
unsigned) source_bottom)
1722 mCRL2log(log::error) <<
"Error 18: counter \""
1723 << work_names[ctr - BLOCK_MIN] <<
"\" exceeded "
1724 "maximum value (" << (
unsigned) source_bottom <<
") for ";
1727 counters[ctr - TRANS_gj_MIN] = (
unsigned) source_bottom;
1730 assert((
unsigned) source_bottom <= 1);
1733 if (counters[ctr - TRANS_gj_MIN] > 1)
1735 mCRL2log(log::error) <<
"Error 19: counter \""
1736 << work_names[ctr - BLOCK_MIN]
1737 <<
"\" exceeded maximum value (" << 1 <<
") for ";
1742 (
void) max_sourceB; (
void) max_targetC; (
void) max_targetB;
1743 (
void) source_bottom;
1769 unsigned const max_value)
1774 return add_work(ctr, max_value);
1777 assert(1 == max_value);
1778 if (0 == counters[ctr - TRANS_gj_MIN])
1784 mCRL2log(log::error) <<
"Error 8: counter \""
1785 << work_names[ctr - BLOCK_MIN] <<
"\" exceeded "
1786 "maximum value (" << max_value <<
") for ";
1789 (
void) ctr; (
void) max_value;
1790 return complexity_ok;
1796 #ifdef TEST_WORK_COUNTER_NAMES
1811 #ifdef TEST_WORK_COUNTER_NAMES
1818 assert(0 == sensible_work); sensible_work = 0;
1834 #define percentage(steps,total)
1836 (std::numeric_limits<trans_type>::max()-(total))/200
),
1837 ((steps)*(trans_type)200
+(total))/(total)/2
)
1838 if (0 != overall_total)
1842 <<
" states and transitions were inspected. ";
1848 <<
"% of all steps and cycles).\n";
1853 <<
"% of all steps";
1862 <<
"% of the steps have been cancelled.\n";
1891 #define mCRL2complexity(unit, call, info_for_debug)
1894 const enum check_complexity::result_type
1895 GG00OCOC0GQQ0COG00GQQQQOCOGQCO=((unit)->work_counter. call );
1896 switch (GG00OCOC0GQQ0COG00GQQQQOCOGQCO)
1898 case check_complexity::complexity_ok: break;
1900 mCRL2log(log::error) << "Unexpected return value "
1901 << (int)GG00OCOC0GQQ0COG00GQQQQOCOGQCO << " for ";
1903 case check_complexity::complexity_error:
1904 case check_complexity::complexity_print:
1906 << (unit)->debug_id(info_for_debug) << '\n';
1907 if (check_complexity::complexity_print !=
1908 GG00OCOC0GQQ0COG00GQQQQOCOGQCO)
1915 #define mCRL2complexity(unit, call, info_for_debug)
1918 if (check_complexity::complexity_ok !=
1919 ((unit)->work_counter. call ))
1921 mCRL2log(log::error) << __FILE__ << ':' << __LINE__
1922 << " Error in mCRL2complexity()\n";
1931 #define mCRL2complexity(unit, call, info_for_debug) do {} while (0
)
#define DONT_COUNT_TEMPORARY
special value for temporary work without changing the balance
#define percentage(steps, total)
logger(const log_level_t l)
Default constructor.
result_type no_temporary_work(unsigned max_sourceC, unsigned max_targetC)
ensures there is no orphaned temporary work counter
counters for a B_to_C slice
void reset_work_counter_4_4()
sets the temporary counter associated with line 4.4 to zero
result_type no_temporary_work(unsigned const max_targetC)
ensures there is no orphaned temporary work counter
unsigned char get_work_counter_4_4() const
returns the temporary counter associated with line 4.4
void reset_temporary_work()
result_type no_temporary_work(unsigned const max_bunch)
ensures there is no orphaned temporary work counter
bool has_temporary_work()
result_type no_temporary_work(unsigned const max_C, unsigned const max_B)
ensures there is no orphaned temporary work counter
result_type no_temporary_work(unsigned const max_block)
ensures there is no orphaned temporary work counter
result_type no_temporary_work(unsigned const max_C, unsigned const max_B)
ensures there is no orphaned temporary work counter
result_type no_temporary_work(unsigned const max_bunch)
ensures there is no orphaned temporary work counter
subset of counters (to be associated with a state or transition)
result_type add_work(enum counter_type const ctr, unsigned const max_value)
register work with some counter
counter_t()
constructor, initializes all counters to 0
result_type finalise_work(enum counter_type const from, enum counter_type const to, unsigned const max_value)
move temporary work to its final counter
result_type move_work(enum counter_type const from, enum counter_type const to, unsigned const max_value)
move temporary work to another counter
result_type cancel_work(enum counter_type const ctr)
cancel temporary work
std::array< unsigned char, LastCounter - FirstCounter+1 > counters
actual space to store the counters
result_type no_temporary_work(unsigned const max_B, bool const bottom)
ensures there is no orphaned temporary work counter
result_type no_temporary_work(unsigned const max_block, bool const bottom)
ensures there is no orphaned temporary work counter
result_type no_temporary_work(unsigned const max_B, bool const bottom)
ensures there is no orphaned temporary work counter
result_type add_work_notemporary(enum counter_type const ctr, unsigned const max_value)
register work with some temporary counter without changing the balance between sensible and superfluo...
result_type no_temporary_work(unsigned const max_sourceB, unsigned const max_targetC, unsigned const max_targetB, bool const source_bottom)
ensures there is no orphaned temporary work counter
result_type no_temporary_work(unsigned const max_source_block, unsigned const max_target_block, bool const bottom)
ensures there is no orphaned temporary work counter
result_type add_work_notemporary(enum counter_type const ctr, unsigned const max_value)
register work with some temporary counter without changing the balance between sensible and superfluo...
result_type no_temporary_work(unsigned const max_sourceB, unsigned const max_targetC, unsigned const max_targetB, bool const source_bottom)
ensures there is no orphaned temporary work counter
result_type add_work_notemporary(enum counter_type const ctr, unsigned const max_value)
register work with some temporary counter without changing the balance between sensible and superfluo...
class for time complexity checks
static int ilog2(state_type size)
calculate the base-2 logarithm, rounded down
static void cancel_work_units(trans_type units=1)
static signed_trans_type sensible_work
counter to register the work balance for coroutines
static void wait(trans_type units=1)
do some work that cannot be assigned directly
static void check_waiting_cycles()
static unsigned char log_n
value of floor(log2(n)) for easy access
counter_type
Type for complexity budget counters.
@ stabilizeB_initialize_Qhat_afterwards
@ refine_incoming_transition_3_18
@ for_all_s_prime_in_pred_s_3_32l
@ simple_splitB_R_handle_transition_from_R_state
@ stabilizeB_main_loop_afterwards
@ for_all_s_prime_in_succ_s_3_32r
@ stabilizeB_prepare_block
@ Move_Blue_or_Red_to_a_new_block_states_3_29
@ while_Test_is_not_empty_3_6l_s_is_blue_3_11l
@ simple_splitB_handle_transition_from_R_or_U_state
@ for_all_old_bottom_states_s_in_RedB_selfloop_4_15
@ simple_splitB_find_bottom_state
@ refine_outgoing_transition_to_marked_state_3_6l
@ BLOCK_BUNCH_dnj_MIN_TEMP
@ splitB_unmark_transitions_out_of_new_bottom_block_afterwards
@ refine_partition_until_stable_stabilize_new_noninert_a_priori
@ refine_partition_until_it_becomes_stable_correct_end_of_calM
@ while_Red_contains_unvisited_states_3_15r
@ Move_Blue_or_Red_to_a_new_block_succ_3_29
@ split_test_noninert_transitions_found_new_bottom_state
@ while_Blue_contains_unvisited_states_3_15l
@ create_initial_partition_set_start_incoming_transitions
@ for_all_s_prime_in_pred_s_setminus_Red_3_18l
@ splitB_update_BLC_of_smaller_subblock
@ multiple_swap_states_in_block_account_for_swap_in_aborted_block
@ for_all_transitions_from_bottom_states_a_posteriori_4_4
@ split_handle_transition_to_R_or_U_state
@ adapt_transitions_for_new_block
@ for_all_bottom_states_s_in_RfnB_4_8
@ for_all_s_prime_in_pred_s_3_18r
@ refine_partition_until_stable_find_pred
@ refine_partition_until_stable_stabilize_for_large_splitter
@ Move_Blue_or_Red_to_a_new_block_NewB_swap_3_29
@ refine_visited_state_3_15
@ split_find_predecessors_of_R_or_U_state
@ create_initial_partition
@ for_all_transitions_from_bottom_states_a_priori_4_4
@ Move_Blue_or_Red_to_a_new_block_NewB_pointer_3_29
@ while_Test_is_not_empty_3_6l_s_is_red_3_9l_postprocessing
@ refine_outgoing_transition_from_new_bottom_3_23l
@ refine_partition_until_stable_stabilize
@ stabilizeB_initialize_Qhat
@ simple_splitB_test_outgoing_transitions_found_new_bottom_state
@ refine_partition_until_stable_stabilize_new_noninert_a_posteriori
@ create_initial_partition_refine_block
@ Register_that_inert_transitions_from_s_go_to_NewC_swap_2_17
@ if_s_prime_has_transition_to_SpC_3_23l
@ simple_splitB_U_handle_transition_to_U_state
@ handle_new_noninert_transns_make_unstable_a_posteriori
@ for_all_s_prime_in_pred_s_2_11
@ simple_splitB_R_handle_transition_to_R_state
@ for_all_transitions_that_need_postproc_a_posteriori_4_12
@ Register_that_inert_transitions_from_s_go_to_NewC_succ_2_17
@ order_BLC_transitions_sort_transition
@ split_U_find_predecessors_of_U_state
@ Register_that_inert_transitions_from_s_go_to_NewC_B_to_C_2_17
@ for_all_old_bottom_states_s_in_RedB_4_15
@ simple_splitB_U_find_predecessors
@ for_all_refinable_blocks_RfnB_2_20
@ handle_new_noninert_transns_make_unstable_temp
@ split_handle_transition_from_R_or_U_state
@ refine_partition_until_it_becomes_stable_prepare_cosplit
@ refine_outgoing_transition_postprocess_new_bottom_3_6l
@ split_U_handle_transition_to_U_state
@ split_R_handle_transition_to_R_state
@ split_R_find_predecessors_of_R_state
@ simple_splitB_R_find_predecessors
@ multiple_swap_states_in_block_swap_state_in_small_block
@ simple_splitB_handle_transition_to_R_or_U_state
@ split_R_handle_transition_from_R_state
@ refine_partition_until_it_becomes_stable_find_cotransition
@ split_block_B_into_R_and_BminR_carry_out_split
@ move_out_slice_to_new_block
@ simple_splitB_find_predecessors_of_R_or_U_state
@ stabilizeB_distribute_states_over_Phat
@ four_way_splitB_handle_transitions_in_main_splitter
@ handle_new_noninert_transns
@ split_U_test_noninert_transitions
@ refine_partition_until_it_becomes_stable_find_splitter
@ simple_splitB_U_handle_transition_from_potential_U_state
@ refine_outgoing_transition_3_6_or_23l
@ for_all_transitions_that_need_postproc_a_priori_4_12
@ BLOCK_BUNCH_dnj_MAX_TEMP
@ split_block_B_into_R_and_BminR_skip_over_state
@ handle_new_noninert_transns_make_unstable_a_priori
@ refine_partition_until_it_becomes_stable_execute_main_split
@ while_Test_is_not_empty_3_6l_s_is_red_3_9l
@ refine_bottom_state_3_6l
@ for_all_constellations_C_not_in_R_from_RfnB_4_4
@ splitB_unmark_transitions_out_of_new_bottom_block
@ while_C_contains_a_nontrivial_constellation_2_4
@ while_FromRed_is_not_empty_3_6r
static trans_type sensible_work_grand_total
the number of useful steps in the course of the whole algorithm
static trans_type no_of_waiting_cycles_grand_total
the number of waiting cycles in the course of the whole algorithm
static trans_type cancelled_work_grand_total
the number of cancelled steps (in aborted coroutines) in the course of the whole algorithm
static void check_temporary_work()
check that not too much superfluous work has been done
static void finalise_work_units(trans_type units=1)
static void print_grand_totals()
print grand total of work in the coroutines (to measure overhead)
static void init(state_type n)
starts counting for a new refinement run
static const std::array< const char *, TRANS_gj_MAX - BLOCK_MIN+1 > work_names
printable names of the counter types (for error messages)
static bool cannot_wait_before_reset
indicates whether waiting cycles are allowed
static trans_type no_of_waiting_cycles
the number of waiting cycles that have been done in the current accounting period
#define mCRL2log(LEVEL)
mCRL2log(LEVEL) provides the stream used to log.
std::size_t operator()(const std::vector< X > &v) const