From 672c46d2e7056367f2a6de57a4fd646a090dcb2f Mon Sep 17 00:00:00 2001 From: REASY Date: Fri, 26 Oct 2018 06:37:03 +0700 Subject: [PATCH] LinkTravelTimeContainer: Change internal representation (#813) * Use mutable collection and change format to be `Map[Id[Link], Array[Double]]` * Whenever is needed use `TravelTimeCalculatorConfigGroup.getMaxTime()` to get max time for iteration: - Warm start - PhyssimCalcLinkStats - BeamCalcLinkStats - LinkTravelTimeContainer * Merge remote-tracking branch 'origin/master' into art/reduce-memory-consumption-for-link-traveltime-container-4ci * Fix after merge * Added `VolumesAnalyzerFixed` which respects `maxTime` * Update BeamCalcLinkStatsSpec.scala * Merge remote-tracking branch 'origin/master' into art/reduce-memory-consumption-for-link-traveltime-container-4ci * Fixed failing test * Dummy commit --- .../physsim/PhyssimCalcLinkStats.java | 13 ++-- .../AgentSimToPhysSimPlanConverter.java | 16 ++-- .../java/beam/utils/BeamCalcLinkStats.java | 6 +- .../java/beam/utils/VolumesAnalyzerFixed.java | 52 +++++++++++++ .../beam/router/LinkTravelTimeContainer.scala | 75 ++++++++++--------- .../beam/router/r5/R5RoutingWorker.scala | 3 + src/main/scala/beam/sim/BeamHelper.scala | 4 +- src/main/scala/beam/sim/BeamMobsim.scala | 11 ++- src/main/scala/beam/sim/BeamServices.scala | 6 +- src/main/scala/beam/sim/BeamSim.scala | 4 +- src/main/scala/beam/sim/BeamWarmStart.scala | 7 +- .../physsim/PhyssimCalcLinkStatsTest.java | 6 +- .../physsim/BeamCalcLinkStatsSpec.scala | 13 ++-- .../beam/router/WarmStartRoutingSpec.scala | 23 ++++-- .../scala/beam/sim/BeamWarmStartSpec.scala | 5 +- 15 files changed, 157 insertions(+), 87 deletions(-) create mode 100644 src/main/java/beam/utils/VolumesAnalyzerFixed.java diff --git a/src/main/java/beam/analysis/physsim/PhyssimCalcLinkStats.java b/src/main/java/beam/analysis/physsim/PhyssimCalcLinkStats.java index 04f78253aa2..db1a88759a0 100755 --- a/src/main/java/beam/analysis/physsim/PhyssimCalcLinkStats.java +++ b/src/main/java/beam/analysis/physsim/PhyssimCalcLinkStats.java @@ -2,6 +2,7 @@ import beam.sim.config.BeamConfig; import beam.utils.BeamCalcLinkStats; +import beam.utils.VolumesAnalyzerFixed; import org.jfree.chart.*; import org.jfree.chart.plot.CategoryPlot; import org.jfree.chart.plot.PlotOrientation; @@ -11,6 +12,7 @@ import org.matsim.api.core.v01.network.Link; import org.matsim.api.core.v01.network.Network; import org.matsim.core.api.experimental.events.EventsManager; +import org.matsim.core.config.groups.TravelTimeCalculatorConfigGroup; import org.matsim.core.controler.OutputDirectoryHierarchy; import org.matsim.core.router.util.TravelTime; import org.matsim.core.trafficmonitoring.TravelTimeCalculator; @@ -59,7 +61,8 @@ public class PhyssimCalcLinkStats { private BeamCalcLinkStats linkStats; private VolumesAnalyzer volumes; - public PhyssimCalcLinkStats(Network network, OutputDirectoryHierarchy controlerIO, BeamConfig beamConfig) { + public PhyssimCalcLinkStats(Network network, OutputDirectoryHierarchy controlerIO, BeamConfig beamConfig, + TravelTimeCalculatorConfigGroup ttcConfigGroup) { this.network = network; this.controllerIO = controlerIO; this.beamConfig = beamConfig; @@ -74,7 +77,7 @@ public PhyssimCalcLinkStats(Network network, OutputDirectoryHierarchy controlerI noOfBins = _noOfTimeBins.intValue() + 1; } - linkStats = new BeamCalcLinkStats(network); + linkStats = new BeamCalcLinkStats(network, ttcConfigGroup); } public void notifyIterationEnds(int iteration, TravelTimeCalculator travelTimeCalculator) { @@ -266,12 +269,10 @@ private Color getRandomColor() { return new Color(r, g, b); } - public void notifyIterationStarts(EventsManager eventsManager) { - + public void notifyIterationStarts(EventsManager eventsManager, TravelTimeCalculatorConfigGroup travelTimeCalculatorConfigGroup) { this.linkStats.reset(); - volumes = new VolumesAnalyzer(3600, 24 * 3600 - 1, network); + volumes = new VolumesAnalyzerFixed(3600, travelTimeCalculatorConfigGroup.getMaxTime() - 1, network); eventsManager.addHandler(volumes); - this.relativeSpeedFrequenciesPerBin.clear(); } diff --git a/src/main/java/beam/physsim/jdeqsim/AgentSimToPhysSimPlanConverter.java b/src/main/java/beam/physsim/jdeqsim/AgentSimToPhysSimPlanConverter.java index cb5a4c146b5..957005c8e17 100755 --- a/src/main/java/beam/physsim/jdeqsim/AgentSimToPhysSimPlanConverter.java +++ b/src/main/java/beam/physsim/jdeqsim/AgentSimToPhysSimPlanConverter.java @@ -9,6 +9,7 @@ import beam.analysis.via.EventWriterXML_viaCompatible; import beam.calibration.impl.example.CountsObjectiveFunction; import beam.router.BeamRouter; +import beam.sim.BeamServices; import beam.sim.common.GeoUtils; import beam.sim.config.BeamConfig; import beam.sim.metrics.MetricsSupport; @@ -80,26 +81,25 @@ public AgentSimToPhysSimPlanConverter(EventsManager eventsManager, TransportNetwork transportNetwork, OutputDirectoryHierarchy controlerIO, Scenario scenario, - GeoUtils geoUtils, - ActorRef router, - BeamConfig beamConfig) { + BeamServices beamServices) { eventsManager.addHandler(this); this.controlerIO = controlerIO; - this.router = router; - this.beamConfig = beamConfig; + this.router = beamServices.beamRouter(); + this.beamConfig = beamServices.beamConfig(); this.rand.setSeed(beamConfig.matsim().modules().global().randomSeed()); agentSimScenario = scenario; agentSimPhysSimInterfaceDebuggerEnabled = beamConfig.beam().physsim().jdeqsim().agentSimPhysSimInterfaceDebugger().enabled(); if (agentSimPhysSimInterfaceDebuggerEnabled) { log.warn("AgentSimPhysSimInterfaceDebugger is enabled"); - agentSimPhysSimInterfaceDebugger = new AgentSimPhysSimInterfaceDebugger(geoUtils, transportNetwork); + agentSimPhysSimInterfaceDebugger = new AgentSimPhysSimInterfaceDebugger(beamServices.geo(), transportNetwork); } preparePhysSimForNewIteration(); - linkStatsGraph = new PhyssimCalcLinkStats(agentSimScenario.getNetwork(), controlerIO, beamConfig); + linkStatsGraph = new PhyssimCalcLinkStats(agentSimScenario.getNetwork(), controlerIO, beamServices.beamConfig(), + beamServices.travelTimeCalculatorConfigGroup()); linkSpeedStatsGraph = new PhyssimCalcLinkSpeedStats(agentSimScenario.getNetwork(), controlerIO, beamConfig); linkSpeedDistributionStatsGraph = new PhyssimCalcLinkSpeedDistributionStats(agentSimScenario.getNetwork(), controlerIO, beamConfig); } @@ -140,7 +140,7 @@ private void setupActorsAndRunPhysSim(int iterationNumber) { config.setSimulationEndTime(beamConfig.matsim().modules().qsim().endTime()); JDEQSimulation jdeqSimulation = new JDEQSimulation(config, jdeqSimScenario, jdeqsimEvents); - linkStatsGraph.notifyIterationStarts(jdeqsimEvents); + linkStatsGraph.notifyIterationStarts(jdeqsimEvents, agentSimScenario.getConfig().travelTimeCalculator()); log.info("JDEQSim Start"); startSegment("jdeqsim-execution", "jdeqsim"); diff --git a/src/main/java/beam/utils/BeamCalcLinkStats.java b/src/main/java/beam/utils/BeamCalcLinkStats.java index d818e69ad8d..b00475c6a91 100755 --- a/src/main/java/beam/utils/BeamCalcLinkStats.java +++ b/src/main/java/beam/utils/BeamCalcLinkStats.java @@ -25,6 +25,7 @@ import org.matsim.api.core.v01.Id; import org.matsim.api.core.v01.network.Link; import org.matsim.api.core.v01.network.Network; +import org.matsim.core.config.groups.TravelTimeCalculatorConfigGroup; import org.matsim.core.router.util.TravelTime; import org.matsim.core.utils.io.IOUtils; import org.slf4j.Logger; @@ -35,6 +36,7 @@ import java.io.IOException; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.TimeUnit; public class BeamCalcLinkStats { @@ -50,10 +52,10 @@ public class BeamCalcLinkStats { private int count = 0; @Inject - public BeamCalcLinkStats(final Network network) { + public BeamCalcLinkStats(final Network network, final TravelTimeCalculatorConfigGroup ttConfigGroup) { this.network = network; this.linkData = new ConcurrentHashMap<>(); - this.nofHours = 24; + this.nofHours = (int)TimeUnit.SECONDS.toHours(ttConfigGroup.getMaxTime()); reset(); } diff --git a/src/main/java/beam/utils/VolumesAnalyzerFixed.java b/src/main/java/beam/utils/VolumesAnalyzerFixed.java new file mode 100644 index 00000000000..ba773a0b4eb --- /dev/null +++ b/src/main/java/beam/utils/VolumesAnalyzerFixed.java @@ -0,0 +1,52 @@ +package beam.utils; + +import org.apache.log4j.Logger; +import org.matsim.analysis.VolumesAnalyzer; +import org.matsim.api.core.v01.Id; +import org.matsim.api.core.v01.network.Link; +import org.matsim.api.core.v01.network.Network; + +import java.util.concurrent.TimeUnit; + +public class VolumesAnalyzerFixed extends VolumesAnalyzer { + private final static Logger log = Logger.getLogger(VolumesAnalyzerFixed.class); + + private final int timeBinSize; + private final int maxTime; + private final int maxSlotIndex; + private final int maxHour; + + public VolumesAnalyzerFixed(int timeBinSize, int maxTime, Network network) { + super(timeBinSize, maxTime, network); + this.timeBinSize = timeBinSize; + this.maxTime = maxTime; + this.maxSlotIndex = (this.maxTime / this.timeBinSize) + 1; + this.maxHour = (int)TimeUnit.SECONDS.toHours(this.maxTime + 1); + } + @Override + public double[] getVolumesPerHourForLink(final Id linkId) { + if (3600.0 % this.timeBinSize != 0) log.error("Volumes per hour and per link probably not correct!"); + + double[] volumes = new double[this.maxHour]; + + int[] volumesForLink = this.getVolumesForLink(linkId); + if (volumesForLink == null) return volumes; + + int slotsPerHour = (int)(3600.0 / this.timeBinSize); + for (int hour = 0; hour < this.maxHour; hour++) { + double time = hour * 3600.0; + for (int i = 0; i < slotsPerHour; i++) { + volumes[hour] += volumesForLink[this.getTimeSlotIndex(time)]; + time += this.timeBinSize; + } + } + return volumes; + } + + private int getTimeSlotIndex(final double time) { + if (time > this.maxTime) { + return this.maxSlotIndex; + } + return ((int)time / this.timeBinSize); + } +} diff --git a/src/main/scala/beam/router/LinkTravelTimeContainer.scala b/src/main/scala/beam/router/LinkTravelTimeContainer.scala index fa2b68c0fe3..b87554ced62 100755 --- a/src/main/scala/beam/router/LinkTravelTimeContainer.scala +++ b/src/main/scala/beam/router/LinkTravelTimeContainer.scala @@ -10,54 +10,58 @@ import org.matsim.api.core.v01.population.Person import org.matsim.core.router.util.TravelTime import org.matsim.vehicles.Vehicle -class LinkTravelTimeContainer(fileName: String, timeBinSizeInSeconds: Int) extends TravelTime with LazyLogging { +import scala.collection.mutable - private var linkTravelTimeMap: Map[Id[Link], Map[Int, Double]] = Map() +class LinkTravelTimeContainer(fileName: String, timeBinSizeInSeconds: Int, maxHour: Int) extends TravelTime with LazyLogging { + val linkTravelTimeMap: scala.collection.Map[Id[Link], Array[Double]] = loadLinkStats() - private def loadLinkStats(): Unit = { + def loadLinkStats(): scala.collection.Map[Id[Link], Array[Double]] = { + val start = System.currentTimeMillis() + val linkTravelTimeMap: mutable.HashMap[Id[Link], Array[Double]] = mutable.HashMap() logger.debug(s"Stats fileName -> $fileName is being loaded") val gzipStream = new GZIPInputStream(new FileInputStream(fileName)) val bufferedReader = new BufferedReader(new InputStreamReader(gzipStream)) -// Source.fromInputStream(gzipStream).getLines() -// .map(_.split(",")).filter(_ (7).equalsIgnoreCase("avg")).foreach(linkStats => { -// -// }) - - var line: String = null - - while ({ - line = bufferedReader.readLine - line != null - }) { - val linkStats = line.split(",") - - if (linkStats.length == 10 && "avg".equalsIgnoreCase(linkStats(7))) { - val linkId = Id.createLinkId(linkStats(0)) - val hour = linkStats(3).toDouble.toInt - val travelTime = linkStats(9).toDouble - - val travelTimes = linkTravelTimeMap.get(linkId) match { - case Some(linkTravelTime) => - linkTravelTime + (hour -> travelTime) - case None => - Map(hour -> travelTime) + try { + var line: String = null + while ({ + line = bufferedReader.readLine + line != null + }) { + val linkStats = line.split(",") + if (linkStats.length == 10 && "avg".equalsIgnoreCase(linkStats(7))) { + val linkId = Id.createLinkId(linkStats(0)) + val hour = linkStats(3).toDouble.toInt + val travelTime = linkStats(9).toDouble + linkTravelTimeMap.get(linkId) match { + case Some(travelTimePerHourArr) => + travelTimePerHourArr.update(hour, travelTime) + case None => + val travelTimePerHourArr = Array.ofDim[Double](maxHour) + travelTimePerHourArr.update(hour, travelTime) + linkTravelTimeMap.put(linkId, travelTimePerHourArr) + } } - linkTravelTimeMap += (linkId -> travelTimes) } } + finally { + bufferedReader.close() + gzipStream.close() + } + val end = System.currentTimeMillis() + logger.info("LinkTravelTimeMap is initialized in {} ms", end - start) - logger.debug("LinkTravelTimeMap is initialized") + linkTravelTimeMap } def getLinkTravelTime(link: Link, time: Double, person: Person, vehicle: Vehicle): Double = { linkTravelTimeMap.get(link.getId) match { - case Some(linkTravelTime) => - linkTravelTime.get(getSlot(time)) match { - case Some(travelTime) => - travelTime - case None => - link.getFreespeed + case Some(traveTimePerHour) => + val idx = getSlot(time) + if (idx < traveTimePerHour.size) traveTimePerHour(idx) + else { + logger.warn("Got {} as index for traveTimePerHour with max size {}. Something might be wrong!", idx, maxHour) + link.getFreespeed } case None => link.getFreespeed @@ -65,9 +69,6 @@ class LinkTravelTimeContainer(fileName: String, timeBinSizeInSeconds: Int) exten } private def getSlot(time: Double): Int = { - Math.round(Math.floor(time / timeBinSizeInSeconds)).toInt } - - loadLinkStats() } diff --git a/src/main/scala/beam/router/r5/R5RoutingWorker.scala b/src/main/scala/beam/router/r5/R5RoutingWorker.scala index 30a6f79e240..55531994f10 100755 --- a/src/main/scala/beam/router/r5/R5RoutingWorker.scala +++ b/src/main/scala/beam/router/r5/R5RoutingWorker.scala @@ -43,6 +43,7 @@ import com.typesafe.config.Config import org.matsim.api.core.v01.network.Network import org.matsim.api.core.v01.population.Person import org.matsim.api.core.v01.{Coord, Id} +import org.matsim.core.config.groups.TravelTimeCalculatorConfigGroup import org.matsim.core.controler.ControlerI import org.matsim.core.router.util.TravelTime import org.matsim.core.scenario.{MutableScenario, ScenarioUtils} @@ -123,6 +124,8 @@ class R5RoutingWorker(workerParams: WorkerParameters) extends Actor with ActorLo override def matsimServices: org.matsim.core.controler.MatsimServices = ??? override def rideHailIterationHistoryActor: akka.actor.ActorRef = ??? + + override val travelTimeCalculatorConfigGroup: TravelTimeCalculatorConfigGroup = ??? } val initializer = new TransitInitializer(beamServices, transportNetwork, scenario.getTransitVehicles) diff --git a/src/main/scala/beam/sim/BeamHelper.scala b/src/main/scala/beam/sim/BeamHelper.scala index d110d84ad2f..03cb30de88f 100755 --- a/src/main/scala/beam/sim/BeamHelper.scala +++ b/src/main/scala/beam/sim/BeamHelper.scala @@ -3,6 +3,7 @@ package beam.sim import java.io.FileOutputStream import java.nio.file.{Files, Paths, StandardCopyOption} import java.util.Properties +import java.util.concurrent.TimeUnit import beam.agentsim.agents.ridehail.RideHailSurgePricingManager import beam.agentsim.events.handling.BeamEventsHandling @@ -357,7 +358,8 @@ trait BeamHelper extends LazyLogging { val networkCoordinator = new NetworkCoordinator(beamConfig) networkCoordinator.loadNetwork() - val beamWarmStart = BeamWarmStart(beamConfig) + val maxHour = TimeUnit.SECONDS.toHours(new TravelTimeCalculatorConfigGroup().getMaxTime).toInt + val beamWarmStart = BeamWarmStart(beamConfig, maxHour) beamWarmStart.warmStartPopulation(matsimConfig) val scenario = ScenarioUtils.loadScenario(matsimConfig).asInstanceOf[MutableScenario] diff --git a/src/main/scala/beam/sim/BeamMobsim.scala b/src/main/scala/beam/sim/BeamMobsim.scala index 2b4f472053a..a92706f0410 100755 --- a/src/main/scala/beam/sim/BeamMobsim.scala +++ b/src/main/scala/beam/sim/BeamMobsim.scala @@ -12,11 +12,7 @@ import akka.pattern.ask import akka.util.Timeout import beam.agentsim.agents.BeamAgent.Finish import beam.agentsim.agents.modalbehaviors.DrivesVehicle.BeamVehicleStateUpdate -import beam.agentsim.agents.ridehail.RideHailManager.{ - BufferedRideHailRequestsTimeout, - NotifyIterationEnds, - RideHailAllocationManagerTimeout -} +import beam.agentsim.agents.ridehail.RideHailManager.{BufferedRideHailRequestsTimeout, NotifyIterationEnds, RideHailAllocationManagerTimeout} import beam.agentsim.agents.ridehail.{RideHailAgent, RideHailManager, RideHailSurgePricingManager} import beam.agentsim.agents.vehicles.EnergyEconomyAttributes.Powertrain import beam.agentsim.agents.vehicles._ @@ -70,6 +66,8 @@ class BeamMobsim @Inject()( val rideHailHouseholds: mutable.Set[Id[Household]] = mutable.Set() + val MaxHour: Int = 24 + var debugActorWithTimerActorRef: ActorRef = _ var debugActorWithTimerCancellable: Cancellable = _ /* @@ -358,7 +356,8 @@ class BeamMobsim @Inject()( Await.result(beamServices.beamRouter ? InitTransit(scheduler, parkingManager), timeout.duration) if (beamServices.iterationNumber == 0) { - val warmStart = BeamWarmStart(beamServices.beamConfig) + val maxHour = TimeUnit.SECONDS.toHours(beamServices.travelTimeCalculatorConfigGroup.getMaxTime).toInt + val warmStart = BeamWarmStart(beamServices.beamConfig, maxHour) warmStart.warmStartTravelTime(beamServices.beamRouter) } diff --git a/src/main/scala/beam/sim/BeamServices.scala b/src/main/scala/beam/sim/BeamServices.scala index 8b3ce672844..707cc0e57ee 100755 --- a/src/main/scala/beam/sim/BeamServices.scala +++ b/src/main/scala/beam/sim/BeamServices.scala @@ -20,6 +20,7 @@ import beam.utils.{DateUtils, FileUtils} import com.google.inject.{ImplementedBy, Inject, Injector} import org.matsim.api.core.v01.population.Person import org.matsim.api.core.v01.{Coord, Id} +import org.matsim.core.config.groups.TravelTimeCalculatorConfigGroup import org.matsim.core.controler._ import org.matsim.core.utils.collections.QuadTree import org.matsim.households.Household @@ -27,7 +28,6 @@ import org.slf4j.LoggerFactory import org.supercsv.io.CsvMapReader import org.supercsv.prefs.CsvPreference -import scala.collection.JavaConverters._ import scala.collection.concurrent.TrieMap import scala.concurrent.duration.FiniteDuration @@ -39,6 +39,8 @@ trait BeamServices extends ActorInject { val controler: ControlerI val beamConfig: BeamConfig + val travelTimeCalculatorConfigGroup: TravelTimeCalculatorConfigGroup + val geo: GeoUtils var modeChoiceCalculatorFactory: ModeChoiceCalculatorFactory val dates: DateUtils @@ -65,6 +67,8 @@ class BeamServicesImpl @Inject()(val injector: Injector) extends BeamServices { val geo: GeoUtils = injector.getInstance(classOf[GeoUtils]) + val travelTimeCalculatorConfigGroup: TravelTimeCalculatorConfigGroup = injector.getInstance(classOf[TravelTimeCalculatorConfigGroup]) + val dates: DateUtils = DateUtils( ZonedDateTime.parse(beamConfig.beam.routing.baseDate).toLocalDateTime, ZonedDateTime.parse(beamConfig.beam.routing.baseDate) diff --git a/src/main/scala/beam/sim/BeamSim.scala b/src/main/scala/beam/sim/BeamSim.scala index db2f1d05001..17f446fa3b9 100755 --- a/src/main/scala/beam/sim/BeamSim.scala +++ b/src/main/scala/beam/sim/BeamSim.scala @@ -112,9 +112,7 @@ class BeamSim @Inject()( transportNetwork, event.getServices.getControlerIO, scenario, - beamServices.geo, - beamServices.beamRouter, - beamServices.beamConfig + beamServices ) } diff --git a/src/main/scala/beam/sim/BeamWarmStart.scala b/src/main/scala/beam/sim/BeamWarmStart.scala index e84a437d7c4..95ebc86590e 100755 --- a/src/main/scala/beam/sim/BeamWarmStart.scala +++ b/src/main/scala/beam/sim/BeamWarmStart.scala @@ -17,7 +17,7 @@ import org.matsim.core.router.util.TravelTime import scala.compat.java8.StreamConverters._ -class BeamWarmStart private (beamConfig: BeamConfig) extends LazyLogging { +class BeamWarmStart private (beamConfig: BeamConfig, maxHour: Int) extends LazyLogging { private lazy val srcPath = beamConfig.beam.warmStart.path @@ -61,7 +61,6 @@ class BeamWarmStart private (beamConfig: BeamConfig) extends LazyLogging { case Some(statsPath) => if (Files.exists(Paths.get(statsPath))) { val file = loadPopulation(parentRunPath, statsPath) - matsimConfig.plans().setInputFile(file) logger.info("Population successfully warm started from {}", statsPath) } else { @@ -185,12 +184,12 @@ class BeamWarmStart private (beamConfig: BeamConfig) extends LazyLogging { private def getTravelTime(statsFile: String): TravelTime = { val binSize = beamConfig.beam.agentsim.timeBinSize - new LinkTravelTimeContainer(statsFile, binSize) + new LinkTravelTimeContainer(statsFile, binSize, maxHour) } } object BeamWarmStart { - def apply(beamConfig: BeamConfig): BeamWarmStart = new BeamWarmStart(beamConfig) + def apply(beamConfig: BeamConfig, maxHour: Int): BeamWarmStart = new BeamWarmStart(beamConfig, maxHour) } diff --git a/src/test/java/beam/analysis/physsim/PhyssimCalcLinkStatsTest.java b/src/test/java/beam/analysis/physsim/PhyssimCalcLinkStatsTest.java index eddad3c53bb..d2693361b98 100755 --- a/src/test/java/beam/analysis/physsim/PhyssimCalcLinkStatsTest.java +++ b/src/test/java/beam/analysis/physsim/PhyssimCalcLinkStatsTest.java @@ -16,7 +16,6 @@ import org.matsim.core.network.io.MatsimNetworkReader; import org.matsim.core.scenario.ScenarioUtils; import org.matsim.core.trafficmonitoring.TravelTimeCalculator; -import beam.utils.TestConfigUtils; import java.nio.file.Paths; import java.util.List; @@ -45,11 +44,12 @@ public static void createDummySimWithXML() { EventsManager eventsManager = EventsUtils.createEventsManager(); eventsManager.addHandler(travelTimeCalculator); - physsimCalcLinkStats = new PhyssimCalcLinkStats(network, null, BeamConfig.apply(TestConfigUtils.testConfig("test/input/equil-square/equil-0.001k.conf").withValue("beam.physsim.quick_fix_minCarSpeedInMetersPerSecond", ConfigValueFactory.fromAnyRef(0.0)))); + BeamConfig beamConfig = BeamConfig.apply(TestConfigUtils.testConfig("test/input/equil-square/equil-0.001k.conf").withValue("beam.physsim.quick_fix_minCarSpeedInMetersPerSecond", ConfigValueFactory.fromAnyRef(0.0))); + physsimCalcLinkStats = new PhyssimCalcLinkStats(network, null, beamConfig, defaultTravelTimeCalculator ); //physsimCalcLinkStats = new PhyssimCalcLinkStats(network, null, null); - physsimCalcLinkStats.notifyIterationStarts(eventsManager); + physsimCalcLinkStats.notifyIterationStarts(eventsManager, defaultTravelTimeCalculator); MatsimEventsReader matsimEventsReader = new MatsimEventsReader(eventsManager); matsimEventsReader.readFile(EVENTS_FILE_PATH); diff --git a/src/test/scala/beam/analysis/physsim/BeamCalcLinkStatsSpec.scala b/src/test/scala/beam/analysis/physsim/BeamCalcLinkStatsSpec.scala index f66d0454971..1f876ca2381 100644 --- a/src/test/scala/beam/analysis/physsim/BeamCalcLinkStatsSpec.scala +++ b/src/test/scala/beam/analysis/physsim/BeamCalcLinkStatsSpec.scala @@ -3,9 +3,8 @@ package beam.analysis.physsim import java.io.{BufferedInputStream, File, FileInputStream} import java.util.zip.GZIPInputStream -import beam.utils.BeamCalcLinkStats import beam.utils.TestConfigUtils.testOutputDir -import org.matsim.analysis.VolumesAnalyzer +import beam.utils.{BeamCalcLinkStats, VolumesAnalyzerFixed} import org.matsim.core.config.ConfigUtils import org.matsim.core.controler.{Controler, OutputDirectoryHierarchy} import org.matsim.core.events.{EventsUtils, MatsimEventsReader} @@ -27,7 +26,7 @@ class BeamCalcLinkStatsSpec extends WordSpecLike with Matchers with BeforeAndAft private var beamCalcLinkStats: BeamCalcLinkStats = _ - private val TFHOURS = 25 + private val TFHOURS = 31 private val TYPESTATS = 3 private var fileCsvPath: String = "" @@ -53,9 +52,9 @@ class BeamCalcLinkStatsSpec extends WordSpecLike with Matchers with BeforeAndAft val events = EventsUtils.createEventsManager() events.addHandler(travelTimeCalculator) - beamCalcLinkStats = new BeamCalcLinkStats(network) + beamCalcLinkStats = new BeamCalcLinkStats(network, ttccg) beamCalcLinkStats.reset() - val volumes = new VolumesAnalyzer(3600, 24 * 3600 - 1, network) + val volumes = new VolumesAnalyzerFixed(3600, ttccg.getMaxTime() - 1, network) events.addHandler(volumes) val reader = new MatsimEventsReader(events) @@ -70,13 +69,13 @@ class BeamCalcLinkStatsSpec extends WordSpecLike with Matchers with BeforeAndAft "BeamCalcLinksStats" must { - "Output file contain all links * 25 Hours * 3 StatType" in { + "Output file contain all links * 31 Hours * 3 StatType" in { val expetedResult = countLinksFromFileXML(NETWORK_FILE_PATH) * TFHOURS * TYPESTATS val actualResult = gzToBufferedSource(fileCsvPath).getLines().size expetedResult shouldBe (actualResult - 1) } - "Each link contains 75 records" in { + "Each link contains 93 records" in { val expetedResult = TFHOURS * TYPESTATS val map = mapGroupRecordForLinks(0, fileCsvPath) map.foreach { diff --git a/src/test/scala/beam/router/WarmStartRoutingSpec.scala b/src/test/scala/beam/router/WarmStartRoutingSpec.scala index abbd9c2e5a5..280571cc527 100755 --- a/src/test/scala/beam/router/WarmStartRoutingSpec.scala +++ b/src/test/scala/beam/router/WarmStartRoutingSpec.scala @@ -1,6 +1,7 @@ package beam.router import java.time.ZonedDateTime +import java.util.concurrent.TimeUnit import akka.actor.{ActorIdentity, ActorRef, ActorSystem, Identify} import akka.testkit.{ImplicitSender, TestKit} @@ -17,11 +18,12 @@ import beam.router.r5.NetworkCoordinator import beam.sim.common.GeoUtilsImpl import beam.sim.config.{BeamConfig, MatSimBeamConfigBuilder} import beam.sim.{BeamHelper, BeamServices, BeamWarmStart} -import beam.utils.{DateUtils, FileUtils} import beam.utils.TestConfigUtils.testConfig +import beam.utils.{DateUtils, FileUtils} import com.typesafe.config.{Config, ConfigValueFactory} -import org.matsim.api.core.v01.{Coord, Id, Scenario} +import org.matsim.api.core.v01.{Id, Scenario} import org.matsim.core.config.ConfigUtils +import org.matsim.core.config.groups.TravelTimeCalculatorConfigGroup import org.matsim.core.controler.AbstractModule import org.matsim.core.events.EventsManagerImpl import org.matsim.core.scenario.{MutableScenario, ScenarioUtils} @@ -60,6 +62,8 @@ class WarmStartRoutingSpec var config: Config = _ var iterationConfig: Config = _ + val maxHour = TimeUnit.SECONDS.toHours(new TravelTimeCalculatorConfigGroup().getMaxTime).toInt + override def beforeAll: Unit = { config = baseConfig .withValue("beam.warmStart.enabled", ConfigValueFactory.fromAnyRef(true)) @@ -168,7 +172,7 @@ class WarmStartRoutingSpec val carOption = response.itineraries.find(_.tripClassifier == CAR).get assert(carOption.totalTravelTimeInSecs == 76) - BeamWarmStart(services.beamConfig).warmStartTravelTime(services.beamRouter) + BeamWarmStart(services.beamConfig, maxHour).warmStartTravelTime(services.beamRouter) router ! RoutingRequest( origin, @@ -195,7 +199,8 @@ class WarmStartRoutingSpec BeamWarmStart(BeamConfig( - config.withValue("beam.warmStart.path", ConfigValueFactory.fromAnyRef("test/input/beamville/test-data/double-time"))) + config.withValue("beam.warmStart.path", ConfigValueFactory.fromAnyRef("test/input/beamville/test-data/double-time"))), + maxHour ).warmStartTravelTime(services.beamRouter) router ! RoutingRequest( @@ -217,7 +222,7 @@ class WarmStartRoutingSpec val carOption = response.itineraries.find(_.tripClassifier == CAR).get assert(carOption.totalTravelTimeInSecs == 110) - BeamWarmStart(BeamConfig(iterationConfig)).warmStartTravelTime(services.beamRouter) + BeamWarmStart(BeamConfig(iterationConfig), maxHour).warmStartTravelTime(services.beamRouter) router1 ! RoutingRequest( origin, destination, @@ -241,7 +246,8 @@ class WarmStartRoutingSpec "show an increase in travel time after three iterations if warm start times are cut in half" in { BeamWarmStart(BeamConfig( - config.withValue("beam.warmStart.path", ConfigValueFactory.fromAnyRef("test/input/beamville/test-data/half-time"))) + config.withValue("beam.warmStart.path", ConfigValueFactory.fromAnyRef("test/input/beamville/test-data/half-time"))), + maxHour ).warmStartTravelTime(services.beamRouter) router ! RoutingRequest( @@ -262,7 +268,7 @@ class WarmStartRoutingSpec assert(response.itineraries.exists(_.tripClassifier == CAR)) val carOption = response.itineraries.find(_.tripClassifier == CAR).get - BeamWarmStart(BeamConfig(iterationConfig)).warmStartTravelTime(services.beamRouter) + BeamWarmStart(BeamConfig(iterationConfig), maxHour).warmStartTravelTime(services.beamRouter) router1 ! RoutingRequest( origin, destination, @@ -310,7 +316,8 @@ class WarmStartRoutingSpec val travelTime1 = carOption.beamLegs().head.travelPath.linkTravelTime.reduce((x,y) => x+y) BeamWarmStart(BeamConfig( - config.withValue("beam.warmStart.path", ConfigValueFactory.fromAnyRef("test/input/beamville/test-data/reduce10x-time"))) + config.withValue("beam.warmStart.path", ConfigValueFactory.fromAnyRef("test/input/beamville/test-data/reduce10x-time"))), + maxHour ).warmStartTravelTime(services.beamRouter) router ! RoutingRequest( diff --git a/src/test/scala/beam/sim/BeamWarmStartSpec.scala b/src/test/scala/beam/sim/BeamWarmStartSpec.scala index 3c8cfa63f0d..fb09d0a04a1 100644 --- a/src/test/scala/beam/sim/BeamWarmStartSpec.scala +++ b/src/test/scala/beam/sim/BeamWarmStartSpec.scala @@ -2,12 +2,14 @@ package beam.sim import java.io.IOException import java.nio.file.{Files, Path, Paths} +import java.util.concurrent.TimeUnit import beam.integration.IntegrationSpecCommon import beam.sim.BeamWarmStartSpec._ import beam.sim.config.BeamConfig import com.typesafe.config.ConfigValueFactory import org.apache.commons.io.FileUtils.getTempDirectoryPath +import org.matsim.core.config.groups.TravelTimeCalculatorConfigGroup import org.scalatest.{BeforeAndAfterAll, Matchers, WordSpecLike} import org.slf4j.LoggerFactory @@ -259,7 +261,8 @@ class BeamWarmStartSpec extends WordSpecLike with Matchers with BeforeAndAfterAl .withValue("beam.warmStart.enabled", ConfigValueFactory.fromAnyRef(true)) .withValue("beam.warmStart.path", ConfigValueFactory.fromAnyRef(casePath.toString)) .resolve() - BeamWarmStart(BeamConfig(conf)) + val maxHour = TimeUnit.SECONDS.toHours(new TravelTimeCalculatorConfigGroup().getMaxTime).toInt + BeamWarmStart(BeamConfig(conf), maxHour) } }