10#ifndef MCRL_PBES_PBES_SUMMAND_GROUP_H
11#define MCRL_PBES_PBES_SUMMAND_GROUP_H
13#ifdef MCRL2_ENABLE_SYLVAN
15#include "mcrl2/data/data_expression.h"
16#include "mcrl2/data/variable.h"
17#include "mcrl2/pbes/srf_pbes.h"
18#include "mcrl2/symbolic/summand_group.h"
24namespace mcrl2::pbes_system
29std::pair<std::set<data::variable>, std::set<data::variable>> read_write_parameters(
30 const pbes_system::srf_equation& equation,
31 const pbes_system::srf_summand& summand,
32 const data::variable_list& process_parameters)
34 using utilities::detail::set_union;
35 using utilities::detail::set_intersection;
36 using utilities::detail::as_set;
38 std::set<data::variable> read_parameters = data::find_free_variables(summand.condition());
39 std::set<data::variable> write_parameters;
42 read_parameters.insert(process_parameters.front());
43 if (equation.variable().name() != summand.variable().name())
45 write_parameters.insert(process_parameters.front());
48 const data::data_expression_list& expressions = summand.variable().parameters();
49 auto pi = ++process_parameters.begin();
50 auto ei = expressions.begin();
51 for (; ei != expressions.end(); ++pi, ++ei)
55 write_parameters.insert(*pi);
56 data::find_free_variables(*ei, std::inserter(read_parameters, read_parameters.end()));
60 auto process_parameter_set = as_set(process_parameters);
61 return { set_intersection(read_parameters, process_parameter_set), set_intersection(write_parameters, process_parameter_set) };
66std::map<data::variable, std::size_t> process_parameter_index(
const data::variable_list& process_parameters)
68 std::map<data::variable, std::size_t> result;
70 for (
const data::variable& v: process_parameters)
80std::vector<boost::dynamic_bitset<>> compute_read_write_patterns(
const pbes_system::srf_pbes& pbesspec,
const data::variable_list& process_parameters)
82 std::vector<boost::dynamic_bitset<>> result;
84 std::size_t n = process_parameters.size();
85 std::map<data::variable, std::size_t> index = process_parameter_index(process_parameters);
87 for (
const detail::pre_srf_equation<
false>& equation: pbesspec.equations())
89 for (
const detail::pre_srf_summand<
false>& summand: equation.summands())
91 auto [read_parameters, write_parameters] = read_write_parameters(equation, summand, process_parameters);
92 auto read = symbolic::parameter_indices(read_parameters, index);
93 auto write = symbolic::parameter_indices(write_parameters, index);
94 boost::dynamic_bitset<> rw(2*n);
95 for (std::size_t j: read)
99 for (std::size_t j: write)
103 result.push_back(rw);
112data::data_expression_list make_state(
const pbes_system::propositional_variable_instantiation& x,
const std::unordered_map<core::identifier_string, data::data_expression>& propvar_map)
114 data::data_expression_list result = x.parameters();
115 result.push_front(propvar_map.at(x.name()));
120struct pbes_summand_group:
public symbolic::summand_group
123 const pbes_system::srf_pbes& pbesspec,
124 const data::variable_list& process_parameters,
125 const std::unordered_map<core::identifier_string, data::data_expression>& propvar_map,
126 const std::set<std::size_t>& summand_group_indices,
127 const boost::dynamic_bitset<>& read_write_pattern,
128 const std::vector<boost::dynamic_bitset<>>& read_write_patterns,
129 const std::vector<std::size_t> variable_order
131 : symbolic::summand_group(process_parameters, read_write_pattern,
false)
133 using symbolic::project;
134 using utilities::detail::as_vector;
135 using utilities::detail::as_set;
136 using utilities::detail::set_union;
137 using utilities::detail::contains;
139 std::set<std::size_t> used;
140 for (std::size_t j: read)
144 for (std::size_t j: write)
146 used.insert(2*j + 1);
149 const auto& equations = pbesspec.equations();
151 for (
const auto& equation : equations)
153 const core::identifier_string& X_i = equation.variable().name();
154 const auto& equation_summands = equation.summands();
155 for (std::size_t j = 0; j < equation_summands.size(); j++, k++)
157 if (contains(summand_group_indices, k))
159 std::vector<
int> copy;
160 for (std::size_t q: used)
162 bool b = read_write_patterns[k][q];
163 copy.push_back(b ? 0 : 1);
165 const pbes_system::srf_summand& smd = equation_summands[j];
166 auto next_state = make_state(smd.variable(), propvar_map);
167 next_state = symbolic::permute_copy(next_state, variable_order);
168 summands.emplace_back(data::and_(data::equal_to(process_parameters.front(), propvar_map.at(X_i)), smd.condition()), smd.parameters(), project(as_vector(next_state), write), copy);