1#ifndef TASK_UTILS_SUCCESSOR_GENERATOR_INTERNALS_H
2#define TASK_UTILS_SUCCESSOR_GENERATOR_INTERNALS_H
4#include "downward/operator_id.h"
7#include <unordered_map>
12namespace successor_generator {
15 virtual ~GeneratorBase() {}
17 virtual void generate_applicable_ops(
18 const std::vector<int>& state,
19 std::vector<OperatorID>& applicable_ops)
const = 0;
22class GeneratorForkBinary :
public GeneratorBase {
23 std::unique_ptr<GeneratorBase> generator1;
24 std::unique_ptr<GeneratorBase> generator2;
28 std::unique_ptr<GeneratorBase> generator1,
29 std::unique_ptr<GeneratorBase> generator2);
31 virtual void generate_applicable_ops(
32 const std::vector<int>& state,
33 std::vector<OperatorID>& applicable_ops)
const override;
36class GeneratorForkMulti :
public GeneratorBase {
37 std::vector<std::unique_ptr<GeneratorBase>> children;
40 GeneratorForkMulti(std::vector<std::unique_ptr<GeneratorBase>> children);
42 virtual void generate_applicable_ops(
43 const std::vector<int>& state,
44 std::vector<OperatorID>& applicable_ops)
const override;
47class GeneratorSwitchVector :
public GeneratorBase {
49 std::vector<std::unique_ptr<GeneratorBase>> generator_for_value;
52 GeneratorSwitchVector(
54 std::vector<std::unique_ptr<GeneratorBase>>&& generator_for_value);
56 virtual void generate_applicable_ops(
57 const std::vector<int>& state,
58 std::vector<OperatorID>& applicable_ops)
const override;
61class GeneratorSwitchHash :
public GeneratorBase {
63 std::unordered_map<int, std::unique_ptr<GeneratorBase>> generator_for_value;
68 std::unordered_map<
int, std::unique_ptr<GeneratorBase>>&&
71 virtual void generate_applicable_ops(
72 const std::vector<int>& state,
73 std::vector<OperatorID>& applicable_ops)
const override;
76class GeneratorSwitchSingle :
public GeneratorBase {
79 std::unique_ptr<GeneratorBase> generator_for_value;
82 GeneratorSwitchSingle(
85 std::unique_ptr<GeneratorBase> generator_for_value);
87 virtual void generate_applicable_ops(
88 const std::vector<int>& state,
89 std::vector<OperatorID>& applicable_ops)
const override;
92class GeneratorLeafVector :
public GeneratorBase {
93 std::vector<OperatorID> applicable_operators;
96 GeneratorLeafVector(std::vector<OperatorID>&& applicable_operators);
98 virtual void generate_applicable_ops(
99 const std::vector<int>& state,
100 std::vector<OperatorID>& applicable_ops)
const override;
103class GeneratorLeafSingle :
public GeneratorBase {
104 OperatorID applicable_operator;
107 GeneratorLeafSingle(OperatorID applicable_operator);
109 virtual void generate_applicable_ops(
110 const std::vector<int>& state,
111 std::vector<OperatorID>& applicable_ops)
const override;