AI 24/25 Project Software
Documentation for the AI 24/25 course programming project software
Loading...
Searching...
No Matches
abstract_task.h
1#ifndef ABSTRACT_TASK_H
2#define ABSTRACT_TASK_H
3
4#include "downward/operator_id.h"
5
6#include "downward/algorithms/subscriber.h"
7#include "downward/utils/hash.h"
8
9#include <memory>
10#include <string>
11#include <utility>
12#include <vector>
13
14struct FactPair {
15 int var;
16 int value;
17
18 FactPair(int var, int value)
19 : var(var)
20 , value(value)
21 {
22 }
23
24 friend auto operator<=>(const FactPair&, const FactPair&) = default;
25
26 /*
27 This special object represents "no such fact". E.g., functions
28 that search a fact can return "no_fact" when no matching fact is
29 found.
30 */
31 static const FactPair no_fact;
32};
33
34std::ostream& operator<<(std::ostream& os, const FactPair& fact_pair);
35
36namespace utils {
37inline void feed(HashState& hash_state, const FactPair& fact)
38{
39 feed(hash_state, fact.var);
40 feed(hash_state, fact.value);
41}
42} // namespace utils
43
44class PlanningTask : public subscriber::SubscriberService<PlanningTask> {
45public:
46 virtual int get_num_variables() const = 0;
47 virtual std::string get_variable_name(int var) const = 0;
48 virtual int get_variable_domain_size(int var) const = 0;
49 virtual int get_variable_axiom_layer(int var) const = 0;
50 virtual int get_variable_default_axiom_value(int var) const = 0;
51 virtual std::string get_fact_name(const FactPair& fact) const = 0;
52 virtual bool
53 are_facts_mutex(const FactPair& fact1, const FactPair& fact2) const = 0;
54
55 virtual int get_num_axioms() const = 0;
56 virtual std::string get_axiom_name(int index) const = 0;
57 virtual int get_num_axiom_preconditions(int index) const = 0;
58 virtual FactPair
59 get_axiom_precondition(int op_index, int fact_index) const = 0;
60 virtual int get_num_axiom_effects(int op_index) const = 0;
61 virtual int
62 get_num_axiom_effect_conditions(int op_index, int eff_index) const = 0;
63 virtual FactPair
64 get_axiom_effect_condition(int op_index, int eff_index, int cond_index)
65 const = 0;
66 virtual FactPair get_axiom_effect(int op_index, int eff_index) const = 0;
67
68 virtual std::string get_operator_name(int index) const = 0;
69 virtual int get_num_operators() const = 0;
70 virtual int get_num_operator_preconditions(int index) const = 0;
71 virtual FactPair
72 get_operator_precondition(int op_index, int fact_index) const = 0;
73
74 virtual int get_num_goals() const = 0;
75 virtual FactPair get_goal_fact(int index) const = 0;
76
77 virtual std::vector<int> get_initial_state_values() const = 0;
78
79 /*
80 * Convert state values from an ancestor task A (ancestor) into
81 * state values from this task, C (child). Task A has to be an
82 * ancestor of C in the sense that C is the result of a sequence of
83 * task transformations on A.
84 * The values are converted in-place to avoid unnecessary copies. If a
85 * subclass needs to create a new vector, e.g., because the size changes,
86 * it should create the new vector in a local variable and then swap it with
87 * the parameter.
88 */
89 virtual void convert_ancestor_state_values(
90 std::vector<int>& values,
91 const PlanningTask* ancestor_task) const = 0;
92
93 /*
94 * Convert an operator index from this task, C (child), into an operator
95 * index from an ancestor task A (ancestor). Task A has to be an ancestor of
96 * C in the sense that C is the result of a sequence of task transformations
97 * on A.
98 */
99 virtual int
100 convert_operator_index(int index, const PlanningTask* ancestor_task)
101 const = 0;
102};
103
104class AbstractTask : public PlanningTask {
105public:
106 virtual int get_operator_cost(int index) const = 0;
107
108 virtual int get_num_operator_effects(int op_index) const = 0;
109 virtual int
110 get_num_operator_effect_conditions(int op_index, int eff_index) const = 0;
111 virtual FactPair
112 get_operator_effect_condition(int op_index, int eff_index, int cond_index)
113 const = 0;
114 virtual FactPair get_operator_effect(int op_index, int eff_index) const = 0;
115};
116
117#endif