1#ifndef PROBFD_ALGORITHMS_HEURISTIC_SEARCH_STATE_INFORMATION_H
2#define PROBFD_ALGORITHMS_HEURISTIC_SEARCH_STATE_INFORMATION_H
4#include "probfd/algorithms/state_properties.h"
5#include "probfd/algorithms/types.h"
7#include "probfd/storage/per_state_storage.h"
9#include "probfd/transition.h"
10#include "probfd/types.h"
18template <
typename,
bool StorePolicy = false>
19struct StatesPolicy {};
21template <
typename Action>
22struct StatesPolicy<Action, true> {
23 std::optional<Action> policy = std::nullopt;
25 std::optional<Action> get_policy()
const {
return policy; }
27 bool update_policy(
const std::optional<Action>& a)
29 bool changed = policy != a;
34 bool update_policy(
const std::optional<Transition<Action>>& transition)
37 transition.transform([](
auto& t) { return t.action; }));
40 bool update_policy(std::nullopt_t)
42 return update_policy(std::optional<Action>{});
47 static constexpr uint8_t INITIALIZED = 1;
48 static constexpr uint8_t TERMINAL = 2;
49 static constexpr uint8_t GOAL = 4;
50 static constexpr uint8_t FRINGE = 5;
51 static constexpr uint8_t MASK = 7;
52 static constexpr uint8_t BITS = 3;
57 bool is_value_initialized()
const
59 return (info & MASK) != 0;
63 bool is_terminal()
const
69 bool is_goal_state()
const
71 return (info & MASK) == GOAL;
75 bool is_goal_or_terminal()
const
77 return is_terminal() || is_goal_state();
81 bool is_on_fringe()
const
83 return (info & MASK) == FRINGE;
88 assert(!is_value_initialized());
89 info = (info & ~MASK) | GOAL;
96 info = (info & ~MASK) | FRINGE;
101 assert(!is_goal_or_terminal());
102 info = (info & ~MASK) | TERMINAL;
105 void removed_from_fringe()
107 assert(is_value_initialized() && !is_goal_or_terminal());
108 info = (info & ~MASK) | INITIALIZED;
112template <
typename Action,
bool StorePolicy_,
bool UseInterval_>
113struct PerStateBaseInformation
114 :
public StatesPolicy<Action, StorePolicy_>
115 ,
public StateFlags {
116 static constexpr bool StorePolicy = StorePolicy_;
117 static constexpr bool UseInterval = UseInterval_;
123 bool bounds_agree()
const
125 static_assert(UseInterval,
"No interval available!");
126 return value.bounds_approximately_equal();
132 if constexpr (UseInterval) {
140 Interval get_bounds()
const
142 if constexpr (UseInterval) {
145 return Interval(value, INFINITE_VALUE);
Namespace dedicated to the MDP h search base implementation.
Definition heuristic_search_base.h:47
std::conditional_t< UseInterval, Interval, value_t > AlgorithmValue
Convenience value type alias for algorithms selecting interval iteration behaviour based on a templat...
Definition types.h:14
double value_t
Typedef for the state value type.
Definition aliases.h:7