AI 24/25 Project Software
Documentation for the AI 24/25 course programming project software
Loading...
Searching...
No Matches
exploration.h
1#ifndef LANDMARKS_EXPLORATION_H
2#define LANDMARKS_EXPLORATION_H
3
4#include "downward/landmarks/util.h"
5
6#include "downward/task_proxy.h"
7
8#include "downward/algorithms/priority_queues.h"
9
10#include <unordered_map>
11#include <unordered_set>
12#include <vector>
13
14namespace utils {
15class LogProxy;
16}
17
18namespace landmarks {
19struct Proposition;
20struct UnaryOperator;
21
22struct Proposition {
23 FactPair fact;
24 std::vector<UnaryOperator*> precondition_of;
25 bool reached;
26 bool excluded;
27
28 Proposition()
29 : fact(FactPair::no_fact)
30 , reached(false)
31 , excluded(false)
32 {
33 }
34
35 bool operator<(const Proposition& other) const { return fact < other.fact; }
36};
37
38struct UnaryOperator {
39 int op_or_axiom_id;
40 const int num_preconditions;
41 Proposition* effect;
42
43 int unsatisfied_preconditions;
44 bool excluded;
45 UnaryOperator(
46 const std::vector<Proposition*>& preconditions,
47 Proposition* eff,
48 int op_or_axiom_id)
49 : op_or_axiom_id(op_or_axiom_id)
50 , num_preconditions(static_cast<int>(preconditions.size()))
51 , effect(eff)
52 , unsatisfied_preconditions(num_preconditions)
53 , excluded(false)
54 {
55 }
56};
57
58class Exploration {
59 TaskProxy task_proxy;
60
61 std::vector<UnaryOperator> unary_operators;
62 std::vector<std::vector<Proposition>> propositions;
63 std::deque<Proposition*> prop_queue;
64
65 void build_unary_operators(const AxiomOrOperatorProxy& op);
66 void setup_exploration_queue(
67 const State& state,
68 const std::vector<FactPair>& excluded_props,
69 const std::vector<int>& excluded_op_ids);
70 void relaxed_exploration();
71 void enqueue_if_necessary(Proposition* prop);
72
73public:
74 Exploration(const TaskProxy& task_proxy, utils::LogProxy& log);
75
76 /*
77 Computes the reachability of each proposition when excluding
78 operators in *excluded_op_ids* and ensuring that propositions
79 in *excluded_pros* are not achieved.
80 The returned vector of vector denotes for each proposition
81 (grouped by their fact variable) whether it is relaxed reachable.
82 The values are exact in the absence of conditional effects, otherwise
83 they are an admissible approximation (see implementation for details).
84 */
85 std::vector<std::vector<bool>> compute_relaxed_reachability(
86 const std::vector<FactPair>& excluded_props,
87 const std::vector<int>& excluded_op_ids);
88};
89} // namespace landmarks
90
91#endif