Skip to content

Commit a15b8ba

Browse files
authored
Merge pull request #179 from NREL/rjf/jkirsh2-issue126-formatting
Rjf/jkirsh2 issue126 formatting
2 parents fb89740 + b7b7e4e commit a15b8ba

File tree

9 files changed

+121
-1
lines changed

9 files changed

+121
-1
lines changed

nrel/hive/initialization/sample_vehicles.py

+4
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,8 @@ def _inner(
7575
vehicle_id = f"v{i}"
7676
initial_soc = soc_sampling_function()
7777
energy = mechatronics.initial_energy(initial_soc)
78+
energy_expended = mechatronics.initial_energy(0)
79+
energy_gained = mechatronics.initial_energy(0)
7880
link = location_sampling_function(s)
7981
position = EntityPosition(link.link_id, link.start)
8082
vehicle_state = Idle.build(vehicle_id)
@@ -83,6 +85,8 @@ def _inner(
8385
id=vehicle_id,
8486
mechatronics_id=mechatronics_id,
8587
energy=energy,
88+
energy_expended=energy_expended,
89+
energy_gained=energy_gained,
8690
position=position,
8791
vehicle_state=vehicle_state,
8892
driver_state=driver_state,

nrel/hive/model/station/station.py

+18
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
from returns.result import ResultE, Success, Failure
1212

1313
from nrel.hive.model.energy.charger import Charger
14+
from nrel.hive.model.energy.energytype import EnergyType
1415
from nrel.hive.model.entity import Entity
1516
from nrel.hive.model.entity_position import EntityPosition
1617
from nrel.hive.model.membership import Membership
@@ -57,6 +58,7 @@ class Station(Entity):
5758
position: EntityPosition
5859
membership: Membership
5960
state: immutables.Map[ChargerId, ChargerState]
61+
energy_dispensed: immutables.Map[EnergyType, float]
6062
on_shift_access_chargers: FrozenSet[ChargerId]
6163
balance: Currency = 0.0
6264

@@ -114,17 +116,20 @@ def _chargers(acc, charger_data):
114116
msg = f"internal error after building station chargers for station {id}"
115117
raise Exception(msg)
116118

119+
energy_dispensed = immutables.Map({energy_type: 0.0 for energy_type in EnergyType})
117120
position = road_network.position_from_geoid(geoid)
118121
if position is None:
119122
msg = (
120123
"could not find a road network position matching the position "
121124
f"provided for station {id}"
122125
)
123126
raise H3Error(msg)
127+
124128
return Station(
125129
id=id,
126130
position=position,
127131
state=charger_states,
132+
energy_dispensed=energy_dispensed,
128133
on_shift_access_chargers=on_shift_access,
129134
membership=membership,
130135
)
@@ -408,6 +413,19 @@ def receive_payment(self, currency_received: Currency) -> Station:
408413
"""
409414
return replace(self, balance=self.balance + currency_received)
410415

416+
def tick_energy_dispensed(self, delta_energy: immutables.Map[EnergyType, float]) -> Station:
417+
"""
418+
adds energy dispensed to vehicle
419+
420+
:param delta_energy: the energy dispensed for a charge event
421+
:return: the updated Station
422+
"""
423+
energy_dispensed = {
424+
k: self.energy_dispensed[k] + delta_energy.get(k, 0)
425+
for k in self.energy_dispensed.keys()
426+
}
427+
return replace(self, energy_dispensed=immutables.Map(energy_dispensed))
428+
411429
def enqueue_for_charger(self, charger_id: ChargerId) -> ErrorOr[Station]:
412430
"""
413431
increment the count of vehicles enqueued for a specific charger_id type - no limit

nrel/hive/model/vehicle/mechatronics/bev.py

+9
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,9 @@ def consume_energy(self, vehicle: Vehicle, route: Route) -> Vehicle:
173173
updated_vehicle = vehicle.modify_energy(
174174
immutables.Map({EnergyType.ELECTRIC: new_energy_kwh})
175175
)
176+
updated_vehicle = updated_vehicle.tick_energy_expended(
177+
immutables.Map({EnergyType.ELECTRIC: vehicle_energy_kwh - new_energy_kwh})
178+
)
176179
return updated_vehicle
177180

178181
def idle(self, vehicle: Vehicle, time_seconds: Seconds) -> Vehicle:
@@ -191,6 +194,9 @@ def idle(self, vehicle: Vehicle, time_seconds: Seconds) -> Vehicle:
191194
updated_vehicle = vehicle.modify_energy(
192195
immutables.Map({EnergyType.ELECTRIC: new_energy_kwh})
193196
)
197+
updated_vehicle = updated_vehicle.tick_energy_expended(
198+
immutables.Map({EnergyType.ELECTRIC: vehicle_energy_kwh - new_energy_kwh})
199+
)
194200

195201
return updated_vehicle
196202

@@ -234,5 +240,8 @@ def add_energy(
234240
updated_vehicle = vehicle.modify_energy(
235241
immutables.Map({EnergyType.ELECTRIC: new_energy_kwh})
236242
)
243+
updated_vehicle = updated_vehicle.tick_energy_gained(
244+
immutables.Map({EnergyType.ELECTRIC: new_energy_kwh - start_energy_kwh})
245+
)
237246

238247
return updated_vehicle, time_charging_seconds

nrel/hive/model/vehicle/mechatronics/ice.py

+9
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,9 @@ def consume_energy(self, vehicle: Vehicle, route: Route) -> Vehicle:
150150
updated_vehicle = vehicle.modify_energy(
151151
immutables.Map({EnergyType.GASOLINE: new_energy_gal_gas})
152152
)
153+
updated_vehicle = vehicle.tick_energy_expended(
154+
immutables.Map({EnergyType.GASOLINE: vehicle_energy_gal_gas - new_energy_gal_gas})
155+
)
153156
return updated_vehicle
154157

155158
def idle(self, vehicle: Vehicle, time_seconds: Seconds) -> Vehicle:
@@ -168,6 +171,9 @@ def idle(self, vehicle: Vehicle, time_seconds: Seconds) -> Vehicle:
168171
updated_vehicle = vehicle.modify_energy(
169172
immutables.Map({EnergyType.GASOLINE: new_energy_gal_gas})
170173
)
174+
updated_vehicle = vehicle.tick_energy_expended(
175+
immutables.Map({EnergyType.GASOLINE: vehicle_energy_gal_gas - new_energy_gal_gas})
176+
)
171177

172178
return updated_vehicle
173179

@@ -196,5 +202,8 @@ def add_energy(
196202
new_gal_gas = min(self.tank_capacity_gallons, pump_gal_gas)
197203

198204
updated_vehicle = vehicle.modify_energy(immutables.Map({EnergyType.GASOLINE: new_gal_gas}))
205+
updated_vehicle = updated_vehicle.tick_energy_gained(
206+
immutables.Map({EnergyType.GASOLINE: new_gal_gas - start_gal_gas})
207+
)
199208

200209
return updated_vehicle, time_seconds

nrel/hive/model/vehicle/vehicle.py

+26
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ class Vehicle(Entity):
4545
# mechatronic properties
4646
mechatronics_id: MechatronicsId
4747
energy: immutables.Map[EnergyType, float]
48+
energy_gained: immutables.Map[EnergyType, float]
49+
energy_expended: immutables.Map[EnergyType, float]
4850

4951
# vehicle planning/operational properties
5052
vehicle_state: VehicleState
@@ -101,6 +103,8 @@ def from_row(
101103
f"was not able to find mechatronics '{mechatronics_id}' for vehicle {vehicle_id} in environment: found {found}"
102104
)
103105
energy = mechatronics.initial_energy(float(row["initial_soc"]))
106+
energy_expended = mechatronics.initial_energy(0.0)
107+
energy_gained = mechatronics.initial_energy(0.0)
104108

105109
schedule_id = row.get(
106110
"schedule_id"
@@ -130,6 +134,8 @@ def from_row(
130134
id=vehicle_id,
131135
mechatronics_id=mechatronics_id,
132136
energy=energy,
137+
energy_expended=energy_expended,
138+
energy_gained=energy_gained,
133139
membership=Membership(),
134140
position=start_position,
135141
vehicle_state=Idle.build(vehicle_id),
@@ -207,6 +213,26 @@ def tick_distance_traveled_km(self, delta_d_km: Kilometers) -> Vehicle:
207213
"""
208214
return replace(self, distance_traveled_km=self.distance_traveled_km + delta_d_km)
209215

216+
def tick_energy_expended(self, delta_energy: immutables.Map[EnergyType, float]) -> Vehicle:
217+
"""
218+
adds energy expenditure to vehicle
219+
220+
:param delta_energy:
221+
:return:
222+
"""
223+
energy_expended = {k: self.energy_expended[k] + delta_energy[k] for k in self.energy.keys()}
224+
return replace(self, energy_expended=immutables.Map(energy_expended))
225+
226+
def tick_energy_gained(self, delta_energy: immutables.Map[EnergyType, float]) -> Vehicle:
227+
"""
228+
adds energy gain to vehicle
229+
230+
:param delta_energy:
231+
:return:
232+
"""
233+
energy_gained = {k: self.energy_gained[k] + delta_energy[k] for k in self.energy.keys()}
234+
return replace(self, energy_gained=immutables.Map(energy_gained))
235+
210236
def set_membership(self, member_ids: Tuple[str, ...]) -> Vehicle:
211237
"""
212238
sets the membership(s) of the vehicle

nrel/hive/reporting/handler/stateful_handler.py

+1
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ def station_asdict(station: Station) -> dict:
102102
out_dict = asdict(station)
103103
del out_dict["id"]
104104
del out_dict["state"]
105+
del out_dict["energy_dispensed"]
105106

106107
out_dict["station_id"] = station.id
107108
out_dict["memberships"] = str(station.membership)

nrel/hive/reporting/handler/summary_stats.py

+41
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from functools import reduce
77
from statistics import mean
88
from typing import TYPE_CHECKING, Dict, Any
9+
from nrel.hive.model.energy.energytype import EnergyType
910

1011
if TYPE_CHECKING:
1112
from nrel.hive.runner.runner_payload import RunnerPayload
@@ -29,6 +30,12 @@ class SummaryStats:
2930
station_revenue: float = 0
3031
fleet_revenue: float = 0
3132

33+
total_vkwh_expended: float = 0
34+
total_vgge_expended: float = 0
35+
36+
total_skwh_dispensed: float = 0
37+
total_sgge_dispensed: float = 0
38+
3239
def compile_stats(self, rp: RunnerPayload) -> Dict[str, Any]:
3340
"""
3441
computes all stats based on values accumulated throughout this run
@@ -76,11 +83,33 @@ def compile_stats(self, rp: RunnerPayload) -> Dict[str, Any]:
7683
data = {"observed_percent": observed_pct, "vkt": vkt}
7784
vehicle_state_output.update({v: data})
7885

86+
total_vkwh_expended = 0.0
87+
total_vgge_expended = 0.0
88+
for vehicle in rp.s.get_vehicles():
89+
total_vkwh_expended += vehicle.energy_expended.get(EnergyType.ELECTRIC, 0.0)
90+
total_vgge_expended += vehicle.energy_expended.get(EnergyType.GASOLINE, 0.0)
91+
92+
self.total_vkwh_expended = total_vkwh_expended
93+
self.total_vgge_expended = total_vgge_expended
94+
95+
total_skwh_dispensed = 0.0
96+
total_sgge_dispensed = 0.0
97+
for station in rp.s.get_stations():
98+
total_skwh_dispensed += station.energy_dispensed.get(EnergyType.ELECTRIC, 0.0)
99+
total_sgge_dispensed += station.energy_dispensed.get(EnergyType.GASOLINE, 0.0)
100+
101+
self.total_skwh_dispensed = total_skwh_dispensed
102+
self.total_sgge_dispensed = total_sgge_dispensed
103+
79104
output = {
80105
"mean_final_soc": self.mean_final_soc,
81106
"requests_served_percent": requests_served_percent,
82107
"vehicle_state": vehicle_state_output,
83108
"total_vkt": total_vkt,
109+
"total_kwh_expended": total_vkwh_expended,
110+
"total_gge_expended": total_vgge_expended,
111+
"total_kwh_dispensed": total_skwh_dispensed,
112+
"total_gge_dispensed": total_sgge_dispensed,
84113
"station_revenue_dollars": self.station_revenue,
85114
"fleet_revenue_dollars": self.fleet_revenue,
86115
"final_vehicle_count": len(sim_state.vehicles),
@@ -109,6 +138,18 @@ def log(self):
109138
for s, v in self.vkt.items():
110139
table.add_row(f"Kilometers Traveled in State {s}", f"{round(v, 2)} km")
111140

141+
table.add_row("Total kWh Expended By Vehicles", f"{round(self.total_vkwh_expended, 2)} kWh")
142+
table.add_row(
143+
"Total Gasoline Expended By Vehicles", f"{round(self.total_vgge_expended, 2)} Gal"
144+
)
145+
146+
table.add_row(
147+
"Total kWh Dispensed By Stations", f"{round(self.total_skwh_dispensed, 2)} kWh"
148+
)
149+
table.add_row(
150+
"Total Gasoline Dispensed By Stations", f"{round(self.total_sgge_dispensed, 2)} Gal"
151+
)
152+
112153
table.add_row("Station Revenue", f"$ {round(self.station_revenue, 2)}")
113154
table.add_row("Fleet Revenue", f"$ {round(self.fleet_revenue, 2)}")
114155

nrel/hive/resources/mock_lobster.py

+9
Original file line numberDiff line numberDiff line change
@@ -371,6 +371,8 @@ def mock_vehicle(
371371
v_state = vehicle_state if vehicle_state else Idle.build(vehicle_id)
372372
road_network = mock_network(h3_res)
373373
initial_energy = mechatronics.initial_energy(soc)
374+
energy_expended = mechatronics.initial_energy(0.0)
375+
energy_gained = mechatronics.initial_energy(0.0)
374376
geoid = h3.geo_to_h3(lat, lon, road_network.sim_h3_resolution)
375377
d_state = (
376378
driver_state
@@ -386,6 +388,8 @@ def mock_vehicle(
386388
id=vehicle_id,
387389
mechatronics_id=mechatronics.mechatronics_id,
388390
energy=initial_energy,
391+
energy_expended=energy_expended,
392+
energy_gained=energy_gained,
389393
position=position,
390394
vehicle_state=v_state,
391395
driver_state=d_state,
@@ -406,6 +410,9 @@ def mock_vehicle_from_geoid(
406410
) -> Vehicle:
407411
state = vehicle_state if vehicle_state else Idle.build(vehicle_id)
408412
initial_energy = mechatronics.initial_energy(soc)
413+
energy_expended = mechatronics.initial_energy(0.0)
414+
energy_gained = mechatronics.initial_energy(0.0)
415+
409416
d_state = (
410417
driver_state
411418
if driver_state
@@ -420,6 +427,8 @@ def mock_vehicle_from_geoid(
420427
id=vehicle_id,
421428
mechatronics_id=mechatronics.mechatronics_id,
422429
energy=initial_energy,
430+
energy_expended=energy_expended,
431+
energy_gained=energy_gained,
423432
position=position,
424433
vehicle_state=state,
425434
driver_state=d_state,

nrel/hive/state/vehicle_state/vehicle_state_ops.py

+4-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from __future__ import annotations
22

33
from typing import Tuple, Optional, NamedTuple, TYPE_CHECKING
4-
4+
import immutables
55
from nrel.hive.model.entity_position import EntityPosition
66
from nrel.hive.model.roadnetwork.route import empty_route
77
from nrel.hive.model.roadnetwork.routetraversal import traverse, RouteTraversal
@@ -97,6 +97,9 @@ def charge(
9797
# perform updates
9898
updated_vehicle = charged_vehicle.send_payment(charging_price)
9999
updated_station = station.receive_payment(charging_price)
100+
updated_station = updated_station.tick_energy_dispensed(
101+
immutables.Map({charger.energy_type: kwh_transacted})
102+
)
100103

101104
veh_error, sim_with_vehicle = simulation_state_ops.modify_vehicle(sim, updated_vehicle)
102105
if veh_error:

0 commit comments

Comments
 (0)