21 package org.matsim.core.events.algorithms;
23 import org.apache.logging.log4j.LogManager;
24 import org.apache.logging.log4j.Logger;
41 import java.util.ArrayList;
42 import java.util.Collection;
43 import java.util.HashMap;
44 import java.util.List;
67 int initialCapacity = (int) (network.
getLinks().size() * 1.1);
69 this.linkList =
new ArrayList<>(initialCapacity);
70 this.eventAgents =
new HashMap<>(1000, 0.95f);
87 this.snapshotWriters.add(writer);
91 return this.snapshotWriters.remove(writer);
135 public void reset(
final int iteration) {
136 this.eventLinks.
clear();
138 final double effectiveCellSize;
140 this.eventLinks.
put(link.getId(),
new EventLink(link, this.capCorrectionFactor, effectiveCellSize, this.storageCapFactor));
142 this.linkList.clear();
143 this.linkList.addAll(eventLinks.
values());
144 this.eventAgents.clear();
145 this.lastSnapshotIndex = -1;
147 delegate.
reset(iteration);
154 this.eventAgents.put(
id, agent);
161 int snapshotIndex = (int) (time / this.snapshotPeriod);
162 if (this.lastSnapshotIndex == -1) {
163 this.lastSnapshotIndex = snapshotIndex;
165 while (snapshotIndex > this.lastSnapshotIndex) {
166 this.lastSnapshotIndex++;
167 double snapshotTime = this.lastSnapshotIndex * this.
snapshotPeriod;
174 if (!this.snapshotWriters.isEmpty()) {
177 writer.beginSnapshot(time);
179 writer.addAgent(position);
181 writer.endSnapshot();
187 Collection<AgentSnapshotInfo> positions =
new ArrayList<>();
190 link.getVehiclePositionsQueue(positions, time, this.
builder);
194 link.getVehiclePositionsEquil(positions, time, this.
builder);
198 log.warn(
"Cannot generate snapshots offline (e.g., from events) for "+this.snapshotStyle
199 +
". This snapshot style is supported during simulation only.");
200 throw new RuntimeException(
"The snapshotStyle \"" + this.snapshotStyle +
"\" is not supported.");
226 private EventLink(
final Link link2,
final double capCorrectionFactor,
final double effectiveCellSize,
final double storageCapFactor) {
228 this.drivingQueue =
new ArrayList<>();
229 this.parkingQueue =
new ArrayList<>();
230 this.waitingQueue =
new ArrayList<>();
231 this.buffer =
new ArrayList<>();
236 this.inverseTimeCap = 1.0 / timeCap;
246 this.drivingQueue.add(agent);
250 this.drivingQueue.remove(agent);
251 this.buffer.remove(agent);
256 this.buffer.remove(agent);
257 this.drivingQueue.remove(agent);
258 this.parkingQueue.add(agent);
263 this.parkingQueue.remove(agent);
264 this.waitingQueue.add(agent);
268 this.waitingQueue.remove(agent);
269 this.buffer.add(agent);
274 this.drivingQueue.remove(agent);
275 this.parkingQueue.remove(agent);
276 this.waitingQueue.remove(agent);
277 this.buffer.remove(agent);
283 .setPersonId(agent.
id)
284 .setLinkId(link.
getId())
287 .setDistanceOnLink(distanceFromNode)
291 .setColorValue(agent.
speed)
292 .setAgentState(agentState)
306 double vehLen = Math.min(
307 this.euklideanDist / this.spaceCap,
308 this.effectiveCellSize / this.storageCapFactor);
314 int cmp = (int) (agent.time +
this.freespeedTravelTime +
this.inverseTimeCap + 2.0);
315 agent.speed = (time > cmp) ? 0.0 : this.link.
getFreespeed(time);
317 positions.add(position);
327 double lastDistance = Integer.MAX_VALUE;
329 double travelTime = time - agent.time;
330 double distanceOnLink = (this.freespeedTravelTime == 0.0 ? 0.0 : ((travelTime / this.
freespeedTravelTime) * this.euklideanDist));
331 if (distanceOnLink > queueEnd) {
332 distanceOnLink = queueEnd;
335 if (distanceOnLink >= lastDistance) {
342 distanceOnLink = lastDistance - vehLen;
343 if (distanceOnLink < 0) distanceOnLink = 0.0;
345 int cmp = (int) (agent.time +
this.freespeedTravelTime +
this.inverseTimeCap + 2.0);
346 agent.speed = (time > cmp) ? 0.0 : this.link.
getFreespeed(time);
349 positions.add(position);
350 lastDistance = distanceOnLink;
362 positions.add(position);
373 positions.add(position);
386 int bufferSize = this.buffer.size();
387 int drivingQueueSize = this.drivingQueue.size();
388 int waitingQueueSize = this.waitingQueue.size();
389 int parkingQueueSize = this.parkingQueue.size();
390 if (bufferSize + drivingQueueSize + waitingQueueSize + parkingQueueSize > 0) {
391 int cnt = bufferSize + drivingQueueSize;
393 double linkLength = this.link.
getLength();
395 double cellSize = linkLength / cnt;
396 double distFromFromNode = linkLength - cellSize / 2.0;
401 agent.lane = 1 + agent.intId % nLanes;
402 int cmp = (int) (agent.time +
this.freespeedTravelTime +
this.inverseTimeCap + 2.0);
406 agent.speed = freespeed;
410 positions.add(position);
411 distFromFromNode -= cellSize;
416 agent.lane = 1 + agent.intId % nLanes;
417 int cmp = (int) (agent.time +
this.freespeedTravelTime +
this.inverseTimeCap + 2.0);
421 agent.speed = freespeed;
425 positions.add(position);
426 distFromFromNode -= cellSize;
432 if (waitingQueueSize > 0) {
433 int lane = nLanes + 2;
434 double cellSize = Math.min(this.effectiveCellSize, linkLength / waitingQueueSize);
435 double distFromFromNode = linkLength - cellSize / 2.0;
440 positions.add(position);
441 distFromFromNode -= cellSize;
447 if (parkingQueueSize > 0) {
448 int lane = nLanes + 4;
449 double cellSize = linkLength / parkingQueueSize;
450 double distFromFromNode = linkLength - cellSize / 2.0;
455 positions.add(position);
456 distFromFromNode -= cellSize;
468 protected double speed = 0.0;
469 protected int lane = 1;
474 this.intId =
id.hashCode();
479 return this.
id.compareTo(o.
id);
485 return this.
id.equals(((EventAgent) o).
id);
492 return this.
id.hashCode();
final Vehicle2DriverEventHandler delegate
static int getNumberOfLanesAsInt(final double time, final Link link)
void doSnapshot(final double time)
final List< EventAgent > drivingQueue
final HashMap< Id< Person >, EventAgent > eventAgents
boolean equals(final Object o)
void getVehiclePositionsEquil(final Collection< AgentSnapshotInfo > positions, final double time, PositionInfo.LinkBasedBuilder builder)
final List< EventAgent > waitingQueue
final SnapshotStyle snapshotStyle
double getStorageCapFactor()
static double calcEuclideanDistance(Coord coord, Coord other)
final double capCorrectionFactor
final double freespeedTravelTime
EventLink(final Link link2, final double capCorrectionFactor, final double effectiveCellSize, final double storageCapFactor)
Collection< AgentSnapshotInfo > getVehiclePositions(final double time)
Id< Person > getPersonId()
Id< Person > getDriverOfVehicle(Id< Vehicle > vehicleId)
final ArrayList< EventLink > linkList
void setLaneWidth(double dd)
final double effectiveCellSize
void enter(final EventAgent agent)
Id< Person > getPersonId()
final IdMap< Link, EventLink > eventLinks
static AgentSnapshotInfo createAgentSnapshotInfo(PositionInfo.LinkBasedBuilder builder, EventAgent agent, Link link, double distanceFromNode, AgentSnapshotInfo.AgentState agentState)
void reset(final int iteration)
void getVehiclePositionsQueue(final Collection< AgentSnapshotInfo > positions, final double time, PositionInfo.LinkBasedBuilder builder)
void stuck(final EventAgent agent)
double getFlowCapFactor()
int compareTo(final EventAgent o)
Id< Person > getPersonId()
void arrival(final EventAgent agent)
void handleEvent(final LinkLeaveEvent event)
final void addSnapshotWriter(final SnapshotWriter writer)
EventAgent getEventAgent(final Id< Person > id, double time)
final double storageCapFactor
void handleEvent(final PersonDepartureEvent event)
double getEffectiveLaneWidth()
void wait2link(final EventAgent agent)
final double euklideanDist
double getNumberOfLanes()
LinkBasedBuilder setLinkWidthCalculator(SnapshotLinkWidthCalculator linkWidthCalculator)
final PositionInfo.LinkBasedBuilder builder
void reset(int iteration)
Id< Person > getPersonId()
final List< EventAgent > buffer
void handleEvent(final VehicleEntersTrafficEvent event)
void handleEvent(VehicleEntersTrafficEvent event)
void setLinkWidthForVis(double linkWidthCorrectionFactor)
float getLinkWidthForVis()
void handleEvent(final PersonStuckEvent event)
SnapshotStyle getSnapshotStyle()
final List< SnapshotWriter > snapshotWriters
void handleEvent(VehicleLeavesTrafficEvent event)
void handleEvent(final PersonArrivalEvent event)
Map< Id< Link >, ? extends Link > getLinks()
void departure(final EventAgent agent)
final double inverseTimeCap
final double snapshotPeriod
SnapshotGenerator(final Network network, final double snapshotPeriod, final QSimConfigGroup config)
void leave(final EventAgent agent)
double getEffectiveCellSize()
double getCapacityPeriod()
final double storageCapFactor
Id< Vehicle > getVehicleId()
V put(Id< T > key, V value)
void handleEvent(final LinkEnterEvent event)
Id< Vehicle > getVehicleId()
void testForSnapshot(final double time)
final SnapshotLinkWidthCalculator linkWidthCalculator
final boolean removeSnapshotWriter(final SnapshotWriter writer)
final List< EventAgent > parkingQueue