1#ifndef HEURISTICS_LM_CUT_LANDMARKS_H
2#define HEURISTICS_LM_CUT_LANDMARKS_H
4#include "downward/task_proxy.h"
6#include "downward/algorithms/priority_queues.h"
13namespace lm_cut_heuristic {
15struct RelaxedProposition;
17enum PropositionStatus {
24struct RelaxedOperator {
26 std::vector<RelaxedProposition*> preconditions;
27 std::vector<RelaxedProposition*> effects;
31 int unsatisfied_preconditions;
32 int h_max_supporter_cost;
33 RelaxedProposition* h_max_supporter;
35 std::vector<RelaxedProposition*>&& pre,
36 std::vector<RelaxedProposition*>&& eff,
39 : original_op_id(op_id)
46 inline void update_h_max_supporter();
49struct RelaxedProposition {
50 std::vector<RelaxedOperator*> precondition_of;
51 std::vector<RelaxedOperator*> effect_of;
53 PropositionStatus status;
57class LandmarkCutLandmarks {
58 std::vector<RelaxedOperator> relaxed_operators;
59 std::vector<std::vector<RelaxedProposition>> propositions;
60 RelaxedProposition artificial_precondition;
61 RelaxedProposition artificial_goal;
63 priority_queues::AdaptiveQueue<RelaxedProposition*> priority_queue;
65 void build_relaxed_operator(
const OperatorProxy& op);
66 void add_relaxed_operator(
67 std::vector<RelaxedProposition*>&& precondition,
68 std::vector<RelaxedProposition*>&& effects,
71 RelaxedProposition* get_proposition(
const FactProxy& fact);
72 void setup_exploration_queue();
73 void setup_exploration_queue_state(
const State& state);
74 void first_exploration(
const State& state);
75 void first_exploration_incremental(std::vector<RelaxedOperator*>& cut);
76 void second_exploration(
78 std::vector<RelaxedProposition*>& second_exploration_queue,
79 std::vector<RelaxedOperator*>& cut);
81 void enqueue_if_necessary(RelaxedProposition* prop,
int cost)
84 if (prop->status == UNREACHED || prop->h_max_cost > cost) {
85 prop->status = REACHED;
86 prop->h_max_cost = cost;
87 priority_queue.push(cost, prop);
91 void mark_goal_plateau(RelaxedProposition* subgoal);
92 void validate_h_max()
const;
95 using Landmark = std::vector<int>;
96 using CostCallback = std::function<void(
int)>;
97 using LandmarkCallback = std::function<void(
const Landmark&,
int)>;
99 LandmarkCutLandmarks(
const TaskProxy& task_proxy);
114 bool compute_landmarks(
116 const CostCallback& cost_callback,
117 const LandmarkCallback& landmark_callback);
120inline void RelaxedOperator::update_h_max_supporter()
122 assert(!unsatisfied_preconditions);
123 for (
size_t i = 0; i < preconditions.size(); ++i)
124 if (preconditions[i]->h_max_cost > h_max_supporter->h_max_cost)
125 h_max_supporter = preconditions[i];
126 h_max_supporter_cost = h_max_supporter->h_max_cost;