MATSIM
NetworkChangeEventsEngine.java
Go to the documentation of this file.
1 /* *********************************************************************** *
2  * project: org.matsim.*
3  * NetworkChangeEventsEngine.java
4  * *
5  * *********************************************************************** *
6  * *
7  * copyright : (C) 2019 by the members listed in the COPYING, *
8  * LICENSE and WARRANTY file. *
9  * email : info at matsim dot org *
10  * *
11  * *********************************************************************** *
12  * *
13  * This program is free software; you can redistribute it and/or modify *
14  * it under the terms of the GNU General Public License as published by *
15  * the Free Software Foundation; either version 2 of the License, or *
16  * (at your option) any later version. *
17  * See also COPYING, LICENSE and WARRANTY file *
18  * *
19  * *********************************************************************** */
20 
21  package org.matsim.core.mobsim.qsim.changeeventsengine;
22 
23 import org.apache.logging.log4j.LogManager;
24 import org.apache.logging.log4j.Logger;
34 
35 import jakarta.inject.Inject;
36 import java.util.Queue;
37 
38 class NetworkChangeEventsEngine implements NetworkChangeEventsEngineI {
39  private static final Logger log = LogManager.getLogger( NetworkChangeEventsEngine.class ) ;
40 
41  private final MessageQueue messageQueue;
42  private final Network network;
43  private InternalInterface internalInterface;
44 
45  @Inject
46  NetworkChangeEventsEngine(Network network, MessageQueue messageQueue) {
47  this.network = network;
48  this.messageQueue = messageQueue;
49  }
50 
51  @Override
52  public void onPrepareSim() {
53  Queue<NetworkChangeEvent> changeEvents = NetworkUtils.getNetworkChangeEvents(this.network);
54  for (final NetworkChangeEvent changeEvent : changeEvents) {
55  addNetworkChangeEventToMessageQ(changeEvent);
56  }
57  }
58 
59  private void addNetworkChangeEventToMessageQ(NetworkChangeEvent changeEvent) {
60  Message m = new Message(changeEvent.getStartTime()) {
61  @Override
62  public void handleMessage() {
63  applyTheChangeEvent(changeEvent);
64  }
65  };
66  this.messageQueue.putMessage(m);
67  }
68 
69  private void applyTheChangeEvent(NetworkChangeEvent changeEvent) {
70  for (Link link : changeEvent.getLinks()) {
71  final NetsimLink netsimLink = this.internalInterface.getMobsim().getNetsimNetwork().getNetsimLink(link.getId());
72  if ( netsimLink instanceof TimeVariantLink) {
73  ((TimeVariantLink) netsimLink).recalcTimeVariantAttributes();
74  } else {
75  throw new RuntimeException("link not time variant") ;
76  }
77  }
78  }
79 
80  public final void addNetworkChangeEvent( NetworkChangeEvent event ) {
81  log.warn("add within-day network change event:" + event);
82 
83  final Queue<NetworkChangeEvent> centralNetworkChangeEvents =
85  if ( centralNetworkChangeEvents.contains( event ) ) {
86  log.warn("network change event already in central data structure; not adding it again") ;
87  } else {
88  log.warn("network change event not yet in central data structure; adding it") ;
89  NetworkUtils.addNetworkChangeEvent(this.internalInterface.getMobsim().getScenario().getNetwork(), event);
90  // need to add this here since otherwise speed lookup in mobsim does not work. And need to hedge against
91  // code that may already have added it by itself. kai, feb'18
92  }
93 
94  if ( event.getStartTime()<= this.internalInterface.getMobsim().getSimTimer().getTimeOfDay() ) {
95  this.applyTheChangeEvent(event);
96  } else {
97  this.addNetworkChangeEventToMessageQ(event);
98  }
99 
100  }
101 
102 
103  @Override
104  public void afterSim() {
105 
106  }
107 
108  @Override
109  public void setInternalInterface(InternalInterface internalInterface) {
110  this.internalInterface = internalInterface;
111  }
112 
113  @Override
114  public void doSimStep(double time) {
115 
116  }
117 }
NetsimNetwork getNetsimNetwork()
Definition: QSim.java:570
static Queue< NetworkChangeEvent > getNetworkChangeEvents(Network network)
static void addNetworkChangeEvent(Network network, NetworkChangeEvent event)