public final static Integer guessLane(QVehicle veh, int numberOfLanes){ Integer tmpLane; try { tmpLane = Integer.parseInt(veh.getId().toString()) ; } catch ( NumberFormatException ee ) { tmpLane = veh.getId().hashCode() ; if (tmpLane < 0 ){ tmpLane = -tmpLane; } } int lane = 1 + (tmpLane % numberOfLanes); return lane; }
@Override public final void addParkedVehicle(MobsimVehicle vehicle) { QVehicle qveh = (QVehicle) vehicle; // cast ok: when it gets here, it needs to be a qvehicle to work. if ( this.parkedVehicles.put(qveh.getId(), qveh) != null ) { if ( wrnCnt < 1 ) { wrnCnt++ ; log.warn( "existing vehicle on link was just overwritten by other vehicle with same ID. Not clear what this means. Continuing anyways ...") ; log.warn( Gbl.ONLYONCE ) ; } } qveh.setCurrentLink(this.link); }
@Override public int compare(final QVehicle veh1, final QVehicle veh2) { if (veh1.getEarliestLinkExitTime() > veh2.getEarliestLinkExitTime()) { return 1; } if (veh1.getEarliestLinkExitTime() < veh2.getEarliestLinkExitTime()) { return -1; } // Both depart at the same time -> let the one with the larger id be first return veh2.getId().compareTo(veh1.getId()); } }
private void teleportVehicleTo(QVehicle vehicle, Id<Link> linkId) { if (vehicle.getCurrentLink() != null) { if (cntTeleportVehicle < 9) { cntTeleportVehicle++; log.info("teleport vehicle " + vehicle.getId() + " from link " + vehicle.getCurrentLink().getId() + " to link " + linkId); if (cntTeleportVehicle == 9) { log.info("No more occurrences of teleported vehicles will be reported."); } } QLinkI qlinkOld = (QLinkI) qNetsimEngine.getNetsimNetwork().getNetsimLink(vehicle.getCurrentLink().getId()); QVehicle result = qlinkOld.removeParkedVehicle(vehicle.getId()); if ( result==null ) { throw new RuntimeException( "Could not remove parked vehicle with id " + vehicle.getId() +" on the link id " // + linkId + vehicle.getCurrentLink().getId() + ". Maybe it is currently used by someone else?" + " (In which case ignoring this exception would lead to duplication of this vehicle.) " + "Maybe was never placed onto a link?" ); } } }
@Override public QVehicle getVehicle(Id<Vehicle> vehicleId) { QVehicle ret = super.getVehicle(vehicleId); if (ret != null) { return ret; } for (QVehicle veh : this.getWaitingList()) { if (veh.getId().equals(vehicleId)) return veh; } for (QLaneI lane : this.laneQueues.values()) { ret = lane.getVehicle(vehicleId); if (ret != null) { return ret; } } return ret; }
@Override public QVehicle getVehicle(Id<Vehicle> vehicleId) { QVehicle ret = super.getVehicle(vehicleId); if (ret != null) { return ret; } for (QVehicle veh : this.getWaitingList()) { if (veh.getId().equals(vehicleId)) return veh; } return this.qlane.getVehicle( vehicleId ) ; }
log.warn("The link id " + nextLinkId + " is not available in the simulation network, but vehicle " + veh.getId() + " plans to travel on that link from link " + veh.getCurrentLink().getId()); return AcceptTurn.ABORT ; log.warn("Cannot move vehicle " + veh.getId() + " from link " + currentLink.getId() + " to link " + nextQLink.getLink().getId()); return AcceptTurn.ABORT ;
@Override public final void letVehicleDepart(QVehicle vehicle) { double now = context.getSimTimer().getTimeOfDay(); MobsimDriverAgent driver = vehicle.getDriver(); if (driver == null) throw new RuntimeException("Vehicle cannot depart without a driver!"); EventsManager eventsManager = context.getEventsManager(); eventsManager.processEvent(new PersonEntersVehicleEvent(now, driver.getId(), vehicle.getId())); this.addDepartingVehicle(vehicle); }
private void moveVehicleFromInlinkToOutlink(final QVehicle veh, Id<Link> currentLinkId, final QLaneI fromLane, Id<Link> nextLinkId, QLaneI nextQueueLane) { double now = this.context.getSimTimer().getTimeOfDay() ; fromLane.popFirstVehicle(); // --> // network.simEngine.getMobsim().getEventsManager().processEvent(new LaneLeaveEvent(now, veh.getId(), currentLinkId, fromLane.getId())); this.context.getEventsManager().processEvent(new LinkLeaveEvent(now, veh.getId(), currentLinkId)); // <-- veh.getDriver().notifyMoveOverNode( nextLinkId ); // --> this.context.getEventsManager().processEvent(new LinkEnterEvent(now, veh.getId(), nextLinkId )); // <-- nextQueueLane.addFromUpstream(veh); }
@Override public final boolean insertPassengerIntoVehicle(MobsimAgent passenger, Id<Vehicle> vehicleId) { double now = context.getSimTimer().getTimeOfDay(); QVehicle vehicle = this.getParkedVehicle(vehicleId); // if the vehicle is not parked at the link, mark the agent as passenger waiting for vehicle if (vehicle == null) { registerPassengerAgentWaitingForCar(passenger, vehicleId); return false; } else { boolean added = vehicle.addPassenger((PassengerAgent) passenger); if (!added) { log.warn("Passenger " + passenger.getId().toString() + " could not be inserted into vehicle " + vehicleId.toString() + " since there is no free seat available!"); return false; } ((PassengerAgent) passenger).setVehicle(vehicle); EventsManager eventsManager = context.getEventsManager(); eventsManager.processEvent(new PersonEntersVehicleEvent(now, passenger.getId(), vehicle.getId())); // TODO: allow setting passenger's currentLinkId to null return true; } }
private void moveVehicleFromInlinkToAbort(final QVehicle veh, final QLaneI fromLane, final double now, Id<Link> currentLinkId) { fromLane.popFirstVehicle(); // --> this.context.getEventsManager().processEvent(new LinkLeaveEvent(now, veh.getId(), currentLinkId)); // <-- // first treat the passengers: for ( PassengerAgent pp : veh.getPassengers() ) { if ( pp instanceof MobsimAgent ) { ((MobsimAgent)pp).setStateToAbort(now); netsimEngine.arrangeNextAgentState((MobsimAgent)pp) ; } else if ( wrnCnt < 1 ) { wrnCnt++ ; log.warn("encountering PassengerAgent that cannot be cast into a MobsimAgent; cannot say if this is a problem" ) ; log.warn(Gbl.ONLYONCE) ; } } // now treat the driver: veh.getDriver().setStateToAbort(now) ; netsimEngine.arrangeNextAgentState(veh.getDriver()) ; }
@Override public final QVehicle popFirstVehicle() { double now = context.getSimTimer().getTimeOfDay() ; QVehicle veh = removeFirstVehicle(); if (this.context.qsimConfig.isUseLanes() ) { if ( hasMoreThanOneLane() ) { this.context.getEventsManager().processEvent(new LaneLeaveEvent( now, veh.getId(), this.qLink.getId(), this.getId() )); } } return veh; }
private void letVehicleArrive(QVehicle veh) { double now = this.qsim.getSimTimer().getTimeOfDay(); MobsimDriverAgent driver = veh.getDriver(); this.qsim.getEventsManager().processEvent(new PersonLeavesVehicleEvent(now, driver.getId(), veh.getId())); // reset vehicles driver veh.setDriver(null); driver.endLegAndComputeNextState(now); this.internalInterface.arrangeNextAgentState(driver); }
@Override public void addFromUpstream(QVehicle veh) { double now = context.getSimTimer().getTimeOfDay() ; Id<Link> nextL = veh.getDriver().chooseNextLinkId(); Id<Node> leaveId = toQNode.getNode().getId() ; // e.addFromUpstream( getLink().getFromNode().getId(), leaveId, veh); e.addFromUpstream( veh); em.processEvent(new LinkEnterEvent(now, veh.getId(), getLink().getId())); }
/* package */ final void letVehicleArrive(QVehicle qveh) { addParkedVehicle(qveh); double now = context.getSimTimer().getTimeOfDay();; context.getEventsManager().processEvent(new VehicleLeavesTrafficEvent(now , qveh.getDriver().getId(), this.link.getId(), qveh.getId(), qveh.getDriver().getMode(), 1.0 ) ) ; this.netsimEngine.letVehicleArrive(qveh); makeVehicleAvailableToNextDriver(qveh); }
/** * Move as many waiting cars to the link as it is possible */ private void moveWaitToRoad() { while (!getWaitingList().isEmpty()) { if (!qlane.isAcceptingFromWait(this.getWaitingList().peek())) { return; } QVehicle veh = this.getWaitingList().poll(); double now = context.getSimTimer().getTimeOfDay() ; context.getEventsManager().processEvent( new VehicleEntersTrafficEvent(now, veh.getDriver().getId(), this.getLink().getId(), veh.getId(), veh.getDriver().getMode(), 1.0)); if ( this.getTransitQLink().addTransitToStopQueue(now, veh, this.getLink().getId()) ) { continue ; } if ( veh.getDriver().isWantingToArriveOnCurrentLink() ) { // If the driver wants to stop (again) on this link, give them a special treatment. // addFromWait doesn't work here, because after that, they cannot stop anymore. qlane.addTransitSlightlyUpstreamOfStop(veh) ; continue; } qlane.addFromWait(veh); } }
context .getEventsManager() .processEvent( new VehicleEntersTrafficEvent(now, veh.getDriver().getId(), this.getLink().getId(), veh.getId(), veh.getDriver().getMode(), 1.0));
@Override public final void clearVehicles() { // yyyyyy right now it seems to me that one should rather just abort the agents and have the framework take care of the rest. kai, mar'16 double now = context.getSimTimer().getTimeOfDay() ; for (QVehicle veh : vehQueue) { context.getEventsManager().processEvent( new VehicleAbortsEvent(now, veh.getId(), veh.getCurrentLink().getId())); context.getEventsManager().processEvent( new PersonStuckEvent(now, veh.getDriver().getId(), veh.getCurrentLink().getId(), veh.getDriver().getMode())); context.getAgentCounter().incLost(); context.getAgentCounter().decLiving(); } vehQueue.clear(); for (QVehicle veh : buffer) { context.getEventsManager().processEvent( new VehicleAbortsEvent(now, veh.getId(), veh.getCurrentLink().getId())); context.getEventsManager().processEvent( new PersonStuckEvent(now, veh.getDriver().getId(), veh.getCurrentLink().getId(), veh.getDriver().getMode())); context.getAgentCounter().incLost(); context.getAgentCounter().decLiving(); } buffer.clear(); holes.clear(); this.remainingHolesStorageCapacity = this.storageCapacity; }
/** * Tests that vehicles parked on a link are found with {@link NetsimLink#getVehicle(Id)} * and {@link NetsimLink#getAllVehicles()}. * * @author mrieser */ @Test public void testGetVehicle_Parking() { Fixture f = new Fixture(isUsingFastCapacityUpdate); Id<Vehicle> id1 = Id.create("1", Vehicle.class); QVehicle veh = new QVehicleImpl(f.basicVehicle); Person p = PopulationUtils.getFactory().createPerson(Id.create(42, Person.class)); p.addPlan(PopulationUtils.createPlan()); veh.setDriver(createAndInsertPersonDriverAgentImpl(p, f.sim)); // start test, check initial conditions assertTrue(f.qlink1.isNotOfferingVehicle()); assertEquals(0, ((QueueWithBuffer) f.qlink1.getAcceptingQLane()).getAllVehicles().size()); assertEquals(0, f.qlink1.getAllVehicles().size()); f.qlink1.addParkedVehicle(veh); assertTrue(f.qlink1.isNotOfferingVehicle()); assertEquals(0, ((QueueWithBuffer) f.qlink1.getAcceptingQLane()).getAllVehicles().size()); // vehicle not on _lane_ assertEquals("vehicle not found in parking list.", veh, f.qlink1.getVehicle(id1)); assertEquals(1, f.qlink1.getAllVehicles().size()); // vehicle indeed on _link_ assertEquals(veh, f.qlink1.getAllVehicles().iterator().next()); assertEquals("removed wrong vehicle.", veh, f.qlink1.removeParkedVehicle(veh.getId())); assertTrue(f.qlink1.isNotOfferingVehicle()); assertEquals(0, ((QueueWithBuffer) f.qlink1.getAcceptingQLane()).getAllVehicles().size()); assertNull("vehicle not found in parking list.", f.qlink1.getVehicle(id1)); assertEquals(0, f.qlink1.getAllVehicles().size()); }