mCRL2
Loading...
Searching...
No Matches
pbespor.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//
11
12#ifndef MCRL2_PBES_TOOLS_PBESPOR_H
13#define MCRL2_PBES_TOOLS_PBESPOR_H
14
17#include "mcrl2/pbes/io.h"
18
19namespace mcrl2 {
20
21namespace pbes_system {
22
24{
26 {
28 bool is_conjunctive = false;
29 std::size_t rank = 0;
31 std::vector<pbes_expression> expressions;
32
33 equation_info() = default;
34 equation_info(const equation_info&) = default;
38
39 explicit equation_info(propositional_variable_instantiation X_, bool is_conjunctive_ = false, std::size_t rank_ = 0, fixpoint_symbol symbol_ = fixpoint_symbol::mu())
40 : X(std::move(X_)), is_conjunctive(is_conjunctive_), rank(rank_), symbol(symbol_)
41 {}
42
43 void add(const pbes_expression& x)
44 {
45 expressions.push_back(x);
46 }
47
49 {
52 }
53 };
54
55 std::map<propositional_variable_instantiation, equation_info> equations;
56
58 {
59 std::ostringstream out;
60 out << std::string(X.name());
61 for (const data::data_expression& param: X.parameters())
62 {
63 out << "_" << data::pp(param);
64 }
66 };
67
68 void add_equation(const propositional_variable_instantiation& X, bool is_conjunctive, std::size_t rank, const fixpoint_symbol& symbol)
69 {
70 auto i = equations.find(X);
71 if (i == equations.end())
72 {
73 equations.insert(std::make_pair(X, equation_info(make_variable(X), is_conjunctive, rank, symbol)));
74 }
75 else
76 {
77 equation_info& eqn = i->second;
78 eqn.rank = rank;
79 eqn.is_conjunctive = is_conjunctive;
80 eqn.symbol = symbol;
81 }
82 };
83
85 {
86 auto i_X = equations.find(X);
87 if (i_X == equations.end())
88 {
89 i_X = equations.insert(std::make_pair(X, equation_info(make_variable(X)))).first;
90 }
91 auto i_Y = equations.find(Y);
92 if (i_Y == equations.end())
93 {
94 i_Y = equations.insert(std::make_pair(Y, equation_info(make_variable(Y)))).first;
95 }
96 i_X->second.add(i_Y->second.X);
97 }
98
100 {
101 pbes result;
102 result.data() = dataspec;
103 result.initial_state() = make_variable(initial_state);
104
105 std::vector<equation_info> E;
106 for (const auto& q: equations)
107 {
108 E.push_back(q.second);
109 }
110 std::sort(E.begin(), E.end(), [](const equation_info& x, const equation_info& y) { return x.rank < y.rank; });
111 for (const equation_info& eqn: E)
112 {
113 result.equations().push_back(eqn.make_equation());
114 }
115
116 assert(result.is_well_typed());
117 return result;
118 }
119
120 pbes run(const pbes& p,
121 pbespor_options options
122 )
123 {
124 partial_order_reduction_algorithm algorithm(p, options);
125
126 auto emit_node = [&](const propositional_variable_instantiation& X, bool is_conjunctive, std::size_t rank)
127 {
128 mCRL2log(log::debug) << "emit node " << X << std::endl;
129 add_equation(X, is_conjunctive, rank, algorithm.symbol(X.name()));
130 };
131
133 {
134 mCRL2log(log::debug) << "emit edge " << X << " -> " << Y << std::endl;
135 add_expression(X, Y);
136 };
137
138 if(options.reduction)
139 {
140 algorithm.print();
141 algorithm.explore(algorithm.initial_state(), emit_node, emit_edge);
142 }
143 else
144 {
145 algorithm.explore_full(algorithm.initial_state(), emit_node, emit_edge);
146 }
147
148 return compose_result(p.data(), algorithm.initial_state());
149 }
150};
151
152void pbespor(const std::string& input_filename,
153 const std::string& output_filename,
154 const utilities::file_format& input_format,
155 const utilities::file_format& output_format,
156 pbespor_options options
157 )
158{
159 pbes p;
160 load_pbes(p, input_filename, input_format);
162 pbespor_pbes_composer composer;
163 pbes result = composer.run(p, options);
164 save_pbes(result, output_filename, output_format);
165}
166
167} // namespace pbes_system
168
169} // namespace mcrl2
170
171#endif // MCRL2_PBES_TOOLS_PBESPOR_H
Term containing a string.
static fixpoint_symbol mu()
Returns the mu symbol.
const fixpoint_symbol & symbol(const core::identifier_string &X) const
const propositional_variable_instantiation & initial_state() const
void explore(const propositional_variable_instantiation &X_init, EmitNode emit_node=EmitNode(), EmitEdge emit_edge=EmitEdge())
void explore_full(const propositional_variable_instantiation &X_init, EmitNode emit_node=EmitNode(), EmitEdge emit_edge=EmitEdge())
parameterized boolean equation system
Definition pbes.h:58
const data::data_specification & data() const
Returns the data specification.
Definition pbes.h:150
const propositional_variable_instantiation & initial_state() const
Returns the initial state.
Definition pbes.h:192
const std::vector< pbes_equation > & equations() const
Returns the equations.
Definition pbes.h:164
bool is_well_typed() const
Checks if the PBES is well typed.
Definition pbes.h:267
\brief A propositional variable instantiation
const data::data_expression_list & parameters() const
\brief A propositional variable declaration
#define mCRL2log(LEVEL)
mCRL2log(LEVEL) provides the stream used to log.
Definition logger.h:391
std::string pp(const abstraction &x)
Definition data.cpp:39
void normalize(pbes &x)
The function normalize brings (embedded) pbes expressions into positive normal form,...
pbes_expression join_or(FwdIt first, FwdIt last)
Returns or applied to the sequence of pbes expressions [first, last)
Definition join.h:26
void load_pbes(pbes &pbes, std::istream &stream, utilities::file_format format, const std::string &source="")
Load a PBES from file.
Definition io.cpp:82
pbes_expression join_and(FwdIt first, FwdIt last)
Returns and applied to the sequence of pbes expressions [first, last)
Definition join.h:36
void pbespor(const std::string &input_filename, const std::string &output_filename, const utilities::file_format &input_format, const utilities::file_format &output_format, pbespor_options options)
Definition pbespor.h:152
void save_pbes(const pbes &pbes, std::ostream &stream, utilities::file_format format=utilities::file_format())
Save a PBES in the format specified.
Definition io.cpp:49
A class that takes a linear process specification and checks all tau-summands of that LPS for conflue...
Definition indexed_set.h:72
STL namespace.
add your file description here.
add your file description here.
IO routines for boolean equation systems.
propositional_variable_instantiation X
Definition pbespor.h:27
equation_info & operator=(const equation_info &)=default
equation_info(propositional_variable_instantiation X_, bool is_conjunctive_=false, std::size_t rank_=0, fixpoint_symbol symbol_=fixpoint_symbol::mu())
Definition pbespor.h:39
equation_info & operator=(equation_info &&)=default
void add_equation(const propositional_variable_instantiation &X, bool is_conjunctive, std::size_t rank, const fixpoint_symbol &symbol)
Definition pbespor.h:68
pbes compose_result(const data::data_specification &dataspec, const propositional_variable_instantiation &initial_state) const
Definition pbespor.h:99
void add_expression(const propositional_variable_instantiation &X, const propositional_variable_instantiation &Y)
Definition pbespor.h:84
std::map< propositional_variable_instantiation, equation_info > equations
Definition pbespor.h:55
propositional_variable_instantiation make_variable(const propositional_variable_instantiation &X) const
Definition pbespor.h:57
pbes run(const pbes &p, pbespor_options options)
Definition pbespor.h:120