12#ifndef MCRL2_DATA_REPLACE_CONSTANTS_BY_VARIABLES_H
13#define MCRL2_DATA_REPLACE_CONSTANTS_BY_VARIABLES_H
15#include "mcrl2/data/rewriter.h"
16#include "mcrl2/data/builder.h"
24template <
template <
class>
class Builder>
38 return data::find_free_variables(x).empty();
48 auto i = substitutions.find(x);
49 if (i != substitutions.end())
51 result = atermpp::down_cast<T>(i->second);
57 sigma[v] = r(x, sigma);
58 result = atermpp::down_cast<T>(v);
62 super::apply(result, x);
A unordered_map class in which aterms can be stored.
const variable_list & variables() const
const data_expression & body() const
data_expression & operator=(data_expression &&) noexcept=default
void apply(T &result, const forall &x)
void apply(T &result, const exists &x)
existential quantification.
universal quantification.
Rewriter that operates on data expressions.
data_expression operator()(const data_expression &d) const
Rewrites a data expression.
Identifier generator that stores the identifiers of the context in a set. Using the operator()() and ...
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)
breadth_first_todo_set(const state &init)
void choose_element(state &result) override
void choose_element(state &result) override
depth_first_todo_set(ForwardIterator first, ForwardIterator last)
depth_first_todo_set(const state &init)
void insert(const state &s) override
std::vector< data::variable > m_process_parameters
void make_timed_state(state &result, const state &s, const data::data_expression &t) const
data::enumerator_algorithm m_global_enumerator
void abort() override
Abort the state space generation.
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.
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())
std::condition_variable m_signal_global_todo_buffer_filled
void compute_stochastic_state(stochastic_state &result, const stochastic_distribution &distribution, const DataExpressionSequence &next_state) const
const state_type & make_state(const stochastic_state &s) const
void generate_state_space(bool recursive, const StateType &s0, const SummandSequence ®ular_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.
bool less_equal(const data::data_expression &t0, const data::data_expression &t1, data::mutable_indexed_substitution<> &sigma, data::rewriter &rewr) const
const std::vector< data::variable > & process_parameters() const
const std::vector< explorer_summand > & confluent_summands() const
void set_process_parameter_values(const data::data_expression_list &values, data::mutable_indexed_substitution<> &sigma)
void set_process_parameter_values(const data::data_expression_list &values)
~explorer() override=default
std::set< data::function_symbol > add_real_operators(std::set< data::function_symbol > s) const
data::enumerator_identifier_generator m_global_id_generator
explorer(const Specification &lpsspec, const explorer_options &options_, const data::rewriter &rewr)
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)
Specification m_global_lpsspec
data::data_expression_list process_parameter_values() const
Process parameter values for use in a single thread.
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())
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
const data::data_expression_list & initial_state() const
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 ®ular_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
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)
std::vector< explorer_summand > m_regular_summands
const explorer_options m_options
summand_cache_map global_cache
const data::rewriter & get_rewriter() const
data::data_expression_list m_initial_state
std::mutex m_exclusive_state_access
data::mutable_indexed_substitution m_global_sigma
data::data_expression_list process_parameter_values(data::mutable_indexed_substitution<> &sigma) const
state_type make_state(const state &s) const
lps::stochastic_distribution m_initial_distribution
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
void compute_state(state &result, const DataExpressionSequence &v, data::mutable_indexed_substitution<> &sigma, const data::rewriter &rewr) const
std::vector< explorer_summand > m_confluent_summands
void compute_initial_stochastic_state(stochastic_state &result) const
volatile std::atomic< bool > m_must_abort
data::rewriter m_global_rewr
void generate_state_space_dfs_iterative(const state &s0, std::unordered_set< state > &discovered, const SummandSequence ®ular_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
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
const std::vector< explorer_summand > & regular_summands() const
std::unique_ptr< todo_set > make_todo_set(const state &init)
std::mutex m_global_todo_buffer_mutex
std::unique_ptr< todo_set > make_todo_set(ForwardIterator first, ForwardIterator last)
std::list< transition > out_edges(const state &s)
std::vector< data::data_expression > timed_state
void project(lps::state &result, const std::vector< std::size_t > &I_r, const data::mutable_indexed_substitution<> &sigma)
std::list< transition > out_edges(const state &s, const SummandSequence ®ular_summands, const SummandSequence &confluent_summands, data::mutable_indexed_substitution<> &sigma, data::rewriter &rewr, data::enumerator_algorithm<> &enumerator, data::enumerator_identifier_generator &id_generator)
Specification preprocess(const Specification &lpsspec)
std::list< transition > out_edges(const state &s, const std::size_t summand_index)
bool is_confluent_tau(const multi_action &a)
static constexpr bool is_stochastic
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
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_)
std::random_device device
void insert(const state &s) override
void choose_element(state &result) override
bool empty() const override
breadth_first_todo_set new_states
void finish_state() override
\brief A timed multi-action
const process::action_list & actions() const
const data::data_expression & time() const
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
std::deque< simulator_state_t > m_full_trace
void randomly_select_state()
Randomly choose one state among a sequence of probabilistic states.
bool m_auto_select_probabilistic_state
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
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.
const std::deque< simulator_state_t > & trace() const
Returns the current annotated state vector.
stochastic_specification m_specification
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....
Linear process specification.
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...
#define mCRL2log(LEVEL)
mCRL2log(LEVEL) provides the stream used to log.
Namespace for system defined sort bool_.
const function_symbol & true_()
Constructor for function symbol true.
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.
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 >=.
std::pair< std::set< data::variable >, std::set< data::variable > > read_write_parameters(const lps::action_summand &summand, const std::set< data::variable > &process_parameters)
Computes the read and written process parameters for the given summand.
std::map< data::variable, std::size_t > process_parameter_index(const Specification &lpsspec)
Assigns a unique index to every parameter of the process.
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.
std::ostream & operator<<(std::ostream &os, caching c)
const stochastic_distribution & summand_distribution(const lps::stochastic_action_summand &summand)
std::map< data::variable, std::size_t > compute_process_parameter_index(const Specification &lpsspec)
Assigns a unique index to every parameter of the process.
const stochastic_distribution & summand_distribution(const Summand &)
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 order_summand_variables(Specification &lpsspec)
Order summand variables to make enumeration over these variables more efficient.
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.
std::string print_read_write_patterns(const std::vector< boost::dynamic_bitset<> > &patterns)
bool is_used(const boost::dynamic_bitset<> &pattern, std::size_t i)
Returns true if the variable at position i is used in the pattern.
void weighted_order_rec(std::vector< std::size_t > &order, boost::dynamic_bitset<> S, std::size_t n, const std::vector< boost::dynamic_bitset<> > &adjacency)
std::vector< std::size_t > compute_variable_order_random(std::size_t n, bool exclude_first_variable=false)
std::vector< std::size_t > compute_variable_order_default(std::size_t n)
std::vector< std::size_t > distances(const std::vector< boost::dynamic_bitset<> > &adjacency, const boost::dynamic_bitset<> S, std::size_t s)
Returns the distances to each vertex in the graph S from s.
float weight(const std::vector< boost::dynamic_bitset<> > &adjacency, boost::dynamic_bitset<> S, std::size_t s)
Returns the sum of weighted distances to all other vertices.
Replace each constant data application c by a fresh variable v, and add extend the substitution sigma...
std::unordered_map< data::data_expression, data::variable > substitutions
bool is_constant(const data::data_expression &x) const
data::mutable_indexed_substitution & sigma
data::set_identifier_generator id_generator
void apply(T &result, const data::application &x)
replace_constants_by_variables_builder(const data::rewriter &r_, data::mutable_indexed_substitution<> &sigma_)
Visitor for collecting the quantifier variables that occur in a pbes expression.
std::set< data::variable > result
void enter(const exists &x)
void enter(const forall &x)
data_expression operator()(const data_expression &x) const
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
void apply(T &result, const data::data_expression &x)
data::one_point_rule_rewriter r
replace_constants_by_variables_builder(const data::rewriter &r, data::mutable_indexed_substitution<> &sigma)
transition(lps::multi_action action_, const state_type &state_)
bool detect_nondeterminism
std::set< core::identifier_string > actions_internal_for_divergencies
bool replace_constants_by_variables
std::set< core::identifier_string > trace_actions
explorer_options(data::rewrite_strategy rewr_strat)
exploration_strategy search_strategy
std::string confluence_action
bool remove_unused_rewrite_rules
bool discard_lts_state_labels
explorer_options()=default
explorer_options & operator=(const explorer_options &other)=default
std::set< lps::multi_action > trace_multiactions
explorer_options(const explorer_options &other)=default
bool one_point_rule_rewrite
std::size_t number_of_threads
std::size_t highway_todo_max
bool suppress_progress_messages
data::variable_list variables
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
summand_cache_map local_cache
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
bool operator()(const atermpp::aterm &key1, const atermpp::aterm &key2) const
bool operator()(const atermpp::aterm &stored, const projection_cache_key &k) const
bool operator()(const projection_cache_key &k, const atermpp::aterm &stored) const
std::size_t operator()(const std::pair< const atermpp::aterm, std::vector< projected_transition > > &pair) const
std::size_t operator()(const projection_cache_key &key) const
std::size_t operator()(const atermpp::aterm &key) const
const data::variable_vector & process_parameters
const std::vector< std::size_t > & indices
data::mutable_indexed_substitution & sigma
std::vector< transition_type > transitions
std::size_t transition_number
lps::stochastic_state source_state
stochastic_state(const state &s)
stochastic_state()=default
void push_back(const data::data_expression &probability, const state &s)
std::vector< data::data_expression > probabilities
std::vector< state > states