5#include <boost/algorithm/string/join.hpp>
51 uint64_t i = index - 1;
54 return boost::make_optional(i);
60 return boost::make_optional(i);
67 for (uint64_t result = 0; result < this->
size(); ++result) {
72 STORM_LOG_THROW(
false, storm::exceptions::WrongFormatException,
"Synchronization vector must have at least one participating action.");
77 for (
auto const& inputEntry : input) {
92 for (
auto const& element : synchronizationVector.
getInput()) {
99 stream <<
") -> " << synchronizationVector.
getOutput();
114 return !(vector1 == vector2);
118 STORM_LOG_THROW(vector1.
size() == vector2.
size(), storm::exceptions::WrongFormatException,
"Cannot compare synchronization vectors of different size.");
119 for (uint64_t i = 0; i < vector1.
size(); ++i) {
140 std::vector<SynchronizationVector>
const& synchronizationVectors)
141 : subcompositions(subcompositions), synchronizationVectors(synchronizationVectors) {
142 STORM_LOG_THROW(!subcompositions.empty(), storm::exceptions::WrongFormatException,
"At least one automaton required for parallel composition.");
143 this->checkSynchronizationVectors();
147 : subcompositions(subcompositions), synchronizationVectors() {
148 STORM_LOG_THROW(!subcompositions.empty(), storm::exceptions::WrongFormatException,
"At least one automaton required for parallel composition.");
151 for (
auto const& action : synchronizationAlphabet) {
152 synchronizationVectors.emplace_back(std::vector<std::string>(this->subcompositions.size(), action), action);
157 std::set<std::string>
const& synchronizationAlphabet) {
158 subcompositions.push_back(leftSubcomposition);
159 subcompositions.push_back(rightSubcomposition);
162 for (
auto const& action : synchronizationAlphabet) {
163 synchronizationVectors.emplace_back(std::vector<std::string>(this->subcompositions.size(), action), action);
172 return *subcompositions[index];
176 return subcompositions;
180 return subcompositions.size();
184 return synchronizationVectors[index];
188 return synchronizationVectors;
192 return synchronizationVectors.size();
196 for (uint_fast64_t inputIndex = 0; inputIndex < subcompositions.size(); ++inputIndex) {
197 std::set<std::string> actions;
198 for (
auto const& vector : synchronizationVectors) {
199 std::string
const& action = vector.getInput(inputIndex);
201 if (actions.find(action) != actions.end()) {
204 actions.insert(action);
208 if (subcompositions.at(inputIndex)->isParallelComposition()) {
209 if (subcompositions.at(inputIndex)->asParallelComposition().areActionsReused()) {
217void ParallelComposition::checkSynchronizationVectors()
const {
218 for (uint_fast64_t inputIndex = 0; inputIndex < subcompositions.size(); ++inputIndex) {
219 for (
auto const& vector : synchronizationVectors) {
220 STORM_LOG_THROW(vector.size() == this->subcompositions.size(), storm::exceptions::WrongFormatException,
221 "Synchronization vectors must match parallel composition size.");
225 for (
auto const& vector : synchronizationVectors) {
226 bool hasInput =
false;
227 for (
auto const& input : vector.getInput()) {
233 STORM_LOG_THROW(hasInput, storm::exceptions::WrongFormatException,
"Synchronization vector must have at least one proper input.");
238 return visitor.
visit(*
this, data);
242 std::vector<std::string> synchronizationVectorsAsStrings;
243 for (
auto const& synchronizationVector : synchronizationVectors) {
244 std::stringstream tmpStream;
245 tmpStream << synchronizationVector;
246 synchronizationVectorsAsStrings.push_back(tmpStream.str());
250 bool hasSynchVectors = !synchronizationVectors.empty();
252 for (
auto const& subcomposition : subcompositions) {
254 stream << (hasSynchVectors ?
" || " :
" ||| ");
256 stream << *subcomposition;
260 if (hasSynchVectors) {
261 stream <<
"[" << boost::algorithm::join(synchronizationVectorsAsStrings,
", ") <<
"]";
virtual boost::any visit(AutomatonComposition const &composition, boost::any const &data)=0
uint64_t getNumberOfSubcompositions() const
Retrieves the number of subcompositions of this parallel composition.
virtual void write(std::ostream &stream) const override
std::vector< SynchronizationVector > const & getSynchronizationVectors() const
Retrieves the synchronization vectors of the parallel composition.
std::size_t getNumberOfSynchronizationVectors() const
Retrieves the number of synchronization vectors.
SynchronizationVector const & getSynchronizationVector(uint64_t index) const
Retrieves the synchronization vector with the given index.
bool areActionsReused() const
virtual bool isParallelComposition() const override
std::vector< std::shared_ptr< Composition > > const & getSubcompositions() const
Retrieves the subcompositions of the parallel composition.
virtual boost::any accept(CompositionVisitor &visitor, boost::any const &data) const override
Composition const & getSubcomposition(uint64_t index) const
Retrieves the subcomposition with the given index.
ParallelComposition(std::shared_ptr< Composition > const &subcomposition, std::vector< SynchronizationVector > const &synchronizationVectors)
Creates a parallel composition of the subcomposition and the provided synchronization vectors.
static const std::string NO_ACTION_INPUT
std::vector< std::string > const & getInput() const
uint64_t getPositionOfFirstParticipatingAction() const
Retrieves the position of the first participating action.
boost::optional< std::string > getPrecedingParticipatingAction(uint64_t index) const
Retrieves the action name that is the last participating action before the given input index.
SynchronizationVector(std::vector< std::string > const &input, std::string const &output)
boost::optional< uint64_t > getPositionOfPrecedingParticipatingAction(uint64_t index) const
Retrieves the position of the last participating action before the given input index.
static bool isNoActionInput(std::string const &action)
uint64_t getNumberOfActionInputs() const
Retrieves the number of action inputs, i.e.
std::string const & getOutput() const
#define STORM_LOG_THROW(cond, exception, message)
bool operator!=(SynchronizationVector const &vector1, SynchronizationVector const &vector2)
bool operator==(SynchronizationVector const &vector1, SynchronizationVector const &vector2)
std::ostream & operator<<(std::ostream &stream, Assignment const &assignment)
bool operator()(SynchronizationVector const &vector1, SynchronizationVector const &vector2) const