10#ifndef MCRL_LPS_LPS_SUMMAND_GROUP_H
11#define MCRL_LPS_LPS_SUMMAND_GROUP_H
13#ifdef MCRL2_ENABLE_SYLVAN
29inline std::vector<boost::dynamic_bitset<>> compute_read_write_patterns(
const lps::specification& lpsspec);
31struct lps_summand_group:
public symbolic::summand_group
34 const lps::specification& lpsspec,
35 const data::variable_list& process_parameters,
36 const std::set<std::size_t>& group_indices,
37 const boost::dynamic_bitset<>& group_pattern,
38 const std::vector<boost::dynamic_bitset<>>& read_write_patterns,
39 const std::vector<std::size_t> variable_order
41 : summand_group(process_parameters, group_pattern, true)
43 using symbolic::project;
44 using utilities::detail::as_vector;
45 using utilities::detail::as_set;
46 using utilities::detail::set_union;
48 std::set<std::size_t> used;
49 for (std::size_t j: read)
53 for (std::size_t j: write)
58 const auto& lps_summands = lpsspec.process().action_summands();
59 for (std::size_t i: group_indices)
61 std::vector<int> copy;
62 for (std::size_t j: used)
64 bool b = read_write_patterns[i][j];
65 copy.push_back(b ? 0 : 1);
69 const auto& smd = lps_summands[i];
70 actions.emplace_back(smd.multi_action());
71 summands.emplace_back(smd.condition(), smd.summation_variables(), project(
as_vector(symbolic::permute_copy(smd.next_state(lpsspec.process().process_parameters()), variable_order)), write), copy);
75 lps_summand_group(
const data::variable_list& process_parameters, std::vector<data::variable> _read_parameters, std::vector<data::variable> _write_parameters)
76 : summand_group(process_parameters, _read_parameters, _write_parameters, true)
79 std::vector<lps::multi_action> actions;
87std::pair<std::set<data::variable>, std::set<data::variable>> read_write_parameters(
const lps::action_summand& summand,
const std::set<data::variable>& process_parameters)
94 std::set<data::variable> write_parameters;
96 for (
const auto& assignment: summand.assignments())
98 if (assignment.lhs() != assignment.rhs())
100 write_parameters.insert(assignment.lhs());
110std::map<data::variable, std::size_t> process_parameter_index(
const lps::specification& lpsspec)
112 std::map<data::variable, std::size_t> result;
114 for (
const data::variable& v: lpsspec.process().process_parameters())
123std::vector<boost::dynamic_bitset<>> compute_read_write_patterns(
const lps::specification& lpsspec)
127 std::vector<boost::dynamic_bitset<>> result;
129 auto process_parameters =
as_set(lpsspec.process().process_parameters());
130 std::size_t n = process_parameters.size();
131 std::map<data::variable, std::size_t> index = process_parameter_index(lpsspec);
133 for (
const auto& summand: lpsspec.process().action_summands())
135 auto [read_parameters, write_parameters] = read_write_parameters(summand, process_parameters);
138 boost::dynamic_bitset<> rw(2*n);
139 for (std::size_t j: read)
143 for (std::size_t j: write)
147 result.push_back(rw);
add your file description here.
The class data_expression.
std::set< T > as_set(const atermpp::term_list< T > &x)
Converts the given term list to a set.
std::vector< T > as_vector(const atermpp::term_list< T > &x)
Converts the given term list to a vector.
variable_list set_intersection(const variable_list &x, const variable_list &y)
Returns the intersection of two unordered sets, that are stored in ATerm lists.
std::set< data::variable > find_free_variables(const data::data_expression &x)
The main namespace for the LPS library.
std::set< data::variable > find_free_variables(const lps::deadlock &x)
vertex_set set_union(const vertex_set &V, const vertex_set &W)
std::set< std::size_t > parameter_indices(const std::set< data::variable > ¶meters, const std::map< data::variable, std::size_t > &index)
std::set< T > set_union(const std::set< T > &x, const std::set< T > &y)
Returns the union of two sets.
std::set< T > as_set(const std::vector< T > &x)
std::set< T > set_intersection(const std::set< T > &x, const std::set< T > &y)
Returns the intersection of two sets.