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
- 
					184src/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