1#ifndef LANDMARKS_LANDMARK_GRAPH_H
2#define LANDMARKS_LANDMARK_GRAPH_H
4#include "downward/landmarks/landmark.h"
6#include "downward/task_proxy.h"
8#include "downward/utils/hash.h"
9#include "downward/utils/memory.h"
15#include <unordered_map>
16#include <unordered_set>
39 LandmarkNode(Landmark&& landmark)
41 , landmark(
std::move(landmark))
45 std::unordered_map<LandmarkNode*, EdgeType> parents;
46 std::unordered_map<LandmarkNode*, EdgeType> children;
48 int get_id()
const {
return id; }
51 void set_id(
int new_id)
53 assert(
id == -1 || new_id ==
id);
58 Landmark& get_landmark() {
return landmark; }
60 const Landmark& get_landmark()
const {
return landmark; }
71 using Nodes = std::vector<std::unique_ptr<LandmarkNode>>;
74 int num_conjunctive_landmarks;
75 int num_disjunctive_landmarks;
77 utils::HashMap<FactPair, LandmarkNode*> simple_landmarks_to_nodes;
78 utils::HashMap<FactPair, LandmarkNode*> disjunctive_landmarks_to_nodes;
81 void remove_node_occurrences(LandmarkNode* node);
89 const Nodes& get_nodes()
const {
return nodes; }
91 int get_num_landmarks()
const {
return nodes.size(); }
94 int get_num_disjunctive_landmarks()
const
96 return num_disjunctive_landmarks;
100 int get_num_conjunctive_landmarks()
const
102 return num_conjunctive_landmarks;
106 int get_num_edges()
const;
109 LandmarkNode* get_node(
int index)
const;
111 LandmarkNode* get_node(
const FactPair& fact)
const;
114 LandmarkNode& get_simple_landmark(
const FactPair& fact)
const;
117 LandmarkNode& get_disjunctive_landmark(
const FactPair& fact)
const;
122 bool contains_simple_landmark(
const FactPair& lm)
const;
124 bool contains_disjunctive_landmark(
const FactPair& lm)
const;
128 bool contains_overlapping_disjunctive_landmark(
129 const std::set<FactPair>& lm)
const;
133 contains_identical_disjunctive_landmark(
const std::set<FactPair>& lm)
const;
137 bool contains_landmark(
const FactPair& fact)
const;
141 LandmarkNode& add_landmark(Landmark&& landmark);
144 void remove_node(LandmarkNode* node);
146 const std::function<
bool(
const LandmarkNode&)>& remove_node_condition);
150 void set_landmark_ids();