eflips-depot 4.15.0__tar.gz → 4.15.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. {eflips_depot-4.15.0 → eflips_depot-4.15.1}/PKG-INFO +1 -1
  2. {eflips_depot-4.15.0 → eflips_depot-4.15.1}/eflips/depot/api/private/consumption.py +46 -23
  3. {eflips_depot-4.15.0 → eflips_depot-4.15.1}/eflips/depot/api/private/util.py +18 -6
  4. {eflips_depot-4.15.0 → eflips_depot-4.15.1}/pyproject.toml +1 -1
  5. {eflips_depot-4.15.0 → eflips_depot-4.15.1}/LICENSE.md +0 -0
  6. {eflips_depot-4.15.0 → eflips_depot-4.15.1}/README.md +0 -0
  7. {eflips_depot-4.15.0 → eflips_depot-4.15.1}/eflips/depot/__init__.py +0 -0
  8. {eflips_depot-4.15.0 → eflips_depot-4.15.1}/eflips/depot/api/__init__.py +0 -0
  9. {eflips_depot-4.15.0 → eflips_depot-4.15.1}/eflips/depot/api/defaults/default_settings.json +0 -0
  10. {eflips_depot-4.15.0 → eflips_depot-4.15.1}/eflips/depot/api/private/__init__.py +0 -0
  11. {eflips_depot-4.15.0 → eflips_depot-4.15.1}/eflips/depot/api/private/depot.py +0 -0
  12. {eflips_depot-4.15.0 → eflips_depot-4.15.1}/eflips/depot/api/private/results_to_database.py +0 -0
  13. {eflips_depot-4.15.0 → eflips_depot-4.15.1}/eflips/depot/configuration.py +0 -0
  14. {eflips_depot-4.15.0 → eflips_depot-4.15.1}/eflips/depot/depot.py +0 -0
  15. {eflips_depot-4.15.0 → eflips_depot-4.15.1}/eflips/depot/evaluation.py +0 -0
  16. {eflips_depot-4.15.0 → eflips_depot-4.15.1}/eflips/depot/filters.py +0 -0
  17. {eflips_depot-4.15.0 → eflips_depot-4.15.1}/eflips/depot/input_epex_power_price.py +0 -0
  18. {eflips_depot-4.15.0 → eflips_depot-4.15.1}/eflips/depot/layout_opt/__init__.py +0 -0
  19. {eflips_depot-4.15.0 → eflips_depot-4.15.1}/eflips/depot/layout_opt/doc/__init__.py +0 -0
  20. {eflips_depot-4.15.0 → eflips_depot-4.15.1}/eflips/depot/layout_opt/doc/direct_details.pdf +0 -0
  21. {eflips_depot-4.15.0 → eflips_depot-4.15.1}/eflips/depot/layout_opt/evaluation.py +0 -0
  22. {eflips_depot-4.15.0 → eflips_depot-4.15.1}/eflips/depot/layout_opt/opt_tools/__init__.py +0 -0
  23. {eflips_depot-4.15.0 → eflips_depot-4.15.1}/eflips/depot/layout_opt/opt_tools/crossover.py +0 -0
  24. {eflips_depot-4.15.0 → eflips_depot-4.15.1}/eflips/depot/layout_opt/opt_tools/fitness_c_urfd.py +0 -0
  25. {eflips_depot-4.15.0 → eflips_depot-4.15.1}/eflips/depot/layout_opt/opt_tools/fitness_util.py +0 -0
  26. {eflips_depot-4.15.0 → eflips_depot-4.15.1}/eflips/depot/layout_opt/opt_tools/init.py +0 -0
  27. {eflips_depot-4.15.0 → eflips_depot-4.15.1}/eflips/depot/layout_opt/opt_tools/mutation.py +0 -0
  28. {eflips_depot-4.15.0 → eflips_depot-4.15.1}/eflips/depot/layout_opt/optimize_c_urfd.py +0 -0
  29. {eflips_depot-4.15.0 → eflips_depot-4.15.1}/eflips/depot/layout_opt/packing.py +0 -0
  30. {eflips_depot-4.15.0 → eflips_depot-4.15.1}/eflips/depot/layout_opt/settings.py +0 -0
  31. {eflips_depot-4.15.0 → eflips_depot-4.15.1}/eflips/depot/layout_opt/template_creation.py +0 -0
  32. {eflips_depot-4.15.0 → eflips_depot-4.15.1}/eflips/depot/layout_opt/util.py +0 -0
  33. {eflips_depot-4.15.0 → eflips_depot-4.15.1}/eflips/depot/plots.py +0 -0
  34. {eflips_depot-4.15.0 → eflips_depot-4.15.1}/eflips/depot/processes.py +0 -0
  35. {eflips_depot-4.15.0 → eflips_depot-4.15.1}/eflips/depot/rating.py +0 -0
  36. {eflips_depot-4.15.0 → eflips_depot-4.15.1}/eflips/depot/resources.py +0 -0
  37. {eflips_depot-4.15.0 → eflips_depot-4.15.1}/eflips/depot/settings_config.py +0 -0
  38. {eflips_depot-4.15.0 → eflips_depot-4.15.1}/eflips/depot/simple_vehicle.py +0 -0
  39. {eflips_depot-4.15.0 → eflips_depot-4.15.1}/eflips/depot/simulation.py +0 -0
  40. {eflips_depot-4.15.0 → eflips_depot-4.15.1}/eflips/depot/smart_charging.py +0 -0
  41. {eflips_depot-4.15.0 → eflips_depot-4.15.1}/eflips/depot/standalone.py +0 -0
  42. {eflips_depot-4.15.0 → eflips_depot-4.15.1}/eflips/depot/validation.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: eflips-depot
