21 package org.matsim.core.router.util;
23 import java.util.ArrayList;
24 import java.util.Iterator;
26 import java.util.TreeMap;
27 import java.util.concurrent.ConcurrentHashMap;
29 import org.apache.logging.log4j.LogManager;
30 import org.apache.logging.log4j.Logger;
51 protected Map<Node, DeadEndData>
nodeData = null;
55 this.containsData =
true;
63 long now = System.currentTimeMillis();
70 this.nodeData =
new ConcurrentHashMap<Node, DeadEndData>(network.
getNodes().size());
77 if (incidentNodes.size() == 1) {
78 ArrayList<Node> deadEndNodes =
new ArrayList<Node>();
80 while (deadEndData.getInDeadEndCount() == incidentNodes.size() - 1) {
82 deadEndNodes.add(node);
83 deadEndNodes.addAll(deadEndData.getDeadEndNodes());
84 deadEndData.getDeadEndNodes().clear();
89 deadEndData.setDeadEndEntryNode(node);
91 Iterator<? extends Node> it = incidentNodes.values().iterator();
92 while (deadEndData.getDeadEndEntryNode() != null && it.hasNext()) {
96 if (deadEndData.getDeadEndEntryNode() == null) {
97 deadEndData.incrementInDeadEndCount();
100 log.error(
"All " + incidentNodes.size() +
" incident nodes of node " + node.getId() +
" are dead ends!");
104 deadEndData.getDeadEndNodes().addAll(deadEndNodes);
109 int deadEndNodeCount = 0;
112 for (
Node n : deadEndData.getDeadEndNodes()) {
114 r.setDeadEndEntryNode(node);
117 deadEndData.getDeadEndNodes().clear();
119 log.info(
"nodes in dead ends: " + deadEndNodeCount
120 +
" (total nodes: " + network.
getNodes().size() +
"). Done in " 121 + (System.currentTimeMillis() - now) +
" ms");
125 Map<Id<Node>,
Node> nodes =
new TreeMap<>();
127 nodes.put(link.getFromNode().getId(), link.getFromNode());
130 nodes.put(link.getToNode().getId(), link.getToNode());
144 this.nodeData.put(n, r);
160 ArrayList<Node> getDeadEndNodes() {
167 int getInDeadEndCount() {
175 void incrementInDeadEndCount() {
176 this.inDeadEndCount++;
190 void setDeadEndEntryNode(
final Node node) {
191 this.deadEndEntryNode = node;
Map< Id< Node >, ? extends Node > getNodes()
Map< Id< Link >, ? extends Link > getInLinks()
void markDeadEnds(final Network network)
void run(final Network network)
DeadEndData getNodeData(final Node n)
Map< Node, DeadEndData > nodeData
Map< Id< Link >, ? extends Link > getOutLinks()
ArrayList< Node > deadEndNodes
Node getDeadEndEntryNode()
static Map< Id< Node >, Node > getIncidentNodes(Node node)