@Override public Id chooseNextLinkId() { return delegate.chooseNextLinkId(); }
@Override public void notifyMoveOverNode(final Id newLinkId) { assert passengersToBoard.isEmpty(); delegate.notifyMoveOverNode(newLinkId); }
private void handleMultiModalDeparture(double now, MobsimDriverAgent personAgent, Id linkId) { MultiModalQLinkExtension extension = simEngine.getMultiModalQLinkExtension(linkId); // if ((personAgent.getDestinationLinkId().equals(linkId)) && (personAgent.chooseNextLinkId() == null)) { if ((personAgent.getDestinationLinkId().equals(linkId)) && (personAgent.isWantingToArriveOnCurrentLink() )) { personAgent.endLegAndComputeNextState(now); this.simEngine.internalInterface.arrangeNextAgentState(personAgent); /* yyyy The "non-departure" should be caught in the framework. kai, dec'11 */ } else { extension.addDepartingAgent(personAgent, now); } } }
@Override public void endLegAndComputeNextState(final double now) { final String mode = delegate.getMode(); " for agent "+delegate.getId()+ " returned a null mode. Probably in a wrong state: " +delegate.getState()+" with current plan element "+getCurrentPlanElement() ); final MobsimVehicle vehicle = vehicleProvider.getVehicle( delegate.getPlannedVehicleId() ); final Id linkId = delegate.getCurrentLinkId(); final Collection<PassengerAgent> passengersToUnboard = new ArrayList<PassengerAgent>(); assert vehicle != null; ((MobsimAgent) p).notifyArrivalOnLinkByNonNetworkMode( delegate.getCurrentLinkId() ); ((MobsimAgent) p).endLegAndComputeNextState( now ); events.processEvent( delegate.endLegAndComputeNextState( now );
if ((link.getId().equals(driver.getDestinationLinkId())) && (driver.isWantingToArriveOnCurrentLink())) { new VehicleLeavesTrafficEvent(now, driver.getId(), link.getId(), Id.create(driver.getId(), Vehicle.class), driver.getMode(), 1.0)); new PersonLeavesVehicleEvent(now, driver.getId(), Id.create(driver.getId(), Vehicle.class))); driver.endLegAndComputeNextState(now); this.simEngine.internalInterface.arrangeNextAgentState(driver);
/** * 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); } }
/** * @param mobsimAgent * @param now * @return <code>true</code> if the agent was successfully moved over the node, <code>false</code> * otherwise (e.g. in case where the next link is jammed - not yet implemented) */ boolean moveAgentOverNode(final MobsimAgent mobsimAgent, final double now) { Id<Link> currentLinkId = mobsimAgent.getCurrentLinkId(); Id<Link> nextLinkId = ((MobsimDriverAgent) mobsimAgent).chooseNextLinkId(); Link currentLink = this.simEngine.getMultiModalQLinkExtension(currentLinkId).getLink(); if (nextLinkId != null) { Link nextLink = this.simEngine.getMultiModalQLinkExtension(nextLinkId).getLink(); if ( this.checkNextLinkSemantics(currentLink, nextLink, mobsimAgent) == false ) { moveToAbort(mobsimAgent, now, currentLink, nextLink); } else { // move Agent over the Node ((MobsimDriverAgent)mobsimAgent).notifyMoveOverNode(nextLinkId); this.simEngine.getMultiModalQLinkExtension(nextLinkId).addAgentFromIntersection(mobsimAgent, now); } } // --> nextLink == null else { moveToAbort(mobsimAgent, now, currentLink, null); } return true; }
Id<Vehicle> vehicleId = agent.getPlannedVehicleId() ; QLinkI qlink = (QLinkI) qNetsimEngine.getNetsimNetwork().getNetsimLink(linkId); QVehicle vehicle = qlink.removeParkedVehicle(vehicleId); if ( vehicle==null ) { final String msg = "could not find requested vehicle "+vehicleId+" in simulation for agent "+agent+" with id "+agent.getId()+" on link "+agent.getCurrentLinkId()+" at time "+now+"."; log.error( msg ); log.error( "Note that, with AgentSource and if the agent starts on a leg, the " agent.setVehicle(vehicle) ; throw new RuntimeException("vehicle " + vehicleId + " not available for agent " + agent.getId() + " on link " + linkId + " at time "+ now); agent.setVehicle(vehicle) ; qlink.letVehicleDepart(vehicle);
public final void positionAgentGivenDistanceFromFNode(final Collection<AgentSnapshotInfo> positions, Coord startCoord, Coord endCoord, double lengthOfCurve, QVehicle veh, double distanceFromFromNode, Integer lane, double speedValueBetweenZeroAndOne){ // I think that the main reason why this exists as public method is that AssignmentEmulatingQLane wants to use it directly. // The reason for this, in return, is that positionVehiclesAlongLine(...) is a service method for queue models only. kai, apr'16 MobsimDriverAgent driverAgent = veh.getDriver(); AgentSnapshotInfo pos = snapshotInfoFactory.createAgentSnapshotInfo(driverAgent.getId(), startCoord, endCoord, distanceFromFromNode, lane, lengthOfCurve); pos.setColorValueBetweenZeroAndOne(speedValueBetweenZeroAndOne); if (driverAgent instanceof TransitDriverAgent){ pos.setAgentState(AgentState.TRANSIT_DRIVER); } else if ( driverAgent.getMode().equals(TransportMode.car)) { pos.setAgentState(AgentState.PERSON_DRIVING_CAR); } else { pos.setAgentState(AgentState.PERSON_OTHER_MODE ); } if ( scenario.getPopulation().getPersonAttributes().getAttribute( driverAgent.getId().toString(), "marker" ) != null ) { pos.setAgentState( AgentState.PERSON_OTHER_MODE ) ; } this.positionPassengers(positions, veh.getPassengers(), distanceFromFromNode, startCoord, endCoord, lengthOfCurve, lane+5, speedValueBetweenZeroAndOne); // (this is deliberately first memorizing "pos" but then filling in the passengers first) positions.add(pos); }
if (veh.getDriver() != null) { if (veh.getDriver().getState() != State.LEG) continue; if (stuckAgents.contains(veh.getDriver().getId())) continue; else stuckAgents.add(veh.getDriver().getId()); new PersonStuckEvent(now, veh.getDriver().getId(), veh.getCurrentLink().getId(), veh.getDriver().getMode())); context.getAgentCounter().incLost(); context.getAgentCounter().decLiving(); if (stuckAgents.contains(veh.getDriver().getId())) continue; else stuckAgents.add(veh.getDriver().getId()); new PersonStuckEvent(now, veh.getDriver().getId(), veh.getCurrentLink().getId(), veh.getDriver().getMode())); this.context.getAgentCounter().incLost(); this.context.getAgentCounter().decLiving();
private void moveBufferToNextLane(QLaneI qlane) { QVehicle veh; while (!qlane.isNotOfferingVehicle()) { veh = qlane.getFirstVehicle(); Id<Link> toLinkId = veh.getDriver().chooseNextLinkId(); QLaneI nextQueue = this.chooseNextLane(qlane, toLinkId); if (nextQueue != null) { if (nextQueue.isAcceptingFromUpstream()) { qlane.popFirstVehicle(); nextQueue.addFromUpstream(veh); } else { break; } } else { StringBuilder b = new StringBuilder(); b.append("Person Id: ").append(veh.getDriver().getId()); b.append(" is on Lane Id ").append(qlane.getId()); b.append(" on Link Id ").append(this.getLink().getId()); b.append(" and wants to drive to Link Id ").append(toLinkId); b.append(" but there is no Lane leading to that Link!"); log.error(b.toString()); throw new IllegalStateException(b.toString()); } } }
@Override public Id getId() { return delegate.getId(); }
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); }
if ( driver.isWantingToArriveOnCurrentLink() ) { qLink.letVehicleArrive( veh ); if(context.qsimConfig.isRestrictingSeepage() && context.qsimConfig.getLinkDynamics()==LinkDynamics.SeepageQ && context.qsimConfig.getSeepModes().contains(veh.getDriver().getMode()) ) { noOfSeepModeBringFwd++;
public boolean pickUpPassenger(PassengerPickupActivity pickupActivity, MobsimDriverAgent driver, PassengerRequest request, double now) { Id<Link> linkId = driver.getCurrentLinkId(); MobsimPassengerAgent passenger = passengersByRequestId.get(request.getId()); if (passenger.getCurrentLinkId() != linkId || passenger.getState() != State.LEG || !passenger.getMode() .equals(mode)) { awaitingPickupStorage.storeAwaitingPickup(request, pickupActivity); return false;// wait for the passenger } if (internalInterface.unregisterAdditionalAgentOnLink(passenger.getId(), driver.getCurrentLinkId()) == null) { // the passenger has already been picked up and is on another taxi trip // seems there have been at least 2 requests made by this passenger for this location awaitingPickupStorage.storeAwaitingPickup(request, pickupActivity); return false;// wait for the passenger (optimistically, he/she should appear soon) } MobsimVehicle mobVehicle = driver.getVehicle(); mobVehicle.addPassenger(passenger); passenger.setVehicle(mobVehicle); eventsManager.processEvent(new PersonEntersVehicleEvent(now, passenger.getId(), mobVehicle.getId())); return true; }
@Override public void endActivityAndComputeNextState(final double now) { delegate.endActivityAndComputeNextState(now); }
@Override public String getMode() { return delegate.getMode(); }
@Override public boolean isWantingToArriveOnCurrentLink() { // We need to call delegate, and not just check if next link is null // (as was done in the refactoring), because PersonDriverAgentImpl, // our usual delegate, does more than that. return delegate.isWantingToArriveOnCurrentLink(); }
@Override public Id getCurrentLinkId() { return delegate.getCurrentLinkId(); }
@Override public Id getPlannedVehicleId() { return delegate.getPlannedVehicleId(); }