Browse Source
			
			
			Started to implement the algorithm more close to the one mentioned in the paper (in particular to make things more clean and to allow more than 2 dimensions.
			
			
				main
			
			
		
		Started to implement the algorithm more close to the one mentioned in the paper (in particular to make things more clean and to allow more than 2 dimensions.
	
		
	
			
			
				main
			
			
		
				 4 changed files with 369 additions and 2 deletions
			
			
		- 
					127src/storm/modelchecker/prctl/helper/rewardbounded/CostLimitClosure.cpp
 - 
					53src/storm/modelchecker/prctl/helper/rewardbounded/CostLimitClosure.h
 - 
					180src/storm/modelchecker/prctl/helper/rewardbounded/QuantileHelper.cpp
 - 
					7src/storm/modelchecker/prctl/helper/rewardbounded/QuantileHelper.h
 
@ -0,0 +1,127 @@ | 
			
		|||||
 | 
				#include "storm/modelchecker/prctl/helper/rewardbounded/CostLimitClosure.h"
 | 
			
		||||
 | 
				#include "storm/utility/macros.h"
 | 
			
		||||
 | 
				#include "storm/exceptions/IllegalArgumentException.h"
 | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				namespace storm { | 
			
		||||
 | 
				    namespace modelchecker { | 
			
		||||
 | 
				        namespace helper { | 
			
		||||
 | 
				            namespace rewardbounded { | 
			
		||||
 | 
				                CostLimit::CostLimit(uint64_t const &costLimit) : value(costLimit) { | 
			
		||||
 | 
				                    // Intentionally left empty
 | 
			
		||||
 | 
				                } | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				                bool CostLimit::isInfinity() const { | 
			
		||||
 | 
				                    return value == std::numeric_limits<uint64_t>::max(); | 
			
		||||
 | 
				                } | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				                uint64_t const& CostLimit::get() const { | 
			
		||||
 | 
				                    STORM_LOG_ASSERT(!isInfinity(), "Tried to get an infinite cost limit as int."); | 
			
		||||
 | 
				                    return value; | 
			
		||||
 | 
				                } | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				                uint64_t& CostLimit::get() { | 
			
		||||
 | 
				                    STORM_LOG_ASSERT(!isInfinity(), "Tried to get an infinite cost limit as int."); | 
			
		||||
 | 
				                    return value; | 
			
		||||
 | 
				                } | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				                bool CostLimit::operator<(CostLimit const& other) const { | 
			
		||||
 | 
				                    // Since infinity is represented by the max integer, we can compare this way.
 | 
			
		||||
 | 
				                    return value < other.value; | 
			
		||||
 | 
				                } | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				                bool CostLimit::operator==(CostLimit const& other) const { | 
			
		||||
 | 
				                    return value == other.value; | 
			
		||||
 | 
				                } | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				                CostLimit CostLimit::infinity() { | 
			
		||||
 | 
				                    return CostLimit(std::numeric_limits<uint64_t>::max()); | 
			
		||||
 | 
				                } | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				                bool CostLimitClosure::CostLimitsCompare::operator()(storm::modelchecker::helper::rewardbounded::CostLimits const& lhs, storm::modelchecker::helper::rewardbounded::CostLimits const& rhs) const { | 
			
		||||
 | 
				                    for (uint64_t i = 0; i < lhs.size(); ++i) { | 
			
		||||
 | 
				                        if (lhs[i] < rhs[i]) { | 
			
		||||
 | 
				                            return true; | 
			
		||||
 | 
				                        } else if (rhs[i] < lhs[i]) { | 
			
		||||
 | 
				                            return false; | 
			
		||||
 | 
				                        } | 
			
		||||
 | 
				                    } | 
			
		||||
 | 
				                    return false; | 
			
		||||
 | 
				                } | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				                CostLimitClosure::CostLimitClosure(storm::storage::BitVector const &downwardDimensions) | 
			
		||||
 | 
				                        : downwardDimensions(downwardDimensions) { | 
			
		||||
 | 
				                    // Intentionally left empty
 | 
			
		||||
 | 
				                } | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				                bool CostLimitClosure::insert(CostLimits const& costLimits) { | 
			
		||||
 | 
				                    // Iterate over all points in the generator and check whether they dominate the given point or vice versa
 | 
			
		||||
 | 
				                    // TODO: make this more efficient by exploiting the order of the generator set.
 | 
			
		||||
 | 
				                    std::vector<CostLimits> pointsToErase; | 
			
		||||
 | 
				                    for (auto const& b : generator) { | 
			
		||||
 | 
				                        if (dominates(b, costLimits)) { | 
			
		||||
 | 
				                            // The given point is already contained in this closure.
 | 
			
		||||
 | 
				                            // Since domination is transitive, this should not happen:
 | 
			
		||||
 | 
				                            STORM_LOG_ASSERT(pointsToErase.empty(), "Inconsistent generator of CostLimitClosure."); | 
			
		||||
 | 
				                            return false; | 
			
		||||
 | 
				                        } | 
			
		||||
 | 
				                        if (dominates(costLimits, b)) { | 
			
		||||
 | 
				                            // b will be dominated by the new point so we erase it later.
 | 
			
		||||
 | 
				                            // Note that b != newPoint holds if we reach this point
 | 
			
		||||
 | 
				                            pointsToErase.push_back(b); | 
			
		||||
 | 
				                        } | 
			
		||||
 | 
				                    } | 
			
		||||
 | 
				                    for (auto const& b : pointsToErase) { | 
			
		||||
 | 
				                        generator.erase(b); | 
			
		||||
 | 
				                    } | 
			
		||||
 | 
				                    generator.insert(std::move(costLimits)); | 
			
		||||
 | 
				                    return true; | 
			
		||||
 | 
				                } | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				                bool CostLimitClosure::contains(CostLimits const& costLimits) const { | 
			
		||||
 | 
				                    // Iterate over all points in the generator and check whether they dominate the given point.
 | 
			
		||||
 | 
				                    // TODO: make this more efficient by exploiting the order of the generator set.
 | 
			
		||||
 | 
				                    for (auto const&b : generator) { | 
			
		||||
 | 
				                        if (dominates(b,costLimits)) { | 
			
		||||
 | 
				                            return true; | 
			
		||||
 | 
				                        } | 
			
		||||
 | 
				                    } | 
			
		||||
 | 
				                    return false; | 
			
		||||
 | 
				                } | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				                bool CostLimitClosure::dominates(CostLimits const& lhs, CostLimits const& rhs) const { | 
			
		||||
 | 
				                    for (uint64_t i = 0; i < lhs.size(); ++i) { | 
			
		||||
 | 
				                        if (downwardDimensions.get(i)) { | 
			
		||||
 | 
				                            if (lhs[i] < rhs[i]) { | 
			
		||||
 | 
				                                return false; | 
			
		||||
 | 
				                            } | 
			
		||||
 | 
				                        } else { | 
			
		||||
 | 
				                            if (rhs[i] < lhs[i]) { | 
			
		||||
 | 
				                                return false; | 
			
		||||
 | 
				                            } | 
			
		||||
 | 
				                        } | 
			
		||||
 | 
				                    } | 
			
		||||
 | 
				                    return true; | 
			
		||||
 | 
				                } | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				                std::vector<CostLimits> CostLimitClosure::getDominatingCostLimits(CostLimits const& costLimits) const { | 
			
		||||
 | 
				                    std::vector<CostLimits> result; | 
			
		||||
 | 
				                    for (auto const &b : generator) { | 
			
		||||
 | 
				                        if (dominates(b, costLimits)) { | 
			
		||||
 | 
				                            result.push_back(b); | 
			
		||||
 | 
				                        } | 
			
		||||
 | 
				                    } | 
			
		||||
 | 
				                    return result; | 
			
		||||
 | 
				                } | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				                typename CostLimitClosure::GeneratorType const &CostLimitClosure::getGenerator() const { | 
			
		||||
 | 
				                    return generator; | 
			
		||||
 | 
				                } | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				                uint64_t CostLimitClosure::dimension() const { | 
			
		||||
 | 
				                    return downwardDimensions.size(); | 
			
		||||
 | 
				                } | 
			
		||||
 | 
				            } | 
			
		||||
 | 
				        } | 
			
		||||
 | 
				    } | 
			
		||||
 | 
				} | 
			
		||||
@ -0,0 +1,53 @@ | 
			
		|||||
 | 
				#pragma once | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				#include <vector> | 
			
		||||
 | 
				#include <set> | 
			
		||||
 | 
				#include <string> | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				#include "storm/storage/BitVector.h" | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				namespace storm { | 
			
		||||
 | 
				    namespace modelchecker { | 
			
		||||
 | 
				        namespace helper { | 
			
		||||
 | 
				            namespace rewardbounded { | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				                class CostLimit { | 
			
		||||
 | 
				                public: | 
			
		||||
 | 
				                    CostLimit(uint64_t const& costLimit); | 
			
		||||
 | 
				                    bool isInfinity() const; | 
			
		||||
 | 
				                    uint64_t const& get() const; | 
			
		||||
 | 
				                    uint64_t& get(); | 
			
		||||
 | 
				                    bool operator<(CostLimit const& other) const; | 
			
		||||
 | 
				                    bool operator==(CostLimit const& other) const; | 
			
		||||
 | 
				                    static CostLimit infinity(); | 
			
		||||
 | 
				                private: | 
			
		||||
 | 
				                    uint64_t value; | 
			
		||||
 | 
				                }; | 
			
		||||
 | 
				                typedef std::vector<CostLimit> CostLimits; | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				                class CostLimitClosure { | 
			
		||||
 | 
				                public: | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				                    struct CostLimitsCompare { | 
			
		||||
 | 
				                        bool operator() (CostLimits const& lhs, CostLimits const& rhs) const; | 
			
		||||
 | 
				                    }; | 
			
		||||
 | 
				                    typedef std::set<CostLimits, CostLimitsCompare> GeneratorType; | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				                    explicit CostLimitClosure(storm::storage::BitVector const& downwardDimensions); | 
			
		||||
 | 
				                    bool insert(CostLimits const& costLimits); | 
			
		||||
 | 
				                    bool contains(CostLimits const& costLimits) const; | 
			
		||||
 | 
				                    bool dominates(CostLimits const& lhs, CostLimits const& rhs) const; | 
			
		||||
 | 
				                    std::vector<CostLimits> getDominatingCostLimits(CostLimits const& costLimits) const; | 
			
		||||
 | 
				                    GeneratorType const& getGenerator() const; | 
			
		||||
 | 
				                    uint64_t dimension() const; | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				                private: | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				                    /// The dimensions that are downwards closed, i.e., if x is in the closure, then also all y <= x | 
			
		||||
 | 
				                    storm::storage::BitVector downwardDimensions; | 
			
		||||
 | 
				                    GeneratorType generator; | 
			
		||||
 | 
				                }; | 
			
		||||
 | 
				            } | 
			
		||||
 | 
				        } | 
			
		||||
 | 
				    } | 
			
		||||
 | 
				} | 
			
		||||
						Write
						Preview
					
					
					Loading…
					
					Cancel
						Save
					
		Reference in new issue