AI 24/25 Project Software
Documentation for the AI 24/25 course programming project software
Loading...
Searching...
No Matches
stubborn_sets_atom_centric.h
1#ifndef PRUNING_STUBBORN_SETS_ATOM_CENTRIC_H
2#define PRUNING_STUBBORN_SETS_ATOM_CENTRIC_H
3
4#include "downward/pruning/stubborn_sets.h"
5
6namespace stubborn_sets_atom_centric {
7static const int MARKED_VALUES_NONE = -2;
8static const int MARKED_VALUES_ALL = -1;
9
10// See the .cc file for an explanation of the strategies.
11enum class AtomSelectionStrategy {
12 FAST_DOWNWARD,
13 QUICK_SKIP,
14 STATIC_SMALL,
15 DYNAMIC_SMALL
16};
17
18class StubbornSetsAtomCentric : public stubborn_sets::StubbornSets {
19 const bool use_sibling_shortcut;
20 const AtomSelectionStrategy atom_selection_strategy;
21
22 // consumers[v][d] contains the ID of operator o if pre(o) contains the fact
23 // v=d.
24 std::vector<std::vector<std::vector<int>>> consumers;
25 /*
26 Marked producer and consumer facts.
27 marked_{producers,consumers}[v][d] is true iff fact v=d is marked.
28 */
29 std::vector<std::vector<bool>> marked_producers;
30 std::vector<std::vector<bool>> marked_consumers;
31 /*
32 Data structures for shortcut handling of siblings.
33 marked_*_variables[v] = d iff all sibling facts v=d' with d'!=d are marked
34 marked_*_variables[v] = MARKED_VALUES_ALL iff all facts for v are marked
35 marked_*_variables[v] = MARKED_VALUES_NONE iff we have no such information
36 */
37 std::vector<int> marked_producer_variables;
38 std::vector<int> marked_consumer_variables;
39
40 std::vector<FactPair> producer_queue;
41 std::vector<FactPair> consumer_queue;
42
43 void compute_consumers(const TaskProxy& task_proxy);
44 bool operator_is_applicable(int op, const State& state) const;
45 void enqueue_producers(const FactPair& fact);
46 void enqueue_consumers(const FactPair& fact);
47 void enqueue_sibling_consumers(const FactPair& fact);
48 void enqueue_sibling_producers(const FactPair& fact);
49 FactPair
50 select_fact(const std::vector<FactPair>& facts, const State& state) const;
51 void enqueue_nes(int op, const State& state);
52 void enqueue_interferers(int op);
53 void handle_stubborn_operator(const State& state, int op);
54 virtual void compute_stubborn_set(const State& state) override;
55
56public:
57 explicit StubbornSetsAtomCentric(
58 bool use_sibling_shortcut,
59 AtomSelectionStrategy atom_selection_strategy,
60 utils::Verbosity verbosity);
61 virtual void initialize(const std::shared_ptr<AbstractTask>& task) override;
62};
63} // namespace stubborn_sets_atom_centric
64
65#endif