|
|
@ -1,9 +1,12 @@ |
|
|
|
#pragma once |
|
|
|
#include "storm/models/sparse/Pomdp.h" |
|
|
|
#include "storm/adapters/EigenAdapter.h" |
|
|
|
|
|
|
|
namespace storm { |
|
|
|
namespace generator { |
|
|
|
/** |
|
|
|
* This class keeps track of common information of a set of beliefs. |
|
|
|
* It also keeps a reference to the POMDP. The manager is referenced by all beliefs. |
|
|
|
*/ |
|
|
|
template<typename ValueType> |
|
|
|
class BeliefStateManager { |
|
|
|
public: |
|
|
@ -28,22 +31,41 @@ namespace storm { |
|
|
|
std::vector<std::vector<uint64_t>> statePerObservationAndOffset; |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
template<typename ValueType> |
|
|
|
class SparseBeliefState; |
|
|
|
template<typename ValueType> |
|
|
|
bool operator==(SparseBeliefState<ValueType> const& lhs, SparseBeliefState<ValueType> const& rhs); |
|
|
|
|
|
|
|
/** |
|
|
|
* SparseBeliefState stores beliefs in a sparse format. |
|
|
|
*/ |
|
|
|
template<typename ValueType> |
|
|
|
class SparseBeliefState { |
|
|
|
public: |
|
|
|
SparseBeliefState(std::shared_ptr<BeliefStateManager<ValueType>> const& manager, uint64_t state); |
|
|
|
SparseBeliefState update(uint64_t action, uint32_t observation) const; |
|
|
|
/** |
|
|
|
* Update the belief using the new observation |
|
|
|
* @param newObservation |
|
|
|
* @param previousBeliefs put the new belief in this set |
|
|
|
*/ |
|
|
|
void update(uint32_t newObservation, std::unordered_set<SparseBeliefState>& previousBeliefs) const; |
|
|
|
std::size_t hash() const noexcept; |
|
|
|
/** |
|
|
|
* Get the estimate to be in the given state |
|
|
|
* @param state |
|
|
|
* @return |
|
|
|
*/ |
|
|
|
ValueType get(uint64_t state) const; |
|
|
|
/** |
|
|
|
* Get the weighted risk |
|
|
|
* @return |
|
|
|
*/ |
|
|
|
ValueType getRisk() const; |
|
|
|
|
|
|
|
// Various getters |
|
|
|
std::string toString() const; |
|
|
|
bool isValid() const; |
|
|
|
Eigen::Matrix<ValueType, Eigen::Dynamic, 1> toEigenVector(storm::storage::BitVector const& support) const; |
|
|
|
uint64_t getSupportSize() const; |
|
|
|
void setSupport(storm::storage::BitVector&) const; |
|
|
|
std::map<uint64_t, ValueType> const& getBeliefMap() const; |
|
|
@ -61,7 +83,9 @@ namespace storm { |
|
|
|
uint64_t prevId; |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
* ObservationDenseBeliefState stores beliefs in a dense format (per observation). |
|
|
|
*/ |
|
|
|
template<typename ValueType> |
|
|
|
class ObservationDenseBeliefState; |
|
|
|
template<typename ValueType> |
|
|
@ -76,7 +100,6 @@ namespace storm { |
|
|
|
ValueType get(uint64_t state) const; |
|
|
|
ValueType getRisk() const; |
|
|
|
std::string toString() const; |
|
|
|
Eigen::Matrix<ValueType, Eigen::Dynamic, 1> toEigenVector(storm::storage::BitVector const& support) const; |
|
|
|
uint64_t getSupportSize() const; |
|
|
|
void setSupport(storm::storage::BitVector&) const; |
|
|
|
friend bool operator==<>(ObservationDenseBeliefState<ValueType> const& lhs, ObservationDenseBeliefState<ValueType> const& rhs); |
|
|
@ -93,10 +116,15 @@ namespace storm { |
|
|
|
uint64_t prevId; |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
* This tracker implements state estimation for POMDPs. |
|
|
|
* This corresponds to forward filtering in Junges, Torfah, Seshia. |
|
|
|
* |
|
|
|
* @tparam ValueType How are probabilities stored |
|
|
|
* @tparam BeliefState What format to use for beliefs |
|
|
|
*/ |
|
|
|
template<typename ValueType, typename BeliefState> |
|
|
|
class NondeterministicBeliefTracker { |
|
|
|
|
|
|
|
public: |
|
|
|
struct Options { |
|
|
|
uint64_t trackTimeOut = 0; |
|
|
@ -104,15 +132,59 @@ namespace storm { |
|
|
|
ValueType wiggle; // tolerance, anything above 0 means that we are incomplete. |
|
|
|
}; |
|
|
|
NondeterministicBeliefTracker(storm::models::sparse::Pomdp<ValueType> const& pomdp, typename NondeterministicBeliefTracker<ValueType, BeliefState>::Options options = Options()); |
|
|
|
/** |
|
|
|
* Start with a new trace. |
|
|
|
* @param observation The initial observation to start with. |
|
|
|
* @return |
|
|
|
*/ |
|
|
|
bool reset(uint32_t observation); |
|
|
|
/** |
|
|
|
* Extend the observed trace with the new observation |
|
|
|
* @param newObservation |
|
|
|
* @return |
|
|
|
*/ |
|
|
|
bool track(uint64_t newObservation); |
|
|
|
/** |
|
|
|
* Provides access to the current beliefs. |
|
|
|
* @return |
|
|
|
*/ |
|
|
|
std::unordered_set<BeliefState> const& getCurrentBeliefs() const; |
|
|
|
/** |
|
|
|
* What was the last obervation that we made? |
|
|
|
* @return |
|
|
|
*/ |
|
|
|
uint32_t getCurrentObservation() const; |
|
|
|
/** |
|
|
|
* How many beliefs are we currently tracking? |
|
|
|
* @return |
|
|
|
*/ |
|
|
|
uint64_t getNumberOfBeliefs() const; |
|
|
|
/** |
|
|
|
* What is the (worst-case/best-case) risk over all beliefs |
|
|
|
* @param max Should we take the max or the min? |
|
|
|
* @return |
|
|
|
*/ |
|
|
|
ValueType getCurrentRisk(bool max=true); |
|
|
|
/** |
|
|
|
* Sets the state-risk to use for all beliefs. |
|
|
|
* @param risk |
|
|
|
*/ |
|
|
|
void setRisk(std::vector<ValueType> const& risk); |
|
|
|
/** |
|
|
|
* What is the dimension of the current set of beliefs, i.e., |
|
|
|
* what is the number of states we could possibly be in? |
|
|
|
* @return |
|
|
|
*/ |
|
|
|
uint64_t getCurrentDimension() const; |
|
|
|
/** |
|
|
|
* Apply reductions to the belief state |
|
|
|
* @return |
|
|
|
*/ |
|
|
|
uint64_t reduce(); |
|
|
|
/** |
|
|
|
* Did we time out during the computation? |
|
|
|
* @return |
|
|
|
*/ |
|
|
|
bool hasTimedOut() const; |
|
|
|
|
|
|
|
private: |
|
|
|