11#ifndef MCRL2_LTS_DETAIL_LIBLTS_PBISIM_GRV_H
12#define MCRL2_LTS_DETAIL_LIBLTS_PBISIM_GRV_H
14#include "mcrl2/utilities/execution_timer.h"
15#include "mcrl2/lts/detail/embedded_list.h"
16#include "mcrl2/lts/detail/liblts_plts_merge.h"
21template <
class LTS_TYPE>
26
27
28
32 mCRL2log(log::verbose) <<
"Probabilistic bisimulation partitioner created for " <<
33 l.num_states() <<
" states and " <<
34 l.num_transitions() <<
" transitions\n";
35 timer.start(
"bisimulation_reduce (grv)");
38 timer.finish(
"bisimulation_reduce (grv)");
42
43
46 return action_constellations.size();
50
51
54 assert(s < action_states.size());
55 return action_states[s].parent_block;
59
60
63 assert(s<probabilistic_states.size());
64 return probabilistic_states[s].parent_block;
68
69
72 std::set<transition> resulting_transitions;
74 const std::vector<transition>& trans = aut.get_transitions();
75 for (
const transition& t : trans)
77 resulting_transitions.insert(
79 get_eq_class(t.from()),
81 get_eq_probabilistic_class(t.to())));
84 aut.clear_transitions();
87 for (
const transition& t : resulting_transitions)
89 aut.add_transition(t);
94
95
98 std::vector<
typename LTS_TYPE::probabilistic_state_t> new_probabilistic_states;
101 for (probabilistic_block_type& prob_block : probabilistic_blocks)
103 if (prob_block.states.size()>0)
105 typename LTS_TYPE::probabilistic_state_t equivalent_ps = calculate_equivalent_probabilistic_state(prob_block);
106 new_probabilistic_states.push_back(equivalent_ps);
111 aut.clear_probabilistic_states();
114 for (
const typename LTS_TYPE::probabilistic_state_t& new_ps : new_probabilistic_states)
116 aut.add_probabilistic_state(new_ps);
119 typename LTS_TYPE::probabilistic_state_t old_initial_prob_state =
aut.initial_probabilistic_state();
121 aut.set_initial_probabilistic_state(new_initial_prob_state);
125
126
127
128
131 return get_eq_probabilistic_class(s) == get_eq_probabilistic_class(t);
144 using probability_label_type =
typename LTS_TYPE::probabilistic_state_t::probability_t;
145 using probability_fraction_type =
typename LTS_TYPE::probabilistic_state_t::probability_t;
262 assert(t.label<m_transitions_per_label.size());
263 if (m_transitions_per_label[t.label].size()==0)
265 m_occupancy_indicator.push(t.label);
267 m_transitions_per_label[t.label].push_back(t);
274 m_transitions_per_label=std::vector< embedded_list<action_transition_type> >(number_of_labels);
279 return m_transitions_per_label;
283
286 while (!m_occupancy_indicator.empty())
288 const label_type action=m_occupancy_indicator.top();
289 m_occupancy_indicator.pop();
292 assert(action<m_transitions_per_label.size());
293 block.incoming_action_transitions.append(m_transitions_per_label[action]);
301 transition_list_with_t.erase(*t_ptr);
308 for(action_transition_type& t: transitions)
310 add_single_transition(t);
349 for(
const action_transition_type& t: action_transitions)
351 std::size_t constellation=probabilistic_blocks[probabilistic_states[t.to].parent_block].parent_constellation;
352 std::size_t count_state_to_constellation=0;
354 for(
const action_transition_type& t1: action_transitions)
356 if (t.from==t1.from &&
358 constellation==probabilistic_blocks[probabilistic_states[t1.to].parent_block].parent_constellation)
360 count_state_to_constellation++;
363 if (count_state_to_constellation!=*t.state_to_constellation_count_ptr)
365 mCRL2log(log::error) <<
"Transition " << t.from <<
"--" << t.label <<
"->" << t.to <<
" has inconsistent constellation_count: " <<
366 *t.state_to_constellation_count_ptr <<
". Should be " << count_state_to_constellation <<
".\n";
373 for(
const action_constellation_type& c: action_constellations)
375 std::size_t counted_states=0;
376 for(
const action_block_type& b: c.blocks)
378 counted_states=counted_states+b.states.size();
380 assert(counted_states==c.number_of_states);
384 for(
const probabilistic_constellation_type& c: probabilistic_constellations)
386 std::size_t counted_states=0;
387 for(
const probabilistic_block_type& b: c.blocks)
389 counted_states=counted_states+b.states.size();
391 assert(counted_states==c.number_of_states);
394 for(
const action_block_type& b: action_blocks)
396 assert(b.states.size()>0);
398 assert(b.marking==
nullptr);
401 for(
const probabilistic_block_type& b: probabilistic_blocks)
403 assert(b.marking==
nullptr);
411 std::cerr << info <<
" ---------------------------------------------------------------------- \n";
412 std::cerr <<
"Number of action blocks " << action_blocks.size() <<
"\n";
413 std::cerr <<
"Number of probabilistic blocks " << probabilistic_blocks.size() <<
"\n";
414 std::cerr <<
"Number of action constellations " << action_constellations.size() <<
"\n";
415 std::cerr <<
"Number of probabilistic constellations " << probabilistic_constellations.size() <<
"\n";
416 for(
const action_block_type b: action_blocks)
418 std::cerr <<
"ACTION BLOCK INFO ------------------------\n";
419 std::cerr <<
"PARENT CONSTELLATION " << b.parent_constellation <<
"\n";
420 std::cerr <<
"NR STATES " << b.states.size() <<
"\n";
421 for(
const probabilistic_transition_type t: b.incoming_probabilistic_transitions)
423 std::cerr <<
"INCOMING TRANS " << t.from <<
" --" << t.label <<
"-> " << t.to <<
"\n";
427 for(
const probabilistic_block_type b: probabilistic_blocks)
429 std::cerr <<
"probabilistic BLOCK INFO ------------------------\n";
430 std::cerr <<
"PARENT CONSTELLATION " << b.parent_constellation <<
"\n";
431 std::cerr <<
"NR STATES " << b.states.size() <<
"\n";
432 for(
const action_transition_type t: b.incoming_action_transitions)
434 std::cerr <<
"INCOMING TRANS " << t.from <<
" --" << t.label <<
"-> " << t.to <<
"\n";
441
442
452 transitions_per_label.add_transitions(action_transitions);
459 for (action_state_type& s: action_states)
462 initial_action_block.states.push_back(s);
464 assert(
aut.num_states()==initial_action_block.states.size());
467 action_blocks.push_back(initial_action_block);
471 refine_initial_action_block(transitions_per_label.transitions());
474 probabilistic_blocks.emplace_back();
477 initial_probabilistic_block.parent_constellation = 0;
480 for (probabilistic_state_type& s : probabilistic_states)
483 initial_probabilistic_block.states.push_back(s);
485 assert(
aut.num_probabilistic_states()==initial_probabilistic_block.states.size());
490 initial_probabilistic_const.number_of_states =
aut.num_probabilistic_states();
494 initial_probabilistic_const.blocks.push_back(probabilistic_blocks.front());
495 probabilistic_constellations.push_back(initial_probabilistic_const);
498 action_constellations.emplace_back();
501 initial_action_const.number_of_states =
aut.num_states();
504 for(action_block_type& b : action_blocks)
506 b.parent_constellation = 0;
507 initial_action_const.blocks.push_back(b);
512 std::vector<std::size_t*> new_count_ptr(aut.num_states(),
nullptr);
520 assert(t.from<new_count_ptr.size());
521 if (new_count_ptr[t.from]==
nullptr)
523 state_to_constellation_count.push_back(0);
524 new_count_ptr[t.from] = &state_to_constellation_count.back();
526 t.state_to_constellation_count_ptr = new_count_ptr[t.from];
527 (*new_count_ptr[t.from])++;
533 new_count_ptr[t.from] =
nullptr;
545 for(probabilistic_transition_type& t : probabilistic_transitions)
547 action_state_type& s = action_states[t.to];
548 action_block_type& block = action_blocks[s.parent_block];
549 block.incoming_probabilistic_transitions.push_back(t);
552 if (initial_action_const.blocks.size()>1)
554 non_trivial_action_constellations.push(&initial_action_const);
561
566 action_states.resize(aut.num_states());
567 probabilistic_states.resize(aut.num_probabilistic_states());
568 action_transitions.resize(aut.num_transitions());
571 transition_key_type t_key = 0;
572 for (
const transition& t :
aut.get_transitions())
576 at.label = t.label();
578 at.state_to_constellation_count_ptr =
nullptr;
581 probabilistic_states[at.to].incoming_transitions.push_back(&at);
588 for (std::size_t i = 0; i < aut.num_probabilistic_states(); i++)
590 const typename LTS_TYPE::probabilistic_state_t& ps = aut.probabilistic_state(i);
591 probabilistic_transition_type pt;
594 for (
const typename LTS_TYPE::probabilistic_state_t::state_probability_pair& sp_pair : ps)
597 pt.label = sp_pair.probability();
598 pt.to = sp_pair.state();
599 probabilistic_transitions.push_back(pt);
602 action_states[pt.to].incoming_transitions.push_back(&probabilistic_transitions.back());
608 pt.label = LTS_TYPE::probabilistic_state_t::probability_t::one();
610 probabilistic_transitions.push_back(pt);
612 action_states[pt.to].incoming_transitions.push_back(&probabilistic_transitions.back());
620
624 for (
const embedded_list<action_transition_type>& t_list : transitions_per_label)
626 marked_action_blocks.clear();
628 static std::size_t count=0;
if (count++ == 1000) { marked_action_blocks.shrink_to_fit(); count=0; }
630 for(
const action_transition_type& t: t_list)
632 action_state_type& s = action_states[t.from];
633 assert(s.parent_block<action_blocks.size());
634 action_block_type& parent_block = action_blocks[s.parent_block];
637 if (
false == s.mark_state)
640 if (parent_block.marking==
nullptr)
642 marked_action_blocks.emplace_back(parent_block);
643 parent_block.marking=&marked_action_blocks.back();
646 move_list_element_back<action_state_type>(s, parent_block.states, parent_block.marking->left);
652 for (action_mark_type& block_marking: marked_action_blocks)
654 if (0 == block_marking.action_block->states.size())
657 block_marking.action_block->states = block_marking.left;
662 action_blocks.emplace_back();
663 action_block_type& new_block=action_blocks.back();
664 new_block.states = block_marking.left;
667 for(action_state_type& s: new_block.states)
669 s.parent_block = action_blocks.size()-1;
675 block_marking.left.clear();
676 block_marking.action_block->marking=
nullptr;
681 for(
const action_transition_type& t: t_list)
683 action_states[t.from].mark_state =
false;
690
691 template <
typename LIST_ELEMENT>
692 void move_list_element_back(LIST_ELEMENT& s, embedded_list<LIST_ELEMENT>& source_list, embedded_list<LIST_ELEMENT>& dest_list)
694 source_list.erase(s);
695 dest_list.push_back(s);
699
700
701 template<
typename LIST_ELEMENT>
702 void move_list_element_front(LIST_ELEMENT& s, embedded_list<LIST_ELEMENT>& source_list, embedded_list<LIST_ELEMENT>& dest_list)
704 source_list.erase(s);
705 dest_list.push_front(s);
709
710
715 while (!non_trivial_probabilistic_constellations.empty() || !non_trivial_action_constellations.empty())
717 assert(check_data_structure());
720 if (!non_trivial_action_constellations.empty())
722 action_constellation_type* non_trivial_action_const = non_trivial_action_constellations.top();
723 non_trivial_action_constellations.pop();
724 assert(non_trivial_action_const->blocks.size()>=2);
729 action_block_type* Bc_ptr = choose_action_splitter(non_trivial_action_const);
732 marked_probabilistic_blocks.clear();
734 static std::size_t count=0;
if (count++ == 1000) { marked_probabilistic_blocks.shrink_to_fit(); count=0; }
736 mark_probabilistic(*Bc_ptr, marked_probabilistic_blocks);
739 for (probabilistic_mark_type& B : marked_probabilistic_blocks)
742 bool already_on_non_trivial_constellations_stack = probabilistic_constellations[B.probabilistic_block->parent_constellation].blocks.size()>1;
745 B.probabilistic_block->states = *B.large_block_ptr;
746 B.large_block_ptr->clear();
750 if (B.left.size() > 0)
752 split_probabilistic_block(*B.probabilistic_block, B.left);
757 if (B.right.size() > 0)
759 split_probabilistic_block(*B.probabilistic_block, B.right);
764 for (embedded_list<probabilistic_state_type>& middle : B.middle)
766 if (middle.size() > 0)
768 split_probabilistic_block(*B.probabilistic_block, middle);
774 if (!already_on_non_trivial_constellations_stack && probabilistic_constellations[B.probabilistic_block->parent_constellation].blocks.size()>1)
776 probabilistic_constellation_type& parent_const = probabilistic_constellations[B.probabilistic_block->parent_constellation];
777 assert(parent_const.blocks.size()>1);
778 non_trivial_probabilistic_constellations.push(&parent_const);
787 if (!non_trivial_probabilistic_constellations.empty())
790 probabilistic_constellation_type* non_trivial_probabilistic_const = non_trivial_probabilistic_constellations.top();
791 non_trivial_probabilistic_constellations.pop();
792 assert(non_trivial_probabilistic_const->blocks.size()>=2);
795 probabilistic_block_type* Bc_ptr = choose_probabilistic_splitter(non_trivial_probabilistic_const);
798 for (
typename embedded_list<action_transition_type>::iterator i=Bc_ptr->incoming_action_transitions.begin();
799 i!=Bc_ptr->incoming_action_transitions.end() ; )
802 const label_type a = i->label;
803 marked_action_blocks.clear();
804 mark_action(marked_action_blocks, a, i, Bc_ptr->incoming_action_transitions.end());
808 for (action_mark_type& B : marked_action_blocks)
811 bool already_on_non_trivial_constellations_stack = action_constellations[B.action_block->parent_constellation].blocks.size()>1;
814 B.action_block->states = *B.large_block_ptr;
815 B.large_block_ptr->clear();
818 if (B.left.size() > 0)
820 split_action_block(*B.action_block, B.left);
824 if (B.right.size() > 0)
826 split_action_block(*B.action_block, B.right);
831 if (B.middle.size() > 0)
833 split_action_block(*B.action_block, B.middle);
838 if (!already_on_non_trivial_constellations_stack && action_constellations[B.action_block->parent_constellation].blocks.size()>1)
840 action_constellation_type& parent_const = action_constellations[B.action_block->parent_constellation];
841 assert(parent_const.blocks.size()>1);
842 non_trivial_action_constellations.push(&parent_const);
853
854
855
859 probabilistic_blocks.emplace_back();
862 new_block.parent_constellation = block_to_split.parent_constellation;
863 new_block.states = states_of_new_block;
864 states_of_new_block.clear();
873 s.parent_block = probabilistic_blocks.size()-1;
884 parent_const.blocks.push_back(probabilistic_blocks.back());
888
889
890
894 action_blocks.emplace_back();
897 new_block.parent_constellation = block_to_split.parent_constellation;
898 new_block.states = states_of_new_block;
899 states_of_new_block.clear();
907 s.parent_block = action_blocks.size()-1;
913 move_list_element_back((*t), block_to_split.incoming_probabilistic_transitions,
914 new_block.incoming_probabilistic_transitions);
921 parent_const.blocks.push_back(action_blocks.back());
925
926
927
936 const probability_label_type& p = pt.label;
940 if (
nullptr == B.marking)
942 marked_probabilistic_blocks.emplace_back(B);
943 B.marking = &marked_probabilistic_blocks.back();
944 B.marking->right = B.states;
949 B.marking->large_block_ptr = &B.marking->right;
953 if (
false == s.mark_state)
958 s.cumulative_probability = p;
964 s.cumulative_probability = s.cumulative_probability + p;
971 for (probabilistic_mark_type& B : marked_probabilistic_blocks)
975 grouped_states_per_probability_in_block.clear();
976 static std::size_t count=0;
if (count++ == 1000) { marked_action_blocks.shrink_to_fit(); count=0; }
978 embedded_list<probabilistic_state_type> middle_temp=B.left;
982 for(
typename embedded_list<probabilistic_state_type>::iterator i=middle_temp.begin(); i!=middle_temp.end(); )
984 probabilistic_state_type& s= *i;
987 if (s.cumulative_probability == probability_label_type().one())
990 move_list_element_back<probabilistic_state_type>((s), middle_temp, B.left);
995 s.mark_state =
false;
1000 for(probabilistic_state_type& s: middle_temp)
1002 grouped_states_per_probability_in_block.emplace_back(s.cumulative_probability, &s);
1006 std::sort(grouped_states_per_probability_in_block.begin(), grouped_states_per_probability_in_block.end());
1012 probability_label_type current_probability = probability_label_type().zero();
1014 if (grouped_states_per_probability_in_block.size()>0)
1016 B.middle.emplace_back();
1017 for (
const std::pair<probability_label_type, probabilistic_state_type*>& cumulative_prob_state_pair : grouped_states_per_probability_in_block)
1019 probabilistic_state_type* s = cumulative_prob_state_pair.second;
1020 if (current_probability != cumulative_prob_state_pair.first)
1024 current_probability = cumulative_prob_state_pair.first;
1025 B.middle.emplace_back();
1028 move_list_element_back<probabilistic_state_type>((*s), middle_temp, B.middle.back());
1035 if (B.left.size() > B.large_block_ptr->size())
1037 B.large_block_ptr = &B.left;
1041 for (embedded_list<probabilistic_state_type>& middle_set : B.middle)
1043 if (middle_set.size() > B.large_block_ptr->size())
1045 B.large_block_ptr = &middle_set;
1050 B.probabilistic_block->marking =
nullptr;
1055
1056
1057
1059 const label_type& a,
1063 assert(action_walker_begin!=action_walker_end && action_walker_begin->label==a);
1069 for(
typename embedded_list<action_transition_type>::iterator action_walker=action_walker_begin;
1070 action_walker!=action_walker_end && action_walker->label==a;
1073 action_transition_type& t= *action_walker;
1074 action_state_type& s = action_states[t.from];
1075 action_block_type& B = action_blocks[s.parent_block];
1078 if (
nullptr == B.marking)
1080 marked_action_blocks.emplace_back(B);
1081 B.marking = &marked_action_blocks.back();
1082 B.marking->right=B.states;
1085 B.marking->large_block_ptr = &B.marking->right;
1089 if (
false == s.mark_state)
1093 s.mark_state =
true;
1094 s.residual_transition_cnt = *t.state_to_constellation_count_ptr;
1095 move_list_element_back<action_state_type>(s, B.marking->right, B.marking->left);
1098 s.residual_transition_cnt--;
1105 for (action_mark_type& B : marked_action_blocks)
1108 for(
typename embedded_list<action_state_type>::iterator i=B.left.begin(); i!=B.left.end(); )
1110 action_state_type& s= *i;
1112 if (s.residual_transition_cnt > 0)
1115 move_list_element_back<action_state_type>(s, B.left, B.middle);
1120 s.mark_state =
false;
1124 if (B.left.size() > B.large_block_ptr->size())
1126 B.large_block_ptr = &B.left;
1128 if (B.middle.size() > B.large_block_ptr->size())
1130 B.large_block_ptr = &B.middle;
1134 B.action_block->marking =
nullptr;
1140 action_walker_begin!=action_walker_end && action_walker_begin->label==a;
1141 action_walker_begin++)
1143 action_transition_type& t= *action_walker_begin;
1144 action_state_type& s = action_states[t.from];
1148 if (s.residual_transition_cnt > 0)
1150 std::size_t state_to_constellation_count_old = *t.state_to_constellation_count_ptr;
1152 if (state_to_constellation_count_old != s.residual_transition_cnt)
1158 *t.state_to_constellation_count_ptr = s.residual_transition_cnt;
1161 state_to_constellation_count.emplace_back(state_to_constellation_count_old - s.residual_transition_cnt);
1162 s.transition_count_ptr = &state_to_constellation_count.back();
1164 t.state_to_constellation_count_ptr = s.transition_count_ptr;
1170
1171
1172
1175 assert(non_trivial_action_const->blocks.size()>=2);
1181 if (Bc->states.size() > (non_trivial_action_const->number_of_states / 2))
1184 Bc = &non_trivial_action_const->blocks.back();
1189 non_trivial_action_const->blocks.erase(*Bc);
1192 non_trivial_action_const->number_of_states -= Bc->states.size();
1195 if (non_trivial_action_const->blocks.size() > 1)
1198 non_trivial_action_constellations.push(non_trivial_action_const);
1202 action_constellations.emplace_back();
1205 Bc->parent_constellation = action_constellations.size()-1;
1206 new_action_const.blocks.push_back(*Bc);
1207 new_action_const.number_of_states = Bc->states.size();
1213
1214
1215
1221 if (Bc->states.size() > (non_trivial_probabilistic_const->number_of_states / 2))
1224 Bc = &non_trivial_probabilistic_const->blocks.back();
1229 non_trivial_probabilistic_const->blocks.erase(*Bc);
1232 non_trivial_probabilistic_const->number_of_states -= Bc->states.size();
1235 if (non_trivial_probabilistic_const->blocks.size() > 1)
1238 non_trivial_probabilistic_constellations.push(non_trivial_probabilistic_const);
1242 probabilistic_constellations.emplace_back();
1244 Bc->parent_constellation = probabilistic_constellations.size()-1;
1245 new_probabilistic_const.blocks.push_back(*Bc);
1246 new_probabilistic_const.number_of_states = Bc->states.size();
1253 typename LTS_TYPE::probabilistic_state_t new_prob_state;
1258 std::map <state_key_type, probability_fraction_type> prob_state_map;
1259 for (
const typename LTS_TYPE::probabilistic_state_t::state_probability_pair& sp_pair : ps)
1262 state_key_type new_state = get_eq_class(sp_pair.state());
1264 if (prob_state_map.count(new_state) == 0)
1267 prob_state_map[new_state] = sp_pair.probability();
1272 prob_state_map[new_state] = prob_state_map[new_state] + sp_pair.probability();
1276 typename std::map<state_key_type, probability_fraction_type>::iterator i = prob_state_map.begin();
1277 if (++i==prob_state_map.end())
1279 new_prob_state.set(prob_state_map.begin()->first);
1284 for (
const auto& i: prob_state_map)
1286 new_prob_state.add(i.first, i.second);
1293 new_prob_state.set(get_eq_class(ps.get()));
1295 return new_prob_state;
1301 assert(pb.states.size()>0);
1304 if (s.incoming_transitions.size()>0)
1307 state_key_type s_key = s.incoming_transitions.back()->to;
1309 const typename LTS_TYPE::probabilistic_state_t& old_prob_state = aut.probabilistic_state(s_key);
1321
1322
1323template <
class LTS_TYPE>
1327
1328
1329
1330
1331template <
class LTS_TYPE>
1335
1336
1337
1338
1339
1340
1341template <
class LTS_TYPE>
1344template <
class LTS_TYPE>
1351 l.clear_state_labels();
1354 l.set_num_states(prob_bisim_part.num_eq_classes());
1355 prob_bisim_part.replace_transitions();
1356 prob_bisim_part.replace_probabilistic_states();
1359template <
class LTS_TYPE>
1365 LTS_TYPE l1_copy(l1);
1366 LTS_TYPE l2_copy(l2);
1367 return destructive_probabilistic_bisimulation_compare_grv(l1_copy, l2_copy, timer);
1370template <
class LTS_TYPE>
1376 std::size_t initial_probabilistic_state_key_l1;
1377 std::size_t initial_probabilistic_state_key_l2;
1385 initial_probabilistic_state_key_l2 = l1.num_probabilistic_states() - 1;
1386 initial_probabilistic_state_key_l1 = l1.num_probabilistic_states() - 2;
1390 return prob_bisim_part.in_same_probabilistic_class_grv(initial_probabilistic_state_key_l2,
1391 initial_probabilistic_state_key_l1);
function object to compare two constln_t pointers based on their contents
void add_grouped_transitions_to_block(probabilistic_block_type &block)
void add_single_transition(action_transition_type &t)
std::stack< label_type > m_occupancy_indicator
std::vector< embedded_list< action_transition_type > > m_transitions_per_label
void add_transitions(std::vector< action_transition_type > &transitions)
void initialize(const std::size_t number_of_labels)
void move_incoming_transitions(probabilistic_state_type s, embedded_list< action_transition_type > &transition_list_with_t)
const std::vector< embedded_list< action_transition_type > > & transitions() const
std::deque< action_mark_type > marked_action_blocks
transitions_per_label_t transitions_per_label
std::deque< probabilistic_block_type > probabilistic_blocks
void split_action_block(action_block_type &block_to_split, embedded_list< action_state_type > &states_of_new_block)
Split an action block.
std::stack< action_constellation_type * > non_trivial_action_constellations
LTS_TYPE::probabilistic_state_t calculate_new_probabilistic_state(typename LTS_TYPE::probabilistic_state_t ps)
LTS_TYPE::probabilistic_state_t calculate_equivalent_probabilistic_state(probabilistic_block_type &pb)
std::size_t get_eq_probabilistic_class(const std::size_t s)
Gives the bisimulation equivalence probabilistic class number of a probabilistic state.
void move_list_element_back(LIST_ELEMENT &s, embedded_list< LIST_ELEMENT > &source_list, embedded_list< LIST_ELEMENT > &dest_list)
void create_initial_partition()
std::vector< probabilistic_state_type > probabilistic_states
bool in_same_probabilistic_class_grv(const std::size_t s, const std::size_t t)
Returns whether two states are in the same probabilistic bisimulation equivalence class.
std::stack< probabilistic_constellation_type * > non_trivial_probabilistic_constellations
void print_structure(const std::string &info)
std::vector< action_transition_type > action_transitions
bool check_data_structure()
void mark_probabilistic(const action_block_type &Bc, std::deque< probabilistic_mark_type > &marked_probabilistic_blocks)
Gives the probabilistic blocks that are marked by block Bc.
probabilistic_block_type * choose_probabilistic_splitter(probabilistic_constellation_type *non_trivial_probabilistic_const)
Choose an splitter block from a non trivial constellation.
void refine_partition_until_it_becomes_stable()
Refine partition until it becomes stable.
action_block_type * choose_action_splitter(action_constellation_type *non_trivial_action_const)
Choose an splitter block from a non trivial constellation.
prob_bisim_partitioner_grv(LTS_TYPE &l, utilities::execution_timer &timer)
Creates a probabilistic bisimulation partitioner for an PLTS.
std::size_t get_eq_class(const std::size_t s)
Gives the bisimulation equivalence class number of a state.
void mark_action(std::deque< action_mark_type > &marked_action_blocks, const label_type &a, typename embedded_list< action_transition_type >::iterator &action_walker_begin, const typename embedded_list< action_transition_type >::iterator action_walker_end)
Gives the action blocks that are marked by probabilistic block Bc.
std::deque< probabilistic_transition_type > probabilistic_transitions
std::deque< action_constellation_type > action_constellations
std::vector< action_state_type > action_states
void preprocessing_stage()
void replace_transitions()
Replaces the transition relation of the current lts by the transitions of the bisimulation reduced tr...
std::deque< action_block_type > action_blocks
void refine_initial_action_block(const std::vector< embedded_list< action_transition_type > > &transitions_per_label)
void replace_probabilistic_states()
Replaces the probabilistic states of the current lts by the probabilistic states of the bisimulation ...
std::deque< probabilistic_constellation_type > probabilistic_constellations
void split_probabilistic_block(probabilistic_block_type &block_to_split, embedded_list< probabilistic_state_type > &states_of_new_block)
Split a probabilistic block.
std::size_t num_eq_classes() const
Gives the number of bisimulation equivalence classes of the LTS.
std::deque< std::size_t > state_to_constellation_count
std::deque< probabilistic_mark_type > marked_probabilistic_blocks
void move_list_element_front(LIST_ELEMENT &s, embedded_list< LIST_ELEMENT > &source_list, embedded_list< LIST_ELEMENT > &dest_list)
Move an element of a list to the front of another the list.
Simple timer to time the CPU time used by a piece of code.
#define mCRL2log(LEVEL)
mCRL2log(LEVEL) provides the stream used to log.
void probabilistic_bisimulation_reduce_grv(LTS_TYPE &l, utilities::execution_timer &timer)
Reduce transition system l with respect to probabilistic bisimulation.
bool probabilistic_bisimulation_compare_grv(const LTS_TYPE &l1, const LTS_TYPE &l2, utilities::execution_timer &timer)
Checks whether the two initial states of two plts's are probabilistic bisimilar.
bool destructive_probabilistic_bisimulation_compare_grv(LTS_TYPE &l1, LTS_TYPE &l2, utilities::execution_timer &timer)
Checks whether the two initial states of two plts's are probabilistic bisimilar.
embedded_list< probabilistic_transition_type > incoming_probabilistic_transitions
embedded_list< action_state_type > states
action_mark_type * marking
constellation_key_type parent_constellation
embedded_list< action_block_type > blocks
std::size_t number_of_states
embedded_list< action_state_type > * large_block_ptr
embedded_list< action_state_type > right
embedded_list< action_state_type > left
action_mark_type(action_block_type &B)
embedded_list< action_state_type > middle
action_block_type * action_block
std::vector< probabilistic_transition_type * > incoming_transitions
std::size_t * transition_count_ptr
std::size_t residual_transition_cnt
block_key_type parent_block
std::size_t * state_to_constellation_count_ptr
embedded_list< action_transition_type > incoming_action_transitions
probabilistic_block_type()
constellation_key_type parent_constellation
embedded_list< probabilistic_state_type > states
probabilistic_mark_type * marking
embedded_list< probabilistic_block_type > blocks
std::size_t number_of_states
probabilistic_mark_type(probabilistic_block_type &B)
embedded_list< probabilistic_state_type > left
probabilistic_block_type * probabilistic_block
std::vector< embedded_list< probabilistic_state_type > > middle
embedded_list< probabilistic_state_type > right
embedded_list< probabilistic_state_type > * large_block_ptr
block_key_type parent_block
std::vector< action_transition_type * > incoming_transitions
probability_label_type cumulative_probability
probability_label_type label