MATSIM
NetworkModeRestriction.java
Go to the documentation of this file.
1 package org.matsim.core.network.algorithms;
2 
3 import org.apache.logging.log4j.LogManager;
4 import org.apache.logging.log4j.Logger;
5 import org.matsim.api.core.v01.Id;
11 
12 import java.util.Map;
13 import java.util.Set;
14 import java.util.function.Function;
15 import java.util.stream.Collectors;
16 
22 public class NetworkModeRestriction implements NetworkRunnable {
23  private static final Logger log = LogManager.getLogger(NetworkModeRestriction.class);
24 
25  private final Function<Id<Link>, Set<String>> modesToRemoveByLinkId;
26 
27  public NetworkModeRestriction(Function<Id<Link>, Set<String>> modesToRemoveByLinkId) {
28  this.modesToRemoveByLinkId = modesToRemoveByLinkId;
29  }
30 
31  public NetworkModeRestriction(Map<Id<Link>, Set<String>> modesToRemoveByLinkId) {
32  this.modesToRemoveByLinkId = l -> modesToRemoveByLinkId.getOrDefault(l, Set.of());
33  }
34 
35  @Override
36  public void run(Network network) {
37  Map<String, Long> modeCountBefore = countModes(network);
38 
39  applyModeChanges(network);
40  cleanNetworkPerMode(network);
41  removeLinksWithNoModes(network);
42  removeNodesWithNoLinks(network);
43 
44  Map<String, Long> modeCountAfter = countModes(network);
45  logModeCountDifference(modeCountBefore, modeCountAfter);
46  }
47 
48  private void applyModeChanges(Network network) {
49  for (Map.Entry<Id<Link>, ? extends Link> link : network.getLinks().entrySet()) {
50  this.modesToRemoveByLinkId.apply(link.getKey()).forEach(m -> NetworkUtils.removeAllowedMode(link.getValue(), m));
51  }
52  }
53 
54  private void cleanNetworkPerMode(Network network) {
55  Set<String> modes = network.getLinks().values().stream().flatMap(l -> l.getAllowedModes().stream()).collect(Collectors.toSet());
56  for (String mode : modes) {
57  MultimodalNetworkCleaner multimodalNetworkCleaner = new MultimodalNetworkCleaner(network);
58  multimodalNetworkCleaner.run(Set.of(mode));
59  }
60  }
61 
62  private void removeLinksWithNoModes(Network network) {
63  network.getLinks().values().stream()
64  .filter(l -> l.getAllowedModes().isEmpty())
65  .map(Link::getId)
66  .forEach(network::removeLink);
67  }
68 
69  private void removeNodesWithNoLinks(Network network) {
70  network.getNodes().values().stream()
71  .filter(n -> n.getInLinks().isEmpty() && n.getOutLinks().isEmpty())
72  .map(Node::getId)
73  .forEach(network::removeNode);
74  }
75 
76  private void logModeCountDifference(Map<String, Long> modeCountBefore, Map<String, Long> modeCountAfter) {
77  modeCountBefore.forEach((mode, countBefore) -> {
78  long countAfter = modeCountAfter.getOrDefault(mode, 0L);
79  log.info("Removed mode {} from {} links.", mode, countBefore - countAfter);
80  });
81  }
82 
83  private static Map<String, Long> countModes(Network network) {
84  return network.getLinks().values().stream()
85  .flatMap(l -> l.getAllowedModes().stream())
86  .collect(Collectors.groupingBy(m -> m, Collectors.counting()));
87  }
88 }
Map< Id< Node >, ? extends Node > getNodes()
NetworkModeRestriction(Map< Id< Link >, Set< String >> modesToRemoveByLinkId)
static void removeAllowedMode(Link link, String mode)
Map< Id< Link >, ? extends Link > getLinks()
NetworkModeRestriction(Function< Id< Link >, Set< String >> modesToRemoveByLinkId)
final Function< Id< Link >, Set< String > > modesToRemoveByLinkId
void logModeCountDifference(Map< String, Long > modeCountBefore, Map< String, Long > modeCountAfter)
static Map< String, Long > countModes(Network network)