23#ifndef _LIBLTS_BISIM_GJKW_H
24#define _LIBLTS_BISIM_GJKW_H
26#include <unordered_map>
47 #define ONLY_IF_DEBUG(...) __VA_ARGS__
49 #define ONLY_IF_DEBUG(...)
54typedef std::size_t label_type;
116class state_info_entry;
235 return this[1].state_in_begin;
239 return this[1].state_in_begin;
243 this[1].set_pred_begin(new_in_end);
278 return this[1].state_out_begin;
282 return this[1].state_out_begin;
458#define BLOCK_NO_SEQNR ((state_type) -1)
649 new_unmarked_nonbottom_end)
665 new_marked_nonbottom_begin)
961 block_t*
const LastB =
end()[-1]->block; assert(FirstB != LastB);
997 return "constellation [" +
1000 ") (#" + std::to_string(
sort_key) +
")";
1006template <
class LTS_TYPE>
1007class bisim_partitioner_gjkw_initialise_helper;
1032 template <
class LTS_TYPE>
1072 constln_t*
const C = permutation_iter[-1]->constln(); assert(C->
end() == permutation_iter);
1075 permutation_iter = C->
begin();
1084 block_t*
const B = permutation_iter[-1]->block; assert(B->
end() == permutation_iter);
1085 permutation_iter = B->
begin();
1088 else assert(0 == deleted_blocks);
1248 { assert(this_->int_slice_begin_or_before_end->
1250 return this_->int_slice_begin_or_before_end + 1;
1251 } assert(this_->int_slice_begin_or_before_end->
1262 { assert(this_->int_slice_begin_or_before_end->
1264 return this_->int_slice_begin_or_before_end + 1;
1265 } assert(this_->int_slice_begin_or_before_end->
1292 succ->target->debug_id_short();
1323 while (++iter != end)
1327 add_work_notemporary(ctr, max_value), );
1346 return begin->pred->source->block;
1350 return begin->pred->source->block;
1356 return begin->pred->succ->target->constln();
1360 return begin->pred->succ->target->constln();
1380 std::string result(
"slice containing transition");
1386 assert(iter->pred->succ->B_to_C == iter);
1387 result += iter->pred->debug_id_short();
1390 assert(iter[1].pred->succ->B_to_C == iter+1);
1392 result += iter[1].pred->debug_id_short();
1396 while (++iter !=
end)
1398 assert(iter->pred->succ->B_to_C == iter);
1400 result += iter->pred->debug_id_short();
1420 if (iter->pred->source->pos >=
1421 iter->pred->source->block->bottom_begin())
1444 template <
class LTS_TYPE>
1448 { assert(
B_to_C.end() > pos1); assert(pos1->pred->succ->B_to_C == pos1);
1449 assert(
B_to_C.end() > pos2); assert(pos2->pred->succ->B_to_C == pos2);
1452 *pos1->pred = *pos2->pred;
1453 *pos2->pred = temp_entry;
1456 pos1->pred = pos2->pred;
1457 pos2->pred = temp_iter; assert(
B_to_C.end() > pos1); assert(pos1->pred->succ->B_to_C == pos1);
1458 assert(
B_to_C.end() > pos2); assert(pos2->pred->succ->B_to_C == pos2);
1462 { assert(
pred.end() > pos1); assert(pos1->succ->B_to_C->pred == pos1);
1463 assert(
pred.end() > pos2); assert(pos2->succ->B_to_C->pred == pos2);
1464 assert(pos1->succ->slice_begin() == pos2->succ->slice_begin());
1469 pos1->succ->B_to_C = pos2->succ->B_to_C;
1470 pos1->succ->target = pos2->succ->target;
1471 pos2->succ->B_to_C = temp_B_to_C;
1472 pos2->succ->target = temp_target;
1475 pos1->succ = pos2->succ;
1476 pos2->succ = temp_iter; assert(
pred.end() > pos1); assert(pos1->succ->B_to_C->pred == pos1);
1477 assert(
pred.end() > pos2); assert(pos2->succ->B_to_C->pred == pos2);
1478 assert(pos1->succ->slice_begin() == pos2->succ->slice_begin());
1483 { assert(
succ.end() > pos1); assert(pos1->B_to_C->pred->succ == pos1);
1484 assert(
succ.end() > pos2); assert(pos2->B_to_C->pred->succ == pos2);
1487 *pos1->B_to_C = *pos2->B_to_C;
1488 *pos2->B_to_C = temp_entry;
1491 pos1->B_to_C = pos2->B_to_C;
1492 pos2->B_to_C = temp_iter; assert(
succ.end() > pos1); assert(pos1->B_to_C->pred->succ == pos1);
1493 assert(
succ.end() > pos2); assert(pos2->B_to_C->pred->succ == pos2);
1499 { assert(
succ.end() > pos1); assert(pos1->B_to_C->pred->succ == pos1);
1500 assert(
succ.end() > pos2); assert(pos2->B_to_C->pred->succ == pos2);
1501 assert(
succ.end() > pos3); assert(pos3->B_to_C->pred->succ == pos3);
1502 assert(pos1 != pos2 || pos1 == pos3);
1505 *pos1->B_to_C = *pos3->B_to_C;
1506 *pos3->B_to_C = *pos2->B_to_C;
1507 *pos2->B_to_C = temp_entry;
1510 pos2->B_to_C = pos3->B_to_C;
1511 pos3->B_to_C = pos1->B_to_C;
1512 pos1->B_to_C = temp_iter; assert(
succ.end() > pos1); assert(pos1->B_to_C->pred->succ == pos1);
1513 assert(
succ.end() > pos2); assert(pos2->B_to_C->pred->succ == pos2);
1514 assert(
succ.end() > pos3); assert(pos3->B_to_C->pred->succ == pos3);
1523 { assert(
B_to_C.empty()); assert(
succ.empty()); assert(
pred.empty());
1556 bool first_transition_of_state,
bool first_transition_of_block);
1573 succ_iter->B_to_C->pred->source->block->inert_begin(); assert(succ_iter->B_to_C->B_to_C_slice->begin <= other_B_to_C);
1574 assert(other_B_to_C <= succ_iter->
B_to_C);
1575 assert(succ_iter->B_to_C < succ_iter->B_to_C->B_to_C_slice->end);
1577 succ_iter->B_to_C->pred->source->block->set_inert_begin(other_B_to_C +
1580 pred_iter_t const other_pred = succ_iter->target->inert_pred_begin(); assert(succ_iter->target->pred_begin() <= other_pred);
1581 assert(other_pred <= succ_iter->
B_to_C->pred);
1582 assert(succ_iter->B_to_C->pred < succ_iter->target->pred_end());
1583 swap_in(succ_iter->B_to_C, other_pred->succ->B_to_C);
1584 succ_iter->target->set_inert_pred_begin(other_pred + 1);
1587 succ_iter->B_to_C->pred->source->inert_succ_begin(); assert(succ_iter->B_to_C->pred->source->succ_begin() <= other_succ);
1588 assert(other_succ <= succ_iter);
1589 assert(succ_iter < succ_iter->
B_to_C->pred->source->succ_end());
1590 swap_out(succ_iter->B_to_C->pred, other_succ->B_to_C->pred);
1591 succ_iter->B_to_C->pred->source->set_inert_succ_begin(other_succ + 1);
1654template<
class LTS_TYPE>
1687 return std::hash<label_type>()(k.
first) ^
1688 (std::hash<state_type>()(k.
second) << 1);
1706 bool preserve_divergence);
1710 bool branching,
bool preserve_divergence);
1717 bool preserve_divergence);
1734struct refine_shared_t;
1740template <
class LTS_TYPE>
1752 bool preserve_divergence =
false)
1756 { assert(branching || !preserve_divergence);
1774 preserve_divergence);
1797 bool preserve_divergence);
1844template <
class LTS_TYPE>
1845void bisimulation_reduce_gjkw(LTS_TYPE& l,
bool branching =
false,
1846 bool preserve_divergence =
false);
1861template <
class LTS_TYPE>
1863 bool branching =
false,
bool preserve_divergence =
false,
1864 bool generate_counter_examples =
false);
1881template <
class LTS_TYPE>
1883 bool branching =
false,
bool preserve_divergence =
false);
1886template <
class LTS_TYPE>
1888 bool const preserve_divergence )
1899 preserve_divergence);
1905template <
class LTS_TYPE>
1907 bool branching ,
bool preserve_divergence )
1909 LTS_TYPE l1_copy(l1);
1910 LTS_TYPE l2_copy(l2);
1912 preserve_divergence);
1915template <
class LTS_TYPE>
1917 bool branching ,
bool preserve_divergence ,
1918 bool generate_counter_examples ,
1919 const std::string& ,
1922 if (generate_counter_examples)
1925 "not generate counterexamples.\n";
1927 state_type init_l2 = l2.initial_state() + l1.num_states();
1940 preserve_divergence);
1941 return bisim_part.
in_same_class(l1.initial_state(), init_l2);
1991 assert(iter->from_block() ==
this);
1992 assert(iter->to_constln() != SpC);
2006 } assert(new_fromred->from_block() ==
this);
helper class for time complexity checks during test runs
#define mCRL2complexity(unit, call, info_for_debug)
Assigns work to a counter and checks for errors.
helps with initialising the refinable partition data structure
stores information about a block
stores information about a constellation
refinable partition data structure
stores information about a single state
implements the main algorithm for the stutter equivalence quotient
counters for a B_to_C slice
counter_type
Type for complexity budget counters.
This class contains an scc partitioner removing inert tau loops.
std::size_t get_eq_class(const std::size_t s) const
Gives the equivalence class number of a state. The equivalence class numbers range from 0 upto (and e...
void replace_transition_system(const bool preserve_divergence_loops)
The lts for which this partioner is created is replaced by the lts modulo the calculated partition.
a vector class that cannot be moved while it is not empty
bool bisimulation_compare_gjkw(const LTS_TYPE &l1, const LTS_TYPE &l2, bool branching=false, bool preserve_divergence=false)
Checks whether the two initial states of two LTSs are strong or branching bisimilar.
void bisimulation_reduce_gjkw(LTS_TYPE &l, bool branching=false, bool preserve_divergence=false)
Reduce transition system l with respect to strong or (divergence preserving) branching bisimulation.
bool destructive_bisimulation_compare_gjkw(LTS_TYPE &l1, LTS_TYPE &l2, bool branching=false, bool preserve_divergence=false, bool generate_counter_examples=false)
Checks whether the two initial states of two LTSs are strong or branching bisimilar.
std::string debug_id() const
print a B_to_C slice identification for debugging
std::string debug_id() const
print a constellation identification for debugging
fixed_vector< B_to_C_entry > B_to_C
part_trans_t(trans_type m)
permutation_t permutation
permutation array
std::string debug_id() const
print a block identification for debugging
bisim_partitioner_gjkw(LTS_TYPE &l, bool branching=false, bool preserve_divergence=false)
check_complexity::trans_counter_t work_counter
succ_iter_t change_to_C(pred_iter_t pred_iter, ONLY_IF_DEBUG(constln_t *SpC, constln_t *NewC,) bool first_transition_of_state, bool first_transition_of_block)
transition target is moved to a new constellation
block_t * refinable_next
next block in the list of refinable blocks
static permutation_const_iter_t permutation_begin()
provide an iterator to the beginning of the permutation array
permutation_iter_t unmarked_bottom_end()
permutation_const_iter_t end() const
iterator past the last state in the block
void split_inert_to_C(block_t *B)
handle the transitions from the splitter to its own constellation
void set_inert_begin(B_to_C_iter_t new_inert_begin)
void replace_transition_system(bool branching, bool preserve_divergence)
void assert_stability(const part_state_t &part_st) const
assert that the data structure is consistent and stable
succ_const_iter_t slice_begin() const
bisim_gjkw::bisim_partitioner_gjkw_initialise_helper< LTS_TYPE > init_helper
const constln_t * to_constln() const
compute the goal constellation of the transitions in this slice
succ_iter_t slice_begin_or_before_end()
static state_type nr_of_blocks
total number of blocks with unique sequence number allocated
state_type unmarked_bottom_size() const
provides the number of unmarked bottom states in the block
void replace_transition_system(const part_state_t &part_st, ONLY_IF_DEBUG(bool branching,) bool preserve_divergence)
Replaces the transition relation of the current LTS by the transitions of the bisimulation-reduced tr...
bool split_s_inert_out(state_info_ptr s ONLY_IF_DEBUG(, constln_t *OldC))
Split outgoing transitions of a state in the splitter.
pred_iter_t inert_pred_end()
void set_marked_bottom_begin(permutation_iter_t new_marked_bottom_begin)
void SetFromRed(B_to_C_desc_iter_t new_fromred)
set FromRed to an existing element in to_constln
void make_nontrivial()
makes a constellation non-trivial (i. e. inserts it into the respective list)
permutation_const_iter_t nonbottom_begin() const
iterator to the first non-bottom state in the block
B_to_C_const_iter_t B_to_C_begin() const
pred_const_iter_t inert_pred_end() const
iterator one past the last inert incoming transition
permutation_iter_t marked_bottom_begin()
static succ_const_iter_t slice_end(succ_const_iter_t this_)
const block_t * from_block() const
compute the source block of the transitions in this slice
block_t * split_off_small_block()
split off a single block from the constellation
bisim_gjkw::block_t * postprocess_new_bottom(bisim_gjkw::block_t *RedB)
Split a block with new bottom states as needed.
void set_succ_begin(succ_iter_t new_out_begin)
B_to_C_iter_t postprocess_begin
iterator to the first transition into this constellation that needs postprocessing
bool add_work_to_bottom_transns(enum check_complexity::counter_type ctr, unsigned max_value)
B_to_C_iter_t B_to_C_end()
bool operator>(const constln_t &other) const
const constln_t * constln() const
get constellation where the state belongs
permutation_const_iter_t begin() const
iterator to the first state in the block
pred_iter_t noninert_pred_begin()
void make_trivial()
makes a constellation trivial (i. e. removes it from the respective list)
succ_iter_t slice_begin()
void swap_B_to_C(succ_iter_t const pos1, succ_iter_t const pos2)
succ_iter_t state_inert_out_end
iterator past the last inert outgoing transition
B_to_C_descriptor(B_to_C_iter_t begin_, B_to_C_iter_t end_)
bool surely_has_no_transition_to(const constln_t *SpC) const
std::size_t operator()(const Key &k) const
bool needs_postprocessing() const
returns true iff the slice is marked for postprocessing
void set_begin(permutation_iter_t new_begin)
permutation_const_iter_t marked_nonbottom_begin() const
iterator to the first marked non-bottom state in the block
permutation_iter_t pos
position of the state in the permutation array
state_type get_eq_class(state_type s) const
static constln_t * nontrivial_first
first constellation in the list of non-trivial constellations
permutation_iter_t unmarked_bottom_begin()
bool operator>=(const constln_t &other) const
std::unordered_map< label_type, state_type > action_block_map
void set_pred_begin(pred_iter_t new_in_begin)
succ_iter_t current_constln()
trans_type nr_of_transitions
permutation_const_iter_t end() const
constant iterator past the last state in the constellation
permutation_iter_t marked_nonbottom_end()
permutation_const_iter_t unmarked_bottom_begin() const
iterator to the first unmarked bottom state in the block
bisim_gjkw::part_trans_t part_tr
void set_succ_end(succ_iter_t new_out_end)
std::vector< state_type > inert_out_per_state
fixed_vector< pred_entry > pred
void set_inert_begin_and_end(B_to_C_iter_t new_inert_begin, B_to_C_iter_t new_inert_end)
B_to_C_const_iter_t inert_begin() const
iterator to the first inert transition of the block
permutation_iter_t unmarked_nonbottom_end()
void make_nonrefinable()
makes a block non-refinable (i. e. removes it from the respective list)
B_to_C_desc_iter_t B_to_C_slice
permutation_const_iter_t marked_bottom_begin() const
iterator to the first marked bottom state in the block
pred_const_iter_t noninert_pred_begin() const
iterator to first non-inert incoming transition
pred_iter_t noninert_pred_end()
bool mark_nonbottom(state_info_ptr s)
mark a non-bottom state
permutation_const_iter_t bottom_begin() const
iterator to the first bottom state in the block
std::string debug_id_short() const
print a short state identification for debugging
permutation_iter_t int_marked_bottom_begin
iterator to the first marked bottom state of the block
void swap_out(pred_iter_t const pos1, pred_iter_t const pos2)
state_type size() const
provides the number of states in the block
void init_transitions(part_state_t &part_st, part_trans_t &part_tr, bool branching, bool preserve_divergence)
initialise the state in part_st and the transitions in part_tr
bool operator==(const Key &other) const
permutation_iter_t int_begin
iterator to the first state in the constellation
succ_iter_t int_current_constln
iterator to first outgoing transition to the constellation of interest
block_t * split_off_blue(permutation_iter_t blue_nonbottom_end)
refine the block (the blue subblock is smaller)
part_state_t(state_type n)
constructor
permutation_iter_t int_bottom_begin
iterator to the first bottom state of the block
permutation_const_iter_t marked_bottom_end() const
iterator past the last marked bottom state in the block
std::vector< state_type > inert_out_per_block
void set_slice_begin_or_before_end(succ_iter_t new_value)
state_type notblue
number of inert transitions to non-blue states
permutation_const_iter_t marked_nonbottom_end() const
iterator one past the last marked non-bottom state in the block
static state_type num_eq_classes()
check_complexity::state_counter_t work_counter
const state_type sort_key
sort key to order constellation-related information
state_type marked_bottom_size() const
provides the number of marked bottom states in the block
std::vector< state_type > states_per_block
bool is_trivial() const
returns true iff the constellation is trivial
state_type nr_of_nonbottom_states
permutation_iter_t int_marked_nonbottom_begin
iterator to the first marked non-bottom state of the block
void make_noninert(succ_iter_t const succ_iter)
permutation_iter_t int_end
iterator past the last state of the block
pred_iter_t inert_pred_begin()
B_to_C_desc_list to_constln
list of B_to_C with transitions from this block
state_type get_nr_of_states() const
provides the number of states in the Kripke structure
static block_t * get_some_refinable()
provides an arbitrary refinable block
static succ_iter_t slice_end(succ_iter_t this_)
block_t * block
block where the state belongs
void create_initial_partition_gjkw(bool branching, bool preserve_divergence)
const constln_t * get_nontrivial_next() const
provides the next non-trivial constellation
void set_constln(constln_t *new_constln)
B_to_C_iter_t inert_begin()
succ_iter_t inert_succ_begin()
void set_marked_nonbottom_begin(permutation_iter_t new_marked_nonbottom_begin)
permutation_iter_t begin()
static permutation_const_iter_t perm_begin
bool operator<(const constln_t &other) const
compares two constellations for ordering them
bool make_refinable()
makes a block refinable (i. e. inserts it into the respective list)
fixed_vector< state_info_entry > state_info
array with all other information about states
state_type state_size() const
provide size of state space
state_type size() const
returns number of states in the constellation
B_to_C_const_iter_t inert_end() const
iterator past the last inert transition of the block
permutation_iter_t unmarked_nonbottom_begin()
const constln_t * constln() const
constellation where the block belongs to
permutation_iter_t bottom_end()
constln_t * int_constln
constellation to which the block belongs
permutation_const_iter_t bottom_end() const
iterator past the last bottom state in the block
static block_t * refinable_first
first block in the list of refinable blocks
static void slice_add_work_to_transns(succ_const_iter_t this_, enum check_complexity::counter_type ctr, unsigned max_value)
void swap_in(B_to_C_iter_t const pos1, B_to_C_iter_t const pos2)
state_type int_seqnr
unique sequence number of this block
succ_const_iter_t succ_begin() const
iterator to first outgoing transition
bool operator<=(const constln_t &other) const
succ_const_iter_t current_constln() const
void new_red_block_created(block_t *OldB, block_t *NewB, bool postprocessing)
handle B_to_C slices after a new red block has been created
void set_end(permutation_iter_t new_end)
void print_trans() const
print all transitions
std::vector< state_type > inert_in_per_state
bool is_refinable() const
checks whether the block is refinable
block_t * split_off_red(permutation_iter_t red_nonbottom_begin)
refine the block (the red subblock is smaller)
succ_iter_t int_slice_begin_or_before_end
points to the last or the first transition to the same constellation
succ_iter_t inert_succ_end()
succ_const_iter_t inert_succ_begin() const
iterator to first inert outgoing transition
permutation_const_iter_t begin() const
constant iterator to the first state in the constellation
bisim_gjkw::part_state_t part_st
pred_iter_t state_in_begin
iterator to first incoming transition
const state_type orig_nr_of_states
permutation_iter_t int_begin
iterator to the first state of the block
pred_iter_t state_inert_in_begin
iterator to first inert incoming transition
void assign_seqnr()
assigns a unique sequence number
std::unordered_map< Key, state_type, KeyHasher > extra_kripke_states
B_to_C_iter_t inert_end()
void new_blue_block_created(block_t *OldB, block_t *NewB)
handle B_to_C slices after a new blue block has been created
~bisim_partitioner_gjkw()
permutation_iter_t marked_bottom_end()
permutation_iter_t begin()
iterator to the first state in the constellation
static state_info_const_ptr s_i_begin
pointer at the first entry in the state_info array
check_complexity::B_to_C_counter_t work_counter
static constln_t * get_some_nontrivial()
provides an arbitrary non-trivial constellation
permutation_const_iter_t unmarked_bottom_end() const
iterator past the last unmarked bottom state in the block
bool operator<(const block_t &other) const
compares two blocks for ordering them
void set_bottom_begin(permutation_iter_t new_bottom_begin)
void set_nonbottom_end(permutation_iter_t new_nonbottom_end)
std::string debug_id() const
print a state identification for debugging
void set_inert_pred_begin(pred_iter_t new_inert_in_begin)
void clear()
deallocates constellations and blocks
bisim_gjkw::block_t * refine(bisim_gjkw::block_t *RfnB, const bisim_gjkw::constln_t *SpC, const bisim_gjkw::B_to_C_descriptor *FromRed, bool postprocessing ONLY_IF_DEBUG(, const bisim_gjkw::constln_t *NewC=nullptr))
refine a block into the part that can reach SpC and the part that cannot
constln_t(state_type sort_key_, permutation_iter_t begin_, permutation_iter_t end_, B_to_C_iter_t postprocess_none)
constructor
void set_inert_succ_begin_and_end(succ_iter_t new_inert_out_begin, succ_iter_t new_inert_out_end)
void swap3_B_to_C(succ_iter_t const pos1, succ_iter_t const pos2, succ_iter_t const pos3)
block_t(constln_t *const constln_, permutation_iter_t const begin_, permutation_iter_t const end_)
constructor
const block_t * block(state_type s) const
find block of a state
succ_const_iter_t inert_succ_end() const
iterator past the last inert outgoing transition
permutation_iter_t end()
iterator past the last state in the constellation
succ_const_iter_t slice_begin_or_before_end() const
check_complexity::block_counter_t work_counter
std::vector< state_type > noninert_in_per_state
succ_iter_t state_out_begin
iterator to first outgoing transition
pred_const_iter_t inert_pred_begin() const
iterator to first inert incoming transition
std::string debug_id() const
print a transition identification for debugging
Key(const label_type &f, const state_type &s)
B_to_C_iter_t int_inert_begin
iterator to the first inert transition of the block
void set_unmarked_bottom_end(permutation_iter_t new_unmarked_bottom_end)
pred_const_iter_t noninert_pred_end() const
iterator past the last non-inert incoming transition
void set_inert_end(B_to_C_iter_t new_inert_end)
~part_state_t()
destructor
pred_const_iter_t pred_end() const
iterator past the last incoming transition
constln_t * nontrivial_next
next constellation in the list of non-trivial constellations
bool in_same_class(state_type s, state_type t) const
B_to_C_iter_t int_inert_end
iterator past the last inert transition of the block
fixed_vector< succ_entry > succ
permutation_iter_t nonbottom_end()
static state_info_const_ptr s_i_end
pointer past the last actual entry in the state_info array
void set_pred_end(pred_iter_t new_in_end)
permutation_iter_t bottom_begin()
permutation_const_iter_t unmarked_nonbottom_begin() const
iterator to the first unmarked non-bottom state in the block
void set_end(permutation_iter_t new_end)
set the iterator past the last state in the constellation
permutation_const_iter_t nonbottom_end() const
iterator past the last non-bottom state in the block
succ_const_iter_t succ_end() const
iterator past the last outgoing transition
void set_unmarked_nonbottom_end(permutation_iter_t new_unmarked_nonbottom_end)
void clear()
clear allocated memory
permutation_iter_t nonbottom_begin()
B_to_C_descriptor * FromRed(const constln_t *SpC)
read FromRed
std::string debug_id_short() const
print a short transition identification for debugging
std::vector< state_type > noninert_out_per_block
permutation_const_iter_t unmarked_nonbottom_end() const
iterator past the last unmarked non-bottom state in the block
succ_const_iter_t succ_end() const
void print_block(const char *message, const block_t *B, permutation_const_iter_t begin, permutation_const_iter_t end) const
print a slice of the partition (typically a block)
state_type marked_size() const
provides the number of marked states in the block
permutation_iter_t marked_nonbottom_begin()
pred_const_iter_t pred_end() const
std::vector< state_type > noninert_out_per_state
trans_type trans_size() const
B_to_C_iter_t postprocess_end
iterator past the last transition into this constellation that needs postprocessing
void refine_partition_until_it_becomes_stable_gjkw()
trans_type get_nr_of_transitions() const
provides the number of transitions in the Kripke structure
void print_part(const part_trans_t &part_tr) const
print the partition as a tree (per constellation and block)
permutation_iter_t int_end
iterator past the last state in the constellation
void set_current_constln(succ_iter_t const new_current_constln)
void set_inert_succ_begin(succ_iter_t const new_inert_out_begin)
bool mark(state_info_ptr s)
mark a state
succ_iter_t state_inert_out_begin
iterator to first inert outgoing transition
pred_const_iter_t pred_begin() const
iterator to first incoming transition
bool surely_has_transition_to(const constln_t *SpC) const
void set_begin(permutation_iter_t new_begin)
set the iterator to the first state in the constellation
#define ONLY_IF_DEBUG(...)
include something in Debug mode
#define mCRL2log(LEVEL)
mCRL2log(LEVEL) provides the stream used to log.
const state_info_entry * state_info_const_ptr
fixed_vector< pred_entry >::iterator pred_iter_t
fixed_vector< succ_entry >::const_iterator succ_const_iter_t
permutation_t::iterator permutation_iter_t
fixed_vector< pred_entry >::const_iterator pred_const_iter_t
state_info_entry * state_info_ptr
fixed_vector< state_info_ptr > permutation_t
permutation_t::const_iterator permutation_const_iter_t
std::list< B_to_C_descriptor > B_to_C_desc_list
B_to_C_desc_list::const_iterator B_to_C_desc_const_iter_t
B_to_C_desc_list::iterator B_to_C_desc_iter_t
fixed_vector< B_to_C_entry >::iterator B_to_C_iter_t
fixed_vector< succ_entry >::iterator succ_iter_t
fixed_vector< B_to_C_entry >::const_iterator B_to_C_const_iter_t
static void swap_permutation(permutation_iter_t s1, permutation_iter_t s2)
swap two permutations
void merge(LTS_TYPE &l1, const LTS_TYPE &l2)
std::size_t state_type
type used to store state (numbers and) counts
std::size_t label_type
type used to store label numbers and counts
std::size_t trans_type
type used to store transition (numbers and) counts
void scc_reduce(LTS_TYPE &l, const bool preserve_divergence_loops=false)
A class that takes a linear process specification and checks all tau-summands of that LPS for conflue...
void swap(atermpp::unprotected_aterm_core &t1, atermpp::unprotected_aterm_core &t2) noexcept
Swaps two aterms.