1#ifndef MERGE_AND_SHRINK_FACTORED_TRANSITION_SYSTEM_H
2#define MERGE_AND_SHRINK_FACTORED_TRANSITION_SYSTEM_H
4#include "downward/merge_and_shrink/types.h"
6#include "downward/utils/logging.h"
15namespace merge_and_shrink {
17class FactoredTransitionSystem;
18class MergeAndShrinkRepresentation;
20class TransitionSystem;
22class FTSConstIterator {
27 const FactoredTransitionSystem& fts;
31 void next_valid_index();
34 FTSConstIterator(
const FactoredTransitionSystem& fts,
bool end);
37 int operator*()
const {
return current_index; }
39 bool operator==(
const FTSConstIterator& rhs)
const
41 return current_index == rhs.current_index;
44 bool operator!=(
const FTSConstIterator& rhs)
const
46 return current_index != rhs.current_index;
51 std::unique_ptr<TransitionSystem> transition_system;
52 std::unique_ptr<MergeAndShrinkRepresentation> mas_representation;
53 std::unique_ptr<Distances> distances;
56 std::unique_ptr<TransitionSystem> transition_system,
57 std::unique_ptr<MergeAndShrinkRepresentation> mas_representation,
58 std::unique_ptr<Distances> distances);
63 Factor& operator=(Factor&&);
79class FactoredTransitionSystem {
80 std::unique_ptr<Labels> labels;
82 std::vector<std::unique_ptr<TransitionSystem>> transition_systems;
83 std::vector<std::unique_ptr<MergeAndShrinkRepresentation>>
85 std::vector<std::unique_ptr<Distances>> distances;
86 const bool compute_init_distances;
87 const bool compute_goal_distances;
88 int num_active_entries;
94 void assert_index_valid(
int index)
const;
101 bool is_component_valid(
int index)
const;
103 void assert_all_components_valid()
const;
106 FactoredTransitionSystem(
107 std::unique_ptr<Labels> labels,
108 std::vector<std::unique_ptr<TransitionSystem>>&& transition_systems,
109 std::vector<std::unique_ptr<MergeAndShrinkRepresentation>>&&
111 std::vector<std::unique_ptr<Distances>>&& distances,
112 bool compute_init_distances,
113 bool compute_goal_distances,
114 utils::LogProxy& log);
115 FactoredTransitionSystem(FactoredTransitionSystem&& other);
116 ~FactoredTransitionSystem();
119 FactoredTransitionSystem(
const FactoredTransitionSystem&) =
delete;
120 FactoredTransitionSystem&
121 operator=(
const FactoredTransitionSystem&) =
delete;
131 void apply_label_mapping(
132 const std::vector<std::pair<
int, std::vector<int>>>& label_mapping,
133 int combinable_index);
145 bool apply_abstraction(
147 const StateEquivalenceRelation& state_equivalence_relation,
148 utils::LogProxy& log);
153 int merge(
int index1,
int index2, utils::LogProxy& log);
158 Factor extract_factor(
int index);
160 void statistics(
int index, utils::LogProxy& log)
const;
161 void dump(
int index, utils::LogProxy& log)
const;
162 void dump(utils::LogProxy& log)
const;
164 const TransitionSystem& get_transition_system(
int index)
const
166 return *transition_systems[index];
169 const Distances& get_distances(
int index)
const
171 return *distances[index];
180 bool is_factor_solvable(
int index)
const;
199 bool is_factor_trivial(
int index)
const;
201 int get_num_active_entries()
const {
return num_active_entries; }
204 const Labels& get_labels()
const {
return *labels; }
207 FTSConstIterator begin()
const {
return FTSConstIterator(*
this,
false); }
209 FTSConstIterator end()
const {
return FTSConstIterator(*
this,
true); }
211 int get_size()
const {
return transition_systems.size(); }
213 bool is_active(
int index)
const;