1#ifndef PROBFD_CARTESIAN_ABSTRACTIONS_SPLIT_SELECTOR_H
2#define PROBFD_CARTESIAN_ABSTRACTIONS_SPLIT_SELECTOR_H
4#include "probfd/task_proxy.h"
14namespace additive_heuristic {
15class AdditiveHeuristic;
19class RandomNumberGenerator;
22namespace probfd::cartesian_abstractions {
26namespace probfd::cartesian_abstractions {
30 std::vector<int> values;
38 virtual ~SplitSelector() =
default;
40 virtual const Split& pick_split(
41 const AbstractState& state,
42 const std::vector<Split>& splits) = 0;
45class SplitSelectorRandom :
public SplitSelector {
46 std::shared_ptr<utils::RandomNumberGenerator> rng_;
49 explicit SplitSelectorRandom(
50 std::shared_ptr<utils::RandomNumberGenerator> rng);
53 pick_split(
const AbstractState& state,
const std::vector<Split>& splits)
57template <
class Derived>
58class RateBasedSplitSelector :
public SplitSelector {
61 pick_split(
const AbstractState& state,
const std::vector<Split>& splits)
65 assert(!splits.empty());
67 if (splits.size() == 1) {
71 double max_rating = std::numeric_limits<double>::lowest();
72 const Split* selected_split =
nullptr;
73 for (
const Split& split : splits) {
75 static_cast<const Derived*
>(
this)->rate_split(state, split);
76 if (rating > max_rating) {
77 selected_split = &split;
82 assert(selected_split);
83 return *selected_split;
88class SplitSelectorUnwanted
89 :
public RateBasedSplitSelector<SplitSelectorUnwanted> {
93 explicit SplitSelectorUnwanted(
int factor);
96 double rate_split(
const AbstractState& state,
const Split& split)
const;
100class SplitSelectorRefinedness
101 :
public RateBasedSplitSelector<SplitSelectorRefinedness> {
102 const ProbabilisticTaskProxy task_proxy_;
103 const double factor_;
106 SplitSelectorRefinedness(
107 const std::shared_ptr<ProbabilisticTask>& task,
111 double rate_split(
const AbstractState& state,
const Split& split)
const;
115class SplitSelectorHAdd {
116 const std::shared_ptr<PlanningTask> task_;
117 const ProbabilisticTaskProxy task_proxy_;
118 std::unique_ptr<additive_heuristic::AdditiveHeuristic> additive_heuristic_;
121 explicit SplitSelectorHAdd(
const std::shared_ptr<ProbabilisticTask>& task);
122 ~SplitSelectorHAdd();
126 int get_hadd_value(
int var_id,
int value)
const;
129class SplitSelectorMinHAdd
130 :
public RateBasedSplitSelector<SplitSelectorMinHAdd>
131 ,
public SplitSelectorHAdd {
133 explicit SplitSelectorMinHAdd(
134 const std::shared_ptr<ProbabilisticTask>& task);
137 double rate_split(
const AbstractState& state,
const Split& split)
const;
141 int get_min_hadd_value(
int var_id,
const std::vector<int>& values)
const;
144class SplitSelectorMaxHAdd
145 :
public RateBasedSplitSelector<SplitSelectorMaxHAdd>
146 ,
public SplitSelectorHAdd {
148 explicit SplitSelectorMaxHAdd(
149 const std::shared_ptr<ProbabilisticTask>& task);
152 double rate_split(
const AbstractState& state,
const Split& split)
const;
156 int get_max_hadd_value(
int var_id,
const std::vector<int>& values)
const;
162class SplitSelectorFactory {
164 virtual ~SplitSelectorFactory() =
default;
166 virtual std::unique_ptr<SplitSelector>
167 create_split_selector(
const std::shared_ptr<ProbabilisticTask>& task) = 0;
173class SplitSelectorRandomFactory :
public SplitSelectorFactory {
174 std::shared_ptr<utils::RandomNumberGenerator> rng_;
177 explicit SplitSelectorRandomFactory(
178 std::shared_ptr<utils::RandomNumberGenerator> rng);
180 std::unique_ptr<SplitSelector> create_split_selector(
181 const std::shared_ptr<ProbabilisticTask>& task)
override;
187class SplitSelectorMinUnwantedFactory :
public SplitSelectorFactory {
189 std::unique_ptr<SplitSelector> create_split_selector(
190 const std::shared_ptr<ProbabilisticTask>& task)
override;
196class SplitSelectorMaxUnwantedFactory :
public SplitSelectorFactory {
198 std::unique_ptr<SplitSelector> create_split_selector(
199 const std::shared_ptr<ProbabilisticTask>& task)
override;
205class SplitSelectorMinRefinedFactory :
public SplitSelectorFactory {
207 std::unique_ptr<SplitSelector> create_split_selector(
208 const std::shared_ptr<ProbabilisticTask>& task)
override;
214class SplitSelectorMaxRefinedFactory :
public SplitSelectorFactory {
216 std::unique_ptr<SplitSelector> create_split_selector(
217 const std::shared_ptr<ProbabilisticTask>& task)
override;
223class SplitSelectorMinHAddFactory :
public SplitSelectorFactory {
225 std::unique_ptr<SplitSelector> create_split_selector(
226 const std::shared_ptr<ProbabilisticTask>& task)
override;
232class SplitSelectorMaxHAddFactory :
public SplitSelectorFactory {
234 std::unique_ptr<SplitSelector> create_split_selector(
235 const std::shared_ptr<ProbabilisticTask>& task)
override;