Skip to content

Commit

Permalink
Only parallelize getting activityEndTimes
Browse files Browse the repository at this point in the history
  • Loading branch information
marecabo committed Jun 8, 2024
1 parent f15f48f commit 50c5207
Showing 1 changed file with 27 additions and 26 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -20,11 +20,13 @@
package org.matsim.contrib.dynagent.run;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Objects;
import java.util.Map;

import org.matsim.api.core.v01.Id;
import org.matsim.api.core.v01.IdCollectors;
import org.matsim.api.core.v01.network.Link;
import org.matsim.api.core.v01.population.Person;
import org.matsim.contrib.dynagent.DynAgent;
Expand Down Expand Up @@ -56,31 +58,30 @@ public void doSimStep(double time) {
dynAgents.addAll(newDynAgents);
newDynAgents.clear();

List<DynAgent> agentsToRemove = dynAgents.parallelStream()
.map(agent -> {

Preconditions.checkState(agent.getState() == State.ACTIVITY);
agent.doSimStep(time);
// ask agents about the current activity end time;
double currentEndTime = agent.getActivityEndTime();

if (currentEndTime == Double.POSITIVE_INFINITY) { // agent says: stop simulating me
unregisterAgentAtActivityLocation(agent);
internalInterface.getMobsim().getAgentCounter().decLiving();
return agent;
} else if (currentEndTime <= time) { // the agent wants to end the activity NOW
unregisterAgentAtActivityLocation(agent);
agent.endActivityAndComputeNextState(time);
internalInterface.arrangeNextAgentState(agent);
return agent;
}

return null;
})
.filter(Objects::nonNull)
.toList();

dynAgents.removeAll(agentsToRemove);
// computing end times is the heaviest part here and can be parallelized
// Todo: use forkJoinPool and respect globalThreads property
Map<Id<Person>, Double> activityEndTimes = dynAgents.parallelStream()
.collect(IdCollectors.toIdMap(Person.class, MobsimAgent::getId, MobsimAgent::getActivityEndTime));

Iterator<DynAgent> dynAgentIter = dynAgents.iterator();
while (dynAgentIter.hasNext()) {
DynAgent agent = dynAgentIter.next();
Preconditions.checkState(agent.getState() == State.ACTIVITY);
agent.doSimStep(time);
// ask agents about the current activity end time;
double currentEndTime = activityEndTimes.get(agent.getId());

if (currentEndTime == Double.POSITIVE_INFINITY) { // agent says: stop simulating me
unregisterAgentAtActivityLocation(agent);
internalInterface.getMobsim().getAgentCounter().decLiving();
dynAgentIter.remove();
} else if (currentEndTime <= time) { // the agent wants to end the activity NOW
unregisterAgentAtActivityLocation(agent);
agent.endActivityAndComputeNextState(time);
internalInterface.arrangeNextAgentState(agent);
dynAgentIter.remove();
}
}
}

@Override
Expand Down

0 comments on commit 50c5207

Please sign in to comment.