@Override public Collection<AgentSnapshotInfo> addAgentSnapshotInfo( Collection<AgentSnapshotInfo> positions) { // AbstractAgentSnapshotInfoBuilder snapshotInfoBuilder = qnetwork.simEngine.getAgentSnapshotInfoBuilder(); QLaneI.VisData roadVisData = getAcceptingQLane().getVisData() ; if (visLink != null) { ((QueueWithBuffer.VisDataImpl)roadVisData).setVisInfo(visLink.getLinkStartCoord(), visLink.getLinkEndCoord()) ; // yyyy not so great but an elegant solution needs more thinking about visualizer structure. kai, jun'13 } double now = context.getSimTimer().getTimeOfDay() ; positions = roadVisData.addAgentSnapshotInfo(positions,now) ; int cnt2 = 10 ; // a counter according to which non-moving items can be "spread out" in the visualization // initialize a bit away from the lane // treat vehicles from transit stops cnt2 = context.snapshotInfoBuilder.positionVehiclesFromTransitStop(positions, getLink(), getTransitQLink().getTransitVehicleStopQueue(), cnt2 ); // treat vehicles from waiting list: cnt2 = context.snapshotInfoBuilder.positionVehiclesFromWaitingList(positions, QLinkImpl.this.getLink(), cnt2, QLinkImpl.this.getWaitingList()); cnt2 = context.snapshotInfoBuilder.positionAgentsInActivities(positions, QLinkImpl.this.getLink(), QLinkImpl.this.getAdditionalAgentsOnLink(), cnt2); return positions; }
QLinkImpl build( Link link, QNodeI toNode ) { if ( laneFactory == null ) { laneFactory = new QueueWithBuffer.Builder( context ) ; } return new QLinkImpl( link, toNode, laneFactory, context, netsimEngine, linkSpeedCalculator) ; } }
@Override public boolean doSimStep() { double now = context.getSimTimer().getTimeOfDay() ; qlane.initBeforeSimStep(); if ( context.qsimConfig.isInsertingWaitingVehiclesBeforeDrivingVehicles() ) { this.moveWaitToRoad(); this.getTransitQLink().handleTransitVehiclesInStopQueue(now); qlane.doSimStep(); } else { this.getTransitQLink().handleTransitVehiclesInStopQueue(now); qlane.doSimStep(); this.moveWaitToRoad(); } this.setActive(this.checkForActivity()); return isActive(); // yy seems to me that for symmetry there should be something like // netElementActivationRegistry.registerLinkAsActive(this); // and may be a qlink.deactivateLink(...) around it (analogous to qlink.activateLink). // That is, do NOT pass the deactivation of the link rather implicitly via returning a false here. // kai, mar'16 }
/** * 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); } }
assertTrue(f.qlink1.isNotOfferingVehicle()); assertEquals(0, ((QueueWithBuffer) f.qlink1.getAcceptingQLane()).getAllVehicles().size()); assertNull(f.qlink1.getVehicle(id1)); assertEquals(0, f.qlink1.getAllVehicles().size()); f.qlink1.getAcceptingQLane().addFromUpstream(veh); assertTrue(f.qlink1.isNotOfferingVehicle()); assertEquals(1, ((QueueWithBuffer) f.qlink1.getAcceptingQLane()).getAllVehicles().size()); assertEquals("vehicle not found on link.", veh, f.qlink1.getVehicle(id1)); assertEquals(1, f.qlink1.getAllVehicles().size()); f.qlink1.doSimStep(); assertFalse(f.qlink1.isNotOfferingVehicle()); assertEquals(1, f.qlink1.getAllVehicles().size()); assertEquals(veh, f.qlink1.getAllVehicles().iterator().next()); f.qlink1.doSimStep(); assertEquals(veh, f.qlink1.getOfferingQLanes().get(0).popFirstVehicle()); assertTrue(f.qlink1.isNotOfferingVehicle()); assertNull("vehicle should not be on link anymore.", f.qlink1.getVehicle(id1)); assertEquals(0, f.qlink1.getAllVehicles().size());
assertEquals("wrong initial storage capacity.", 10.0, f.qlink2.getSpaceCap(), EPSILON); f.qlink2.getAcceptingQLane().addFromUpstream(veh5); // used vehicle equivalents: 5 assertTrue(f.qlink2.getAcceptingQLane().isAcceptingFromUpstream()); f.qlink2.getAcceptingQLane().addFromUpstream(veh5); // used vehicle equivalents: 10 assertFalse(f.qlink2.getAcceptingQLane().isAcceptingFromUpstream()); assertTrue(f.qlink2.isNotOfferingVehicle()); f.qlink2.doSimStep(); f.qlink2.doSimStep(); // first veh moves to buffer, used vehicle equivalents: 5 assertTrue(f.qlink2.getAcceptingQLane().isAcceptingFromUpstream()); assertFalse(f.qlink2.isNotOfferingVehicle()); f.qlink2.getOfferingQLanes().get(0).popFirstVehicle(); // first veh leaves buffer f.qlink2.doSimStep(); // used vehicle equivalents: 5.0 assertTrue(f.qlink2.getAcceptingQLane().isAcceptingFromUpstream()); f.qlink2.getAcceptingQLane().addFromUpstream(veh25); // used vehicle equivalents: 7.5 f.qlink2.getAcceptingQLane().addFromUpstream(veh1); // used vehicle equivalents: 8.5 f.qlink2.getAcceptingQLane().addFromUpstream(veh1); // used vehicle equivalents: 9.5 assertTrue(f.qlink2.getAcceptingQLane().isAcceptingFromUpstream()); f.qlink2.getAcceptingQLane().addFromUpstream(veh1); // used vehicle equivalents: 10.5 assertFalse(f.qlink2.getAcceptingQLane().isAcceptingFromUpstream()); f.qlink2.doSimStep(); assertFalse(f.qlink2.getAcceptingQLane().isAcceptingFromUpstream()); f.qlink2.doSimStep(); // "2nd first" veh moves to buffer, used vehicle equivalents: 5.5
/** * 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()); }
@Test public void testInit() { Fixture f = new Fixture(isUsingFastCapacityUpdate); assertNotNull(f.qlink1); assertEquals(1.0, f.qlink1.getSimulatedFlowCapacityPerTimeStep(), EPSILON); assertEquals(1.0, f.qlink1.getSpaceCap(), EPSILON); // TODO dg[april2008] this assertions are not covering everything in // QueueLink's constructor. // Extend the tests by checking the methods initFlowCapacity and // recalcCapacity assertEquals(f.link1, f.qlink1.getLink()); assertEquals(f.queueNetwork.getNetsimNode(Id.create("2", Node.class)), f.qlink1.getToNode()); }
assertEquals(0, f.qlink2.getAllVehicles().size()); assertEquals(1, f.qlink2.getAllVehicles().size()); MobsimVehicle[] vehicles = f.qlink2.getAllVehicles().toArray(new MobsimVehicle[2]); assertEquals(f.transitVehicle, vehicles[0]); assertEquals(2, f.qlink2.getAllVehicles().size()); vehicles = f.qlink2.getAllVehicles().toArray(vehicles); assertEquals(f.transitVehicle, vehicles[0]); assertEquals(f.normalVehicle, vehicles[1]); assertEquals(2, f.qlink2.getAllVehicles().size()); assertEquals(1, f.qlink3.getAllVehicles().size()); vehicles = f.qlink3.getAllVehicles().toArray(vehicles); assertEquals(f.transitVehicle, vehicles[0]); assertEquals(1, f.qlink2.getAllVehicles().size()); vehicles = f.qlink2.getAllVehicles().toArray(vehicles); assertEquals(f.normalVehicle, vehicles[0]); assertEquals(2, f.qlink3.getAllVehicles().size()); vehicles = f.qlink3.getAllVehicles().toArray(vehicles); assertEquals(f.transitVehicle, vehicles[0]); assertEquals(f.normalVehicle, vehicles[1]); assertEquals(2, f.qlink3.getAllVehicles().size()); assertEquals(2, f.qlink3.getAllVehicles().size()); // includes parked vehicles assertEquals(1, f.qlink3.getAllNonParkedVehicles().size());
@Test public void testAdd() { Fixture f = new Fixture(isUsingFastCapacityUpdate); assertEquals(0, ((QueueWithBuffer) f.qlink1.getAcceptingQLane()).getAllVehicles().size()); QVehicle v = new QVehicleImpl(f.basicVehicle); Person p = PopulationUtils.getFactory().createPerson(Id.create("1", Person.class)); p.addPlan(PopulationUtils.createPlan()); v.setDriver(createAndInsertPersonDriverAgentImpl(p, f.sim)); f.qlink1.getAcceptingQLane().addFromUpstream(v); assertEquals(1, ((QueueWithBuffer) f.qlink1.getAcceptingQLane()).getAllVehicles().size()); assertFalse(f.qlink1.getAcceptingQLane().isAcceptingFromUpstream()); assertTrue(f.qlink1.isNotOfferingVehicle()); }
@Override public void recalcTimeVariantAttributes() { double now = context.getSimTimer().getTimeOfDay() ; qlane.changeUnscaledFlowCapacityPerSecond( this.getLink().getFlowCapacityPerSec(now ) ); qlane.changeEffectiveNumberOfLanes(this.getLink().getNumberOfLanes(now)); // qlane.changeSpeedMetersPerSecond( getLink().getFreespeed(now) ) ; flowCap & nLanes are "push", freeSpeed is //"pull". This is not completely honest w.r.t. freeSpeed consequences to the fdiag, but also wasn't correctly //thought through/implemented when I found it. kai, feb'18 qlane.recalcTimeVariantAttributes(); }
assertEquals(2, f.qlink1.getAllVehicles().size()); assertEquals(0, f.qlink2.getAllVehicles().size()); assertEquals(1, f.qlink1.getAllVehicles().size()); assertEquals(1, f.qlink2.getAllVehicles().size()); f.simEngine.doSimStep(102); Collection<MobsimVehicle> allVehicles = f.qlink2.getAllVehicles(); assertEquals(1, allVehicles.size()); assertEquals(f.normalVehicle, f.qlink2.getAllVehicles().toArray(new MobsimVehicle[1])[0]); // first the normal vehicle assertEquals(1, f.qlink2.getAllVehicles().size()); assertEquals(1, f.qlink2.getAllVehicles().size()); assertEquals(2, f.qlink2.getAllVehicles().size()); MobsimVehicle[] vehicles = f.qlink2.getAllVehicles().toArray(new MobsimVehicle[2]); assertEquals(f.normalVehicle, vehicles[0]); assertEquals(f.transitVehicle, vehicles[1]); // second the transit vehicle assertEquals(2, f.qlink2.getAllVehicles().size());
veh.setDriver(driver); driver.setVehicle(veh); f.qlink1.addParkedVehicle(veh); // vehicle parked assertTrue(f.qlink1.isNotOfferingVehicle()); assertEquals(0, ((QueueWithBuffer) f.qlink1.getAcceptingQLane()).getAllVehicles().size()); assertEquals(1, f.qlink1.getAllVehicles().size()); assertTrue(f.qlink1.isNotOfferingVehicle()); // veh not in buffer assertEquals(0, ((QueueWithBuffer) f.qlink1.getAcceptingQLane()).getAllVehicles().size()); // veh not on lane assertEquals("vehicle not found in waiting list.", veh, f.qlink1.getVehicle(id1)); // veh _should_ be on link (in waiting list) assertEquals(1, f.qlink1.getAllVehicles().size()); // dto assertEquals(veh, f.qlink1.getAllVehicles().iterator().next()); // dto f.qlink1.doSimStep(); assertFalse(f.qlink1.isNotOfferingVehicle()); // i.e. is offering the vehicle assertEquals(1, ((QueueWithBuffer) f.qlink1.getAcceptingQLane()).getAllVehicles().size()); // somewhere on lane assertEquals("vehicle not found in buffer.", veh, f.qlink1.getVehicle(id1)); // somewhere on link assertEquals(1, f.qlink1.getAllVehicles().size()); // somewhere on link assertEquals(veh, f.qlink1.getOfferingQLanes().get(0).popFirstVehicle()); assertTrue(f.qlink1.isNotOfferingVehicle()); assertEquals(0, ((QueueWithBuffer) f.qlink1.getAcceptingQLane()).getAllVehicles().size()); assertNull("vehicle should not be on link anymore.", f.qlink1.getVehicle(id1)); assertEquals(0, f.qlink1.getAllVehicles().size());
assertTrue(qlink.isNotOfferingVehicle()); assertEquals(0, ((QueueWithBuffer) qlink.getAcceptingQLane()).getAllVehicles().size()); qlink.getAcceptingQLane().addFromUpstream(v1); assertEquals(1, ((QueueWithBuffer) qlink.getAcceptingQLane()).getAllVehicles().size()); assertTrue(qlink.isNotOfferingVehicle()); qlink.doSimStep(); assertEquals(1, ((QueueWithBuffer) qlink.getAcceptingQLane()).getAllVehicles().size()); assertFalse(qlink.isNotOfferingVehicle()); qlink.getAcceptingQLane().addFromUpstream(v2); assertEquals(2, ((QueueWithBuffer) qlink.getAcceptingQLane()).getAllVehicles().size()); assertFalse(qlink.isNotOfferingVehicle()); qlink.doSimStep( ); assertEquals(2, ((QueueWithBuffer) qlink.getAcceptingQLane()).getAllVehicles().size()); assertFalse(qlink.isNotOfferingVehicle()); assertEquals(v1, qlink.getOfferingQLanes().get(0).popFirstVehicle()); assertEquals(1, ((QueueWithBuffer) qlink.getAcceptingQLane()).getAllVehicles().size()); assertTrue(qlink.isNotOfferingVehicle()); qlink.doSimStep(); assertEquals(1, ((QueueWithBuffer) qlink.getAcceptingQLane()).getAllVehicles().size()); assertFalse(qlink.isNotOfferingVehicle()); assertEquals(v2, qlink.getOfferingQLanes().get(0).popFirstVehicle()); assertEquals(0, ((QueueWithBuffer) qlink.getAcceptingQLane()).getAllVehicles().size());
assertEquals(0, f.qlink2.getAllVehicles().size()); assertEquals(1, f.qlink2.getAllVehicles().size()); MobsimVehicle[] vehicles = f.qlink2.getAllVehicles().toArray(new MobsimVehicle[2]); assertEquals(f.transitVehicle, vehicles[0]); assertEquals(2, f.qlink2.getAllVehicles().size()); vehicles = f.qlink2.getAllVehicles().toArray(vehicles); assertEquals(f.transitVehicle, vehicles[0]); assertEquals(f.normalVehicle, vehicles[1]); assertEquals(2, f.qlink2.getAllVehicles().size()); assertEquals(1, f.qlink3.getAllVehicles().size()); vehicles = f.qlink3.getAllVehicles().toArray(vehicles); assertEquals(f.transitVehicle, vehicles[0]); assertEquals(1, f.qlink2.getAllVehicles().size()); vehicles = f.qlink2.getAllVehicles().toArray(vehicles); assertEquals(f.normalVehicle, vehicles[0]); assertEquals(2, f.qlink3.getAllVehicles().size()); vehicles = f.qlink3.getAllVehicles().toArray(vehicles); assertEquals(f.transitVehicle, vehicles[0]); assertEquals(f.normalVehicle, vehicles[1]); assertEquals(2, f.qlink3.getAllVehicles().size()); assertEquals(2, f.qlink3.getAllVehicles().size()); assertEquals(2, f.qlink3.getAllNonParkedVehicles().size());
((QNetsimEngine)this.simEngine).addParkedVehicle(this.transitVehicle, this.qlink1.getLink().getId()) ; ((QNetsimEngine)this.simEngine).addParkedVehicle(this.normalVehicle, this.qlink1.getLink().getId()) ; ((QNetsimEngine)this.simEngine).addParkedVehicle(this.normalVehicle2, this.qlink1.getLink().getId()) ;
assertEquals(0, f.qlink2.getAllVehicles().size()); assertEquals(1, f.qlink2.getAllVehicles().size()); MobsimVehicle[] vehicles = f.qlink2.getAllVehicles().toArray(new MobsimVehicle[2]); assertEquals(f.transitVehicle, vehicles[0]); assertEquals(2, f.qlink2.getAllVehicles().size()); vehicles = f.qlink2.getAllVehicles().toArray(vehicles); assertEquals(f.transitVehicle, vehicles[0]); assertEquals(f.normalVehicle, vehicles[1]); assertEquals(2, f.qlink2.getAllVehicles().size()); assertEquals(2, f.qlink2.getAllVehicles().size()); assertEquals(2, f.qlink2.getAllVehicles().size()); assertEquals(1, f.qlink2.getAllVehicles().size()); vehicles = f.qlink2.getAllVehicles().toArray(vehicles); assertEquals(f.transitVehicle, vehicles[0]); assertEquals(1, f.qlink3.getAllVehicles().size()); vehicles = f.qlink3.getAllVehicles().toArray(vehicles); assertEquals(f.normalVehicle, vehicles[0]); assertEquals(1, f.qlink2.getAllVehicles().size()); assertEquals(1, f.qlink3.getAllVehicles().size()); assertEquals(1, f.qlink2.getAllVehicles().size()); assertEquals(1, f.qlink3.getAllVehicles().size());
assertEquals(0, f.qlink2.getAllVehicles().size()); assertEquals(1, f.qlink2.getAllVehicles().size()); MobsimVehicle[] vehicles = f.qlink2.getAllVehicles().toArray(new MobsimVehicle[2]); assertEquals(f.transitVehicle, vehicles[0]); assertEquals(2, f.qlink2.getAllVehicles().size()); vehicles = f.qlink2.getAllVehicles().toArray(vehicles); assertEquals(f.transitVehicle, vehicles[0]); assertEquals(f.normalVehicle, vehicles[1]); f.qsim.internalInterface.arrangeNextAgentState(f.normalVehicle2.getDriver()) ; f.simEngine.doSimStep(124); assertEquals(2, f.qlink2.getAllVehicles().size()); assertEquals(3, f.qlink2.getAllVehicles().size()); assertEquals(3, f.qlink2.getAllVehicles().size()); assertEquals(3, f.qlink2.getAllVehicles().size()); assertEquals(2, f.qlink2.getAllVehicles().size()); assertEquals(1, f.qlink3.getAllVehicles().size()); assertEquals(1, f.qlink2.getAllVehicles().size()); assertEquals(2, f.qlink3.getAllVehicles().size()); assertEquals(1, f.qlink2.getAllVehicles().size()); assertEquals(2, f.qlink3.getAllVehicles().size());
assertEquals(0, f.qlink2.getAllVehicles().size()); assertEquals(1, f.qlink2.getAllVehicles().size()); assertEquals(f.normalVehicle, f.qlink2.getAllVehicles().toArray(new MobsimVehicle[1])[0]); // first the normal vehicle assertEquals(1, f.qlink2.getAllVehicles().size()); assertEquals(1, f.qlink2.getAllVehicles().size()); assertEquals(2, f.qlink2.getAllVehicles().size()); MobsimVehicle[] vehicles = f.qlink2.getAllVehicles().toArray(new MobsimVehicle[2]); assertEquals(f.normalVehicle, vehicles[0]); assertEquals(f.transitVehicle, vehicles[1]); // second the transit vehicle assertEquals(2, f.qlink2.getAllVehicles().size());
assertEquals(0, f.qlink2.getAllVehicles().size()); assertEquals(1, f.qlink2.getAllVehicles().size()); MobsimVehicle[] vehicles = f.qlink2.getAllVehicles().toArray(new MobsimVehicle[2]); assertEquals(f.transitVehicle, vehicles[0]); assertEquals(2, f.qlink2.getAllVehicles().size()); vehicles = f.qlink2.getAllVehicles().toArray(vehicles); assertEquals(f.transitVehicle, vehicles[0]); assertEquals(f.normalVehicle, vehicles[1]); f.qsim.internalInterface.arrangeNextAgentState(f.normalVehicle2.getDriver()); f.simEngine.doSimStep(120); assertEquals(2, f.qlink2.getAllVehicles().size()); assertEquals(3, f.qlink2.getAllVehicles().size()); assertEquals(3, f.qlink2.getAllVehicles().size()); assertEquals(3, f.qlink2.getAllVehicles().size()); assertEquals(2, f.qlink2.getAllVehicles().size()); assertEquals(1, f.qlink3.getAllVehicles().size()); assertEquals(1, f.qlink2.getAllVehicles().size()); assertEquals(2, f.qlink3.getAllVehicles().size()); assertEquals(1, f.qlink2.getAllVehicles().size()); assertEquals(2, f.qlink3.getAllVehicles().size());