AI 24/25 Project Software
Documentation for the AI 24/25 course programming project software
Loading...
Searching...
No Matches
map_policy.h
1#ifndef PROBFD_POLICIES_MAP_POLICY_H
2#define PROBFD_POLICIES_MAP_POLICY_H
3
4#include "probfd/policy.h"
5#include "probfd/state_space.h"
6#include "probfd/types.h"
7
8#include <unordered_map>
9
10namespace probfd::policies {
11
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_;
16
17public:
18 explicit MapPolicy(StateSpace<State, Action>* state_space)
19 : state_space_(state_space)
20 {
21 }
22
23 std::optional<PolicyDecision<Action>>
24 get_decision(const State& state) const override
25 {
26 const auto state_id = state_space_->get_state_id(state);
27 auto it = mapping_.find(state_id);
28 if (it != mapping_.end()) {
29 return it->second;
30 }
31 return std::nullopt;
32 }
33
34 PolicyDecision<Action>&
35 emplace_decision(StateID state_id, Action action, Interval interval)
36 {
37 return mapping_.emplace(state_id, PolicyDecision(action, interval))
38 .first->second;
39 }
40
41 PolicyDecision<Action>& operator[](StateID state_id)
42 {
43 return mapping_[state_id];
44 }
45
46 const PolicyDecision<Action>& operator[](StateID state_id) const
47 {
48 return mapping_.find(state_id)->second;
49 }
50
51 void print(
52 std::ostream& out,
53 std::function<void(const State&, std::ostream&)> state_printer,
54 std::function<void(const Action&, std::ostream&)> action_printer)
55 override
56 {
57 for (const auto& [state_id, decision] : mapping_) {
58 state_printer(state_space_->get_state(state_id), out);
59 out << " -> ";
60 action_printer(decision.action, out);
61 out << '\n';
62 }
63 }
64};
65
66} // namespace probfd::policies
67
68#endif