private QLinkImpl(final Link link2, final QNodeI toNode, final LaneFactory roadFactory, NetsimEngineContext context, NetsimInternalInterface netsimEngine, LinkSpeedCalculator linkSpeedCalculator) { super(link2, toNode, context, netsimEngine, linkSpeedCalculator) ; this.context = context ; // The next line must must by contract stay within the constructor, // so that the caller can use references to the created roads to wire them together, // if it must. this.qlane = roadFactory.createLane(this); this.visdata = this.new VisDataImpl() ; // instantiating this here and not earlier so we can cache some things super.setTransitQLink( new TransitQLink(this.qlane) ) ; }
private void moveLink(final QLinkI link, final double now){ for (QLaneI lane : link.getOfferingQLanes()) { while (! lane.isNotOfferingVehicle()) { QVehicle veh = lane.getFirstVehicle(); if (! moveVehicleOverNode(veh, link, lane, now )) { break; } } } }
QLinkImpl build( Link link, QNodeI toNode ) { if ( laneFactory == null ) { laneFactory = new QueueWithBuffer.Builder( context ) ; } return new QLinkImpl( link, toNode, laneFactory, context, netsimEngine, linkSpeedCalculator) ; } }
@Override QNodeI createNetsimNode(final Node node) { QNodeImpl.Builder builder = new QNodeImpl.Builder( netsimEngine, context ) ; builder.setTurnAcceptanceLogic( this.turnAcceptanceLogic ) ; return builder.build( node ) ; } public final void setLinkSpeedCalculator(LinkSpeedCalculator linkSpeedCalculator) {
@Override QLinkI createNetsimLink(final Link link, final QNodeI toQueueNode) { QueueWithBuffer.Builder laneFactory = new QueueWithBuffer.Builder(context) ; QLinkImpl.Builder linkBuilder = new QLinkImpl.Builder(context, netsimEngine) ; linkBuilder.setLaneFactory(laneFactory); linkBuilder.setLinkSpeedCalculator( linkSpeedCalculator ) ; return linkBuilder.build(link, toQueueNode) ; } @Override
@Override public QNodeI createNetsimNode(Node node) { QNodeImpl.Builder builder = new QNodeImpl.Builder( netsimEngine, context ) ; return builder.build( node ) ; }
@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 ) ; }
public void addFromUpstream(QVehicle veh) { this.ql.getAcceptingQLane().addFromUpstream(veh); } }
public boolean isAcceptingFromUpstream() { return this.ql.getAcceptingQLane().isAcceptingFromUpstream(); }
public MobsimAgent unregisterAdditionalAgentOnLink(Id<Person> agentId, Id<Link> linkId) { if (linkId == null) { // seems that this can happen in tests; not sure if it can happen in regular code. kai, jun'15 return null; } QLinkI qLink = this.network.getNetsimLink(linkId); return qLink.unregisterAdditionalAgentOnLink(agentId); }
private boolean checkForActivity() { /* * Leave Link active as long as there are vehicles on the link (ignore * buffer because the buffer gets emptied by nodes and not links) and leave * link active until buffercap has accumulated (so a newly arriving vehicle * is not delayed). */ return qlane.isActive() || !this.getWaitingList().isEmpty() || !this.getTransitQLink().getTransitVehicleStopQueue().isEmpty() ; }
@Override public void clearVehicles() { super.clearVehicles(); qlane.clearVehicles(); }
public final static double calcSpeedValueBetweenZeroAndOne(QVehicle veh, double inverseSimulatedFlowCapacity, double now, double freespeed){ int cmp = (int) (veh.getEarliestLinkExitTime() + inverseSimulatedFlowCapacity + 2.0); // "inverseSimulatedFlowCapacity" is there to keep vehicles green that only wait for capacity (i.e. have no vehicle // ahead). Especially important with small samples sizes. This is debatable :-). kai, jan'11 double speed = (now > cmp ? 0.0 : 1.0); return speed; }
@Override public VehicularDepartureHandler get() { return qNetsimEngine.getDepartureHandler(); } }
@Override public final void setSignalStateAllTurningMoves( final SignalGroupState state) { qSignalizedItem.setSignalStateAllTurningMoves(state); thisTimeStepGreen = qSignalizedItem.hasGreenForAllToLinks(); // (this is only for capacity accumulation) }
@Override public void setSignalStateAllTurningMoves(SignalGroupState state) { this.allToLinksState = state; this.linkGreen = checkGreen(state); }
@Override public final void changeUnscaledFlowCapacityPerSecond( final double val ) { this.unscaledFlowCapacity_s = val ; // be defensive (might now be called twice): this.recalcTimeVariantAttributes(); }
@Override public synchronized MobsimAgent unregisterAdditionalAgentOnLink(Id<Person> agentId, Id<Link> linkId) { if (QSim.this.netEngine != null) { return QSim.this.netEngine.unregisterAdditionalAgentOnLink(agentId, linkId); } return null; }
@Override public void notifyIterationEnds(IterationEndsEvent event) { this.vehicleLinkTravelTimes = this.hand.getVehicleId2LinkTravelTime(); } }
@Override QLinkI createNetsimLink(Link link, QNodeI queueNode) { QueueWithBuffer.Builder laneBuilder = new QueueWithBuffer.Builder(context) ; QLinkImpl.Builder linkBuilder = new QLinkImpl.Builder(context, netsimEngine) ; linkBuilder.setLaneFactory(laneBuilder); return linkBuilder.build(link, queueNode) ; } }