blob: a1e6fb2fbff04e0b57b34a07755dc9b5eda0093e [file] [log] [blame]
Parker Schuhbe36c5b2018-02-19 01:06:50 -08001#include "y2018/control_loops/superstructure/arm/graph.h"
2
3#include <assert.h>
4#include <algorithm>
5
6namespace y2018 {
7namespace control_loops {
8namespace superstructure {
9namespace arm {
10
11SearchGraph::SearchGraph(size_t num_vertexes, const std::vector<Edge> &edges)
12 : edges_(edges) {
13 vertexes_.resize(num_vertexes);
14 size_t i = 0;
15 for (const auto &edge : edges) {
16 assert(edge.start < num_vertexes);
17 assert(edge.end < num_vertexes);
18 assert(edge.start != edge.end);
19 assert(edge.cost > 0);
20 vertexes_[edge.start].forward.emplace_back(HalfEdge{edge.end, i});
21 vertexes_[edge.end].reverse.emplace_back(HalfEdge{edge.start, i});
22 ++i;
23 }
24 for (auto &vertex : vertexes_) {
25 std::sort(vertex.forward.begin(), vertex.forward.end());
26 std::sort(vertex.reverse.begin(), vertex.reverse.end());
27 }
28 vertex_heap_.Reserve(num_vertexes);
29}
30
31SearchGraph::~SearchGraph() {}
32
33void SearchGraph::SetGoal(size_t vertex) {
34 assert(vertex < vertexes_.size());
35 vertex_heap_.Clear();
36
37 for (auto &vertex : vertexes_) {
38 vertex.cached_distance = std::numeric_limits<double>::infinity();
39 }
40
41 vertexes_[vertex].cached_distance = 0.0;
42 vertex_heap_.InsertOrDecrease(&vertexes_[vertex]);
43
44 while (!vertex_heap_.Empty()) {
45 Vertex *vertex = vertex_heap_.PopMin();
46 for (const auto &half_edge : vertex->reverse) {
47 Vertex *to_adjust = &vertexes_[half_edge.dest];
48 double adjust_cost = vertex->cached_distance + GetCost(half_edge);
49 if (adjust_cost < to_adjust->cached_distance) {
50 to_adjust->cached_distance = adjust_cost;
51 vertex_heap_.InsertOrDecrease(to_adjust);
52 }
53 }
54 }
55}
56
57double SearchGraph::GetCostToGoal(size_t vertex) {
58 assert(vertex < vertexes_.size());
59 return vertexes_[vertex].cached_distance;
60}
61
62} // namespace arm
63} // namespace superstructure
64} // namespace control_loops
65} // namespace y2018