@Override public Id getId() { return delegate.getId(); }
@Override public void registerDriverAgentWaitingForPassengers(MobsimDriverAgent agent) { driversWaitingForPassengers.put(agent.getId(), agent); }
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 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); }
MobsimDriverAgent driverWaitingForPassengers = driversWaitingForPassengers.get( driversWaitingForCar.element().getId()); if (driverWaitingForPassengers != null) return;
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 ( 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 " throw new RuntimeException("vehicle " + vehicleId + " not available for agent " + agent.getId() + " on link " + linkId + " at time "+ now);
log.error( "Agent has no or wrong route! agentId=" + veh.getDriver().getId() + " currentLink=" + currentLink.getId().toString() + ". The agent is removed from the simulation.");
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 boolean handlePassengerEntering(PTPassengerAgent passenger, MobsimVehicle vehicle, Id<TransitStopFacility> fromStopFacilityId, double time) { boolean handled = vehicle.addPassenger(passenger); if(handled){ this.agentTracker.removeAgentFromStop(passenger, fromStopFacilityId); MobsimAgent planAgent = (MobsimAgent) passenger; // if (planAgent instanceof PersonDriverAgentImpl) { Id<Person> agentId = planAgent.getId(); Id<Link> linkId = planAgent.getCurrentLinkId(); this.internalInterface.unregisterAdditionalAgentOnLink(agentId, linkId) ; // } MobsimDriverAgent agent = (MobsimDriverAgent) passenger; eventsManager.processEvent(new PersonEntersVehicleEvent(time, agent.getId(), vehicle.getVehicle().getId())); } return handled; }
throw new IllegalStateException( "delegate "+delegate+ " for agent "+delegate.getId()+ " returned a null mode. Probably in a wrong state: " +delegate.getState()+" with current plan element "+getCurrentPlanElement() );
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();
/* 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); } }
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; }