1#ifndef MERGE_AND_SHRINK_TRANSITION_SYSTEM_H
2#define MERGE_AND_SHRINK_TRANSITION_SYSTEM_H
4#include "downward/merge_and_shrink/types.h"
6#include "downward/utils/collections.h"
20namespace merge_and_shrink {
28 Transition(
int src,
int target)
34 friend auto operator<=>(
const Transition&,
const Transition&) =
default;
37std::ostream& operator<<(std::ostream& os,
const Transition& trans);
39using LabelGroup = std::vector<int>;
51 LabelGroup label_group;
52 std::vector<Transition> transitions;
58 LabelGroup&& label_group,
59 std::vector<Transition>&& transitions,
61 : label_group(
std::move(label_group))
62 , transitions(
std::move(transitions))
65 assert(is_consistent());
68 void add_label(
int label,
int label_cost);
74 void apply_same_cost_label_mapping(
76 const std::vector<int>& old_labels);
79 void remove_labels(
const std::vector<int>& old_labels);
81 void recompute_cost(
const Labels& labels);
82 void replace_transitions(std::vector<Transition>&& new_transitions);
89 void merge_local_label_info(LocalLabelInfo& local_label_info);
95 bool is_active()
const {
return !label_group.empty(); }
97 const LabelGroup& get_label_group()
const {
return label_group; }
99 const std::vector<Transition>& get_transitions()
const
104 int get_cost()
const {
return cost; }
106 bool is_consistent()
const;
113class TransitionSystemConstIterator {
114 std::vector<LocalLabelInfo>::const_iterator it;
115 std::vector<LocalLabelInfo>::const_iterator end_it;
117 void advance_to_next_valid_index();
120 TransitionSystemConstIterator(
121 std::vector<LocalLabelInfo>::const_iterator it,
122 std::vector<LocalLabelInfo>::const_iterator end_it);
123 TransitionSystemConstIterator& operator++();
125 const LocalLabelInfo& operator*()
const {
return *it; }
127 bool operator==(
const TransitionSystemConstIterator& rhs)
const
132 bool operator!=(
const TransitionSystemConstIterator& rhs)
const
138class TransitionSystem {
149 const int num_variables;
150 std::vector<int> incorporated_variables;
152 const Labels& labels;
160 std::vector<int> label_to_local_label;
161 std::vector<LocalLabelInfo> local_label_infos;
164 std::vector<bool> goal_states;
171 void compute_equivalent_local_labels();
174 int compute_total_transitions()
const;
175 std::string get_description()
const;
181 bool are_local_labels_consistent()
const;
186 bool is_label_mapping_consistent()
const;
187 void dump_label_mapping()
const;
192 std::vector<int>&& incorporated_variables,
193 const Labels& labels,
194 std::vector<int>&& label_to_local_label,
195 std::vector<LocalLabelInfo>&& local_label_infos,
197 std::vector<bool>&& goal_states,
199 TransitionSystem(
const TransitionSystem& other);
207 static std::unique_ptr<TransitionSystem> merge(
208 const Labels& labels,
209 const TransitionSystem& ts1,
210 const TransitionSystem& ts2,
211 utils::LogProxy& log);
220 void apply_abstraction(
221 const StateEquivalenceRelation& state_equivalence_relation,
222 const std::vector<int>& abstraction_mapping,
223 utils::LogProxy& log);
229 void apply_label_reduction(
230 const std::vector<std::pair<
int, std::vector<int>>>& label_mapping,
231 bool only_equivalent_labels);
233 TransitionSystemConstIterator begin()
const
235 return TransitionSystemConstIterator(
236 local_label_infos.begin(),
237 local_label_infos.end());
240 TransitionSystemConstIterator end()
const
242 return TransitionSystemConstIterator(
243 local_label_infos.end(),
244 local_label_infos.end());
254 std::string tag()
const;
256 bool is_valid()
const;
258 bool is_solvable(
const Distances& distances)
const;
259 void dump_dot_graph(utils::LogProxy& log)
const;
260 void dump_labels_and_transitions(utils::LogProxy& log)
const;
261 void statistics(utils::LogProxy& log)
const;
263 int get_size()
const {
return num_states; }
265 int get_init_state()
const {
return init_state; }
267 bool is_goal_state(
int state)
const {
return goal_states[state]; }
269 const std::vector<int>& get_incorporated_variables()
const
271 return incorporated_variables;