AI 24/25 Project Software
Documentation for the AI 24/25 course programming project software
Loading...
Searching...
No Matches
successor_generator_internals.h
1#ifndef TASK_UTILS_SUCCESSOR_GENERATOR_INTERNALS_H
2#define TASK_UTILS_SUCCESSOR_GENERATOR_INTERNALS_H
3
4#include "downward/operator_id.h"
5
6#include <memory>
7#include <unordered_map>
8#include <vector>
9
10class State;
11
12namespace successor_generator {
13class GeneratorBase {
14public:
15 virtual ~GeneratorBase() {}
16
17 virtual void generate_applicable_ops(
18 const std::vector<int>& state,
19 std::vector<OperatorID>& applicable_ops) const = 0;
20};
21
22class GeneratorForkBinary : public GeneratorBase {
23 std::unique_ptr<GeneratorBase> generator1;
24 std::unique_ptr<GeneratorBase> generator2;
25
26public:
27 GeneratorForkBinary(
28 std::unique_ptr<GeneratorBase> generator1,
29 std::unique_ptr<GeneratorBase> generator2);
30
31 virtual void generate_applicable_ops(
32 const std::vector<int>& state,
33 std::vector<OperatorID>& applicable_ops) const override;
34};
35
36class GeneratorForkMulti : public GeneratorBase {
37 std::vector<std::unique_ptr<GeneratorBase>> children;
38
39public:
40 GeneratorForkMulti(std::vector<std::unique_ptr<GeneratorBase>> children);
41
42 virtual void generate_applicable_ops(
43 const std::vector<int>& state,
44 std::vector<OperatorID>& applicable_ops) const override;
45};
46
47class GeneratorSwitchVector : public GeneratorBase {
48 int switch_var_id;
49 std::vector<std::unique_ptr<GeneratorBase>> generator_for_value;
50
51public:
52 GeneratorSwitchVector(
53 int switch_var_id,
54 std::vector<std::unique_ptr<GeneratorBase>>&& generator_for_value);
55
56 virtual void generate_applicable_ops(
57 const std::vector<int>& state,
58 std::vector<OperatorID>& applicable_ops) const override;
59};
60
61class GeneratorSwitchHash : public GeneratorBase {
62 int switch_var_id;
63 std::unordered_map<int, std::unique_ptr<GeneratorBase>> generator_for_value;
64
65public:
66 GeneratorSwitchHash(
67 int switch_var_id,
68 std::unordered_map<int, std::unique_ptr<GeneratorBase>>&&
69 generator_for_value);
70
71 virtual void generate_applicable_ops(
72 const std::vector<int>& state,
73 std::vector<OperatorID>& applicable_ops) const override;
74};
75
76class GeneratorSwitchSingle : public GeneratorBase {
77 int switch_var_id;
78 int value;
79 std::unique_ptr<GeneratorBase> generator_for_value;
80
81public:
82 GeneratorSwitchSingle(
83 int switch_var_id,
84 int value,
85 std::unique_ptr<GeneratorBase> generator_for_value);
86
87 virtual void generate_applicable_ops(
88 const std::vector<int>& state,
89 std::vector<OperatorID>& applicable_ops) const override;
90};
91
92class GeneratorLeafVector : public GeneratorBase {
93 std::vector<OperatorID> applicable_operators;
94
95public:
96 GeneratorLeafVector(std::vector<OperatorID>&& applicable_operators);
97
98 virtual void generate_applicable_ops(
99 const std::vector<int>& state,
100 std::vector<OperatorID>& applicable_ops) const override;
101};
102
103class GeneratorLeafSingle : public GeneratorBase {
104 OperatorID applicable_operator;
105
106public:
107 GeneratorLeafSingle(OperatorID applicable_operator);
108
109 virtual void generate_applicable_ops(
110 const std::vector<int>& state,
111 std::vector<OperatorID>& applicable_ops) const override;
112};
113} // namespace successor_generator
114
115#endif