1#ifndef PROBFD_POLICIES_MAP_POLICY_H
2#define PROBFD_POLICIES_MAP_POLICY_H
4#include "probfd/policy.h"
5#include "probfd/state_space.h"
6#include "probfd/types.h"
8#include <unordered_map>
10namespace probfd::policies {
12template <
typename State,
typename Action>
13class MapPolicy :
public Policy<State, Action> {
14 StateSpace<State, Action>* state_space_;
15 std::unordered_map<StateID, PolicyDecision<Action>> mapping_;
18 explicit MapPolicy(StateSpace<State, Action>* state_space)
19 : state_space_(state_space)
23 std::optional<PolicyDecision<Action>>
24 get_decision(
const State& state)
const override
26 const auto state_id = state_space_->get_state_id(state);
27 auto it = mapping_.find(state_id);
28 if (it != mapping_.end()) {
34 PolicyDecision<Action>&
35 emplace_decision(StateID state_id, Action action, Interval interval)
37 return mapping_.emplace(state_id, PolicyDecision(action, interval))
41 PolicyDecision<Action>& operator[](StateID state_id)
43 return mapping_[state_id];
46 const PolicyDecision<Action>& operator[](StateID state_id)
const
48 return mapping_.find(state_id)->second;
53 std::function<
void(
const State&, std::ostream&)> state_printer,
54 std::function<
void(
const Action&, std::ostream&)> action_printer)
57 for (
const auto& [state_id, decision] : mapping_) {
58 state_printer(state_space_->get_state(state_id), out);
60 action_printer(decision.action, out);