1#ifndef LANDMARKS_LANDMARK_FACTORY_H_M_H
2#define LANDMARKS_LANDMARK_FACTORY_H_M_H
4#include "downward/landmarks/landmark_factory.h"
7using FluentSet = std::vector<FactPair>;
9std::ostream& operator<<(std::ostream& os,
const FluentSet& fs);
11struct FluentSetComparer {
12 bool operator()(
const FluentSet& fs1,
const FluentSet& fs2)
const
14 if (fs1.size() != fs2.size()) {
15 return fs1.size() < fs2.size();
17 for (
size_t i = 0; i < fs1.size(); ++i) {
18 if (fs1[i] != fs2[i])
return fs1[i] < fs2[i];
30 std::vector<std::vector<int>> cond_noops;
42 std::list<int> landmarks;
46 std::list<int> first_achievers;
50 std::vector<FactPair> pc_for;
58using FluentSetToIntMap = std::map<FluentSet, int, FluentSetComparer>;
60class LandmarkFactoryHM :
public LandmarkFactory {
61 using TriggerSet = std::unordered_map<int, std::set<int>>;
64 generate_landmarks(
const std::shared_ptr<AbstractTask>& task)
override;
66 void compute_h_m_landmarks(
const TaskProxy& task_proxy);
67 void compute_noop_landmarks(
70 std::list<int>
const& local_landmarks,
71 std::list<int>
const& local_necessary,
73 TriggerSet& next_trigger);
75 void propagate_pm_fact(
77 bool newly_discovered,
80 bool possible_noop_set(
81 const VariablesProxy& variables,
83 const FluentSet& fs2);
84 void build_pm_ops(
const TaskProxy& task_proxy);
86 const VariablesProxy& variables,
87 const FactPair& fact1,
88 const FactPair& fact2)
const;
90 void postprocess(
const TaskProxy& task_proxy);
92 void discard_conjunctive_landmarks();
94 void calc_achievers(
const TaskProxy& task_proxy);
96 void add_lm_node(
int set_index,
bool goal =
false);
98 void initialize(
const TaskProxy& task_proxy);
99 void free_unneeded_memory();
102 print_fluentset(
const VariablesProxy& variables,
const FluentSet& fs)
const;
103 void print_pm_op(
const VariablesProxy& variables,
const PMOp& op)
const;
106 const bool conjunctive_landmarks;
107 const bool use_orders;
109 std::map<int, LandmarkNode*> lm_node_table_;
111 std::vector<HMEntry> h_m_table_;
112 std::vector<PMOp> pm_ops_;
114 FluentSetToIntMap set_indices_;
117 std::vector<std::pair<int, std::vector<int>>> unsat_pc_count_;
120 const VariablesProxy& variables,
125 std::vector<FluentSet>& subsets);
127 void get_m_sets_of_set(
128 const VariablesProxy& variables,
131 int current_var_index,
133 std::vector<FluentSet>& subsets,
134 const FluentSet& superset);
136 void get_split_m_sets(
137 const VariablesProxy& variables,
139 int ss1_num_included,
140 int ss2_num_included,
144 std::vector<FluentSet>& subsets,
145 const FluentSet& superset1,
146 const FluentSet& superset2);
149 const VariablesProxy& variables,
151 std::vector<FluentSet>& subsets);
154 const VariablesProxy& variables,
156 std::vector<FluentSet>& subsets,
157 const FluentSet& superset);
160 const VariablesProxy& variables,
162 std::vector<FluentSet>& subsets,
165 void get_split_m_sets(
166 const VariablesProxy& variables,
168 std::vector<FluentSet>& subsets,
169 const FluentSet& superset1,
170 const FluentSet& superset2);
172 print_proposition(
const VariablesProxy& variables,
const FactPair& fluent)
178 bool conjunctive_landmarks,
180 utils::Verbosity verbosity);
182 virtual bool supports_conditional_effects()
const override;