15 #include "../../debug.h"
16 #include "../../settings_type.h"
18 extern int _total_pf_time_us;
50 template <
class Types>
53 typedef typename Types::Tpf
Tpf;
54 typedef typename Types::TrackFollower TrackFollower;
57 typedef typename NodeList::Titem
Node;
58 typedef typename Node::Key
Key;
102 return *
static_cast<Tpf *
>(
this);
125 #ifndef NO_DEBUG_MESSAGES
130 Yapf().PfSetStartupNodes();
131 bool bDestFound =
true;
145 Yapf().PfFollowNode(*n);
147 m_nodes.PopOpenNode(n->GetKey());
157 #ifndef NO_DEBUG_MESSAGES
159 if (_debug_yapf_level >= 2) {
160 int t = perf.Get(1000000);
161 _total_pf_time_us += t;
163 if (_debug_yapf_level >= 3) {
165 char ttc =
Yapf().TransportTypeChar();
170 DEBUG(yapf, 3,
"[YAPF%c]%c%4d- %d us - %d rounds - %d open - %d closed - CHR %4.1f%% - C %d D %d - c%d(sc%d, ts%d, o%d) -- ",
203 Yapf().PfNodeCacheFetch(n);
205 if (
m_nodes.FindOpenNode(n.m_key) == NULL) {
221 n.Set(parent, tf.m_new_tile, td, is_choice);
222 Yapf().AddNewNode(n, tf);
237 Yapf().m_pBestIntermediateNode =
Yapf().m_pBestIntermediateNode->m_parent;
248 bool bCached =
Yapf().PfNodeCacheFetch(n);
255 bool bValid =
Yapf().PfCalcCost(n, &tf);
258 Yapf().PfNodeCacheFlush(n);
261 if (bValid) bValid =
Yapf().PfCalcEstimate(n);
267 bool bDestination =
Yapf().PfDetectDestination(n);
282 if (openNode != NULL) {
285 if (n.GetCostEstimate() < openNode->GetCostEstimate()) {
287 m_nodes.PopOpenNode(n.GetKey());
290 m_nodes.InsertOpenNode(*openNode);
296 Node *closedNode =
m_nodes.FindClosedNode(n.GetKey());
297 if (closedNode != NULL) {
300 int node_est = n.GetCostEstimate();
301 int closed_est = closedNode->GetCostEstimate();
302 if (node_est < closed_est) {
333 inline void PfSetStartupNodes()
336 Node &n1 = *base::m_nodes.CreateNewNode();
340 base::m_nodes.InsertOpenNode(n1);
344 inline void PfFollowNode(
Node &org)
346 for (each follower of node org) {
347 Node &n = *base::m_nodes.CreateNewNode();
357 inline bool PfCalcCost(
Node &n)
362 n.m_cost = n.m_parent->m_cost + cost;
367 inline bool PfCalcEstimate(
Node &n)
372 n.m_estimate = n.m_cost + distance;
377 inline bool PfDetectDestination(
Node &n)
379 bool bDest = (n.m_key.m_x == m_x2) && (n.m_key.m_y == m_y2);