From c3085d9f22a49374d761507fef7fb802679ccb24 Mon Sep 17 00:00:00 2001 From: Thomas Date: Tue, 6 Sep 2022 15:58:49 +0200 Subject: [PATCH 1/9] explicitly track destination poi type --- .../edu/ie3/mobsim/MobilitySimulator.scala | 2 +- .../mobsim/io/geodata/PointOfInterest.scala | 2 - .../ie3/mobsim/model/ChargingBehavior.scala | 4 +- .../ie3/mobsim/model/ElectricVehicle.scala | 25 ++++++--- .../edu/ie3/mobsim/model/TripSimulation.scala | 55 ++++++++++++++----- .../ie3/mobsim/MobilitySimulatorSpec.scala | 2 + .../mobsim/MobilitySimulatorTestData.scala | 6 +- .../mobsim/model/ChargingBehaviorSpec.scala | 29 ++++++++++ .../model/ChargingBehaviorTestData.scala | 7 +++ .../mobsim/model/ElectricVehicleSpec.scala | 9 ++- .../ie3/mobsim/model/TripSimulationSpec.scala | 24 +++++++- .../edu/ie3/mobsim/utils/IoUtilsSpec.scala | 3 +- 12 files changed, 135 insertions(+), 33 deletions(-) diff --git a/src/main/scala/edu/ie3/mobsim/MobilitySimulator.scala b/src/main/scala/edu/ie3/mobsim/MobilitySimulator.scala index a1c9d243..0366b16e 100644 --- a/src/main/scala/edu/ie3/mobsim/MobilitySimulator.scala +++ b/src/main/scala/edu/ie3/mobsim/MobilitySimulator.scala @@ -424,7 +424,7 @@ final class MobilitySimulator( } else { logger.debug( s"${ev.getId} could not be charged at destination ${ev.destinationPoi} " + - s"(${ev.getDestinationPoiType}) because all charging points " + + s"(${ev.destinationPoiType}) because all charging points " + s"at $cs were taken." ) None diff --git a/src/main/scala/edu/ie3/mobsim/io/geodata/PointOfInterest.scala b/src/main/scala/edu/ie3/mobsim/io/geodata/PointOfInterest.scala index 2861a7b8..a785046d 100644 --- a/src/main/scala/edu/ie3/mobsim/io/geodata/PointOfInterest.scala +++ b/src/main/scala/edu/ie3/mobsim/io/geodata/PointOfInterest.scala @@ -59,8 +59,6 @@ final case class PointOfInterest( else -1 } - def getPoiType: PoiTypeDictionary.Value = - PoiTypeDictionary.apply(categoricalLocation) } case object PointOfInterest { diff --git a/src/main/scala/edu/ie3/mobsim/model/ChargingBehavior.scala b/src/main/scala/edu/ie3/mobsim/model/ChargingBehavior.scala index c2334d20..8aa6e14c 100644 --- a/src/main/scala/edu/ie3/mobsim/model/ChargingBehavior.scala +++ b/src/main/scala/edu/ie3/mobsim/model/ChargingBehavior.scala @@ -69,8 +69,8 @@ object ChargingBehavior extends LazyLogging { if (ev.destinationPoi.nearestChargingStations.nonEmpty) { /* Always charge if the EV makes charging stop at charging hub */ if ( - ev.getDestinationPoiType == PoiEnums.PoiTypeDictionary.CHARGING_HUB_TOWN - || ev.getDestinationPoiType == PoiEnums.PoiTypeDictionary.CHARGING_HUB_HIGHWAY + ev.destinationPoiType == PoiEnums.PoiTypeDictionary.CHARGING_HUB_TOWN + || ev.destinationPoiType == PoiEnums.PoiTypeDictionary.CHARGING_HUB_HIGHWAY ) { logger.debug( s"${ev.getId} arrives at charging hub and wants to start charging." diff --git a/src/main/scala/edu/ie3/mobsim/model/ElectricVehicle.scala b/src/main/scala/edu/ie3/mobsim/model/ElectricVehicle.scala index 6ff9c056..e8c990ea 100644 --- a/src/main/scala/edu/ie3/mobsim/model/ElectricVehicle.scala +++ b/src/main/scala/edu/ie3/mobsim/model/ElectricVehicle.scala @@ -37,12 +37,14 @@ final case class ElectricVehicle( workPoi: PointOfInterest, storedEnergy: ComparableQuantity[Energy], destinationPoi: PointOfInterest, + destinationPoiType: PoiTypeDictionary.Value, parkingTimeStart: ZonedDateTime, departureTime: ZonedDateTime, chargingAtHomePossible: Boolean, chosenChargingStation: Option[UUID], chargingAtSimona: Boolean, finalDestinationPoi: Option[PointOfInterest], + finalDestinationPoiType: Option[PoiTypeDictionary.Value], remainingDistanceAfterChargingHub: Option[ ComparableQuantity[Length] ], @@ -62,11 +64,6 @@ final case class ElectricVehicle( def getStoredEnergy: ComparableQuantity[Energy] = storedEnergy - def getDestinationPoiType: PoiTypeDictionary.Value = destinationPoi.getPoiType - - def getFinalDestinationPoiType: Option[PoiTypeDictionary.Value] = - finalDestinationPoi.map(_.getPoiType) - def getDepartureTick: java.lang.Long = toTick(simulationStart, departureTime) /** @param storedEnergy @@ -85,12 +82,14 @@ final case class ElectricVehicle( def copyWith( storedEnergy: ComparableQuantity[Energy], destinationPoi: PointOfInterest, + destinationPoiType: PoiTypeDictionary.Value, parkingTimeStart: ZonedDateTime, departureTime: ZonedDateTime ): ElectricVehicle = copy( storedEnergy = storedEnergy, destinationPoi = destinationPoi, + destinationPoiType = destinationPoiType, parkingTimeStart = parkingTimeStart, departureTime = departureTime ) @@ -109,10 +108,18 @@ final case class ElectricVehicle( copy(chargingAtSimona = false) } - def setFinalDestinationPoi( - destinationPoi: Option[PointOfInterest] + def resetFinalDestination(): ElectricVehicle = { + copy(finalDestinationPoi = None, finalDestinationPoiType = None) + } + + def setFinalDestination( + destinationPoi: PointOfInterest, + destinationPoiType: PoiTypeDictionary.Value ): ElectricVehicle = { - copy(finalDestinationPoi = destinationPoi) + copy( + finalDestinationPoi = Some(destinationPoi), + finalDestinationPoiType = Some(destinationPoiType) + ) } def setRemainingDistanceAfterChargingHub( @@ -409,6 +416,7 @@ case object ElectricVehicle extends LazyLogging { homePoi = homePoi, workPoi = workPoi, storedEnergy = evType.capacity, + destinationPoiType = PoiTypeDictionary.HOME, destinationPoi = homePoi, // is updated when trip is sampled parkingTimeStart = simulationStart, // EV starts parking at first tick departureTime = @@ -419,6 +427,7 @@ case object ElectricVehicle extends LazyLogging { chosenChargingStation = None, chargingAtSimona = false, finalDestinationPoi = None, + finalDestinationPoiType = None, remainingDistanceAfterChargingHub = None, chargingPricesMemory = Queue[Double]() ) diff --git a/src/main/scala/edu/ie3/mobsim/model/TripSimulation.scala b/src/main/scala/edu/ie3/mobsim/model/TripSimulation.scala index 8f695d46..e39bab65 100644 --- a/src/main/scala/edu/ie3/mobsim/model/TripSimulation.scala +++ b/src/main/scala/edu/ie3/mobsim/model/TripSimulation.scala @@ -86,7 +86,7 @@ object TripSimulation extends LazyLogging { /* Check if SoC is < 70% and EV parks at a charging hub -> if yes, let EV charge longer, do not depart */ if ( socAtStartOfTrip < SOC_OF_70_PERCENT && - (ev.getDestinationPoiType == PoiEnums.PoiTypeDictionary.CHARGING_HUB_TOWN || ev.getDestinationPoiType == PoiEnums.PoiTypeDictionary.CHARGING_HUB_HIGHWAY) + (ev.destinationPoiType == PoiEnums.PoiTypeDictionary.CHARGING_HUB_TOWN || ev.destinationPoiType == PoiEnums.PoiTypeDictionary.CHARGING_HUB_HIGHWAY) ) { // logger.info( s"${ev.getId} has SoC < 70% at planned departure at charging hub, so it stays a bit longer..." @@ -134,6 +134,7 @@ object TripSimulation extends LazyLogging { } /* Get planned POI information and distance for the trip */ val ( + plannedDestinationPoiType, plannedDestinationPoi, plannedDrivingDistance, changedEv @@ -146,11 +147,12 @@ object TripSimulation extends LazyLogging { tripProbabilities.tripDistance ) match { case TargetProperties( + poiType, poi, distance, alteredEv ) => - (poi, distance, alteredEv) + (poiType, poi, distance, alteredEv) } /* Simulate the planned trip */ @@ -162,7 +164,7 @@ object TripSimulation extends LazyLogging { changedEv, currentTime, plannedDrivingDistance, - plannedDestinationPoi.getPoiType, + plannedDestinationPoiType, tripProbabilities.drivingSpeed, tripProbabilities.firstDepartureOfDay, tripProbabilities.lastTripOfDay, @@ -201,6 +203,7 @@ object TripSimulation extends LazyLogging { socAtArrival, plannedDrivingDistance, plannedDestinationPoi, + plannedDestinationPoiType, chargingStations, tripProbabilities.drivingSpeed ) @@ -212,6 +215,7 @@ object TripSimulation extends LazyLogging { changedEv, plannedStoredEnergyEndOfTrip, plannedDestinationPoi, + plannedDestinationPoiType, plannedParkingTimeStart, plannedDepartureTime ) @@ -228,6 +232,7 @@ object TripSimulation extends LazyLogging { socAtArrival, plannedDrivingDistance, plannedDestinationPoi, + plannedDestinationPoiType, chargingStations, tripProbabilities.drivingSpeed ) @@ -244,6 +249,7 @@ object TripSimulation extends LazyLogging { socAtArrival, plannedDrivingDistance, plannedDestinationPoi, + plannedDestinationPoiType, chargingStations, tripProbabilities.drivingSpeed ) @@ -255,6 +261,7 @@ object TripSimulation extends LazyLogging { changedEv, plannedStoredEnergyEndOfTrip, plannedDestinationPoi, + plannedDestinationPoiType, plannedParkingTimeStart, plannedDepartureTime ) @@ -268,6 +275,7 @@ object TripSimulation extends LazyLogging { changedEv, plannedStoredEnergyEndOfTrip, plannedDestinationPoi, + plannedDestinationPoiType, plannedParkingTimeStart, plannedDepartureTime ) @@ -308,7 +316,7 @@ object TripSimulation extends LazyLogging { poiTransition: PoiTransition, tripDistance: TripDistance ): TargetProperties = { - val currentPoiType = ev.getDestinationPoiType + val currentPoiType = ev.destinationPoiType if ( currentPoiType == PoiTypeDictionary.CHARGING_HUB_TOWN || currentPoiType == PoiTypeDictionary.CHARGING_HUB_HIGHWAY ) { @@ -338,6 +346,7 @@ object TripSimulation extends LazyLogging { * to return updates of the vehicle. */ private final case class TargetProperties( + poiType: PoiTypeDictionary.Value, poi: PointOfInterest, distance: ComparableQuantity[Length], ev: ElectricVehicle @@ -358,31 +367,38 @@ object TripSimulation extends LazyLogging { ): TargetProperties = ( ev.finalDestinationPoi, + ev.finalDestinationPoiType, ev.remainingDistanceAfterChargingHub ) match { case ( Some(destinationPoi), + Some(destinationPoiType), Some(remainingDistance) ) => /* Reset saved values */ val updatedEv: ElectricVehicle = ev - .setFinalDestinationPoi(None) + .resetFinalDestination() .setRemainingDistanceAfterChargingHub(None) /* Return the determined values */ TargetProperties( + destinationPoiType, destinationPoi, remainingDistance, updatedEv ) - case (None, _) => + case (None, _, _) => throw TripException( "Cannot resume trip, as the previous destination POI is unknown." ) - case (Some(_), None) => + case (Some(_), Some(_), None) => throw TripException( "Cannot resume trip, as the remaining distance is unknown." ) + case (_, None, _) => + throw TripException( + "Cannot resume trip, as the final destination poi type is unknown-" + ) } /** Sample a new target for the trip @@ -416,7 +432,7 @@ object TripSimulation extends LazyLogging { tripDistance: TripDistance ): TargetProperties = { /* Save previous POI type (is required for later calculations) */ - val previousPoiType = ev.getDestinationPoiType + val previousPoiType = ev.destinationPoiType /* Sample next destination POI type */ val destinationPoiType = @@ -440,6 +456,7 @@ object TripSimulation extends LazyLogging { destinationPoiType ) TargetProperties( + destinationPoiType, poi, drivingDistance, ev @@ -532,7 +549,8 @@ object TripSimulation extends LazyLogging { val nextCategoricalLocation = categoricalLocation.sample(time, destinationPoiType) categoricalLocationToPdf.get(nextCategoricalLocation) match { - case Some(pdf) => pdf.sample() + case Some(pdf) => + pdf.sample() case None => if (depth > maxDepth) { throw TripException( @@ -663,6 +681,7 @@ object TripSimulation extends LazyLogging { socAtChargingHubArrival: Double, plannedDrivingDistance: ComparableQuantity[Length], plannedDestinationPoi: PointOfInterest, + plannedDestinationPoiType: PoiTypeDictionary.Value, chargingStations: Seq[ChargingStation], drivingSpeed: DrivingSpeed ): ElectricVehicle = { @@ -730,12 +749,13 @@ object TripSimulation extends LazyLogging { .setRemainingDistanceAfterChargingHub( Some(plannedDrivingDistance.subtract(newDrivingDistance)) ) - .setFinalDestinationPoi(Some(plannedDestinationPoi)) + .setFinalDestination(plannedDestinationPoi, plannedDestinationPoiType) /* Create updated EV */ updatedEv.copyWith( newStoredEnergyEndOfTrip, newDestinationPoi, + chargingHubPoiType, newParkingTimeStart, newDepartureTime ) @@ -776,6 +796,7 @@ object TripSimulation extends LazyLogging { socAtChargingHubArrival: Double, plannedDrivingDistance: ComparableQuantity[Length], plannedDestinationPoi: PointOfInterest, + plannedDestinationPoiType: PoiTypeDictionary.Value, chargingStations: Seq[ChargingStation], drivingSpeed: DrivingSpeed ): ElectricVehicle = { @@ -839,12 +860,13 @@ object TripSimulation extends LazyLogging { .setRemainingDistanceAfterChargingHub( Some(plannedDrivingDistance.subtract(newDrivingDistance)) ) - .setFinalDestinationPoi(Some(plannedDestinationPoi)) + .setFinalDestination(plannedDestinationPoi, plannedDestinationPoiType) /* Create updated EV */ updatedEv.copyWith( newStoredEnergyEndOfTrip, newDestinationPoi, + chargingHubPoiType, newParkingTimeStart, newDepartureTime ) @@ -944,13 +966,14 @@ object TripSimulation extends LazyLogging { ev: ElectricVehicle, plannedStoredEnergyEndOfTrip: ComparableQuantity[Energy], plannedDestinationPoi: PointOfInterest, + plannedDestinationPoiType: PoiTypeDictionary.Value, plannedParkingTimeStart: ZonedDateTime, plannedDepartureTime: ZonedDateTime ): ElectricVehicle = { /* Because there is no stop at a charging hub, no trip values need to be saved */ val updatedEv: ElectricVehicle = ev - .setFinalDestinationPoi(None) + .resetFinalDestination() .setRemainingDistanceAfterChargingHub(None) if ( @@ -969,6 +992,7 @@ object TripSimulation extends LazyLogging { updatedEv.copyWith( plannedStoredEnergyEndOfTrip, plannedDestinationPoi, + plannedDestinationPoiType, plannedParkingTimeStart, plannedDepartureTime ) @@ -1004,8 +1028,8 @@ object TripSimulation extends LazyLogging { val parkingTimeStart: ZonedDateTime = currentTime.plusMinutes(1) val departureTime: ZonedDateTime = if ( - ev.getDestinationPoiType == PoiTypeDictionary.CHARGING_HUB_TOWN - || ev.getDestinationPoiType == PoiTypeDictionary.CHARGING_HUB_HIGHWAY + ev.destinationPoiType == PoiTypeDictionary.CHARGING_HUB_TOWN + || ev.destinationPoiType == PoiTypeDictionary.CHARGING_HUB_HIGHWAY ) { parkingTimeStart.plusMinutes( calculateChargingTimeAtChargingHub( @@ -1017,7 +1041,7 @@ object TripSimulation extends LazyLogging { ) } else { calculateDepartureTime( - ev.getDestinationPoiType, + ev.destinationPoiType, parkingTimeStart, firstDepartureOfDay, lastTripOfDay, @@ -1029,6 +1053,7 @@ object TripSimulation extends LazyLogging { ev.copyWith( ev.getStoredEnergy, ev.destinationPoi, + ev.destinationPoiType, parkingTimeStart, departureTime ) diff --git a/src/test/scala/edu/ie3/mobsim/MobilitySimulatorSpec.scala b/src/test/scala/edu/ie3/mobsim/MobilitySimulatorSpec.scala index e021f717..07277bce 100644 --- a/src/test/scala/edu/ie3/mobsim/MobilitySimulatorSpec.scala +++ b/src/test/scala/edu/ie3/mobsim/MobilitySimulatorSpec.scala @@ -7,6 +7,7 @@ package edu.ie3.mobsim import edu.ie3.mobsim.MobilitySimulator.Movement +import edu.ie3.mobsim.io.geodata.PoiEnums.PoiTypeDictionary import edu.ie3.mobsim.model.ElectricVehicle import edu.ie3.test.common.UnitSpec @@ -112,6 +113,7 @@ class MobilitySimulatorSpec extends UnitSpec with MobilitySimulatorTestData { ev.copy( storedEnergy = half, destinationPoi = workPoi, + destinationPoiType = PoiTypeDictionary.WORK, parkingTimeStart = givenSimulationStart.plusHours(-4), departureTime = givenSimulationStart, chargingAtSimona = false, diff --git a/src/test/scala/edu/ie3/mobsim/MobilitySimulatorTestData.scala b/src/test/scala/edu/ie3/mobsim/MobilitySimulatorTestData.scala index 52411cec..e7bdddcd 100644 --- a/src/test/scala/edu/ie3/mobsim/MobilitySimulatorTestData.scala +++ b/src/test/scala/edu/ie3/mobsim/MobilitySimulatorTestData.scala @@ -7,6 +7,7 @@ package edu.ie3.mobsim import akka.actor.ActorRef +import edu.ie3.mobsim.io.geodata.PoiEnums.PoiTypeDictionary import edu.ie3.mobsim.io.probabilities.TripProbabilities import edu.ie3.mobsim.model.ElectricVehicle import edu.ie3.mobsim.utils.IoUtilsTestData @@ -27,6 +28,7 @@ trait MobilitySimulatorTestData extends IoUtilsTestData { ev.copy( storedEnergy = zero, destinationPoi = charging_hub_highwayPoi, + destinationPoiType = PoiTypeDictionary.CHARGING_HUB_HIGHWAY, parkingTimeStart = givenSimulationStart, departureTime = givenSimulationStart.plusHours(5) ) @@ -39,6 +41,7 @@ trait MobilitySimulatorTestData extends IoUtilsTestData { ev.copy( storedEnergy = half, destinationPoi = workPoi, + destinationPoiType = PoiTypeDictionary.WORK, parkingTimeStart = givenSimulationStart.plusHours(-4), departureTime = givenSimulationStart ).setChargingAtSimona() @@ -59,7 +62,8 @@ trait MobilitySimulatorTestData extends IoUtilsTestData { protected val arrivingEv: ElectricVehicle = { ev1.copy( - destinationPoi = charging_hub_highwayPoi + destinationPoi = charging_hub_highwayPoi, + destinationPoiType = PoiTypeDictionary.CHARGING_HUB_HIGHWAY ) } diff --git a/src/test/scala/edu/ie3/mobsim/model/ChargingBehaviorSpec.scala b/src/test/scala/edu/ie3/mobsim/model/ChargingBehaviorSpec.scala index cdafda0f..d889663b 100644 --- a/src/test/scala/edu/ie3/mobsim/model/ChargingBehaviorSpec.scala +++ b/src/test/scala/edu/ie3/mobsim/model/ChargingBehaviorSpec.scala @@ -6,6 +6,7 @@ package edu.ie3.mobsim.model +import edu.ie3.mobsim.io.geodata.PoiEnums.PoiTypeDictionary import edu.ie3.test.common.UnitSpec import edu.ie3.util.quantities.PowerSystemUnits import tech.units.indriya.quantity.Quantities @@ -80,6 +81,7 @@ class ChargingBehaviorSpec extends UnitSpec with ChargingBehaviorTestData { ( "soc", "destinationPoi", + "destinationPoiType", "isChargingAtHomePossible", "departureTime", "expectedResult" @@ -89,6 +91,7 @@ class ChargingBehaviorSpec extends UnitSpec with ChargingBehaviorTestData { // not long enough -> does not want to charge Quantities.getQuantity(39, PowerSystemUnits.KILOWATTHOUR), poiHome, + PoiTypeDictionary.HOME, true, parkingTimeStart.plusMinutes(14), false @@ -98,6 +101,7 @@ class ChargingBehaviorSpec extends UnitSpec with ChargingBehaviorTestData { // soc under lower threshold and stays long enough -> wants to charge Quantities.getQuantity(39, PowerSystemUnits.KILOWATTHOUR), poiHome, + PoiTypeDictionary.HOME, true, parkingTimeStart.plusMinutes(15), true @@ -107,6 +111,7 @@ class ChargingBehaviorSpec extends UnitSpec with ChargingBehaviorTestData { // soc over upper threshold -> does not want to charge Quantities.getQuantity(86, PowerSystemUnits.KILOWATTHOUR), poiHome, + PoiTypeDictionary.HOME, true, parkingTimeStart.plusMinutes(15), false @@ -116,6 +121,7 @@ class ChargingBehaviorSpec extends UnitSpec with ChargingBehaviorTestData { // is under lower threshold -> wants to charge Quantities.getQuantity(39, PowerSystemUnits.KILOWATTHOUR), workPoi, + PoiTypeDictionary.WORK, true, parkingTimeStart.plusMinutes(15), true @@ -125,6 +131,7 @@ class ChargingBehaviorSpec extends UnitSpec with ChargingBehaviorTestData { // is over upper threshold -> does not want to charge Quantities.getQuantity(86, PowerSystemUnits.KILOWATTHOUR), workPoi, + PoiTypeDictionary.WORK, true, parkingTimeStart.plusMinutes(15), false @@ -134,6 +141,7 @@ class ChargingBehaviorSpec extends UnitSpec with ChargingBehaviorTestData { // soc under lower threshold -> wants to charge Quantities.getQuantity(29, PowerSystemUnits.KILOWATTHOUR), supermarketPoi, + PoiTypeDictionary.SHOPPING, true, parkingTimeStart.plusMinutes(15), true @@ -143,6 +151,7 @@ class ChargingBehaviorSpec extends UnitSpec with ChargingBehaviorTestData { // soc over upper threshold -> does not want to charge Quantities.getQuantity(51, PowerSystemUnits.KILOWATTHOUR), supermarketPoi, + PoiTypeDictionary.SHOPPING, true, parkingTimeStart.plusMinutes(15), false @@ -152,6 +161,7 @@ class ChargingBehaviorSpec extends UnitSpec with ChargingBehaviorTestData { // soc has soc under lower threshold -> wants to charge Quantities.getQuantity(39, PowerSystemUnits.KILOWATTHOUR), poiHome, + PoiTypeDictionary.HOME, false, parkingTimeStart.plusMinutes(15), true @@ -161,6 +171,7 @@ class ChargingBehaviorSpec extends UnitSpec with ChargingBehaviorTestData { // soc over upper threshold -> does not want to charge Quantities.getQuantity(86, PowerSystemUnits.KILOWATTHOUR), poiHome, + PoiTypeDictionary.HOME, false, parkingTimeStart.plusMinutes(15), false @@ -170,6 +181,7 @@ class ChargingBehaviorSpec extends UnitSpec with ChargingBehaviorTestData { // soc under lower threshold -> wants to charge Quantities.getQuantity(39, PowerSystemUnits.KILOWATTHOUR), workPoi, + PoiTypeDictionary.WORK, false, parkingTimeStart.plusMinutes(15), true @@ -179,6 +191,7 @@ class ChargingBehaviorSpec extends UnitSpec with ChargingBehaviorTestData { // soc over upper threshold -> does not want to charge Quantities.getQuantity(86, PowerSystemUnits.KILOWATTHOUR), workPoi, + PoiTypeDictionary.WORK, false, parkingTimeStart.plusMinutes(15), false @@ -188,6 +201,7 @@ class ChargingBehaviorSpec extends UnitSpec with ChargingBehaviorTestData { // soc under lower threshold -> wants to charge Quantities.getQuantity(29, PowerSystemUnits.KILOWATTHOUR), supermarketPoi, + PoiTypeDictionary.SHOPPING, false, parkingTimeStart.plusMinutes(15), true @@ -197,6 +211,7 @@ class ChargingBehaviorSpec extends UnitSpec with ChargingBehaviorTestData { // soc over upper threshold -> does not want to charge Quantities.getQuantity(76, PowerSystemUnits.KILOWATTHOUR), supermarketPoi, + PoiTypeDictionary.SHOPPING, false, parkingTimeStart.plusMinutes(15), false @@ -206,6 +221,7 @@ class ChargingBehaviorSpec extends UnitSpec with ChargingBehaviorTestData { // soc = lower thresholds -> wants to charge Quantities.getQuantity(40, PowerSystemUnits.KILOWATTHOUR), poiHome, + PoiTypeDictionary.HOME, true, parkingTimeStart.plusMinutes(15), true @@ -215,6 +231,7 @@ class ChargingBehaviorSpec extends UnitSpec with ChargingBehaviorTestData { // soc = upper thresholds -> does not want to charge Quantities.getQuantity(85, PowerSystemUnits.KILOWATTHOUR), poiHome, + PoiTypeDictionary.HOME, true, parkingTimeStart.plusMinutes(15), false @@ -224,6 +241,7 @@ class ChargingBehaviorSpec extends UnitSpec with ChargingBehaviorTestData { // soc = lower thresholds -> wants to charge Quantities.getQuantity(40, PowerSystemUnits.KILOWATTHOUR), workPoi, + PoiTypeDictionary.WORK, true, parkingTimeStart.plusMinutes(15), true @@ -233,6 +251,7 @@ class ChargingBehaviorSpec extends UnitSpec with ChargingBehaviorTestData { // soc = upper thresholds -> does not want to charge Quantities.getQuantity(85, PowerSystemUnits.KILOWATTHOUR), workPoi, + PoiTypeDictionary.WORK, true, parkingTimeStart.plusMinutes(15), false @@ -242,6 +261,7 @@ class ChargingBehaviorSpec extends UnitSpec with ChargingBehaviorTestData { // soc = lower thresholds -> wants to charge Quantities.getQuantity(30, PowerSystemUnits.KILOWATTHOUR), supermarketPoi, + PoiTypeDictionary.SHOPPING, true, parkingTimeStart.plusMinutes(15), true @@ -251,6 +271,7 @@ class ChargingBehaviorSpec extends UnitSpec with ChargingBehaviorTestData { // soc = upper thresholds -> does not want to charge Quantities.getQuantity(50, PowerSystemUnits.KILOWATTHOUR), supermarketPoi, + PoiTypeDictionary.SHOPPING, true, parkingTimeStart.plusMinutes(15), false @@ -260,6 +281,7 @@ class ChargingBehaviorSpec extends UnitSpec with ChargingBehaviorTestData { // soc = lower threshold -> wants to charge Quantities.getQuantity(40, PowerSystemUnits.KILOWATTHOUR), poiHome, + PoiTypeDictionary.HOME, false, parkingTimeStart.plusMinutes(15), true @@ -269,6 +291,7 @@ class ChargingBehaviorSpec extends UnitSpec with ChargingBehaviorTestData { // soc = upper threshold -> does not want to charge Quantities.getQuantity(85, PowerSystemUnits.KILOWATTHOUR), poiHome, + PoiTypeDictionary.HOME, false, parkingTimeStart.plusMinutes(15), false @@ -278,6 +301,7 @@ class ChargingBehaviorSpec extends UnitSpec with ChargingBehaviorTestData { // soc = lower threshold -> wants to charge Quantities.getQuantity(40, PowerSystemUnits.KILOWATTHOUR), workPoi, + PoiTypeDictionary.WORK, false, parkingTimeStart.plusMinutes(15), true @@ -287,6 +311,7 @@ class ChargingBehaviorSpec extends UnitSpec with ChargingBehaviorTestData { // soc = upper threshold -> does not want to charge Quantities.getQuantity(85, PowerSystemUnits.KILOWATTHOUR), workPoi, + PoiTypeDictionary.WORK, false, parkingTimeStart.plusMinutes(15), false @@ -296,6 +321,7 @@ class ChargingBehaviorSpec extends UnitSpec with ChargingBehaviorTestData { // soc = lower threshold -> wants to charge Quantities.getQuantity(30, PowerSystemUnits.KILOWATTHOUR), supermarketPoi, + PoiTypeDictionary.SHOPPING, false, parkingTimeStart.plusMinutes(15), true @@ -305,6 +331,7 @@ class ChargingBehaviorSpec extends UnitSpec with ChargingBehaviorTestData { // soc = upper threshold -> does not want to charge Quantities.getQuantity(75, PowerSystemUnits.KILOWATTHOUR), supermarketPoi, + PoiTypeDictionary.SHOPPING, false, parkingTimeStart.plusMinutes(15), false @@ -315,6 +342,7 @@ class ChargingBehaviorSpec extends UnitSpec with ChargingBehaviorTestData { ( soc, destinationPoi, + destinationPoiType, isChargingAtHomePossible, departureTime, expectedResult @@ -332,6 +360,7 @@ class ChargingBehaviorSpec extends UnitSpec with ChargingBehaviorTestData { .copyWith( soc, destinationPoi, + destinationPoiType, parkingTimeStart, departureTime ) diff --git a/src/test/scala/edu/ie3/mobsim/model/ChargingBehaviorTestData.scala b/src/test/scala/edu/ie3/mobsim/model/ChargingBehaviorTestData.scala index 10c79d66..e108acdb 100644 --- a/src/test/scala/edu/ie3/mobsim/model/ChargingBehaviorTestData.scala +++ b/src/test/scala/edu/ie3/mobsim/model/ChargingBehaviorTestData.scala @@ -6,6 +6,8 @@ package edu.ie3.mobsim.model +import edu.ie3.mobsim.io.geodata.PoiEnums.PoiTypeDictionary + import java.time.ZonedDateTime import java.util.UUID import scala.util.Random @@ -15,6 +17,7 @@ trait ChargingBehaviorTestData extends TripSimulationTestData { protected val evLowSoC: ElectricVehicle = ev1.copyWith( zero, destinationPoi = supermarket, + destinationPoiType = PoiTypeDictionary.SHOPPING, parkingTimeStart = ZonedDateTime.now(), departureTime = ZonedDateTime.now().plusHours(5) ) @@ -22,6 +25,7 @@ trait ChargingBehaviorTestData extends TripSimulationTestData { protected val evAtChargingHub: ElectricVehicle = ev2.copyWith( half, destinationPoi = charging_hub_townPoi, + destinationPoiType = PoiTypeDictionary.CHARGING_HUB_TOWN, parkingTimeStart = ZonedDateTime.now(), departureTime = ZonedDateTime.now().plusHours(1) ) @@ -29,6 +33,7 @@ trait ChargingBehaviorTestData extends TripSimulationTestData { protected val evNextTrip: ElectricVehicle = ev3.copyWith( ev3.getEStorage, destinationPoi = other_shopPoi, + destinationPoiType = PoiTypeDictionary.SHOPPING, parkingTimeStart = ZonedDateTime.now(), departureTime = ZonedDateTime.now().plusHours(1) ) @@ -36,6 +41,7 @@ trait ChargingBehaviorTestData extends TripSimulationTestData { protected val evChargingNeeded: ElectricVehicle = ev4.copyWith( zero, destinationPoi = supermarket, + destinationPoiType = PoiTypeDictionary.SHOPPING, parkingTimeStart = ZonedDateTime.now(), departureTime = ZonedDateTime.now().plusHours(5) ) @@ -43,6 +49,7 @@ trait ChargingBehaviorTestData extends TripSimulationTestData { protected val evNoChargingStations: ElectricVehicle = ev5.copyWith( zero, destinationPoi = supermarketPoi, + destinationPoiType = PoiTypeDictionary.SHOPPING, parkingTimeStart = ZonedDateTime.now(), departureTime = ZonedDateTime.now().plusHours(5) ) diff --git a/src/test/scala/edu/ie3/mobsim/model/ElectricVehicleSpec.scala b/src/test/scala/edu/ie3/mobsim/model/ElectricVehicleSpec.scala index ded85730..dd47cdec 100644 --- a/src/test/scala/edu/ie3/mobsim/model/ElectricVehicleSpec.scala +++ b/src/test/scala/edu/ie3/mobsim/model/ElectricVehicleSpec.scala @@ -6,6 +6,7 @@ package edu.ie3.mobsim.model +import edu.ie3.mobsim.io.geodata.PoiEnums.PoiTypeDictionary import edu.ie3.mobsim.io.probabilities.ProbabilityDensityFunction import edu.ie3.test.common.UnitSpec import edu.ie3.util.quantities.PowerSystemUnits @@ -40,12 +41,14 @@ class ElectricVehicleSpec extends UnitSpec with TripSimulationTestData { workPoi, storedEnergy, destinationPoi, + destinationPoiType, parkingTimeStart, departureTime, chargingAtHomePossible, chosenChargingStation, chargingAtSimona, finalDestinationPoi, + finalDestinationPoiType, remainingDistanceAfterChargingHub, chargingPricesMemory ) => @@ -57,11 +60,13 @@ class ElectricVehicleSpec extends UnitSpec with TripSimulationTestData { storedEnergy shouldBe givenModel.capacity chargingAtSimona shouldBe false destinationPoi shouldBe givenHomePoi + destinationPoiType shouldBe PoiTypeDictionary.HOME parkingTimeStart shouldBe simulationStart departureTime shouldBe givenFirstDeparture chosenChargingStation shouldBe None chargingAtHomePossible shouldBe true finalDestinationPoi shouldBe None + finalDestinationPoiType shouldBe None remainingDistanceAfterChargingHub shouldBe None chargingPricesMemory shouldBe Queue[Double]() } @@ -304,11 +309,12 @@ class ElectricVehicleSpec extends UnitSpec with TripSimulationTestData { val ev: ElectricVehicle = ev1.copyWith( storedEnergy = ev1.storedEnergy, bbpgPoi, + PoiTypeDictionary.LEISURE, parkingTimeStart = ev1.parkingTimeStart, departureTime = ev1.departureTime ) - ev.getDestinationPoiType shouldBe bbpgPoi.getPoiType + ev.destinationPoiType shouldBe PoiTypeDictionary.LEISURE } "return the correct departure tick" in { @@ -317,6 +323,7 @@ class ElectricVehicleSpec extends UnitSpec with TripSimulationTestData { val ev: ElectricVehicle = ev1.copyWith( storedEnergy = ev1.storedEnergy, destinationPoi = ev1.destinationPoi, + destinationPoiType = ev1.destinationPoiType, parkingTimeStart = ev1.parkingTimeStart, time ) diff --git a/src/test/scala/edu/ie3/mobsim/model/TripSimulationSpec.scala b/src/test/scala/edu/ie3/mobsim/model/TripSimulationSpec.scala index ecff407f..93ebfca2 100644 --- a/src/test/scala/edu/ie3/mobsim/model/TripSimulationSpec.scala +++ b/src/test/scala/edu/ie3/mobsim/model/TripSimulationSpec.scala @@ -21,7 +21,7 @@ import scala.collection.mutable class TripSimulationSpec extends UnitSpec with IoUtilsTestData { "TripSimulation" should { - "not simulate a new trip and keep charging when SoC < 70 %" in { + "not simulate a new trip and keep charging when SoC < 70 and is at charging hub %" in { TripSimulation.simulateNextTrip( givenSimulationStart, evAtChargingHub, @@ -42,12 +42,14 @@ class TripSimulationSpec extends UnitSpec with IoUtilsTestData { workPoi, storedEnergy, destinationPoi, + destinationPoiType, parkingTimeStart, departureTime, chargingAtHomePossible, chosenChargingStation, chargingAtSimona, finalDestinationPoi, + finalDestinationPoiType, remainingDistanceAfterChargingHub, chargingPricesMemory ) => @@ -60,11 +62,13 @@ class TripSimulationSpec extends UnitSpec with IoUtilsTestData { storedEnergy shouldBe half chargingAtSimona shouldBe false destinationPoi shouldBe charging_hub_townPoi + destinationPoiType shouldBe PoiTypeDictionary.CHARGING_HUB_TOWN parkingTimeStart shouldBe simulationStart.plusMinutes(1) departureTime shouldBe simulationStart.plusHours(4).plusMinutes(33) chargingAtHomePossible shouldBe true chosenChargingStation shouldBe None finalDestinationPoi shouldBe None + finalDestinationPoiType shouldBe None remainingDistanceAfterChargingHub shouldBe None chargingPricesMemory shouldBe mutable.Queue[Double]() } @@ -91,12 +95,14 @@ class TripSimulationSpec extends UnitSpec with IoUtilsTestData { workPoi, storedEnergy, destinationPoi, + destinationPoiType, parkingTimeStart, departureTime, chargingAtHomePossible, chosenChargingStation, chargingAtSimona, finalDestinationPoi, + finalDestinationPoiType, remainingDistanceAfterChargingHub, chargingPricesMemory ) => @@ -130,6 +136,7 @@ class TripSimulationSpec extends UnitSpec with IoUtilsTestData { 0.2, Quantities.getQuantity(1000, METRE), plannedDestinationPoi, + plannedDestinationPoiType, chargingStations, speed ) match { @@ -142,12 +149,14 @@ class TripSimulationSpec extends UnitSpec with IoUtilsTestData { workPoi, storedEnergy, destinationPoi, + destinationPoiType, parkingTimeStart, departureTime, chargingAtHomePossible, chosenChargingStation, chargingAtSimona, finalDestinationPoi, + finalDestinationPoiType, remainingDistanceAfterChargingHub, chargingPricesMemory ) => @@ -160,11 +169,13 @@ class TripSimulationSpec extends UnitSpec with IoUtilsTestData { storedEnergy shouldBe storedEnergyValue chargingAtSimona shouldBe false destinationPoi shouldBe charging_hub_townPoi + destinationPoiType shouldBe PoiTypeDictionary.CHARGING_HUB_TOWN parkingTimeStart shouldBe simulationStart.plusMinutes(10) departureTime shouldBe simulationStart.plusHours(7).plusMinutes(26) chargingAtHomePossible shouldBe true chosenChargingStation shouldBe None - finalDestinationPoi shouldBe Some(charging_hub_townPoi) + finalDestinationPoi shouldBe Some(plannedDestinationPoi) + finalDestinationPoiType shouldBe Some(plannedDestinationPoiType) remainingDistanceAfterChargingHub shouldBe Some( Quantities.getQuantity(-7000, METRE) ) @@ -182,6 +193,7 @@ class TripSimulationSpec extends UnitSpec with IoUtilsTestData { 0.2, Quantities.getQuantity(1000, METRE), supermarketPoi, + PoiTypeDictionary.SHOPPING, chargingStations, speed ) match { @@ -194,12 +206,14 @@ class TripSimulationSpec extends UnitSpec with IoUtilsTestData { workPoi, storedEnergy, destinationPoi, + destinationPoiType, parkingTimeStart, departureTime, chargingAtHomePossible, chosenChargingStation, chargingAtSimona, finalDestinationPoi, + finalDestinationPoiType, remainingDistanceAfterChargingHub, chargingPricesMemory ) => @@ -212,6 +226,7 @@ class TripSimulationSpec extends UnitSpec with IoUtilsTestData { storedEnergy shouldBe storedEnergyValue chargingAtSimona shouldBe false destinationPoi shouldBe charging_hub_townPoi + destinationPoiType shouldBe PoiTypeDictionary.CHARGING_HUB_TOWN parkingTimeStart shouldBe simulationStart.plusMinutes(1) departureTime shouldBe simulationStart.plusHours(7).plusMinutes(17) chargingAtHomePossible shouldBe true @@ -229,6 +244,7 @@ class TripSimulationSpec extends UnitSpec with IoUtilsTestData { ev4, plannedStoredEnergyEndOfTrip, plannedDestinationPoi, + plannedDestinationPoiType, plannedParkingTimeStart, plannedDepartureTime ) match { @@ -241,12 +257,14 @@ class TripSimulationSpec extends UnitSpec with IoUtilsTestData { workPoi, storedEnergy, destinationPoi, + destinationPoiType, parkingTimeStart, departureTime, chargingAtHomePossible, chosenChargingStation, chargingAtSimona, finalDestinationPoi, + finalDestinationPoiType, remainingDistanceAfterChargingHub, chargingPricesMemory ) => @@ -259,11 +277,13 @@ class TripSimulationSpec extends UnitSpec with IoUtilsTestData { storedEnergy shouldBe plannedStoredEnergyEndOfTrip chargingAtSimona shouldBe false destinationPoi shouldBe plannedDestinationPoi + destinationPoiType shouldBe plannedDestinationPoiType parkingTimeStart shouldBe plannedParkingTimeStart departureTime shouldBe plannedDepartureTime chargingAtHomePossible shouldBe true chosenChargingStation shouldBe None finalDestinationPoi shouldBe None + finalDestinationPoiType shouldBe None remainingDistanceAfterChargingHub shouldBe None chargingPricesMemory shouldBe mutable.Queue[Double]() } diff --git a/src/test/scala/edu/ie3/mobsim/utils/IoUtilsSpec.scala b/src/test/scala/edu/ie3/mobsim/utils/IoUtilsSpec.scala index 9d3e9680..606274d7 100644 --- a/src/test/scala/edu/ie3/mobsim/utils/IoUtilsSpec.scala +++ b/src/test/scala/edu/ie3/mobsim/utils/IoUtilsSpec.scala @@ -6,6 +6,7 @@ package edu.ie3.mobsim.utils +import edu.ie3.mobsim.io.geodata.PoiEnums.PoiTypeDictionary import edu.ie3.mobsim.model.ElectricVehicle import edu.ie3.mobsim.utils.IoUtilsSpec.evString import edu.ie3.test.common.UnitSpec @@ -142,7 +143,7 @@ class IoUtilsSpec extends UnitSpec with IoUtilsTestData { } val compareString: String = s"${charging_hub_townPoi.id};" + - s"${charging_hub_townPoi.getPoiType};" + + s"${PoiTypeDictionary.CHARGING_HUB_TOWN};" + s"${charging_hub_townPoi.size};" + s"$cs4;" + s"${0.0}" From f6a7a9083ed1fbd923e2412dc3c906bbcfb4423a Mon Sep 17 00:00:00 2001 From: Thomas Date: Fri, 9 Sep 2022 08:45:13 +0200 Subject: [PATCH 2/9] remove categorical location to poi type --- .../edu/ie3/mobsim/io/geodata/PoiEnums.scala | 22 ------------- .../ie3/mobsim/io/geodata/PoiEnumsSpec.scala | 31 ------------------- 2 files changed, 53 deletions(-) diff --git a/src/main/scala/edu/ie3/mobsim/io/geodata/PoiEnums.scala b/src/main/scala/edu/ie3/mobsim/io/geodata/PoiEnums.scala index 73e9b8ce..796065ea 100644 --- a/src/main/scala/edu/ie3/mobsim/io/geodata/PoiEnums.scala +++ b/src/main/scala/edu/ie3/mobsim/io/geodata/PoiEnums.scala @@ -26,28 +26,6 @@ object PoiEnums { throw new RuntimeException(s"PoiType '$malformed' not known") } } - - def apply( - categoricalLocation: CategoricalLocationDictionary.Value - ): Value = { - categoricalLocation match { - case CategoricalLocationDictionary.HOME => HOME - case CategoricalLocationDictionary.WORK => WORK - case CategoricalLocationDictionary.SUPERMARKET => SHOPPING - case CategoricalLocationDictionary.SERVICES => SHOPPING - case CategoricalLocationDictionary.OTHER_SHOP => SHOPPING - case CategoricalLocationDictionary.RESTAURANT => LEISURE - case CategoricalLocationDictionary.CULTURE => LEISURE - case CategoricalLocationDictionary.SPORTS => LEISURE - case CategoricalLocationDictionary.RELIGIOUS => LEISURE - case CategoricalLocationDictionary.MEDICINAL => OTHER - case CategoricalLocationDictionary.BBPG => OTHER - case CategoricalLocationDictionary.CHARGING_HUB_TOWN => - CHARGING_HUB_TOWN - case CategoricalLocationDictionary.CHARGING_HUB_HIGHWAY => - CHARGING_HUB_HIGHWAY - } - } } object CategoricalLocationDictionary extends Enumeration { diff --git a/src/test/scala/edu/ie3/mobsim/io/geodata/PoiEnumsSpec.scala b/src/test/scala/edu/ie3/mobsim/io/geodata/PoiEnumsSpec.scala index fa8de304..655bdc0f 100644 --- a/src/test/scala/edu/ie3/mobsim/io/geodata/PoiEnumsSpec.scala +++ b/src/test/scala/edu/ie3/mobsim/io/geodata/PoiEnumsSpec.scala @@ -43,37 +43,6 @@ class PoiEnumsSpec extends UnitSpec { exception.getMessage shouldBe "PoiType 'wrong_poi' not known" } - // testing PoiTypeDictionary.apply(categoricalLocation: CategoricalLocationDictionary.Value) - "convert CategoricalLocations to PoiTypeDictionary" in { - - val cases = Table( - ("categoricalLocation", "expectedResult"), - (CategoricalLocationDictionary.HOME, PoiTypeDictionary.HOME), - (CategoricalLocationDictionary.WORK, PoiTypeDictionary.WORK), - (CategoricalLocationDictionary.SUPERMARKET, PoiTypeDictionary.SHOPPING), - (CategoricalLocationDictionary.SERVICES, PoiTypeDictionary.SHOPPING), - (CategoricalLocationDictionary.OTHER_SHOP, PoiTypeDictionary.SHOPPING), - (CategoricalLocationDictionary.RESTAURANT, PoiTypeDictionary.LEISURE), - (CategoricalLocationDictionary.CULTURE, PoiTypeDictionary.LEISURE), - (CategoricalLocationDictionary.SPORTS, PoiTypeDictionary.LEISURE), - (CategoricalLocationDictionary.RELIGIOUS, PoiTypeDictionary.LEISURE), - (CategoricalLocationDictionary.MEDICINAL, PoiTypeDictionary.OTHER), - (CategoricalLocationDictionary.BBPG, PoiTypeDictionary.OTHER), - ( - CategoricalLocationDictionary.CHARGING_HUB_TOWN, - PoiTypeDictionary.CHARGING_HUB_TOWN - ), - ( - CategoricalLocationDictionary.CHARGING_HUB_HIGHWAY, - PoiTypeDictionary.CHARGING_HUB_HIGHWAY - ) - ) - - forAll(cases) { (categoricalLocation, expectedResult) => - PoiTypeDictionary.apply(categoricalLocation) shouldBe expectedResult - } - } - // testing CategoricalLocationDictionary.apply(token: String) "parse CategoricalLocation correctly" in { val cases = Table( From 7588fd50c2bfaa7bacf69e1b881efa3864375df1 Mon Sep 17 00:00:00 2001 From: Thomas Date: Sun, 9 Oct 2022 14:21:10 +0200 Subject: [PATCH 3/9] driving home for christmas --- .../edu/ie3/mobsim/MobilitySimulator.scala | 31 +++++++-- .../edu/ie3/mobsim/model/TripSimulation.scala | 68 ++++++++++++++++--- 2 files changed, 85 insertions(+), 14 deletions(-) diff --git a/src/main/scala/edu/ie3/mobsim/MobilitySimulator.scala b/src/main/scala/edu/ie3/mobsim/MobilitySimulator.scala index a9de2ad1..85799e4e 100644 --- a/src/main/scala/edu/ie3/mobsim/MobilitySimulator.scala +++ b/src/main/scala/edu/ie3/mobsim/MobilitySimulator.scala @@ -15,13 +15,21 @@ import edu.ie3.mobsim.exceptions.{ SourceException, UninitializedException } -import edu.ie3.mobsim.io.geodata.PoiEnums.CategoricalLocationDictionary +import edu.ie3.mobsim.io.geodata.PoiEnums.{ + CategoricalLocationDictionary, + PoiTypeDictionary +} import edu.ie3.mobsim.io.geodata.{PoiUtils, PointOfInterest} import edu.ie3.mobsim.io.probabilities._ import edu.ie3.mobsim.io.probabilities.factories._ import edu.ie3.mobsim.model.ChargingBehavior.chooseChargingStation import edu.ie3.mobsim.model.TripSimulation.simulateNextTrip -import edu.ie3.mobsim.model.{ChargingStation, ElectricVehicle, EvType} +import edu.ie3.mobsim.model.{ + ChargingStation, + ElectricVehicle, + EvType, + TripSimulation +} import edu.ie3.mobsim.utils.{IoUtils, PathsAndSources} import edu.ie3.simona.api.data.ExtDataSimulation import edu.ie3.simona.api.data.ev.ontology.builder.EvMovementsMessageBuilder @@ -102,8 +110,8 @@ final class MobilitySimulator( ) /* Get time until next event for one of the EVs and return corresponding tick to SIMONA */ - val timeUntilNextEvent = - getTimeUntilNextEvent(electricVehicles, currentTime) + val nextEvent = + tick + getTimeUntilNextEvent(electricVehicles, currentTime) /* Save occupancy of charging stations for csv output */ chargingStations.foreach(cs => @@ -115,7 +123,7 @@ final class MobilitySimulator( ) val newTicks = new java.util.ArrayList[java.lang.Long](1) - newTicks.add(tick + timeUntilNextEvent) + newTicks.add(nextEvent) newTicks } @@ -477,7 +485,7 @@ final class MobilitySimulator( } .getOrElse(ev) - simulateNextTrip( + val updatedEv = simulateNextTrip( currentTime, targetEv, poisWithSizes, @@ -488,6 +496,17 @@ final class MobilitySimulator( tripProbabilities, thresholdChargingHubDistance ) + + if ( + updatedEv.departureTime.getDayOfWeek != currentTime.getDayOfWeek && updatedEv.destinationPoiType != PoiTypeDictionary.HOME + ) { + TripSimulation.simulateLastDailyTripToHome( + currentTime, + ev, + tripProbabilities + ) + } else updatedEv + } else ev }) diff --git a/src/main/scala/edu/ie3/mobsim/model/TripSimulation.scala b/src/main/scala/edu/ie3/mobsim/model/TripSimulation.scala index e39bab65..1e73c594 100644 --- a/src/main/scala/edu/ie3/mobsim/model/TripSimulation.scala +++ b/src/main/scala/edu/ie3/mobsim/model/TripSimulation.scala @@ -618,14 +618,8 @@ object TripSimulation extends LazyLogging { .to(KILOMETRE_PER_HOUR) /* Calculate driving time based on planned values */ - val plannedDrivingTime: Int = math.max( - (math rint (plannedDrivingDistance - .to(KILOMETRE) - .divide(plannedDrivingSpeed.to(KILOMETRE_PER_HOUR)) - .getValue - .doubleValue() * 60)).toInt, - 1 - ) + val plannedDrivingTime: Int = + calculateDrivingTime(plannedDrivingDistance, plannedDrivingSpeed) /* Calculate start of parking time based on planned values */ val plannedParkingTimeStart: ZonedDateTime = @@ -647,6 +641,20 @@ object TripSimulation extends LazyLogging { ) } + def calculateDrivingTime( + drivingDistance: ComparableQuantity[Length], + drivingSpeed: ComparableQuantity[Speed] + ): Int = { + math.max( + (math rint (drivingDistance + .to(KILOMETRE) + .divide(drivingSpeed.to(KILOMETRE_PER_HOUR)) + .getValue + .doubleValue() * 60)).toInt, + 1 + ) + } + /** Change the planned trip and make a trip to a charging hub. Which type of * charging hub is defined by chargingHubPoiType. * @@ -1225,4 +1233,48 @@ object TripSimulation extends LazyLogging { math.max(neededChargingTimeInMinutes, 1) } + /** As we want to start out with the same initial conditions every day we + * simulate a final trip to the respective home of the car to make sure every + * car starts a new day from its home and the sampled initial departure + * follows the "first departure of day" distribution. + * + * @param tripStart + * the point in time at which the trip takes place + * @param ev + * electric vehicle that is drives home + * @param tripProbabilities + * the probabilites for parameter sampling + * @return + * an updated [[ElectricVehicle]] + */ + def simulateLastDailyTripToHome( + tripStart: ZonedDateTime, + ev: ElectricVehicle, + tripProbabilities: TripProbabilities + ): ElectricVehicle = { + val destinationPoiType = PoiTypeDictionary.HOME + val destinationPoi = ev.homePoi + val distance = tripProbabilities.tripDistance.sample( + tripStart, + ev.destinationPoiType, + destinationPoiType + ) + val drivingSpeed = + tripProbabilities.drivingSpeed.sample(tripStart, distance) + val drivingTime = calculateDrivingTime(distance, drivingSpeed) + val parkingTimeStart = tripStart.plusMinutes(drivingTime) + val destinationDepartureTime = + tripProbabilities.firstDepartureOfDay.sample(parkingTimeStart) + + // we do not update the SOC as we change the trip after the fact and + // the original trip consumption has already been considered + + ev.copy( + destinationPoi = destinationPoi, + destinationPoiType = destinationPoiType, + parkingTimeStart = parkingTimeStart, + departureTime = destinationDepartureTime + ) + } + } From 406a76cce0258622b8c5d98614e01ad236831219 Mon Sep 17 00:00:00 2001 From: Thomas Date: Sun, 9 Oct 2022 15:20:57 +0200 Subject: [PATCH 4/9] add todo --- src/main/scala/edu/ie3/mobsim/MobilitySimulator.scala | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/scala/edu/ie3/mobsim/MobilitySimulator.scala b/src/main/scala/edu/ie3/mobsim/MobilitySimulator.scala index 85799e4e..59918fe4 100644 --- a/src/main/scala/edu/ie3/mobsim/MobilitySimulator.scala +++ b/src/main/scala/edu/ie3/mobsim/MobilitySimulator.scala @@ -500,6 +500,7 @@ final class MobilitySimulator( if ( updatedEv.departureTime.getDayOfWeek != currentTime.getDayOfWeek && updatedEv.destinationPoiType != PoiTypeDictionary.HOME ) { + // todo: trip before has already been persisted TripSimulation.simulateLastDailyTripToHome( currentTime, ev, From b3e65ca1270f3a63e2186074d05890403859d523 Mon Sep 17 00:00:00 2001 From: Thomas Date: Tue, 11 Oct 2022 10:52:12 +0200 Subject: [PATCH 5/9] rmv stay longer at destination --- .../edu/ie3/mobsim/model/TripSimulation.scala | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/src/main/scala/edu/ie3/mobsim/model/TripSimulation.scala b/src/main/scala/edu/ie3/mobsim/model/TripSimulation.scala index 1e73c594..6a58f75e 100644 --- a/src/main/scala/edu/ie3/mobsim/model/TripSimulation.scala +++ b/src/main/scala/edu/ie3/mobsim/model/TripSimulation.scala @@ -101,24 +101,6 @@ object TripSimulation extends LazyLogging { ) } - /* Check if SoC is < 10% at start of trip -> if yes, and EV could charge at its destination, do not depart */ - else if ( - socAtStartOfTrip < SOC_OF_10_PERCENT - && ev.destinationPoi.nearestChargingStations.nonEmpty - ) { - // logger.info( - s"${ev.getId} has SoC < 10% at planned departure, but EV could charged here. It stays until it can charge..." - // ) - doNotDepartAndStayLongerAtDestination( - ev, - currentTime, - chargingStations, - tripProbabilities.firstDepartureOfDay, - tripProbabilities.lastTripOfDay, - tripProbabilities.parkingTime - ) - } - /* SoC is not critical (< 10%) or couldn't charge at destination -> depart and simulate a trip */ else { From a5e20a59c8811ba4c3b67e71c806b0a78b581b4e Mon Sep 17 00:00:00 2001 From: Thomas Date: Tue, 11 Oct 2022 11:38:12 +0200 Subject: [PATCH 6/9] rmv test --- .../ie3/mobsim/model/TripSimulationSpec.scala | 51 ------------------- 1 file changed, 51 deletions(-) diff --git a/src/test/scala/edu/ie3/mobsim/model/TripSimulationSpec.scala b/src/test/scala/edu/ie3/mobsim/model/TripSimulationSpec.scala index 93ebfca2..a6dcd4fb 100644 --- a/src/test/scala/edu/ie3/mobsim/model/TripSimulationSpec.scala +++ b/src/test/scala/edu/ie3/mobsim/model/TripSimulationSpec.scala @@ -74,57 +74,6 @@ class TripSimulationSpec extends UnitSpec with IoUtilsTestData { } } - "not simulate a new trip and keep charging when SoC < 10 % and charging is available" in { - TripSimulation.simulateNextTrip( - givenSimulationStart, - evLowSoC, - poisWithSizes, - chargingHubTownIsPresent = true, - chargingHubHighwayIsPresent = true, - chargingStations, - ioUtils, - tripProbabilities, - maxDistance - ) match { - case ElectricVehicle( - simulationStart, - uuid, - id, - evType, - homePoi, - workPoi, - storedEnergy, - destinationPoi, - destinationPoiType, - parkingTimeStart, - departureTime, - chargingAtHomePossible, - chosenChargingStation, - chargingAtSimona, - finalDestinationPoi, - finalDestinationPoiType, - remainingDistanceAfterChargingHub, - chargingPricesMemory - ) => - simulationStart shouldBe givenSimulationStart - uuid shouldBe ev1.getUuid - id shouldBe "car_1" - evType shouldBe givenModel - homePoi shouldBe givenHomePoi - workPoi shouldBe givenWorkPoi - storedEnergy shouldBe zero - chargingAtSimona shouldBe false - destinationPoi shouldBe supermarket - parkingTimeStart shouldBe simulationStart.plusMinutes(1) - departureTime shouldBe simulationStart.plusHours(1).plusMinutes(1) - chargingAtHomePossible shouldBe true - chosenChargingStation shouldBe None - finalDestinationPoi shouldBe None - remainingDistanceAfterChargingHub shouldBe None - chargingPricesMemory shouldBe mutable.Queue[Double]() - } - } - // testing makeTripToChargingHub "makeTripToChargingHub correctly" in { TripSimulation.makeTripToChargingHub( From ac1cb9973df6e0043f09efa69d6615e1cbc065d4 Mon Sep 17 00:00:00 2001 From: Thomas Date: Thu, 13 Oct 2022 14:45:14 +0200 Subject: [PATCH 7/9] adjust test --- src/main/scala/edu/ie3/mobsim/utils/IoUtils.scala | 2 +- src/test/scala/edu/ie3/mobsim/utils/IoUtilsSpec.scala | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/scala/edu/ie3/mobsim/utils/IoUtils.scala b/src/main/scala/edu/ie3/mobsim/utils/IoUtils.scala index 7725935d..6d3889dc 100644 --- a/src/main/scala/edu/ie3/mobsim/utils/IoUtils.scala +++ b/src/main/scala/edu/ie3/mobsim/utils/IoUtils.scala @@ -58,7 +58,7 @@ final case class IoUtils private ( .doubleValue() .toString, "destination_poi" -> ev.destinationPoi.id, - "destination_poi_type" -> ev.getDestinationPoiType.toString, + "destination_poi_type" -> ev.destinationPoiType.toString, "categorical_location" -> ev.destinationPoi.categoricalLocation.toString, "destination_arrival" -> ev.parkingTimeStart.toString, "destination_departure" -> ev.departureTime.toString, diff --git a/src/test/scala/edu/ie3/mobsim/utils/IoUtilsSpec.scala b/src/test/scala/edu/ie3/mobsim/utils/IoUtilsSpec.scala index 310eaeb5..c34aeeee 100644 --- a/src/test/scala/edu/ie3/mobsim/utils/IoUtilsSpec.scala +++ b/src/test/scala/edu/ie3/mobsim/utils/IoUtilsSpec.scala @@ -50,7 +50,7 @@ class IoUtilsSpec extends UnitSpec with IoUtilsTestData { .doubleValue() .toString};" + s"${firstEv.destinationPoi.id};" + - s"${firstEv.getDestinationPoiType.toString};" + + s"${firstEv.destinationPoiType.toString};" + s"${firstEv.destinationPoi.categoricalLocation};" + s"${firstEv.parkingTimeStart.toString};" + s"${firstEv.departureTime};" + From 1ac02e608363de406f6037af043d1ae6f0db3734 Mon Sep 17 00:00:00 2001 From: Thomas Date: Thu, 13 Oct 2022 15:08:12 +0200 Subject: [PATCH 8/9] remove misleading comment --- src/main/scala/edu/ie3/mobsim/MobilitySimulator.scala | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/scala/edu/ie3/mobsim/MobilitySimulator.scala b/src/main/scala/edu/ie3/mobsim/MobilitySimulator.scala index 28bc1fe1..072b1530 100644 --- a/src/main/scala/edu/ie3/mobsim/MobilitySimulator.scala +++ b/src/main/scala/edu/ie3/mobsim/MobilitySimulator.scala @@ -498,7 +498,6 @@ final class MobilitySimulator( if ( updatedEv.departureTime.getDayOfWeek != currentTime.getDayOfWeek && updatedEv.destinationPoiType != PoiTypeDictionary.HOME ) { - // todo: trip before has already been persisted TripSimulation.simulateLastDailyTripToHome( currentTime, ev, From 2494aa3e247b6e27d39127461fe26096ab27281b Mon Sep 17 00:00:00 2001 From: Sebastian Peter Date: Wed, 19 Oct 2022 11:17:24 +0200 Subject: [PATCH 9/9] one more SortedSet to Set --- src/main/scala/edu/ie3/mobsim/MobilitySimulator.scala | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/src/main/scala/edu/ie3/mobsim/MobilitySimulator.scala b/src/main/scala/edu/ie3/mobsim/MobilitySimulator.scala index b742c3c4..f9018658 100644 --- a/src/main/scala/edu/ie3/mobsim/MobilitySimulator.scala +++ b/src/main/scala/edu/ie3/mobsim/MobilitySimulator.scala @@ -21,13 +21,7 @@ import edu.ie3.mobsim.io.geodata.{PoiUtils, PointOfInterest} import edu.ie3.mobsim.io.probabilities._ import edu.ie3.mobsim.model.ChargingBehavior.chooseChargingStation import edu.ie3.mobsim.model.TripSimulation.simulateNextTrip -import edu.ie3.mobsim.model.{ - ChargingStation, - ElectricVehicle, - EvMovement, - EvType, - TripSimulation -} +import edu.ie3.mobsim.model._ import edu.ie3.mobsim.utils.{IoUtils, PathsAndSources} import edu.ie3.simona.api.data.ExtDataSimulation import edu.ie3.simona.api.data.ev.{ExtEvData, ExtEvSimulation} @@ -42,7 +36,6 @@ import java.time.temporal.ChronoUnit import java.time.{ZoneId, ZonedDateTime} import java.util.UUID import javax.measure.quantity.Length -import scala.collection.immutable.{SortedSet, TreeSet} import scala.collection.parallel.CollectionConverters._ import scala.jdk.CollectionConverters._ import scala.util.Random @@ -169,7 +162,7 @@ final class MobilitySimulator( s"Got unexpected EvModel type ${unexpected.getClass}" ) } - .to(SortedSet) + .toSet /* Add EVs that start parking to movements and assign to Evcs UUID */ val arrivals = handleParkingEvs(