20 package org.matsim.core.mobsim.qsim;
22 import java.util.Iterator;
23 import java.util.Queue;
24 import java.util.concurrent.PriorityBlockingQueue;
26 import jakarta.inject.Inject;
28 import org.apache.logging.log4j.LogManager;
29 import org.apache.logging.log4j.Logger;
38 class ActivityEngineDefaultImpl
implements ActivityEngine {
39 private static final Logger log = LogManager.getLogger( ActivityEngineDefaultImpl.class ) ;
41 private final EventsManager eventsManager;
44 ActivityEngineDefaultImpl( EventsManager eventsManager ) {
45 this.eventsManager = eventsManager;
76 private final Queue<AgentEntry> activityEndsList =
new PriorityBlockingQueue<>(500, (e0, e1) -> {
77 int cmp = Double.compare(e0.activityEndTime, e1.activityEndTime);
88 return e1.agent.getId().compareTo(e0.agent.getId());
94 private boolean beforeFirstSimStep =
true;
97 public void onPrepareSim() {
102 public void doSimStep(
double time) {
103 beforeFirstSimStep =
false;
104 while (activityEndsList.peek() != null) {
105 if (activityEndsList.peek().activityEndTime <= time) {
107 unregisterAgentAtActivityLocation(agent);
117 public void afterSim() {
120 if (entry.activityEndTime != Double.POSITIVE_INFINITY) {
123 eventsManager.processEvent(
new PersonStuckEvent(now, entry.agent.getId(), null, null));
126 activityEndsList.clear();
131 this.internalInterface = internalInterface;
159 activityEndsList.add(agentEntry);
184 public void rescheduleActivityEnd(
final MobsimAgent agent) {
191 AgentEntry oldEntry = removeAgentFromQueue(agent);
195 if (oldEntry == null) {
196 if (newActivityEndTime == Double.POSITIVE_INFINITY) {
200 activityEndsList.add(
new AgentEntry(agent, newActivityEndTime));
204 }
else if (newActivityEndTime == Double.POSITIVE_INFINITY) {
209 unregisterAgentAtActivityLocation(agent);
215 activityEndsList.add(
new AgentEntry(agent, newActivityEndTime));
220 Iterator<AgentEntry> iterator = activityEndsList.iterator();
221 while (iterator.hasNext()) {
223 if (entry.
agent == agent) {
231 private void unregisterAgentAtActivityLocation(
final MobsimAgent agent) {
234 if (linkId != null) {
void arrangeNextAgentState(MobsimAgent agent)
Id< Link > getCurrentLinkId()
void registerAdditionalAgentOnLink(MobsimAgent agent)
MobsimTimer getSimTimer()
MobsimAgent unregisterAdditionalAgentOnLink(Id< Person > agentId, Id< Link > linkId)
void endActivityAndComputeNextState(final double now)
final double activityEndTime
AgentCounter getAgentCounter()
double getActivityEndTime()