#pragma once #include #include #include #include #include "src/storage/jani/CompositionVisitor.h" namespace storm { namespace jani { class Model; class CompositionInformation { public: CompositionInformation(); void increaseAutomatonMultiplicity(std::string const& automatonName, uint64_t count = 1); std::map const& getAutomatonToMultiplicityMap() const; static std::map joinMultiplicityMaps(std::map const& first, std::map const& second); void addMultiplicityMap(std::map const& multiplicityMap); void setContainsNonStandardParallelComposition(bool value); bool containsNonStandardParallelComposition() const; void setContainsNestedParallelComposition(bool value); bool containsNestedParallelComposition() const; void setContainsParallelComposition(bool value); bool containsParallelComposition() const; std::string const& getActionName(uint64_t index) const; uint64_t getActionIndex(std::string const& name) const; void addNonSilentActionIndex(uint64_t index); void addNonSilentActionIndices(std::set const& indices); bool hasNonSilentActionIndex(uint64_t index); void addInputEnabledActionIndex(uint64_t index); std::set const& getNonSilentActionIndices() const; std::set const& getInputEnabledActionIndices() const; void setMappings(std::map const& indexToNameMap, std::map const& nameToIndexMap); private: /// The indices of the non-silent actions appearing in the topmost element of the composition. std::set nonSilentActionIndices; /// The set of indices of actions for which the topmost element of the composition is input-enabled. std::set inputEnabledActionIndices; /// A mapping from action indices to names. Since the composition may introduce new action names, this may /// extend the one from the underlying model. std::map indexToNameMap; /// A mapping from action names to their indices. std::map nameToIndexMap; /// A mapping from the automata's names to the amount of times they occur in the composition. std::map automatonNameToMultiplicity; /// A flag indicating whether the composition contains any non-standard parallel composition. bool nonStandardParallelComposition; /// A flag indicating whether the composition contains nested parallel compositions; bool nestedParallelComposition; /// A flag indicating whether the composition contains a parallel composition; bool parallelComposition; }; class CompositionInformationVisitor : public CompositionVisitor { public: CompositionInformationVisitor(Model const& model, Composition const& composition); CompositionInformation getInformation(); virtual boost::any visit(AutomatonComposition const& composition, boost::any const& data) override; virtual boost::any visit(ParallelComposition const& composition, boost::any const& data) override; private: uint64_t addOrGetActionIndex(std::string const& name); storm::jani::Model const& model; Composition const& composition; uint64_t nextFreeActionIndex; std::map nameToIndexMap; std::map indexToNameMap; }; } }