Browse Source
Implemented simple (but incomplete) check to display whether the belief MDP is finite.
tempestpy_adaptions
Implemented simple (but incomplete) check to display whether the belief MDP is finite.
tempestpy_adaptions
Tim Quatmann
5 years ago
2 changed files with 66 additions and 1 deletions
-
59src/storm-pomdp/analysis/FiniteBeliefMdpDetection.h
-
6src/storm-pomdp/modelchecker/ApproximatePOMDPModelchecker.cpp
@ -0,0 +1,59 @@ |
|||||
|
#pragma once |
||||
|
|
||||
|
#include <boost/optional.hpp> |
||||
|
|
||||
|
#include "storm/models/sparse/Pomdp.h" |
||||
|
#include "storm/storage/BitVector.h" |
||||
|
#include "storm/storage/StronglyConnectedComponentDecomposition.h" |
||||
|
|
||||
|
namespace storm { |
||||
|
namespace pomdp { |
||||
|
|
||||
|
/*! |
||||
|
* This method tries to detect that the beliefmdp is finite. |
||||
|
* If this returns true, the beliefmdp is certainly finite. |
||||
|
* However, if this returns false, the beliefmdp might still be finite |
||||
|
* It is assumed that the belief MDP is not further explored when reaching a targetstate |
||||
|
*/ |
||||
|
template<typename ValueType> |
||||
|
bool detectFiniteBeliefMdp(storm::models::sparse::Pomdp<ValueType> const& pomdp, boost::optional<storm::storage::BitVector> const& targetStates) { |
||||
|
// All infinite paths of the POMDP (including the ones with prob. 0 ) either |
||||
|
// - reach a target state after finitely many steps or |
||||
|
// - after finitely many steps enter an SCC and do not leave it |
||||
|
// Hence, any path of the belief MDP will at some point either reach a target state or stay in a set of POMDP SCCs. |
||||
|
// Only in the latter case we can get infinitely many different belief states. |
||||
|
// Below, we check whether all SCCs only consist of Dirac distributions. |
||||
|
// If this is the case, no new belief states will be found at some point. |
||||
|
|
||||
|
// Get the SCC decomposition |
||||
|
storm::storage::StronglyConnectedComponentDecompositionOptions options; |
||||
|
options.dropNaiveSccs(); |
||||
|
storm::storage::BitVector relevantStates; |
||||
|
if (targetStates) { |
||||
|
relevantStates = ~targetStates.get(); |
||||
|
options.subsystem(&relevantStates); |
||||
|
} |
||||
|
storm::storage::StronglyConnectedComponentDecomposition<ValueType> sccs(pomdp.getTransitionMatrix(), options); |
||||
|
|
||||
|
// Check whether all choices that stay within an SCC have Dirac distributions |
||||
|
for (auto const& scc : sccs) { |
||||
|
for (auto const& sccState : scc) { |
||||
|
for (uint64_t rowIndex = pomdp.getNondeterministicChoiceIndices()[sccState]; rowIndex < pomdp.getNondeterministicChoiceIndices()[sccState + 1]; ++rowIndex) { |
||||
|
for (auto const& entry : pomdp.getTransitionMatrix().getRow(rowIndex)) { |
||||
|
if (!storm::utility::isOne(entry.getValue()) && !storm::utility::isZero(entry.getValue())) { |
||||
|
if (scc.containsState(entry.getColumn())) { |
||||
|
// There is a non-dirac choice that stays in the SCC. |
||||
|
// This could still mean that the belief MDP is finite |
||||
|
// e.g., if at some point the branches merge back to the same state |
||||
|
return false; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
return true; |
||||
|
} |
||||
|
} |
||||
|
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue