1#ifndef HEURISTICS_ADDITIVE_HEURISTIC_H
2#define HEURISTICS_ADDITIVE_HEURISTIC_H
4#include "downward/heuristics/relaxation_heuristic.h"
6#include "downward/algorithms/priority_queues.h"
7#include "downward/utils/collections.h"
13namespace additive_heuristic {
14using relaxation_heuristic::OpID;
15using relaxation_heuristic::PropID;
17using relaxation_heuristic::NO_OP;
19using relaxation_heuristic::Proposition;
20using relaxation_heuristic::UnaryOperator;
22class AdditiveHeuristic :
public relaxation_heuristic::RelaxationHeuristic {
30 static const int MAX_COST_VALUE = 100000000;
32 priority_queues::AdaptiveQueue<PropID> queue;
33 bool did_write_overflow_warning;
35 void setup_exploration_queue();
36 void setup_exploration_queue_state(
const State& state);
37 void relaxed_exploration();
38 void mark_preferred_operators(
const State& state, PropID goal_id);
40 void enqueue_if_necessary(PropID prop_id,
int cost, OpID op_id)
43 Proposition* prop = get_proposition(prop_id);
44 if (prop->cost == -1 || prop->cost > cost) {
46 prop->reached_by = op_id;
47 queue.push(cost, prop_id);
49 assert(prop->cost != -1 && prop->cost <= cost);
52 void increase_cost(
int& cost,
int amount)
57 if (cost > MAX_COST_VALUE) {
58 write_overflow_warning();
59 cost = MAX_COST_VALUE;
63 void write_overflow_warning();
66 virtual int compute_heuristic(
const State& ancestor_state)
override;
69 int compute_add_and_ff(
const State& state);
73 const std::shared_ptr<AbstractTask>& transform,
75 const std::string& description,
76 utils::Verbosity verbosity);
84 void compute_heuristic_for_cegar(
const State& state);
86 int get_cost_for_cegar(
int var,
int value)
const
88 return get_proposition(var, value)->cost;