40 template<
typename AbstractCallback>
43 if (belief.size() == 1u) {
44 callback(std::move(belief), std::move(probabilityFactor));
46 auto observationResolutionFindRes = observationResolutions.find(belief.observation());
47 auto observationResolution =
48 observationResolutionFindRes != observationResolutions.end() ? observationResolutionFindRes->second : defaultResolution;
51 abstractStatic(probabilityFactor, belief, callback, observationResolution);
54 abstractDynamic(probabilityFactor, belief, callback, observationResolution);
63 template<
typename AbstractCallback>
64 void abstractStatic(
BeliefValueType const& probabilityFactor, BeliefType
const& belief, AbstractCallback& callback,
66 struct FreudenthalDiff {
69 bool operator>(FreudenthalDiff
const& other)
const {
70 if (diff != other.diff) {
71 return diff > other.diff;
73 return dimension < other.dimension;
86 std::set<FreudenthalDiff, std::greater<>> sorted_diffs;
87 std::vector<BeliefValueType> qsRow;
88 qsRow.reserve(numEntries);
89 std::vector<BeliefStateType> toOriginalIndicesMap;
90 toOriginalIndicesMap.reserve(numEntries);
92 belief.forEach([&qsRow, &sorted_diffs, &toOriginalIndicesMap, &x, &staticResolution](
auto const& state,
auto const& value) {
94 sorted_diffs.insert(FreudenthalDiff({x - qsRow.back(), toOriginalIndicesMap.size()}));
95 toOriginalIndicesMap.push_back(state);
96 x -= value * staticResolution;
101 auto currentSortedDiff = sorted_diffs.begin();
102 auto previousSortedDiff = sorted_diffs.end();
103 --previousSortedDiff;
106 BeliefValueType weight = previousSortedDiff->diff - currentSortedDiff->diff;
116 BeliefBuilder<BeliefType> builder;
117 builder.reserve(numEntries);
118 builder.setObservation(belief.observation());
122 builder.addValue(toOriginalIndicesMap[j], gridPointEntry / staticResolution);
125 callback(builder.build(),
static_cast<BeliefValueType>(weight * probabilityFactor));
127 previousSortedDiff = currentSortedDiff++;
131 template<
typename AbstractCallback>
132 void abstractDynamic(
BeliefValueType const& probabilityFactor, BeliefType
const& belief, AbstractCallback& callback,
145 for (
BeliefValueType currResolution = maxResolution; currResolution > halfResolution; --currResolution) {
149 return currDist <= resolutionDist;
152 STORM_LOG_ASSERT(currDist <= resolutionDist,
"Expected a smaller resolution");
153 resolution = currResolution;
154 resolutionDist = currDist;
160 abstractStatic(probabilityFactor, belief, callback, resolution);
166 std::map<BeliefObservationType, BeliefValueType> observationResolutions;