AI 24/25 Project Software
Documentation for the AI 24/25 course programming project software
Loading...
Searching...
No Matches
probabilistic_transition_system.h
1#ifndef PROBFD_CARTESIAN_PROBABILISTIC_TRANSITION_SYSTEM_H
2#define PROBFD_CARTESIAN_PROBABILISTIC_TRANSITION_SYSTEM_H
3
4#include "probfd/cartesian_abstractions/probabilistic_transition.h"
5#include "probfd/cartesian_abstractions/types.h"
6
7#include "probfd/value_type.h"
8
9#include <cstddef>
10#include <deque>
11#include <vector>
12
13// Forward Declarations
14struct FactPair;
15
16namespace utils {
17class LogProxy;
18}
19
20namespace probfd {
21class ProbabilisticOperatorsProxy;
22}
23
24namespace probfd::cartesian_abstractions {
25class AbstractState;
26} // namespace probfd::cartesian_abstractions
27
28namespace probfd::cartesian_abstractions {
29
30class ProbabilisticTransitionSystem {
31 // Operator information
32 const std::vector<std::vector<FactPair>> preconditions_by_operator_;
33 const std::vector<std::vector<std::vector<FactPair>>>
34 postconditions_by_operator_and_outcome_;
35 const std::vector<std::vector<value_t>>
36 probabilities_by_operator_and_outcome_;
37
38 // References to incoming and outgoing transitions
39 std::vector<std::vector<ProbabilisticTransition*>> outgoing_;
40 std::vector<std::vector<ProbabilisticTransition*>> incoming_;
41
42 // The transition list. Using deque here to avoid invalidating references.
43 std::deque<ProbabilisticTransition> transitions_;
44
45 // The list of uniform self-loops, to be pruned during search.
46 std::deque<std::vector<int>> loops_;
47
48 size_t num_loops_ = 0;
49
50 // Increases size of incoming and outgoing transition lists by one.
51 void enlarge_vectors_by_one();
52
53 // Construct the trivial abstraction.
54 void construct_trivial_abstraction(const ProbabilisticOperatorsProxy& ops);
55
56 [[nodiscard]]
57 int get_precondition_value(int op_id, int var) const;
58
59 [[nodiscard]]
60 int get_postcondition_value(int op_id, std::size_t eff_id, int var) const;
61
62 [[nodiscard]]
63 size_t get_num_operator_outcomes(int op_id) const;
64
65 void add_transition(int src_id, int op_id, std::vector<int> target_ids);
66 void add_loop(int src_id, int op_id);
67
68 void rewire_incoming_transitions(
69 const AbstractStates& states,
70 const AbstractState& v1,
71 const AbstractState& v2,
72 int var);
73 void rewire_outgoing_transitions(
74 const AbstractStates& states,
75 const AbstractState& v1,
76 const AbstractState& v2,
77 int var);
78
79 void
80 rewire_loops(const AbstractState& v1, const AbstractState& v2, int var);
81
82public:
83 explicit ProbabilisticTransitionSystem(
84 const ProbabilisticOperatorsProxy& ops);
85
86 ~ProbabilisticTransitionSystem();
87
88 // Update transition system after v has been split for var into v1 and v2.
89 void rewire(
90 const AbstractStates& states,
91 const AbstractState& v1,
92 const AbstractState& v2,
93 int var);
94
95 [[nodiscard]]
96 value_t get_probability(int op_index, int eff_index) const;
97
98 [[nodiscard]]
99 const std::vector<std::vector<ProbabilisticTransition*>>&
100 get_incoming_transitions() const;
101
102 [[nodiscard]]
103 const std::vector<std::vector<ProbabilisticTransition*>>&
104 get_outgoing_transitions() const;
105
106 [[nodiscard]]
107 const std::deque<std::vector<int>>& get_loops() const;
108
109 [[nodiscard]]
110 const std::deque<ProbabilisticTransition>& get_transitions() const;
111
112 [[nodiscard]]
113 int get_num_states() const;
114
115 [[nodiscard]]
116 int get_num_operators() const;
117
118 [[nodiscard]]
119 int get_num_non_loops() const;
120
121 [[nodiscard]]
122 int get_num_loops() const;
123
124 void print_statistics(utils::LogProxy& log) const;
125};
126
127} // namespace probfd::cartesian_abstractions
128
129#endif // PROBFD_CARTESIAN_PROBABILISTIC_TRANSITION_SYSTEM_H
The top-level namespace of probabilistic Fast Downward.
Definition command_line.h:8
double value_t
Typedef for the state value type.
Definition aliases.h:7