@Override public TripRouter instantiateAndConfigureTripRouter(RoutingContext routingContext) { TripRouter instance = this.delegateFactory.instantiateAndConfigureTripRouter(routingContext); Network network = this.scenario.getNetwork(); PopulationFactory populationFactory = this.scenario.getPopulation().getFactory(); ModeRouteFactory modeRouteFactory = ((PopulationFactoryImpl) populationFactory).getModeRouteFactory(); MultiModalConfigGroup multiModalConfigGroup = (MultiModalConfigGroup) scenario.getConfig().getModule(MultiModalConfigGroup.GROUP_NAME); Set<String> simulatedModes = CollectionUtils.stringToSet(multiModalConfigGroup.getSimulatedModes()); for (String mode : simulatedModes) { if (instance.getRegisteredModes().contains(mode)) { log.warn("A routing algorithm for " + mode + " is already registered. It is replaced!"); } TravelTime travelTime = this.multimodalTravelTimes.get(mode); if (travelTime == null) { throw new RuntimeException( "No travel time object was found for mode " + mode + "! Aborting."); } Network subNetwork = multimodalSubNetworks.get(mode); if (subNetwork == null) { subNetwork = NetworkImpl.createNetwork(); Set<String> restrictions = new HashSet<>(); restrictions.add(mode); TransportModeNetworkFilter networkFilter = new TransportModeNetworkFilter(network); networkFilter.filter(subNetwork, restrictions); this.multimodalSubNetworks.put(mode, subNetwork); } /* * We cannot use the travel disutility object from the routingContext since it * has not been created for the modes used here. */ TravelDisutility travelDisutility = this.travelDisutilityFactory.createTravelDisutility( travelTime, scenario.getConfig().planCalcScore()); LeastCostPathCalculator routeAlgo = this.leastCostPathCalculatorFactory.createPathCalculator( subNetwork, travelDisutility, travelTime); RoutingModule legRouterWrapper = DefaultRoutingModules.createNetworkRouter(mode, populationFactory, subNetwork, routeAlgo); instance.setRoutingModule(mode, legRouterWrapper); } return instance; }
@Override public void run() { if (scenario instanceof MutableScenario) { ((MutableScenario) scenario).setLocked(); // see comment in ScenarioImpl. kai, sep'14 } /* * Create single-mode network here and hand it over to PersonPrepareForSim. Otherwise, each instance would create its * own single-mode network. However, this assumes that the main mode is car - which PersonPrepareForSim also does. Should * be probably adapted in a way that other main modes are possible as well. cdobler, oct'15. */ final Network net; if (NetworkUtils.isMultimodal(network)) { log.info( "Network seems to be multimodal. Create car-only network which is handed over to PersonPrepareForSim."); TransportModeNetworkFilter filter = new TransportModeNetworkFilter(network); net = NetworkUtils.createNetwork(); HashSet<String> modes = new HashSet<>(); modes.add(TransportMode.car); filter.filter(net, modes); } else { net = network; } // make sure all routes are calculated. ParallelPersonAlgorithmRunner.run( population, globalConfigGroup.getNumberOfThreads(), new ParallelPersonAlgorithmRunner.PersonAlgorithmProvider() { @Override public AbstractPersonAlgorithm getPersonAlgorithm() { return new MyPersonPrepareForSim( new PlanRouter(tripRouterProvider.get(), activityFacilities), scenario, net); } }); if (population instanceof Lockable) { ((Lockable) population).setLocked(); } }