mCRL2
Loading...
Searching...
No Matches
explorer_utilities.h
Go to the documentation of this file.
1// Author(s): Wieger Wesselink
2// Copyright: see the accompanying file COPYING or copy at
3// https://github.com/mCRL2org/mCRL2/blob/master/COPYING
4//
5// Distributed under the Boost Software License, Version 1.0.
6// (See accompanying file LICENSE_1_0.txt or copy at
7// http://www.boost.org/LICENSE_1_0.txt)
8//
9/// \file mcrl2/lps/explorer_utilities.h
10/// \brief Utility functions and data structures used by the state space explorer.
11
12#ifndef MCRL2_LPS_EXPLORER_UTILITIES_H
13#define MCRL2_LPS_EXPLORER_UTILITIES_H
14
15#include "mcrl2/atermpp/standard_containers/indexed_set.h"
16#include "mcrl2/atermpp/standard_containers/detail/unordered_map_implementation.h"
17#include "mcrl2/data/rewriter.h"
18#include "mcrl2/lps/detail/instantiate_global_variables.h"
19#include "mcrl2/atermpp/standard_containers/vector.h"
20#include "mcrl2/lps/explorer_projections.h"
21
22namespace mcrl2::lps
23{
24
25// Global helpers to construct a rewriter and add real operators for explorer
27{
31 return s;
32}
33
34template <typename Specification>
36{
38 {
39 return data::rewriter(lpsspec.data(),
42 }
43 else
44 {
46 }
47}
48
49enum class caching { none, local, global };
50
51inline
53{
54 switch(c)
55 {
56 case caching::none: os << "none"; break;
57 case caching::local: os << "local"; break;
58 case caching::global: os << "global"; break;
59 default: os.setstate(std::ios_base::failbit);
60 }
61 return os;
62}
63
64inline
66{
67 return std::vector<data::data_expression>(v.begin(), v.end());
68}
69
70template <typename Summand>
71inline const stochastic_distribution& summand_distribution(const Summand& /* summand */)
72{
73 static stochastic_distribution empty_distribution;
74 return empty_distribution;
75}
76
77template <>
79{
80 return summand.distribution();
81}
82
83inline
85{
86 static stochastic_distribution empty_distribution;
87 return empty_distribution;
88}
89
90inline
92{
93 return lpsspec.initial_process().distribution();
94}
95
96namespace detail
97{
98// The functions below are used to support the key type in caches.
99//
101{
104
105 cheap_cache_key(data::mutable_indexed_substitution<>& sigma, const std::vector<data::variable>& gamma)
106 : m_sigma(sigma),
108 {}
109
110};
111
113{
114 bool operator()(const atermpp::aterm& key1, const atermpp::aterm& key2) const
115 {
116 return key1==key2;
117 }
118
119 bool operator()(const atermpp::aterm& key1, const cheap_cache_key& key2) const
120 {
121 std::vector<data::variable>::const_iterator i=key2.m_gamma.begin();
122 for(const atermpp::aterm& d: key1)
123 {
124 if (d!=key2.m_sigma(*i))
125 {
126 return false;
127 }
128 ++i;
129 }
130 return true;
131 }
132};
133
135{
138 {
139 return operator()(pair.first);
140 }
141
142 std::size_t operator()(const atermpp::aterm& key) const
143 {
144 std::size_t hash=0;
145 for(const atermpp::aterm& d: key)
146 {
147 hash=atermpp::detail::combine(hash,d);
148 }
149 return hash;
150 }
151
153 {
154 std::size_t hash=0;
155 for(const data::variable& v: key.m_gamma)
156 {
157 hash=atermpp::detail::combine(hash,key.m_sigma(v));
158 }
159 return hash;
160 }
161};
162
163} // end namespace detail
164
170 true>;
171
177 true>;
178
180{
181 data::variable_list variables;
183 lps::multi_action multi_action;
187
188 // attributes for caching
193
194 // attributes for projections (these are not initialized during construction!)
195 std::vector<std::size_t> I_r; // indices of read parameters
196 std::vector<std::size_t> I_w; // indices of write parameters
198
199 void set_projection_attributes(const std::vector<std::size_t>& Ir, const std::vector<std::size_t>& Iw)
200 {
201 mCRL2log(log::log_level_t::verbose) << "Setting projection attributes I_r = " << core::detail::print_list(Ir) << " I_w = " << core::detail::print_list(Iw) << std::endl;
202 if (!Ir.empty())
203 {
204 I_r = Ir;
205 I_w = Iw;
206 }
207 }
208
209 template <typename ActionSummand>
210 explorer_summand(const ActionSummand& summand, std::size_t summand_index, const data::variable_list& process_parameters, caching cache_strategy_)
212 condition(summand.condition()),
213 multi_action(summand.multi_action()),
214 distribution(summand_distribution(summand)),
218 {
219 gamma = free_variables(summand.condition(), process_parameters);
220 if (cache_strategy_ == caching::global)
221 {
222 gamma.insert(gamma.begin(), data::variable());
223 }
224 f_gamma = atermpp::function_symbol("@gamma", gamma.size());
225 }
226
227 template <typename T>
229 {
230 using utilities::detail::contains;
231 std::set<data::variable> FV = data::find_free_variables(x);
232 std::vector<data::variable> result;
233 for (const data::variable& vi: v)
234 {
235 if (contains(FV, vi))
236 {
237 result.push_back(vi);
238 }
239 }
240 return result;
241 }
242
244 data::mutable_indexed_substitution<>& sigma) const
245 {
246 if (cache_strategy == caching::global)
247 {
248 bool is_first_element = true;
249 atermpp::make_term_appl(key, f_gamma, gamma.begin(), gamma.end(),
250 [&](data::data_expression& result, const data::variable& x)
251 {
252 if (is_first_element)
253 {
254 is_first_element = false;
255 result=condition;
256 return;
257 }
258 sigma.apply(x, result);
259 return;
260 }
261 );
262 }
263 else
264 {
265 atermpp::make_term_appl(key, f_gamma, gamma.begin(), gamma.end(),
266 [&](data::data_expression& result, const data::variable& x)
267 {
268 sigma.apply(x, result);
269 }
270 );
271 }
272 }
273};
274
275inline
277{
278 return out << lps::stochastic_action_summand(
279 summand.variables,
280 summand.condition,
281 summand.multi_action,
282 data::make_assignment_list(summand.variables, summand.next_state),
283 summand.distribution
284 );
285}
286
288{
289 virtual ~abortable() = default;
290 virtual void abort() = 0;
291};
292
293} // namespace mcrl2::lps
294
295#endif // MCRL2_LPS_EXPLORER_UTILITIES_H
A list of aterm objects.
Definition aterm_list.h:26
A unordered_map class in which aterms can be stored.
const variable_list & variables() const
Definition abstraction.h:60
data_expression & operator=(data_expression &&) noexcept=default
existential quantification.
Definition exists.h:23
universal quantification.
Definition forall.h:25
Rewriter that operates on data expressions.
Definition rewriter.h:84
data_expression operator()(const data_expression &d) const
Rewrites a data expression.
Definition rewriter.h:161
\brief A data variable
Definition variable.h:25
void insert(const state &s) override
void swap(breadth_first_todo_set &other) noexcept
atermpp::deque< state > & todo_buffer()
breadth_first_todo_set(ForwardIterator first, ForwardIterator last)
void choose_element(state &result) override
void choose_element(state &result) override
depth_first_todo_set(ForwardIterator first, ForwardIterator last)
void insert(const state &s) override
std::vector< data::variable > m_process_parameters
Definition explorer.h:87
void make_timed_state(state &result, const state &s, const data::data_expression &t) const
Definition explorer.h:912
data::enumerator_algorithm m_global_enumerator
Definition explorer.h:77
void abort() override
Abort the state space generation.
Definition explorer.h:1196
lps::multi_action rewrite_action(const lps::multi_action &a, data::mutable_indexed_substitution<> &sigma, data::rewriter &rewr) const
Rewrite action a, and put it back in place.
Definition explorer.h:285
std::vector< state > generate_successors(const state &s0, const SummandSequence &summands, data::mutable_indexed_substitution<> &sigma, data::rewriter &rewr, data::enumerator_algorithm<> &enumerator, data::enumerator_identifier_generator &id_generator, const SummandSequence &confluent_summands=SummandSequence())
Definition explorer.h:701
std::condition_variable m_signal_global_todo_buffer_filled
Definition explorer.h:85
void compute_stochastic_state(stochastic_state &result, const stochastic_distribution &distribution, const DataExpressionSequence &next_state) const
Definition explorer.h:885
const state_type & make_state(const stochastic_state &s) const
Definition explorer.h:931
std::size_t m_n
Definition explorer.h:88
void generate_state_space(bool recursive, const StateType &s0, const SummandSequence &regular_summands, const SummandSequence &confluent_summands, indexed_set_for_states_type &discovered, DiscoverState discover_state=DiscoverState(), ExamineTransition examine_transition=ExamineTransition(), StartState start_state=StartState(), FinishState finish_state=FinishState(), DiscoverInitialState discover_initial_state=DiscoverInitialState())
const indexed_set_for_states_type & state_map() const
Returns a mapping containing all discovered states.
Definition explorer.h:1202
bool less_equal(const data::data_expression &t0, const data::data_expression &t1, data::mutable_indexed_substitution<> &sigma, data::rewriter &rewr) const
Definition explorer.h:144
const std::vector< data::variable > & process_parameters() const
Definition explorer.h:1217
const std::vector< explorer_summand > & confluent_summands() const
Definition explorer.h:1212
void set_process_parameter_values(const data::data_expression_list &values, data::mutable_indexed_substitution<> &sigma)
Definition explorer.h:1233
void set_process_parameter_values(const data::data_expression_list &values)
Definition explorer.h:1238
~explorer() override=default
std::set< data::function_symbol > add_real_operators(std::set< data::function_symbol > s) const
Definition explorer.h:746
data::enumerator_identifier_generator m_global_id_generator
Definition explorer.h:78
explorer(const Specification &lpsspec, const explorer_options &options_, const data::rewriter &rewr)
Definition explorer.h:793
void enumerate_solutions(const explorer_summand &summand, data::mutable_indexed_substitution<> &sigma, data::rewriter &rewr, data::data_expression &condition, data::enumerator_algorithm<> &enumerator, EmitSolution emit_solution)
Definition explorer.h:342
Specification m_global_lpsspec
Definition explorer.h:80
data::data_expression_list process_parameter_values() const
Process parameter values for use in a single thread.
Definition explorer.h:1228
void generate_transitions(const explorer_summand &summand, const SummandSequence &confluent_summands, data::mutable_indexed_substitution<> &sigma, data::rewriter &rewr, data::data_expression &condition, state_type &s1, atermpp::aterm key, data::enumerator_algorithm<> &enumerator, data::enumerator_identifier_generator &id_generator, ReportTransition report_transition=ReportTransition())
Definition explorer.h:399
void generate_state_space_dfs_recursive(bool recursive, DiscoverState discover_state=DiscoverState(), ExamineTransition examine_transition=ExamineTransition(), TreeEdge tree_edge=TreeEdge(), BackEdge back_edge=BackEdge(), ForwardOrCrossEdge forward_or_cross_edge=ForwardOrCrossEdge(), FinishState finish_state=FinishState())
static constexpr bool is_timed
Definition explorer.h:56
const data::data_expression_list & initial_state() const
Definition explorer.h:866
void generate_state_space_thread(std::unique_ptr< todo_set > &todo, std::size_t thread_index, std::atomic< std::size_t > &number_of_active_processes, const SummandSequence &regular_summands, const SummandSequence &confluent_summands, indexed_set_for_states_type &discovered, DiscoverState discover_state, ExamineTransition examine_transition, StartState start_state, FinishState finish_state, data::rewriter thread_rewr, data::mutable_indexed_substitution<> thread_sigma)
void generate_state_space(bool recursive, DiscoverState discover_state=DiscoverState(), ExamineTransition examine_transition=ExamineTransition(), StartState start_state=StartState(), FinishState finish_state=FinishState(), DiscoverInitialState discover_initial_state=DiscoverInitialState())
Generates the state space, and reports all discovered states and transitions by means of callback fun...
indexed_set_for_states_type m_discovered
Definition explorer.h:100
state find_representative(state &u0, const SummandSequence &summands, data::mutable_indexed_substitution<> &sigma, data::rewriter &rewr, data::enumerator_algorithm<> &enumerator, data::enumerator_identifier_generator &id_generator)
Definition explorer.h:154
std::vector< explorer_summand > m_regular_summands
Definition explorer.h:92
const explorer_options m_options
Definition explorer.h:72
summand_cache_map global_cache
Definition explorer.h:98
const data::rewriter & get_rewriter() const
Definition explorer.h:872
data::data_expression_list m_initial_state
Definition explorer.h:89
std::mutex m_exclusive_state_access
Definition explorer.h:82
data::mutable_indexed_substitution m_global_sigma
Definition explorer.h:75
data::data_expression_list process_parameter_values(data::mutable_indexed_substitution<> &sigma) const
Definition explorer.h:1222
state_type make_state(const state &s) const
Definition explorer.h:919
lps::stochastic_distribution m_initial_distribution
Definition explorer.h:90
void compute_projected_state(lps::state &result, const DataExpressionSequence &next_state, const IndexSequence &I_w, data::mutable_indexed_substitution<> &sigma, const data::rewriter &rewr) const
Definition explorer.h:224
void compute_state(state &result, const DataExpressionSequence &v, data::mutable_indexed_substitution<> &sigma, const data::rewriter &rewr) const
Definition explorer.h:173
std::vector< explorer_summand > m_confluent_summands
Definition explorer.h:93
void compute_initial_stochastic_state(stochastic_state &result) const
Definition explorer.h:878
volatile std::atomic< bool > m_must_abort
Definition explorer.h:95
data::rewriter m_global_rewr
Definition explorer.h:76
void generate_state_space_dfs_iterative(const state &s0, std::unordered_set< state > &discovered, const SummandSequence &regular_summands, const SummandSequence &confluent_summands, DiscoverState discover_state=DiscoverState(), ExamineTransition examine_transition=ExamineTransition(), TreeEdge tree_edge=TreeEdge(), BackEdge back_edge=BackEdge(), ForwardOrCrossEdge forward_or_cross_edge=ForwardOrCrossEdge(), FinishState finish_state=FinishState())
void check_enumerator_solution(const data::data_expression &p_expression, const explorer_summand &summand, data::mutable_indexed_substitution<> &sigma, data::rewriter &rewr) const
Definition explorer.h:312
void compute_stochastic_state(stochastic_state &result, const stochastic_distribution &distribution, const DataExpressionSequence &next_state, data::mutable_indexed_substitution<> &sigma, const data::rewriter &rewr, const data::enumerator_algorithm<> &enumerator) const
Definition explorer.h:185
const std::vector< explorer_summand > & regular_summands() const
Definition explorer.h:1207
std::unique_ptr< todo_set > make_todo_set(const state &init)
Definition explorer.h:755
std::mutex m_global_todo_buffer_mutex
Definition explorer.h:84
std::unique_ptr< todo_set > make_todo_set(ForwardIterator first, ForwardIterator last)
Definition explorer.h:767
std::list< transition > out_edges(const state &s)
Definition explorer.h:894
std::vector< data::data_expression > timed_state
Definition explorer.h:103
void project(lps::state &result, const std::vector< std::size_t > &I_r, const data::mutable_indexed_substitution<> &sigma)
Definition explorer.h:383
std::list< transition > out_edges(const state &s, const SummandSequence &regular_summands, const SummandSequence &confluent_summands, data::mutable_indexed_substitution<> &sigma, data::rewriter &rewr, data::enumerator_algorithm<> &enumerator, data::enumerator_identifier_generator &id_generator)
Definition explorer.h:644
Specification preprocess(const Specification &lpsspec)
Definition explorer.h:126
std::list< transition > out_edges(const state &s, const std::size_t summand_index)
Definition explorer.h:902
bool is_confluent_tau(const multi_action &a)
Definition explorer.h:779
static constexpr bool is_stochastic
Definition explorer.h:55
void generate_state_space_dfs_iterative(bool recursive, DiscoverState discover_state=DiscoverState(), ExamineTransition examine_transition=ExamineTransition(), TreeEdge tree_edge=TreeEdge(), BackEdge back_edge=BackEdge(), ForwardOrCrossEdge forward_or_cross_edge=ForwardOrCrossEdge(), FinishState finish_state=FinishState())
void compute_stochastic_projected_state(stochastic_state &result, const stochastic_distribution &distribution, const DataExpressionSequence &next_state, const IndexSequence &I_w, data::mutable_indexed_substitution<> &sigma, const data::rewriter &rewr, data::enumerator_algorithm<> &enumerator) const
Definition explorer.h:243
highway_todo_set(const state &init, std::size_t N_)
std::size_t size() const override
highway_todo_set(ForwardIterator first, ForwardIterator last, std::size_t N_)
void insert(const state &s) override
void choose_element(state &result) override
breadth_first_todo_set new_states
\brief A timed multi-action
const process::action_list & actions() const
const data::data_expression & time() const
Simulation process.
Definition simulation.h:22
void enable_auto_select_probability(bool enable)
If enabled, automatically a probabilistic state is chosen using its intrinsic probability.
void select_transition(std::size_t transition_number)
Choose outgoing transition indexed by transition_number and add its state to the state vector.
void add_new_state(const lps::stochastic_state &s)
std::uniform_int_distribution< std::size_t > m_distrib
Definition simulation.h:87
std::deque< simulator_state_t > m_full_trace
Definition simulation.h:90
void randomly_select_state()
Randomly choose one state among a sequence of probabilistic states.
bool m_auto_select_probabilistic_state
Definition simulation.h:85
void select_state(std::size_t state_number)
Choose one state among a sequence of probabilistic states.
simulation(const stochastic_specification &specification, data::rewrite_strategy strategy=data::rewrite_strategy())
Constructor.
void randomly_select_transition()
Randomly choose an outgoing transition and add its state to the state vector.
std::vector< transition_type > transitions(const lps::state &source_state)
bool match_trace_transition(lts::trace &trace)
void environment(std::vector< std::string > values)
Goto the state indicated by the environment, which is given by a vector of strings.
virtual ~simulation()=default
bool match_trace_probabilistic_state(lts::trace &trace)
data::rewriter m_rewriter
Definition simulation.h:83
void save(const std::string &filename) const
Save the trace to a file.
bool probabilistic_state_must_be_selected(const std::size_t state_index) const
Indicate whether a probabilistic state has been selected.
Definition simulation.h:63
explorer_type m_explorer
Definition simulation.h:84
const std::deque< simulator_state_t > & trace() const
Returns the current annotated state vector.
Definition simulation.h:42
stochastic_specification m_specification
Definition simulation.h:82
void truncate(std::size_t state_number, bool probabilistic)
Remove states from the end of the simulation, making state_number the last state.
void load(const std::string &filename)
Load a trace from a file.
Linear process specification.
LPS summand containing a multi-action.
const stochastic_distribution & distribution() const
Returns the distribution of this summand.
\brief A stochastic distribution
bool is_defined() const
Returns true if the distribution is defined, i.e. it contains a valid distribution....
virtual bool empty() const
todo_set(ForwardIterator first, ForwardIterator last)
atermpp::deque< state > todo
virtual void choose_element(state &result)
virtual ~todo_set()=default
virtual std::size_t size() const
todo_set(const state &init)
virtual void insert(const state &s)
virtual void finish_state()
This class contains a trace consisting of a sequence of (timed) actions possibly with intermediate st...
Definition trace.h:51
#define mCRL2log(LEVEL)
mCRL2log(LEVEL) provides the stream used to log.
Definition logger.h:435
Namespace for system defined sort bool_.
Definition bool.h:29
const function_symbol & true_()
Constructor for function symbol true.
Definition bool.h:74
Namespace for system defined sort real_.
data_expression & real_one()
data_expression & real_zero()
std::set< variable > find_quantifier_variables(const data_expression &x)
bool is_false(const data_expression &x)
Test if x is false.
Definition consistency.h:36
void add_assignments(data::mutable_indexed_substitution<> &sigma, const VariableSequence &v, const DataExpressionSequence &e)
Adds assignments [v := e] to the substitution sigma for each variable in v.
void remove_assignments(data::mutable_indexed_substitution<> &sigma, const VariableSequence &v)
Removes assignments to variables in v from the substitution sigma.
application greater_equal(const data_expression &arg0, const data_expression &arg1)
Application of function symbol >=.
Definition standard.h:374
A class that takes a linear process specification and checks all tau-summands of that LPS for conflue...
The main namespace for the LPS library.
Definition constelm.h:18
std::ostream & operator<<(std::ostream &os, caching c)
const stochastic_distribution & summand_distribution(const lps::stochastic_action_summand &summand)
Definition confluence.h:79
const stochastic_distribution & summand_distribution(const Summand &)
Definition confluence.h:71
std::vector< data::data_expression > make_data_expression_vector(const data::data_expression_list &v)
const stochastic_distribution & initial_distribution(const lps::stochastic_specification &lpsspec)
void check_stochastic_state(const stochastic_state &s, const data::rewriter &rewr)
void check_probability(const data::data_expression &x, const data::rewriter &rewr)
std::ostream & operator<<(std::ostream &out, const explorer_options &options)
std::ostream & operator<<(std::ostream &out, const explorer_summand &summand)
std::string print_probability(const data::data_expression &x)
std::set< data::function_symbol > add_real_operators(std::set< data::function_symbol > s)
const stochastic_distribution & initial_distribution(const lps::specification &)
The main namespace for the Process library.
Visitor for collecting the quantifier variables that occur in a pbes expression.
virtual void abort()=0
virtual ~abortable()=default
bool operator()(const atermpp::aterm &key1, const cheap_cache_key &key2) const
bool operator()(const atermpp::aterm &key1, const atermpp::aterm &key2) const
std::size_t operator()(const cheap_cache_key &key) const
std::size_t operator()(const std::pair< const atermpp::aterm, std::list< atermpp::term_list< mcrl2::data::data_expression > > > &pair) const
std::size_t operator()(const atermpp::aterm &key) const
cheap_cache_key(data::mutable_indexed_substitution<> &sigma, const std::vector< data::variable > &gamma)
const std::vector< data::variable > & m_gamma
data::mutable_indexed_substitution & m_sigma
transition(lps::multi_action action_, const state_type &state_)
Definition explorer.h:65
std::set< core::identifier_string > actions_internal_for_divergencies
std::set< core::identifier_string > trace_actions
explorer_options(data::rewrite_strategy rewr_strat)
exploration_strategy search_strategy
explorer_options & operator=(const explorer_options &other)=default
std::set< lps::multi_action > trace_multiactions
explorer_options(const explorer_options &other)=default
std::vector< data::variable > gamma
std::vector< std::size_t > I_r
std::vector< data::variable > free_variables(const T &x, const data::variable_list &v)
void set_projection_attributes(const std::vector< std::size_t > &Ir, const std::vector< std::size_t > &Iw)
explorer_summand(const ActionSummand &summand, std::size_t summand_index, const data::variable_list &process_parameters, caching cache_strategy_)
std::vector< std::size_t > I_w
stochastic_distribution distribution
data::data_expression condition
atermpp::function_symbol f_gamma
void compute_key(atermpp::aterm &key, data::mutable_indexed_substitution<> &sigma) const
projection_cache_map projection_cache
std::vector< data::data_expression > next_state
std::vector< transition_type > transitions
Definition simulation.h:33
void push_back(const data::data_expression &probability, const state &s)
std::vector< data::data_expression > probabilities
std::vector< state > states