3
- Version: 4.15.0
3
+ Version: 4.15.1
4
4
  Summary: Depot Simulation for eFLIPS
5
5
  License: AGPL-3.0-or-later
6
6
  License-File: LICENSE.md
@@ -286,20 +286,6 @@ def extract_trip_information(
286
286
  )
287
287
  .one()
288
288
  )
289
- # Check exactly one of the vehicle classes has a consumption LUT
290
- all_consumption_luts = [
291
- vehicle_class.consumption_lut
292
- for vehicle_class in trip.rotation.vehicle_type.vehicle_classes
293
- ]
294
- all_consumption_luts = [x for x in all_consumption_luts if x is not None]
295
- if len(all_consumption_luts) != 1:
296
- raise ValueError(
297
- f"Expected exactly one consumption LUT, got {len(all_consumption_luts)}"
298
- )
299
- consumption_lut = all_consumption_luts[0]
300
- # Disconnect the consumption LUT from the session to avoid loading the whole table
301
-
302
- del all_consumption_luts
303
289
 
304
290
  total_distance = trip.route.distance / 1000 # km
305
291
  total_duration = (
@@ -307,6 +293,13 @@ def extract_trip_information(
307
293
  ).total_seconds() / 3600
308
294
  average_speed = total_distance / total_duration # km/h
309
295
 
296
+ # Check exactly one of the vehicle classes has a consumption LUT
297
+ all_consumption_luts = [
298
+ vehicle_class.consumption_lut
299
+ for vehicle_class in trip.rotation.vehicle_type.vehicle_classes
300
+ ]
301
+ all_consumption_luts = [x for x in all_consumption_luts if x is not None]
302
+
310
303
  temperature = temperature_for_trip(trip_id, session)
311
304
 
312
305
  payload_mass = passenger_mass * passenger_count
@@ -324,16 +317,46 @@ def extract_trip_information(
324
317
  )
325
318
  level_of_loading = payload_mass / full_payload
326
319
 
327
- info = ConsumptionInformation(
328
- trip_id=trip.id,
329
- consumption_lut=consumption_lut,
330
- average_speed=average_speed,
331
- distance=total_distance,
332
- temperature=temperature,
333
- level_of_loading=level_of_loading,
334
- )
320
+ if len(all_consumption_luts) == 1:
321
+ consumption_lut = all_consumption_luts[0]
322
+ # Disconnect the consumption LUT from the session to avoid loading the whole table
323
+
324
+ del all_consumption_luts
325
+
326
+ info = ConsumptionInformation(
327
+ trip_id=trip.id,
328
+ consumption_lut=consumption_lut,
329
+ average_speed=average_speed,
330
+ distance=total_distance,
331
+ temperature=temperature,
332
+ level_of_loading=level_of_loading,
333
+ )
334
+ info.calculate()
335
+ elif len(all_consumption_luts) == 0:
336
+ warnings.warn(
337
+ f"No consumption LUT found for vehicle type {trip.rotation.vehicle_type}.",
338
+ ConsistencyWarning,
339
+ )
340
+ # Here, we fill out the condumption information without the LUT and LUT data, but with `consumption_per_km`
341
+ # set to the vehicle's `consumption` value.
342
+ assert (
343
+ VehicleType.consumption is not None
344
+ ), f"Vehicle type {trip.rotation.vehicle_type} must have a consumption value set if no consumption LUT is available."
345
+ info = ConsumptionInformation(
346
+ trip_id=trip.id,
347
+ average_speed=average_speed,
348
+ distance=total_distance,
349
+ consumption_per_km=trip.rotation.vehicle_type.consumption,
350
+ consumption=trip.rotation.vehicle_type.consumption * total_distance,
351
+ consumption_lut=None,
352
+ temperature=temperature,
353
+ level_of_loading=level_of_loading,
354
+ )
355
+ else:
356
+ raise ValueError(
357
+ f"Expected exactly one consumption LUT, got {len(all_consumption_luts)}"
358
+ )
335
359
 
336
- info.calculate()
337
360
  return info
338
361
 
339
362
 
@@ -1,6 +1,7 @@
1
1
  """This module contains miscellaneous utility functions for the eflips-depot API."""
2
2
  import logging
3
3
  import os
4
+ import warnings
4
5
  from contextlib import contextmanager
5
6
  from dataclasses import dataclass
6
7
  from datetime import timedelta, datetime
@@ -17,9 +18,11 @@ from eflips.model import (
17
18
  Trip,
18
19
  Depot,
19
20
  Temperatures,
21
+ ConsistencyWarning,
20
22
  )
21
23
  from eflips.model import create_engine
22
24
  from sqlalchemy import inspect
25
+ from sqlalchemy.exc import NoResultFound
23
26
  from sqlalchemy.orm import Session
24
27
 
25
28
  from eflips.depot import SimpleTrip, Timetable as EflipsTimeTable
@@ -204,7 +207,9 @@ def check_depot_validity(depot: Depot) -> None:
204
207
 
205
208
  def temperature_for_trip(trip_id: int, session: Session) -> float:
206
209
  """
207
- Returns the temperature for a trip. Finds the temperature for the mid-point of the trip.
210
+ Returns the temperature for a trip.
211
+
212
+ Finds the temperature for the mid-point of the trip.
208
213
 
209
214
  :param trip_id: The ID of the trip
210
215
  :param session: The SQLAlchemy session
@@ -212,11 +217,18 @@ def temperature_for_trip(trip_id: int, session: Session) -> float:
212
217
  """
213
218
 
214
219
  trip = session.query(Trip).filter(Trip.id == trip_id).one()
215
- temperatures = (
216
- session.query(Temperatures)
217
- .filter(Temperatures.scenario_id == trip.scenario_id)
218
- .one()
219
- )
220
+ try:
221
+ temperatures = (
222
+ session.query(Temperatures)
223
+ .filter(Temperatures.scenario_id == trip.scenario_id)
224
+ .one()
225
+ )
226
+ except NoResultFound:
227
+ warnings.warn(
228
+ f"No temperatures found for scenario {trip.scenario_id}.",
229
+ ConsistencyWarning,
230
+ )
231
+ return None
220
232
 
221
233
  # Find the mid-point of the trip
222
234
  mid_time = trip.departure_time + (trip.arrival_time - trip.departure_time) / 2
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "eflips-depot"
3
- version = "4.15.0"
3
+ version = "4.15.1"
4
4
  description = "Depot Simulation for eFLIPS"
5
5
  authors = ["Enrico Lauth <enrico.lauth@tu-berlin.de>",
6
6
  "Ludger Heide <ludger.heide@tu-berlin.de",
File without changes
File without changes