@Override public int compare(NetworkChangeEvent o1, NetworkChangeEvent o2) { return Double.compare(o1.getStartTime(), o2.getStartTime()); } }
private void addNetworkChangeEventToMessageQ(NetworkChangeEvent changeEvent) { Message m = new Message() { @Override public void processEvent() { } @Override public void handleMessage() { applyTheChangeEvent(changeEvent); } }; m.setMessageArrivalTime(changeEvent.getStartTime()); this.messageQueue.putMessage(m); }
this.aTimes[numEvent] = event.getStartTime(); break; case FACTOR: { this.aTimes[numEvent] = event.getStartTime(); break; } case OFFSET_IN_SI_UNITS: { double currentValue = this.aValues[numEvent]; this.aValues[++numEvent] = currentValue + value.getValue(); this.aTimes[numEvent] = event.getStartTime(); break; } default:
this.writer.write(EQUALS); this.writer.write(QUOTE); this.writer.write(Time.writeTime(event.getStartTime())); this.writer.write(QUOTE); this.writer.write(CLOSE_TAG_1);
numEvent++; int toBin = (int) (event.getStartTime() / timeSlice);//exclusive Arrays.fill(values, fromBin, toBin, currentValue);
/** * Applies a new change event to the link. * * @param event a network change event. */ protected synchronized void applyEvent(final NetworkChangeEvent event) { if(this.changeEvents == null) this.changeEvents = new TreeMap<>(); this.changeEvents.put(event.getStartTime(), event); if (event.getFreespeedChange() != null) { this.variableFreespeed.incChangeEvents(); } if (event.getFlowCapacityChange() != null) { this.variableFlowCapacity.incChangeEvents(); } if (event.getLanesChange() != null) { this.variableLanes.incChangeEvents(); } }
private void addNetworkChangeEventToLocalDataStructure(NetworkChangeEvent networkChangeEvent) { ChangeValue freespeedChange = networkChangeEvent.getFreespeedChange(); if (freespeedChange != null) { double startTime = networkChangeEvent.getStartTime(); Map<Link,Double> newLinkSpeedsAtThisTime = changedLinksByTime.computeIfAbsent(startTime, k -> new HashMap<>()); for ( Link link : networkChangeEvent.getLinks() ) { // yy seems that the following should be available centrally. kai, dec'17 double newSpeed ; switch ( freespeedChange.getType() ) { case ABSOLUTE_IN_SI_UNITS: newSpeed = freespeedChange.getValue() ; break; case FACTOR: newSpeed = link.getFreespeed() * freespeedChange.getValue() ; break; case OFFSET_IN_SI_UNITS: newSpeed = link.getFreespeed() + freespeedChange.getValue() ; break; default: throw new RuntimeException("change event type not implemented") ; } if ( startTime > 0. ) { log.debug( "registering a change event for time=" + startTime + "; linkId=" + link.getId() ) ; } newLinkSpeedsAtThisTime.put( link, newSpeed ) ; } } }
public final void addNetworkChangeEvent( NetworkChangeEvent event ) { log.warn("add within-day network change event:" + event); final Queue<NetworkChangeEvent> centralNetworkChangeEvents = NetworkUtils.getNetworkChangeEvents(this.internalInterface.getMobsim().getScenario().getNetwork()); if ( centralNetworkChangeEvents.contains( event ) ) { log.warn("network change event already in central data structure; not adding it again") ; } else { log.warn("network change event not yet in central data structure; adding it") ; // centralNetworkChangeEvents.add( event ) ; NetworkUtils.addNetworkChangeEvent(this.internalInterface.getMobsim().getScenario().getNetwork(), event); // need to add this here since otherwise speed lookup in mobsim does not work. And need to hedge against // code that may already have added it by itself. kai, feb'18 } if ( event.getStartTime()<= this.internalInterface.getMobsim().getSimTimer().getTimeOfDay() ) { this.applyTheChangeEvent(event); } else { this.addNetworkChangeEventToMessageQ(event); } }
public TtmobsimListener(NetworkChangeEvent nce) { if (nce.getLinks().size() > 1) { throw new RuntimeException("Expecting only one network change event for a single link. Aborting..."); } else { for (Link link : nce.getLinks()) { this.link = link; this.networkChangeEventTime = nce.getStartTime(); this.reducedFreespeed = nce.getFreespeedChange().getValue(); Assert.assertEquals(true, this.reducedFreespeed < this.link.getFreespeed()); } } }
@Test public void testAbsoluteChangeEvents() { final Network network = NetworkUtils.createNetwork(); Node node1 = NetworkUtils.createAndAddNode(network, Id.create("1", Node.class), new Coord((double) 0, (double) 0)); Node node2 = NetworkUtils.createAndAddNode(network, Id.create("2", Node.class), new Coord((double) 0, (double) 1000)); final Link link = NetworkUtils.createAndAddLink(network, Id.create("2", Link.class), node1, node2, (double) 1500, 1.667, (double) 3600, (double) 1); final String fileName = this.utils.getOutputDirectory() + "absoluteChanges.xml"; List<NetworkChangeEvent> changeEvents = new ArrayList<>(); final NetworkChangeEvent event = new NetworkChangeEvent(100.0); event.setFlowCapacityChange(new NetworkChangeEvent.ChangeValue(NetworkChangeEvent.ChangeType.ABSOLUTE_IN_SI_UNITS, 0.000000000005)); event.addLink(link); changeEvents.add(event); new NetworkChangeEventsWriter().write(fileName, changeEvents); List<NetworkChangeEvent> changeEvents2 = new ArrayList<>(); new NetworkChangeEventsParser(network, changeEvents2).readFile(fileName); Assert.assertFalse(changeEvents2.isEmpty()); Assert.assertEquals(1, changeEvents2.size()); NetworkChangeEvent event2 = changeEvents2.get(0); Assert.assertEquals(event.getStartTime(), event2.getStartTime(), 0.0); Assert.assertEquals(NetworkChangeEvent.ChangeType.ABSOLUTE_IN_SI_UNITS, event2.getFlowCapacityChange().getType()); Assert.assertEquals(event.getFlowCapacityChange().getValue(), event2.getFlowCapacityChange().getValue(), 1e-10); }
@Test public void testNegativeOffsetChangeEvents() { final Network network = NetworkUtils.createNetwork(); Node node1 = NetworkUtils.createAndAddNode(network, Id.create("1", Node.class), new Coord((double) 0, (double) 0)); Node node2 = NetworkUtils.createAndAddNode(network, Id.create("2", Node.class), new Coord((double) 0, (double) 1000)); final Link link = NetworkUtils.createAndAddLink(network, Id.create("2", Link.class), node1, node2, (double) 1500, 1.667, (double) 3600, (double) 1); final String fileName = this.utils.getOutputDirectory() + "offsetChanges.xml"; List<NetworkChangeEvent> changeEvents = new ArrayList<>(); final NetworkChangeEvent event = new NetworkChangeEvent(300.0); event.setFreespeedChange(new NetworkChangeEvent.ChangeValue(NetworkChangeEvent.ChangeType.OFFSET_IN_SI_UNITS, -3.6)); event.addLink(link); changeEvents.add(event); new NetworkChangeEventsWriter().write(fileName, changeEvents); List<NetworkChangeEvent> changeEvents2 = new ArrayList<>(); new NetworkChangeEventsParser(network, changeEvents2).readFile(fileName); Assert.assertFalse(changeEvents2.isEmpty()); Assert.assertEquals(1, changeEvents2.size()); NetworkChangeEvent event2 = changeEvents2.get(0); Assert.assertEquals(event.getStartTime(), event2.getStartTime(), 0.0); Assert.assertEquals(NetworkChangeEvent.ChangeType.OFFSET_IN_SI_UNITS, event2.getFreespeedChange().getType()); Assert.assertEquals(event.getFreespeedChange().getValue(), event2.getFreespeedChange().getValue(), 1e-10); }
@Test public void testScaleFactorChangeEvents() { final Network network = NetworkUtils.createNetwork(); Node node1 = NetworkUtils.createAndAddNode(network, Id.create("1", Node.class), new Coord((double) 0, (double) 0)); Node node2 = NetworkUtils.createAndAddNode(network, Id.create("2", Node.class), new Coord((double) 0, (double) 1000)); final Link link = NetworkUtils.createAndAddLink(network, Id.create("2", Link.class), node1, node2, (double) 1500, 1.667, (double) 3600, (double) 1); final String fileName = this.utils.getOutputDirectory() + "scalefactorChanges.xml"; List<NetworkChangeEvent> changeEvents = new ArrayList<>(); final NetworkChangeEvent event = new NetworkChangeEvent(200.0); event.setLanesChange(new NetworkChangeEvent.ChangeValue(NetworkChangeEvent.ChangeType.FACTOR, 2.5)); event.addLink(link); changeEvents.add(event); new NetworkChangeEventsWriter().write(fileName, changeEvents); List<NetworkChangeEvent> changeEvents2 = new ArrayList<>(); new NetworkChangeEventsParser(network, changeEvents2).readFile(fileName); Assert.assertFalse(changeEvents2.isEmpty()); Assert.assertEquals(1, changeEvents2.size()); NetworkChangeEvent event2 = changeEvents2.get(0); Assert.assertEquals(event.getStartTime(), event2.getStartTime(), 0.0); Assert.assertEquals(NetworkChangeEvent.ChangeType.FACTOR, event2.getLanesChange().getType()); Assert.assertEquals(event.getLanesChange().getValue(), event2.getLanesChange().getValue(), 1e-10); }
@Test public void testPositiveOffsetChangeEvents() { final Network network = NetworkUtils.createNetwork(); Node node1 = NetworkUtils.createAndAddNode(network, Id.create("1", Node.class), new Coord((double) 0, (double) 0)); Node node2 = NetworkUtils.createAndAddNode(network, Id.create("2", Node.class), new Coord((double) 0, (double) 1000)); final Link link = NetworkUtils.createAndAddLink(network, Id.create("2", Link.class), node1, node2, (double) 1500, 1.667, (double) 3600, (double) 1); final String fileName = this.utils.getOutputDirectory() + "offsetChanges.xml"; List<NetworkChangeEvent> changeEvents = new ArrayList<>(); final NetworkChangeEvent event = new NetworkChangeEvent(300.0); event.setFreespeedChange(new NetworkChangeEvent.ChangeValue(NetworkChangeEvent.ChangeType.OFFSET_IN_SI_UNITS, +3.6)); event.addLink(link); changeEvents.add(event); new NetworkChangeEventsWriter().write(fileName, changeEvents); List<NetworkChangeEvent> changeEvents2 = new ArrayList<>(); new NetworkChangeEventsParser(network, changeEvents2).readFile(fileName); Assert.assertFalse(changeEvents2.isEmpty()); Assert.assertEquals(1, changeEvents2.size()); NetworkChangeEvent event2 = changeEvents2.get(0); Assert.assertEquals(event.getStartTime(), event2.getStartTime(), 0.0); Assert.assertEquals(NetworkChangeEvent.ChangeType.OFFSET_IN_SI_UNITS, event2.getFreespeedChange().getType()); Assert.assertEquals(event.getFreespeedChange().getValue(), event2.getFreespeedChange().getValue(), 1e-10); }