MATSIM
NetworkRoutingProvider.java
Go to the documentation of this file.
1 
2 /* *********************************************************************** *
3  * project: org.matsim.*
4  * NetworkRoutingProvider.java
5  * *
6  * *********************************************************************** *
7  * *
8  * copyright : (C) 2019 by the members listed in the COPYING, *
9  * LICENSE and WARRANTY file. *
10  * email : info at matsim dot org *
11  * *
12  * *********************************************************************** *
13  * *
14  * This program is free software; you can redistribute it and/or modify *
15  * it under the terms of the GNU General Public License as published by *
16  * the Free Software Foundation; either version 2 of the License, or *
17  * (at your option) any later version. *
18  * See also COPYING, LICENSE and WARRANTY file *
19  * *
20  * *********************************************************************** */
21 
22  package org.matsim.core.router;
23 
24 import com.google.inject.Inject;
25 import com.google.inject.Provider;
26 import org.apache.logging.log4j.LogManager;
27 import org.apache.logging.log4j.Logger;
28 import org.matsim.api.core.v01.Scenario;
40 
41 import com.google.inject.name.Named;
42 
43 import java.util.Map;
44 
45 public class NetworkRoutingProvider implements Provider<RoutingModule>{
46  private static final Logger log = LogManager.getLogger( NetworkRoutingProvider.class ) ;
47 
48  private final String routingMode;
49  private boolean alreadyCheckedConsistency = false;
50 
51  @Inject Map<String, TravelTime> travelTimes;
52  @Inject Map<String, TravelDisutilityFactory> travelDisutilityFactories;
53  @Inject SingleModeNetworksCache singleModeNetworksCache;
54  @Inject
55  RoutingConfigGroup routingConfigGroup;
56  @Inject PopulationFactory populationFactory;
57  @Inject LeastCostPathCalculatorFactory leastCostPathCalculatorFactory;
58  @Inject Scenario scenario ;
59  @Inject TimeInterpretation timeInterpretation;
60  @Inject MultimodalLinkChooser multimodalLinkChooser;
61  @Inject
62  @Named(TransportMode.walk)
64 
71  public NetworkRoutingProvider(String mode) {
72  this( mode, mode ) ;
73  }
74 
83  public NetworkRoutingProvider(String mode, String routingMode ) {
84 // log.setLevel(Level.DEBUG);
85 
86  this.mode = mode;
87  this.routingMode = routingMode ;
88  }
89 
90  private final String mode;
91 
92  @Override
93  public RoutingModule get() {
94  log.debug( "requesting network routing module with routingMode="
95  + routingMode + ";\tmode=" + mode) ;
96 
97  // the network refers to the (transport)mode:
98  Network filteredNetwork = singleModeNetworksCache.getOrCreateSingleModeNetwork(mode);
99 
100  checkNetwork(filteredNetwork);
101 
102  // the travel time & disutility refer to the routing mode:
103  TravelDisutilityFactory travelDisutilityFactory = this.travelDisutilityFactories.get(routingMode);
104  if (travelDisutilityFactory == null) {
105  throw new RuntimeException("No TravelDisutilityFactory bound for mode "+routingMode+".");
106  }
107  TravelTime travelTime = travelTimes.get(routingMode);
108  if (travelTime == null) {
109  throw new RuntimeException("No TravelTime bound for mode "+routingMode+".");
110  }
111  LeastCostPathCalculator routeAlgo =
112  leastCostPathCalculatorFactory.createPathCalculator(
113  filteredNetwork,
114  travelDisutilityFactory.createTravelDisutility(travelTime),
115  travelTime);
116 
117  // the following again refers to the (transport)mode, since it will determine the mode of the leg on the network:
118  if ( !routingConfigGroup.getAccessEgressType().equals(RoutingConfigGroup.AccessEgressType.none) ) {
119  /*
120  * All network modes should fall back to the TransportMode.walk RoutingModule for access/egress to the Network.
121  * However, TransportMode.walk cannot fallback on itself for access/egress to the Network, so don't pass a standard
122  * accessEgressToNetworkRouter RoutingModule for walk..
123  */
124 
125  //null only works because walk is hardcoded and treated uniquely in the routing module. tschlenther june '20
126 
127  // more precisely: If the transport mode is walk, then code is used that does not need the accessEgressToNetwork router. kai, jun'22
128 
129  if (mode.equals(TransportMode.walk)) {
130  return DefaultRoutingModules.createAccessEgressNetworkRouter(mode, routeAlgo, scenario, filteredNetwork, null, timeInterpretation, multimodalLinkChooser);
131  } else {
132  return DefaultRoutingModules.createAccessEgressNetworkRouter(mode, routeAlgo, scenario, filteredNetwork, walkRouter, timeInterpretation, multimodalLinkChooser) ;
133  }
134 
135  } else {
136  log.warn("[mode: {}; routingMode: {}] Using deprecated routing module without access/egress. Consider using AccessEgressNetworkRouter instead.", mode, routingMode);
137  return DefaultRoutingModules.createPureNetworkRouter(mode, populationFactory, filteredNetwork, routeAlgo);
138  }
139  }
140 
141  private void checkNetwork(Network filteredNetwork) {
142  if(routingConfigGroup.getNetworkRouteConsistencyCheck() == RoutingConfigGroup.NetworkRouteConsistencyCheck.disable) {
143  return;
144  }
145 
146  if(alreadyCheckedConsistency){
147  return;
148  }
149 
150  log.info("Checking network for mode '{}' for consistency...", mode);
151 
152  int nLinks = filteredNetwork.getLinks().size();
153  int nNodes = filteredNetwork.getNodes().size();
154  new NetworkCleaner().run(filteredNetwork);
155  boolean changed = nLinks != filteredNetwork.getLinks().size() || nNodes != filteredNetwork.getNodes().size();
156 
157  if(changed) {
158  String errorMessage = "Network for mode '" + mode + "' has unreachable links and nodes. This may be caused by mode restrictions on certain links. Aborting.";
159  log.error(errorMessage + "\n If you restricted modes on some links, consider doing that with NetworkUtils.restrictModesAndCleanNetwork(). This makes sure, that the network is consistent for each mode." +
160  "\n If this network topology is intended, set the routing config parameter 'networkRouteConsistencyCheck' to 'disable'.");
161  throw new RuntimeException(errorMessage);
162  }
163 
164  alreadyCheckedConsistency = true;
165  }
166 }
static RoutingModule createPureNetworkRouter(String mode, PopulationFactory popFact, Network net, final LeastCostPathCalculator routeAlgo)
Map< Id< Node >, ? extends Node > getNodes()
TravelDisutility createTravelDisutility(TravelTime timeCalculator)
static RoutingModule createAccessEgressNetworkRouter(String mode, final LeastCostPathCalculator routeAlgo, Scenario scenario, Network filteredNetwork, RoutingModule accessEgressToNetworkRouter, TimeInterpretation timeInterpretation, MultimodalLinkChooser multimodalLinkChooser)
Map< Id< Link >, ? extends Link > getLinks()
NetworkRoutingProvider(String mode, String routingMode)