1#ifndef GUARD_INCLUDE_PROBFD_ALGORITHMS_INTERVAL_ITERATION_H
2#error "This file should only be included from interval_iteration.h"
5#include "probfd/quotients/quotient_max_heuristic.h"
7#include "probfd/utils/not_implemented.h"
9#include "probfd/progress_report.h"
11#include "downward/utils/collections.h"
17template <
typename State,
typename Action>
18IntervalIteration<State, Action>::IntervalIteration(
19 bool extract_probability_one_states,
21 : extract_probability_one_states_(extract_probability_one_states)
22 , qr_analysis_(expand_goals)
23 , ec_decomposer_(expand_goals)
28template <
typename State,
typename Action>
29Interval IntervalIteration<State, Action>::solve(
31 EvaluatorType& heuristic,
32 param_type<State> state,
36 utils::CountdownTimer timer(max_time);
37 std::unique_ptr sys = create_quotient(mdp, heuristic, state, timer);
38 std::vector<StateID> dead, one;
39 storage::PerStateStorage<Interval> value_store;
40 return mysolve(mdp, heuristic, state, value_store, dead, one, *sys, timer);
43template <
typename State,
typename Action>
44auto IntervalIteration<State, Action>::compute_policy(
49 double) -> std::unique_ptr<PolicyType>
54template <
typename State,
typename Action>
57 statistics_.print(out);
60template <
typename State,
typename Action>
61template <
typename ValueStoreT,
typename SetLike,
typename SetLike2>
64 EvaluatorType& heuristic,
66 ValueStoreT& value_store,
71 utils::CountdownTimer timer(max_time);
73 auto sys = create_quotient(mdp, heuristic, state, timer);
86 const auto value = value_store[repr_id];
87 const bool dead = utils::contains(dead_ends, repr_id);
88 const bool one = utils::contains(one_states, repr_id);
90 sys->for_each_member_state(
92 [&, value, dead, one](
StateID member_id) {
93 value_store[member_id] = value;
94 if (dead) dead_ends.push_back(member_id);
95 if (one) one_states.push_back(member_id);
102template <
typename State,
typename Action>
103auto IntervalIteration<State, Action>::create_quotient(
105 EvaluatorType& heuristic,
106 param_type<State> state,
107 utils::CountdownTimer& timer) -> std::unique_ptr<QSystem>
109 auto sys = ec_decomposer_.build_quotient_system(
113 timer.get_remaining_time());
115 statistics_.ecd_statistics = ec_decomposer_.get_statistics();
120template <
typename State,
typename Action>
121template <
typename ValueStoreT,
typename SetLike,
typename SetLike2>
122Interval IntervalIteration<State, Action>::mysolve(
124 EvaluatorType& heuristic,
125 param_type<State> state,
126 ValueStoreT& value_store,
128 SetLike2& one_states,
130 utils::CountdownTimer& timer)
132 QState qstate = sys.translate_state(state);
134 if (extract_probability_one_states_) {
135 qr_analysis_.run_analysis(
139 std::back_inserter(dead_ends),
140 iterators::discarding_output_iterator(),
141 std::back_inserter(one_states),
142 timer.get_remaining_time());
143 assert(mdp.get_termination_info(mdp.get_state(one_states.front()))
146 qr_analysis_.run_analysis(
150 std::back_inserter(dead_ends),
151 iterators::discarding_output_iterator(),
152 iterators::discarding_output_iterator(),
153 timer.get_remaining_time());
156 assert(::utils::is_unique(dead_ends) && ::utils::is_unique(one_states));
158 sys.build_quotient(dead_ends);
159 sys.build_quotient(one_states);
161 const auto new_init_id = sys.translate_state_id(mdp.get_state_id(state));
163 quotients::QuotientMaxHeuristic<State, Action> qheuristic(heuristic);
165 const Interval result = vi_.solve(
170 timer.get_remaining_time());
171 statistics_.tvi_statistics = vi_.get_statistics();
Implemention of interval iteration haddad:etal:misc-17.
Definition interval_iteration.h:62
Namespace dedicated to interval iteration on MaxProb MDPs.
Definition interval_iteration.h:18
typename std::conditional_t< is_cheap_to_copy_v< T >, T, const T & > param_type
Alias template defining the best way to pass a parameter of a given type.
Definition type_traits.h:25
Represents a closed interval over the extended reals as a pair of lower and upper bound.
Definition interval.h:12
A StateID represents a state within a StateIDMap. Just like Fast Downward's StateID type,...
Definition types.h:22