public void checkConsistency() { log.info("checking consistency..."); List<Id<Link>> linksWithMalformedLanes = new LinkedList<>(); for (LanesToLinkAssignment l2l : this.lanes.getLanesToLinkAssignments().values()){ if (!isLaneOnLinkConsistent(l2l)){ linksWithMalformedLanes.add(l2l.getLinkId()); } } if (this.removeMalformed){ for (Id<Link> linkId : linksWithMalformedLanes) { this.lanes.getLanesToLinkAssignments().remove(linkId); log.info("remove lanes on link " + linkId); } } log.info("checked consistency. Lanes on " + linksWithMalformedLanes.size() + " links have been removed."); }
public void registerNumberOfCarsMonitoringOnLane(Id<Link> linkId, Id<Lane> laneId) { Link link = this.network.getLinks().get(linkId); if (link == null){ throw new IllegalStateException("Link with Id " + linkId + " is not in the network, can't register sensor"); } if (this.laneDefinitions == null || this.laneDefinitions.getLanesToLinkAssignments().get(linkId) == null || this.laneDefinitions.getLanesToLinkAssignments().get(linkId).getLanes().get(laneId) == null) { throw new IllegalStateException("No data found for lane " + laneId + " on link " + linkId + " is not in the network, can't register sensor"); } if (! this.linkIdLaneIdSensorMap.containsKey(linkId)){ this.linkIdLaneIdSensorMap.put(linkId, new HashMap<>()); } if (! this.linkIdLaneIdSensorMap.get(linkId).containsKey(laneId)){ Lane lane = this.laneDefinitions.getLanesToLinkAssignments().get(linkId).getLanes().get(laneId); this.linkIdLaneIdSensorMap.get(linkId).put(laneId, new LaneSensor(link, lane)); } }
public void registerNumberOfCarsOnLaneInDistanceMonitoring(Id<Link> linkId, Id<Lane> laneId, Double distanceMeter) { Link link = this.network.getLinks().get(linkId); if (link == null){ throw new IllegalStateException("Link with Id " + linkId + " is not in the network, can't register sensor"); } if (this.laneDefinitions == null || this.laneDefinitions.getLanesToLinkAssignments().get(linkId) == null || this.laneDefinitions.getLanesToLinkAssignments().get(linkId).getLanes().get(laneId) == null) { throw new IllegalStateException("No data found for lane " + laneId + " on link " + linkId + " is not in the network, can't register sensor"); } if (! this.linkIdLaneIdSensorMap.containsKey(linkId)){ this.linkIdLaneIdSensorMap.put(linkId, new HashMap<>()); } if (! this.linkIdLaneIdSensorMap.get(linkId).containsKey(laneId)){ Lane lane = this.laneDefinitions.getLanesToLinkAssignments().get(linkId).getLanes().get(laneId); this.linkIdLaneIdSensorMap.get(linkId).put(laneId, new LaneSensor(link, lane)); } this.linkIdLaneIdSensorMap.get(linkId).get(laneId).registerDistanceToMonitor(distanceMeter); }
public void registerAverageNumberOfCarsPerSecondMonitoringOnLane(Id<Link> linkId, Id<Lane> laneId, double lookBackTime, double timeBucketCollectionDuration) { Link link = this.network.getLinks().get(linkId); //check if link is in the network if (link == null){ throw new IllegalStateException("Link with Id " + linkId + " is not in the network, can't register sensor"); } //check if lane exists if (this.laneDefinitions == null || this.laneDefinitions.getLanesToLinkAssignments().get(linkId) == null || this.laneDefinitions.getLanesToLinkAssignments().get(linkId).getLanes().get(laneId) == null) { throw new IllegalStateException("No data found for lane " + laneId + " on link " + linkId + " is not in the network, can't register sensor"); } //check if the sensor-map already contains an entry for this link if (! this.linkIdLaneIdSensorMap.containsKey(linkId)){ this.linkIdLaneIdSensorMap.put(linkId, new HashMap<>()); } //check if the entry in sensor-map for this link has already a value for this lane if (! this.linkIdLaneIdSensorMap.get(linkId).containsKey(laneId)){ Lane lane = this.laneDefinitions.getLanesToLinkAssignments().get(linkId).getLanes().get(laneId); this.linkIdLaneIdSensorMap.get(linkId).put(laneId, new LaneSensor(link, lane)); } //register AvgVehPerSecond monitor for this lane linkIdLaneIdSensorMap.get(linkId).get(laneId).registerAverageVehiclesPerSecondToMonitor(lookBackTime, timeBucketCollectionDuration); }
private int getNumberOfExpectedVehiclesOnLane(double now, Id<Link> linkId, Id<Lane> laneId) { if (lanes.getLanesToLinkAssignments().get(linkId).getLanes().size() == 1) { return getNumberOfExpectedVehiclesOnLink(now, linkId); } else { return this.sensorManager.getNumberOfCarsInDistanceOnLane(linkId, laneId, 0., now); } }
public static void overwriteLaneCapacitiesByNetworkCapacities(Network net, Lanes lanes) { for (LanesToLinkAssignment linkLanes : lanes.getLanesToLinkAssignments().values()) { double linkCap = net.getLinks().get(linkLanes.getLinkId()).getCapacity(); for (Lane lane : linkLanes.getLanes().values()) { lane.setCapacityVehiclesPerHour(linkCap); } } } }
private Map<Id<Link>, List<TurnInfo>> createTurnInfos(Lanes laneDefs) { Map<Id<Link>, List<TurnInfo>> inLinkIdTurnInfoMap = new HashMap<>(); Set<Id<Link>> toLinkIds = new HashSet<>(); for (LanesToLinkAssignment l2l : laneDefs.getLanesToLinkAssignments().values()) { toLinkIds.clear(); for (Lane lane : l2l.getLanes().values()) { if (lane.getToLinkIds() != null && (lane.getToLaneIds() == null || lane.getToLaneIds().isEmpty())) { // make sure that it is a lane at the end of a link toLinkIds.addAll(lane.getToLinkIds()); } } if (!toLinkIds.isEmpty()) { List<TurnInfo> turnInfoList = new ArrayList<TurnInfo>(); for (Id<Link> toLinkId : toLinkIds) { turnInfoList.add(new TurnInfo(l2l.getLinkId(), toLinkId)); } inLinkIdTurnInfoMap.put(l2l.getLinkId(), turnInfoList); } } return inLinkIdTurnInfoMap; }
private double getAverageLaneArrivalRate(double now, Id<Link> linkId, Id<Lane> laneId) { if (lanes.getLanesToLinkAssignments().get(linkId).getLanes().size() > 1) { if (this.laemmerConfig.getLaneArrivalRate(linkId, laneId) != null) { return this.laemmerConfig.getLaneArrivalRate(linkId, laneId); } else { return this.sensorManager.getAverageArrivalRateOnLane(linkId, laneId, now); } } else { return getAverageArrivalRate(now, linkId); } }
public void getStepStats(StringBuilder builder, double now) { int totalN = 0; for (Signal signal : group.getSignals().values()) { if (signal.getLaneIds() != null && !signal.getLaneIds().isEmpty() && lanes.getLanesToLinkAssignments().get(signal.getLinkId()).getLanes().size() > 1) { for (Id<Lane> laneId : signal.getLaneIds()) { totalN += getNumberOfExpectedVehiclesOnLane(now, signal.getLinkId(), laneId); } } else { totalN += getNumberOfExpectedVehiclesOnLink(now, signal.getLinkId()); } } builder.append(this.group.getState().name()+ ";") .append(this.index + ";") .append(this.determiningLoad + ";") .append(this.a + ";") .append(this.abortionPenalty + ";") .append(this.regulationTime + ";") .append(totalN + ";"); } }
@Override public QLinkI createNetsimLink(Link link, QNodeI queueNode) { QLinkI ql = null; LanesToLinkAssignment l2l = this.laneDefinitions.getLanesToLinkAssignments().get(link.getId()); if (l2l != null){ List<ModelLane> lanes = LanesUtils.createLanes(link, l2l); // LinkSpeedCalculator linkSpeedCalculator = new DefaultLinkSpeedCalculator() ; // // yyyyyy I don't think that this was set correctly for this execution path before I refactored this. kai, feb'18 // ql = new QLinkLanesImpl(link, queueNode, lanes, context, netsimEngine, linkSpeedCalculator); QLinkLanesImpl.Builder builder = new QLinkLanesImpl.Builder(context, netsimEngine) ; ql = builder.build( link, queueNode, lanes ) ; } else { ql = this.delegate.createNetsimLink(link, queueNode); } return ql; }
LaemmerSignal(SignalGroup signalGroup) { this.group = signalGroup; // calculate outflow capacity once (in reality one also has to initialize this value and cannot update it every second) for (Signal signal : group.getSignals().values()) { if (signal.getLaneIds() != null && !signal.getLaneIds().isEmpty() && lanes.getLanesToLinkAssignments().get(signal.getLinkId()).getLanes().size() > 1) { for (Id<Lane> laneId : signal.getLaneIds()) { double laneOutflow = lanes.getLanesToLinkAssignments().get(signal.getLinkId()).getLanes() .get(laneId).getCapacityVehiclesPerHour() * config.qsim().getFlowCapFactor() / 3600; laneOutflowCapacitiesPerS.put(laneId, laneOutflow); signalOutflowCapacityPerS += laneOutflow; } } else { double linkOutflowPerS = network.getLinks().get(signal.getLinkId()).getCapacity() * config.qsim().getFlowCapFactor() / 3600; linkOutflowCapacitiesPerS.put(signal.getLinkId(), linkOutflowPerS); signalOutflowCapacityPerS += linkOutflowPerS; } } }
for (Signal signal : group.getSignals().values()) { if (signal.getLaneIds() != null && !signal.getLaneIds().isEmpty() && lanes.getLanesToLinkAssignments().get(signal.getLinkId()).getLanes().size() > 1) { for (Id<Lane> laneId : signal.getLaneIds()) { double arrivalRate = getAverageLaneArrivalRate(now, signal.getLinkId(), laneId);
for (SignalData signal : system.getSignalData().values()) { if (signal.getLaneIds() != null && ! signal.getLaneIds().isEmpty()){ if (! this.lanes.getLanesToLinkAssignments().containsKey(signal.getLinkId())){ log.error("Error: No LanesToLinkAssignment for Signals:"); log.error("\t\tSignalData Id: " + signal.getId() + " of SignalSystemData Id: " + system.getId() LanesToLinkAssignment l2l = this.lanes.getLanesToLinkAssignments().get(signal.getLinkId()); for (Id<Lane> laneId : signal.getLaneIds()) { if (! l2l.getLanes().containsKey(laneId)) {
public boolean allDownstreamLinksEmpty(SignalData signal){ if (signal.getTurningMoveRestrictions() != null) { return allLinksEmpty(signal.getTurningMoveRestrictions()); } // else: if (signal.getLaneIds() != null && !signal.getLaneIds().isEmpty()) { Set<Id<Link>> toLinks = new HashSet<>(); for (Id<Lane> laneId : signal.getLaneIds()) { Lane lane = lanes.getLanesToLinkAssignments().get(signal.getLinkId()).getLanes().get(laneId); toLinks.addAll(lane.getToLinkIds()); } return allLinksEmpty(toLinks); } // else: // if no turning move restrictions and no lanes with to links are set, turning is allowed to all outgoing links Node systemNode = this.network.getLinks().get(signal.getLinkId()).getToNode(); return allLinksEmpty(systemNode.getOutLinks().keySet()); }
@Override public void writeConstData(ByteBuffer out) throws IOException { //write the data for the links out.putInt(this.network.getVisLinks().size()); for (VisLink visLink : this.network.getVisLinks().values()) { LanesToLinkAssignment l2l = null; if (this.lanes != null){ l2l = this.lanes.getLanesToLinkAssignments().get(visLink.getLink().getId()); } List<ModelLane> la = null; if (l2l != null) { la = LanesUtils.createLanes(visLink.getLink(), l2l); } VisLinkWLanes otfLink = this.laneModelBuilder.createVisLinkLanes(OTFServerQuadTree.getOTFTransformation(), visLink, config.qsim().getNodeOffset(), la); //write link data ByteBufferUtils.putObject(out, otfLink); } }
for (Signal signal : group.getSignals().values()) { if (signal.getLaneIds() != null && !signal.getLaneIds().isEmpty() && lanes.getLanesToLinkAssignments().get(signal.getLinkId()).getLanes().size() > 1) { for (Id<Lane> laneId : signal.getLaneIds()) { waitingTimeSum += getNumberOfExpectedVehiclesOnLane(now + i, signal.getLinkId(), laneId); for (Signal signal : group.getSignals().values()) { if (signal.getLaneIds() != null && !signal.getLaneIds().isEmpty() && lanes.getLanesToLinkAssignments().get(signal.getLinkId()).getLanes().size() > 1) { for (Id<Lane> laneId : signal.getLaneIds()) { n += getNumberOfExpectedVehiclesOnLane(now + laemmerConfig.getIntergreenTime(), signal.getLinkId(), laneId);
/** * Replaces the method that converted a lane from format 11 to format 20. * Use this when you have not defined an original lane of the link and when you have not set lane capacities yet. */ public static void createOriginalLanesAndSetLaneCapacities(Network network, Lanes lanes){ LanesFactory factory = lanes.getFactory(); for (LanesToLinkAssignment l2l : lanes.getLanesToLinkAssignments().values()){ Link link = network.getLinks().get(l2l.getLinkId()); Lane olLane = factory.createLane(Id.create(l2l.getLinkId().toString() + ".ol", Lane.class)); l2l.addLane(olLane); for (Lane lane : l2l.getLanes().values()) { olLane.addToLaneId(lane.getId()); //set capacity of the lane depending on link capacity and number of representative lanes LanesUtils.calculateAndSetCapacity(lane, true, link, network); } olLane.setNumberOfRepresentedLanes(link.getNumberOfLanes()); olLane.setStartsAtMeterFromLinkEnd(link.getLength()); } }
public static void calculateMissingCapacitiesForLanes20(String networkInputFilename, String lanes20InputFilename, String lanes20OutputFilename){ Config config = ConfigUtils.createConfig(); config.network().setInputFile(networkInputFilename); config.qsim().setUseLanes(true); config.network().setLaneDefinitionsFile(lanes20InputFilename); Scenario scenario = ScenarioUtils.loadScenario(config); Network network = scenario.getNetwork(); Lanes lanes = scenario.getLanes(); for (LanesToLinkAssignment l2l : lanes.getLanesToLinkAssignments().values()){ Link link = network.getLinks().get(l2l.getLinkId()); for (Lane lane : l2l.getLanes().values()){ if (lane.getToLaneIds() == null || lane.getToLaneIds().isEmpty()){ calculateAndSetCapacity(lane, true, link, network); } else { calculateAndSetCapacity(lane, false, link, network); } } } LanesWriter writerDelegate = new LanesWriter(lanes); writerDelegate.write(lanes20OutputFilename); }
Lane firstSignalLane = lanes.getLanesToLinkAssignments().get(signalLinkId).getLanes().get(firstSignalLaneId); stepNumber = firstSignalLane.getAlignment();
private void checkContent(Lanes lanedefs) { assertEquals(2, lanedefs.getLanesToLinkAssignments().size()); LanesToLinkAssignment l2la; List<LanesToLinkAssignment> assignments = new ArrayList<>(); assignments.addAll(lanedefs.getLanesToLinkAssignments().values()); l2la = assignments.get(0); assertNotNull(l2la);