137 template<
typename... CallBackArgs>
139 void operator()(BeliefType
const& belief, uint64_t localActionIndex, CallBackArgs
const&... additionalCallbackArgs) {
140 applyPreAbstraction(belief, localActionIndex, std::forward<CallBackArgs const>(additionalCallbackArgs)...);
149 template<
typename... CallBackArgs>
150 void applyPreAbstraction(BeliefType
const& belief, uint64_t localActionIndex, CallBackArgs
const&... additionalCallbackArgs) {
155 belief, localActionIndex,
156 [
this, &localActionIndex, &additionalCallbackArgs...](
158 this->computeSuccessorBeliefs(preBel, localActionIndex, std::move(preVal), actionObservation,
159 std::forward<CallBackArgs const>(additionalCallbackArgs)...,
160 std::forward<decltype(additionalPreAbstractionArgs)>(additionalPreAbstractionArgs)...);
168 std::unordered_map<BeliefObservationType, BeliefValueType> computeSuccessorObservations(BeliefType
const& belief, uint64_t localActionIndex,
170 std::unordered_map<BeliefObservationType, BeliefValueType> successorObservations;
171 belief.forEach([&localActionIndex, &successorObservations, &actionObservation,
this](
BeliefStateType const& state,
BeliefValueType const& beliefValue) {
172 for (
auto const& pomdpTransition :
pomdp.getTransitionMatrix().getRow(state, localActionIndex)) {
174 auto const obs = (
pomdp.getNrObservations() * actionObservation) +
pomdp.getObservation(pomdpTransition.getColumn());
177 if (
auto [insertionIt, inserted] = successorObservations.emplace(
static_cast<BeliefObservationType>(obs), val); !inserted) {
178 insertionIt->second += val;
186 if (successorObservations.size() == 1) {
190 return successorObservations;
193 template<
typename... CallBackArgs>
194 void computeSuccessorBeliefs(BeliefType
const& belief, uint64_t localActionIndex,
BeliefValueType const& transitionProbability,
197 auto const successorObservations = computeSuccessorObservations(belief, localActionIndex, actionObservation);
198 for (
auto const& successorObsValue : successorObservations) {
199 BeliefBuilder<BeliefType> builder;
200 builder.setObservation(successorObsValue.first);
202 for (
auto const& pomdpTransition :
pomdp.getTransitionMatrix().getRow(state, localActionIndex)) {
204 pomdp.getObservation(pomdpTransition.getColumn()) == (successorObsValue.first %
pomdp.getNrObservations())) {
208 builder.addValue(pomdpTransition.getColumn(), prob);
213 if (successorObservations.size() == 1) {
218 applyPostAbstraction(builder.build(),
static_cast<BeliefValueType>(successorObsValue.second * transitionProbability),
219 std::forward<CallBackArgs const>(additionalCallbackArgs)...);
223 template<
typename... CallBackArgs>
224 void applyPostAbstraction(BeliefType&& belief,
BeliefValueType&& transitionProbability, CallBackArgs
const&... additionalCallbackArgs) {
226 discoverCallback(std::move(belief), std::move(transitionProbability), additionalCallbackArgs...);
229 std::move(belief), std::move(transitionProbability),
230 [
this, &additionalCallbackArgs...](BeliefType&& postBel,
BeliefValueType&& postVal,
auto&&... additionalPostAbstractionArgs) {
231 discoverCallback(std::move(postBel), std::move(postVal), std::forward<CallBackArgs const>(additionalCallbackArgs)...,
232 std::forward<decltype(additionalPostAbstractionArgs)>(additionalPostAbstractionArgs)...);