Browse Source
			
			
			better check whether transition rewards can be scaled and lifted to action rewards
			
			
				main
			
			
		
		better check whether transition rewards can be scaled and lifted to action rewards
	
		
	
			
			
				main
			
			
		
				 5 changed files with 193 additions and 13 deletions
			
			
		- 
					2src/storm/api/builder.h
 - 
					16src/storm/builder/BuilderOptions.cpp
 - 
					7src/storm/builder/BuilderOptions.h
 - 
					133src/storm/logic/LiftableTransitionRewardsVisitor.cpp
 - 
					48src/storm/logic/LiftableTransitionRewardsVisitor.h
 
@ -0,0 +1,133 @@ | 
				
			|||
#include "storm/logic/LiftableTransitionRewardsVisitor.h"
 | 
				
			|||
 | 
				
			|||
#include "storm/logic/Formulas.h"
 | 
				
			|||
#include "storm/storage/jani/traverser/RewardModelInformation.h"
 | 
				
			|||
 | 
				
			|||
namespace storm { | 
				
			|||
    namespace logic { | 
				
			|||
         | 
				
			|||
        LiftableTransitionRewardsVisitor::LiftableTransitionRewardsVisitor(storm::storage::SymbolicModelDescription const& symbolicModelDescription) : symbolicModelDescription(symbolicModelDescription) { | 
				
			|||
            // Intentionally left empty.
 | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        bool LiftableTransitionRewardsVisitor::areTransitionRewardsLiftable(Formula const& f) const { | 
				
			|||
            return boost::any_cast<bool>(f.accept(*this, boost::any())); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        boost::any LiftableTransitionRewardsVisitor::visit(AtomicExpressionFormula const&, boost::any const&) const { | 
				
			|||
            return true; | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        boost::any LiftableTransitionRewardsVisitor::visit(AtomicLabelFormula const&, boost::any const&) const { | 
				
			|||
            return true; | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        boost::any LiftableTransitionRewardsVisitor::visit(BinaryBooleanStateFormula const&, boost::any const&) const { | 
				
			|||
            return true; | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        boost::any LiftableTransitionRewardsVisitor::visit(BooleanLiteralFormula const&, boost::any const&) const { | 
				
			|||
            return true; | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        boost::any LiftableTransitionRewardsVisitor::visit(BoundedUntilFormula const& f, boost::any const& data) const { | 
				
			|||
            for (unsigned i = 0; i < f.getDimension(); ++i) { | 
				
			|||
                if (f.getTimeBoundReference(i).isRewardBound() && rewardModelHasTransitionRewards(f.getTimeBoundReference(i).getRewardName())) { | 
				
			|||
                    return false; | 
				
			|||
                } | 
				
			|||
            } | 
				
			|||
             | 
				
			|||
            bool result = true; | 
				
			|||
            if (f.hasMultiDimensionalSubformulas()) { | 
				
			|||
                for (unsigned i = 0; i < f.getDimension(); ++i) { | 
				
			|||
                    result = result && boost::any_cast<bool>(f.getLeftSubformula(i).accept(*this, data)); | 
				
			|||
                    result = result && boost::any_cast<bool>(f.getRightSubformula(i).accept(*this, data)); | 
				
			|||
                } | 
				
			|||
            } else { | 
				
			|||
                result = result && boost::any_cast<bool>(f.getLeftSubformula().accept(*this, data)); | 
				
			|||
                result = result && boost::any_cast<bool>(f.getRightSubformula().accept(*this, data)); | 
				
			|||
            } | 
				
			|||
            return result; | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        boost::any LiftableTransitionRewardsVisitor::visit(ConditionalFormula const& f, boost::any const& data) const { | 
				
			|||
            return !f.isConditionalRewardFormula() && boost::any_cast<bool>(f.getSubformula().accept(*this, data)) && boost::any_cast<bool>(f.getConditionFormula().accept(*this, data)); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        boost::any LiftableTransitionRewardsVisitor::visit(CumulativeRewardFormula const& f, boost::any const&) const { | 
				
			|||
            for (unsigned i = 0; i < f.getDimension(); ++i) { | 
				
			|||
                if (f.getTimeBoundReference(i).isRewardBound() && rewardModelHasTransitionRewards(f.getTimeBoundReference(i).getRewardName())) { | 
				
			|||
                    return false; | 
				
			|||
                } | 
				
			|||
            } | 
				
			|||
            return true; | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        boost::any LiftableTransitionRewardsVisitor::visit(EventuallyFormula const& f, boost::any const& data) const { | 
				
			|||
            return f.getSubformula().accept(*this, data); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        boost::any LiftableTransitionRewardsVisitor::visit(TimeOperatorFormula const& f, boost::any const& data) const { | 
				
			|||
            return f.getSubformula().accept(*this, data); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        boost::any LiftableTransitionRewardsVisitor::visit(GloballyFormula const& f, boost::any const& data) const { | 
				
			|||
            return f.getSubformula().accept(*this, data); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        boost::any LiftableTransitionRewardsVisitor::visit(InstantaneousRewardFormula const&, boost::any const&) const { | 
				
			|||
            return true; | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        boost::any LiftableTransitionRewardsVisitor::visit(LongRunAverageOperatorFormula const& f, boost::any const& data) const { | 
				
			|||
            return f.getSubformula().accept(*this, data); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        boost::any LiftableTransitionRewardsVisitor::visit(LongRunAverageRewardFormula const&, boost::any const&) const { | 
				
			|||
            return true; | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        boost::any LiftableTransitionRewardsVisitor::visit(MultiObjectiveFormula const& f, boost::any const& data) const { | 
				
			|||
            bool result = true; | 
				
			|||
            for (auto const& subF : f.getSubformulas()){ | 
				
			|||
                result = result && boost::any_cast<bool>(subF->accept(*this, data)); | 
				
			|||
            } | 
				
			|||
            return result; | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        boost::any LiftableTransitionRewardsVisitor::visit(NextFormula const& f, boost::any const& data) const { | 
				
			|||
            return boost::any_cast<bool>(f.getSubformula().accept(*this, data)); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        boost::any LiftableTransitionRewardsVisitor::visit(ProbabilityOperatorFormula const& f, boost::any const& data) const { | 
				
			|||
            return f.getSubformula().accept(*this, data); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        boost::any LiftableTransitionRewardsVisitor::visit(RewardOperatorFormula const& f, boost::any const& data) const { | 
				
			|||
            return boost::any_cast<bool>(f.getSubformula().accept(*this, data)); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        boost::any LiftableTransitionRewardsVisitor::visit(TotalRewardFormula const&, boost::any const&) const { | 
				
			|||
            return true; | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        boost::any LiftableTransitionRewardsVisitor::visit(UnaryBooleanStateFormula const& f, boost::any const& data) const { | 
				
			|||
            return f.getSubformula().accept(*this, data); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        boost::any LiftableTransitionRewardsVisitor::visit(UntilFormula const& f, boost::any const& data) const { | 
				
			|||
            return boost::any_cast<bool>(f.getLeftSubformula().accept(*this, data)) && boost::any_cast<bool>(f.getRightSubformula().accept(*this)); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        bool LiftableTransitionRewardsVisitor::rewardModelHasTransitionRewards(std::string const& rewardModelName) const { | 
				
			|||
            if (symbolicModelDescription.isJaniModel()) { | 
				
			|||
                return storm::jani::RewardModelInformation(symbolicModelDescription.asJaniModel(), rewardModelName).hasTransitionRewards(); | 
				
			|||
            } else if (symbolicModelDescription.isPrismProgram()) { | 
				
			|||
                return symbolicModelDescription.asPrismProgram().getRewardModel(rewardModelName).hasTransitionRewards(); | 
				
			|||
            } else { | 
				
			|||
                // No model given
 | 
				
			|||
                return false; | 
				
			|||
            } | 
				
			|||
        } | 
				
			|||
    } | 
				
			|||
} | 
				
			|||
@ -0,0 +1,48 @@ | 
				
			|||
#pragma once | 
				
			|||
 | 
				
			|||
#include "storm/logic/FormulaVisitor.h" | 
				
			|||
#include "storm/logic/FormulaInformation.h" | 
				
			|||
#include "storm/storage/SymbolicModelDescription.h" | 
				
			|||
 | 
				
			|||
namespace storm { | 
				
			|||
     | 
				
			|||
    namespace logic { | 
				
			|||
         | 
				
			|||
        class LiftableTransitionRewardsVisitor : public FormulaVisitor { | 
				
			|||
        public: | 
				
			|||
             | 
				
			|||
            LiftableTransitionRewardsVisitor(storm::storage::SymbolicModelDescription const& symbolicModelDescription = storm::storage::SymbolicModelDescription()); | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Returns true, when lifting transition rewards to action rewards (by scaling with the transition probability) preserves the given formula | 
				
			|||
             */ | 
				
			|||
            bool areTransitionRewardsLiftable(Formula const& f) const; | 
				
			|||
             | 
				
			|||
            virtual boost::any visit(AtomicExpressionFormula const& f, boost::any const& data) const override; | 
				
			|||
            virtual boost::any visit(AtomicLabelFormula const& f, boost::any const& data) const override; | 
				
			|||
            virtual boost::any visit(BinaryBooleanStateFormula const& f, boost::any const& data) const override; | 
				
			|||
            virtual boost::any visit(BooleanLiteralFormula const& f, boost::any const& data) const override; | 
				
			|||
            virtual boost::any visit(BoundedUntilFormula const& f, boost::any const& data) const override; | 
				
			|||
            virtual boost::any visit(ConditionalFormula const& f, boost::any const& data) const override; | 
				
			|||
            virtual boost::any visit(CumulativeRewardFormula const& f, boost::any const& data) const override; | 
				
			|||
            virtual boost::any visit(EventuallyFormula const& f, boost::any const& data) const override; | 
				
			|||
            virtual boost::any visit(TimeOperatorFormula const& f, boost::any const& data) const override; | 
				
			|||
            virtual boost::any visit(GloballyFormula const& f, boost::any const& data) const override; | 
				
			|||
            virtual boost::any visit(InstantaneousRewardFormula const& f, boost::any const& data) const override; | 
				
			|||
            virtual boost::any visit(LongRunAverageOperatorFormula const& f, boost::any const& data) const override; | 
				
			|||
            virtual boost::any visit(LongRunAverageRewardFormula const& f, boost::any const& data) const override; | 
				
			|||
            virtual boost::any visit(MultiObjectiveFormula const& f, boost::any const& data) const override; | 
				
			|||
            virtual boost::any visit(NextFormula const& f, boost::any const& data) const override; | 
				
			|||
            virtual boost::any visit(ProbabilityOperatorFormula const& f, boost::any const& data) const override; | 
				
			|||
            virtual boost::any visit(RewardOperatorFormula const& f, boost::any const& data) const override; | 
				
			|||
            virtual boost::any visit(TotalRewardFormula const& f, boost::any const& data) const override; | 
				
			|||
            virtual boost::any visit(UnaryBooleanStateFormula const& f, boost::any const& data) const override; | 
				
			|||
            virtual boost::any visit(UntilFormula const& f, boost::any const& data) const override; | 
				
			|||
         | 
				
			|||
        private: | 
				
			|||
            storm::storage::SymbolicModelDescription const& symbolicModelDescription; | 
				
			|||
            bool rewardModelHasTransitionRewards(std::string const& rewardModelName) const; | 
				
			|||
        }; | 
				
			|||
         | 
				
			|||
    } | 
				
			|||
} | 
				
			|||
						Write
						Preview
					
					
					Loading…
					
					Cancel
						Save
					
		Reference in new issue