1#ifndef HEURISTICS_DOMAIN_TRANSITION_GRAPH_H
2#define HEURISTICS_DOMAIN_TRANSITION_GRAPH_H
4#include "downward/task_proxy.h"
7#include <unordered_map>
10namespace cea_heuristic {
11class ContextEnhancedAdditiveHeuristic;
14namespace cg_heuristic {
18namespace domain_transition_graph {
19struct LocalAssignment;
21struct ValueTransition;
22struct ValueTransitionLabel;
23class DomainTransitionGraph;
30 using DTGs = std::vector<std::unique_ptr<DomainTransitionGraph>>;
31 const TaskProxy& task_proxy;
32 bool collect_transition_side_effects;
33 std::function<bool(
int,
int)> pruning_condition;
35 std::vector<utils::HashMap<std::pair<int, int>,
int>> transition_index;
36 std::vector<std::unordered_map<int, int>> global_to_local_var;
38 void allocate_graphs_and_nodes(DTGs& dtgs);
39 void initialize_index_structures(
int num_dtgs);
40 void create_transitions(DTGs& dtgs);
42 const EffectProxy& eff,
43 const AxiomOrOperatorProxy& op,
45 void update_transition_condition(
46 const FactProxy& fact,
47 DomainTransitionGraph* dtg,
48 std::vector<LocalAssignment>& condition);
49 void extend_global_to_local_mapping_if_necessary(
50 DomainTransitionGraph* dtg,
52 void revert_new_local_vars(
53 DomainTransitionGraph* dtg,
54 unsigned int first_local_var);
56 get_transition(
int origin,
int target, DomainTransitionGraph* dtg);
57 void simplify_transitions(DTGs& dtgs);
58 void simplify_labels(std::vector<ValueTransitionLabel>& labels);
59 void collect_all_side_effects(DTGs& dtgs);
60 void collect_side_effects(
61 DomainTransitionGraph* dtg,
62 std::vector<ValueTransitionLabel>& labels);
63 AxiomOrOperatorProxy get_op_for_label(
const ValueTransitionLabel& label);
67 const TaskProxy& task_proxy,
68 bool collect_transition_side_effects,
69 const std::function<
bool(
int,
int)>& pruning_condition);
74struct LocalAssignment {
78 LocalAssignment(
int var,
int val)
83 assert(local_var == var);
88struct ValueTransitionLabel {
91 std::vector<LocalAssignment> precond;
92 std::vector<LocalAssignment> effect;
97 const std::vector<LocalAssignment>& precond,
98 const std::vector<LocalAssignment>& effect)
107struct ValueTransition {
109 std::vector<ValueTransitionLabel> labels;
111 ValueTransition(ValueNode* targ)
116 void simplify(
const TaskProxy& task_proxy);
120 DomainTransitionGraph* parent_graph;
122 std::vector<ValueTransition> transitions;
124 std::vector<int> distances;
125 std::vector<ValueTransitionLabel*> helpful_transitions;
126 std::vector<int> children_state;
127 ValueNode* reached_from;
128 ValueTransitionLabel* reached_by;
130 ValueNode(DomainTransitionGraph* parent,
int val)
131 : parent_graph(parent)
133 , reached_from(nullptr)
134 , reached_by(nullptr)
139class DomainTransitionGraph {
140 friend class cg_heuristic::CGHeuristic;
141 friend class cea_heuristic::ContextEnhancedAdditiveHeuristic;
142 friend class DTGFactory;
145 std::vector<ValueNode> nodes;
147 int last_helpful_transition_extraction_time;
149 std::vector<int> local_to_global_child;
153 DomainTransitionGraph(
154 const DomainTransitionGraph& other);
156 DomainTransitionGraph(
int var_index,
int node_count);