1#ifndef MERGE_AND_SHRINK_MERGE_AND_SHRINK_REPRESENTATION_H
2#define MERGE_AND_SHRINK_MERGE_AND_SHRINK_REPRESENTATION_H
13namespace merge_and_shrink {
15class MergeAndShrinkRepresentation {
20 explicit MergeAndShrinkRepresentation(
int domain_size);
21 virtual ~MergeAndShrinkRepresentation() = 0;
23 int get_domain_size()
const;
26 virtual void set_distances(
const Distances &) = 0;
27 virtual void apply_abstraction_to_lookup_table(
28 const std::vector<int> &abstraction_mapping) = 0;
35 virtual int get_value(
const State &state)
const = 0;
38 virtual bool is_total()
const = 0;
39 virtual void dump(utils::LogProxy &log)
const = 0;
43class MergeAndShrinkRepresentationLeaf :
public MergeAndShrinkRepresentation {
46 std::vector<int> lookup_table;
48 MergeAndShrinkRepresentationLeaf(
int var_id,
int domain_size);
49 virtual ~MergeAndShrinkRepresentationLeaf() =
default;
51 virtual void set_distances(
const Distances &)
override;
52 virtual void apply_abstraction_to_lookup_table(
53 const std::vector<int> &abstraction_mapping)
override;
54 virtual int get_value(
const State &state)
const override;
55 virtual bool is_total()
const override;
56 virtual void dump(utils::LogProxy &log)
const override;
60class MergeAndShrinkRepresentationMerge :
public MergeAndShrinkRepresentation {
61 std::unique_ptr<MergeAndShrinkRepresentation> left_child;
62 std::unique_ptr<MergeAndShrinkRepresentation> right_child;
63 std::vector<std::vector<int>> lookup_table;
65 MergeAndShrinkRepresentationMerge(
66 std::unique_ptr<MergeAndShrinkRepresentation> left_child,
67 std::unique_ptr<MergeAndShrinkRepresentation> right_child);
68 virtual ~MergeAndShrinkRepresentationMerge() =
default;
70 virtual void set_distances(
const Distances &distances)
override;
71 virtual void apply_abstraction_to_lookup_table(
72 const std::vector<int> &abstraction_mapping)
override;
73 virtual int get_value(
const State &state)
const override;
74 virtual bool is_total()
const override;
75 virtual void dump(utils::LogProxy &log)
const override;