1#ifndef PRUNING_STUBBORN_SETS_ATOM_CENTRIC_H
2#define PRUNING_STUBBORN_SETS_ATOM_CENTRIC_H
4#include "downward/pruning/stubborn_sets.h"
6namespace stubborn_sets_atom_centric {
7static const int MARKED_VALUES_NONE = -2;
8static const int MARKED_VALUES_ALL = -1;
11enum class AtomSelectionStrategy {
18class StubbornSetsAtomCentric :
public stubborn_sets::StubbornSets {
19 const bool use_sibling_shortcut;
20 const AtomSelectionStrategy atom_selection_strategy;
24 std::vector<std::vector<std::vector<int>>> consumers;
29 std::vector<std::vector<bool>> marked_producers;
30 std::vector<std::vector<bool>> marked_consumers;
37 std::vector<int> marked_producer_variables;
38 std::vector<int> marked_consumer_variables;
40 std::vector<FactPair> producer_queue;
41 std::vector<FactPair> consumer_queue;
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);
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;
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;