public void addNetworkChangeEvent(double speedInMpS, Link link, double startTime) { NetworkChangeEvent changeEvent = new NetworkChangeEvent( startTime ) ; changeEvent.setFreespeedChange(new NetworkChangeEvent.ChangeValue( NetworkChangeEvent.ChangeType.ABSOLUTE_IN_SI_UNITS, speedInMpS ) ) ; changeEvent.addLink( link ) ; // (1) add to mobsim: this.qSim.addNetworkChangeEvent(changeEvent); // (2) add to replanner: this.replanner.addNetworkChangeEvent(changeEvent); // yyyy wanted to delay this until some agent has actually encountered it. kai, feb'18 }
/** * 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(); } }
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()); } } }
String value = atts.getValue(START_TIME_TAG); if(value != null) { this.currentEvent = new NetworkChangeEvent(Time.parseTime(value)); } else { this.currentEvent = null; Link link = this.network.getLinks().get(Id.create(value, Link.class)); if(link != null) this.currentEvent.addLink(link); else log.warn(String.format("Link %1$s not found!", value)); this.currentEvent.setFlowCapacityChange(newNetworkChangeType(atts .getValue(CHANGE_TYPE_TAG), atts.getValue(VALUE_TAG))); this.currentEvent.setFreespeedChange(newNetworkChangeType(atts .getValue(CHANGE_TYPE_TAG), atts.getValue(VALUE_TAG))); this.currentEvent.setLanesChange(newNetworkChangeType(atts .getValue(CHANGE_TYPE_TAG), atts.getValue(VALUE_TAG)));
@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 testWriteChangeEventWithSmallValueAndReadBack() { final String fileName = utils.getOutputDirectory() + "wurst.xml"; 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); List<NetworkChangeEvent> outputEvents = new ArrayList<>(); final NetworkChangeEvent event = new NetworkChangeEvent(0.0); event.setFlowCapacityChange(new NetworkChangeEvent.ChangeValue(NetworkChangeEvent.ChangeType.ABSOLUTE_IN_SI_UNITS, 0.000000000004)); event.addLink(link); outputEvents.add(event); new NetworkChangeEventsWriter().write(fileName, outputEvents); List<NetworkChangeEvent> inputEvents = new ArrayList<>(); NetworkChangeEventsParser parser = new NetworkChangeEventsParser(network, inputEvents); parser.readFile(fileName); assertThat(inputEvents, hasItem(event)); }
@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 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); }
NetworkChangeEvent change = new NetworkChangeEvent(7*3600.0); change.addLink(link); change.setLanesChange(new ChangeValue(ChangeType.ABSOLUTE_IN_SI_UNITS, 2.0)); link.applyEvent(change);
@Test(expected = Exception.class) public void testWriteChangeEventWithoutLinkDoesntWork() { final String fileName = utils.getOutputDirectory() + "wurst.xml"; List<NetworkChangeEvent> events = new ArrayList<>(); final NetworkChangeEvent e = new NetworkChangeEvent(0.0); e.setFlowCapacityChange(new NetworkChangeEvent.ChangeValue(NetworkChangeEvent.ChangeType.ABSOLUTE_IN_SI_UNITS, 10)); events.add(e); new NetworkChangeEventsWriter().write(fileName, events); }
@Override public int compare(NetworkChangeEvent o1, NetworkChangeEvent o2) { return Double.compare(o1.getStartTime(), o2.getStartTime()); } }
/** * Adds a single network change event and applies it to the corresponding * links. * * @param event * a network change event. */ @Override public void addNetworkChangeEvent(final NetworkChangeEvent event) { this.networkChangeEvents.add(event); for (Link link : event.getLinks()) { if (link instanceof TimeVariantLinkImpl) { ((TimeVariantLinkImpl)link).applyEvent(event); } else { throw new IllegalArgumentException("Link " + link.getId().toString() + " is not timeVariant. " + "Did you make the network factory time variant? The easiest way to achieve this is " + "either in the config file, or syntax of the type\n" + "config.network().setTimeVariantNetwork(true);\n" + "Scenario scenario = ScenarioUtils.load/createScenario(config);\n" + "Note that the scenario needs to be created _after_ the config option is set, otherwise" + "the factory will already be there."); } } }
@Override public ChangeValue getChangeValue(NetworkChangeEvent event) { return event.getFreespeedChange(); } };
@Override public ChangeValue getChangeValue(NetworkChangeEvent event) { return event.getFlowCapacityChange(); } };
@Override public ChangeValue getChangeValue(NetworkChangeEvent event) { return event.getLanesChange(); } };
@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); }
NetworkChangeEvent change1 = new NetworkChangeEvent(0); change1.addLink(link2); change1.setFlowCapacityChange(new ChangeValue(ChangeType.FACTOR, capacityFactor)); final NetworkChangeEvent event = change1; NetworkUtils.addNetworkChangeEvent(network,event); NetworkChangeEvent change2 = new NetworkChangeEvent(3600); change2.addLink(link2); change2.setFlowCapacityChange(new ChangeValue(ChangeType.FACTOR, 1/capacityFactor)); final NetworkChangeEvent event1 = change2; NetworkUtils.addNetworkChangeEvent(network,event1);
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); }
private void applyTheChangeEvent(NetworkChangeEvent changeEvent) { for (Link link : changeEvent.getLinks()) { final NetsimLink netsimLink = this.internalInterface.getMobsim().getNetsimNetwork().getNetsimLink(link.getId()); if ( netsimLink instanceof TimeVariantLink) { ((TimeVariantLink) netsimLink).recalcTimeVariantAttributes(); } else { throw new RuntimeException("link not time variant") ; } } }
public void createNetworkChangeEvents(Network network, TravelTimeCalculator tcc2) { for (Link l : network.getLinks().values()){ if (l.getId().toString().startsWith("pt")) continue; double length = l.getLength(); double previousTravelTime=l.getLength()/l.getFreespeed() ; for (double time = 0; time<ENDTIME ; time = time+TIMESTEP){ double newTravelTime = tcc2.getLinkTravelTimes().getLinkTravelTime(l, time, null, null); if (newTravelTime != previousTravelTime){ NetworkChangeEvent nce = new NetworkChangeEvent(time); nce.addLink(l); double newFreespeed = length / newTravelTime; if (newFreespeed < MINIMUMFREESPEED) newFreespeed = MINIMUMFREESPEED; ChangeValue freespeedChange = new ChangeValue(ChangeType.ABSOLUTE_IN_SI_UNITS, newFreespeed); nce.setFreespeedChange(freespeedChange); this.networkChangeEvents.add(nce); previousTravelTime= newTravelTime; } } } }