20 package org.matsim.core.mobsim.qsim.qnetsimengine;
22 import org.apache.logging.log4j.LogManager;
23 import org.apache.logging.log4j.Logger;
41 import java.util.Collection;
43 import java.util.Queue;
44 import java.util.TreeMap;
46 import static java.lang.Math.min;
53 abstract class AbstractAgentSnapshotInfoBuilder {
54 private static final Logger log = LogManager.getLogger(AbstractAgentSnapshotInfoBuilder.class);
55 private static int wrnCnt = 0;
62 this.linkWidthCalculator = linkWidthCalculator;
69 private static double computeHolePositionAndReturnDistance(
double freespeedTraveltime, Hole hole,
double now,
double curvedLength) {
70 double remainingTravelTime = hole.getEarliestLinkExitTime() - now;
71 return remainingTravelTime / freespeedTraveltime * curvedLength;
78 public final int positionVehiclesFromWaitingList(
final Collection<AgentSnapshotInfo> positions,
79 final Link link,
int cnt2,
final Queue<QVehicle> waitingList) {
80 return positionStack(positions, waitingList, cnt2);
83 public final int positionAgentsInActivities(
final Collection<AgentSnapshotInfo> positions,
Link link,
84 Collection<? extends MobsimAgent> agentsInActivities,
int cnt2) {
85 var builder = newBuilder();
86 builder.setVehicleId(null);
89 var position = builder
90 .setPersonId(agent.getId())
91 .setLinkId(link.
getId())
94 .setDistanceOnLink(link.
getLength() * 0.9)
97 .setAgentState(getAgentStateForActivity(agent.getId()))
99 positions.add(position);
108 public final int positionVehiclesFromTransitStop(
final Collection<AgentSnapshotInfo> positions,
Link link,
109 Queue<QVehicle> transitVehicleStopQueue,
int cnt2) {
110 return positionStack(positions, transitVehicleStopQueue, cnt2);
113 public final void positionAgentGivenDistanceFromFNode(
final Collection<AgentSnapshotInfo> positions,
Coord startCoord,
Coord endCoord,
114 double lengthOfCurve,
QVehicle veh,
double distanceFromFromNode,
115 int lane,
double speedValueBetweenZeroAndOne) {
120 var builder = newBuilder();
122 var position = builder
123 .setPersonId(driverAgent.
getId())
124 .setVehicleId(veh.
getId())
126 .setFromCoord(startCoord)
127 .setToCoord(endCoord)
128 .setDistanceOnLink(distanceFromFromNode)
130 .setLinkLength(lengthOfCurve)
131 .setAgentState(getAgentState(driverAgent))
132 .setColorValue(speedValueBetweenZeroAndOne)
135 this.positionPassengers(positions, veh.
getPassengers(), distanceFromFromNode, startCoord,
136 endCoord, lengthOfCurve, lane + 5, speedValueBetweenZeroAndOne);
139 positions.add(position);
142 public final Collection<AgentSnapshotInfo> positionVehiclesAlongLine( Collection<AgentSnapshotInfo> positions,
143 double now, Collection<? extends MobsimVehicle> vehs,
double curvedLength,
double storageCapacity,
144 Coord upstreamCoord,
Coord downstreamCoord,
double inverseFlowCapPerTS,
double freeSpeed,
145 int numberOfLanesAsInt, Queue<Hole> holes, AbstractQLink.QLinkInternalInterface qLinkInternalInterface )
147 double spacingOfOnePCE = this.calculateVehicleSpacing( curvedLength, storageCapacity, vehs );
150 double ttimeOfHoles = curvedLength / (QueueWithBuffer.HOLE_SPEED_KM_H*1000./3600.);
152 TreeMap<Double,Hole> consumableHoles =
new TreeMap<>() ;
161 case withHolesAndShowHoles:
163 if ( !holes.isEmpty() ) {
164 double firstHolePosition = Double.NaN ;
165 double distanceOfHoleFromFromNode = Double.NaN ;
167 for (Hole hole : holes) {
168 sum += hole.getSizeInEquivalents();
169 distanceOfHoleFromFromNode = computeHolePositionAndReturnDistance(ttimeOfHoles, hole, now, curvedLength);
170 if (Double.isNaN(firstHolePosition)) {
171 firstHolePosition = distanceOfHoleFromFromNode;
175 if (Math.round(distanceOfHoleFromFromNode) != Math.round(curvedLength)) {
176 consumableHoles.put(distanceOfHoleFromFromNode, hole);
183 addHolePosition(positions, distanceOfHoleFromFromNode, hole, curvedLength, upstreamCoord, downstreamCoord);
186 final double spaceConsumptionOfHoles = sum*spacingOfOnePCE;
187 final double spaceAvailableForHoles = distanceOfHoleFromFromNode - firstHolePosition;
190 if ( spaceConsumptionOfHoles > spaceAvailableForHoles ) {
191 log.warn(
"we have a problem: holes consume too much space:" ) ;
192 log.warn(
"summed up space consumption of holes: " + spaceConsumptionOfHoles );
193 log.warn(
"distance bw first and last hole: " + spaceAvailableForHoles ) ;
206 double distanceFromFromNode = Double.NaN;
211 final double remainingTravelTime = veh.getEarliestLinkExitTime() - now;
217 if ( qLinkInternalInterface!=null ){
218 speed = qLinkInternalInterface.getMaximumVelocityFromLinkSpeedCalculator( veh, now );
221 distanceFromFromNode = this.calculateOdometerDistanceFromFromNode(
224 vehicleSpacing, distanceFromFromNode, remainingTravelTime
228 int lane = VisUtils.guessLane(veh, numberOfLanesAsInt);
229 double speedValue = VisUtils.calcSpeedValueBetweenZeroAndOne(veh, inverseFlowCapPerTS, now, freeSpeed);
232 this.positionAgentGivenDistanceFromFNode(positions, upstreamCoord, downstreamCoord, curvedLength, veh, distanceFromFromNode, lane, speedValue);
239 while ( !consumableHoles.isEmpty() && distanceFromFromNode < consumableHoles.lastKey() ) {
240 Map.Entry<Double, Hole> entry = consumableHoles.pollLastEntry() ;
241 distanceFromFromNode -= spacingOfOnePCE * entry.getValue().getSizeInEquivalents() ;
256 abstract double calculateVehicleSpacing(
double linkLength,
double overallStorageCapacity, Collection<? extends VisVehicle> vehs);
258 abstract double calculateOdometerDistanceFromFromNode(
double time,
double linkLength,
double freespeed,
259 double spacing,
double prevVehicleDistance,
double remainingTravelTime);
261 private int positionStack(
final Collection<AgentSnapshotInfo> positions,
final Collection<QVehicle> vehicles,
final int startCount) {
262 var builder = newBuilder();
264 var counter = startCount;
265 for (var vehicle : vehicles) {
266 var link = vehicle.getCurrentLink();
267 for (var passenger : VisUtils.getPeopleInVehicle(vehicle)) {
268 var position = builder
269 .setPersonId(passenger.getId())
270 .setVehicleId(vehicle.getId())
271 .setLinkId(link.getId())
272 .setFromCoord(link.getFromNode().getCoord())
273 .setToCoord(link.getToNode().getCoord())
274 .setDistanceOnLink(link.getLength() * 0.9)
276 .setLinkLength(link.getLength())
277 .setAgentState(getAgentState(passenger))
279 positions.add(position);
286 private void positionPassengers(Collection<AgentSnapshotInfo> positions,
287 Collection<? extends PassengerAgent> passengers,
double distanceOnLink,
Coord startCoord,
Coord endCoord,
288 double lengthOfCurve,
int lane,
double speedValueBetweenZeroAndOne) {
289 var builder = newBuilder();
291 int cnt = passengers.size();
292 int laneInt = 2 * (cnt + 1) + lane;
295 int lanePos = laneInt - 2 * cnt;
296 var passengerPosition = builder
297 .setPersonId(passenger.getId())
298 .setVehicleId(passenger.getVehicle().getId())
299 .setLinkId(passenger.getCurrentLinkId())
300 .setFromCoord(startCoord)
301 .setToCoord(endCoord)
302 .setDistanceOnLink(distanceOnLink)
304 .setLinkLength(lengthOfCurve)
305 .setColorValue(speedValueBetweenZeroAndOne)
306 .setAgentState(getAgentState(passenger))
309 positions.add(passengerPosition);
314 private void addHolePosition(
final Collection<AgentSnapshotInfo> positions,
double distanceFromFromNode, Hole veh,
315 double curvedLength,
Coord upstreamCoord,
Coord downstreamCoord) {
317 double speedValue = 1.;
318 var builder = newBuilder();
320 var position = builder
324 .setFromCoord(upstreamCoord)
325 .setToCoord(downstreamCoord)
326 .setDistanceOnLink(distanceFromFromNode)
328 .setLinkLength(curvedLength)
329 .setColorValue(speedValue)
332 positions.add(position);
338 var marker = getMarkerFromAttributes(identifiable.
getId());
354 private Object getMarkerFromAttributes(
Id<Person> id) {
362 var marker = getMarkerFromAttributes(
id);
TrafficDynamics getTrafficDynamics()
static Id< Vehicle > createVehicleId(final long key)
static final String FUTURE_SUPPRESSED
Collection<? extends PassengerAgent > getPassengers()
Map< Id< Person >,? extends Person > getPersons()
Population getPopulation()
LinkBasedBuilder setLinkWidthCalculator(SnapshotLinkWidthCalculator linkWidthCalculator)
SnapshotStyle getSnapshotStyle()
static void assertNotNull(Object obj)
double getMaximumVelocity()
static Id< Person > createPersonId(final long key)
MobsimDriverAgent getDriver()
double getSizeInEquivalents()