/* * Update.cpp * * Created on: 12.01.2013 * Author: Christian Dehnert */ #include #include "Update.h" #include "src/parser/prismparser/VariableState.h" #include "src/exceptions/OutOfRangeException.h" namespace storm { namespace ir { Update::Update() : likelihoodExpression(), booleanAssignments(), integerAssignments() { // Nothing to do here. } Update::Update(std::shared_ptr const& likelihoodExpression, std::map const& booleanAssignments, std::map const& integerAssignments) : likelihoodExpression(likelihoodExpression), booleanAssignments(booleanAssignments), integerAssignments(integerAssignments) { // Nothing to do here. } Update::Update(Update const& update, std::map const& renaming, storm::parser::prism::VariableState const& variableState) { 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); } std::shared_ptr 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 const& Update::getBooleanAssignments() const { return booleanAssignments; } std::map 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; } 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