2 This file is part of I am car.
4 I am car is free software: you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation, either version 3 of the License, or
7 (at your option) any later version.
9 I am car is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with I am car. If not, see <http://www.gnu.org/licenses/>.
25 std::vector<RRTNode *> &nodes,
27 float (*cost)(RRTNode *, RRTNode *))
29 RRTNode *root = nodes[0];
30 std::vector<RRTNode *> s; // DFS stack
31 std::vector<RRTNode *> r; // reset visited_
34 float mcost = (*cost)(root, node);
37 while (s.size() > 0) {
42 if ((*cost)(tmp, node) < mcost) {
44 mcost = (*cost)(tmp, node);
46 for (auto ch: tmp->children()) {
58 std::vector<RRTNode *> &nodes,
60 float (*cost)(RRTNode *, RRTNode *))
62 RRTNode *nn = nodes[0];
63 float mcost = EDIST(nn, node);
65 // TODO fix see, user-defined reductions
66 #pragma omp parallel for
67 for (i = 0; i < nodes.size(); i++) {
68 if (EDIST(nodes[i], node) < mcost) {
70 mcost = EDIST(nodes[i], node);
77 std::vector<RRTNode *> (&nodes)[IYSIZE],
79 float (*cost)(RRTNode *, RRTNode *))
81 int iy = IYI(node->y());
85 unsigned int i = 0; // vector step
86 unsigned int j = 0; // array step
89 while (nn.mc > j * IYSTEP) {
93 #pragma omp parallel for reduction(minn: nn)
94 for (i = 0; i < nodes[iyj].size(); i++) {
95 node->h(nodes[iyj][i]->h());
96 if (co2(nodes[iyj][i], node) < nn.mc) {
97 nn.mc = co2(nodes[iyj][i], node);
98 nn.nn = nodes[iyj][i];
102 iyj = (int) (iy - j);
105 #pragma omp parallel for reduction(minn: nn)
106 for (i = 0; i < nodes[iyj].size(); i++) {
107 node->h(nodes[iyj][i]->h());
108 if (co2(nodes[iyj][i], node) < nn.mc) {
109 nn.mc = co2(nodes[iyj][i], node);
110 nn.nn = nodes[iyj][i];
121 std::vector<RRTNode *> (&nodes)[IYSIZE],
123 float (*cost)(RRTNode *, RRTNode *))
125 int iy = IYI(node->y());
129 unsigned int i = 0; // vector step
130 unsigned int j = 0; // array step
132 while (nn.mc > j * IYSTEP) {
133 iyj = (int) (iy + j);
136 #pragma omp parallel for reduction(minn: nn)
137 for (i = 0; i < nodes[iyj].size(); i++) {
138 if (EDIST(nodes[iyj][i], node) < nn.mc) {
139 nn.mc = EDIST(nodes[iyj][i], node);
140 nn.nn = nodes[iyj][i];
144 iyj = (int) (iy - j);
147 #pragma omp parallel for reduction(minn: nn)
148 for (i = 0; i < nodes[iyj].size(); i++) {
149 if (EDIST(nodes[iyj][i], node) < nn.mc) {
150 nn.mc = EDIST(nodes[iyj][i], node);
151 nn.nn = nodes[iyj][i];
161 std::vector<RRTNode *> (&nodes)[IYSIZE],
163 float (*cost)(RRTNode *, RRTNode *),
166 int iy = IYI(node->y());
170 unsigned int i = 0; // vector step
171 unsigned int j = 0; // array step
173 while (nn.mc > j * IYSTEP) {
174 iyj = (int) (iy + j);
177 #pragma omp parallel for reduction(minn: nn)
178 for (i = 0; i < nodes[iyj].size(); i++) {
179 if (EDIST(nodes[iyj][i], node) < nn.mc &&
181 nodes[iyj][i]->tree() == tree) {
182 nn.mc = EDIST(nodes[iyj][i], node);
183 nn.nn = nodes[iyj][i];
187 iyj = (int) (iy - j);
190 #pragma omp parallel for reduction(minn: nn)
191 for (i = 0; i < nodes[iyj].size(); i++) {
192 if (EDIST(nodes[iyj][i], node) < nn.mc &&
194 nodes[iyj][i]->tree() == tree) {
195 nn.mc = EDIST(nodes[iyj][i], node);
196 nn.nn = nodes[iyj][i];