AI 24/25 Project Software
Documentation for the AI 24/25 course programming project software
Loading...
Searching...
No Matches
abstract_search.h
1#ifndef CEGAR_ABSTRACT_SEARCH_H
2#define CEGAR_ABSTRACT_SEARCH_H
3
4#include "downward/cartesian_abstractions/transition.h"
5#include "downward/cartesian_abstractions/types.h"
6
7#include "downward/algorithms/priority_queues.h"
8
9#include <deque>
10#include <memory>
11#include <vector>
12
13namespace cartesian_abstractions {
14using Solution = std::deque<Transition>;
15
16/*
17 Find abstract solutions using A*.
18*/
19class AbstractSearch {
20 class AbstractSearchInfo {
21 int g;
22 int h;
23 Transition incoming_transition;
24
25 public:
26 AbstractSearchInfo()
27 : h(0)
28 , incoming_transition(UNDEFINED, UNDEFINED)
29 {
30 reset();
31 }
32
33 void reset()
34 {
35 g = std::numeric_limits<int>::max();
36 incoming_transition = Transition(UNDEFINED, UNDEFINED);
37 }
38
39 void decrease_g_value_to(int new_g)
40 {
41 assert(new_g <= g);
42 g = new_g;
43 }
44
45 int get_g_value() const { return g; }
46
47 void increase_h_value_to(int new_h)
48 {
49 assert(new_h >= h);
50 h = new_h;
51 }
52
53 int get_h_value() const { return h; }
54
55 void set_incoming_transition(const Transition& transition)
56 {
57 incoming_transition = transition;
58 }
59
60 const Transition& get_incoming_transition() const
61 {
62 assert(
63 incoming_transition.op_id != UNDEFINED &&
64 incoming_transition.target_id != UNDEFINED);
65 return incoming_transition;
66 }
67 };
68
69 const std::vector<int> operator_costs;
70
71 // Keep data structures around to avoid reallocating them.
72 priority_queues::AdaptiveQueue<int> open_queue;
73 std::vector<AbstractSearchInfo> search_info;
74
75 void reset(int num_states);
76 void set_h_value(int state_id, int h);
77 std::unique_ptr<Solution> extract_solution(int init_id, int goal_id) const;
78 void update_goal_distances(const Solution& solution);
79 int astar_search(
80 const std::vector<Transitions>& transitions,
81 const Goals& goals);
82
83public:
84 explicit AbstractSearch(const std::vector<int>& operator_costs);
85
86 std::unique_ptr<Solution> find_solution(
87 const std::vector<Transitions>& transitions,
88 int init_id,
89 const Goals& goal_ids);
90 int get_h_value(int state_id) const;
91 void copy_h_value_to_children(int v, int v1, int v2);
92};
93
94std::vector<int> compute_distances(
95 const std::vector<Transitions>& transitions,
96 const std::vector<int>& costs,
97 const std::unordered_set<int>& start_ids);
98} // namespace cartesian_abstractions
99
100#endif