mCRL2
Loading...
Searching...
No Matches
symbolic_lts_io.cpp
Go to the documentation of this file.
1// Author(s): Maurice Laveaux
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
11
12#ifdef MCRL2_ENABLE_SYLVAN
13
15
19#include "mcrl2/data/data_io.h"
21
22using namespace mcrl2;
23
24namespace mcrl2::lps
25{
26
27static atermpp::aterm symbolic_labelled_transition_system_mark()
28{
29 return atermpp::aterm(atermpp::function_symbol("symbolic_labelled_transition_system", 0));
30}
31
32std::ostream& operator<<(std::ostream& stream, const symbolic_lts& lts)
33{
34 std::shared_ptr<utilities::obitstream> bitstream = std::make_shared<utilities::obitstream>(stream);
35
36 atermpp::binary_aterm_ostream aterm_stream(bitstream);
37 symbolic::binary_ldd_ostream ldd_stream(bitstream);
38
39 // We set the transformer for all other elements (transitions, state labels and the initial state).
40 aterm_stream << data::detail::remove_index_impl;
41
42 aterm_stream << symbolic_labelled_transition_system_mark();
43 aterm_stream << lts.data_spec;
44 aterm_stream << lts.process_parameters;
45
46 ldd_stream << lts.initial_state;
47 ldd_stream << lts.states;
48
49 // Write the mapping from indices to terms.
50 for (const auto& index : lts.data_index)
51 {
52 bitstream->write_integer(index.size());
53
54 for (const auto& term : index)
55 {
56 aterm_stream << term;
57 }
58 }
59
60 // Write the action label indices.
61 bitstream->write_integer(lts.action_index.size());
62 for (const auto& term : lts.action_index)
63 {
64 aterm_stream << term;
65 }
66
67 // Write the transition group information: read and write dependencies and the local transition relation.
68 bitstream->write_integer(lts.summand_groups.size());
69 for (const auto& group : lts.summand_groups)
70 {
71 bitstream->write_integer(group.read_parameters.size());
72 for (const auto& parameter : group.read_parameters)
73 {
74 aterm_stream << parameter;
75 }
76
77 bitstream->write_integer(group.write_parameters.size());
78 for (const auto& parameter : group.write_parameters)
79 {
80 aterm_stream << parameter;
81 }
82 ldd_stream << group.L;
83 }
84
85 return stream;
86}
87
88std::istream& operator>>(std::istream& stream, symbolic_lts& lts)
89{
90 std::shared_ptr<utilities::ibitstream> bitstream = std::make_shared<utilities::ibitstream>(stream);
91
92 atermpp::binary_aterm_istream aterm_stream(bitstream);
93 symbolic::binary_ldd_istream ldd_stream(bitstream);
94
95 // We set the transformer for all other elements (transitions, state labels and the initial state).
96 aterm_stream >> data::detail::add_index_impl;
97
98 atermpp::aterm marker;
99 aterm_stream >> marker;
100
101 if (marker != symbolic_labelled_transition_system_mark())
102 {
103 throw mcrl2::runtime_error("Stream does not contain a symbolic labelled transition system (SLTS).");
104 }
105
106 aterm_stream >> lts.data_spec;
107 aterm_stream >> lts.process_parameters;
108 ldd_stream >> lts.initial_state;
109 ldd_stream >> lts.states;
110
111 // For every process parameter read the data index.
112 lts.data_index.clear();
113 for (const data::variable& parameter : lts.process_parameters)
114 {
115 lts.data_index.push_back(parameter.sort());
116
117 std::size_t number_of_entries = bitstream->read_integer();
118 for (std::size_t i = 0; i < number_of_entries; ++i)
119 {
121 aterm_stream >> value;
122
123 auto [result, inserted] = lts.data_index.back().insert(value);
124 assert(i == result); utilities::mcrl2_unused(result);
125 assert(inserted); utilities::mcrl2_unused(inserted);
126 }
127 }
128
129 std::size_t number_of_action_labels = bitstream->read_integer();
130 lts.action_index.clear();
131
132 for (std::size_t i = 0; i < number_of_action_labels; ++i)
133 {
135 aterm_stream >> value;
136
137 auto [result, inserted] = lts.action_index.insert(value);
138 assert(i == result); utilities::mcrl2_unused(result);
139 assert(inserted); utilities::mcrl2_unused(inserted);
140 }
141
142 std::size_t number_of_groups = bitstream->read_integer();
143 lts.summand_groups.clear();
144
145 for (std::size_t i = 0; i < number_of_groups; ++i)
146 {
147 std::size_t number_of_read = bitstream->read_integer();
148 data::variable_vector read_parameters = std::vector<data::variable>(number_of_read);
149
150 for (auto& parameter : read_parameters)
151 {
152 aterm_stream >> parameter;
153 }
154
155 std::size_t number_of_write = bitstream->read_integer();
156 data::variable_vector write_parameters = std::vector<data::variable>(number_of_write);
157
158 for (auto& parameter : write_parameters)
159 {
160 aterm_stream >> parameter;
161 }
162
163 lts.summand_groups.emplace_back(lts.process_parameters, read_parameters, write_parameters);
164 ldd_stream >> lts.summand_groups.back().L;
165 }
166
167 return stream;
168}
169
170} // namespace mcrl2::lps
171
172#endif // MCRL2_ENABLE_SYLVAN
Reads terms from a stream in the steamable binary aterm format.
Writes terms in a streamable binary aterm format to an output stream.
\brief A data variable
Definition variable.h:28
\brief A timed multi-action
Standard exception class for reporting runtime errors.
Definition exception.h:27
add your file description here.
atermpp::aterm remove_index_impl(const atermpp::aterm &x)
Definition io.h:28
atermpp::aterm add_index_impl(const atermpp::aterm &x)
Definition io.h:39
NUMERIC_TYPE value(const data_expression &r, typename std::enable_if< std::is_floating_point< NUMERIC_TYPE >::value >::type *=nullptr)
Yields the real value of a data expression.
std::vector< variable > variable_vector
\brief vector of variables
Definition variable.h:89
The main namespace for the LPS library.
std::ostream & operator<<(std::ostream &out, const action_summand &x)
std::istream & operator>>(std::istream &is, exploration_strategy &strat)
void mcrl2_unused(T &&...)
Function that can be used to silence unused parameter warnings.
Definition unused.h:20
A class that takes a linear process specification and checks all tau-summands of that LPS for conflue...
Definition indexed_set.h:72