Changeset - r25505:83571b956494
[Not reviewed]
master
0 2 0
Vít Šefl - 3 years ago 2021-05-15 15:23:23
vituscze@gmail.com
Fix: Encountering two-way red signals could prune unrelated branches.

The intermediate node branch is now only pruned if the node is on the
path leading to the two-way red signal.
2 files changed with 7 insertions and 4 deletions:
0 comments (0 inline, 0 general)
src/pathfinder/yapf/yapf_base.hpp
Show inline comments
 
@@ -207,11 +207,14 @@ public:
 
	 * remain the best intermediate node, and thus the vehicle would still
 
	 * go towards the red EOL signal.
 
	 */
 
	void PruneIntermediateNodeBranch()
 
	void PruneIntermediateNodeBranch(Node *n)
 
	{
 
		while (Yapf().m_pBestIntermediateNode != nullptr && (Yapf().m_pBestIntermediateNode->m_segment->m_end_segment_reason & ESRB_CHOICE_FOLLOWS) == 0) {
 
			Yapf().m_pBestIntermediateNode = Yapf().m_pBestIntermediateNode->m_parent;
 
		bool intermediate_on_branch = false;
 
		while (n != nullptr && (n->m_segment->m_end_segment_reason & ESRB_CHOICE_FOLLOWS) == 0) {
 
			if (n == Yapf().m_pBestIntermediateNode) intermediate_on_branch = true;
 
			n = n->m_parent;
 
		}
 
		if (intermediate_on_branch) Yapf().m_pBestIntermediateNode = n;
 
	}
 

	
 
	/**
src/pathfinder/yapf/yapf_costrail.hpp
Show inline comments
 
@@ -199,7 +199,7 @@ public:
 
						 * was it first signal which is two-way? */
 
						if (!IsPbsSignal(sig_type) && Yapf().TreatFirstRedTwoWaySignalAsEOL() && n.flags_u.flags_s.m_choice_seen && has_signal_against && n.m_num_signals_passed == 0) {
 
							/* yes, the first signal is two-way red signal => DEAD END. Prune this branch... */
 
							Yapf().PruneIntermediateNodeBranch();
 
							Yapf().PruneIntermediateNodeBranch(&n);
 
							n.m_segment->m_end_segment_reason |= ESRB_DEAD_END;
 
							Yapf().m_stopped_on_first_two_way_signal = true;
 
							return -1;
0 comments (0 inline, 0 general)