diff --git a/src/adapters/AddExpressionAdapter.cpp b/src/adapters/AddExpressionAdapter.cpp index 84e48e8a6..e50620db8 100644 --- a/src/adapters/AddExpressionAdapter.cpp +++ b/src/adapters/AddExpressionAdapter.cpp @@ -12,7 +12,7 @@ namespace storm { namespace adapters { template<storm::dd::DdType Type, typename ValueType> - AddExpressionAdapter<Type, ValueType>::AddExpressionAdapter(std::shared_ptr<storm::dd::DdManager<Type>> ddManager, std::map<storm::expressions::Variable, storm::expressions::Variable> const& variableMapping) : ddManager(ddManager), variableMapping(variableMapping) { + AddExpressionAdapter<Type, ValueType>::AddExpressionAdapter(std::shared_ptr<storm::dd::DdManager<Type>> ddManager, std::shared_ptr<std::map<storm::expressions::Variable, storm::expressions::Variable>> const& variableMapping) : ddManager(ddManager), variableMapping(variableMapping) { // Intentionally left empty. } @@ -140,8 +140,8 @@ namespace storm { template<storm::dd::DdType Type, typename ValueType> boost::any AddExpressionAdapter<Type, ValueType>::visit(storm::expressions::VariableExpression const& expression) { - auto const& variablePair = variableMapping.find(expression.getVariable()); - STORM_LOG_THROW(variablePair != variableMapping.end(), storm::exceptions::InvalidArgumentException, "Cannot translate the given expression, because it contains the variable '" << expression.getVariableName() << "' for which no DD counterpart is known."); + auto const& variablePair = variableMapping->find(expression.getVariable()); + STORM_LOG_THROW(variablePair != variableMapping->end(), storm::exceptions::InvalidArgumentException, "Cannot translate the given expression, because it contains the variable '" << expression.getVariableName() << "' for which no DD counterpart is known."); if (expression.hasBooleanType()) { return ddManager->template getIdentity<ValueType>(variablePair->second).toBdd(); } else { diff --git a/src/adapters/AddExpressionAdapter.h b/src/adapters/AddExpressionAdapter.h index ad82146f3..89d825d96 100644 --- a/src/adapters/AddExpressionAdapter.h +++ b/src/adapters/AddExpressionAdapter.h @@ -1,6 +1,8 @@ #ifndef STORM_ADAPTERS_DDEXPRESSIONADAPTER_H_ #define STORM_ADAPTERS_DDEXPRESSIONADAPTER_H_ +#include <memory> + #include "src/storage/expressions/Variable.h" #include "src/storage/expressions/Expressions.h" #include "src/storage/expressions/ExpressionVisitor.h" @@ -15,7 +17,7 @@ namespace storm { template<storm::dd::DdType Type, typename ValueType = double> class AddExpressionAdapter : public storm::expressions::ExpressionVisitor { public: - AddExpressionAdapter(std::shared_ptr<storm::dd::DdManager<Type>> ddManager, std::map<storm::expressions::Variable, storm::expressions::Variable> const& variableMapping); + AddExpressionAdapter(std::shared_ptr<storm::dd::DdManager<Type>> ddManager, std::shared_ptr<std::map<storm::expressions::Variable, storm::expressions::Variable>> const& variableMapping); storm::dd::Add<Type, ValueType> translateExpression(storm::expressions::Expression const& expression); storm::dd::Bdd<Type> translateBooleanExpression(storm::expressions::Expression const& expression); @@ -36,7 +38,7 @@ namespace storm { std::shared_ptr<storm::dd::DdManager<Type>> ddManager; // This member maps the variables used in the expressions to the variables used by the DD manager. - std::map<storm::expressions::Variable, storm::expressions::Variable> variableMapping; + std::shared_ptr<std::map<storm::expressions::Variable, storm::expressions::Variable>> variableMapping; }; } // namespace adapters diff --git a/src/builder/DdJaniModelBuilder.cpp b/src/builder/DdJaniModelBuilder.cpp index 3a46a36c5..a2b29f34b 100644 --- a/src/builder/DdJaniModelBuilder.cpp +++ b/src/builder/DdJaniModelBuilder.cpp @@ -130,7 +130,11 @@ namespace storm { template <storm::dd::DdType Type, typename ValueType> struct CompositionVariables { - CompositionVariables() : manager(std::make_shared<storm::dd::DdManager<Type>>()) { + CompositionVariables() : manager(std::make_shared<storm::dd::DdManager<Type>>()), + variableToRowMetaVariableMap(std::make_shared<std::map<storm::expressions::Variable, storm::expressions::Variable>>()), + rowExpressionAdapter(std::make_shared<storm::adapters::AddExpressionAdapter<Type>>(manager, variableToRowMetaVariableMap)), + variableToColumnMetaVariableMap(std::make_shared<std::map<storm::expressions::Variable, storm::expressions::Variable>>()), + columnExpressionAdapter(std::make_shared<storm::adapters::AddExpressionAdapter<Type>>(manager, variableToColumnMetaVariableMap)) { // Intentionally left empty. } @@ -138,12 +142,12 @@ namespace storm { // The meta variables for the row encoding. std::set<storm::expressions::Variable> rowMetaVariables; - std::map<storm::expressions::Variable, storm::expressions::Variable> variableToRowMetaVariableMap; + std::shared_ptr<std::map<storm::expressions::Variable, storm::expressions::Variable>> variableToRowMetaVariableMap; std::shared_ptr<storm::adapters::AddExpressionAdapter<Type>> rowExpressionAdapter; // The meta variables for the column encoding. std::set<storm::expressions::Variable> columnMetaVariables; - std::map<storm::expressions::Variable, storm::expressions::Variable> variableToColumnMetaVariableMap; + std::shared_ptr<std::map<storm::expressions::Variable, storm::expressions::Variable>> variableToColumnMetaVariableMap; std::shared_ptr<storm::adapters::AddExpressionAdapter<Type>> columnExpressionAdapter; // All pairs of row/column meta variables. @@ -197,7 +201,7 @@ namespace storm { boost::any visit(storm::jani::AutomatonComposition const& composition, boost::any const& data) override { auto it = automata.find(composition.getAutomatonName()); - STORM_LOG_THROW(it != automata.end(), storm::exceptions::InvalidArgumentException, "Cannot build symbolic model from JANI model whose system composition that refers to the same automaton multiple times."); + STORM_LOG_THROW(it == automata.end(), storm::exceptions::InvalidArgumentException, "Cannot build symbolic model from JANI model whose system composition that refers to the automaton '" << composition.getAutomatonName() << "' multiple times."); automata.insert(it, composition.getAutomatonName()); return boost::none; } @@ -218,14 +222,16 @@ namespace storm { CompositionVariables<Type, ValueType> result; for (auto const& action : this->model.getActions()) { - std::pair<storm::expressions::Variable, storm::expressions::Variable> variablePair = result.manager->addMetaVariable(action.getName()); - result.actionVariables.push_back(variablePair.first); + if (this->model.getActionIndex(action.getName()) != this->model.getSilentActionIndex()) { + std::pair<storm::expressions::Variable, storm::expressions::Variable> variablePair = result.manager->addMetaVariable(action.getName()); + result.actionVariables.push_back(variablePair.first); + } } // FIXME: check how many nondeterminism variables we should actually allocate. uint64_t numberOfNondeterminismVariables = this->model.getNumberOfAutomata(); for (auto const& automaton : this->model.getAutomata()) { - numberOfNondeterminismVariables *= automaton.getNumberOfEdges(); + numberOfNondeterminismVariables += automaton.getNumberOfEdges(); } for (uint_fast64_t i = 0; i < numberOfNondeterminismVariables; ++i) { std::pair<storm::expressions::Variable, storm::expressions::Variable> variablePair = result.manager->addMetaVariable("nondet" + std::to_string(i)); @@ -256,12 +262,12 @@ namespace storm { for (auto const& variable : automaton.getVariables().getBoundedIntegerVariables()) { createVariable(variable, result); identity &= result.variableToIdentityMap.at(variable.getExpressionVariable()).toBdd(); - range &= result.manager->getRange(result.variableToRowMetaVariableMap.at(variable.getExpressionVariable())); + range &= result.manager->getRange(result.variableToRowMetaVariableMap->at(variable.getExpressionVariable())); } for (auto const& variable : automaton.getVariables().getBooleanVariables()) { createVariable(variable, result); identity &= result.variableToIdentityMap.at(variable.getExpressionVariable()).toBdd(); - range &= result.manager->getRange(result.variableToRowMetaVariableMap.at(variable.getExpressionVariable())); + range &= result.manager->getRange(result.variableToRowMetaVariableMap->at(variable.getExpressionVariable())); } result.automatonToIdentityMap[automaton.getName()] = identity.template toAdd<ValueType>(); @@ -279,10 +285,10 @@ namespace storm { STORM_LOG_TRACE("Created meta variables for global integer variable: " << variablePair.first.getName() << "] and " << variablePair.second.getName() << "."); result.rowMetaVariables.insert(variablePair.first); - result.variableToRowMetaVariableMap.emplace(variable.getExpressionVariable(), variablePair.first); + result.variableToRowMetaVariableMap->emplace(variable.getExpressionVariable(), variablePair.first); result.columnMetaVariables.insert(variablePair.second); - result.variableToColumnMetaVariableMap.emplace(variable.getExpressionVariable(), variablePair.second); + result.variableToColumnMetaVariableMap->emplace(variable.getExpressionVariable(), variablePair.second); storm::dd::Add<Type, ValueType> variableIdentity = result.manager->template getIdentity<ValueType>(variablePair.first).equals(result.manager->template getIdentity<ValueType>(variablePair.second)).template toAdd<ValueType>() * result.manager->getRange(variablePair.first).template toAdd<ValueType>() * result.manager->getRange(variablePair.second).template toAdd<ValueType>(); result.variableToIdentityMap.emplace(variable.getExpressionVariable(), variableIdentity); @@ -297,10 +303,10 @@ namespace storm { STORM_LOG_TRACE("Created meta variables for global boolean variable: " << variablePair.first.getName() << " and " << variablePair.second.getName() << "."); result.rowMetaVariables.insert(variablePair.first); - result.variableToRowMetaVariableMap.emplace(variable.getExpressionVariable(), variablePair.first); + result.variableToRowMetaVariableMap->emplace(variable.getExpressionVariable(), variablePair.first); result.columnMetaVariables.insert(variablePair.second); - result.variableToColumnMetaVariableMap.emplace(variable.getExpressionVariable(), variablePair.second); + result.variableToColumnMetaVariableMap->emplace(variable.getExpressionVariable(), variablePair.second); storm::dd::Add<Type, ValueType> variableIdentity = result.manager->template getIdentity<ValueType>(variablePair.first).equals(result.manager->template getIdentity<ValueType>(variablePair.second)).template toAdd<ValueType>(); result.variableToIdentityMap.emplace(variable.getExpressionVariable(), variableIdentity); @@ -326,11 +332,11 @@ namespace storm { // This structure represents an edge. template<storm::dd::DdType Type, typename ValueType> struct EdgeDd { - EdgeDd(storm::dd::Add<Type> const& guardDd = storm::dd::Add<Type>(), storm::dd::Add<Type, ValueType> const& transitionsDd = storm::dd::Add<Type, ValueType>(), std::set<storm::expressions::Variable> const& writtenGlobalVariables = {}, std::set<storm::expressions::Variable> const& globalVariablesWrittenMultipleTimes = {}) { + EdgeDd(storm::dd::Add<Type> const& guardDd = storm::dd::Add<Type>(), storm::dd::Add<Type, ValueType> const& transitionsDd = storm::dd::Add<Type, ValueType>(), std::set<storm::expressions::Variable> const& writtenGlobalVariables = {}, std::set<storm::expressions::Variable> const& globalVariablesWrittenMultipleTimes = {}) : guardDd(guardDd), transitionsDd(transitionsDd), writtenGlobalVariables(writtenGlobalVariables), globalVariablesWrittenMultipleTimes(globalVariablesWrittenMultipleTimes) { // Intentionally left empty. } - EdgeDd(EdgeDd const& other) : globalVariablesWrittenMultipleTimes(other.globalVariablesWrittenMultipleTimes), writtenGlobalVariables(other.writtenGlobalVariables), guardDd(other.guardDd), transitionsDd(other.transitionsDd) { + EdgeDd(EdgeDd const& other) : guardDd(other.guardDd), transitionsDd(other.transitionsDd), writtenGlobalVariables(other.writtenGlobalVariables), globalVariablesWrittenMultipleTimes(other.globalVariablesWrittenMultipleTimes) { // Intentionally left empty. } @@ -344,10 +350,10 @@ namespace storm { return *this; } - std::set<storm::expressions::Variable> globalVariablesWrittenMultipleTimes; - std::set<storm::expressions::Variable> writtenGlobalVariables; storm::dd::Add<Type, ValueType> guardDd; storm::dd::Add<Type, ValueType> transitionsDd; + std::set<storm::expressions::Variable> writtenGlobalVariables; + std::set<storm::expressions::Variable> globalVariablesWrittenMultipleTimes; }; // This structure represents a subcomponent of a composition. @@ -509,11 +515,11 @@ namespace storm { std::set<storm::expressions::Variable> assignedVariables; for (auto const& assignment : destination.getAssignments()) { // Record the variable as being written. - STORM_LOG_TRACE("Assigning to variable " << variables.variableToRowMetaVariableMap.at(assignment.getExpressionVariable()).getName()); + STORM_LOG_TRACE("Assigning to variable " << variables.variableToRowMetaVariableMap->at(assignment.getExpressionVariable()).getName()); assignedVariables.insert(assignment.getExpressionVariable()); // Translate the written variable. - auto const& primedMetaVariable = variables.variableToColumnMetaVariableMap.at(assignment.getExpressionVariable()); + auto const& primedMetaVariable = variables.variableToColumnMetaVariableMap->at(assignment.getExpressionVariable()); storm::dd::Add<Type, ValueType> writtenVariable = variables.manager->template getIdentity<ValueType>(primedMetaVariable); // Translate the expression that is being assigned. diff --git a/src/builder/DdPrismModelBuilder.cpp b/src/builder/DdPrismModelBuilder.cpp index b013735d9..39a425380 100644 --- a/src/builder/DdPrismModelBuilder.cpp +++ b/src/builder/DdPrismModelBuilder.cpp @@ -31,7 +31,7 @@ namespace storm { template <storm::dd::DdType Type, typename ValueType> class DdPrismModelBuilder<Type, ValueType>::GenerationInformation { public: - GenerationInformation(storm::prism::Program const& program) : program(program), manager(std::make_shared<storm::dd::DdManager<Type>>()), rowMetaVariables(), variableToRowMetaVariableMap(), rowExpressionAdapter(nullptr), columnMetaVariables(), variableToColumnMetaVariableMap(), columnExpressionAdapter(nullptr), rowColumnMetaVariablePairs(), nondeterminismMetaVariables(), variableToIdentityMap(), allGlobalVariables(), moduleToIdentityMap() { + GenerationInformation(storm::prism::Program const& program) : program(program), manager(std::make_shared<storm::dd::DdManager<Type>>()), rowMetaVariables(), variableToRowMetaVariableMap(std::make_shared<std::map<storm::expressions::Variable, storm::expressions::Variable>>()), rowExpressionAdapter(std::make_shared<storm::adapters::AddExpressionAdapter<Type>>(manager, variableToRowMetaVariableMap)), columnMetaVariables(), variableToColumnMetaVariableMap((std::make_shared<std::map<storm::expressions::Variable, storm::expressions::Variable>>())), columnExpressionAdapter(std::make_shared<storm::adapters::AddExpressionAdapter<Type>>(manager, variableToColumnMetaVariableMap)), rowColumnMetaVariablePairs(), nondeterminismMetaVariables(), variableToIdentityMap(), allGlobalVariables(), moduleToIdentityMap() { // Initializes variables and identity DDs. createMetaVariablesAndIdentities(); @@ -47,12 +47,12 @@ namespace storm { // The meta variables for the row encoding. std::set<storm::expressions::Variable> rowMetaVariables; - std::map<storm::expressions::Variable, storm::expressions::Variable> variableToRowMetaVariableMap; + std::shared_ptr<std::map<storm::expressions::Variable, storm::expressions::Variable>> variableToRowMetaVariableMap; std::shared_ptr<storm::adapters::AddExpressionAdapter<Type>> rowExpressionAdapter; // The meta variables for the column encoding. std::set<storm::expressions::Variable> columnMetaVariables; - std::map<storm::expressions::Variable, storm::expressions::Variable> variableToColumnMetaVariableMap; + std::shared_ptr<std::map<storm::expressions::Variable, storm::expressions::Variable>> variableToColumnMetaVariableMap; std::shared_ptr<storm::adapters::AddExpressionAdapter<Type>> columnExpressionAdapter; // All pairs of row/column meta variables. @@ -116,10 +116,10 @@ namespace storm { STORM_LOG_TRACE("Created meta variables for global integer variable: " << variablePair.first.getName() << "[" << variablePair.first.getIndex() << "] and " << variablePair.second.getName() << "[" << variablePair.second.getIndex() << "]"); rowMetaVariables.insert(variablePair.first); - variableToRowMetaVariableMap.emplace(integerVariable.getExpressionVariable(), variablePair.first); + variableToRowMetaVariableMap->emplace(integerVariable.getExpressionVariable(), variablePair.first); columnMetaVariables.insert(variablePair.second); - variableToColumnMetaVariableMap.emplace(integerVariable.getExpressionVariable(), variablePair.second); + variableToColumnMetaVariableMap->emplace(integerVariable.getExpressionVariable(), variablePair.second); storm::dd::Add<Type, ValueType> variableIdentity = manager->template getIdentity<ValueType>(variablePair.first).equals(manager->template getIdentity<ValueType>(variablePair.second)).template toAdd<ValueType>() * manager->getRange(variablePair.first).template toAdd<ValueType>() * manager->getRange(variablePair.second).template toAdd<ValueType>(); variableToIdentityMap.emplace(integerVariable.getExpressionVariable(), variableIdentity); @@ -133,10 +133,10 @@ namespace storm { STORM_LOG_TRACE("Created meta variables for global boolean variable: " << variablePair.first.getName() << "[" << variablePair.first.getIndex() << "] and " << variablePair.second.getName() << "[" << variablePair.second.getIndex() << "]"); rowMetaVariables.insert(variablePair.first); - variableToRowMetaVariableMap.emplace(booleanVariable.getExpressionVariable(), variablePair.first); + variableToRowMetaVariableMap->emplace(booleanVariable.getExpressionVariable(), variablePair.first); columnMetaVariables.insert(variablePair.second); - variableToColumnMetaVariableMap.emplace(booleanVariable.getExpressionVariable(), variablePair.second); + variableToColumnMetaVariableMap->emplace(booleanVariable.getExpressionVariable(), variablePair.second); storm::dd::Add<Type, ValueType> variableIdentity = manager->template getIdentity<ValueType>(variablePair.first).equals(manager->template getIdentity<ValueType>(variablePair.second)).template toAdd<ValueType>(); variableToIdentityMap.emplace(booleanVariable.getExpressionVariable(), variableIdentity); @@ -157,10 +157,10 @@ namespace storm { STORM_LOG_TRACE("Created meta variables for integer variable: " << variablePair.first.getName() << "[" << variablePair.first.getIndex() << "] and " << variablePair.second.getName() << "[" << variablePair.second.getIndex() << "]"); rowMetaVariables.insert(variablePair.first); - variableToRowMetaVariableMap.emplace(integerVariable.getExpressionVariable(), variablePair.first); + variableToRowMetaVariableMap->emplace(integerVariable.getExpressionVariable(), variablePair.first); columnMetaVariables.insert(variablePair.second); - variableToColumnMetaVariableMap.emplace(integerVariable.getExpressionVariable(), variablePair.second); + variableToColumnMetaVariableMap->emplace(integerVariable.getExpressionVariable(), variablePair.second); storm::dd::Bdd<Type> variableIdentity = manager->template getIdentity<ValueType>(variablePair.first).equals(manager->template getIdentity<ValueType>(variablePair.second)) && manager->getRange(variablePair.first) && manager->getRange(variablePair.second); variableToIdentityMap.emplace(integerVariable.getExpressionVariable(), variableIdentity.template toAdd<ValueType>()); @@ -174,10 +174,10 @@ namespace storm { STORM_LOG_TRACE("Created meta variables for boolean variable: " << variablePair.first.getName() << "[" << variablePair.first.getIndex() << "] and " << variablePair.second.getName() << "[" << variablePair.second.getIndex() << "]"); rowMetaVariables.insert(variablePair.first); - variableToRowMetaVariableMap.emplace(booleanVariable.getExpressionVariable(), variablePair.first); + variableToRowMetaVariableMap->emplace(booleanVariable.getExpressionVariable(), variablePair.first); columnMetaVariables.insert(variablePair.second); - variableToColumnMetaVariableMap.emplace(booleanVariable.getExpressionVariable(), variablePair.second); + variableToColumnMetaVariableMap->emplace(booleanVariable.getExpressionVariable(), variablePair.second); storm::dd::Bdd<Type> variableIdentity = manager->template getIdentity<ValueType>(variablePair.first).equals(manager->template getIdentity<ValueType>(variablePair.second)) && manager->getRange(variablePair.first) && manager->getRange(variablePair.second); variableToIdentityMap.emplace(booleanVariable.getExpressionVariable(), variableIdentity.template toAdd<ValueType>()); @@ -591,11 +591,11 @@ namespace storm { std::set<storm::expressions::Variable> assignedVariables; for (auto const& assignment : assignments) { // Record the variable as being written. - STORM_LOG_TRACE("Assigning to variable " << generationInfo.variableToRowMetaVariableMap.at(assignment.getVariable()).getName()); + STORM_LOG_TRACE("Assigning to variable " << generationInfo.variableToRowMetaVariableMap->at(assignment.getVariable()).getName()); assignedVariables.insert(assignment.getVariable()); // Translate the written variable. - auto const& primedMetaVariable = generationInfo.variableToColumnMetaVariableMap.at(assignment.getVariable()); + auto const& primedMetaVariable = generationInfo.variableToColumnMetaVariableMap->at(assignment.getVariable()); storm::dd::Add<Type, ValueType> writtenVariable = generationInfo.manager->template getIdentity<ValueType>(primedMetaVariable); // Translate the expression that is being assigned. diff --git a/src/storage/jani/Model.cpp b/src/storage/jani/Model.cpp index 1d976d084..dc5c4f352 100644 --- a/src/storage/jani/Model.cpp +++ b/src/storage/jani/Model.cpp @@ -170,6 +170,10 @@ namespace storm { return *composition; } + void Model::setSystemComposition(std::shared_ptr<Composition> const& composition) { + this->composition = composition; + } + std::set<std::string> Model::getActionNames(bool includeSilent) const { std::set<std::string> result; for (auto const& entry : actionToIndex) { @@ -257,7 +261,6 @@ namespace storm { // Substitute constants in all global variables. for (auto& variable : result.getGlobalVariables()) { - std::cout << "init: " << variable.getInitialValue() << std::endl; variable.setInitialValue(variable.getInitialValue().substitute(constantSubstitution)); } for (auto& variable : result.getGlobalVariables().getBoundedIntegerVariables()) { diff --git a/src/storage/jani/VariableSet.cpp b/src/storage/jani/VariableSet.cpp index e3e183558..e7f2b42b7 100644 --- a/src/storage/jani/VariableSet.cpp +++ b/src/storage/jani/VariableSet.cpp @@ -36,12 +36,12 @@ namespace storm { template<typename VariableType> typename ConstVariables<VariableType>::const_iterator ConstVariables<VariableType>::begin() { - return boost::make_transform_iterator(it, Dereferencer<VariableType>()); + return boost::make_transform_iterator(it, Dereferencer<VariableType const>()); } template<typename VariableType> typename ConstVariables<VariableType>::const_iterator ConstVariables<VariableType>::end() { - return boost::make_transform_iterator(ite, Dereferencer<VariableType>()); + return boost::make_transform_iterator(ite, Dereferencer<VariableType const>()); } } @@ -148,6 +148,21 @@ namespace storm { bool VariableSet::containsUnboundedIntegerVariables() const { return !unboundedIntegerVariables.empty(); } + + template class detail::Dereferencer<Variable>; + template class detail::Dereferencer<BooleanVariable>; + template class detail::Dereferencer<BoundedIntegerVariable>; + template class detail::Dereferencer<UnboundedIntegerVariable>; + template class detail::Dereferencer<Variable const>; + template class detail::Dereferencer<BooleanVariable const>; + template class detail::Dereferencer<BoundedIntegerVariable const>; + template class detail::Dereferencer<UnboundedIntegerVariable const>; + template class detail::Variables<BooleanVariable>; + template class detail::Variables<BoundedIntegerVariable>; + template class detail::Variables<UnboundedIntegerVariable>; + template class detail::ConstVariables<BooleanVariable>; + template class detail::ConstVariables<BoundedIntegerVariable>; + template class detail::ConstVariables<UnboundedIntegerVariable>; } } diff --git a/src/storage/jani/VariableSet.h b/src/storage/jani/VariableSet.h index 8d5aa3aed..eeedcdc6f 100644 --- a/src/storage/jani/VariableSet.h +++ b/src/storage/jani/VariableSet.h @@ -26,9 +26,7 @@ namespace storm { class Variables { public: typedef typename std::vector<std::shared_ptr<VariableType>>::iterator input_iterator; - typedef typename std::vector<std::shared_ptr<VariableType>>::const_iterator const_input_iterator; typedef boost::transform_iterator<Dereferencer<VariableType>, input_iterator> iterator; - typedef boost::transform_iterator<Dereferencer<VariableType const>, const_input_iterator> const_iterator; Variables(input_iterator it, input_iterator ite); @@ -43,9 +41,7 @@ namespace storm { template<typename VariableType> class ConstVariables { public: - typedef typename std::vector<std::shared_ptr<VariableType>>::iterator input_iterator; typedef typename std::vector<std::shared_ptr<VariableType>>::const_iterator const_input_iterator; - typedef boost::transform_iterator<Dereferencer<VariableType>, input_iterator> iterator; typedef boost::transform_iterator<Dereferencer<VariableType const>, const_input_iterator> const_iterator; ConstVariables(const_input_iterator it, const_input_iterator ite); diff --git a/src/storage/prism/Program.cpp b/src/storage/prism/Program.cpp index 42cd1eb8a..711f68ad8 100644 --- a/src/storage/prism/Program.cpp +++ b/src/storage/prism/Program.cpp @@ -1610,6 +1610,9 @@ namespace storm { janiModel.addAutomaton(automaton); } + // Set the standard system composition. This is possible, because we reject non-standard compositions anyway. + janiModel.setSystemComposition(janiModel.getStandardSystemComposition()); + return janiModel; } diff --git a/test/functional/builder/DdJaniModelBuilderTest.cpp b/test/functional/builder/DdJaniModelBuilderTest.cpp index 6b73c1a59..486a1b26e 100644 --- a/test/functional/builder/DdJaniModelBuilderTest.cpp +++ b/test/functional/builder/DdJaniModelBuilderTest.cpp @@ -16,34 +16,108 @@ TEST(DdJaniModelBuilderTest_Sylvan, Dtmc) { storm::jani::Model janiModel = program.toJani(); storm::builder::DdJaniModelBuilder<storm::dd::DdType::Sylvan, double> builder(janiModel); + auto t1 = std::chrono::high_resolution_clock::now(); std::shared_ptr<storm::models::symbolic::Model<storm::dd::DdType::Sylvan>> model = builder.translate(); - EXPECT_EQ(13ul, model->getNumberOfStates()); - EXPECT_EQ(20ul, model->getNumberOfTransitions()); + auto t2 = std::chrono::high_resolution_clock::now(); + std::cout << "die: " << std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1).count() << std::endl; + +// EXPECT_EQ(13ul, model->getNumberOfStates()); +// EXPECT_EQ(20ul, model->getNumberOfTransitions()); program = storm::parser::PrismParser::parse(STORM_CPP_TESTS_BASE_PATH "/functional/builder/brp-16-2.pm"); janiModel = program.toJani(); builder = storm::builder::DdJaniModelBuilder<storm::dd::DdType::Sylvan, double>(janiModel); + t1 = std::chrono::high_resolution_clock::now(); + model = builder.translate(); + t2 = std::chrono::high_resolution_clock::now(); + std::cout << "brp: " << std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1).count() << std::endl; +// EXPECT_EQ(677ul, model->getNumberOfStates()); +// EXPECT_EQ(867ul, model->getNumberOfTransitions()); + + program = storm::parser::PrismParser::parse(STORM_CPP_TESTS_BASE_PATH "/functional/builder/crowds-5-5.pm"); + janiModel = program.toJani(); + builder = storm::builder::DdJaniModelBuilder<storm::dd::DdType::Sylvan, double>(janiModel); + t1 = std::chrono::high_resolution_clock::now(); + model = builder.translate(); + t2 = std::chrono::high_resolution_clock::now(); + std::cout << "crowds: " << std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1).count() << std::endl; +// EXPECT_EQ(8607ul, model->getNumberOfStates()); +// EXPECT_EQ(15113ul, model->getNumberOfTransitions()); + + program = storm::parser::PrismParser::parse(STORM_CPP_TESTS_BASE_PATH "/functional/builder/leader-3-5.pm"); + janiModel = program.toJani(); + builder = storm::builder::DdJaniModelBuilder<storm::dd::DdType::Sylvan, double>(janiModel); + t1 = std::chrono::high_resolution_clock::now(); + model = builder.translate(); + t2 = std::chrono::high_resolution_clock::now(); + std::cout << "lead: " << std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1).count() << std::endl; +// EXPECT_EQ(273ul, model->getNumberOfStates()); +// EXPECT_EQ(397ul, model->getNumberOfTransitions()); + + program = storm::parser::PrismParser::parse(STORM_CPP_TESTS_BASE_PATH "/functional/builder/nand-5-2.pm"); + janiModel = program.toJani(); + + t1 = std::chrono::high_resolution_clock::now(); + builder = storm::builder::DdJaniModelBuilder<storm::dd::DdType::Sylvan, double>(janiModel); + model = builder.translate(); + t2 = std::chrono::high_resolution_clock::now(); + std::cout << "nand: " << std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1).count() << std::endl; +// EXPECT_EQ(1728ul, model->getNumberOfStates()); +// EXPECT_EQ(2505ul, model->getNumberOfTransitions()); +} + +TEST(DdJaniModelBuilderTest_Cudd, Dtmc) { + storm::prism::Program program = storm::parser::PrismParser::parse(STORM_CPP_TESTS_BASE_PATH "/functional/builder/die.pm"); + storm::jani::Model janiModel = program.toJani(); + + storm::builder::DdJaniModelBuilder<storm::dd::DdType::CUDD, double> builder(janiModel); + auto t1 = std::chrono::high_resolution_clock::now(); + std::shared_ptr<storm::models::symbolic::Model<storm::dd::DdType::CUDD>> model = builder.translate(); + auto t2 = std::chrono::high_resolution_clock::now(); + std::cout << "die: " << std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1).count() << std::endl; + + // EXPECT_EQ(13ul, model->getNumberOfStates()); + // EXPECT_EQ(20ul, model->getNumberOfTransitions()); + + program = storm::parser::PrismParser::parse(STORM_CPP_TESTS_BASE_PATH "/functional/builder/brp-16-2.pm"); + janiModel = program.toJani(); + builder = storm::builder::DdJaniModelBuilder<storm::dd::DdType::CUDD, double>(janiModel); + t1 = std::chrono::high_resolution_clock::now(); model = builder.translate(); - EXPECT_EQ(677ul, model->getNumberOfStates()); - EXPECT_EQ(867ul, model->getNumberOfTransitions()); + t2 = std::chrono::high_resolution_clock::now(); + std::cout << "brp: " << std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1).count() << std::endl; + // EXPECT_EQ(677ul, model->getNumberOfStates()); + // EXPECT_EQ(867ul, model->getNumberOfTransitions()); program = storm::parser::PrismParser::parse(STORM_CPP_TESTS_BASE_PATH "/functional/builder/crowds-5-5.pm"); janiModel = program.toJani(); + builder = storm::builder::DdJaniModelBuilder<storm::dd::DdType::CUDD, double>(janiModel); + t1 = std::chrono::high_resolution_clock::now(); model = builder.translate(); - EXPECT_EQ(8607ul, model->getNumberOfStates()); - EXPECT_EQ(15113ul, model->getNumberOfTransitions()); + t2 = std::chrono::high_resolution_clock::now(); + std::cout << "crowds: " << std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1).count() << std::endl; + // EXPECT_EQ(8607ul, model->getNumberOfStates()); + // EXPECT_EQ(15113ul, model->getNumberOfTransitions()); program = storm::parser::PrismParser::parse(STORM_CPP_TESTS_BASE_PATH "/functional/builder/leader-3-5.pm"); janiModel = program.toJani(); + builder = storm::builder::DdJaniModelBuilder<storm::dd::DdType::CUDD, double>(janiModel); + t1 = std::chrono::high_resolution_clock::now(); model = builder.translate(); - EXPECT_EQ(273ul, model->getNumberOfStates()); - EXPECT_EQ(397ul, model->getNumberOfTransitions()); + t2 = std::chrono::high_resolution_clock::now(); + std::cout << "lead: " << std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1).count() << std::endl; + // EXPECT_EQ(273ul, model->getNumberOfStates()); + // EXPECT_EQ(397ul, model->getNumberOfTransitions()); program = storm::parser::PrismParser::parse(STORM_CPP_TESTS_BASE_PATH "/functional/builder/nand-5-2.pm"); janiModel = program.toJani(); + builder = storm::builder::DdJaniModelBuilder<storm::dd::DdType::CUDD, double>(janiModel); + t1 = std::chrono::high_resolution_clock::now(); model = builder.translate(); - EXPECT_EQ(1728ul, model->getNumberOfStates()); - EXPECT_EQ(2505ul, model->getNumberOfTransitions()); + t2 = std::chrono::high_resolution_clock::now(); + std::cout << "nand: " << std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1).count() << std::endl; + // EXPECT_EQ(1728ul, model->getNumberOfStates()); + // EXPECT_EQ(2505ul, model->getNumberOfTransitions()); } //TEST(DdPrismModelBuilderTest_Cudd, Dtmc) { diff --git a/test/functional/builder/DdPrismModelBuilderTest.cpp b/test/functional/builder/DdPrismModelBuilderTest.cpp index b95039058..f89bb19ab 100644 --- a/test/functional/builder/DdPrismModelBuilderTest.cpp +++ b/test/functional/builder/DdPrismModelBuilderTest.cpp @@ -13,27 +13,42 @@ TEST(DdPrismModelBuilderTest_Sylvan, Dtmc) { storm::prism::Program program = storm::parser::PrismParser::parse(STORM_CPP_TESTS_BASE_PATH "/functional/builder/die.pm"); + auto t1 = std::chrono::high_resolution_clock::now(); std::shared_ptr<storm::models::symbolic::Model<storm::dd::DdType::Sylvan>> model = storm::builder::DdPrismModelBuilder<storm::dd::DdType::Sylvan>().translateProgram(program); + auto t2 = std::chrono::high_resolution_clock::now(); + std::cout << "die: " << std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1).count() << std::endl; EXPECT_EQ(13ul, model->getNumberOfStates()); EXPECT_EQ(20ul, model->getNumberOfTransitions()); program = storm::parser::PrismParser::parse(STORM_CPP_TESTS_BASE_PATH "/functional/builder/brp-16-2.pm"); + t1 = std::chrono::high_resolution_clock::now(); model = storm::builder::DdPrismModelBuilder<storm::dd::DdType::Sylvan>().translateProgram(program); + t2 = std::chrono::high_resolution_clock::now(); + std::cout << "brp: " << std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1).count() << std::endl; EXPECT_EQ(677ul, model->getNumberOfStates()); EXPECT_EQ(867ul, model->getNumberOfTransitions()); program = storm::parser::PrismParser::parse(STORM_CPP_TESTS_BASE_PATH "/functional/builder/crowds-5-5.pm"); + t1 = std::chrono::high_resolution_clock::now(); model = storm::builder::DdPrismModelBuilder<storm::dd::DdType::Sylvan>().translateProgram(program); + t2 = std::chrono::high_resolution_clock::now(); + std::cout << "crowds: " << std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1).count() << std::endl; EXPECT_EQ(8607ul, model->getNumberOfStates()); EXPECT_EQ(15113ul, model->getNumberOfTransitions()); program = storm::parser::PrismParser::parse(STORM_CPP_TESTS_BASE_PATH "/functional/builder/leader-3-5.pm"); + t1 = std::chrono::high_resolution_clock::now(); model = storm::builder::DdPrismModelBuilder<storm::dd::DdType::Sylvan>().translateProgram(program); + t2 = std::chrono::high_resolution_clock::now(); + std::cout << "lead: " << std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1).count() << std::endl; EXPECT_EQ(273ul, model->getNumberOfStates()); EXPECT_EQ(397ul, model->getNumberOfTransitions()); program = storm::parser::PrismParser::parse(STORM_CPP_TESTS_BASE_PATH "/functional/builder/nand-5-2.pm"); + t1 = std::chrono::high_resolution_clock::now(); model = storm::builder::DdPrismModelBuilder<storm::dd::DdType::Sylvan>().translateProgram(program); + t2 = std::chrono::high_resolution_clock::now(); + std::cout << "nand: " << std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1).count() << std::endl; EXPECT_EQ(1728ul, model->getNumberOfStates()); EXPECT_EQ(2505ul, model->getNumberOfTransitions()); }