diff --git a/CMakeLists.txt b/CMakeLists.txt index 7913af7d7..77b5c64a0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -252,10 +252,8 @@ file(GLOB_RECURSE STORM_SOLVER_FILES ${PROJECT_SOURCE_DIR}/src/solver/*.h ${PROJ file(GLOB STORM_STORAGE_FILES ${PROJECT_SOURCE_DIR}/src/storage/*.h ${PROJECT_SOURCE_DIR}/src/storage/*.cpp) file(GLOB_RECURSE STORM_STORAGE_DD_FILES ${PROJECT_SOURCE_DIR}/src/storage/dd/*.h ${PROJECT_SOURCE_DIR}/src/storage/dd/*.cpp) file(GLOB_RECURSE STORM_STORAGE_EXPRESSIONS_FILES ${PROJECT_SOURCE_DIR}/src/storage/expressions/*.h ${PROJECT_SOURCE_DIR}/src/storage/expressions/*.cpp) +file(GLOB_RECURSE STORM_STORAGE_PRISM_FILES ${PROJECT_SOURCE_DIR}/src/storage/prism/*.h ${PROJECT_SOURCE_DIR}/src/storage/prism/*.cpp) file(GLOB_RECURSE STORM_UTILITY_FILES ${PROJECT_SOURCE_DIR}/src/utility/*.h ${PROJECT_SOURCE_DIR}/src/utility/*.cpp) -file(GLOB STORM_IR_FILES ${PROJECT_SOURCE_DIR}/src/ir/*.h ${PROJECT_SOURCE_DIR}/src/ir/*.cpp) -file(GLOB_RECURSE STORM_IR_EXPRESSIONS_FILES ${PROJECT_SOURCE_DIR}/src/ir/expressions/*.h ${PROJECT_SOURCE_DIR}/src/ir/expressions/*.cpp) - # Test Sources # Note that the tests also need the source files, except for the main file file(GLOB_RECURSE STORM_FUNCTIONAL_TEST_FILES ${STORM_CPP_TESTS_BASE_PATH}/functional/*.h ${STORM_CPP_TESTS_BASE_PATH}/functional/*.cpp) @@ -274,8 +272,6 @@ source_group(formula\\csl FILES ${STORM_FORMULA_CSL_FILES}) source_group(formula\\ltl FILES ${STORM_FORMULA_LTL_FILES}) source_group(formula\\prctl FILES ${STORM_FORMULA_PRCTL_FILES}) source_group(generated FILES ${STORM_BUILD_HEADERS}) -source_group(ir FILES ${STORM_IR_FILES}) -source_group(ir\\expressions FILES ${STORM_IR_EXPRESSIONS_FILES}) source_group(modelchecker FILES ${STORM_MODELCHECKER_FILES}) source_group(counterexamples FILES ${STORM_COUNTEREXAMPLES_FILES}) source_group(models FILES ${STORM_MODELS_FILES}) @@ -286,6 +282,7 @@ source_group(solver FILES ${STORM_SOLVER_FILES}) source_group(storage FILES ${STORM_STORAGE_FILES}) source_group(storage\\dd FILES ${STORM_STORAGE_DD_FILES}) source_group(storage\\expressions FILES ${STORM_STORAGE_EXPRESSIONS_FILES}) +source_group(storage\\prism FILES ${STORM_STORAGE_PRISM_FILES}) source_group(utility FILES ${STORM_UTILITY_FILES}) source_group(functional-test FILES ${STORM_FUNCTIONAL_TEST_FILES}) source_group(performance-test FILES ${STORM_PERFORMANCE_TEST_FILES}) diff --git a/src/ir/Assignment.cpp b/src/ir/Assignment.cpp deleted file mode 100644 index a50847afb..000000000 --- a/src/ir/Assignment.cpp +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Assignment.cpp - * - * Created on: 12.01.2013 - * Author: Christian Dehnert - */ - -#include <sstream> - -#include "Assignment.h" -#include "src/parser/prismparser/VariableState.h" - -namespace storm { - namespace ir { - - Assignment::Assignment() : variableName(), expression() { - // Nothing to do here. - } - - Assignment::Assignment(std::string const& variableName, std::unique_ptr<storm::ir::expressions::BaseExpression>&& expression) - : variableName(variableName), expression(std::move(expression)) { - // Nothing to do here. - } - - Assignment::Assignment(Assignment const& oldAssignment, std::map<std::string, std::string> const& renaming, storm::parser::prism::VariableState const& variableState) - : variableName(oldAssignment.variableName), expression(oldAssignment.expression->clone(renaming, variableState)) { - auto renamingPair = renaming.find(oldAssignment.variableName); - if (renamingPair != renaming.end()) { - this->variableName = renamingPair->second; - } - } - - Assignment::Assignment(Assignment const& otherAssignment) : variableName(otherAssignment.variableName), expression() { - if (otherAssignment.expression != nullptr) { - expression = otherAssignment.expression->clone(); - } - } - - Assignment& Assignment::operator=(Assignment const& otherAssignment) { - if (this != &otherAssignment) { - this->variableName = otherAssignment.variableName; - this->expression = otherAssignment.expression->clone(); - } - - return *this; - } - - std::string const& Assignment::getVariableName() const { - return variableName; - } - - std::unique_ptr<storm::ir::expressions::BaseExpression> const& Assignment::getExpression() const { - return expression; - } - - std::string Assignment::toString() const { - std::stringstream result; - result << "(" << variableName << "' = " << expression->toString() << ")"; - return result.str(); - } - - } // namespace ir -} // namespace storm diff --git a/src/ir/Assignment.h b/src/ir/Assignment.h deleted file mode 100644 index 12d96a413..000000000 --- a/src/ir/Assignment.h +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Assignment.h - * - * Created on: 06.01.2013 - * Author: Christian Dehnert - */ - -#ifndef STORM_IR_ASSIGNMENT_H_ -#define STORM_IR_ASSIGNMENT_H_ - -#include <memory> - -#include "expressions/BaseExpression.h" - -namespace storm { - - namespace parser { - namespace prism { - class VariableState; - } // namespace prismparser - } // namespace parser - - namespace ir { - - /*! - * A class representing the assignment of an expression to a variable. - */ - class Assignment { - public: - /*! - * Default constructor. Creates an empty assignment. - */ - Assignment(); - - /*! - * Constructs an assignment using the given variable name and expression. - * - * @param variableName The variable that this assignment targets. - * @param expression The expression to assign to the variable. - */ - Assignment(std::string const& variableName, std::unique_ptr<storm::ir::expressions::BaseExpression>&& expression); - - /*! - * Creates a copy of the given assignment and performs the provided renaming. - * - * @param oldAssignment The assignment to copy. - * @param renaming A mapping from names that are to be renamed to the names they are to be - * replaced with. - * @param variableState An object knowing about the variables in the system. - */ - Assignment(Assignment const& oldAssignment, std::map<std::string, std::string> const& renaming, storm::parser::prism::VariableState const& variableState); - - /*! - * Performs a deep-copy of the given assignment. - * - * @param otherAssignment The assignment to copy. - */ - Assignment(Assignment const& otherAssignment); - - /*! - * Performs a deep-copy of the given assignment and assigns it to the current one. - * - * @param otherAssignment The assignment to assign. - */ - Assignment& operator=(Assignment const& otherAssignment); - - /*! - * Retrieves the name of the variable that this assignment targets. - * - * @return The name of the variable that this assignment targets. - */ - std::string const& getVariableName() const; - - /*! - * Retrieves the expression that is assigned to the variable. - * - * @return The expression that is assigned to the variable. - */ - std::unique_ptr<storm::ir::expressions::BaseExpression> const& getExpression() const; - - /*! - * Retrieves a string representation of this assignment. - * @returns a string representation of this assignment. - */ - std::string toString() const; - - private: - // The name of the variable that this assignment targets. - std::string variableName; - - // The expression that is assigned to the variable. - std::unique_ptr<storm::ir::expressions::BaseExpression> expression; - }; - - } // namespace ir -} // namespace storm - -#endif /* STORM_IR_ASSIGNMENT_H_ */ diff --git a/src/ir/BooleanVariable.cpp b/src/ir/BooleanVariable.cpp deleted file mode 100644 index 843655be9..000000000 --- a/src/ir/BooleanVariable.cpp +++ /dev/null @@ -1,49 +0,0 @@ -/* - * BooleanVariable.cpp - * - * Created on: 12.01.2013 - * Author: Christian Dehnert - */ - -#include <sstream> - -#include "BooleanVariable.h" -#include "src/parser/prismparser/VariableState.h" - -namespace storm { - namespace ir { - - BooleanVariable::BooleanVariable() : Variable() { - // Nothing to do here. - } - - BooleanVariable::BooleanVariable(uint_fast64_t localIndex, uint_fast64_t globalIndex, std::string const& variableName, std::unique_ptr<storm::ir::expressions::BaseExpression>&& initialValue) - : Variable(localIndex, globalIndex, variableName, std::move(initialValue)) { - // Nothing to do here. - } - - BooleanVariable::BooleanVariable(BooleanVariable const& oldVariable, std::string const& newName, uint_fast64_t newGlobalIndex, std::map<std::string, std::string> const& renaming, storm::parser::prism::VariableState const& variableState) - : Variable(oldVariable, newName, newGlobalIndex, renaming, variableState) { - // Nothing to do here. - } - - BooleanVariable& BooleanVariable::operator=(BooleanVariable const& otherVariable) { - if (this != &otherVariable) { - Variable::operator=(otherVariable); - } - - return *this; - } - - std::string BooleanVariable::toString() const { - std::stringstream result; - result << this->getName() << ": bool"; - if (this->getInitialValue() != nullptr) { - result << " init " << this->getInitialValue()->toString(); - } - result << ";"; - return result.str(); - } - - } // namespace ir -} // namespace storm diff --git a/src/ir/BooleanVariable.h b/src/ir/BooleanVariable.h deleted file mode 100644 index b968d7890..000000000 --- a/src/ir/BooleanVariable.h +++ /dev/null @@ -1,70 +0,0 @@ -/* - * BooleanVariable.h - * - * Created on: 08.01.2013 - * Author: Christian Dehnert - */ - -#ifndef STORM_IR_BOOLEANVARIABLE_H_ -#define STORM_IR_BOOLEANVARIABLE_H_ - -#include <memory> -#include <map> - -#include "src/ir/Variable.h" - -namespace storm { - - namespace parser { - namespace prism { - class VariableState; - } // namespace prismparser - } // namespace parser - - namespace ir { - - /*! - * A class representing a boolean variable. - */ - class BooleanVariable : public Variable { - public: - /*! - * Default constructor. Creates a boolean variable without a name. - */ - BooleanVariable(); - - /*! - * Creates a boolean variable with the given name and the given initial value. - * - * @param localIndex A module-local unique index for the variable. - * @param globalIndex A globally unique index for the variable. - * @param variableName The name of the variable. - * @param initialValue The expression that defines the initial value of the variable. - */ - BooleanVariable(uint_fast64_t localIndex, uint_fast64_t globalIndex, std::string const& variableName, std::unique_ptr<storm::ir::expressions::BaseExpression>&& initialValue = nullptr); - - /*! - * Creates a copy of the given boolean variable and performs the provided renaming. - * - * @param oldVariable The variable to copy. - * @param newName New name of this variable. - * @param newGlobalIndex The new global index of the variable. - * @param renaming A mapping from names that are to be renamed to the names they are to be - * replaced with. - * @param variableState An object knowing about the variables in the system. - */ - BooleanVariable(BooleanVariable const& oldVariable, std::string const& newName, uint_fast64_t newGlobalIndex, std::map<std::string, std::string> const& renaming, storm::parser::prism::VariableState const& variableState); - - BooleanVariable& operator=(BooleanVariable const& otherVariable); - - /*! - * Retrieves a string representation of this variable. - * @returns a string representation of this variable. - */ - std::string toString() const; - }; - - } // namespace ir -} // namespace storm - -#endif /* STORM_IR_BOOLEANVARIABLE_H_ */ diff --git a/src/ir/IR.h b/src/ir/IR.h deleted file mode 100644 index 80a794002..000000000 --- a/src/ir/IR.h +++ /dev/null @@ -1,25 +0,0 @@ -/* - * IR.h - * - * Created on: 06.01.2013 - * Author: Christian Dehnert - */ - -#ifndef STORM_IR_IR_H_ -#define STORM_IR_IR_H_ - -// Bundle all headers to make it easy to include them. -#include "expressions/Expressions.h" -#include "Assignment.h" -#include "Update.h" -#include "Command.h" -#include "Variable.h" -#include "BooleanVariable.h" -#include "IntegerVariable.h" -#include "Module.h" -#include "StateReward.h" -#include "TransitionReward.h" -#include "RewardModel.h" -#include "Program.h" - -#endif /* STORM_IR_IR_H_ */ diff --git a/src/ir/IntegerVariable.cpp b/src/ir/IntegerVariable.cpp deleted file mode 100644 index b98b30d07..000000000 --- a/src/ir/IntegerVariable.cpp +++ /dev/null @@ -1,72 +0,0 @@ -/* - * IntegerVariable.cpp - * - * Created on: 12.01.2013 - * Author: Christian Dehnert - */ - -#include <sstream> -#include <iostream> - -#include "IntegerVariable.h" -#include "src/parser/prismparser/VariableState.h" - -namespace storm { - namespace ir { - - IntegerVariable::IntegerVariable() : lowerBound(), upperBound() { - // Nothing to do here. - } - - IntegerVariable::IntegerVariable(uint_fast64_t localIndex, uint_fast64_t globalIndex, std::string const& variableName, std::unique_ptr<storm::ir::expressions::BaseExpression>&& lowerBound, std::unique_ptr<storm::ir::expressions::BaseExpression>&& upperBound, std::unique_ptr<storm::ir::expressions::BaseExpression>&& initialValue) - : Variable(localIndex, globalIndex, variableName, std::move(initialValue)), lowerBound(std::move(lowerBound)), upperBound(std::move(upperBound)) { - // Nothing to do here. - } - - IntegerVariable::IntegerVariable(IntegerVariable const& oldVariable, std::string const& newName, uint_fast64_t newGlobalIndex, std::map<std::string, std::string> const& renaming, storm::parser::prism::VariableState const& variableState) - : Variable(oldVariable, newName, newGlobalIndex, renaming, variableState), lowerBound(oldVariable.lowerBound->clone(renaming, variableState)), upperBound(oldVariable.upperBound->clone(renaming, variableState)) { - // Nothing to do here. - } - - IntegerVariable::IntegerVariable(IntegerVariable const& otherVariable) : Variable(otherVariable.getLocalIndex(), otherVariable.getGlobalIndex(), otherVariable.getName(), nullptr), lowerBound(), upperBound() { - if (otherVariable.getInitialValue() != nullptr) { - setInitialValue(otherVariable.getInitialValue()->clone()); - } - if (otherVariable.lowerBound != nullptr) { - lowerBound = otherVariable.lowerBound->clone(); - } - if (otherVariable.upperBound != nullptr) { - upperBound = otherVariable.upperBound->clone(); - } - } - - IntegerVariable& IntegerVariable::operator=(IntegerVariable const& otherVariable) { - if (this != &otherVariable) { - Variable::operator=(otherVariable); - this->lowerBound = otherVariable.lowerBound->clone(); - this->upperBound = otherVariable.upperBound->clone(); - } - - return *this; - } - - std::unique_ptr<storm::ir::expressions::BaseExpression> const& IntegerVariable::getLowerBound() const { - return this->lowerBound; - } - - std::unique_ptr<storm::ir::expressions::BaseExpression> const& IntegerVariable::getUpperBound() const { - return this->upperBound; - } - - std::string IntegerVariable::toString() const { - std::stringstream result; - result << this->getName() << ": [" << lowerBound->toString() << ".." << upperBound->toString() << "]"; - if (this->getInitialValue() != nullptr) { - result << " init " + this->getInitialValue()->toString(); - } - result << ";"; - return result.str(); - } - - } // namespace ir -} // namespace storm diff --git a/src/ir/IntegerVariable.h b/src/ir/IntegerVariable.h deleted file mode 100644 index 930e1d0b8..000000000 --- a/src/ir/IntegerVariable.h +++ /dev/null @@ -1,98 +0,0 @@ -/* - * IntegerVariable.h - * - * Created on: 08.01.2013 - * Author: Christian Dehnert - */ - -#ifndef STORM_IR_INTEGERVARIABLE_H_ -#define STORM_IR_INTEGERVARIABLE_H_ - -#include <memory> - -#include "src/ir/Variable.h" -#include "expressions/BaseExpression.h" - -namespace storm { - - namespace parser { - namespace prism { - class VariableState; - } // namespace prismparser - } // namespace parser - - namespace ir { - - /*! - * A class representing an integer variable. - */ - class IntegerVariable : public Variable { - public: - /*! - * Default constructor. Creates an integer variable without a name and lower and upper bounds. - */ - IntegerVariable(); - - /*! - * Creates a boolean variable with the given name and the given initial value. - * - * @param localIndex A module-local unique index for the variable. - * @param globalIndex A globally unique index for the variable. - * @param variableName The name of the variable. - * @param lowerBound the lower bound of the domain of the variable. - * @param upperBound the upper bound of the domain of the variable. - * @param initialValue the expression that defines the initial value of the variable. - */ - IntegerVariable(uint_fast64_t localIndex, uint_fast64_t globalIndex, std::string const& variableName, std::unique_ptr<storm::ir::expressions::BaseExpression>&& lowerBound, std::unique_ptr<storm::ir::expressions::BaseExpression>&& upperBound, std::unique_ptr<storm::ir::expressions::BaseExpression>&& initialValue = nullptr); - - /*! - * Creates a copy of the given integer variable and performs the provided renaming. - * - * @param oldVariable The variable to copy. - * @param newName New name of this variable. - * @param newGlobalIndex The new global index of the variable. - * @param renaming A mapping from names that are to be renamed to the names they are to be - * replaced with. - * @param variableState An object knowing about the variables in the system. - */ - IntegerVariable(IntegerVariable const& oldVariable, std::string const& newName, uint_fast64_t newGlobalIndex, std::map<std::string, std::string> const& renaming, storm::parser::prism::VariableState const& variableState); - - /*! - * Performs a deep-copy of the given variable. - * - * @param otherVariable The variable to copy. - */ - IntegerVariable(IntegerVariable const& otherVariable); - - IntegerVariable& operator=(IntegerVariable const& otherVariable); - - /*! - * Retrieves the lower bound for this integer variable. - * @returns the lower bound for this integer variable. - */ - std::unique_ptr<storm::ir::expressions::BaseExpression> const& getLowerBound() const; - - /*! - * Retrieves the upper bound for this integer variable. - * @returns the upper bound for this integer variable. - */ - std::unique_ptr<storm::ir::expressions::BaseExpression> const& getUpperBound() const; - - /*! - * Retrieves a string representation of this variable. - * @returns a string representation of this variable. - */ - std::string toString() const; - - private: - // The lower bound of the domain of the variable. - std::unique_ptr<storm::ir::expressions::BaseExpression> lowerBound; - - // The upper bound of the domain of the variable. - std::unique_ptr<storm::ir::expressions::BaseExpression> upperBound; - }; - - } // namespace ir -} // namespace storm - -#endif /* STORM_IR_INTEGERVARIABLE_H_ */ diff --git a/src/ir/Program.h b/src/ir/Program.h deleted file mode 100644 index 8ce96bc87..000000000 --- a/src/ir/Program.h +++ /dev/null @@ -1,318 +0,0 @@ -/* - * Program.h - * - * Created on: 04.01.2013 - * Author: Christian Dehnert - */ - -#ifndef STORM_IR_PROGRAM_H_ -#define STORM_IR_PROGRAM_H_ - -#include <map> -#include <vector> -#include <memory> -#include <set> -#include <boost/container/flat_set.hpp> - -#include "expressions/BaseExpression.h" -#include "expressions/BooleanConstantExpression.h" -#include "expressions/IntegerConstantExpression.h" -#include "expressions/DoubleConstantExpression.h" -#include "Module.h" -#include "RewardModel.h" - -namespace storm { - namespace ir { - - /*! - * A class representing a program. - */ - class Program { - public: - - /*! - * An enum for the different model types. - */ - enum ModelType {UNDEFINED, DTMC, CTMC, MDP, CTMDP}; - - /*! - * Default constructor. Creates an empty program. - */ - Program(); - - /*! - * Creates a program with the given model type, undefined constants, modules, rewards and labels. - * - * @param modelType The type of the model that this program gives rise to. - * @param booleanUndefinedConstantExpressions A map of undefined boolean constants to their - * expression nodes. - * @param integerUndefinedConstantExpressions A map of undefined integer constants to their - * expression nodes. - * @param doubleUndefinedConstantExpressions A map of undefined double constants to their - * expression nodes. - * @param globalBooleanVariables A list of global boolean variables. - * @param globalIntegerVariables A list of global integer variables. - * @param globalBooleanVariableToIndexMap A mapping from global boolean variable names to the index in the - * list of global boolean variables. - * @param globalIntegerVariableToIndexMap A mapping from global integer variable names to the index in the - * list of global integer variables. - * @param modules The modules of the program. - * @param rewards The reward models of the program. - * @param labels The labels defined for this model. - */ - Program(ModelType modelType, - std::map<std::string, std::unique_ptr<storm::ir::expressions::BooleanConstantExpression>> const& booleanUndefinedConstantExpressions, - std::map<std::string, std::unique_ptr<storm::ir::expressions::IntegerConstantExpression>> const& integerUndefinedConstantExpressions, - std::map<std::string, std::unique_ptr<storm::ir::expressions::DoubleConstantExpression>> const& doubleUndefinedConstantExpressions, - std::vector<BooleanVariable> const& globalBooleanVariables, - std::vector<IntegerVariable> const& globalIntegerVariables, - std::map<std::string, uint_fast64_t> const& globalBooleanVariableToIndexMap, - std::map<std::string, uint_fast64_t> const& globalIntegerVariableToIndexMap, - std::vector<storm::ir::Module> const& modules, - std::map<std::string, storm::ir::RewardModel> const& rewards, - std::map<std::string, std::unique_ptr<storm::ir::expressions::BaseExpression>> const& labels); - - /*! - * Performs a deep-copy of the given program. - * - * @param otherProgram The program to copy. - */ - Program(Program const& otherProgram); - - /*! - * Performs a deep-copy of the given program and assigns it to the current one. - * - * @param otherProgram The program to assign. - */ - Program& operator=(Program const& otherProgram); - - /*! - * Retrieves the number of modules in the program. - * - * @return The number of modules in the program. - */ - uint_fast64_t getNumberOfModules() const; - - /*! - * Retrieves a reference to the module with the given index. - * - * @param index The index of the module to retrieve. - * @return The module with the given index. - */ - storm::ir::Module const& getModule(uint_fast64_t index) const; - - /*! - * Retrieves the model type of the model. - * - * @return The type of the model. - */ - ModelType getModelType() const; - - /*! - * Retrieves a string representation of this program. - * - * @return A string representation of this program. - */ - std::string toString() const; - - /*! - * Retrieves a reference to the global boolean variable with the given index. - * - * @return A reference to the global boolean variable with the given index. - */ - storm::ir::BooleanVariable const& getGlobalBooleanVariable(uint_fast64_t index) const; - - /*! - * Retrieves a reference to the global integer variable with the given index. - * - * @return A reference to the global integer variable with the given index. - */ - storm::ir::IntegerVariable const& getGlobalIntegerVariable(uint_fast64_t index) const; - - /*! - * Retrieves the set of actions present in this module. - * - * @return The set of actions present in this module. - */ - std::set<std::string> const& getActions() const; - - /*! - * Retrieves the indices of all modules within this program that contain commands that are labelled with the given - * action. - * - * @param action The name of the action the modules are supposed to possess. - * @return A set of indices of all matching modules. - */ - std::set<uint_fast64_t> const& getModulesByAction(std::string const& action) const; - - /*! - * Retrieves the index of the module in which the given variable name was declared. - * - * @param variableName The name of the variable to search. - * @return The index of the module in which the given variable name was declared. - */ - uint_fast64_t getModuleIndexForVariable(std::string const& variableName) const; - - /*! - * Retrieves the number of global boolean variables of the program. - * - * @return The number of global boolean variables of the program. - */ - uint_fast64_t getNumberOfGlobalBooleanVariables() const; - - /*! - * Retrieves the number of global integer variables of the program. - * - * @return The number of global integer variables of the program. - */ - uint_fast64_t getNumberOfGlobalIntegerVariables() const; - - /*! - * Retrieves the reward model with the given name. - * - * @param name The name of the reward model to return. - * @return The reward model with the given name. - */ - storm::ir::RewardModel const& getRewardModel(std::string const& name) const; - - /*! - * Retrieves all labels that are defined by the probabilitic program. - * - * @return A set of labels that are defined in the program. - */ - std::map<std::string, std::unique_ptr<storm::ir::expressions::BaseExpression>> const& getLabels() const; - - /*! - * Retrieves whether the given constant name is an undefined boolean constant of the program. - * - * @return True if the given constant name is an undefined boolean constant of the program. - */ - bool hasUndefinedBooleanConstant(std::string const& constantName) const; - - /*! - * Retrieves the expression associated with the given undefined boolean constant. - * - * @param constantName The name of the undefined boolean constant for which to retrieve the expression. - * @return The expression associated with the given undefined boolean constant. - */ - std::unique_ptr<storm::ir::expressions::BooleanConstantExpression> const& getUndefinedBooleanConstantExpression(std::string const& constantName) const; - - /*! - * Retrieves whether the given constant name is an undefined integer constant of the program. - * - * @return True if the given constant name is an undefined integer constant of the program. - */ - bool hasUndefinedIntegerConstant(std::string const& constantName) const; - - /*! - * Retrieves the expression associated with the given undefined integer constant. - * - * @param constantName The name of the undefined integer constant for which to retrieve the expression. - * @return The expression associated with the given undefined integer constant. - */ - std::unique_ptr<storm::ir::expressions::IntegerConstantExpression> const& getUndefinedIntegerConstantExpression(std::string const& constantName) const; - - /*! - * Retrieves whether the given constant name is an undefined double constant of the program. - * - * @return True if the given constant name is an undefined double constant of the program. - */ - bool hasUndefinedDoubleConstant(std::string const& constantName) const; - - /*! - * Retrieves the expression associated with the given undefined double constant. - * - * @param constantName The name of the undefined double constant for which to retrieve the expression. - * @return The expression associated with the given undefined double constant. - */ - std::unique_ptr<storm::ir::expressions::DoubleConstantExpression> const& getUndefinedDoubleConstantExpression(std::string const& constantName) const; - - /*! - * Retrieves the mapping of undefined boolean constant names to their expression objects. - * - * @return The mapping of undefined boolean constant names to their expression objects. - */ - std::map<std::string, std::unique_ptr<storm::ir::expressions::BooleanConstantExpression>> const& getBooleanUndefinedConstantExpressionsMap() const; - - /*! - * Retrieves the mapping of undefined integer constant names to their expression objects. - * - * @return The mapping of undefined integer constant names to their expression objects. - */ - std::map<std::string, std::unique_ptr<storm::ir::expressions::IntegerConstantExpression>> const& getIntegerUndefinedConstantExpressionsMap() const; - - /*! - * Retrieves the mapping of undefined double constant names to their expression objects. - * - * @return The mapping of undefined double constant names to their expression objects. - */ - std::map<std::string, std::unique_ptr<storm::ir::expressions::DoubleConstantExpression>> const& getDoubleUndefinedConstantExpressionsMap() const; - - /*! - * Retrieves the global index of the given boolean variable. - * - * @param variableName The name of the boolean variable whose index to retrieve. - */ - uint_fast64_t getGlobalIndexOfBooleanVariable(std::string const& variableName) const; - - /*! - * Retrieves the global index of the integer boolean variable. - * - * @param variableName The name of the integer variable whose index to retrieve. - */ - uint_fast64_t getGlobalIndexOfIntegerVariable(std::string const& variableName) const; - - /*! - * Deletes all commands with indices not in the given set from the program. - * - * @param indexSet The set of indices for which to keep the commands. - */ - void restrictCommands(boost::container::flat_set<uint_fast64_t> const& indexSet); - private: - // The type of the model. - ModelType modelType; - - // A map of undefined boolean constants to their expression nodes. - std::map<std::string, std::unique_ptr<storm::ir::expressions::BooleanConstantExpression>> booleanUndefinedConstantExpressions; - - // A map of undefined integer constants to their expressions nodes. - std::map<std::string, std::unique_ptr<storm::ir::expressions::IntegerConstantExpression>> integerUndefinedConstantExpressions; - - // A map of undefined double constants to their expressions nodes. - std::map<std::string, std::unique_ptr<storm::ir::expressions::DoubleConstantExpression>> doubleUndefinedConstantExpressions; - - // A list of global boolean variables. - std::vector<BooleanVariable> globalBooleanVariables; - - // A list of global integer variables. - std::vector<IntegerVariable> globalIntegerVariables; - - // A mapping from global boolean variable names to their indices. - std::map<std::string, uint_fast64_t> globalBooleanVariableToIndexMap; - - // A mapping from global integer variable names to their indices. - std::map<std::string, uint_fast64_t> globalIntegerVariableToIndexMap; - - // The modules associated with the program. - std::vector<storm::ir::Module> modules; - - // The reward models associated with the program. - std::map<std::string, storm::ir::RewardModel> rewards; - - // The labels that are defined for this model. - std::map<std::string, std::unique_ptr<storm::ir::expressions::BaseExpression>> labels; - - // The set of actions present in this program. - std::set<std::string> actions; - - // A map of actions to the set of modules containing commands labelled with this action. - std::map<std::string, std::set<uint_fast64_t>> actionsToModuleIndexMap; - - // A mapping from variable names to the modules in which they were declared. - std::map<std::string, uint_fast64_t> variableToModuleIndexMap; - }; - - } // namespace ir -} // namespace storm - -#endif /* STORM_IR_PROGRAM_H_ */ diff --git a/src/ir/StateReward.cpp b/src/ir/StateReward.cpp deleted file mode 100644 index ff3c815ce..000000000 --- a/src/ir/StateReward.cpp +++ /dev/null @@ -1,60 +0,0 @@ -/* - * StateReward.cpp - * - * Created on: 12.01.2013 - * Author: Christian Dehnert - */ - -#include <sstream> - -#include "StateReward.h" - -namespace storm { - namespace ir { - - StateReward::StateReward() : statePredicate(), rewardValue() { - // Nothing to do here. - } - - StateReward::StateReward(std::unique_ptr<storm::ir::expressions::BaseExpression>&& statePredicate, std::unique_ptr<storm::ir::expressions::BaseExpression>&& rewardValue) : statePredicate(std::move(statePredicate)), rewardValue(std::move(rewardValue)) { - // Nothing to do here. - } - - StateReward::StateReward(StateReward const& otherReward) { - if (otherReward.statePredicate != nullptr) { - statePredicate = otherReward.statePredicate->clone(); - } - if (otherReward.rewardValue != nullptr) { - rewardValue = otherReward.rewardValue->clone(); - } - } - - StateReward& StateReward::operator=(StateReward const& otherReward) { - if (this != & otherReward) { - if (otherReward.statePredicate != nullptr) { - this->statePredicate = otherReward.statePredicate->clone(); - } - if (otherReward.rewardValue != nullptr) { - this->rewardValue = otherReward.rewardValue->clone(); - } - } - - return *this; - } - - std::string StateReward::toString() const { - std::stringstream result; - result << "\t" << statePredicate->toString() << ": " << rewardValue->toString() << ";"; - return result.str(); - } - - std::unique_ptr<storm::ir::expressions::BaseExpression> const& StateReward::getStatePredicate() const { - return this->statePredicate; - } - - std::unique_ptr<storm::ir::expressions::BaseExpression> const& StateReward::getRewardValue() const { - return this->rewardValue; - } - - } // namespace ir -} // namespace storm diff --git a/src/ir/TransitionReward.cpp b/src/ir/TransitionReward.cpp deleted file mode 100644 index bd9664529..000000000 --- a/src/ir/TransitionReward.cpp +++ /dev/null @@ -1,65 +0,0 @@ -/* - * TransitionReward.cpp - * - * Created on: 12.01.2013 - * Author: Christian Dehnert - */ - -#include <sstream> - -#include "TransitionReward.h" - -namespace storm { - namespace ir { - - TransitionReward::TransitionReward() : commandName(), statePredicate(), rewardValue() { - // Nothing to do here. - } - - TransitionReward::TransitionReward(std::string const& commandName, std::unique_ptr<storm::ir::expressions::BaseExpression>&& statePredicate, std::unique_ptr<storm::ir::expressions::BaseExpression>&& rewardValue) : commandName(commandName), statePredicate(std::move(statePredicate)), rewardValue(std::move(rewardValue)) { - // Nothing to do here. - } - - TransitionReward::TransitionReward(TransitionReward const& otherReward) : commandName(otherReward.commandName), statePredicate(), rewardValue() { - if (otherReward.statePredicate != nullptr) { - statePredicate = otherReward.statePredicate->clone(); - } - if (otherReward.rewardValue != nullptr) { - rewardValue = otherReward.rewardValue->clone(); - } - } - - TransitionReward& TransitionReward::operator=(TransitionReward const& otherReward) { - if (this != &otherReward) { - this->commandName = otherReward.commandName; - if (otherReward.statePredicate != nullptr) { - this->statePredicate = otherReward.statePredicate->clone(); - } - if (otherReward.rewardValue != nullptr) { - this->rewardValue = otherReward.rewardValue->clone(); - } - } - - return *this; - } - - std::string TransitionReward::toString() const { - std::stringstream result; - result << "\t[" << commandName << "] " << statePredicate->toString() << ": " << rewardValue->toString() << ";"; - return result.str(); - } - - std::string const& TransitionReward::getActionName() const { - return this->commandName; - } - - std::unique_ptr<storm::ir::expressions::BaseExpression> const& TransitionReward::getStatePredicate() const { - return this->statePredicate; - } - - std::unique_ptr<storm::ir::expressions::BaseExpression> const& TransitionReward::getRewardValue() const { - return this->rewardValue; - } - - } // namespace ir -} // namespace storm diff --git a/src/ir/Update.cpp b/src/ir/Update.cpp deleted file mode 100644 index aac7b3ca0..000000000 --- a/src/ir/Update.cpp +++ /dev/null @@ -1,130 +0,0 @@ -/* - * Update.cpp - * - * Created on: 12.01.2013 - * Author: Christian Dehnert - */ - -#include <sstream> - -#include "Update.h" -#include "src/parser/prismparser/VariableState.h" -#include "src/exceptions/OutOfRangeException.h" - -namespace storm { - namespace ir { - - Update::Update() : likelihoodExpression(), booleanAssignments(), integerAssignments(), globalIndex() { - // Nothing to do here. - } - - Update::Update(uint_fast64_t globalIndex, std::unique_ptr<storm::ir::expressions::BaseExpression>&& likelihoodExpression, std::map<std::string, storm::ir::Assignment> const& booleanAssignments, std::map<std::string, storm::ir::Assignment> const& integerAssignments) - : likelihoodExpression(std::move(likelihoodExpression)), booleanAssignments(booleanAssignments), integerAssignments(integerAssignments), globalIndex(globalIndex) { - // Nothing to do here. - } - - Update::Update(Update const& update, uint_fast64_t newGlobalIndex, std::map<std::string, std::string> const& renaming, storm::parser::prism::VariableState& variableState) : globalIndex(newGlobalIndex) { - for (auto const& variableAssignmentPair : update.booleanAssignments) { - if (renaming.count(variableAssignmentPair.first) > 0) { - this->booleanAssignments[renaming.at(variableAssignmentPair.first)] = Assignment(variableAssignmentPair.second, renaming, variableState); - } else { - this->booleanAssignments[variableAssignmentPair.first] = Assignment(variableAssignmentPair.second, renaming, variableState); - } - } - for (auto const& variableAssignmentPair : update.integerAssignments) { - if (renaming.count(variableAssignmentPair.first) > 0) { - this->integerAssignments[renaming.at(variableAssignmentPair.first)] = Assignment(variableAssignmentPair.second, renaming, variableState); - } else { - this->integerAssignments[variableAssignmentPair.first] = Assignment(variableAssignmentPair.second, renaming, variableState); - } - } - this->likelihoodExpression = update.likelihoodExpression->clone(renaming, variableState); - } - - Update::Update(Update const& otherUpdate) : likelihoodExpression(), booleanAssignments(otherUpdate.booleanAssignments), integerAssignments(otherUpdate.integerAssignments), globalIndex(otherUpdate.globalIndex) { - if (otherUpdate.likelihoodExpression != nullptr) { - likelihoodExpression = otherUpdate.likelihoodExpression->clone(); - } - } - - Update& Update::operator=(Update const& otherUpdate) { - if (this != &otherUpdate) { - if (otherUpdate.likelihoodExpression != nullptr) { - this->likelihoodExpression = otherUpdate.likelihoodExpression->clone(); - } - this->booleanAssignments = otherUpdate.booleanAssignments; - this->integerAssignments = otherUpdate.integerAssignments; - this->globalIndex = otherUpdate.globalIndex; - } - - return *this; - } - - std::unique_ptr<storm::ir::expressions::BaseExpression> const& Update::getLikelihoodExpression() const { - return likelihoodExpression; - } - - uint_fast64_t Update::getNumberOfBooleanAssignments() const { - return booleanAssignments.size(); - } - - uint_fast64_t Update::getNumberOfIntegerAssignments() const { - return integerAssignments.size(); - } - - std::map<std::string, storm::ir::Assignment> const& Update::getBooleanAssignments() const { - return booleanAssignments; - } - - std::map<std::string, storm::ir::Assignment> const& Update::getIntegerAssignments() const { - return integerAssignments; - } - - storm::ir::Assignment const& Update::getBooleanAssignment(std::string const& variableName) const { - auto variableAssignmentPair = booleanAssignments.find(variableName); - if (variableAssignmentPair == booleanAssignments.end()) { - throw storm::exceptions::OutOfRangeException() << "Cannot find boolean assignment for variable '" - << variableName << "' in update " << this->toString() << "."; - } - - return variableAssignmentPair->second; - } - - storm::ir::Assignment const& Update::getIntegerAssignment(std::string const& variableName) const { - auto variableAssignmentPair = integerAssignments.find(variableName); - if (variableAssignmentPair == integerAssignments.end()) { - throw storm::exceptions::OutOfRangeException() << "Cannot find integer assignment for variable '" - << variableName << "' in update " << this->toString() << "."; - } - - return variableAssignmentPair->second; - } - - uint_fast64_t Update::getGlobalIndex() const { - return this->globalIndex; - } - - std::string Update::toString() const { - std::stringstream result; - result << likelihoodExpression->toString() << " : "; - uint_fast64_t i = 0; - for (auto const& assignment : booleanAssignments) { - result << assignment.second.toString(); - if (i < booleanAssignments.size() - 1 || integerAssignments.size() > 0) { - result << " & "; - } - ++i; - } - i = 0; - for (auto const& assignment : integerAssignments) { - result << assignment.second.toString(); - if (i < integerAssignments.size() - 1) { - result << " & "; - } - ++i; - } - return result.str(); - } - - } // namespace ir -} // namespace storm diff --git a/src/ir/Variable.cpp b/src/ir/Variable.cpp deleted file mode 100644 index 83cb2a33a..000000000 --- a/src/ir/Variable.cpp +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Variable.cpp - * - * Created on: 12.01.2013 - * Author: Christian Dehnert - */ - -#include <sstream> -#include <map> -#include <iostream> - -#include "Variable.h" -#include "src/parser/prismparser/VariableState.h" - -namespace storm { - namespace ir { - - Variable::Variable() : localIndex(0), globalIndex(0), variableName(), initialValue() { - // Nothing to do here. - } - - Variable::Variable(uint_fast64_t localIndex, uint_fast64_t globalIndex, std::string const& variableName, std::unique_ptr<storm::ir::expressions::BaseExpression>&& initialValue) - : localIndex(localIndex), globalIndex(globalIndex), variableName(variableName), initialValue(std::move(initialValue)) { - // Nothing to do here. - } - - Variable::Variable(Variable const& otherVariable) : localIndex(otherVariable.localIndex), globalIndex(otherVariable.globalIndex), variableName(otherVariable.variableName), initialValue() { - if (otherVariable.initialValue != nullptr) { - initialValue = otherVariable.initialValue->clone(); - } - } - - Variable::Variable(Variable const& var, std::string const& newName, uint_fast64_t newGlobalIndex, std::map<std::string, std::string> const& renaming, storm::parser::prism::VariableState const& variableState) - : localIndex(var.getLocalIndex()), globalIndex(newGlobalIndex), variableName(newName), initialValue() { - if (var.initialValue != nullptr) { - this->initialValue = var.initialValue->clone(renaming, variableState); - } - } - - Variable& Variable::operator=(Variable const& otherVariable) { - if (this != &otherVariable) { - this->localIndex = otherVariable.localIndex; - this->globalIndex = otherVariable.globalIndex; - this->variableName = otherVariable.variableName; - if (otherVariable.initialValue != nullptr) { - this->initialValue = otherVariable.initialValue->clone(); - } - } - - return *this; - } - - std::string const& Variable::getName() const { - return variableName; - } - - uint_fast64_t Variable::getGlobalIndex() const { - return globalIndex; - } - - uint_fast64_t Variable::getLocalIndex() const { - return localIndex; - } - - std::unique_ptr<storm::ir::expressions::BaseExpression> const& Variable::getInitialValue() const { - return initialValue; - } - - void Variable::setInitialValue(std::unique_ptr<storm::ir::expressions::BaseExpression>&& initialValue) { - this->initialValue = std::move(initialValue); - } - - } // namespace ir -} // namespace storm diff --git a/src/ir/Variable.h b/src/ir/Variable.h deleted file mode 100644 index 53b2f3b98..000000000 --- a/src/ir/Variable.h +++ /dev/null @@ -1,124 +0,0 @@ -/* - * Variable.h - * - * Created on: 06.01.2013 - * Author: Christian Dehnert - */ - -#ifndef STORM_IR_VARIABLE_H_ -#define STORM_IR_VARIABLE_H_ - -#include <string> -#include <memory> - -#include "expressions/BaseExpression.h" - -namespace storm { - - namespace parser { - namespace prism { - class VariableState; - } // namespace prismparser - } // namespace parser - - namespace ir { - - /*! - * A class representing a untyped variable. - */ - class Variable { - public: - /*! - * Default constructor. Creates an unnamed, untyped variable without initial value. - */ - Variable(); - - /*! - * Creates an untyped variable with the given name and initial value. - * - * @param localIndex A module-local index for the variable. - * @param globalIndex A globally unique (among the variables of equal type) index for the variable. - * @param variableName the name of the variable. - * @param initialValue the expression that defines the initial value of the variable. - */ - Variable(uint_fast64_t localIndex, uint_fast64_t globalIndex, std::string const& variableName, std::unique_ptr<storm::ir::expressions::BaseExpression>&& initialValue = nullptr); - - /*! - * Creates a copy of the given variable and performs the provided renaming. - * - * @param oldVariable The variable to copy. - * @param newName New name of this variable. - * @param newGlobalIndex The new global index of the variable. - * @param renaming A mapping from names that are to be renamed to the names they are to be - * replaced with. - * @param variableState An object knowing about the variables in the system. - */ - Variable(Variable const& oldVariable, std::string const& newName, uint_fast64_t newGlobalIndex, std::map<std::string, std::string> const& renaming, storm::parser::prism::VariableState const& variableState); - - /*! - * Creates a deep-copy of the given variable. - * - * @param otherVariable The variable to copy. - */ - Variable(Variable const& otherVariable); - - /*! - * Creates a deep-copy of the given variable and assigns it to the current one. - */ - Variable& operator=(Variable const& otherVariable); - - /*! - * Retrieves the name of the variable. - * - * @return The name of the variable. - */ - std::string const& getName() const; - - /*! - * Retrieves the global index of the variable, i.e. the index in all variables of equal type - * of all modules. - * - * @return The global index of the variable. - */ - uint_fast64_t getGlobalIndex() const; - - /*! - * Retrieves the global index of the variable, i.e. the index in all variables of equal type in - * the same module. - * - * @return The local index of the variable. - */ - uint_fast64_t getLocalIndex() const; - - /*! - * Retrieves the expression defining the initial value of the variable. - * - * @return The expression defining the initial value of the variable. - */ - std::unique_ptr<storm::ir::expressions::BaseExpression> const& getInitialValue() const; - - /*! - * Sets the initial value to the given expression. - * - * @param initialValue The new initial value. - */ - void setInitialValue(std::unique_ptr<storm::ir::expressions::BaseExpression>&& initialValue); - - private: - // A unique (among the variables of equal type) index for the variable inside its module. - uint_fast64_t localIndex; - - // A unique (among the variables of equal type) index for the variable over all modules. - uint_fast64_t globalIndex; - - // The name of the variable. - std::string variableName; - - // The expression defining the initial value of the variable. - std::unique_ptr<storm::ir::expressions::BaseExpression> initialValue; - }; - - } // namespace ir -} // namespace storm - -#endif /* STORM_IR_VARIABLE_H_ */ diff --git a/src/ir/expressions/BaseExpression.cpp b/src/ir/expressions/BaseExpression.cpp deleted file mode 100644 index 66771d6b0..000000000 --- a/src/ir/expressions/BaseExpression.cpp +++ /dev/null @@ -1,85 +0,0 @@ -/* - * BaseExpression.cpp - * - * Created on: 10.06.2013 - * Author: Christian Dehnert - */ - -#include "BaseExpression.h" - -namespace storm { - namespace ir { - namespace expressions { - BaseExpression::BaseExpression() : type(undefined) { - // Nothing to do here. - } - - BaseExpression::BaseExpression(ReturnType type) : type(type) { - // Nothing to do here. - } - - BaseExpression::BaseExpression(BaseExpression const& baseExpression) : type(baseExpression.type) { - // Nothing to do here. - } - - BaseExpression::~BaseExpression() { - // Nothing to do here. - } - - std::unique_ptr<BaseExpression> BaseExpression::substitute(std::unique_ptr<BaseExpression>&& expression, std::map<std::string, std::reference_wrapper<BaseExpression>> const& substitution) { - BaseExpression* result = expression->performSubstitution(substitution); - - if (result != expression.get()) { - return std::unique_ptr<BaseExpression>(result); - } else { - return std::move(expression); - } - } - - int_fast64_t BaseExpression::getValueAsInt(std::pair<std::vector<bool>, std::vector<int_fast64_t>> const* variableValues) const { - if (type != int_) { - throw storm::exceptions::ExpressionEvaluationException() << "Cannot evaluate expression of type '" - << this->getTypeName() << "' as 'int'."; - } - throw storm::exceptions::NotImplementedException() << "Cannot evaluate expression of type '" - << this->getTypeName() << " because evaluation implementation is missing."; - } - - bool BaseExpression::getValueAsBool(std::pair<std::vector<bool>, std::vector<int_fast64_t>> const* variableValues) const { - if (type != bool_) { - throw storm::exceptions::ExpressionEvaluationException() << "Cannot evaluate expression of type '" - << this->getTypeName() << "' as 'bool'."; - } - throw storm::exceptions::NotImplementedException() << "Cannot evaluate expression of type '" - << this->getTypeName() << " because evaluation implementation is missing."; - } - - double BaseExpression::getValueAsDouble(std::pair<std::vector<bool>, std::vector<int_fast64_t>> const* variableValues) const { - if (type != double_ && type != int_) { - throw storm::exceptions::ExpressionEvaluationException() << "Cannot evaluate expression of type '" - << this->getTypeName() << "' as 'double'."; - } - throw storm::exceptions::NotImplementedException() << "Cannot evaluate expression of type '" - << this->getTypeName() << " because evaluation implementation is missing."; - } - - std::string BaseExpression::getTypeName() const { - switch(type) { - case bool_: return std::string("bool"); - case int_: return std::string("int"); - case double_: return std::string("double"); - default: return std::string("undefined"); - } - } - - BaseExpression::ReturnType BaseExpression::getType() const { - return type; - } - - BaseExpression* BaseExpression::performSubstitution(std::map<std::string, std::reference_wrapper<BaseExpression>> const& substitution) { - return this; - } - - } // namespace expressions - } // namespace ir -} // namespace storm diff --git a/src/ir/expressions/BaseExpression.h b/src/ir/expressions/BaseExpression.h deleted file mode 100644 index 948ed9d88..000000000 --- a/src/ir/expressions/BaseExpression.h +++ /dev/null @@ -1,172 +0,0 @@ -/* - * BaseExpression.h - * - * Created on: 03.01.2013 - * Author: Christian Dehnert - */ - -#ifndef STORM_IR_EXPRESSIONS_BASEEXPRESSION_H_ -#define STORM_IR_EXPRESSIONS_BASEEXPRESSION_H_ - -#include <string> -#include <vector> -#include <map> -#include <memory> - -#include "src/exceptions/ExpressionEvaluationException.h" -#include "src/exceptions/NotImplementedException.h" -#include "ExpressionVisitor.h" - -namespace storm { - - // Forward-declare VariableState. - namespace parser { - namespace prism { - class VariableState; - } // namespace prismparser - } // namespace parser - - namespace ir { - namespace expressions { - - /*! - * The base class for all expressions. - */ - class BaseExpression { - public: - // Forward declare friend classes to allow access to substitute. - friend class BinaryExpression; - friend class UnaryExpression; - - /*! - * Each node in an expression tree has a uniquely defined type from this enum. - */ - enum ReturnType {undefined, bool_, int_, double_}; - - /*! - * Creates an expression with undefined type. - */ - BaseExpression(); - - /*! - * Creates an expression with the given type. - * - * @param type The type of the expression. - */ - BaseExpression(ReturnType type); - - /*! - * Copy-constructs from the given expression. - * - * @param baseExpression The expression to copy. - */ - BaseExpression(BaseExpression const& baseExpression); - - /*! - * Destructor. - */ - virtual ~BaseExpression(); - - /*! - * Performes a deep-copy of the expression. - * - * @return A deep-copy of the expression. - */ - virtual std::unique_ptr<BaseExpression> clone() const = 0; - - /*! - * Copies the expression tree underneath (including) the current node and performs the provided renaming. - * - * @param renaming A mapping from identifier names to strings they are to be replaced with. - * @param variableState An object knowing about the global variable state. - */ - virtual std::unique_ptr<BaseExpression> clone(std::map<std::string, std::string> const& renaming, storm::parser::prism::VariableState const& variableState) const = 0; - - /*! - * Performs the given substitution by replacing each variable in the given expression that is a key in - * the map by a copy of the mapped expression. - * - * @param expression The expression in which to perform the substitution. - * @param substitution The substitution to apply. - * @return The resulting expression. - */ - static std::unique_ptr<BaseExpression> substitute(std::unique_ptr<BaseExpression>&& expression, std::map<std::string, std::reference_wrapper<BaseExpression>> const& substitution); - - /*! - * Retrieves the value of the expression as an integer given the provided variable valuation. - * - * @param variableValues The variable valuation under which to evaluate the expression. If set to null, - * constant expressions can be evaluated without variable values. However, upon encountering a variable - * expression an expression is thrown, because evaluation is impossible without the variable values then. - * @return The value of the expression as an integer. - */ - virtual int_fast64_t getValueAsInt(std::pair<std::vector<bool>, std::vector<int_fast64_t>> const* variableValues) const; - - /*! - * Retrieves the value of the expression as a boolean given the provided variable valuation. - * - * @param variableValues The variable valuation under which to evaluate the expression. If set to null, - * constant expressions can be evaluated without variable values. However, upon encountering a variable - * expression an expression is thrown, because evaluation is impossible without the variable values then. - * @return The value of the expression as a boolean. - */ - virtual bool getValueAsBool(std::pair<std::vector<bool>, std::vector<int_fast64_t>> const* variableValues) const; - - /*! - * Retrieves the value of the expression as a double given the provided variable valuation. - * - * @param variableValues The variable valuation under which to evaluate the expression. If set to null, - * constant expressions can be evaluated without variable values. However, upon encountering a variable - * expression an expression is thrown, because evaluation is impossible without the variable values then. - * @return The value of the expression as a double. - */ - virtual double getValueAsDouble(std::pair<std::vector<bool>, std::vector<int_fast64_t>> const* variableValues) const; - - /*! - * Acceptor method for visitor pattern. - * - * @param visitor The visitor that is supposed to visit each node of the expression tree. - */ - virtual void accept(ExpressionVisitor* visitor) = 0; - - /*! - * Retrieves a string representation of the expression tree underneath the current node. - * - * @return A string representation of the expression tree underneath the current node. - */ - virtual std::string toString() const = 0; - - /*! - * Retrieves a string representation of the type to which this node evaluates. - * - * @return A string representation of the type to which this node evaluates. - */ - std::string getTypeName() const; - - /*! - * Retrieves the type to which the node evaluates. - * - * @return The type to which the node evaluates. - */ - ReturnType getType() const; - - protected: - /*! - * Performs the given substitution on the expression, i.e. replaces all variables whose names are keys - * of the map by a copy of the expression they are associated with in the map. This is intended as a helper - * function for substitute. - * - * @param substitution The substitution to perform - */ - virtual BaseExpression* performSubstitution(std::map<std::string, std::reference_wrapper<BaseExpression>> const& substitution); - - private: - // The type to which this node evaluates. - ReturnType type; - }; - - } // namespace expressions - } // namespace ir -} // namespace storm - -#endif /* STORM_IR_EXPRESSIONS_BASEEXPRESSION_H_ */ diff --git a/src/ir/expressions/BinaryBooleanFunctionExpression.cpp b/src/ir/expressions/BinaryBooleanFunctionExpression.cpp deleted file mode 100644 index 83cb1d82f..000000000 --- a/src/ir/expressions/BinaryBooleanFunctionExpression.cpp +++ /dev/null @@ -1,67 +0,0 @@ -/* - * BinaryBooleanFunctionExpression.cpp - * - * Created on: 10.06.2013 - * Author: Christian Dehnert - */ - -#include <sstream> - -#include "BinaryBooleanFunctionExpression.h" - -namespace storm { - namespace ir { - namespace expressions { - - BinaryBooleanFunctionExpression::BinaryBooleanFunctionExpression(std::unique_ptr<BaseExpression>&& left, std::unique_ptr<BaseExpression>&& right, FunctionType functionType) - : BinaryExpression(bool_, std::move(left), std::move(right)), functionType(functionType) { - // Nothing to do here. - } - - BinaryBooleanFunctionExpression::BinaryBooleanFunctionExpression(BinaryBooleanFunctionExpression const& binaryBooleanFunctionExpression) - : BinaryExpression(binaryBooleanFunctionExpression), functionType(binaryBooleanFunctionExpression.functionType) { - // Nothing to do here. - } - - std::unique_ptr<BaseExpression> BinaryBooleanFunctionExpression::clone() const { - return std::unique_ptr<BaseExpression>(new BinaryBooleanFunctionExpression(this->getLeft()->clone(), this->getRight()->clone(), functionType)); - } - - std::unique_ptr<BaseExpression> BinaryBooleanFunctionExpression::clone(std::map<std::string, std::string> const& renaming, storm::parser::prism::VariableState const& variableState) const { - return std::unique_ptr<BaseExpression>(new BinaryBooleanFunctionExpression(this->getLeft()->clone(renaming, variableState), this->getRight()->clone(renaming, variableState), this->functionType)); - } - - bool BinaryBooleanFunctionExpression::getValueAsBool(std::pair<std::vector<bool>, std::vector<int_fast64_t>> const* variableValues) const { - bool resultLeft = this->getLeft()->getValueAsBool(variableValues); - bool resultRight = this->getRight()->getValueAsBool(variableValues); - switch(functionType) { - case AND: return resultLeft & resultRight; break; - case OR: return resultLeft | resultRight; break; - default: throw storm::exceptions::ExpressionEvaluationException() << "Cannot evaluate expression: " - << "Unknown boolean binary operator: '" << functionType << "'."; - } - } - - BinaryBooleanFunctionExpression::FunctionType BinaryBooleanFunctionExpression::getFunctionType() const { - return functionType; - } - - void BinaryBooleanFunctionExpression::accept(ExpressionVisitor* visitor) { - visitor->visit(this); - } - - std::string BinaryBooleanFunctionExpression::toString() const { - std::stringstream result; - result << "(" << this->getLeft()->toString(); - switch (functionType) { - case AND: result << " & "; break; - case OR: result << " | "; break; - } - result << this->getRight()->toString() << ")"; - - return result.str(); - } - - } // namespace expressions - } // namespace ir -} // namespace storm diff --git a/src/ir/expressions/BinaryBooleanFunctionExpression.h b/src/ir/expressions/BinaryBooleanFunctionExpression.h deleted file mode 100644 index b0cec5906..000000000 --- a/src/ir/expressions/BinaryBooleanFunctionExpression.h +++ /dev/null @@ -1,69 +0,0 @@ -/* - * BinaryBooleanFunctionExpression.h - * - * Created on: 03.01.2013 - * Author: Christian Dehnert - */ - -#ifndef STORM_IR_EXPRESSIONS_BINARYBOOLEANFUNCTIONEXPRESSION_H_ -#define STORM_IR_EXPRESSIONS_BINARYBOOLEANFUNCTIONEXPRESSION_H_ - -#include "BinaryExpression.h" - -namespace storm { - namespace ir { - namespace expressions { - - /*! - * A class representing a binary function expression of boolean type. - */ - class BinaryBooleanFunctionExpression : public BinaryExpression { - public: - /*! - * An enum type specifying the different functions applicable. - */ - enum FunctionType {AND, OR}; - - /*! - * Creates a binary boolean function expression tree node with the given children and function type. - * - * @param left The left child of the node. - * @param right The right child of the node. - * @param functionType The operator that is to be applied to the two children. - */ - BinaryBooleanFunctionExpression(std::unique_ptr<BaseExpression>&& left, std::unique_ptr<BaseExpression>&& right, FunctionType functionType); - - /*! - * Copy-constructs from the given expression. - * - * @param binaryBooleanFunctionExpression The expression to copy. - */ - BinaryBooleanFunctionExpression(BinaryBooleanFunctionExpression const& binaryBooleanFunctionExpression); - - virtual std::unique_ptr<BaseExpression> clone() const override; - - virtual std::unique_ptr<BaseExpression> clone(std::map<std::string, std::string> const& renaming, storm::parser::prism::VariableState const& variableState) const override; - - virtual bool getValueAsBool(std::pair<std::vector<bool>, std::vector<int_fast64_t>> const* variableValues) const override; - - /*! - * Retrieves the operator that is associated with this node. - * - * @param The operator that is associated with this node. - */ - FunctionType getFunctionType() const; - - virtual void accept(ExpressionVisitor* visitor) override; - - virtual std::string toString() const override; - - private: - // The operator that is associated with this node. - FunctionType functionType; - }; - - } // namespace expressions - } // namespace ir -} // namespace storm - -#endif /* STORM_IR_EXPRESSIONS_BINARYBOOLEANFUNCTIONEXPRESSION_H_ */ diff --git a/src/ir/expressions/BinaryExpression.cpp b/src/ir/expressions/BinaryExpression.cpp deleted file mode 100644 index 417cc9301..000000000 --- a/src/ir/expressions/BinaryExpression.cpp +++ /dev/null @@ -1,52 +0,0 @@ -/* - * BinaryBooleanFunctionExpression.cpp - * - * Created on: 10.06.2013 - * Author: Christian Dehnert - */ - -#include "BinaryExpression.h" - -namespace storm { - namespace ir { - namespace expressions { - - BinaryExpression::BinaryExpression(ReturnType type, std::unique_ptr<BaseExpression>&& left, std::unique_ptr<BaseExpression>&& right) - : BaseExpression(type), left(std::move(left)), right(std::move(right)) { - // Nothing to do here. - } - - BinaryExpression::BinaryExpression(BinaryExpression const& binaryExpression) : BaseExpression(binaryExpression.getType()), left(binaryExpression.left->clone()), right(binaryExpression.right->clone()) { - // Nothing to do here. - } - - BaseExpression* BinaryExpression::performSubstitution(std::map<std::string, std::reference_wrapper<BaseExpression>> const& substitution) { - // Get the new left successor recursively. - BaseExpression* newLeftSuccessor = left->performSubstitution(substitution); - - // If the left successor changed, we need to update it. If it did not change, this must not be executed, - // because assigning to the unique_ptr will destroy the current successor immediately. - if (newLeftSuccessor != left.get()) { - left = std::unique_ptr<BaseExpression>(newLeftSuccessor); - } - - // Now do the same thing for the right successor. - BaseExpression* newRightSuccessor = right->performSubstitution(substitution); - if (newRightSuccessor != right.get()) { - right = std::unique_ptr<BaseExpression>(newRightSuccessor); - } - - return this; - } - - std::unique_ptr<BaseExpression> const& BinaryExpression::getLeft() const { - return left; - } - - std::unique_ptr<BaseExpression> const& BinaryExpression::getRight() const { - return right; - } - - } // namespace expressions - } // namespace ir -} // namespace storm \ No newline at end of file diff --git a/src/ir/expressions/BinaryExpression.h b/src/ir/expressions/BinaryExpression.h deleted file mode 100644 index 1d6560863..000000000 --- a/src/ir/expressions/BinaryExpression.h +++ /dev/null @@ -1,66 +0,0 @@ -/* - * BinaryExpression.h - * - * Created on: 27.01.2013 - * Author: Christian Dehnert - */ - -#ifndef STORM_IR_EXPRESSIONS_BINARYEXPRESSION_H_ -#define STORM_IR_EXPRESSIONS_BINARYEXPRESSION_H_ - -#include "src/ir/expressions/BaseExpression.h" - -namespace storm { - namespace ir { - namespace expressions { - - /*! - * A class representing a generic binary expression. - */ - class BinaryExpression : public BaseExpression { - public: - /*! - * Constructs a binary expression with the given type and children. - * @param type The type of the binary expression. - * @param left The left child of the binary expression. - * @param right The right child of the binary expression. - */ - BinaryExpression(ReturnType type, std::unique_ptr<BaseExpression>&& left, std::unique_ptr<BaseExpression>&& right); - - /*! - * Copy-constructs from the given expression. - * - * @param binaryExpression The expression to copy. - */ - BinaryExpression(BinaryExpression const& binaryExpression); - - /*! - * Retrieves the left child of the expression node. - * - * @return The left child of the expression node. - */ - std::unique_ptr<BaseExpression> const& getLeft() const; - - /*! - * Retrieves the right child of the expression node. - * - * @return The right child of the expression node. - */ - std::unique_ptr<BaseExpression> const& getRight() const; - - protected: - virtual BaseExpression* performSubstitution(std::map<std::string, std::reference_wrapper<BaseExpression>> const& substitution) override; - - private: - // The left child of the binary expression. - std::unique_ptr<BaseExpression> left; - - // The right child of the binary expression. - std::unique_ptr<BaseExpression> right; - }; - - } // namespace expressions - } // namespace ir -} // namespace storm - -#endif /* STORM_IR_EXPRESSIONS_BINARYEXPRESSION_H_ */ diff --git a/src/ir/expressions/BinaryNumericalFunctionExpression.cpp b/src/ir/expressions/BinaryNumericalFunctionExpression.cpp deleted file mode 100644 index a80e04ae4..000000000 --- a/src/ir/expressions/BinaryNumericalFunctionExpression.cpp +++ /dev/null @@ -1,96 +0,0 @@ -/* - * BinaryBooleanFunctionExpression.cpp - * - * Created on: 10.06.2013 - * Author: Christian Dehnert - */ - -#include <sstream> -#include <algorithm> - -#include "BinaryNumericalFunctionExpression.h" - -namespace storm { - namespace ir { - namespace expressions { - - BinaryNumericalFunctionExpression::BinaryNumericalFunctionExpression(ReturnType type, std::unique_ptr<BaseExpression>&& left, std::unique_ptr<BaseExpression>&& right, FunctionType functionType) - : BinaryExpression(type, std::move(left), std::move(right)), functionType(functionType) { - // Nothing to do here. - } - - BinaryNumericalFunctionExpression::BinaryNumericalFunctionExpression(BinaryNumericalFunctionExpression const& binaryNumericalFunctionExpression) - : BinaryExpression(binaryNumericalFunctionExpression), functionType(binaryNumericalFunctionExpression.functionType) { - // Nothing to do here. - } - - std::unique_ptr<BaseExpression> BinaryNumericalFunctionExpression::clone() const { - return std::unique_ptr<BaseExpression>(new BinaryNumericalFunctionExpression(this->getType(), this->getLeft()->clone(), this->getRight()->clone(), functionType)); - } - - std::unique_ptr<BaseExpression> BinaryNumericalFunctionExpression::clone(std::map<std::string, std::string> const& renaming, storm::parser::prism::VariableState const& variableState) const { - return std::unique_ptr<BaseExpression>(new BinaryNumericalFunctionExpression(this->getType(), this->getLeft()->clone(renaming, variableState), this->getRight()->clone(renaming, variableState), this->functionType)); - } - - BinaryNumericalFunctionExpression::FunctionType BinaryNumericalFunctionExpression::getFunctionType() const { - return functionType; - } - - int_fast64_t BinaryNumericalFunctionExpression::getValueAsInt(std::pair<std::vector<bool>, std::vector<int_fast64_t>> const* variableValues) const { - if (this->getType() != int_) { - BaseExpression::getValueAsInt(variableValues); - } - - int_fast64_t resultLeft = this->getLeft()->getValueAsInt(variableValues); - int_fast64_t resultRight = this->getRight()->getValueAsInt(variableValues); - switch(functionType) { - case PLUS: return resultLeft + resultRight; break; - case MINUS: return resultLeft - resultRight; break; - case TIMES: return resultLeft * resultRight; break; - case DIVIDE: return resultLeft / resultRight; break; - case MIN: return std::min(resultLeft, resultRight); break; - case MAX: return std::max(resultLeft, resultRight); break; - default: throw storm::exceptions::ExpressionEvaluationException() << "Cannot evaluate expression: " - << "Unknown numeric binary operator: '" << functionType << "'."; - } - } - - double BinaryNumericalFunctionExpression::getValueAsDouble(std::pair<std::vector<bool>, std::vector<int_fast64_t>> const* variableValues) const { - if (this->getType() != double_ && this->getType() != int_) { - BaseExpression::getValueAsDouble(variableValues); - } - - double resultLeft = this->getLeft()->getValueAsDouble(variableValues); - double resultRight = this->getRight()->getValueAsDouble(variableValues); - switch(functionType) { - case PLUS: return resultLeft + resultRight; break; - case MINUS: return resultLeft - resultRight; break; - case TIMES: return resultLeft * resultRight; break; - case DIVIDE: return resultLeft / resultRight; break; - case MIN: return std::min(resultLeft, resultRight); break; - case MAX: return std::max(resultLeft, resultRight); break; - default: throw storm::exceptions::ExpressionEvaluationException() << "Cannot evaluate expression: " - << "Unknown numeric binary operator: '" << functionType << "'."; - } - } - - void BinaryNumericalFunctionExpression::accept(ExpressionVisitor* visitor) { - visitor->visit(this); - } - - std::string BinaryNumericalFunctionExpression::toString() const { - std::stringstream result; - switch (functionType) { - case PLUS: result << "(" << this->getLeft()->toString() << " + " << this->getRight()->toString() << ")"; break; - case MINUS: result << "(" << this->getLeft()->toString() << " - " << this->getRight()->toString() << ")"; break; - case TIMES: result << "(" << this->getLeft()->toString() << " * " << this->getRight()->toString() << ")"; break; - case DIVIDE: result << "(" << this->getLeft()->toString() << " / " << this->getRight()->toString() << ")"; break; - case MIN: result << "min(" << this->getLeft()->toString() << ", " << this->getRight()->toString() << ")"; break; - case MAX: result << "max(" << this->getLeft()->toString() << ", " << this->getRight()->toString() << ")"; break; - } - return result.str(); - } - - } // namespace expressions - } // namespace ir -} // namespace storm \ No newline at end of file diff --git a/src/ir/expressions/BinaryNumericalFunctionExpression.h b/src/ir/expressions/BinaryNumericalFunctionExpression.h deleted file mode 100644 index 846ceb99a..000000000 --- a/src/ir/expressions/BinaryNumericalFunctionExpression.h +++ /dev/null @@ -1,72 +0,0 @@ -/* - * BinaryFunctionExpression.h - * - * Created on: 03.01.2013 - * Author: Christian Dehnert - */ - -#ifndef STORM_IR_EXPRESSIONS_BINARYFUNCTIONEXPRESSION_H_ -#define STORM_IR_EXPRESSIONS_BINARYFUNCTIONEXPRESSION_H_ - -#include "src/ir/expressions/BinaryExpression.h" - -namespace storm { - namespace ir { - namespace expressions { - - /*! - * A class representing a binary function expression of numerical type. - */ - class BinaryNumericalFunctionExpression : public BinaryExpression { - public: - /*! - * An enum type specifying the different functions applicable. - */ - enum FunctionType {PLUS, MINUS, TIMES, DIVIDE, MIN, MAX}; - - /*! - * Creates a binary numerical function expression with the given type, children and function type. - * - * @param type The type of the expression tree node. - * @param left The left child of the expression tree node. - * @param right The right child of the expression tree node. - * @param functionType The function that is applied to the children of this node. - */ - BinaryNumericalFunctionExpression(ReturnType type, std::unique_ptr<BaseExpression>&& left, std::unique_ptr<BaseExpression>&& right, FunctionType functionType); - - /*! - * Performs a deep-copy of the given expression. - * - * @param binaryNumericalFunctionExpression The expression to copy. - */ - BinaryNumericalFunctionExpression(BinaryNumericalFunctionExpression const& binaryNumericalFunctionExpression); - - virtual std::unique_ptr<BaseExpression> clone() const override; - - virtual std::unique_ptr<BaseExpression> clone(std::map<std::string, std::string> const& renaming, storm::parser::prism::VariableState const& variableState) const override; - - /*! - * Retrieves the operator that is associated with this node. - * - * @param The operator that is associated with this node. - */ - FunctionType getFunctionType() const; - - virtual int_fast64_t getValueAsInt(std::pair<std::vector<bool>, std::vector<int_fast64_t>> const* variableValues) const override; - - virtual double getValueAsDouble(std::pair<std::vector<bool>, std::vector<int_fast64_t>> const* variableValues) const override; - - virtual void accept(ExpressionVisitor* visitor) override; - - virtual std::string toString() const override; - - private: - // The operator that is associated with this node. - FunctionType functionType; - }; - - } // namespace expressions - } // namespace ir -} // namespace storm - -#endif /* STORM_IR_EXPRESSIONS_BINARYFUNCTIONEXPRESSION_H_ */ diff --git a/src/ir/expressions/BinaryRelationExpression.cpp b/src/ir/expressions/BinaryRelationExpression.cpp deleted file mode 100644 index 5c08e7f33..000000000 --- a/src/ir/expressions/BinaryRelationExpression.cpp +++ /dev/null @@ -1,75 +0,0 @@ -/* - * BinaryBooleanFunctionExpression.cpp - * - * Created on: 10.06.2013 - * Author: Christian Dehnert - */ - -#include <sstream> - -#include "BinaryRelationExpression.h" - -namespace storm { - namespace ir { - namespace expressions { - - BinaryRelationExpression::BinaryRelationExpression(std::unique_ptr<BaseExpression>&& left, std::unique_ptr<BaseExpression>&& right, RelationType relationType) - : BinaryExpression(bool_, std::move(left), std::move(right)), relationType(relationType) { - // Nothing to do here. - } - - BinaryRelationExpression::BinaryRelationExpression(BinaryRelationExpression const& binaryRelationExpression) - : BinaryExpression(binaryRelationExpression), relationType(binaryRelationExpression.relationType) { - // Nothing to do here. - } - - std::unique_ptr<BaseExpression> BinaryRelationExpression::clone() const { - return std::unique_ptr<BaseExpression>(new BinaryRelationExpression(this->getLeft()->clone(), this->getRight()->clone(), relationType)); - } - - std::unique_ptr<BaseExpression> BinaryRelationExpression::clone(std::map<std::string, std::string> const& renaming, storm::parser::prism::VariableState const& variableState) const { - return std::unique_ptr<BaseExpression>(new BinaryRelationExpression(this->getLeft()->clone(renaming, variableState), this->getRight()->clone(renaming, variableState), this->relationType)); - } - - bool BinaryRelationExpression::getValueAsBool(std::pair<std::vector<bool>, std::vector<int_fast64_t>> const* variableValues) const { - int_fast64_t resultLeft = this->getLeft()->getValueAsInt(variableValues); - int_fast64_t resultRight = this->getRight()->getValueAsInt(variableValues); - switch(relationType) { - case EQUAL: return resultLeft == resultRight; break; - case NOT_EQUAL: return resultLeft != resultRight; break; - case LESS: return resultLeft < resultRight; break; - case LESS_OR_EQUAL: return resultLeft <= resultRight; break; - case GREATER: return resultLeft > resultRight; break; - case GREATER_OR_EQUAL: return resultLeft >= resultRight; break; - default: throw storm::exceptions::ExpressionEvaluationException() << "Cannot evaluate expression: " - << "Unknown boolean binary relation: '" << relationType << "'."; - } - } - - BinaryRelationExpression::RelationType BinaryRelationExpression::getRelationType() const { - return relationType; - } - - void BinaryRelationExpression::accept(ExpressionVisitor* visitor) { - visitor->visit(this); - } - - std::string BinaryRelationExpression::toString() const { - std::stringstream result; - result << "(" << this->getLeft()->toString(); - switch (relationType) { - case EQUAL: result << " = "; break; - case NOT_EQUAL: result << " != "; break; - case LESS: result << " < "; break; - case LESS_OR_EQUAL: result << " <= "; break; - case GREATER: result << " > "; break; - case GREATER_OR_EQUAL: result << " >= "; break; - } - result << this->getRight()->toString() << ")"; - - return result.str(); - } - - } // namespace expressions - } // namespace ir -} // namespace storm \ No newline at end of file diff --git a/src/ir/expressions/BinaryRelationExpression.h b/src/ir/expressions/BinaryRelationExpression.h deleted file mode 100644 index 873cbe5bf..000000000 --- a/src/ir/expressions/BinaryRelationExpression.h +++ /dev/null @@ -1,69 +0,0 @@ -/* - * BinaryRelationExpression.h - * - * Created on: 03.01.2013 - * Author: Christian Dehnert - */ - -#ifndef STORM_IR_EXPRESSIONS_BINARYRELATIONEXPRESSION_H_ -#define STORM_IR_EXPRESSIONS_BINARYRELATIONEXPRESSION_H_ - -#include "src/ir/expressions/BinaryExpression.h" - -namespace storm { - namespace ir { - namespace expressions { - - /*! - * A class representing a binary relation expression of boolean type. - */ - class BinaryRelationExpression : public BinaryExpression { - public: - /*! - * An enum type specifying the different relations applicable. - */ - enum RelationType {EQUAL, NOT_EQUAL, LESS, LESS_OR_EQUAL, GREATER, GREATER_OR_EQUAL}; - - /*! - * Creates a binary relation expression tree node with the given children and relation type. - * - * @param left The left child of the binary expression. - * @param right The right child of the binary expression. - * @param relationType The type of the relation associated with this node. - */ - BinaryRelationExpression(std::unique_ptr<BaseExpression>&& left, std::unique_ptr<BaseExpression>&& right, RelationType relationType); - - /*! - * Copy-constructs from the given expression. - * - * @param binaryRelationExpression The expression to copy. - */ - BinaryRelationExpression(BinaryRelationExpression const& binaryRelationExpression); - - virtual std::unique_ptr<BaseExpression> clone() const override; - - virtual std::unique_ptr<BaseExpression> clone(std::map<std::string, std::string> const& renaming, storm::parser::prism::VariableState const& variableState) const override; - - virtual bool getValueAsBool(std::pair<std::vector<bool>, std::vector<int_fast64_t>> const* variableValues) const override; - - /*! - * Retrieves the relation that is associated with this node. - * - * @param The relation that is associated with this node. - */ - RelationType getRelationType() const; - - virtual void accept(ExpressionVisitor* visitor) override; - - virtual std::string toString() const override; - - private: - // The relation operator associated with this node. - RelationType relationType; - }; - - } // namespace expressions - } // namespace ir -} // namespace storm - -#endif /* STORM_IR_EXPRESSIONS_BINARYRELATIONEXPRESSION_H_ */ diff --git a/src/ir/expressions/BooleanConstantExpression.cpp b/src/ir/expressions/BooleanConstantExpression.cpp deleted file mode 100644 index 2022e8796..000000000 --- a/src/ir/expressions/BooleanConstantExpression.cpp +++ /dev/null @@ -1,45 +0,0 @@ -/* - * BooleanConstantExpression.cpp - * - * Created on: 10.06.2013 - * Author: Christian Dehnert - */ - -#include "BooleanConstantExpression.h" - -namespace storm { - namespace ir { - namespace expressions { - - BooleanConstantExpression::BooleanConstantExpression(std::string const& constantName) : ConstantExpression<bool>(bool_, constantName) { - // Nothing to do here. - } - - BooleanConstantExpression::BooleanConstantExpression(BooleanConstantExpression const& booleanConstantExpression) : ConstantExpression(booleanConstantExpression) { - // Nothing to do here. - } - - std::unique_ptr<BaseExpression> BooleanConstantExpression::clone() const { - return std::unique_ptr<BaseExpression>(new BooleanConstantExpression(*this)); - } - - std::unique_ptr<BaseExpression> BooleanConstantExpression::clone(std::map<std::string, std::string> const& renaming, storm::parser::prism::VariableState const& variableState) const { - return std::unique_ptr<BaseExpression>(new BooleanConstantExpression(*this)); - } - - bool BooleanConstantExpression::getValueAsBool(std::pair<std::vector<bool>, std::vector<int_fast64_t>> const* variableValues) const { - if (!this->isDefined()) { - throw storm::exceptions::ExpressionEvaluationException() << "Cannot evaluate expression: " - << "Boolean constant '" << this->getConstantName() << "' is undefined."; - } else { - return this->getValue(); - } - } - - void BooleanConstantExpression::accept(ExpressionVisitor* visitor) { - visitor->visit(this); - } - - } // namespace expressions - } // namespace ir -} // namespace storm \ No newline at end of file diff --git a/src/ir/expressions/BooleanConstantExpression.h b/src/ir/expressions/BooleanConstantExpression.h deleted file mode 100644 index 4838ba595..000000000 --- a/src/ir/expressions/BooleanConstantExpression.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - * BooleanConstantExpression.h - * - * Created on: 04.01.2013 - * Author: Christian Dehnert - */ - -#ifndef STORM_IR_EXPRESSIONS_BOOLEANCONSTANTEXPRESSION_H_ -#define STORM_IR_EXPRESSIONS_BOOLEANCONSTANTEXPRESSION_H_ - -#include "ConstantExpression.h" - -namespace storm { - namespace ir { - namespace expressions { - - /*! - * A class representing a boolean constant expression. - */ - class BooleanConstantExpression : public ConstantExpression<bool> { - public: - /*! - * Creates a boolean constant expression with the given constant name. - * - * @param constantName The name of the constant to use. - */ - BooleanConstantExpression(std::string const& constantName); - - /*! - * Copy-constructs from the given expression. - * - * @param booleanConstantExpression The expression to copy. - */ - BooleanConstantExpression(BooleanConstantExpression const& booleanConstantExpression); - - virtual std::unique_ptr<BaseExpression> clone() const override; - - virtual std::unique_ptr<BaseExpression> clone(std::map<std::string, std::string> const& renaming, storm::parser::prism::VariableState const& variableState) const override; - - virtual bool getValueAsBool(std::pair<std::vector<bool>, std::vector<int_fast64_t>> const* variableValues) const override; - - virtual void accept(ExpressionVisitor* visitor) override; - }; - - } // namespace expressions - } // namespace ir -} // namespace storm - -#endif /* STORM_IR_EXPRESSIONS_BOOLEANCONSTANTEXPRESSION_H_ */ diff --git a/src/ir/expressions/BooleanLiteralExpression.cpp b/src/ir/expressions/BooleanLiteralExpression.cpp deleted file mode 100644 index 89e6b7876..000000000 --- a/src/ir/expressions/BooleanLiteralExpression.cpp +++ /dev/null @@ -1,49 +0,0 @@ -/* - * BooleanLiteralExpression.cpp - * - * Created on: 04.01.2013 - * Author: Christian Dehnert - */ - -#include "BooleanLiteralExpression.h" - -namespace storm { - namespace ir { - namespace expressions { - - BooleanLiteralExpression::BooleanLiteralExpression(bool value) : BaseExpression(bool_), value(value) { - // Nothing to do here. - } - - BooleanLiteralExpression::BooleanLiteralExpression(BooleanLiteralExpression const& booleanLiteralExpression) - : BaseExpression(booleanLiteralExpression), value(booleanLiteralExpression.value) { - // Nothing to do here. - } - - std::unique_ptr<BaseExpression> BooleanLiteralExpression::clone() const { - return std::unique_ptr<BaseExpression>(new BooleanLiteralExpression(*this)); - } - - std::unique_ptr<BaseExpression> BooleanLiteralExpression::clone(std::map<std::string, std::string> const& renaming, storm::parser::prism::VariableState const& variableState) const { - return std::unique_ptr<BaseExpression>(new BooleanLiteralExpression(this->value)); - } - - bool BooleanLiteralExpression::getValueAsBool(std::pair<std::vector<bool>, std::vector<int_fast64_t>> const* variableValues) const { - return value; - } - - void BooleanLiteralExpression::accept(ExpressionVisitor* visitor) { - visitor->visit(this); - } - - std::string BooleanLiteralExpression::toString() const { - if (value) { - return std::string("true"); - } else { - return std::string("false"); - } - } - - } // namespace expressions - } // namespace ir -} // namespace storm \ No newline at end of file diff --git a/src/ir/expressions/BooleanLiteralExpression.h b/src/ir/expressions/BooleanLiteralExpression.h deleted file mode 100644 index 1fb747a78..000000000 --- a/src/ir/expressions/BooleanLiteralExpression.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - * BooleanLiteralExpression.h - * - * Created on: 03.01.2013 - * Author: Christian Dehnert - */ - -#ifndef STORM_IR_EXPRESSIONS_BOOLEANLITERALEXPRESSION_H_ -#define STORM_IR_EXPRESSIONS_BOOLEANLITERALEXPRESSION_H_ - -#include "src/ir/expressions/BaseExpression.h" - -namespace storm { - namespace ir { - namespace expressions { - - /*! - * A class representing a boolean literal. - */ - class BooleanLiteralExpression : public BaseExpression { - public: - /*! - * Creates a boolean literal expression with the given value. - * - * @param value The value for the boolean literal. - */ - BooleanLiteralExpression(bool value); - - /*! - * Copy-constructs from the given expression. - * - * @param booleanLiteralExpression The expression to copy. - */ - BooleanLiteralExpression(BooleanLiteralExpression const& booleanLiteralExpression); - - virtual std::unique_ptr<BaseExpression> clone() const override; - - virtual std::unique_ptr<BaseExpression> clone(std::map<std::string, std::string> const& renaming, storm::parser::prism::VariableState const& variableState) const override; - - virtual bool getValueAsBool(std::pair<std::vector<bool>, std::vector<int_fast64_t>> const* variableValues) const override; - - virtual void accept(ExpressionVisitor* visitor) override; - - virtual std::string toString() const override; - - private: - // The value of the boolean literal. - bool value; - }; - - } // namespace expressions - } // namespace ir -} // namespace storm - -#endif /* STORM_IR_EXPRESSIONS_BOOLEANLITERALEXPRESSION_H_ */ diff --git a/src/ir/expressions/ConstantExpression.h b/src/ir/expressions/ConstantExpression.h deleted file mode 100644 index dc1763c33..000000000 --- a/src/ir/expressions/ConstantExpression.h +++ /dev/null @@ -1,132 +0,0 @@ -/* - * ConstantExpression.h - * - * Created on: 03.01.2013 - * Author: Christian Dehnert - */ - -#ifndef STORM_IR_EXPRESSIONS_CONSTANTEXPRESSION_H_ -#define STORM_IR_EXPRESSIONS_CONSTANTEXPRESSION_H_ - -#include "BaseExpression.h" - -namespace storm { - namespace ir { - namespace expressions { - - // A struct for storing whether the constant was defined and if so, what value it holds. - template<class T> - struct ConstantDefinitionStruct { - /*! - * Constructs a structure indicating that the constant has been defined with the given value. - * - * @param value The value with which the constant was defined. - */ - ConstantDefinitionStruct(T value) : value(value), defined(true) { - // Nothing to do here. - } - - /*! - * Constructs a structure indicating that the constant has not yet been defined. - * - * @param value The value with which the constant was defined. - */ - ConstantDefinitionStruct() : value(), defined(false) { - // Nothing to do here. - } - - T value; - bool defined; - }; - - /*! - * A class representing a generic constant expression. - */ - template<class T> - class ConstantExpression : public BaseExpression { - public: - /*! - * Constructs a constant expression of the given type with the given constant name. - * - * @param type The type of the constant. - * @param constantName The name of the constant. - */ - ConstantExpression(ReturnType type, std::string const& constantName) : BaseExpression(type), constantName(constantName), valueStructPointer(new ConstantDefinitionStruct<T>()) { - // Nothing to do here. - } - - /*! - * Copy-constructs from the given expression. - * - * @param constantExpression The expression to copy. - */ - ConstantExpression(ConstantExpression const& constantExpression) : BaseExpression(constantExpression), constantName(constantExpression.constantName), valueStructPointer(constantExpression.valueStructPointer) { - // Nothing to do here. - } - - /*! - * Retrieves the name of the constant. - * - * @return The name of the constant. - */ - std::string const& getConstantName() const { - return constantName; - } - - virtual std::string toString() const override { - std::stringstream result; - if (this->valueStructPointer->defined) { - result << this->valueStructPointer->value; - } else { - result << this->getConstantName(); - } - return result.str(); - } - - /*! - * Retrieves whether the constant is defined or not. - * - * @return True if the constant is defined. - */ - bool isDefined() const { - return this->valueStructPointer->defined; - } - - /*! - * Retrieves the value of the constant if it is defined. - */ - T getValue() const { - return this->valueStructPointer->value; - } - - /*! - * Defines the constant using the given value. - * - * @param value The value to use for defining the constant. - */ - void define(T value) { - this->valueStructPointer->defined = true; - this->valueStructPointer->value = value; - } - - /*! - * Undefines the value that was previously set for this constant (if any). - */ - void undefine() { - this->valueStructPointer->defined = false; - this->valueStructPointer->value = T(); - } - - private: - // The name of the constant. - std::string constantName; - - // The definedness status and (if applicable) the value of the constant. - std::shared_ptr<ConstantDefinitionStruct<T>> valueStructPointer; - }; - - } // namespace expressions - } // namespace ir -} // namespace storm - -#endif /* STORM_IR_EXPRESSIONS_CONSTANTEXPRESSION_H_ */ diff --git a/src/ir/expressions/DoubleConstantExpression.cpp b/src/ir/expressions/DoubleConstantExpression.cpp deleted file mode 100644 index bc29cbf26..000000000 --- a/src/ir/expressions/DoubleConstantExpression.cpp +++ /dev/null @@ -1,45 +0,0 @@ -/* - * DoubleConstantExpression.cpp - * - * Created on: 10.06.2013 - * Author: Christian Dehnert - */ - -#include "DoubleConstantExpression.h" - -namespace storm { - namespace ir { - namespace expressions { - - DoubleConstantExpression::DoubleConstantExpression(std::string const& constantName) : ConstantExpression<double>(double_, constantName) { - // Nothing to do here. - } - - DoubleConstantExpression::DoubleConstantExpression(DoubleConstantExpression const& doubleConstantExpression) : ConstantExpression(doubleConstantExpression) { - // Nothing to do here. - } - - std::unique_ptr<BaseExpression> DoubleConstantExpression::clone() const { - return std::unique_ptr<BaseExpression>(new DoubleConstantExpression(*this)); - } - - std::unique_ptr<BaseExpression> DoubleConstantExpression::clone(std::map<std::string, std::string> const& renaming, storm::parser::prism::VariableState const& variableState) const { - return std::unique_ptr<BaseExpression>(new DoubleConstantExpression(*this)); - } - - double DoubleConstantExpression::getValueAsDouble(std::pair<std::vector<bool>, std::vector<int_fast64_t>> const* variableValues) const { - if (!this->isDefined()) { - throw storm::exceptions::ExpressionEvaluationException() << "Cannot evaluate expression: " - << "Double constant '" << this->getConstantName() << "' is undefined."; - } else { - return this->getValue(); - } - } - - void DoubleConstantExpression::accept(ExpressionVisitor* visitor) { - visitor->visit(this); - } - - } // namespace expressions - } // namespace ir -} // namespace storm \ No newline at end of file diff --git a/src/ir/expressions/DoubleConstantExpression.h b/src/ir/expressions/DoubleConstantExpression.h deleted file mode 100644 index 9eaa6eb18..000000000 --- a/src/ir/expressions/DoubleConstantExpression.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - * DoubleConstantExpression.h - * - * Created on: 04.01.2013 - * Author: Christian Dehnert - */ - -#ifndef STORM_IR_EXPRESSIONS_DOUBLECONSTANTEXPRESSION_H_ -#define STORM_IR_EXPRESSIONS_DOUBLECONSTANTEXPRESSION_H_ - -#include "ConstantExpression.h" - -namespace storm { - namespace ir { - namespace expressions { - - /*! - * A class representing a constant expression of type double. - */ - class DoubleConstantExpression : public ConstantExpression<double> { - public: - /*! - * Creates a double constant expression with the given constant name. - * - * @param constantName The name of the constant to use. - */ - DoubleConstantExpression(std::string const& constantName); - - /*! - * Copy-constructs from the given expression. - * - * @param doubleConstantExpression The expression to copy. - */ - DoubleConstantExpression(DoubleConstantExpression const& doubleConstantExpression); - - virtual std::unique_ptr<BaseExpression> clone() const override; - - virtual std::unique_ptr<BaseExpression> clone(std::map<std::string, std::string> const& renaming, storm::parser::prism::VariableState const& variableState) const override; - - virtual double getValueAsDouble(std::pair<std::vector<bool>, std::vector<int_fast64_t>> const* variableValues) const override; - - virtual void accept(ExpressionVisitor* visitor) override; - }; - - } // namespace expressions - } // namespace ir -} // namespace storm - -#endif /* STORM_IR_EXPRESSIONS_DOUBLECONSTANTEXPRESSION_H_ */ diff --git a/src/ir/expressions/DoubleLiteralExpression.cpp b/src/ir/expressions/DoubleLiteralExpression.cpp deleted file mode 100644 index 08663f8f7..000000000 --- a/src/ir/expressions/DoubleLiteralExpression.cpp +++ /dev/null @@ -1,49 +0,0 @@ -/* - * DoubleLiteralExpression.cpp - * - * Created on: 10.06.2013 - * Author: Christian Dehnert - */ - -#include <sstream> - -#include "DoubleLiteralExpression.h" - -namespace storm { - namespace ir { - namespace expressions { - - DoubleLiteralExpression::DoubleLiteralExpression(double value) : BaseExpression(double_), value(value) { - // Nothing to do here. - } - - DoubleLiteralExpression::DoubleLiteralExpression(DoubleLiteralExpression const& doubleLiteralExpression) - : BaseExpression(doubleLiteralExpression), value(doubleLiteralExpression.value) { - // Nothing to do here. - } - - std::unique_ptr<BaseExpression> DoubleLiteralExpression::clone() const { - return std::unique_ptr<BaseExpression>(new DoubleLiteralExpression(*this)); - } - - std::unique_ptr<BaseExpression> DoubleLiteralExpression::clone(std::map<std::string, std::string> const& renaming, storm::parser::prism::VariableState const& variableState) const { - return std::unique_ptr<BaseExpression>(new DoubleLiteralExpression(this->value)); - } - - double DoubleLiteralExpression::getValueAsDouble(std::pair<std::vector<bool>, std::vector<int_fast64_t>> const* variableValues) const { - return value; - } - - void DoubleLiteralExpression::accept(ExpressionVisitor* visitor) { - visitor->visit(this); - } - - std::string DoubleLiteralExpression::toString() const { - std::stringstream result; - result << value; - return result.str(); - } - - } // namespace expressions - } // namespace ir -} // namespace storm \ No newline at end of file diff --git a/src/ir/expressions/DoubleLiteralExpression.h b/src/ir/expressions/DoubleLiteralExpression.h deleted file mode 100644 index 7105858c2..000000000 --- a/src/ir/expressions/DoubleLiteralExpression.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - * DoubleLiteralExpression.h - * - * Created on: 03.01.2013 - * Author: Christian Dehnert - */ - -#ifndef STORM_IR_EXPRESSIONS_DOUBLELITERALEXPRESSION_H_ -#define STORM_IR_EXPRESSIONS_DOUBLELITERALEXPRESSION_H_ - -#include "src/ir/expressions/BaseExpression.h" - -namespace storm { - namespace ir { - namespace expressions { - - /*! - * A class representing a double literal. - */ - class DoubleLiteralExpression : public BaseExpression { - public: - /*! - * Creates a double literal expression with the given value. - * - * @param value The value for the double literal. - */ - DoubleLiteralExpression(double value); - - /*! - * Copy-constructs from the given expression. - * - * @param doubleLiteralExpression The expression to copy. - */ - DoubleLiteralExpression(DoubleLiteralExpression const& doubleLiteralExpression); - - virtual std::unique_ptr<BaseExpression> clone() const override; - - virtual std::unique_ptr<BaseExpression> clone(std::map<std::string, std::string> const& renaming, storm::parser::prism::VariableState const& variableState) const override; - - virtual double getValueAsDouble(std::pair<std::vector<bool>, std::vector<int_fast64_t>> const* variableValues) const override; - - virtual void accept(ExpressionVisitor* visitor) override; - - virtual std::string toString() const override; - - private: - // The value of the double literal. - double value; - }; - - } // namespace expressions - } // namespace ir -} // namespace storm - -#endif /* STORM_IR_EXPRESSIONS_DOUBLELITERALEXPRESSION_H_ */ diff --git a/src/ir/expressions/ExpressionVisitor.h b/src/ir/expressions/ExpressionVisitor.h deleted file mode 100644 index d301e9792..000000000 --- a/src/ir/expressions/ExpressionVisitor.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - * ExpressionVisitor.h - * - * Created on: 26.01.2013 - * Author: Christian Dehnert - */ - -#ifndef STORM_IR_EXPRESSIONS_EXPRESSIONVISITOR_H_ -#define STORM_IR_EXPRESSIONS_EXPRESSIONVISITOR_H_ - -namespace storm { - namespace ir { - namespace expressions { - - class BaseExpression; - class BinaryBooleanFunctionExpression; - class BinaryNumericalFunctionExpression; - class BinaryRelationExpression; - class BooleanConstantExpression; - class BooleanLiteralExpression; - class DoubleConstantExpression; - class DoubleLiteralExpression; - class IntegerConstantExpression; - class IntegerLiteralExpression; - class UnaryBooleanFunctionExpression; - class UnaryNumericalFunctionExpression; - class VariableExpression; - - class ExpressionVisitor { - public: - virtual void visit(BinaryBooleanFunctionExpression* expression) = 0; - virtual void visit(BinaryNumericalFunctionExpression* expression) = 0; - virtual void visit(BinaryRelationExpression* expression) = 0; - virtual void visit(BooleanConstantExpression* expression) = 0; - virtual void visit(BooleanLiteralExpression* expression) = 0; - virtual void visit(DoubleConstantExpression* expression) = 0; - virtual void visit(DoubleLiteralExpression* expression) = 0; - virtual void visit(IntegerConstantExpression* expression) = 0; - virtual void visit(IntegerLiteralExpression* expression) = 0; - virtual void visit(UnaryBooleanFunctionExpression* expression) = 0; - virtual void visit(UnaryNumericalFunctionExpression* expression) = 0; - virtual void visit(VariableExpression* expression) = 0; - }; - - } // namespace expressions - } // namespace ir -} // namespace storm - -#endif /* STORM_IR_EXPRESSIONS_EXPRESSIONVISITOR_H_ */ diff --git a/src/ir/expressions/Expressions.h b/src/ir/expressions/Expressions.h deleted file mode 100644 index 634a0585d..000000000 --- a/src/ir/expressions/Expressions.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Expressions.h - * - * Created on: 03.01.2013 - * Author: Christian Dehnert - */ - -#ifndef STORM_IR_EXPRESSIONS_EXPRESSIONS_H_ -#define STORM_IR_EXPRESSIONS_EXPRESSIONS_H_ - -#include "BaseExpression.h" -#include "BinaryBooleanFunctionExpression.h" -#include "BinaryNumericalFunctionExpression.h" -#include "BinaryRelationExpression.h" -#include "BooleanLiteralExpression.h" -#include "DoubleLiteralExpression.h" -#include "IntegerLiteralExpression.h" -#include "UnaryBooleanFunctionExpression.h" -#include "UnaryNumericalFunctionExpression.h" -#include "VariableExpression.h" -#include "ConstantExpression.h" -#include "BooleanConstantExpression.h" -#include "IntegerConstantExpression.h" -#include "DoubleConstantExpression.h" - -#endif /* STORM_IR_EXPRESSIONS_EXPRESSIONS_H_ */ diff --git a/src/ir/expressions/IntegerConstantExpression.cpp b/src/ir/expressions/IntegerConstantExpression.cpp deleted file mode 100644 index bcc5cb0eb..000000000 --- a/src/ir/expressions/IntegerConstantExpression.cpp +++ /dev/null @@ -1,48 +0,0 @@ -/* - * IntegerConstantExpression.cpp - * - * Created on: 10.06.2013 - * Author: Christian Dehnert - */ - -#include "IntegerConstantExpression.h" - -namespace storm { - namespace ir { - namespace expressions { - - IntegerConstantExpression::IntegerConstantExpression(std::string const& constantName) : ConstantExpression(int_, constantName) { - // Nothing to do here. - } - - IntegerConstantExpression::IntegerConstantExpression(IntegerConstantExpression const& integerConstantExpression) : ConstantExpression(integerConstantExpression) { - // Nothing to do here. - } - - std::unique_ptr<BaseExpression> IntegerConstantExpression::clone() const { - return std::unique_ptr<BaseExpression>(new IntegerConstantExpression(*this)); - } - - std::unique_ptr<BaseExpression> IntegerConstantExpression::clone(std::map<std::string, std::string> const& renaming, storm::parser::prism::VariableState const& variableState) const { - return std::unique_ptr<BaseExpression>(new IntegerConstantExpression(*this)); - } - - double IntegerConstantExpression::getValueAsDouble(std::pair<std::vector<bool>, std::vector<int_fast64_t>> const* variableValues) const { - return static_cast<double>(getValueAsInt(variableValues)); - } - - int_fast64_t IntegerConstantExpression::getValueAsInt(std::pair<std::vector<bool>, std::vector<int_fast64_t>> const* variableValues) const { - if (!this->isDefined()) { - throw storm::exceptions::ExpressionEvaluationException() << "Cannot evaluate expression: " - << "Integer constant '" << this->getConstantName() << "' is undefined."; - } else { - return this->getValue(); - } - } - - void IntegerConstantExpression::accept(ExpressionVisitor* visitor) { - visitor->visit(this); - } - } // namespace expressions - } // namespace ir -} // namespace storm \ No newline at end of file diff --git a/src/ir/expressions/IntegerConstantExpression.h b/src/ir/expressions/IntegerConstantExpression.h deleted file mode 100644 index 04370574d..000000000 --- a/src/ir/expressions/IntegerConstantExpression.h +++ /dev/null @@ -1,51 +0,0 @@ -/* - * IntegerConstantExpression.h - * - * Created on: 04.01.2013 - * Author: Christian Dehnert - */ - -#ifndef STORM_IR_EXPRESSIONS_INTEGERCONSTANTEXPRESSION_H_ -#define STORM_IR_EXPRESSIONS_INTEGERCONSTANTEXPRESSION_H_ - -#include "ConstantExpression.h" - -namespace storm { - namespace ir { - namespace expressions { - - /*! - * A class representing a constant expression of type integer. - */ - class IntegerConstantExpression : public ConstantExpression<int_fast64_t> { - public: - /*! - * Creates an integer constant expression with the given constant name. - * - * @param constantName The name of the constant to use. - */ - IntegerConstantExpression(std::string const& constantName); - - /*! - * Copy-constructs from the given expression. - * - * @param integerConstantExpression The expression to copy. - */ - IntegerConstantExpression(IntegerConstantExpression const& integerConstantExpression); - - virtual std::unique_ptr<BaseExpression> clone() const override; - - virtual std::unique_ptr<BaseExpression> clone(std::map<std::string, std::string> const& renaming, storm::parser::prism::VariableState const& variableState) const override; - - virtual double getValueAsDouble(std::pair<std::vector<bool>, std::vector<int_fast64_t>> const* variableValues) const override; - - virtual int_fast64_t getValueAsInt(std::pair<std::vector<bool>, std::vector<int_fast64_t>> const* variableValues) const override; - - virtual void accept(ExpressionVisitor* visitor) override; - }; - - } // namespace expressions - } // namespace ir -} // namespace storm - -#endif /* STORM_IR_EXPRESSIONS_INTEGERCONSTANTEXPRESSION_H_ */ diff --git a/src/ir/expressions/IntegerLiteralExpression.cpp b/src/ir/expressions/IntegerLiteralExpression.cpp deleted file mode 100644 index ed3277f18..000000000 --- a/src/ir/expressions/IntegerLiteralExpression.cpp +++ /dev/null @@ -1,53 +0,0 @@ -/* - * IntegerLiteralExpression.cpp - * - * Created on: 03.01.2013 - * Author: Christian Dehnert - */ - -#include <sstream> - -#include "IntegerLiteralExpression.h" - -namespace storm { - namespace ir { - namespace expressions { - - IntegerLiteralExpression::IntegerLiteralExpression(int_fast64_t value) : BaseExpression(int_), value(value) { - // Nothing to do here. - } - - IntegerLiteralExpression::IntegerLiteralExpression(IntegerLiteralExpression const& integerLiteralExpression) - : BaseExpression(integerLiteralExpression), value(integerLiteralExpression.value) { - // Nothing to do here. - } - - std::unique_ptr<BaseExpression> IntegerLiteralExpression::clone() const { - return std::unique_ptr<BaseExpression>(new IntegerLiteralExpression(*this)); - } - - std::unique_ptr<BaseExpression> IntegerLiteralExpression::clone(std::map<std::string, std::string> const& renaming, storm::parser::prism::VariableState const& variableState) const { - return std::unique_ptr<BaseExpression>(new IntegerLiteralExpression(this->value)); - } - - double IntegerLiteralExpression::getValueAsDouble(std::pair<std::vector<bool>, std::vector<int_fast64_t>> const* variableValues) const { - return static_cast<double>(value); - } - - int_fast64_t IntegerLiteralExpression::getValueAsInt(std::pair<std::vector<bool>, std::vector<int_fast64_t>> const* variableValues) const { - return value; - } - - void IntegerLiteralExpression::accept(ExpressionVisitor* visitor) { - visitor->visit(this); - } - - std::string IntegerLiteralExpression::toString() const { - std::stringstream result; - result << value; - return result.str(); - } - - } // namespace expressions - } // namespace ir -} // namespace storm \ No newline at end of file diff --git a/src/ir/expressions/IntegerLiteralExpression.h b/src/ir/expressions/IntegerLiteralExpression.h deleted file mode 100644 index cb1041684..000000000 --- a/src/ir/expressions/IntegerLiteralExpression.h +++ /dev/null @@ -1,57 +0,0 @@ -/* - * IntegerLiteralExpression.h - * - * Created on: 03.01.2013 - * Author: Christian Dehnert - */ - -#ifndef STORM_IR_EXPRESSIONS_INTEGERLITERALEXPRESSION_H_ -#define STORM_IR_EXPRESSIONS_INTEGERLITERALEXPRESSION_H_ - -#include "src/ir/expressions/BaseExpression.h" - -namespace storm { - namespace ir { - namespace expressions { - - /*! - * A class representing an integer literal. - */ - class IntegerLiteralExpression : public BaseExpression { - public: - /*! - * Creates an integer literal expression with the given value. - * - * @param value The value for the integer literal. - */ - IntegerLiteralExpression(int_fast64_t value); - - /*! - * Copy-constructs from the given expression. - * - * @param integerLiteralExpression The expression to copy. - */ - IntegerLiteralExpression(IntegerLiteralExpression const& integerLiteralExpression); - - virtual std::unique_ptr<BaseExpression> clone() const override; - - virtual std::unique_ptr<BaseExpression> clone(std::map<std::string, std::string> const& renaming, storm::parser::prism::VariableState const& variableState) const override; - - virtual double getValueAsDouble(std::pair<std::vector<bool>, std::vector<int_fast64_t>> const* variableValues) const override; - - virtual int_fast64_t getValueAsInt(std::pair<std::vector<bool>, std::vector<int_fast64_t>> const* variableValues) const override; - - virtual void accept(ExpressionVisitor* visitor) override; - - virtual std::string toString() const override; - - private: - // The value of the double literal. - int_fast64_t value; - }; - - } // namespace expressions - } // namespace ir -} // namespace storm - -#endif /* STORM_IR_EXPRESSIONS_INTEGERLITERALEXPRESSION_H_ */ diff --git a/src/ir/expressions/UnaryBooleanFunctionExpression.cpp b/src/ir/expressions/UnaryBooleanFunctionExpression.cpp deleted file mode 100644 index 3b0e6ca03..000000000 --- a/src/ir/expressions/UnaryBooleanFunctionExpression.cpp +++ /dev/null @@ -1,62 +0,0 @@ -/* - * UnaryBooleanFunctionExpression.cpp - * - * Created on: 10.06.2013 - * Author: Christian Dehnert - */ - -#include <sstream> - -#include "UnaryBooleanFunctionExpression.h" - -namespace storm { - namespace ir { - namespace expressions { - - UnaryBooleanFunctionExpression::UnaryBooleanFunctionExpression(std::unique_ptr<BaseExpression>&& child, FunctionType functionType) : UnaryExpression(bool_, std::move(child)), functionType(functionType) { - // Nothing to do here. - } - - UnaryBooleanFunctionExpression::UnaryBooleanFunctionExpression(UnaryBooleanFunctionExpression const& unaryBooleanFunctionExpression) : UnaryExpression(unaryBooleanFunctionExpression), functionType(unaryBooleanFunctionExpression.functionType) { - // Nothing to do here. - } - - std::unique_ptr<BaseExpression> UnaryBooleanFunctionExpression::clone() const { - return std::unique_ptr<BaseExpression>(new UnaryBooleanFunctionExpression(this->getChild()->clone(), functionType)); - } - - std::unique_ptr<BaseExpression> UnaryBooleanFunctionExpression::clone(std::map<std::string, std::string> const& renaming, storm::parser::prism::VariableState const& variableState) const { - return std::unique_ptr<BaseExpression>(new UnaryBooleanFunctionExpression(this->getChild()->clone(renaming, variableState), this->functionType)); - } - - UnaryBooleanFunctionExpression::FunctionType UnaryBooleanFunctionExpression::getFunctionType() const { - return functionType; - } - - bool UnaryBooleanFunctionExpression::getValueAsBool(std::pair<std::vector<bool>, std::vector<int_fast64_t>> const* variableValues) const { - bool resultChild = this->getChild()->getValueAsBool(variableValues); - switch(functionType) { - case NOT: return !resultChild; break; - default: throw storm::exceptions::ExpressionEvaluationException() << "Cannot evaluate expression: " - << "Unknown boolean unary operator: '" << functionType << "'."; - } - } - - void UnaryBooleanFunctionExpression::accept(ExpressionVisitor* visitor) { - visitor->visit(this); - } - - std::string UnaryBooleanFunctionExpression::toString() const { - std::stringstream result; - result << "("; - switch (functionType) { - case NOT: result << "!"; break; - } - result << this->getChild()->toString() << ")"; - - return result.str(); - } - - } // namespace expressions - } // namespace ir -} // namespace storm diff --git a/src/ir/expressions/UnaryBooleanFunctionExpression.h b/src/ir/expressions/UnaryBooleanFunctionExpression.h deleted file mode 100644 index a3087f5e5..000000000 --- a/src/ir/expressions/UnaryBooleanFunctionExpression.h +++ /dev/null @@ -1,68 +0,0 @@ -/* - * UnaryBooleanFunctionExpression.h - * - * Created on: 03.01.2013 - * Author: Christian Dehnert - */ - -#ifndef STORM_IR_EXPRESSIONS_UNARYBOOLEANFUNCTIONEXPRESSION_H_ -#define STORM_IR_EXPRESSIONS_UNARYBOOLEANFUNCTIONEXPRESSION_H_ - -#include "UnaryExpression.h" - -namespace storm { - namespace ir { - namespace expressions { - - /*! - * A class representing a unary function expression of boolean type. - */ - class UnaryBooleanFunctionExpression : public UnaryExpression { - public: - /*! - * An enum type specifying the different functions applicable. - */ - enum FunctionType {NOT}; - - /*! - * Creates a unary boolean function expression tree node with the given child and function type. - * - * @param child The child of the node. - * @param functionType The operator that is to be applied to the two children. - */ - UnaryBooleanFunctionExpression(std::unique_ptr<BaseExpression>&& child, FunctionType functionType); - - /*! - * Copy-constructs from the given expression. - * - * @param unaryBooleanFunctionExpression The expression to copy. - */ - UnaryBooleanFunctionExpression(UnaryBooleanFunctionExpression const& unaryBooleanFunctionExpression); - - virtual std::unique_ptr<BaseExpression> clone() const override; - - virtual std::unique_ptr<BaseExpression> clone(std::map<std::string, std::string> const& renaming, storm::parser::prism::VariableState const& variableState) const override; - - /*! - * Retrieves the operator that is associated with this node. - * - * @param The operator that is associated with this node. - */ - FunctionType getFunctionType() const; - - virtual bool getValueAsBool(std::pair<std::vector<bool>, std::vector<int_fast64_t>> const* variableValues) const override; - - virtual void accept(ExpressionVisitor* visitor) override; - - virtual std::string toString() const override; - - private: - // The operator that is associated with this node. - FunctionType functionType; - }; - - } // namespace expressions - } // namespace ir -} // namespace storm - -#endif /* STORM_IR_EXPRESSIONS_UNARYBOOLEANFUNCTIONEXPRESSION_H_ */ diff --git a/src/ir/expressions/UnaryExpression.cpp b/src/ir/expressions/UnaryExpression.cpp deleted file mode 100644 index 31463aff3..000000000 --- a/src/ir/expressions/UnaryExpression.cpp +++ /dev/null @@ -1,39 +0,0 @@ -/* - * UnaryExpression.cpp - * - * Created on: 27.01.2013 - * Author: Christian Dehnert - */ - -#include "UnaryExpression.h" - -namespace storm { - namespace ir { - namespace expressions { - - UnaryExpression::UnaryExpression(ReturnType type, std::unique_ptr<BaseExpression>&& child) : BaseExpression(type), child(std::move(child)) { - // Nothing to do here. - } - - UnaryExpression::UnaryExpression(UnaryExpression const& unaryExpression) : BaseExpression(unaryExpression), child(unaryExpression.child->clone()) { - // Nothing to do here. - } - - std::unique_ptr<BaseExpression> const& UnaryExpression::getChild() const { - return child; - } - - BaseExpression* UnaryExpression::performSubstitution(std::map<std::string, std::reference_wrapper<BaseExpression>> const& substitution) { - BaseExpression* newChild = child->performSubstitution(substitution); - - // Only update the child if it changed, because otherwise the child gets destroyed. - if (newChild != child.get()) { - child = std::unique_ptr<BaseExpression>(newChild); - } - - return this; - } - - } // namespace expressions - } // namespace ir -} // namespace storm diff --git a/src/ir/expressions/UnaryExpression.h b/src/ir/expressions/UnaryExpression.h deleted file mode 100644 index cfc685455..000000000 --- a/src/ir/expressions/UnaryExpression.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - * UnaryExpression.h - * - * Created on: 27.01.2013 - * Author: Christian Dehnert - */ - -#ifndef STORM_IR_EXPRESSIONS_UNARYEXPRESSION_H_ -#define STORM_IR_EXPRESSIONS_UNARYEXPRESSION_H_ - -#include "BaseExpression.h" - -namespace storm { - namespace ir { - namespace expressions { - - /*! - * A class representing a generic unary expression. - */ - class UnaryExpression : public BaseExpression { - public: - /*! - * Constructs a unary expression with the given type and child. - * @param type The type of the unary expression. - * @param right The child of the unary expression. - */ - UnaryExpression(ReturnType type, std::unique_ptr<BaseExpression>&& child); - - /*! - * Copy-constructs from the given expression. - * - * @param unaryExpression The expression to copy. - */ - UnaryExpression(UnaryExpression const& unaryExpression); - - /*! - * Retrieves the child of the expression node. - * - * @return The child of the expression node. - */ - std::unique_ptr<BaseExpression> const& getChild() const; - - protected: - virtual BaseExpression* performSubstitution(std::map<std::string, std::reference_wrapper<BaseExpression>> const& substitution) override; - - private: - // The left child of the unary expression. - std::unique_ptr<BaseExpression> child; - }; - - } // namespace expressions - } // namespace ir -} // namespace storm - -#endif /* STORM_IR_EXPRESSIONS_UNARYEXPRESSION_H_ */ diff --git a/src/ir/expressions/UnaryNumericalFunctionExpression.cpp b/src/ir/expressions/UnaryNumericalFunctionExpression.cpp deleted file mode 100644 index 6b4b1fbb2..000000000 --- a/src/ir/expressions/UnaryNumericalFunctionExpression.cpp +++ /dev/null @@ -1,86 +0,0 @@ -/* - * UnaryFunctionExpression.h - * - * Created on: 03.01.2013 - * Author: Christian Dehnert - */ - -#include <cmath> - -#include "UnaryNumericalFunctionExpression.h" - -namespace storm { - namespace ir { - namespace expressions { - - UnaryNumericalFunctionExpression::UnaryNumericalFunctionExpression(ReturnType type, std::unique_ptr<BaseExpression>&& child, FunctionType functionType) : UnaryExpression(type, std::move(child)), functionType(functionType) { - // Nothing to do here. - } - - UnaryNumericalFunctionExpression::UnaryNumericalFunctionExpression(UnaryNumericalFunctionExpression const& unaryNumericalFunctionExpression) : UnaryExpression(unaryNumericalFunctionExpression), functionType(unaryNumericalFunctionExpression.functionType) { - // Nothing to do here. - } - - std::unique_ptr<BaseExpression> UnaryNumericalFunctionExpression::clone() const { - return std::unique_ptr<BaseExpression>(new UnaryNumericalFunctionExpression(this->getType(), this->getChild()->clone(), functionType)); - } - - std::unique_ptr<BaseExpression> UnaryNumericalFunctionExpression::clone(std::map<std::string, std::string> const& renaming, storm::parser::prism::VariableState const& variableState) const { - return std::unique_ptr<BaseExpression>(new UnaryNumericalFunctionExpression(this->getType(), this->getChild()->clone(renaming, variableState), this->functionType)); - } - - int_fast64_t UnaryNumericalFunctionExpression::getValueAsInt(std::pair<std::vector<bool>, std::vector<int_fast64_t>> const* variableValues) const { - if (this->getType() != int_) { - BaseExpression::getValueAsInt(variableValues); - } - - int_fast64_t resultChild = this->getChild()->getValueAsInt(variableValues); - switch(functionType) { - case MINUS: return -resultChild; break; - case FLOOR: return static_cast<int_fast64_t>(std::floor(resultChild)); break; - case CEIL: return static_cast<int_fast64_t>(std::ceil(resultChild)); break; - default: throw storm::exceptions::ExpressionEvaluationException() << "Cannot evaluate expression: " - << "Unknown numerical unary operator: '" << functionType << "'."; - } - } - - double UnaryNumericalFunctionExpression::getValueAsDouble(std::pair<std::vector<bool>, std::vector<int_fast64_t>> const* variableValues) const { - if (this->getType() != double_ && this->getType() != int_) { - BaseExpression::getValueAsDouble(variableValues); - } - - double resultChild = this->getChild()->getValueAsDouble(variableValues); - switch(functionType) { - case MINUS: return -resultChild; break; - case FLOOR: return std::floor(resultChild); break; - case CEIL: return std::ceil(resultChild); break; - default: throw storm::exceptions::ExpressionEvaluationException() << "Cannot evaluate expression: " - << "Unknown numerical unary operator: '" << functionType << "'."; - } - } - - UnaryNumericalFunctionExpression::FunctionType UnaryNumericalFunctionExpression::getFunctionType() const { - return functionType; - } - - void UnaryNumericalFunctionExpression::accept(ExpressionVisitor* visitor) { - visitor->visit(this); - } - - std::string UnaryNumericalFunctionExpression::toString() const { - std::stringstream result; - result << "("; - switch (functionType) { - case MINUS: result << "-"; break; - case FLOOR: result << "floor("; break; - case CEIL: result << "ceil("; break; - } - result << this->getChild()->toString() << ")"; - - return result.str(); - } - - } // namespace expressions - } // namespace ir -} // namespace storm - diff --git a/src/ir/expressions/UnaryNumericalFunctionExpression.h b/src/ir/expressions/UnaryNumericalFunctionExpression.h deleted file mode 100644 index bcb942378..000000000 --- a/src/ir/expressions/UnaryNumericalFunctionExpression.h +++ /dev/null @@ -1,70 +0,0 @@ -/* - * UnaryFunctionExpression.h - * - * Created on: 03.01.2013 - * Author: Christian Dehnert - */ - -#ifndef STORM_IR_EXPRESSIONS_UNARYFUNCTIONEXPRESSION_H_ -#define STORM_IR_EXPRESSIONS_UNARYFUNCTIONEXPRESSION_H_ - -#include "UnaryExpression.h" - -namespace storm { - namespace ir { - namespace expressions { - - /*! - * A class representing a unary function expression of numerical type. - */ - class UnaryNumericalFunctionExpression : public UnaryExpression { - public: - /*! - * An enum type specifying the different functions applicable. - */ - enum FunctionType {MINUS, FLOOR, CEIL}; - - /*! - * Creates a unary numerical function expression tree node with the given child and function type. - * - * @param child The child of the node. - * @param functionType The operator that is to be applied to the two children. - */ - UnaryNumericalFunctionExpression(ReturnType type, std::unique_ptr<BaseExpression>&& child, FunctionType functionType); - - /*! - * Copy-constructs from the given expression. - * - * @param unaryNumericalFunctionExpression The expression to copy. - */ - UnaryNumericalFunctionExpression(UnaryNumericalFunctionExpression const& unaryNumericalFunctionExpression); - - virtual std::unique_ptr<BaseExpression> clone() const override; - - virtual std::unique_ptr<BaseExpression> clone(std::map<std::string, std::string> const& renaming, storm::parser::prism::VariableState const& variableState) const override; - - virtual int_fast64_t getValueAsInt(std::pair<std::vector<bool>, std::vector<int_fast64_t>> const* variableValues) const override; - - virtual double getValueAsDouble(std::pair<std::vector<bool>, std::vector<int_fast64_t>> const* variableValues) const override; - - /*! - * Retrieves the operator that is associated with this node. - * - * @param The operator that is associated with this node. - */ - FunctionType getFunctionType() const; - - virtual void accept(ExpressionVisitor* visitor) override; - - virtual std::string toString() const override; - - private: - // The operator that is associated with this node. - FunctionType functionType; - }; - - } // namespace expressions - } // namespace ir -} // namespace storm - -#endif /* STORM_IR_EXPRESSIONS_UNARYFUNCTIONEXPRESSION_H_ */ diff --git a/src/ir/expressions/VariableExpression.cpp b/src/ir/expressions/VariableExpression.cpp deleted file mode 100644 index 9bf09a734..000000000 --- a/src/ir/expressions/VariableExpression.cpp +++ /dev/null @@ -1,120 +0,0 @@ -/* - * VariableExpression.cpp - * - * Created on: 10.06.2013 - * Author: Christian Dehnert - */ - -#include "VariableExpression.h" -#include "src/parser/prismparser/VariableState.h" -#include "src/exceptions/ExpressionEvaluationException.h" - -namespace storm { - namespace ir { - namespace expressions { - - VariableExpression::VariableExpression(ReturnType type, std::string const& variableName) : BaseExpression(type), globalIndex(0), variableName(variableName) { - // Nothing to do here. - } - - VariableExpression::VariableExpression(ReturnType type, uint_fast64_t globalIndex, std::string const& variableName) - : BaseExpression(type), globalIndex(globalIndex), variableName(variableName) { - // Nothing to do here. - } - - VariableExpression::VariableExpression(VariableExpression const& variableExpression) : BaseExpression(variableExpression), globalIndex(variableExpression.globalIndex), variableName(variableExpression.variableName) { - // Nothing to do here. - } - - std::unique_ptr<BaseExpression> VariableExpression::clone() const { - return std::unique_ptr<BaseExpression>(new VariableExpression(*this)); - } - - std::unique_ptr<BaseExpression> VariableExpression::clone(std::map<std::string, std::string> const& renaming, storm::parser::prism::VariableState const& variableState) const { - // Perform the proper cloning. - auto renamingPair = renaming.find(this->variableName); - if (renamingPair != renaming.end()) { - if (this->getType() == int_) { - return variableState.getIntegerVariableExpression(renamingPair->second)->clone(); - } else { - return variableState.getBooleanVariableExpression(renamingPair->second)->clone(); - } - } else { - if (this->getType() == int_) { - return variableState.getIntegerVariableExpression(this->variableName)->clone(); - } else { - return variableState.getBooleanVariableExpression(this->variableName)->clone(); - } - } - } - - BaseExpression* VariableExpression::performSubstitution(std::map<std::string, std::reference_wrapper<BaseExpression>> const& substitution) { - // If the name of the variable is a key of the map, we need to replace it. - auto substitutionIterator = substitution.find(variableName); - - if (substitutionIterator != substitution.end()) { - std::unique_ptr<BaseExpression> expressionClone = substitutionIterator->second.get().clone(); - BaseExpression* rawPointer = expressionClone.release(); - return rawPointer; - } else { - // Otherwise, we don't need to replace anything. - return this; - } - } - - void VariableExpression::accept(ExpressionVisitor* visitor) { - visitor->visit(this); - } - - std::string VariableExpression::toString() const { - return this->variableName; - } - - int_fast64_t VariableExpression::getValueAsInt(std::pair<std::vector<bool>, std::vector<int_fast64_t>> const* variableValues) const { - if (this->getType() != int_) { - BaseExpression::getValueAsInt(variableValues); - } - - if (variableValues != nullptr) { - return variableValues->second[globalIndex]; - } else { - throw storm::exceptions::ExpressionEvaluationException() << "Cannot evaluate expression involving variables without variable values."; - } - } - - bool VariableExpression::getValueAsBool(std::pair<std::vector<bool>, std::vector<int_fast64_t>> const* variableValues) const { - if (this->getType() != bool_) { - BaseExpression::getValueAsBool(variableValues); - } - - if (variableValues != nullptr) { - return variableValues->first[globalIndex]; - } else { - throw storm::exceptions::ExpressionEvaluationException() << "Cannot evaluate expression involving variables without variable values."; - } - } - - double VariableExpression::getValueAsDouble(std::pair<std::vector<bool>, std::vector<int_fast64_t>> const* variableValues) const { - if (this->getType() != double_ && this->getType() != int_) { - BaseExpression::getValueAsDouble(variableValues); - } - - // Because only int variables can deliver a double value, we only need to check them. - if (variableValues != nullptr) { - return static_cast<double>(variableValues->second[globalIndex]); - } else { - throw storm::exceptions::ExpressionEvaluationException() << "Cannot evaluate expression with variable '" << variableName << "' of type double."; - } - } - - std::string const& VariableExpression::getVariableName() const { - return variableName; - } - - uint_fast64_t VariableExpression::getGlobalVariableIndex() const { - return this->globalIndex; - } - - } // namespace expressions - } // namespace ir -} // namespace storm diff --git a/src/ir/expressions/VariableExpression.h b/src/ir/expressions/VariableExpression.h deleted file mode 100644 index 99358d377..000000000 --- a/src/ir/expressions/VariableExpression.h +++ /dev/null @@ -1,98 +0,0 @@ -/* - * VariableExpression.h - * - * Created on: 03.01.2013 - * Author: Christian Dehnert - */ - -#ifndef STORM_IR_EXPRESSIONS_VARIABLEEXPRESSION_H_ -#define STORM_IR_EXPRESSIONS_VARIABLEEXPRESSION_H_ - -#include "BaseExpression.h" - -namespace storm { - - // Forward-declare VariableState. - namespace parser { - namespace prismparser { - class VariableState; - } // namespace prismparser - } // namespace parser - - namespace ir { - namespace expressions { - - /*! - * A class representing a variable in the expression tree. - */ - class VariableExpression : public BaseExpression { - public: - /*! - * Creates a variable expression of the given type with the given name. As this variable has no indices - * it is only meant as a dummy and needs to be replaced with a "full" variable expression. - * - * @param type The type of the variable. - * @param variableName The name of the variable. - */ - VariableExpression(ReturnType type, std::string const& variableName); - - /*! - * Creates a variable expression of the given type with the given name and indices. - * - * @param type The type of the variable. - * @param globalIndex The global (i.e. program-wide) index of the variable. - * @param variableName The name of the variable. - */ - VariableExpression(ReturnType type, uint_fast64_t globalIndex, std::string const& variableName); - - /*! - * Copy-constructs from the given expression. - * - * @param variableExpression The expression to copy. - */ - VariableExpression(VariableExpression const& variableExpression); - - virtual std::unique_ptr<BaseExpression> clone() const override; - - virtual std::unique_ptr<BaseExpression> clone(std::map<std::string, std::string> const& renaming, storm::parser::prism::VariableState const& variableState) const override; - - virtual void accept(ExpressionVisitor* visitor) override; - - virtual std::string toString() const override; - - virtual int_fast64_t getValueAsInt(std::pair<std::vector<bool>, std::vector<int_fast64_t>> const* variableValues) const override; - - virtual bool getValueAsBool(std::pair<std::vector<bool>, std::vector<int_fast64_t>> const* variableValues) const override; - - virtual double getValueAsDouble(std::pair<std::vector<bool>, std::vector<int_fast64_t>> const* variableValues) const override; - - /*! - * Retrieves the name of the variable. - * - * @return The name of the variable. - */ - std::string const& getVariableName() const; - - /*! - * Retrieves the global (i.e. program-wide) index of the variable. - * - * @return The global index of the variable. - */ - uint_fast64_t getGlobalVariableIndex() const; - - protected: - virtual BaseExpression* performSubstitution(std::map<std::string, std::reference_wrapper<BaseExpression>> const& substitution) override; - - private: - // The global index of the variable. - uint_fast64_t globalIndex; - - // The name of the variable. - std::string variableName; - }; - - } // namespace expressions - } // namespace ir -} // namespace storm - -#endif /* STORM_IR_EXPRESSIONS_VARIABLEEXPRESSION_H_ */ diff --git a/src/storage/dd/CuddDd.cpp b/src/storage/dd/CuddDd.cpp index 97ca50507..69fadf5c9 100644 --- a/src/storage/dd/CuddDd.cpp +++ b/src/storage/dd/CuddDd.cpp @@ -7,25 +7,25 @@ namespace storm { namespace dd { - Dd<CUDD>::Dd(std::shared_ptr<DdManager<CUDD>> ddManager, ADD cuddAdd, std::set<std::string> const& containedMetaVariableNames) : ddManager(ddManager), cuddAdd(cuddAdd), containedMetaVariableNames(containedMetaVariableNames) { + Dd<DdType::CUDD>::Dd(std::shared_ptr<DdManager<DdType::CUDD>> ddManager, ADD cuddAdd, std::set<std::string> const& containedMetaVariableNames) : ddManager(ddManager), cuddAdd(cuddAdd), containedMetaVariableNames(containedMetaVariableNames) { // Intentionally left empty. } - bool Dd<CUDD>::operator==(Dd<CUDD> const& other) const { + bool Dd<DdType::CUDD>::operator==(Dd<DdType::CUDD> const& other) const { return this->cuddAdd == other.getCuddAdd(); } - bool Dd<CUDD>::operator!=(Dd<CUDD> const& other) const { + bool Dd<DdType::CUDD>::operator!=(Dd<DdType::CUDD> const& other) const { return this->cuddAdd == other.getCuddAdd(); } - Dd<CUDD> Dd<CUDD>::operator+(Dd<CUDD> const& other) const { - Dd<CUDD> result(*this); + Dd<DdType::CUDD> Dd<DdType::CUDD>::operator+(Dd<DdType::CUDD> const& other) const { + Dd<DdType::CUDD> result(*this); result += other; return result; } - Dd<CUDD>& Dd<CUDD>::operator+=(Dd<CUDD> const& other) { + Dd<DdType::CUDD>& Dd<DdType::CUDD>::operator+=(Dd<DdType::CUDD> const& other) { this->cuddAdd += other.getCuddAdd(); // Join the variable sets of the two participating DDs. @@ -34,13 +34,13 @@ namespace storm { return *this; } - Dd<CUDD> Dd<CUDD>::operator*(Dd<CUDD> const& other) const { - Dd<CUDD> result(*this); + Dd<DdType::CUDD> Dd<DdType::CUDD>::operator*(Dd<DdType::CUDD> const& other) const { + Dd<DdType::CUDD> result(*this); result *= other; return result; } - Dd<CUDD>& Dd<CUDD>::operator*=(Dd<CUDD> const& other) { + Dd<DdType::CUDD>& Dd<DdType::CUDD>::operator*=(Dd<DdType::CUDD> const& other) { this->cuddAdd *= other.getCuddAdd(); // Join the variable sets of the two participating DDs. @@ -49,13 +49,13 @@ namespace storm { return *this; } - Dd<CUDD> Dd<CUDD>::operator-(Dd<CUDD> const& other) const { - Dd<CUDD> result(*this); + Dd<DdType::CUDD> Dd<DdType::CUDD>::operator-(Dd<DdType::CUDD> const& other) const { + Dd<DdType::CUDD> result(*this); result -= other; return result; } - Dd<CUDD>& Dd<CUDD>::operator-=(Dd<CUDD> const& other) { + Dd<DdType::CUDD>& Dd<DdType::CUDD>::operator-=(Dd<DdType::CUDD> const& other) { this->cuddAdd -= other.getCuddAdd(); // Join the variable sets of the two participating DDs. @@ -64,13 +64,13 @@ namespace storm { return *this; } - Dd<CUDD> Dd<CUDD>::operator/(Dd<CUDD> const& other) const { - Dd<CUDD> result(*this); + Dd<DdType::CUDD> Dd<DdType::CUDD>::operator/(Dd<DdType::CUDD> const& other) const { + Dd<DdType::CUDD> result(*this); result /= other; return result; } - Dd<CUDD>& Dd<CUDD>::operator/=(Dd<CUDD> const& other) { + Dd<DdType::CUDD>& Dd<DdType::CUDD>::operator/=(Dd<DdType::CUDD> const& other) { this->cuddAdd = this->cuddAdd.Divide(other.getCuddAdd()); // Join the variable sets of the two participating DDs. @@ -79,55 +79,55 @@ namespace storm { return *this; } - Dd<CUDD> Dd<CUDD>::operator~() const { - Dd<CUDD> result(*this); + Dd<DdType::CUDD> Dd<DdType::CUDD>::operator~() const { + Dd<DdType::CUDD> result(*this); result.complement(); return result; } - Dd<CUDD>& Dd<CUDD>::complement() { + Dd<DdType::CUDD>& Dd<DdType::CUDD>::complement() { this->cuddAdd = ~this->cuddAdd; return *this; } - Dd<CUDD> Dd<CUDD>::equals(Dd<CUDD> const& other) const { - Dd<CUDD> result(*this); + Dd<DdType::CUDD> Dd<DdType::CUDD>::equals(Dd<DdType::CUDD> const& other) const { + Dd<DdType::CUDD> result(*this); result.cuddAdd = result.cuddAdd.Equals(other.getCuddAdd()); return result; } - Dd<CUDD> Dd<CUDD>::notEquals(Dd<CUDD> const& other) const { - Dd<CUDD> result(*this); + Dd<DdType::CUDD> Dd<DdType::CUDD>::notEquals(Dd<DdType::CUDD> const& other) const { + Dd<DdType::CUDD> result(*this); result.cuddAdd = result.cuddAdd.NotEquals(other.getCuddAdd()); return result; } - Dd<CUDD> Dd<CUDD>::less(Dd<CUDD> const& other) const { - Dd<CUDD> result(*this); + Dd<DdType::CUDD> Dd<DdType::CUDD>::less(Dd<DdType::CUDD> const& other) const { + Dd<DdType::CUDD> result(*this); result.cuddAdd = result.cuddAdd.LessThan(other.getCuddAdd()); return result; } - Dd<CUDD> Dd<CUDD>::lessOrEqual(Dd<CUDD> const& other) const { - Dd<CUDD> result(*this); + Dd<DdType::CUDD> Dd<DdType::CUDD>::lessOrEqual(Dd<DdType::CUDD> const& other) const { + Dd<DdType::CUDD> result(*this); result.cuddAdd = result.cuddAdd.LessThanOrEqual(other.getCuddAdd()); return result; } - Dd<CUDD> Dd<CUDD>::greater(Dd<CUDD> const& other) const { - Dd<CUDD> result(*this); + Dd<DdType::CUDD> Dd<DdType::CUDD>::greater(Dd<DdType::CUDD> const& other) const { + Dd<DdType::CUDD> result(*this); result.cuddAdd = result.cuddAdd.GreaterThan(other.getCuddAdd()); return result; } - Dd<CUDD> Dd<CUDD>::greaterOrEqual(Dd<CUDD> const& other) const { - Dd<CUDD> result(*this); + Dd<DdType::CUDD> Dd<DdType::CUDD>::greaterOrEqual(Dd<DdType::CUDD> const& other) const { + Dd<DdType::CUDD> result(*this); result.cuddAdd = result.cuddAdd.GreaterThanOrEqual(other.getCuddAdd()); return result; } - void Dd<CUDD>::existsAbstract(std::set<std::string> const& metaVariableNames) { - Dd<CUDD> cubeDd(this->getDdManager()->getOne()); + void Dd<DdType::CUDD>::existsAbstract(std::set<std::string> const& metaVariableNames) { + Dd<DdType::CUDD> cubeDd(this->getDdManager()->getOne()); for (auto const& metaVariableName : metaVariableNames) { // First check whether the DD contains the meta variable and erase it, if this is the case. @@ -136,15 +136,15 @@ namespace storm { } this->getContainedMetaVariableNames().erase(metaVariableName); - DdMetaVariable<CUDD> const& metaVariable = this->getDdManager()->getMetaVariable(metaVariableName); + DdMetaVariable<DdType::CUDD> const& metaVariable = this->getDdManager()->getMetaVariable(metaVariableName); cubeDd *= metaVariable.getCube(); } this->cuddAdd = this->cuddAdd.OrAbstract(cubeDd.getCuddAdd()); } - void Dd<CUDD>::sumAbstract(std::set<std::string> const& metaVariableNames) { - Dd<CUDD> cubeDd(this->getDdManager()->getOne()); + void Dd<DdType::CUDD>::sumAbstract(std::set<std::string> const& metaVariableNames) { + Dd<DdType::CUDD> cubeDd(this->getDdManager()->getOne()); for (auto const& metaVariableName : metaVariableNames) { // First check whether the DD contains the meta variable and erase it, if this is the case. @@ -153,15 +153,15 @@ namespace storm { } this->getContainedMetaVariableNames().erase(metaVariableName); - DdMetaVariable<CUDD> const& metaVariable = this->getDdManager()->getMetaVariable(metaVariableName); + DdMetaVariable<DdType::CUDD> const& metaVariable = this->getDdManager()->getMetaVariable(metaVariableName); cubeDd *= metaVariable.getCube(); } this->cuddAdd = this->cuddAdd.ExistAbstract(cubeDd.getCuddAdd()); } - void Dd<CUDD>::minAbstract(std::set<std::string> const& metaVariableNames) { - Dd<CUDD> cubeDd(this->getDdManager()->getOne()); + void Dd<DdType::CUDD>::minAbstract(std::set<std::string> const& metaVariableNames) { + Dd<DdType::CUDD> cubeDd(this->getDdManager()->getOne()); for (auto const& metaVariableName : metaVariableNames) { // First check whether the DD contains the meta variable and erase it, if this is the case. @@ -170,15 +170,15 @@ namespace storm { } this->getContainedMetaVariableNames().erase(metaVariableName); - DdMetaVariable<CUDD> const& metaVariable = this->getDdManager()->getMetaVariable(metaVariableName); + DdMetaVariable<DdType::CUDD> const& metaVariable = this->getDdManager()->getMetaVariable(metaVariableName); cubeDd *= metaVariable.getCube(); } this->cuddAdd = this->cuddAdd.MinAbstract(cubeDd.getCuddAdd()); } - void Dd<CUDD>::maxAbstract(std::set<std::string> const& metaVariableNames) { - Dd<CUDD> cubeDd(this->getDdManager()->getOne()); + void Dd<DdType::CUDD>::maxAbstract(std::set<std::string> const& metaVariableNames) { + Dd<DdType::CUDD> cubeDd(this->getDdManager()->getOne()); for (auto const& metaVariableName : metaVariableNames) { // First check whether the DD contains the meta variable and erase it, if this is the case. @@ -187,19 +187,19 @@ namespace storm { } this->getContainedMetaVariableNames().erase(metaVariableName); - DdMetaVariable<CUDD> const& metaVariable = this->getDdManager()->getMetaVariable(metaVariableName); + DdMetaVariable<DdType::CUDD> const& metaVariable = this->getDdManager()->getMetaVariable(metaVariableName); cubeDd *= metaVariable.getCube(); } this->cuddAdd = this->cuddAdd.MaxAbstract(cubeDd.getCuddAdd()); } - void Dd<CUDD>::swapVariables(std::vector<std::pair<std::string, std::string>> const& metaVariablePairs) { + void Dd<DdType::CUDD>::swapVariables(std::vector<std::pair<std::string, std::string>> const& metaVariablePairs) { std::vector<ADD> from; std::vector<ADD> to; for (auto const& metaVariablePair : metaVariablePairs) { - DdMetaVariable<CUDD> const& variable1 = this->getDdManager()->getMetaVariable(metaVariablePair.first); - DdMetaVariable<CUDD> const& variable2 = this->getDdManager()->getMetaVariable(metaVariablePair.second); + DdMetaVariable<DdType::CUDD> const& variable1 = this->getDdManager()->getMetaVariable(metaVariablePair.first); + DdMetaVariable<DdType::CUDD> const& variable2 = this->getDdManager()->getMetaVariable(metaVariablePair.second); // Check if it's legal so swap the meta variables. if (variable1.getNumberOfDdVariables() != variable2.getNumberOfDdVariables()) { @@ -230,7 +230,7 @@ namespace storm { this->cuddAdd = this->cuddAdd.SwapVariables(from, to); } - Dd<CUDD> Dd<CUDD>::multiplyMatrix(Dd<CUDD> const& otherMatrix, std::set<std::string> const& summationMetaVariableNames) { + Dd<DdType::CUDD> Dd<DdType::CUDD>::multiplyMatrix(Dd<DdType::CUDD> const& otherMatrix, std::set<std::string> const& summationMetaVariableNames) { std::vector<ADD> summationDdVariables; // Create the CUDD summation variables. @@ -245,10 +245,10 @@ namespace storm { std::set<std::string> containedMetaVariableNames; std::set_difference(unionOfMetaVariableNames.begin(), unionOfMetaVariableNames.end(), summationMetaVariableNames.begin(), summationMetaVariableNames.end(), std::inserter(containedMetaVariableNames, containedMetaVariableNames.begin())); - return Dd<CUDD>(this->getDdManager(), this->cuddAdd.MatrixMultiply(otherMatrix.getCuddAdd(), summationDdVariables), containedMetaVariableNames); + return Dd<DdType::CUDD>(this->getDdManager(), this->cuddAdd.MatrixMultiply(otherMatrix.getCuddAdd(), summationDdVariables), containedMetaVariableNames); } - uint_fast64_t Dd<CUDD>::getNonZeroCount() const { + uint_fast64_t Dd<DdType::CUDD>::getNonZeroCount() const { std::size_t numberOfDdVariables = 0; for (auto const& metaVariableName : this->containedMetaVariableNames) { numberOfDdVariables += this->getDdManager()->getMetaVariable(metaVariableName).getNumberOfDdVariables(); @@ -256,39 +256,39 @@ namespace storm { return static_cast<uint_fast64_t>(this->cuddAdd.CountMinterm(static_cast<int>(numberOfDdVariables))); } - uint_fast64_t Dd<CUDD>::getLeafCount() const { + uint_fast64_t Dd<DdType::CUDD>::getLeafCount() const { return static_cast<uint_fast64_t>(this->cuddAdd.CountLeaves()); } - uint_fast64_t Dd<CUDD>::getNodeCount() const { + uint_fast64_t Dd<DdType::CUDD>::getNodeCount() const { return static_cast<uint_fast64_t>(this->cuddAdd.nodeCount()); } - double Dd<CUDD>::getMin() const { + double Dd<DdType::CUDD>::getMin() const { ADD constantMinAdd = this->cuddAdd.FindMin(); return static_cast<double>(Cudd_V(constantMinAdd.getNode())); } - double Dd<CUDD>::getMax() const { + double Dd<DdType::CUDD>::getMax() const { ADD constantMaxAdd = this->cuddAdd.FindMax(); return static_cast<double>(Cudd_V(constantMaxAdd.getNode())); } - void Dd<CUDD>::setValue(std::string const& metaVariableName, int_fast64_t variableValue, double targetValue) { + void Dd<DdType::CUDD>::setValue(std::string const& metaVariableName, int_fast64_t variableValue, double targetValue) { std::map<std::string, int_fast64_t> metaVariableNameToValueMap; metaVariableNameToValueMap.emplace(metaVariableName, variableValue); this->setValue(metaVariableNameToValueMap, targetValue); } - void Dd<CUDD>::setValue(std::string const& metaVariableName1, int_fast64_t variableValue1, std::string const& metaVariableName2, int_fast64_t variableValue2, double targetValue) { + void Dd<DdType::CUDD>::setValue(std::string const& metaVariableName1, int_fast64_t variableValue1, std::string const& metaVariableName2, int_fast64_t variableValue2, double targetValue) { std::map<std::string, int_fast64_t> metaVariableNameToValueMap; metaVariableNameToValueMap.emplace(metaVariableName1, variableValue1); metaVariableNameToValueMap.emplace(metaVariableName2, variableValue2); this->setValue(metaVariableNameToValueMap, targetValue); } - void Dd<CUDD>::setValue(std::map<std::string, int_fast64_t> const& metaVariableNameToValueMap, double targetValue) { - Dd<CUDD> valueEncoding(this->getDdManager()->getOne()); + void Dd<DdType::CUDD>::setValue(std::map<std::string, int_fast64_t> const& metaVariableNameToValueMap, double targetValue) { + Dd<DdType::CUDD> valueEncoding(this->getDdManager()->getOne()); for (auto const& nameValuePair : metaVariableNameToValueMap) { valueEncoding *= this->getDdManager()->getEncoding(nameValuePair.first, nameValuePair.second); // Also record that the DD now contains the meta variable. @@ -298,9 +298,9 @@ namespace storm { this->cuddAdd = valueEncoding.getCuddAdd().Ite(this->getDdManager()->getConstant(targetValue).getCuddAdd(), this->cuddAdd); } - double Dd<CUDD>::getValue(std::map<std::string, int_fast64_t> const& metaVariableNameToValueMap) const { + double Dd<DdType::CUDD>::getValue(std::map<std::string, int_fast64_t> const& metaVariableNameToValueMap) const { std::set<std::string> remainingMetaVariables(this->getContainedMetaVariableNames()); - Dd<CUDD> valueEncoding(this->getDdManager()->getOne()); + Dd<DdType::CUDD> valueEncoding(this->getDdManager()->getOne()); for (auto const& nameValuePair : metaVariableNameToValueMap) { valueEncoding *= this->getDdManager()->getEncoding(nameValuePair.first, nameValuePair.second); if (this->containsMetaVariable(nameValuePair.first)) { @@ -312,29 +312,29 @@ namespace storm { throw storm::exceptions::InvalidArgumentException() << "Cannot evaluate function for which not all inputs were given."; } - Dd<CUDD> value = *this * valueEncoding; + Dd<DdType::CUDD> value = *this * valueEncoding; value.sumAbstract(this->getContainedMetaVariableNames()); return static_cast<double>(Cudd_V(value.getCuddAdd().getNode())); } - bool Dd<CUDD>::isOne() const { + bool Dd<DdType::CUDD>::isOne() const { return *this == this->getDdManager()->getOne(); } - bool Dd<CUDD>::isZero() const { + bool Dd<DdType::CUDD>::isZero() const { return *this == this->getDdManager()->getZero(); } - bool Dd<CUDD>::isConstant() const { + bool Dd<DdType::CUDD>::isConstant() const { return Cudd_IsConstant(this->cuddAdd.getNode()); } - bool Dd<CUDD>::containsMetaVariable(std::string const& metaVariableName) const { + bool Dd<DdType::CUDD>::containsMetaVariable(std::string const& metaVariableName) const { auto const& metaVariable = containedMetaVariableNames.find(metaVariableName); return metaVariable != containedMetaVariableNames.end(); } - bool Dd<CUDD>::containsMetaVariables(std::set<std::string> metaVariableNames) const { + bool Dd<DdType::CUDD>::containsMetaVariables(std::set<std::string> metaVariableNames) const { for (auto const& metaVariableName : metaVariableNames) { auto const& metaVariable = containedMetaVariableNames.find(metaVariableName); @@ -345,15 +345,15 @@ namespace storm { return true; } - std::set<std::string> const& Dd<CUDD>::getContainedMetaVariableNames() const { + std::set<std::string> const& Dd<DdType::CUDD>::getContainedMetaVariableNames() const { return this->containedMetaVariableNames; } - std::set<std::string>& Dd<CUDD>::getContainedMetaVariableNames() { + std::set<std::string>& Dd<DdType::CUDD>::getContainedMetaVariableNames() { return this->containedMetaVariableNames; } - void Dd<CUDD>::exportToDot(std::string const& filename) const { + void Dd<DdType::CUDD>::exportToDot(std::string const& filename) const { std::vector<ADD> cuddAddVector = { this->cuddAdd }; if (filename.empty()) { this->getDdManager()->getCuddManager().DumpDot(cuddAddVector); @@ -364,27 +364,27 @@ namespace storm { } } - ADD Dd<CUDD>::getCuddAdd() { + ADD Dd<DdType::CUDD>::getCuddAdd() { return this->cuddAdd; } - ADD const& Dd<CUDD>::getCuddAdd() const { + ADD const& Dd<DdType::CUDD>::getCuddAdd() const { return this->cuddAdd; } - void Dd<CUDD>::addContainedMetaVariable(std::string const& metaVariableName) { + void Dd<DdType::CUDD>::addContainedMetaVariable(std::string const& metaVariableName) { this->getContainedMetaVariableNames().insert(metaVariableName); } - void Dd<CUDD>::removeContainedMetaVariable(std::string const& metaVariableName) { + void Dd<DdType::CUDD>::removeContainedMetaVariable(std::string const& metaVariableName) { this->getContainedMetaVariableNames().erase(metaVariableName); } - std::shared_ptr<DdManager<CUDD>> Dd<CUDD>::getDdManager() const { + std::shared_ptr<DdManager<DdType::CUDD>> Dd<DdType::CUDD>::getDdManager() const { return this->ddManager; } - std::ostream & operator<<(std::ostream& out, const Dd<CUDD>& dd) { + std::ostream & operator<<(std::ostream& out, const Dd<DdType::CUDD>& dd) { dd.exportToDot(); return out; } diff --git a/src/storage/dd/CuddDd.h b/src/storage/dd/CuddDd.h index 80cf88f3a..6da2dc9c3 100644 --- a/src/storage/dd/CuddDd.h +++ b/src/storage/dd/CuddDd.h @@ -18,18 +18,18 @@ namespace storm { template<DdType Type> class DdManager; template<> - class Dd<CUDD> { + class Dd<DdType::CUDD> { public: // Declare the DdManager class as friend so it can access the internals of a DD. - friend class DdManager<CUDD>; + friend class DdManager<DdType::CUDD>; // Instantiate all copy/move constructors/assignments with the default implementation. Dd() = default; - Dd(Dd<CUDD> const& other) = default; - Dd& operator=(Dd<CUDD> const& other) = default; + Dd(Dd<DdType::CUDD> const& other) = default; + Dd& operator=(Dd<DdType::CUDD> const& other) = default; #ifndef WINDOWS - Dd(Dd<CUDD>&& other) = default; - Dd& operator=(Dd<CUDD>&& other) = default; + Dd(Dd<DdType::CUDD>&& other) = default; + Dd& operator=(Dd<DdType::CUDD>&& other) = default; #endif /*! @@ -38,7 +38,7 @@ namespace storm { * @param other The DD that is to be compared with the current one. * @return True if the DDs represent the same function. */ - bool operator==(Dd<CUDD> const& other) const; + bool operator==(Dd<DdType::CUDD> const& other) const; /*! * Retrieves whether the two DDs represent different functions. @@ -46,7 +46,7 @@ namespace storm { * @param other The DD that is to be compared with the current one. * @return True if the DDs represent the different functions. */ - bool operator!=(Dd<CUDD> const& other) const; + bool operator!=(Dd<DdType::CUDD> const& other) const; /*! * Adds the two DDs. @@ -54,7 +54,7 @@ namespace storm { * @param other The DD to add to the current one. * @return The result of the addition. */ - Dd<CUDD> operator+(Dd<CUDD> const& other) const; + Dd<DdType::CUDD> operator+(Dd<DdType::CUDD> const& other) const; /*! * Adds the given DD to the current one. @@ -62,7 +62,7 @@ namespace storm { * @param other The DD to add to the current one. * @return A reference to the current DD after the operation. */ - Dd<CUDD>& operator+=(Dd<CUDD> const& other); + Dd<DdType::CUDD>& operator+=(Dd<DdType::CUDD> const& other); /*! * Multiplies the two DDs. @@ -70,7 +70,7 @@ namespace storm { * @param other The DD to multiply with the current one. * @return The result of the multiplication. */ - Dd<CUDD> operator*(Dd<CUDD> const& other) const; + Dd<DdType::CUDD> operator*(Dd<DdType::CUDD> const& other) const; /*! * Multiplies the given DD with the current one and assigns the result to the current DD. @@ -78,7 +78,7 @@ namespace storm { * @param other The DD to multiply with the current one. * @return A reference to the current DD after the operation. */ - Dd<CUDD>& operator*=(Dd<CUDD> const& other); + Dd<DdType::CUDD>& operator*=(Dd<DdType::CUDD> const& other); /*! * Subtracts the given DD from the current one. @@ -86,7 +86,7 @@ namespace storm { * @param other The DD to subtract from the current one. * @return The result of the subtraction. */ - Dd<CUDD> operator-(Dd<CUDD> const& other) const; + Dd<DdType::CUDD> operator-(Dd<DdType::CUDD> const& other) const; /*! * Subtracts the given DD from the current one and assigns the result to the current DD. @@ -94,7 +94,7 @@ namespace storm { * @param other The DD to subtract from the current one. * @return A reference to the current DD after the operation. */ - Dd<CUDD>& operator-=(Dd<CUDD> const& other); + Dd<DdType::CUDD>& operator-=(Dd<DdType::CUDD> const& other); /*! * Divides the current DD by the given one. @@ -102,7 +102,7 @@ namespace storm { * @param other The DD by which to divide the current one. * @return The result of the division. */ - Dd<CUDD> operator/(Dd<CUDD> const& other) const; + Dd<DdType::CUDD> operator/(Dd<DdType::CUDD> const& other) const; /*! * Divides the current DD by the given one and assigns the result to the current DD. @@ -110,14 +110,14 @@ namespace storm { * @param other The DD by which to divide the current one. * @return A reference to the current DD after the operation. */ - Dd<CUDD>& operator/=(Dd<CUDD> const& other); + Dd<DdType::CUDD>& operator/=(Dd<DdType::CUDD> const& other); /*! * Subtracts the DD from the constant zero function. * * @return The resulting function represented as a DD. */ - Dd<CUDD> minus() const; + Dd<DdType::CUDD> minus() const; /*! * Retrieves the logical complement of the current DD. The result will map all encodings with a value @@ -125,7 +125,7 @@ namespace storm { * * @return The logical complement of the current DD. */ - Dd<CUDD> operator~() const; + Dd<DdType::CUDD> operator~() const; /*! * Logically complements the current DD. The result will map all encodings with a value @@ -133,7 +133,7 @@ namespace storm { * * @return A reference to the current DD after the operation. */ - Dd<CUDD>& complement(); + Dd<DdType::CUDD>& complement(); /*! * Retrieves the function that maps all evaluations to one that have an identical function values. @@ -141,7 +141,7 @@ namespace storm { * @param other The DD with which to perform the operation. * @return The resulting function represented as a DD. */ - Dd<CUDD> equals(Dd<CUDD> const& other) const; + Dd<DdType::CUDD> equals(Dd<DdType::CUDD> const& other) const; /*! * Retrieves the function that maps all evaluations to one that have distinct function values. @@ -149,7 +149,7 @@ namespace storm { * @param other The DD with which to perform the operation. * @return The resulting function represented as a DD. */ - Dd<CUDD> notEquals(Dd<CUDD> const& other) const; + Dd<DdType::CUDD> notEquals(Dd<DdType::CUDD> const& other) const; /*! * Retrieves the function that maps all evaluations to one whose function value in the first DD are less @@ -158,7 +158,7 @@ namespace storm { * @param other The DD with which to perform the operation. * @return The resulting function represented as a DD. */ - Dd<CUDD> less(Dd<CUDD> const& other) const; + Dd<DdType::CUDD> less(Dd<DdType::CUDD> const& other) const; /*! * Retrieves the function that maps all evaluations to one whose function value in the first DD are less or @@ -167,7 +167,7 @@ namespace storm { * @param other The DD with which to perform the operation. * @return The resulting function represented as a DD. */ - Dd<CUDD> lessOrEqual(Dd<CUDD> const& other) const; + Dd<DdType::CUDD> lessOrEqual(Dd<DdType::CUDD> const& other) const; /*! * Retrieves the function that maps all evaluations to one whose function value in the first DD are greater @@ -176,7 +176,7 @@ namespace storm { * @param other The DD with which to perform the operation. * @return The resulting function represented as a DD. */ - Dd<CUDD> greater(Dd<CUDD> const& other) const; + Dd<DdType::CUDD> greater(Dd<DdType::CUDD> const& other) const; /*! * Retrieves the function that maps all evaluations to one whose function value in the first DD are greater @@ -185,7 +185,7 @@ namespace storm { * @param other The DD with which to perform the operation. * @return The resulting function represented as a DD. */ - Dd<CUDD> greaterOrEqual(Dd<CUDD> const& other) const; + Dd<DdType::CUDD> greaterOrEqual(Dd<DdType::CUDD> const& other) const; /*! * Existentially abstracts from the given meta variables. @@ -232,7 +232,7 @@ namespace storm { * matrix multiplication. * @return A DD representing the result of the matrix-matrix multiplication. */ - Dd<CUDD> multiplyMatrix(Dd<CUDD> const& otherMatrix, std::set<std::string> const& summationMetaVariableNames); + Dd<DdType::CUDD> multiplyMatrix(Dd<DdType::CUDD> const& otherMatrix, std::set<std::string> const& summationMetaVariableNames); /*! * Retrieves the number of encodings that are mapped to a non-zero value. @@ -378,9 +378,9 @@ namespace storm { * * A pointer to the manager that is responsible for this DD. */ - std::shared_ptr<DdManager<CUDD>> getDdManager() const; + std::shared_ptr<DdManager<DdType::CUDD>> getDdManager() const; - friend std::ostream & operator<<(std::ostream& out, const Dd<CUDD>& dd); + friend std::ostream & operator<<(std::ostream& out, const Dd<DdType::CUDD>& dd); private: /*! * Retrieves a reference to the CUDD ADD object associated with this DD. @@ -417,10 +417,10 @@ namespace storm { * @param cuddAdd The CUDD ADD to store. * @param */ - Dd(std::shared_ptr<DdManager<CUDD>> ddManager, ADD cuddAdd, std::set<std::string> const& containedMetaVariableNames = std::set<std::string>()); + Dd(std::shared_ptr<DdManager<DdType::CUDD>> ddManager, ADD cuddAdd, std::set<std::string> const& containedMetaVariableNames = std::set<std::string>()); // A pointer to the manager responsible for this DD. - std::shared_ptr<DdManager<CUDD>> ddManager; + std::shared_ptr<DdManager<DdType::CUDD>> ddManager; // The ADD created by CUDD. ADD cuddAdd; diff --git a/src/storage/dd/CuddDdManager.cpp b/src/storage/dd/CuddDdManager.cpp index 3c87157b2..9843b5c92 100644 --- a/src/storage/dd/CuddDdManager.cpp +++ b/src/storage/dd/CuddDdManager.cpp @@ -6,29 +6,29 @@ namespace storm { namespace dd { - DdManager<CUDD>::DdManager() : metaVariableMap(), cuddManager() { + DdManager<DdType::CUDD>::DdManager() : metaVariableMap(), cuddManager() { // Intentionally left empty. } - Dd<CUDD> DdManager<CUDD>::getOne() { - return Dd<CUDD>(this->shared_from_this(), cuddManager.addOne()); + Dd<DdType::CUDD> DdManager<DdType::CUDD>::getOne() { + return Dd<DdType::CUDD>(this->shared_from_this(), cuddManager.addOne()); } - Dd<CUDD> DdManager<CUDD>::getZero() { - return Dd<CUDD>(this->shared_from_this(), cuddManager.addZero()); + Dd<DdType::CUDD> DdManager<DdType::CUDD>::getZero() { + return Dd<DdType::CUDD>(this->shared_from_this(), cuddManager.addZero()); } - Dd<CUDD> DdManager<CUDD>::getConstant(double value) { - return Dd<CUDD>(this->shared_from_this(), cuddManager.constant(value)); + Dd<DdType::CUDD> DdManager<DdType::CUDD>::getConstant(double value) { + return Dd<DdType::CUDD>(this->shared_from_this(), cuddManager.constant(value)); } - Dd<CUDD> DdManager<CUDD>::getEncoding(std::string const& metaVariableName, int_fast64_t value) { + Dd<DdType::CUDD> DdManager<DdType::CUDD>::getEncoding(std::string const& metaVariableName, int_fast64_t value) { // Check whether the meta variable exists. if (!this->hasMetaVariable(metaVariableName)) { throw storm::exceptions::InvalidArgumentException() << "Unknown meta variable name '" << metaVariableName << "'."; } - DdMetaVariable<CUDD> const& metaVariable = this->getMetaVariable(metaVariableName); + DdMetaVariable<DdType::CUDD> const& metaVariable = this->getMetaVariable(metaVariableName); // Check whether the value is legal for this meta variable. if (value < metaVariable.getLow() || value > metaVariable.getHigh()) { @@ -38,9 +38,9 @@ namespace storm { // Now compute the encoding relative to the low value of the meta variable. value -= metaVariable.getLow(); - std::vector<Dd<CUDD>> const& ddVariables = metaVariable.getDdVariables(); + std::vector<Dd<DdType::CUDD>> const& ddVariables = metaVariable.getDdVariables(); - Dd<CUDD> result; + Dd<DdType::CUDD> result; if (value & (1ull << (ddVariables.size() - 1))) { result = ddVariables[0]; } else { @@ -58,15 +58,15 @@ namespace storm { return result; } - Dd<CUDD> DdManager<CUDD>::getRange(std::string const& metaVariableName) { + Dd<DdType::CUDD> DdManager<DdType::CUDD>::getRange(std::string const& metaVariableName) { // Check whether the meta variable exists. if (!this->hasMetaVariable(metaVariableName)) { throw storm::exceptions::InvalidArgumentException() << "Unknown meta variable name '" << metaVariableName << "'."; } - storm::dd::DdMetaVariable<CUDD> const& metaVariable = this->getMetaVariable(metaVariableName); + storm::dd::DdMetaVariable<DdType::CUDD> const& metaVariable = this->getMetaVariable(metaVariableName); - Dd<CUDD> result = this->getZero(); + Dd<DdType::CUDD> result = this->getZero(); for (int_fast64_t value = metaVariable.getLow(); value <= metaVariable.getHigh(); ++value) { result.setValue(metaVariableName, value, static_cast<double>(1)); @@ -74,22 +74,22 @@ namespace storm { return result; } - Dd<CUDD> DdManager<CUDD>::getIdentity(std::string const& metaVariableName) { + Dd<DdType::CUDD> DdManager<DdType::CUDD>::getIdentity(std::string const& metaVariableName) { // Check whether the meta variable exists. if (!this->hasMetaVariable(metaVariableName)) { throw storm::exceptions::InvalidArgumentException() << "Unknown meta variable name '" << metaVariableName << "'."; } - storm::dd::DdMetaVariable<CUDD> const& metaVariable = this->getMetaVariable(metaVariableName); + storm::dd::DdMetaVariable<DdType::CUDD> const& metaVariable = this->getMetaVariable(metaVariableName); - Dd<CUDD> result = this->getZero(); + Dd<DdType::CUDD> result = this->getZero(); for (int_fast64_t value = metaVariable.getLow(); value <= metaVariable.getHigh(); ++value) { result.setValue(metaVariableName, value, static_cast<double>(value)); } return result; } - void DdManager<CUDD>::addMetaVariable(std::string const& name, int_fast64_t low, int_fast64_t high) { + void DdManager<DdType::CUDD>::addMetaVariable(std::string const& name, int_fast64_t low, int_fast64_t high) { // Check whether a meta variable already exists. if (this->hasMetaVariable(name)) { throw storm::exceptions::InvalidArgumentException() << "A meta variable '" << name << "' already exists."; @@ -102,15 +102,15 @@ namespace storm { std::size_t numberOfBits = static_cast<std::size_t>(std::ceil(std::log2(high - low + 1))); - std::vector<Dd<CUDD>> variables; + std::vector<Dd<DdType::CUDD>> variables; for (std::size_t i = 0; i < numberOfBits; ++i) { - variables.emplace_back(Dd<CUDD>(this->shared_from_this(), cuddManager.addVar(), {name})); + variables.emplace_back(Dd<DdType::CUDD>(this->shared_from_this(), cuddManager.addVar(), {name})); } - metaVariableMap.emplace(name, DdMetaVariable<CUDD>(name, low, high, variables, this->shared_from_this())); + metaVariableMap.emplace(name, DdMetaVariable<DdType::CUDD>(name, low, high, variables, this->shared_from_this())); } - void DdManager<CUDD>::addMetaVariablesInterleaved(std::vector<std::string> const& names, int_fast64_t low, int_fast64_t high) { + void DdManager<DdType::CUDD>::addMetaVariablesInterleaved(std::vector<std::string> const& names, int_fast64_t low, int_fast64_t high) { // Make sure that at least one meta variable is added. if (names.size() == 0) { throw storm::exceptions::InvalidArgumentException() << "Illegal to add zero meta variables."; @@ -137,20 +137,20 @@ namespace storm { // Add the variables in interleaved order. std::size_t numberOfBits = static_cast<std::size_t>(std::ceil(std::log2(high - low + 1))); - std::vector<std::vector<Dd<CUDD>>> variables(names.size()); + std::vector<std::vector<Dd<DdType::CUDD>>> variables(names.size()); for (uint_fast64_t bit = 0; bit < numberOfBits; ++bit) { for (uint_fast64_t i = 0; i < names.size(); ++i) { - variables[i].emplace_back(Dd<CUDD>(this->shared_from_this(), cuddManager.addVar(), {names[i]})); + variables[i].emplace_back(Dd<DdType::CUDD>(this->shared_from_this(), cuddManager.addVar(), {names[i]})); } } // Now add the meta variables. for (uint_fast64_t i = 0; i < names.size(); ++i) { - metaVariableMap.emplace(names[i], DdMetaVariable<CUDD>(names[i], low, high, variables[i], this->shared_from_this())); + metaVariableMap.emplace(names[i], DdMetaVariable<DdType::CUDD>(names[i], low, high, variables[i], this->shared_from_this())); } } - DdMetaVariable<CUDD> const& DdManager<CUDD>::getMetaVariable(std::string const& metaVariableName) const { + DdMetaVariable<DdType::CUDD> const& DdManager<DdType::CUDD>::getMetaVariable(std::string const& metaVariableName) const { auto const& nameVariablePair = metaVariableMap.find(metaVariableName); if (!this->hasMetaVariable(metaVariableName)) { @@ -160,7 +160,7 @@ namespace storm { return nameVariablePair->second; } - std::set<std::string> DdManager<CUDD>::getAllMetaVariableNames() const { + std::set<std::string> DdManager<DdType::CUDD>::getAllMetaVariableNames() const { std::set<std::string> result; for (auto const& nameValuePair : metaVariableMap) { result.insert(nameValuePair.first); @@ -168,15 +168,15 @@ namespace storm { return result; } - std::size_t DdManager<CUDD>::getNumberOfMetaVariables() const { + std::size_t DdManager<DdType::CUDD>::getNumberOfMetaVariables() const { return this->metaVariableMap.size(); } - bool DdManager<CUDD>::hasMetaVariable(std::string const& metaVariableName) const { + bool DdManager<DdType::CUDD>::hasMetaVariable(std::string const& metaVariableName) const { return this->metaVariableMap.find(metaVariableName) != this->metaVariableMap.end(); } - Cudd& DdManager<CUDD>::getCuddManager() { + Cudd& DdManager<DdType::CUDD>::getCuddManager() { return this->cuddManager; } } diff --git a/src/storage/dd/CuddDdManager.h b/src/storage/dd/CuddDdManager.h index 569ccf1c9..ca3f9c2c3 100644 --- a/src/storage/dd/CuddDdManager.h +++ b/src/storage/dd/CuddDdManager.h @@ -14,10 +14,10 @@ namespace storm { namespace dd { template<> - class DdManager<CUDD> : public std::enable_shared_from_this<DdManager<CUDD>> { + class DdManager<DdType::CUDD> : public std::enable_shared_from_this<DdManager<DdType::CUDD>> { public: // To break the cylic dependencies, we need to forward-declare the other DD-related classes. - friend class Dd<CUDD>; + friend class Dd<DdType::CUDD>; /*! * Creates an empty manager without any meta variables. @@ -25,11 +25,11 @@ namespace storm { DdManager(); // Explictly forbid copying a DdManager, but allow moving it. - DdManager(DdManager<CUDD> const& other) = delete; - DdManager<CUDD>& operator=(DdManager<CUDD> const& other) = delete; + DdManager(DdManager<DdType::CUDD> const& other) = delete; + DdManager<DdType::CUDD>& operator=(DdManager<DdType::CUDD> const& other) = delete; #ifndef WINDOWS - DdManager(DdManager<CUDD>&& other) = default; - DdManager<CUDD>& operator=(DdManager<CUDD>&& other) = default; + DdManager(DdManager<DdType::CUDD>&& other) = default; + DdManager<DdType::CUDD>& operator=(DdManager<DdType::CUDD>&& other) = default; #endif /*! @@ -37,21 +37,21 @@ namespace storm { * * @return A DD representing the constant one function. */ - Dd<CUDD> getOne(); + Dd<DdType::CUDD> getOne(); /*! * Retrieves a DD representing the constant zero function. * * @return A DD representing the constant zero function. */ - Dd<CUDD> getZero(); + Dd<DdType::CUDD> getZero(); /*! * Retrieves a DD representing the constant function with the given value. * * @return A DD representing the constant function with the given value. */ - Dd<CUDD> getConstant(double value); + Dd<DdType::CUDD> getConstant(double value); /*! * Retrieves the DD representing the function that maps all inputs which have the given meta variable equal @@ -62,7 +62,7 @@ namespace storm { * @return The DD representing the function that maps all inputs which have the given meta variable equal * to the given value one. */ - Dd<CUDD> getEncoding(std::string const& metaVariableName, int_fast64_t value); + Dd<DdType::CUDD> getEncoding(std::string const& metaVariableName, int_fast64_t value); /*! * Retrieves the DD representing the range of the meta variable, i.e., a function that maps all legal values @@ -71,7 +71,7 @@ namespace storm { * @param metaVariableName The name of the meta variable whose range to retrieve. * @return The range of the meta variable. */ - Dd<CUDD> getRange(std::string const& metaVariableName); + Dd<DdType::CUDD> getRange(std::string const& metaVariableName); /*! * Retrieves the DD representing the identity of the meta variable, i.e., a function that maps all legal @@ -80,7 +80,7 @@ namespace storm { * @param metaVariableName The name of the meta variable whose identity to retrieve. * @return The identity of the meta variable. */ - Dd<CUDD> getIdentity(std::string const& metaVariableName); + Dd<DdType::CUDD> getIdentity(std::string const& metaVariableName); /*! * Adds a meta variable with the given name and range. @@ -106,7 +106,7 @@ namespace storm { * @param metaVariableName The name of the meta variable to retrieve. * @return The meta variable with the given name. */ - DdMetaVariable<CUDD> const& getMetaVariable(std::string const& metaVariableName) const; + DdMetaVariable<DdType::CUDD> const& getMetaVariable(std::string const& metaVariableName) const; /*! * Retrieves the names of all meta variables that have been added to the manager. @@ -139,7 +139,7 @@ namespace storm { Cudd& getCuddManager(); // A mapping from variable names to the meta variable information. - std::unordered_map<std::string, DdMetaVariable<CUDD>> metaVariableMap; + std::unordered_map<std::string, DdMetaVariable<DdType::CUDD>> metaVariableMap; // The manager responsible for the DDs created/modified with this DdManager. Cudd cuddManager; diff --git a/src/storage/dd/DdMetaVariable.cpp b/src/storage/dd/DdMetaVariable.cpp index 7671289fc..9132eab03 100644 --- a/src/storage/dd/DdMetaVariable.cpp +++ b/src/storage/dd/DdMetaVariable.cpp @@ -47,6 +47,6 @@ namespace storm { } // Explicitly instantiate DdMetaVariable. - template class DdMetaVariable<CUDD>; + template class DdMetaVariable<DdType::CUDD>; } } \ No newline at end of file diff --git a/src/storage/dd/DdType.h b/src/storage/dd/DdType.h index 327832ec5..feb2fe70a 100644 --- a/src/storage/dd/DdType.h +++ b/src/storage/dd/DdType.h @@ -3,7 +3,7 @@ namespace storm { namespace dd { - enum DdType { + enum class DdType { CUDD }; } diff --git a/src/storage/expressions/Expression.cpp b/src/storage/expressions/Expression.cpp index bd2e3cbc9..0c641d3ec 100644 --- a/src/storage/expressions/Expression.cpp +++ b/src/storage/expressions/Expression.cpp @@ -3,6 +3,7 @@ #include "src/storage/expressions/Expression.h" #include "src/storage/expressions/SubstitutionVisitor.h" +#include "src/storage/expressions/IdentifierSubstitutionVisitor.h" #include "src/exceptions/InvalidTypeException.h" #include "src/exceptions/ExceptionMacros.h" @@ -30,6 +31,11 @@ namespace storm { return SubstitutionVisitor<MapType>(identifierToExpressionMap).substitute(this->getBaseExpressionPointer().get()); } + template<template<typename... Arguments> class MapType> + Expression Expression::substitute(MapType<std::string, std::string> const& identifierToIdentifierMap) const { + return IdentifierSubstitutionVisitor<MapType>(identifierToIdentifierMap).substitute(this->getBaseExpressionPointer().get()); + } + bool Expression::evaluateAsBool(Valuation const& valuation) const { return this->getBaseExpression().evaluateAsBool(valuation); } @@ -222,6 +228,8 @@ namespace storm { template Expression Expression::substitute<std::map>(std::map<std::string, storm::expressions::Expression> const&) const; template Expression Expression::substitute<std::unordered_map>(std::unordered_map<std::string, storm::expressions::Expression> const&) const; + template Expression Expression::substitute<std::map>(std::map<std::string, std::string> const&) const; + template Expression Expression::substitute<std::unordered_map>(std::unordered_map<std::string, std::string> const&) const; std::ostream& operator<<(std::ostream& stream, Expression const& expression) { stream << expression.getBaseExpression(); diff --git a/src/storage/expressions/Expression.h b/src/storage/expressions/Expression.h index 52e656a15..3002e4d35 100644 --- a/src/storage/expressions/Expression.h +++ b/src/storage/expressions/Expression.h @@ -71,6 +71,16 @@ namespace storm { template<template<typename... Arguments> class MapType> Expression substitute(MapType<std::string, Expression> const& identifierToExpressionMap) const; + /*! + * Substitutes all occurrences of identifiers with different names given by a mapping. + * + * @param identifierToIdentifierMap A mapping from identifiers to identifiers they are substituted with. + * @return An expression in which all identifiers in the key set of the mapping are replaced by the + * identifiers they are mapped to. + */ + template<template<typename... Arguments> class MapType> + Expression substitute(MapType<std::string, std::string> const& identifierToIdentifierMap) const; + /*! * Evaluates the expression under the valuation of unknowns (variables and constants) given by the * valuation and returns the resulting boolean value. If the return type of the expression is not a boolean diff --git a/src/storage/expressions/IdentifierSubstitutionVisitor.cpp b/src/storage/expressions/IdentifierSubstitutionVisitor.cpp new file mode 100644 index 000000000..e753583f9 --- /dev/null +++ b/src/storage/expressions/IdentifierSubstitutionVisitor.cpp @@ -0,0 +1,177 @@ +#include <map> +#include <unordered_map> + +#include "src/storage/expressions/IdentifierSubstitutionVisitor.h" + +#include "src/storage/expressions/BinaryBooleanFunctionExpression.h" +#include "src/storage/expressions/BinaryNumericalFunctionExpression.h" +#include "src/storage/expressions/BinaryRelationExpression.h" +#include "src/storage/expressions/BooleanConstantExpression.h" +#include "src/storage/expressions/IntegerConstantExpression.h" +#include "src/storage/expressions/DoubleConstantExpression.h" +#include "src/storage/expressions/BooleanLiteralExpression.h" +#include "src/storage/expressions/IntegerLiteralExpression.h" +#include "src/storage/expressions/DoubleLiteralExpression.h" +#include "src/storage/expressions/VariableExpression.h" +#include "src/storage/expressions/UnaryBooleanFunctionExpression.h" +#include "src/storage/expressions/UnaryNumericalFunctionExpression.h" + +namespace storm { + namespace expressions { + template<template<typename... Arguments> class MapType> + IdentifierSubstitutionVisitor<MapType>::IdentifierSubstitutionVisitor(MapType<std::string, std::string> const& identifierToIdentifierMap) : identifierToIdentifierMap(identifierToIdentifierMap) { + // Intentionally left empty. + } + + template<template<typename... Arguments> class MapType> + Expression IdentifierSubstitutionVisitor<MapType>::substitute(BaseExpression const* expression) { + expression->accept(this); + return Expression(this->expressionStack.top()); + } + + template<template<typename... Arguments> class MapType> + void IdentifierSubstitutionVisitor<MapType>::visit(BinaryBooleanFunctionExpression const* expression) { + expression->getFirstOperand()->accept(this); + std::shared_ptr<BaseExpression const> firstExpression = expressionStack.top(); + expressionStack.pop(); + + expression->getSecondOperand()->accept(this); + std::shared_ptr<BaseExpression const> secondExpression = expressionStack.top(); + expressionStack.pop(); + + // If the arguments did not change, we simply push the expression itself. + if (firstExpression.get() == expression->getFirstOperand().get() && secondExpression.get() == expression->getSecondOperand().get()) { + this->expressionStack.push(expression->getSharedPointer()); + } else { + this->expressionStack.push(std::shared_ptr<BaseExpression>(new BinaryBooleanFunctionExpression(expression->getReturnType(), firstExpression, secondExpression, expression->getOperatorType()))); + } + } + + template<template<typename... Arguments> class MapType> + void IdentifierSubstitutionVisitor<MapType>::visit(BinaryNumericalFunctionExpression const* expression) { + expression->getFirstOperand()->accept(this); + std::shared_ptr<BaseExpression const> firstExpression = expressionStack.top(); + expressionStack.pop(); + + expression->getSecondOperand()->accept(this); + std::shared_ptr<BaseExpression const> secondExpression = expressionStack.top(); + expressionStack.pop(); + + // If the arguments did not change, we simply push the expression itself. + if (firstExpression.get() == expression->getFirstOperand().get() && secondExpression.get() == expression->getSecondOperand().get()) { + this->expressionStack.push(expression->getSharedPointer()); + } else { + this->expressionStack.push(std::shared_ptr<BaseExpression>(new BinaryNumericalFunctionExpression(expression->getReturnType(), firstExpression, secondExpression, expression->getOperatorType()))); + } + } + + template<template<typename... Arguments> class MapType> + void IdentifierSubstitutionVisitor<MapType>::visit(BinaryRelationExpression const* expression) { + expression->getFirstOperand()->accept(this); + std::shared_ptr<BaseExpression const> firstExpression = expressionStack.top(); + expressionStack.pop(); + + expression->getSecondOperand()->accept(this); + std::shared_ptr<BaseExpression const> secondExpression = expressionStack.top(); + expressionStack.pop(); + + // If the arguments did not change, we simply push the expression itself. + if (firstExpression.get() == expression->getFirstOperand().get() && secondExpression.get() == expression->getSecondOperand().get()) { + this->expressionStack.push(expression->getSharedPointer()); + } else { + this->expressionStack.push(std::shared_ptr<BaseExpression>(new BinaryRelationExpression(expression->getReturnType(), firstExpression, secondExpression, expression->getRelationType()))); + } + } + + template<template<typename... Arguments> class MapType> + void IdentifierSubstitutionVisitor<MapType>::visit(BooleanConstantExpression const* expression) { + // If the boolean constant is in the key set of the substitution, we need to replace it. + auto const& namePair = this->identifierToIdentifierMap.find(expression->getConstantName()); + if (namePair != this->identifierToIdentifierMap.end()) { + this->expressionStack.push(std::shared_ptr<BaseExpression>(new BooleanConstantExpression(namePair->second))); + } else { + this->expressionStack.push(expression->getSharedPointer()); + } + } + + template<template<typename... Arguments> class MapType> + void IdentifierSubstitutionVisitor<MapType>::visit(DoubleConstantExpression const* expression) { + // If the double constant is in the key set of the substitution, we need to replace it. + auto const& namePair = this->identifierToIdentifierMap.find(expression->getConstantName()); + if (namePair != this->identifierToIdentifierMap.end()) { + this->expressionStack.push(std::shared_ptr<BaseExpression>(new DoubleConstantExpression(namePair->second))); + } else { + this->expressionStack.push(expression->getSharedPointer()); + } + } + + template<template<typename... Arguments> class MapType> + void IdentifierSubstitutionVisitor<MapType>::visit(IntegerConstantExpression const* expression) { + // If the integer constant is in the key set of the substitution, we need to replace it. + auto const& namePair = this->identifierToIdentifierMap.find(expression->getConstantName()); + if (namePair != this->identifierToIdentifierMap.end()) { + this->expressionStack.push(std::shared_ptr<BaseExpression>(new IntegerConstantExpression(namePair->second))); + } else { + this->expressionStack.push(expression->getSharedPointer()); + } + } + + template<template<typename... Arguments> class MapType> + void IdentifierSubstitutionVisitor<MapType>::visit(VariableExpression const* expression) { + // If the variable is in the key set of the substitution, we need to replace it. + auto const& namePair = this->identifierToIdentifierMap.find(expression->getVariableName()); + if (namePair != this->identifierToIdentifierMap.end()) { + this->expressionStack.push(std::shared_ptr<BaseExpression>(new VariableExpression(expression->getReturnType(), namePair->second))); + } else { + this->expressionStack.push(expression->getSharedPointer()); + } + } + + template<template<typename... Arguments> class MapType> + void IdentifierSubstitutionVisitor<MapType>::visit(UnaryBooleanFunctionExpression const* expression) { + expression->getOperand()->accept(this); + std::shared_ptr<BaseExpression const> operandExpression = expressionStack.top(); + expressionStack.pop(); + + // If the argument did not change, we simply push the expression itself. + if (operandExpression.get() == expression->getOperand().get()) { + expressionStack.push(expression->getSharedPointer()); + } else { + expressionStack.push(std::shared_ptr<BaseExpression>(new UnaryBooleanFunctionExpression(expression->getReturnType(), operandExpression, expression->getOperatorType()))); + } + } + + template<template<typename... Arguments> class MapType> + void IdentifierSubstitutionVisitor<MapType>::visit(UnaryNumericalFunctionExpression const* expression) { + expression->getOperand()->accept(this); + std::shared_ptr<BaseExpression const> operandExpression = expressionStack.top(); + expressionStack.pop(); + + // If the argument did not change, we simply push the expression itself. + if (operandExpression.get() == expression->getOperand().get()) { + expressionStack.push(expression->getSharedPointer()); + } else { + expressionStack.push(std::shared_ptr<BaseExpression>(new UnaryNumericalFunctionExpression(expression->getReturnType(), operandExpression, expression->getOperatorType()))); + } + } + + template<template<typename... Arguments> class MapType> + void IdentifierSubstitutionVisitor<MapType>::visit(BooleanLiteralExpression const* expression) { + this->expressionStack.push(expression->getSharedPointer()); + } + + template<template<typename... Arguments> class MapType> + void IdentifierSubstitutionVisitor<MapType>::visit(IntegerLiteralExpression const* expression) { + this->expressionStack.push(expression->getSharedPointer()); + } + + template<template<typename... Arguments> class MapType> + void IdentifierSubstitutionVisitor<MapType>::visit(DoubleLiteralExpression const* expression) { + this->expressionStack.push(expression->getSharedPointer()); + } + + // Explicitly instantiate the class with map and unordered_map. + template class IdentifierSubstitutionVisitor<std::map>; + template class IdentifierSubstitutionVisitor<std::unordered_map>; + } +} diff --git a/src/storage/expressions/IdentifierSubstitutionVisitor.h b/src/storage/expressions/IdentifierSubstitutionVisitor.h new file mode 100644 index 000000000..87976122c --- /dev/null +++ b/src/storage/expressions/IdentifierSubstitutionVisitor.h @@ -0,0 +1,54 @@ +#ifndef STORM_STORAGE_EXPRESSIONS_IDENTIFIERSUBSTITUTIONVISITOR_H_ +#define STORM_STORAGE_EXPRESSIONS_IDENTIFIERSUBSTITUTIONVISITOR_H_ + +#include <stack> + +#include "src/storage/expressions/Expression.h" +#include "src/storage/expressions/ExpressionVisitor.h" + +namespace storm { + namespace expressions { + template<template<typename... Arguments> class MapType> + class IdentifierSubstitutionVisitor : public ExpressionVisitor { + public: + /*! + * Creates a new substitution visitor that uses the given map to replace identifiers. + * + * @param identifierToExpressionMap A mapping from identifiers to expressions. + */ + IdentifierSubstitutionVisitor(MapType<std::string, std::string> const& identifierToExpressionMap); + + /*! + * Substitutes the identifiers in the given expression according to the previously given map and returns the + * resulting expression. + * + * @param expression The expression in which to substitute the identifiers. + * @return The expression in which all identifiers in the key set of the previously given mapping are + * substituted with the mapped-to expressions. + */ + Expression substitute(BaseExpression const* expression); + + virtual void visit(BinaryBooleanFunctionExpression const* expression) override; + virtual void visit(BinaryNumericalFunctionExpression const* expression) override; + virtual void visit(BinaryRelationExpression const* expression) override; + virtual void visit(BooleanConstantExpression const* expression) override; + virtual void visit(DoubleConstantExpression const* expression) override; + virtual void visit(IntegerConstantExpression const* expression) override; + virtual void visit(VariableExpression const* expression) override; + virtual void visit(UnaryBooleanFunctionExpression const* expression) override; + virtual void visit(UnaryNumericalFunctionExpression const* expression) override; + virtual void visit(BooleanLiteralExpression const* expression) override; + virtual void visit(IntegerLiteralExpression const* expression) override; + virtual void visit(DoubleLiteralExpression const* expression) override; + + private: + // A stack of expression used to pass the results to the higher levels. + std::stack<std::shared_ptr<BaseExpression const>> expressionStack; + + // A mapping of identifier names to expressions with which they shall be replaced. + MapType<std::string, std::string> const& identifierToIdentifierMap; + }; + } +} + +#endif /* STORM_STORAGE_EXPRESSIONS_IDENTIFIERSUBSTITUTIONVISITOR_H_ */ \ No newline at end of file diff --git a/src/storage/prism/Assignment.cpp b/src/storage/prism/Assignment.cpp new file mode 100644 index 000000000..4455ec65d --- /dev/null +++ b/src/storage/prism/Assignment.cpp @@ -0,0 +1,30 @@ +#include "Assignment.h" + +namespace storm { + namespace prism { + Assignment::Assignment(std::string const& variableName, storm::expressions::Expression const& expression) : variableName(variableName), expression(expression) { + // Intentionally left empty. + } + + Assignment::Assignment(Assignment const& oldAssignment, std::map<std::string, std::string> const& renaming) : variableName(oldAssignment.getVariableName()), expression(oldAssignment.getExpression().substitute<std::map>(renaming)) { + auto renamingPair = renaming.find(oldAssignment.variableName); + if (renamingPair != renaming.end()) { + this->variableName = renamingPair->second; + } + } + + std::string const& Assignment::getVariableName() const { + return variableName; + } + + storm::expressions::Expression const& Assignment::getExpression() const { + return this->expression; + } + + std::ostream& operator<<(std::ostream& stream, Assignment const& assignment) { + stream << "(" << assignment.getVariableName() << "' = " << assignment.getExpression() << ")"; + return stream; + } + + } // namespace prism +} // namespace storm diff --git a/src/storage/prism/Assignment.h b/src/storage/prism/Assignment.h new file mode 100644 index 000000000..48a235c8a --- /dev/null +++ b/src/storage/prism/Assignment.h @@ -0,0 +1,61 @@ +#ifndef STORM_STORAGE_PRISM_ASSIGNMENT_H_ +#define STORM_STORAGE_PRISM_ASSIGNMENT_H_ + +#include <map> + +#include "src/storage/expressions/Expression.h" + +namespace storm { + namespace prism { + class Assignment { + public: + /*! + * Constructs an assignment using the given variable name and expression. + * + * @param variableName The variable that this assignment targets. + * @param expression The expression to assign to the variable. + */ + Assignment(std::string const& variableName, storm::expressions::Expression const& expression); + + /*! + * Creates a copy of the given assignment and performs the provided renaming. + * + * @param oldAssignment The assignment to copy. + * @param renaming A mapping from names that are to be renamed to the names they are to be replaced with. + */ + Assignment(Assignment const& oldAssignment, std::map<std::string, std::string> const& renaming); + + // Create default implementations of constructors/assignment. + Assignment() = default; + Assignment(Assignment const& otherVariable) = default; + Assignment& operator=(Assignment const& otherVariable)= default; + Assignment(Assignment&& otherVariable) = default; + Assignment& operator=(Assignment&& otherVariable) = default; + + /*! + * Retrieves the name of the variable that this assignment targets. + * + * @return The name of the variable that this assignment targets. + */ + std::string const& getVariableName() const; + + /*! + * Retrieves the expression that is assigned to the variable. + * + * @return The expression that is assigned to the variable. + */ + storm::expressions::Expression const& getExpression() const; + + friend std::ostream& operator<<(std::ostream& stream, Assignment const& assignment); + + private: + // The name of the variable that this assignment targets. + std::string variableName; + + // The expression that is assigned to the variable. + storm::expressions::Expression expression; + }; + } // namespace ir +} // namespace storm + +#endif /* STORM_STORAGE_PRISM_ASSIGNMENT_H_ */ diff --git a/src/storage/prism/BooleanVariable.cpp b/src/storage/prism/BooleanVariable.cpp new file mode 100644 index 000000000..adf12b165 --- /dev/null +++ b/src/storage/prism/BooleanVariable.cpp @@ -0,0 +1,23 @@ +#include "src/storage/prism/BooleanVariable.h" + +namespace storm { + namespace prism { + BooleanVariable::BooleanVariable(std::string const& variableName) : BooleanVariable(variableName, storm::expressions::Expression::createFalse()) { + // Nothing to do here. + } + + BooleanVariable::BooleanVariable(std::string const& variableName, storm::expressions::Expression const& initialValueExpression) : Variable(variableName, initialValueExpression) { + // Nothing to do here. + } + + BooleanVariable::BooleanVariable(BooleanVariable const& oldVariable, std::string const& newName, std::map<std::string, std::string> const& renaming) : Variable(oldVariable, newName, renaming) { + // Nothing to do here. + } + + std::ostream& operator<<(std::ostream& stream, BooleanVariable const& variable) { + stream << variable.getName() << ": bool " << variable.getInitialValueExpression() << ";"; + return stream; + } + + } // namespace prism +} // namespace storm diff --git a/src/storage/prism/BooleanVariable.h b/src/storage/prism/BooleanVariable.h new file mode 100644 index 000000000..74c046e00 --- /dev/null +++ b/src/storage/prism/BooleanVariable.h @@ -0,0 +1,50 @@ +#ifndef STORM_STORAGE_PRISM_BOOLEANVARIABLE_H_ +#define STORM_STORAGE_PRISM_BOOLEANVARIABLE_H_ + +#include <map> + +#include "src/storage/prism/Variable.h" + +namespace storm { + namespace prism { + class BooleanVariable : public Variable { + public: + // Create default implementations of constructors/assignment. + BooleanVariable() = default; + BooleanVariable(BooleanVariable const& otherVariable) = default; + BooleanVariable& operator=(BooleanVariable const& otherVariable)= default; + BooleanVariable(BooleanVariable&& otherVariable) = default; + BooleanVariable& operator=(BooleanVariable&& otherVariable) = default; + + /*! + * Creates a boolean variable with the given name and default initial value. + * + * @param variableName The name of the variable. + */ + BooleanVariable(std::string const& variableName); + + /*! + * Creates a boolean variable with the given name and the given constant initial value expression. + * + * @param variableName The name of the variable. + * @param initialValueExpression The constant expression that defines the initial value of the variable. + */ + BooleanVariable(std::string const& variableName, storm::expressions::Expression const& initialValueExpression); + + /*! + * Creates a copy of the given boolean variable and performs the provided renaming. + * + * @param oldVariable The variable to copy. + * @param newName New name of this variable. + * @param renaming A mapping from names that are to be renamed to the names they are to be + * replaced with. + */ + BooleanVariable(BooleanVariable const& oldVariable, std::string const& newName, std::map<std::string, std::string> const& renaming); + + friend std::ostream& operator<<(std::ostream& stream, BooleanVariable const& variable); + }; + + } // namespace prism +} // namespace storm + +#endif /* STORM_STORAGE_PRISM_BOOLEANVARIABLE_H_ */ diff --git a/src/ir/Command.cpp b/src/storage/prism/Command.cpp similarity index 100% rename from src/ir/Command.cpp rename to src/storage/prism/Command.cpp diff --git a/src/ir/Command.h b/src/storage/prism/Command.h similarity index 100% rename from src/ir/Command.h rename to src/storage/prism/Command.h diff --git a/src/storage/prism/IntegerVariable.cpp b/src/storage/prism/IntegerVariable.cpp new file mode 100644 index 000000000..7f11a8bc2 --- /dev/null +++ b/src/storage/prism/IntegerVariable.cpp @@ -0,0 +1,30 @@ +#include "src/storage/prism/IntegerVariable.h" + +namespace storm { + namespace prism { + IntegerVariable::IntegerVariable(std::string const& variableName, storm::expressions::Expression const& lowerBoundExpression, storm::expressions::Expression const& upperBoundExpression) : IntegerVariable(variableName, lowerBoundExpression, upperBoundExpression, lowerBoundExpression) { + // Intentionally left empty. + } + + IntegerVariable::IntegerVariable(std::string const& variableName, storm::expressions::Expression const& lowerBoundExpression, storm::expressions::Expression const& upperBoundExpression, storm::expressions::Expression const& initialValueExpression) : Variable(variableName, initialValueExpression), lowerBoundExpression(lowerBoundExpression), upperBoundExpression(upperBoundExpression) { + // Intentionally left empty. + } + + IntegerVariable::IntegerVariable(IntegerVariable const& oldVariable, std::string const& newName, std::map<std::string, std::string> const& renaming) : Variable(oldVariable, newName, renaming), lowerBoundExpression(oldVariable.getLowerBoundExpression().substitute<std::map>(renaming)), upperBoundExpression(oldVariable.getUpperBoundExpression().substitute<std::map>(renaming)) { + // Intentionally left empty. + } + + storm::expressions::Expression const& IntegerVariable::getLowerBoundExpression() const { + return this->lowerBoundExpression; + } + + storm::expressions::Expression const& IntegerVariable::getUpperBoundExpression() const { + return this->upperBoundExpression; + } + + std::ostream& operator<<(std::ostream& stream, IntegerVariable const& variable) { + stream << this->getName() << ": [" << variable.getLowerBoundExpression() << ".." << variable.getUpperBoundExpression() << "]" << variable.getInitialValueExpression() << ";"; + return stream; + } + } // namespace prism +} // namespace storm diff --git a/src/storage/prism/IntegerVariable.h b/src/storage/prism/IntegerVariable.h new file mode 100644 index 000000000..b2dbb4cb5 --- /dev/null +++ b/src/storage/prism/IntegerVariable.h @@ -0,0 +1,74 @@ +#ifndef STORM_STORAGE_PRISM_INTEGERVARIABLE_H_ +#define STORM_STORAGE_PRISM_INTEGERVARIABLE_H_ + +#include <map> + +#include "src/storage/prism/Variable.h" + +namespace storm { + namespace prism { + class IntegerVariable : public Variable { + public: + // Create default implementations of constructors/assignment. + IntegerVariable() = default; + IntegerVariable(IntegerVariable const& otherVariable) = default; + IntegerVariable& operator=(IntegerVariable const& otherVariable)= default; + IntegerVariable(IntegerVariable&& otherVariable) = default; + IntegerVariable& operator=(IntegerVariable&& otherVariable) = default; + + /*! + * Creates an integer variable with the given name and a default initial value. + * + * @param variableName The name of the variable. + * @param lowerBoundExpression A constant expression defining the lower bound of the domain of the variable. + * @param upperBoundExpression A constant expression defining the upper bound of the domain of the variable. + */ + IntegerVariable(std::string const& variableName, storm::expressions::Expression const& lowerBoundExpression, storm::expressions::Expression const& upperBoundExpression); + + /*! + * Creates an integer variable with the given name and the given initial value expression. + * + * @param variableName The name of the variable. + * @param lowerBoundExpression A constant expression defining the lower bound of the domain of the variable. + * @param upperBoundExpression A constant expression defining the upper bound of the domain of the variable. + * @param initialValueExpression A constant expression that defines the initial value of the variable. + */ + IntegerVariable(std::string const& variableName, storm::expressions::Expression const& lowerBoundExpression, storm::expressions::Expression const& upperBoundExpression, storm::expressions::Expression const& initialValueExpression); + + /*! + * Creates a copy of the given integer variable and performs the provided renaming. + * + * @param oldVariable The variable to copy. + * @param newName New name of this variable. + * @param renaming A mapping from names that are to be renamed to the names they are to be replaced with. + */ + IntegerVariable(IntegerVariable const& oldVariable, std::string const& newName, std::map<std::string, std::string> const& renaming); + + /*! + * Retrieves an expression defining the lower bound for this integer variable. + * + * @return An expression defining the lower bound for this integer variable. + */ + storm::expressions::Expression const& getLowerBoundExpression() const; + + /*! + * Retrieves an expression defining the upper bound for this integer variable. + * + * @return An expression defining the upper bound for this integer variable. + */ + storm::expressions::Expression const& getUpperBoundExpression() const; + + friend std::ostream& operator<<(std::ostream& stream, IntegerVariable const& variable); + + private: + // A constant expression that specifies the lower bound of the domain of the variable. + storm::expressions::Expression lowerBoundExpression; + + // A constant expression that specifies the upper bound of the domain of the variable. + storm::expressions::Expression upperBoundExpression; + }; + + } // namespace prism +} // namespace storm + +#endif /* STORM_STORAGE_PRISM_INTEGERVARIABLE_H_ */ diff --git a/src/ir/Module.cpp b/src/storage/prism/Module.cpp similarity index 100% rename from src/ir/Module.cpp rename to src/storage/prism/Module.cpp diff --git a/src/ir/Module.h b/src/storage/prism/Module.h similarity index 100% rename from src/ir/Module.h rename to src/storage/prism/Module.h diff --git a/src/ir/Program.cpp b/src/storage/prism/Program.cpp similarity index 100% rename from src/ir/Program.cpp rename to src/storage/prism/Program.cpp diff --git a/src/storage/prism/Program.h b/src/storage/prism/Program.h new file mode 100644 index 000000000..169a3fe32 --- /dev/null +++ b/src/storage/prism/Program.h @@ -0,0 +1,227 @@ +/* + * Program.h + * + * Created on: 04.01.2013 + * Author: Christian Dehnert + */ + +#ifndef STORM_IR_PROGRAM_H_ +#define STORM_IR_PROGRAM_H_ + +#include <map> +#include <vector> +#include <memory> +#include <set> +#include <boost/container/flat_set.hpp> + +#include "src/storage/expressions/Expression.h" +#include "Module.h" +#include "RewardModel.h" + +namespace storm { + namespace ir { + + /*! + * A class representing a program. + */ + class Program { + public: + + /*! + * An enum for the different model types. + */ + enum ModelType {UNDEFINED, DTMC, CTMC, MDP, CTMDP}; + + /*! + * Creates a program with the given model type, undefined constants, modules, rewards and labels. + * + * @param modelType The type of the model that this program gives rise to. + * @param booleanUndefinedConstantExpressions A map of undefined boolean constants to their + * expression nodes. + * @param integerUndefinedConstantExpressions A map of undefined integer constants to their + * expression nodes. + * @param doubleUndefinedConstantExpressions A map of undefined double constants to their + * expression nodes. + * @param globalBooleanVariables A list of global boolean variables. + * @param globalIntegerVariables A list of global integer variables. + * @param globalBooleanVariableToIndexMap A mapping from global boolean variable names to the index in the + * list of global boolean variables. + * @param globalIntegerVariableToIndexMap A mapping from global integer variable names to the index in the + * list of global integer variables. + * @param modules The modules of the program. + * @param rewards The reward models of the program. + * @param labels The labels defined for this model. + */ + Program(ModelType modelType, + std::set<std::string> const& booleanUndefinedConstantExpressions, + std::set<std::string> const& integerUndefinedConstantExpressions, + std::set<std::string> const& doubleUndefinedConstantExpressions, + std::map<std::string, BooleanVariable> const& globalBooleanVariables, + std::map<std::string, IntegerVariable> const& globalIntegerVariables, + std::vector<storm::ir::Module> const& modules, + std::map<std::string, storm::ir::RewardModel> const& rewards, + std::map<std::string, std::unique_ptr<storm::ir::expressions::BaseExpression>> const& labels); + + // Provide default implementations for constructors and assignments. + Program() = default; + Program(Program const& otherProgram) = default; + Program& operator=(Program const& otherProgram) = default; + Program(Program&& otherProgram) = default; + Program& operator=(Program&& otherProgram) = default; + + /*! + * Retrieves the model type of the model. + * + * @return The type of the model. + */ + ModelType getModelType() const; + + bool hasUndefinedConstants() const; + + bool hasUndefinedBooleanConstants() const; + bool hasUndefinedIntegerConstants() const; + bool hasUndefinedDoubleConstants() const; + + std::set<std::string> const& getUndefinedBooleanConstants() const; + std::set<std::string> const& getUndefinedIntegerConstants() const; + std::set<std::string> const& getUndefinedDoubleConstants() const; + + std::map<std::string, storm::ir::BooleanVariable> const& getGlobalBooleanVariables() const; + + /*! + * Retrieves a reference to the global boolean variable with the given index. + * + * @return A reference to the global boolean variable with the given index. + */ + storm::ir::BooleanVariable const& getGlobalBooleanVariable(std::string const& variableName) const; + + std::map<std::string, storm::ir::IntegerVariable> const& getGlobalIntegerVariables() const; + + /*! + * Retrieves a reference to the global integer variable with the given index. + * + * @return A reference to the global integer variable with the given index. + */ + storm::ir::IntegerVariable const& getGlobalIntegerVariable(std::string const& variableName) const; + + /*! + * Retrieves the number of global boolean variables of the program. + * + * @return The number of global boolean variables of the program. + */ + uint_fast64_t getNumberOfGlobalBooleanVariables() const; + + /*! + * Retrieves the number of global integer variables of the program. + * + * @return The number of global integer variables of the program. + */ + uint_fast64_t getNumberOfGlobalIntegerVariables() const; + + /*! + * Retrieves the number of modules in the program. + * + * @return The number of modules in the program. + */ + uint_fast64_t getNumberOfModules() const; + + /*! + * Retrieves a reference to the module with the given index. + * + * @param index The index of the module to retrieve. + * @return The module with the given index. + */ + storm::ir::Module const& getModule(uint_fast64_t index) const; + + /*! + * Retrieves the set of actions present in the program. + * + * @return The set of actions present in the program. + */ + std::set<std::string> const& getActions() const; + + /*! + * Retrieves the indices of all modules within this program that contain commands that are labelled with the given + * action. + * + * @param action The name of the action the modules are supposed to possess. + * @return A set of indices of all matching modules. + */ + std::set<uint_fast64_t> const& getModuleIndicesByAction(std::string const& action) const; + + /*! + * Retrieves the index of the module in which the given variable name was declared. + * + * @param variableName The name of the variable to search. + * @return The index of the module in which the given variable name was declared. + */ + uint_fast64_t getModuleIndexByVariable(std::string const& variableName) const; + + std::map<std::string, storm::ir::RewardModel> const& getRewardModels() const; + + /*! + * Retrieves the reward model with the given name. + * + * @param name The name of the reward model to return. + * @return The reward model with the given name. + */ + storm::ir::RewardModel const& getRewardModel(std::string const& name) const; + + /*! + * Retrieves all labels that are defined by the probabilitic program. + * + * @return A set of labels that are defined in the program. + */ + std::map<std::string, Expression> const& getLabels() const; + + /*! + * Creates a new program that drops all commands whose indices are not in the given set. + * + * @param indexSet The set of indices for which to keep the commands. + */ + Program restrictCommands(boost::container::flat_set<uint_fast64_t> const& indexSet); + + friend std::ostream& operator<<(std::ostream& stream, Program const& program); + + private: + // The type of the model. + ModelType modelType; + + // A list of undefined boolean constants of the model. + std::set<std::string> undefinedBooleanConstants; + + // A list of undefined integer constants of the model. + std::set<std::string> undefinedIntegerConstants; + + // A list of undefined double constants of the model. + std::set<std::string> undefinedDoubleConstants; + + // A list of global boolean variables. + std::map<std::string, BooleanVariable> globalBooleanVariables; + + // A list of global integer variables. + std::std::string, IntegerVariable> globalIntegerVariables; + + // The modules associated with the program. + std::vector<storm::ir::Module> modules; + + // The reward models associated with the program. + std::map<std::string, storm::ir::RewardModel> rewardModels; + + // The labels that are defined for this model. + std::map<std::string, Expression> labels; + + // The set of actions present in this program. + std::set<std::string> actions; + + // A map of actions to the set of modules containing commands labelled with this action. + std::map<std::string, std::set<uint_fast64_t>> actionsToModuleIndexMap; + + // A mapping from variable names to the modules in which they were declared. + std::map<std::string, uint_fast64_t> variableToModuleIndexMap; + }; + + } // namespace ir +} // namespace storm + +#endif /* STORM_IR_PROGRAM_H_ */ diff --git a/src/ir/RewardModel.cpp b/src/storage/prism/RewardModel.cpp similarity index 100% rename from src/ir/RewardModel.cpp rename to src/storage/prism/RewardModel.cpp diff --git a/src/ir/RewardModel.h b/src/storage/prism/RewardModel.h similarity index 100% rename from src/ir/RewardModel.h rename to src/storage/prism/RewardModel.h diff --git a/src/storage/prism/StateReward.cpp b/src/storage/prism/StateReward.cpp new file mode 100644 index 000000000..50457cabc --- /dev/null +++ b/src/storage/prism/StateReward.cpp @@ -0,0 +1,38 @@ +/* + * StateReward.cpp + * + * Created on: 12.01.2013 + * Author: Christian Dehnert + */ + +#include <sstream> + +#include "StateReward.h" + +namespace storm { + namespace ir { + + StateReward::StateReward() : statePredicate(), rewardValue() { + // Nothing to do here. + } + + StateReward::StateReward(storm::expressions::Expression const& statePredicate, storm::expressions::Expression const& rewardValue) : statePredicate(statePredicate), rewardValue(rewardValue) { + // Nothing to do here. + } + + std::string StateReward::toString() const { + std::stringstream result; + result << "\t" << statePredicate << ": " << rewardValue << ";"; + return result.str(); + } + + storm::expressions::Expression const& StateReward::getStatePredicate() const { + return this->statePredicate; + } + + storm::expressions::Expression const& StateReward::getRewardValue() const { + return this->rewardValue; + } + + } // namespace ir +} // namespace storm diff --git a/src/ir/StateReward.h b/src/storage/prism/StateReward.h similarity index 78% rename from src/ir/StateReward.h rename to src/storage/prism/StateReward.h index 117544d6d..d8c09f4e2 100644 --- a/src/ir/StateReward.h +++ b/src/storage/prism/StateReward.h @@ -10,7 +10,7 @@ #include <memory> -#include "expressions/BaseExpression.h" +#include "src/storage/expressions/Expression.h" namespace storm { namespace ir { @@ -34,21 +34,21 @@ namespace storm { * @param rewardValue An expression specifying the values of the rewards to attach to the * states. */ - StateReward(std::unique_ptr<storm::ir::expressions::BaseExpression>&& statePredicate, std::unique_ptr<storm::ir::expressions::BaseExpression>&& rewardValue); + StateReward(storm::expressions::Expression const& statePredicate, storm::expressions::Expression const& rewardValue); /*! * Performs a deep-copy of the given reward. * * @param otherReward The reward to copy. */ - StateReward(StateReward const& otherReward); + StateReward(StateReward const& otherReward) = default; /*! * Performs a deep-copy of the given reward and assigns it to the current one. * * @param otherReward The reward to assign. */ - StateReward& operator=(StateReward const& otherReward); + StateReward& operator=(StateReward const& otherReward) = default; /*! * Retrieves a string representation of this state reward. @@ -62,21 +62,21 @@ namespace storm { * * @return The state predicate that is associated with this state reward. */ - std::unique_ptr<storm::ir::expressions::BaseExpression> const& getStatePredicate() const; + storm::expressions::Expression const& getStatePredicate() const; /*! * Retrieves the reward value associated with this state reward. * * @return The reward value associated with this state reward. */ - std::unique_ptr<storm::ir::expressions::BaseExpression> const& getRewardValue() const; + storm::expressions::Expression const& getRewardValue() const; private: // The predicate that characterizes the states that obtain this reward. - std::unique_ptr<storm::ir::expressions::BaseExpression> statePredicate; + storm::expressions::Expression statePredicate; // The expression that specifies the value of the reward obtained. - std::unique_ptr<storm::ir::expressions::BaseExpression> rewardValue; + storm::expressions::Expression rewardValue; }; } // namespace ir diff --git a/src/storage/prism/TransitionReward.cpp b/src/storage/prism/TransitionReward.cpp new file mode 100644 index 000000000..93d951731 --- /dev/null +++ b/src/storage/prism/TransitionReward.cpp @@ -0,0 +1,42 @@ +/* + * TransitionReward.cpp + * + * Created on: 12.01.2013 + * Author: Christian Dehnert + */ + +#include <sstream> + +#include "TransitionReward.h" + +namespace storm { + namespace ir { + + TransitionReward::TransitionReward() : commandName(), statePredicate(), rewardValue() { + // Nothing to do here. + } + + TransitionReward::TransitionReward(std::string const& commandName, storm::expressions::Expression const& statePredicate, storm::expressions::Expression const& rewardValue) : commandName(commandName), statePredicate(statePredicate), rewardValue(rewardValue) { + // Nothing to do here. + } + + std::string TransitionReward::toString() const { + std::stringstream result; + result << "\t[" << commandName << "] " << statePredicate << ": " << rewardValue << ";"; + return result.str(); + } + + std::string const& TransitionReward::getActionName() const { + return this->commandName; + } + + storm::expressions::Expression const& TransitionReward::getStatePredicate() const { + return this->statePredicate; + } + + storm::expressions::Expression const& TransitionReward::getRewardValue() const { + return this->rewardValue; + } + + } // namespace ir +} // namespace storm diff --git a/src/ir/TransitionReward.h b/src/storage/prism/TransitionReward.h similarity index 79% rename from src/ir/TransitionReward.h rename to src/storage/prism/TransitionReward.h index 298d17024..b21eeb12f 100644 --- a/src/ir/TransitionReward.h +++ b/src/storage/prism/TransitionReward.h @@ -10,7 +10,7 @@ #include <memory> -#include "expressions/BaseExpression.h" +#include "src/storage/expressions/Expression.h" namespace storm { @@ -36,21 +36,21 @@ public: * @param rewardValue An expression specifying the values of the rewards to attach to the * transitions. */ - TransitionReward(std::string const& commandName, std::unique_ptr<storm::ir::expressions::BaseExpression>&& statePredicate, std::unique_ptr<storm::ir::expressions::BaseExpression>&& rewardValue); + TransitionReward(std::string const& commandName, storm::expressions::Expression const& statePredicate, storm::expressions::Expression const& rewardValue); /*! * Performs a deep-copy of the given transition reward. * * @param otherReward The transition reward to copy. */ - TransitionReward(TransitionReward const& otherReward); + TransitionReward(TransitionReward const& otherReward) = default; /*! * Performs a deep-copy of the given transition reward and assigns it to the current one. * * @param otherReward The reward to assign. */ - TransitionReward& operator=(TransitionReward const& otherReward); + TransitionReward& operator=(TransitionReward const& otherReward) = default; /*! * Retrieves a string representation of this transition reward. @@ -71,14 +71,14 @@ public: * * @return The state predicate that is associated with this state reward. */ - std::unique_ptr<storm::ir::expressions::BaseExpression> const& getStatePredicate() const; + storm::expressions::Expression const& getStatePredicate() const; /*! * Retrieves the reward value associated with this state reward. * * @return The reward value associated with this state reward. */ - std::unique_ptr<storm::ir::expressions::BaseExpression> const& getRewardValue() const; + storm::expressions::Expression const& getRewardValue() const; private: // The name of the command this transition-based reward is attached to. @@ -86,10 +86,10 @@ private: // A predicate that needs to be satisfied by states for the reward to be obtained (by taking // a corresponding command transition). - std::unique_ptr<storm::ir::expressions::BaseExpression> statePredicate; + storm::expressions::Expression statePredicate; // The expression specifying the value of the reward obtained along the transitions. - std::unique_ptr<storm::ir::expressions::BaseExpression> rewardValue; + storm::expressions::Expression rewardValue; }; } // namespace ir diff --git a/src/storage/prism/Update.cpp b/src/storage/prism/Update.cpp new file mode 100644 index 000000000..7a4bb64ad --- /dev/null +++ b/src/storage/prism/Update.cpp @@ -0,0 +1,94 @@ +#include "Update.h" +#include "src/exceptions/OutOfRangeException.h" + +namespace storm { + namespace prism { + Update::Update(uint_fast64_t globalIndex, storm::expressions::Expression const& likelihoodExpression, std::map<std::string, storm::prism::Assignment> const& booleanAssignments, std::map<std::string, storm::prism::Assignment> const& integerAssignments) : likelihoodExpression(likelihoodExpression), booleanAssignments(booleanAssignments), integerAssignments(integerAssignments), globalIndex(globalIndex) { + // Nothing to do here. + } + + Update::Update(Update const& update, uint_fast64_t newGlobalIndex, std::map<std::string, std::string> const& renaming) : likelihoodExpression(update.getLikelihoodExpression().substitute<std::map>(renaming)), booleanAssignments(), integerAssignments(), globalIndex(newGlobalIndex) { + for (auto const& variableAssignmentPair : update.getBooleanAssignments()) { + auto const& namePair = renaming.find(variableAssignmentPair.first); + if (namePair != renaming.end()) { + this->booleanAssignments.emplace(namePair->second, Assignment(variableAssignmentPair.second, renaming)); + } else { + this->booleanAssignments.emplace(variableAssignmentPair.first, Assignment(variableAssignmentPair.second, renaming)); + } + } + for (auto const& variableAssignmentPair : update.getIntegerAssignments()) { + auto const& namePair = renaming.find(variableAssignmentPair.first); + if (renaming.count(variableAssignmentPair.first) > 0) { + this->integerAssignments.emplace(namePair->second, Assignment(variableAssignmentPair.second, renaming)); + } else { + this->integerAssignments.emplace(variableAssignmentPair.first, Assignment(variableAssignmentPair.second, renaming)); + } + } + this->likelihoodExpression = update.getLikelihoodExpression().substitute<std::map>(renaming); + } + + storm::expressions::Expression const& Update::getLikelihoodExpression() const { + return likelihoodExpression; + } + + std::size_t Update::getNumberOfBooleanAssignments() const { + return booleanAssignments.size(); + } + + std::size_t Update::getNumberOfIntegerAssignments() const { + return integerAssignments.size(); + } + + std::map<std::string, storm::prism::Assignment> const& Update::getBooleanAssignments() const { + return booleanAssignments; + } + + std::map<std::string, storm::prism::Assignment> const& Update::getIntegerAssignments() const { + return integerAssignments; + } + + storm::prism::Assignment const& Update::getBooleanAssignment(std::string const& variableName) const { + auto variableAssignmentPair = booleanAssignments.find(variableName); + if (variableAssignmentPair == booleanAssignments.end()) { + throw storm::exceptions::OutOfRangeException() << "Cannot find boolean assignment for variable '" << variableName << "' in update " << *this << "."; + } + + return variableAssignmentPair->second; + } + + storm::prism::Assignment const& Update::getIntegerAssignment(std::string const& variableName) const { + auto variableAssignmentPair = integerAssignments.find(variableName); + if (variableAssignmentPair == integerAssignments.end()) { + throw storm::exceptions::OutOfRangeException() << "Cannot find integer assignment for variable '" << variableName << "' in update " << *this << "."; + } + + return variableAssignmentPair->second; + } + + uint_fast64_t Update::getGlobalIndex() const { + return this->globalIndex; + } + + std::ostream& operator<<(std::ostream& stream, Update const& update) { + stream << update.getLikelihoodExpression() << " : "; + uint_fast64_t i = 0; + for (auto const& assignment : update.getBooleanAssignments()) { + stream << assignment.second; + if (i < update.getBooleanAssignments().size() - 1 || update.getIntegerAssignments().size() > 0) { + stream << " & "; + } + ++i; + } + i = 0; + for (auto const& assignment : update.getIntegerAssignments()) { + result << assignment.second; + if (i < update.getIntegerAssignments().size() - 1) { + stream << " & "; + } + ++i; + } + return stream; + } + + } // namespace ir +} // namespace storm diff --git a/src/ir/Update.h b/src/storage/prism/Update.h similarity index 54% rename from src/ir/Update.h rename to src/storage/prism/Update.h index 07b9a7d24..878e394c3 100644 --- a/src/ir/Update.h +++ b/src/storage/prism/Update.h @@ -1,122 +1,88 @@ -/* - * Update.h - * - * Created on: 06.01.2013 - * Author: Christian Dehnert - */ - -#ifndef STORM_IR_UPDATE_H_ -#define STORM_IR_UPDATE_H_ +#ifndef STORM_STORAGE_PRISM_UPDATE_H_ +#define STORM_STORAGE_PRISM_UPDATE_H_ #include <map> -#include <memory> -#include "expressions/BaseExpression.h" #include "Assignment.h" namespace storm { - - namespace parser { - namespace prism { - class VariableState; - } // namespace prismparser - } // namespace parser - - namespace ir { - - /*! - * A class representing an update of a command. - */ + namespace prism { class Update { public: /*! - * Default constructor. Creates an empty update. - */ - Update(); - - /*! - * Creates an update with the given expression specifying the likelihood and the mapping of - * variable to their assignments. + * Creates an update with the given expression specifying the likelihood and the mapping of variable to + * their assignments. * * @param globalIndex The global index of the update. * @param likelihoodExpression An expression specifying the likelihood of this update. * @param assignments A map of variable names to their assignments. */ - Update(uint_fast64_t globalIndex, std::unique_ptr<storm::ir::expressions::BaseExpression>&& likelihoodExpression, std::map<std::string, storm::ir::Assignment> const& booleanAssignments, std::map<std::string, storm::ir::Assignment> const& integerAssignments); + Update(uint_fast64_t index, storm::expressions::Expression const& likelihoodExpression, std::map<std::string, storm::prism::Assignment> const& booleanAssignments, std::map<std::string, storm::prism::Assignment> const& integerAssignments); /*! * Creates a copy of the given update and performs the provided renaming. * * @param update The update that is to be copied. * @param newGlobalIndex The global index of the resulting update. - * @param renaming A mapping from names that are to be renamed to the names they are to be - * replaced with. - * @param variableState An object knowing about the variables in the system. - */ - Update(Update const& update, uint_fast64_t newGlobalIndex, std::map<std::string, std::string> const& renaming, storm::parser::prism::VariableState& variableState); - - /*! - * Peforms a deep-copy of the given update. - * - * @param otherUpdate The update to copy. + * @param renaming A mapping from names that are to be renamed to the names they are to be replaced with. */ - Update(Update const& otherUpdate); + Update(Update const& update, uint_fast64_t newGlobalIndex, std::map<std::string, std::string> const& renaming); - /*! - * Performs a deep-copy of the given update and assigns it to the current one. - * - * @param otherUpdate The update to assign. - */ - Update& operator=(Update const& otherUpdate); + // Create default implementations of constructors/assignment. + Update() = default; + Update(Update const& otherVariable) = default; + Update& operator=(Update const& otherVariable)= default; + Update(Update&& otherVariable) = default; + Update& operator=(Update&& otherVariable) = default; /*! * Retrieves the expression for the likelihood of this update. * * @return The expression for the likelihood of this update. */ - std::unique_ptr<storm::ir::expressions::BaseExpression> const& getLikelihoodExpression() const; + storm::expressions::Expression const& getLikelihoodExpression() const; /*! * Retrieves the number of boolean assignments associated with this update. * * @return The number of boolean assignments associated with this update. */ - uint_fast64_t getNumberOfBooleanAssignments() const; + std::size_t getNumberOfBooleanAssignments() const; /*! * Retrieves the number of integer assignments associated with this update. * * @return The number of integer assignments associated with this update. */ - uint_fast64_t getNumberOfIntegerAssignments() const; + std::size_t getNumberOfIntegerAssignments() const; /*! * Retrieves a reference to the map of boolean variable names to their respective assignments. * * @return A reference to the map of boolean variable names to their respective assignments. */ - std::map<std::string, storm::ir::Assignment> const& getBooleanAssignments() const; + std::map<std::string, storm::prism::Assignment> const& getBooleanAssignments() const; /*! * Retrieves a reference to the map of integer variable names to their respective assignments. * * @return A reference to the map of integer variable names to their respective assignments. */ - std::map<std::string, storm::ir::Assignment> const& getIntegerAssignments() const; + std::map<std::string, storm::prism::Assignment> const& getIntegerAssignments() const; /*! * Retrieves a reference to the assignment for the boolean variable with the given name. * * @return A reference to the assignment for the boolean variable with the given name. */ - storm::ir::Assignment const& getBooleanAssignment(std::string const& variableName) const; + storm::prism::Assignment const& getBooleanAssignment(std::string const& variableName) const; /*! * Retrieves a reference to the assignment for the integer variable with the given name. * * @return A reference to the assignment for the integer variable with the given name. */ - storm::ir::Assignment const& getIntegerAssignment(std::string const& variableName) const; + storm::prism::Assignment const& getIntegerAssignment(std::string const& variableName) const; /*! * Retrieves the global index of the update, that is, a unique index over all modules. @@ -125,28 +91,22 @@ namespace storm { */ uint_fast64_t getGlobalIndex() const; - /*! - * Retrieves a string representation of this update. - * - * @return A string representation of this update. - */ - std::string toString() const; + friend std::ostream& operator<<(std::ostream& stream, Update const& assignment); private: // An expression specifying the likelihood of taking this update. - std::unique_ptr<storm::ir::expressions::BaseExpression> likelihoodExpression; + storm::expressions::Expression likelihoodExpression; // A mapping of boolean variable names to their assignments in this update. - std::map<std::string, storm::ir::Assignment> booleanAssignments; + std::map<std::string, storm::prism::Assignment> booleanAssignments; // A mapping of integer variable names to their assignments in this update. - std::map<std::string, storm::ir::Assignment> integerAssignments; + std::map<std::string, storm::prism::Assignment> integerAssignments; // The global index of the update. uint_fast64_t globalIndex; }; - - } // namespace ir + } // namespace prism } // namespace storm -#endif /* STORM_IR_UPDATE_H_ */ +#endif /* STORM_STORAGE_PRISM_UPDATE_H_ */ diff --git a/src/storage/prism/Variable.cpp b/src/storage/prism/Variable.cpp new file mode 100644 index 000000000..9527e7f76 --- /dev/null +++ b/src/storage/prism/Variable.cpp @@ -0,0 +1,23 @@ +#include <map> + +#include "src/storage/prism/Variable.h" + +namespace storm { + namespace prism { + Variable::Variable(std::string const& variableName, storm::expressions::Expression const& initialValueExpression) : variableName(variableName), initialValueExpression(initialValueExpression) { + // Nothing to do here. + } + + Variable::Variable(Variable const& oldVariable, std::string const& newName, std::map<std::string, std::string> const& renaming) : variableName(newName), initialValueExpression(oldVariable.getInitialValueExpression().substitute<std::map>(renaming)) { + // Intentionally left empty. + } + + std::string const& Variable::getName() const { + return variableName; + } + + storm::expressions::Expression const& Variable::getInitialValueExpression() const { + return this->initialValueExpression; + } + } // namespace prism +} // namespace storm diff --git a/src/storage/prism/Variable.h b/src/storage/prism/Variable.h new file mode 100644 index 000000000..248a0e533 --- /dev/null +++ b/src/storage/prism/Variable.h @@ -0,0 +1,64 @@ +#ifndef STORM_STORAGE_PRISM_VARIABLE_H_ +#define STORM_STORAGE_PRISM_VARIABLE_H_ + +#include <map> + +#include "src/storage/expressions/Expression.h" + +namespace storm { + namespace prism { + class Variable { + public: + // Create default implementations of constructors/assignment. + Variable(Variable const& otherVariable) = default; + Variable& operator=(Variable const& otherVariable)= default; + Variable(Variable&& otherVariable) = default; + Variable& operator=(Variable&& otherVariable) = default; + + /*! + * Retrieves the name of the variable. + * + * @return The name of the variable. + */ + std::string const& getName() const; + + /*! + * Retrieves the expression defining the initial value of the variable. + * + * @return The expression defining the initial value of the variable. + */ + storm::expressions::Expression const& getInitialValueExpression() const; + + // Make the constructors protected to forbid instantiation of this class. + protected: + Variable() = default; + + /*! + * Creates a variable with the given name and initial value. + * + * @param variableName The name of the variable. + * @param initialValueExpression The constant expression that defines the initial value of the variable. + */ + Variable(std::string const& variableName, storm::expressions::Expression const& initialValueExpression); + + /*! + * Creates a copy of the given variable and performs the provided renaming. + * + * @param oldVariable The variable to copy. + * @param newName New name of this variable. + * @param renaming A mapping from names that are to be renamed to the names they are to be replaced with. + */ + Variable(Variable const& oldVariable, std::string const& newName, std::map<std::string, std::string> const& renaming); + + private: + // The name of the variable. + std::string variableName; + + // The constant expression defining the initial value of the variable. + storm::expressions::Expression initialValueExpression; + }; + + } // namespace prism +} // namespace storm + +#endif /* STORM_STORAGE_PRISM_VARIABLE_H_ */ diff --git a/test/functional/storage/CuddDdTest.cpp b/test/functional/storage/CuddDdTest.cpp index 959bc5db0..9230f00e3 100644 --- a/test/functional/storage/CuddDdTest.cpp +++ b/test/functional/storage/CuddDdTest.cpp @@ -6,8 +6,8 @@ #include "src/storage/dd/DdMetaVariable.h" TEST(CuddDdManager, Constants) { - std::shared_ptr<storm::dd::DdManager<storm::dd::CUDD>> manager(new storm::dd::DdManager<storm::dd::CUDD>()); - storm::dd::Dd<storm::dd::CUDD> zero; + std::shared_ptr<storm::dd::DdManager<storm::dd::DdType::CUDD>> manager(new storm::dd::DdManager<storm::dd::DdType::CUDD>()); + storm::dd::Dd<storm::dd::DdType::CUDD> zero; ASSERT_NO_THROW(zero = manager->getZero()); EXPECT_EQ(0, zero.getNonZeroCount()); @@ -16,7 +16,7 @@ TEST(CuddDdManager, Constants) { EXPECT_EQ(0, zero.getMin()); EXPECT_EQ(0, zero.getMax()); - storm::dd::Dd<storm::dd::CUDD> one; + storm::dd::Dd<storm::dd::DdType::CUDD> one; ASSERT_NO_THROW(one = manager->getOne()); EXPECT_EQ(1, one.getNonZeroCount()); @@ -25,7 +25,7 @@ TEST(CuddDdManager, Constants) { EXPECT_EQ(1, one.getMin()); EXPECT_EQ(1, one.getMax()); - storm::dd::Dd<storm::dd::CUDD> two; + storm::dd::Dd<storm::dd::DdType::CUDD> two; ASSERT_NO_THROW(two = manager->getConstant(2)); EXPECT_EQ(1, two.getNonZeroCount()); @@ -36,7 +36,7 @@ TEST(CuddDdManager, Constants) { } TEST(CuddDdManager, AddGetMetaVariableTest) { - std::shared_ptr<storm::dd::DdManager<storm::dd::CUDD>> manager(new storm::dd::DdManager<storm::dd::CUDD>()); + std::shared_ptr<storm::dd::DdManager<storm::dd::DdType::CUDD>> manager(new storm::dd::DdManager<storm::dd::DdType::CUDD>()); ASSERT_NO_THROW(manager->addMetaVariable("x", 1, 9)); EXPECT_EQ(1, manager->getNumberOfMetaVariables()); @@ -56,15 +56,15 @@ TEST(CuddDdManager, AddGetMetaVariableTest) { std::set<std::string> metaVariableSet = {"x", "y", "y'"}; EXPECT_EQ(metaVariableSet, manager->getAllMetaVariableNames()); - ASSERT_THROW(storm::dd::DdMetaVariable<storm::dd::CUDD> const& metaVariableX = manager->getMetaVariable("x'"), storm::exceptions::InvalidArgumentException); - ASSERT_NO_THROW(storm::dd::DdMetaVariable<storm::dd::CUDD> const& metaVariableX = manager->getMetaVariable("x")); + ASSERT_THROW(storm::dd::DdMetaVariable<storm::dd::DdType::CUDD> const& metaVariableX = manager->getMetaVariable("x'"), storm::exceptions::InvalidArgumentException); + ASSERT_NO_THROW(storm::dd::DdMetaVariable<storm::dd::DdType::CUDD> const& metaVariableX = manager->getMetaVariable("x")); } TEST(CuddDdManager, EncodingTest) { - std::shared_ptr<storm::dd::DdManager<storm::dd::CUDD>> manager(new storm::dd::DdManager<storm::dd::CUDD>()); + std::shared_ptr<storm::dd::DdManager<storm::dd::DdType::CUDD>> manager(new storm::dd::DdManager<storm::dd::DdType::CUDD>()); manager->addMetaVariable("x", 1, 9); - storm::dd::Dd<storm::dd::CUDD> encoding; + storm::dd::Dd<storm::dd::DdType::CUDD> encoding; ASSERT_THROW(encoding = manager->getEncoding("x", 0), storm::exceptions::InvalidArgumentException); ASSERT_THROW(encoding = manager->getEncoding("x", 10), storm::exceptions::InvalidArgumentException); ASSERT_NO_THROW(encoding = manager->getEncoding("x", 4)); @@ -74,10 +74,10 @@ TEST(CuddDdManager, EncodingTest) { } TEST(CuddDdManager, RangeTest) { - std::shared_ptr<storm::dd::DdManager<storm::dd::CUDD>> manager(new storm::dd::DdManager<storm::dd::CUDD>()); + std::shared_ptr<storm::dd::DdManager<storm::dd::DdType::CUDD>> manager(new storm::dd::DdManager<storm::dd::DdType::CUDD>()); ASSERT_NO_THROW(manager->addMetaVariable("x", 1, 9)); - storm::dd::Dd<storm::dd::CUDD> range; + storm::dd::Dd<storm::dd::DdType::CUDD> range; ASSERT_THROW(range = manager->getRange("y"), storm::exceptions::InvalidArgumentException); ASSERT_NO_THROW(range = manager->getRange("x")); @@ -87,10 +87,10 @@ TEST(CuddDdManager, RangeTest) { } TEST(CuddDdManager, IdentityTest) { - std::shared_ptr<storm::dd::DdManager<storm::dd::CUDD>> manager(new storm::dd::DdManager<storm::dd::CUDD>()); + std::shared_ptr<storm::dd::DdManager<storm::dd::DdType::CUDD>> manager(new storm::dd::DdManager<storm::dd::DdType::CUDD>()); manager->addMetaVariable("x", 1, 9); - storm::dd::Dd<storm::dd::CUDD> range; + storm::dd::Dd<storm::dd::DdType::CUDD> range; ASSERT_THROW(range = manager->getIdentity("y"), storm::exceptions::InvalidArgumentException); ASSERT_NO_THROW(range = manager->getIdentity("x")); @@ -100,11 +100,11 @@ TEST(CuddDdManager, IdentityTest) { } TEST(CuddDdMetaVariable, AccessorTest) { - std::shared_ptr<storm::dd::DdManager<storm::dd::CUDD>> manager(new storm::dd::DdManager<storm::dd::CUDD>()); + std::shared_ptr<storm::dd::DdManager<storm::dd::DdType::CUDD>> manager(new storm::dd::DdManager<storm::dd::DdType::CUDD>()); manager->addMetaVariable("x", 1, 9); EXPECT_EQ(1, manager->getNumberOfMetaVariables()); - ASSERT_NO_THROW(storm::dd::DdMetaVariable<storm::dd::CUDD> const& metaVariableX = manager->getMetaVariable("x")); - storm::dd::DdMetaVariable<storm::dd::CUDD> const& metaVariableX = manager->getMetaVariable("x"); + ASSERT_NO_THROW(storm::dd::DdMetaVariable<storm::dd::DdType::CUDD> const& metaVariableX = manager->getMetaVariable("x")); + storm::dd::DdMetaVariable<storm::dd::DdType::CUDD> const& metaVariableX = manager->getMetaVariable("x"); EXPECT_EQ(1, metaVariableX.getLow()); EXPECT_EQ(9, metaVariableX.getHigh()); @@ -114,14 +114,14 @@ TEST(CuddDdMetaVariable, AccessorTest) { } TEST(CuddDd, OperatorTest) { - std::shared_ptr<storm::dd::DdManager<storm::dd::CUDD>> manager(new storm::dd::DdManager<storm::dd::CUDD>()); + std::shared_ptr<storm::dd::DdManager<storm::dd::DdType::CUDD>> manager(new storm::dd::DdManager<storm::dd::DdType::CUDD>()); manager->addMetaVariable("x", 1, 9); EXPECT_TRUE(manager->getZero() == manager->getZero()); EXPECT_FALSE(manager->getZero() == manager->getOne()); - storm::dd::Dd<storm::dd::CUDD> dd1 = manager->getOne(); - storm::dd::Dd<storm::dd::CUDD> dd2 = manager->getOne(); - storm::dd::Dd<storm::dd::CUDD> dd3 = dd1 + dd2; + storm::dd::Dd<storm::dd::DdType::CUDD> dd1 = manager->getOne(); + storm::dd::Dd<storm::dd::DdType::CUDD> dd2 = manager->getOne(); + storm::dd::Dd<storm::dd::DdType::CUDD> dd3 = dd1 + dd2; EXPECT_TRUE(dd3 == manager->getConstant(2)); dd3 += manager->getZero(); @@ -154,7 +154,7 @@ TEST(CuddDd, OperatorTest) { dd3 = dd1.equals(dd2); EXPECT_EQ(1, dd3.getNonZeroCount()); - storm::dd::Dd<storm::dd::CUDD> dd4 = dd1.notEquals(dd2); + storm::dd::Dd<storm::dd::DdType::CUDD> dd4 = dd1.notEquals(dd2); EXPECT_TRUE(dd4 == ~dd3); dd3 = dd1.less(dd2); @@ -171,11 +171,11 @@ TEST(CuddDd, OperatorTest) { } TEST(CuddDd, AbstractionTest) { - std::shared_ptr<storm::dd::DdManager<storm::dd::CUDD>> manager(new storm::dd::DdManager<storm::dd::CUDD>()); + std::shared_ptr<storm::dd::DdManager<storm::dd::DdType::CUDD>> manager(new storm::dd::DdManager<storm::dd::DdType::CUDD>()); manager->addMetaVariablesInterleaved({"x", "x'"}, 1, 9); - storm::dd::Dd<storm::dd::CUDD> dd1; - storm::dd::Dd<storm::dd::CUDD> dd2; - storm::dd::Dd<storm::dd::CUDD> dd3; + storm::dd::Dd<storm::dd::DdType::CUDD> dd1; + storm::dd::Dd<storm::dd::DdType::CUDD> dd2; + storm::dd::Dd<storm::dd::DdType::CUDD> dd3; dd1 = manager->getIdentity("x"); dd2 = manager->getConstant(5); @@ -216,12 +216,12 @@ TEST(CuddDd, AbstractionTest) { } TEST(CuddDd, SwapTest) { - std::shared_ptr<storm::dd::DdManager<storm::dd::CUDD>> manager(new storm::dd::DdManager<storm::dd::CUDD>()); + std::shared_ptr<storm::dd::DdManager<storm::dd::DdType::CUDD>> manager(new storm::dd::DdManager<storm::dd::DdType::CUDD>()); manager->addMetaVariablesInterleaved({"x", "x'"}, 1, 9); manager->addMetaVariable("z", 2, 8); - storm::dd::Dd<storm::dd::CUDD> dd1; - storm::dd::Dd<storm::dd::CUDD> dd2; + storm::dd::Dd<storm::dd::DdType::CUDD> dd1; + storm::dd::Dd<storm::dd::DdType::CUDD> dd2; dd1 = manager->getIdentity("x"); ASSERT_THROW(dd1.swapVariables({std::make_pair("x", "z")}), storm::exceptions::InvalidArgumentException); @@ -230,12 +230,12 @@ TEST(CuddDd, SwapTest) { } TEST(CuddDd, MultiplyMatrixTest) { - std::shared_ptr<storm::dd::DdManager<storm::dd::CUDD>> manager(new storm::dd::DdManager<storm::dd::CUDD>()); + std::shared_ptr<storm::dd::DdManager<storm::dd::DdType::CUDD>> manager(new storm::dd::DdManager<storm::dd::DdType::CUDD>()); manager->addMetaVariablesInterleaved({"x", "x'"}, 1, 9); - storm::dd::Dd<storm::dd::CUDD> dd1 = manager->getIdentity("x").equals(manager->getIdentity("x'")); - storm::dd::Dd<storm::dd::CUDD> dd2 = manager->getRange("x'"); - storm::dd::Dd<storm::dd::CUDD> dd3; + storm::dd::Dd<storm::dd::DdType::CUDD> dd1 = manager->getIdentity("x").equals(manager->getIdentity("x'")); + storm::dd::Dd<storm::dd::DdType::CUDD> dd2 = manager->getRange("x'"); + storm::dd::Dd<storm::dd::DdType::CUDD> dd3; dd1 *= manager->getConstant(2); ASSERT_NO_THROW(dd3 = dd1.multiplyMatrix(dd2, {"x'"})); @@ -244,10 +244,10 @@ TEST(CuddDd, MultiplyMatrixTest) { } TEST(CuddDd, GetSetValueTest) { - std::shared_ptr<storm::dd::DdManager<storm::dd::CUDD>> manager(new storm::dd::DdManager<storm::dd::CUDD>()); + std::shared_ptr<storm::dd::DdManager<storm::dd::DdType::CUDD>> manager(new storm::dd::DdManager<storm::dd::DdType::CUDD>()); manager->addMetaVariable("x", 1, 9); - storm::dd::Dd<storm::dd::CUDD> dd1 = manager->getOne(); + storm::dd::Dd<storm::dd::DdType::CUDD> dd1 = manager->getOne(); ASSERT_NO_THROW(dd1.setValue("x", 4, 2)); EXPECT_EQ(2, dd1.getLeafCount()); dd1.exportToDot("dd1.dot");