28#ifndef MCRL2_LTS_LIBLTS_PLTS_MERGE_H
29#define MCRL2_LTS_LIBLTS_PLTS_MERGE_H
31#include "mcrl2/lts/lts_aut.h"
32#include "mcrl2/lts/lts_fsm.h"
33#include "mcrl2/lts/lts_lts.h"
38template <
class LTS_TYPE>
41 const std::size_t old_nstates=l1.num_states();
42 const std::size_t old_n_prob_states = l1.num_probabilistic_states();
43 l1.set_num_states(l1.num_states() + l2.num_states());
47 if (l1.has_state_info() && l2.has_state_info())
49 for (std::size_t i=0; i<l2.num_states(); ++i)
51 l1.add_state(l2.state_label(i));
57 l1.clear_state_labels();
64 using type1 =
typename LTS_TYPE::action_label_t;
65 using type2 =
typename LTS_TYPE::labels_size_type;
66 using insert_type =
typename std::pair<
typename std::map<type1, type2>::const_iterator,
bool>;
67 std::map < type1,type2 > labs;
70 for (std::size_t i = 0; i < l1.num_action_labels(); ++i)
72 labs.insert(std::pair <
typename LTS_TYPE::action_label_t,
typename LTS_TYPE::labels_size_type>
73 (l1.action_label(i),i));
83 for (std::size_t i=0; i<l2.num_action_labels(); ++i)
85 typename LTS_TYPE::labels_size_type new_index;
86 const insert_type it= labs.insert(std::pair < type1,type2 >
87 (l2.action_label(i),l1.num_action_labels()));
91 new_index=l1.add_action(l2.action_label(i));
92 if (l2.is_tau(l2.apply_hidden_label_map(i)))
94 l1.hidden_label_set().insert(new_index);
99 new_index=it.first->second;
101 if (l1.is_tau(l1.apply_hidden_label_map(new_index)) != l2.is_tau(l2.apply_hidden_label_map(i)))
103 throw mcrl2::runtime_error(
"The action " + pp(l2.action_label(i)) +
" has incompatible hidden actions " +
104 pp(l1.action_label(l1.apply_hidden_label_map(new_index))) +
" and " +
105 pp(l2.action_label(l2.apply_hidden_label_map(i))) +
".");
109 assert(new_index==it.first->second);
114 std::vector<transition> &trans1=l1.get_transitions();
115 for (transition& t : trans1)
117 t.set_label(labs[l1.action_label(t.label())]);
124 const std::vector<transition> &trans2=l2.get_transitions();
125 for (
const transition transition_to_add : trans2)
127 l1.add_transition(transition(transition_to_add.from()+old_nstates,
128 labs[l2.action_label(transition_to_add.label())],
129 transition_to_add.to()+old_n_prob_states));
134 const std::size_t n_prob_states_l2 = l2.num_probabilistic_states();
135 for (std::size_t i = 0; i < n_prob_states_l2; ++i)
137 typename LTS_TYPE::probabilistic_state_t new_prob_state;
138 const typename LTS_TYPE::probabilistic_state_t& old_prob_state = l2.probabilistic_state(i);
140 if (old_prob_state.size()>1)
142 for (
const typename LTS_TYPE::probabilistic_state_t::state_probability_pair& sp_pair : old_prob_state)
144 new_prob_state.add(sp_pair.state()+ old_nstates, sp_pair.probability());
150 new_prob_state.set(old_prob_state.get()+old_nstates);
152 l1.add_probabilistic_state(new_prob_state);
157 l1.add_probabilistic_state(l1.initial_probabilistic_state());
160 typename LTS_TYPE::probabilistic_state_t new_initial_prob_state_l2;
161 if (l2.initial_probabilistic_state().size()<=1)
163 new_initial_prob_state_l2.set(l2.initial_probabilistic_state().get() + old_nstates);
167 for (
const typename LTS_TYPE::probabilistic_state_t::state_probability_pair& sp_pair : l2.initial_probabilistic_state())
169 new_initial_prob_state_l2.add(sp_pair.state() + old_nstates, sp_pair.probability());
172 l1.add_probabilistic_state(new_initial_prob_state_l2);
function object to compare two constln_t pointers based on their contents
void plts_merge(LTS_TYPE &l1, const LTS_TYPE &l2)