Skip to content

Commit 5d154d5

Browse files
committed
Initialize speed and position with float constants
Ensure that speed and position are initialized using floating-point values. This prevents vectorized environment wrappers from inferring an integer dtype when a single environment resets, which could otherwise cause loss of precision.
1 parent a7cfdfa commit 5d154d5

File tree

12 files changed

+109
-64
lines changed

12 files changed

+109
-64
lines changed

highway_env/envs/exit_env.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ def _create_vehicles(self) -> None:
107107
for _ in range(self.config["controlled_vehicles"]):
108108
vehicle = Vehicle.create_random(
109109
self.road,
110-
speed=25,
110+
speed=25.0,
111111
lane_from="0",
112112
lane_to="1",
113113
lane_id=0,

highway_env/envs/highway_env.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ def _create_vehicles(self) -> None:
7676
for others in other_per_controlled:
7777
vehicle = Vehicle.create_random(
7878
self.road,
79-
speed=25,
79+
speed=25.0,
8080
lane_id=self.config["initial_lane_id"],
8181
spacing=self.config["ego_spacing"],
8282
)

highway_env/envs/intersection_env.py

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ def _make_road(self) -> None:
177177
"o" + str(corner),
178178
"ir" + str(corner),
179179
StraightLane(
180-
start, end, line_types=[s, c], priority=priority, speed_limit=10
180+
start, end, line_types=[s, c], priority=priority, speed_limit=10.0
181181
),
182182
)
183183
# Right turn
@@ -192,7 +192,7 @@ def _make_road(self) -> None:
192192
angle + np.radians(270),
193193
line_types=[n, c],
194194
priority=priority,
195-
speed_limit=10,
195+
speed_limit=10.0,
196196
),
197197
)
198198
# Left turn
@@ -215,7 +215,7 @@ def _make_road(self) -> None:
215215
clockwise=False,
216216
line_types=[n, n],
217217
priority=priority - 1,
218-
speed_limit=10,
218+
speed_limit=10.0,
219219
),
220220
)
221221
# Straight
@@ -225,7 +225,7 @@ def _make_road(self) -> None:
225225
"ir" + str(corner),
226226
"il" + str((corner + 2) % 4),
227227
StraightLane(
228-
start, end, line_types=[s, n], priority=priority, speed_limit=10
228+
start, end, line_types=[s, n], priority=priority, speed_limit=10.0
229229
),
230230
)
231231
# Exit
@@ -237,7 +237,7 @@ def _make_road(self) -> None:
237237
"il" + str((corner - 1) % 4),
238238
"o" + str((corner - 1) % 4),
239239
StraightLane(
240-
end, start, line_types=[n, c], priority=priority, speed_limit=10
240+
end, start, line_types=[n, c], priority=priority, speed_limit=10.0
241241
),
242242
)
243243

@@ -276,10 +276,10 @@ def _make_vehicles(self, n_vehicles: int = 10) -> None:
276276
# Challenger vehicle
277277
self._spawn_vehicle(
278278
60,
279-
spawn_probability=1,
279+
spawn_probability=1.0,
280280
go_straight=True,
281281
position_deviation=0.1,
282-
speed_deviation=0,
282+
speed_deviation=0.0,
283283
)
284284

285285
# Controlled vehicles
@@ -293,9 +293,9 @@ def _make_vehicles(self, n_vehicles: int = 10) -> None:
293293
)
294294
ego_vehicle = self.action_type.vehicle_class(
295295
self.road,
296-
ego_lane.position(60 + 5 * self.np_random.normal(1), 0),
296+
ego_lane.position(60.0 + 5.0 * self.np_random.normal(1.0), 0.0),
297297
speed=ego_lane.speed_limit,
298-
heading=ego_lane.heading_at(60),
298+
heading=ego_lane.heading_at(60.0),
299299
)
300300
try:
301301
ego_vehicle.plan_route_to(destination)
@@ -335,9 +335,9 @@ def _spawn_vehicle(
335335
self.road,
336336
("o" + str(route[0]), "ir" + str(route[0]), 0),
337337
longitudinal=(
338-
longitudinal + 5 + self.np_random.normal() * position_deviation
338+
longitudinal + 5.0 + self.np_random.normal() * position_deviation
339339
),
340-
speed=8 + self.np_random.normal() * speed_deviation,
340+
speed=8.0 + self.np_random.normal() * speed_deviation,
341341
)
342342
for v in self.road.vehicles:
343343
if np.linalg.norm(v.position - vehicle.position) < 15:

highway_env/envs/merge_env.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -160,21 +160,21 @@ def _make_vehicles(self) -> None:
160160
"""
161161
road = self.road
162162
ego_vehicle = self.action_type.vehicle_class(
163-
road, road.network.get_lane(("a", "b", 1)).position(30, 0), speed=30
163+
road, road.network.get_lane(("a", "b", 1)).position(30.0, 0.0), speed=30.0
164164
)
165165
road.vehicles.append(ego_vehicle)
166166

167167
other_vehicles_type = utils.class_from_path(self.config["other_vehicles_type"])
168168

169-
for position, speed in [(90, 29), (70, 31), (5, 31.5)]:
169+
for position, speed in [(90.0, 29.0), (70.0, 31.0), (5.0, 31.5)]:
170170
lane = road.network.get_lane(("a", "b", self.np_random.integers(2)))
171-
position = lane.position(position + self.np_random.uniform(-5, 5), 0)
172-
speed += self.np_random.uniform(-1, 1)
171+
position = lane.position(position + self.np_random.uniform(-5.0, 5.0), 0.0)
172+
speed += self.np_random.uniform(-1.0, 1.0)
173173
road.vehicles.append(other_vehicles_type(road, position, speed=speed))
174174

175175
merging_v = other_vehicles_type(
176-
road, road.network.get_lane(("j", "k", 0)).position(110, 0), speed=20
176+
road, road.network.get_lane(("j", "k", 0)).position(110.0, 0.0), speed=20.0
177177
)
178-
merging_v.target_speed = 30
178+
merging_v.target_speed = 30.0
179179
road.vehicles.append(merging_v)
180180
self.vehicle = ego_vehicle

highway_env/envs/parking_env.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -180,9 +180,9 @@ def _create_vehicles(self) -> None:
180180
# Controlled vehicles
181181
self.controlled_vehicles = []
182182
for i in range(self.config["controlled_vehicles"]):
183-
x0 = (i - self.config["controlled_vehicles"] // 2) * 10
183+
x0 = float(i - self.config["controlled_vehicles"] // 2) * 10.0
184184
vehicle = self.action_type.vehicle_class(
185-
self.road, [x0, 0], 2 * np.pi * self.np_random.uniform(), 0
185+
self.road, [x0, 0.0], 2.0 * np.pi * self.np_random.uniform(), 0.0
186186
)
187187
vehicle.color = VehicleGraphics.EGO_COLOR
188188
self.road.vehicles.append(vehicle)
@@ -204,7 +204,7 @@ def _create_vehicles(self) -> None:
204204
if not empty_spots:
205205
continue
206206
lane_index = empty_spots[self.np_random.choice(np.arange(len(empty_spots)))]
207-
v = Vehicle.make_on_lane(self.road, lane_index, 4, speed=0)
207+
v = Vehicle.make_on_lane(self.road, lane_index, longitudinal=4.0, speed=0.0)
208208
self.road.vehicles.append(v)
209209
empty_spots.remove(lane_index)
210210

highway_env/envs/racetrack_env.py

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ def _make_road(self) -> None:
9696

9797
# Set Speed Limits for Road Sections - Straight, Turn20, Straight,
9898
# Turn 15, Turn15, Straight, Turn25x2, Turn18
99-
speedlimits = [None, 10, 10, 10, 10, 10, 10, 10, 10]
99+
speedlimits = [None, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0]
100100

101101
# Initialise First Lane
102102
lane = StraightLane(
@@ -393,9 +393,9 @@ def _make_vehicles(self) -> None:
393393
self.road,
394394
("b", "c", lane_index[-1]),
395395
longitudinal=rng.uniform(
396-
low=0, high=self.road.network.get_lane(("b", "c", 0)).length
396+
low=0.0, high=self.road.network.get_lane(("b", "c", 0)).length
397397
),
398-
speed=6 + rng.uniform(high=3),
398+
speed=6.0 + rng.uniform(high=3.0),
399399
)
400400
self.road.vehicles.append(vehicle)
401401

@@ -407,9 +407,9 @@ def _make_vehicles(self) -> None:
407407
self.road,
408408
rand_lane_index,
409409
longitudinal=rng.uniform(
410-
low=0, high=self.road.network.get_lane(rand_lane_index).length
410+
low=0.0, high=self.road.network.get_lane(rand_lane_index).length
411411
),
412-
speed=6 + rng.uniform(high=3),
412+
speed=6.0 + rng.uniform(high=3.0),
413413
)
414414
# Prevent early collisions
415415
for v in self.road.vehicles:
@@ -1304,13 +1304,13 @@ def _make_road(self) -> None:
13041304

13051305
# Scenario to force a "binary" decision
13061306
if self.config["block_lane"]:
1307-
for i in [40, 43, 46, 49]:
1307+
for i in [40.0, 43.0, 46.0, 49.0]:
13081308
road.objects.append(Obstacle(road, [length - i, 3.75]))
13091309
road.objects.append(Obstacle(road, [length - i, 6.25]))
13101310

13111311
if self.config["force_decision"]:
13121312
for i in [-1.25, 1.25, 8.85, 11.25]:
1313-
road.objects.append(Obstacle(road, [length - 90, i]))
1313+
road.objects.append(Obstacle(road, [length - 90.0, i]))
13141314

13151315
self.road = road
13161316

@@ -1333,7 +1333,7 @@ def _make_vehicles(self) -> None:
13331333
else self.road.network.random_lane_index(rng)
13341334
)
13351335
controlled_vehicle = self.action_type.vehicle_class.make_on_lane(
1336-
self.road, lane_index, speed=None, longitudinal=rng.uniform(20, 50)
1336+
self.road, lane_index, speed=None, longitudinal=rng.uniform(20.0, 50.0)
13371337
)
13381338

13391339
self.controlled_vehicles.append(controlled_vehicle)
@@ -1345,9 +1345,9 @@ def _make_vehicles(self) -> None:
13451345
self.road,
13461346
("b", "c", lane_index[-1]),
13471347
longitudinal=rng.uniform(
1348-
low=0, high=self.road.network.get_lane(("b", "c", 0)).length
1348+
low=0.0, high=self.road.network.get_lane(("b", "c", 0)).length
13491349
),
1350-
speed=6 + rng.uniform(high=3),
1350+
speed=6.0 + rng.uniform(high=3.0),
13511351
)
13521352
self.road.vehicles.append(vehicle)
13531353

@@ -1358,13 +1358,13 @@ def _make_vehicles(self) -> None:
13581358
self.road,
13591359
rand_lane_index,
13601360
longitudinal=rng.uniform(
1361-
low=0, high=self.road.network.get_lane(rand_lane_index).length
1361+
low=0.0, high=self.road.network.get_lane(rand_lane_index).length
13621362
),
1363-
speed=6 + rng.uniform(high=3),
1363+
speed=6.0 + rng.uniform(high=3.0),
13641364
)
13651365
# Prevent early collisions
13661366
for v in self.road.vehicles:
1367-
if np.linalg.norm(vehicle.position - v.position) < 20:
1367+
if np.linalg.norm(vehicle.position - v.position) < 20.0:
13681368
break
13691369
else:
13701370
self.road.vehicles.append(vehicle)

highway_env/envs/roundabout_env.py

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -326,16 +326,16 @@ def _make_vehicles(self) -> None:
326326
327327
:return: the ego-vehicle
328328
"""
329-
position_deviation = 2
330-
speed_deviation = 2
329+
position_deviation = 2.0
330+
speed_deviation = 2.0
331331

332332
# Ego-vehicle
333333
ego_lane = self.road.network.get_lane(("ser", "ses", 0))
334334
ego_vehicle = self.action_type.vehicle_class(
335335
self.road,
336-
ego_lane.position(125, 0),
337-
speed=8,
338-
heading=ego_lane.heading_at(140),
336+
ego_lane.position(125.0, 0.0),
337+
speed=8.0,
338+
heading=ego_lane.heading_at(140.0),
339339
)
340340
try:
341341
ego_vehicle.plan_route_to("nxs")
@@ -350,7 +350,7 @@ def _make_vehicles(self) -> None:
350350
vehicle = other_vehicles_type.make_on_lane(
351351
self.road,
352352
("we", "sx", 1),
353-
longitudinal=5 + self.np_random.normal() * position_deviation,
353+
longitudinal=5.0 + self.np_random.normal() * position_deviation,
354354
speed=16 + self.np_random.normal() * speed_deviation,
355355
)
356356

@@ -367,8 +367,9 @@ def _make_vehicles(self) -> None:
367367
vehicle = other_vehicles_type.make_on_lane(
368368
self.road,
369369
("we", "sx", 0),
370-
longitudinal=20 * i + self.np_random.normal() * position_deviation,
371-
speed=16 + self.np_random.normal() * speed_deviation,
370+
longitudinal=20.0 * float(i)
371+
+ self.np_random.normal() * position_deviation,
372+
speed=16.0 + self.np_random.normal() * speed_deviation,
372373
)
373374
vehicle.plan_route_to(self.np_random.choice(destinations))
374375
vehicle.randomize_behavior()
@@ -378,8 +379,8 @@ def _make_vehicles(self) -> None:
378379
vehicle = other_vehicles_type.make_on_lane(
379380
self.road,
380381
("eer", "ees", 0),
381-
longitudinal=50 + self.np_random.normal() * position_deviation,
382-
speed=16 + self.np_random.normal() * speed_deviation,
382+
longitudinal=50.0 + self.np_random.normal() * position_deviation,
383+
speed=16.0 + self.np_random.normal() * speed_deviation,
383384
)
384385
vehicle.plan_route_to(self.np_random.choice(destinations))
385386
vehicle.randomize_behavior()

highway_env/envs/two_way_env.py

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ def _make_vehicles(self) -> None:
118118
"""
119119
road = self.road
120120
ego_vehicle = self.action_type.vehicle_class(
121-
road, road.network.get_lane(("a", "b", 1)).position(30, 0), speed=30
121+
road, road.network.get_lane(("a", "b", 1)).position(30.0, 0.0), speed=30.0
122122
)
123123
road.vehicles.append(ego_vehicle)
124124
self.vehicle = ego_vehicle
@@ -129,23 +129,25 @@ def _make_vehicles(self) -> None:
129129
vehicles_type(
130130
road,
131131
position=road.network.get_lane(("a", "b", 1)).position(
132-
70 + 40 * i + 10 * self.np_random.normal(), 0
132+
70.0 + 40.0 * float(i) + 10.0 * self.np_random.normal(), 0.00
133133
),
134134
heading=road.network.get_lane(("a", "b", 1)).heading_at(
135-
70 + 40 * i
135+
70.0 + 40.0 * float(i)
136136
),
137-
speed=24 + 2 * self.np_random.normal(),
137+
speed=24.0 + 2.0 * self.np_random.normal(),
138138
enable_lane_change=False,
139139
)
140140
)
141141
for i in range(2):
142142
v = vehicles_type(
143143
road,
144144
position=road.network.get_lane(("b", "a", 0)).position(
145-
200 + 100 * i + 10 * self.np_random.normal(), 0
145+
200.0 + 100.0 * float(i) + 10.0 * self.np_random.normal(), 0
146146
),
147-
heading=road.network.get_lane(("b", "a", 0)).heading_at(200 + 100 * i),
148-
speed=20 + 5 * self.np_random.normal(),
147+
heading=road.network.get_lane(("b", "a", 0)).heading_at(
148+
200.0 + 100.0 * float(i)
149+
),
150+
speed=20.0 + 5.0 * self.np_random.normal(),
149151
enable_lane_change=False,
150152
)
151153
v.target_lane_index = ("b", "a", 0)

highway_env/envs/u_turn_env.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -181,12 +181,12 @@ def _make_vehicles(self) -> None:
181181
"""
182182

183183
# These variables add small variations to the driving behavior.
184-
position_deviation = 2
185-
speed_deviation = 2
184+
position_deviation = 2.0
185+
speed_deviation = 2.0
186186

187187
ego_lane = self.road.network.get_lane(("a", "b", 0))
188188
ego_vehicle = self.action_type.vehicle_class(
189-
self.road, ego_lane.position(0, 0), speed=16
189+
self.road, ego_lane.position(0, 0), speed=16.0
190190
)
191191
# Stronger anticipation for the turn
192192
ego_vehicle.PURSUIT_TAU = MDPVehicle.TAU_HEADING
@@ -207,7 +207,7 @@ def _make_vehicles(self) -> None:
207207
vehicle = vehicles_type.make_on_lane(
208208
self.road,
209209
("a", "b", 0),
210-
longitudinal=25 + self.np_random.normal() * position_deviation,
210+
longitudinal=25.0 + self.np_random.normal() * position_deviation,
211211
speed=13.5 + self.np_random.normal() * speed_deviation,
212212
)
213213
vehicle.plan_route_to("d")
@@ -218,7 +218,7 @@ def _make_vehicles(self) -> None:
218218
vehicle = vehicles_type.make_on_lane(
219219
self.road,
220220
("a", "b", 1),
221-
longitudinal=56 + self.np_random.normal() * position_deviation,
221+
longitudinal=56.0 + self.np_random.normal() * position_deviation,
222222
speed=14.5 + self.np_random.normal() * speed_deviation,
223223
)
224224
vehicle.plan_route_to("d")
@@ -251,7 +251,7 @@ def _make_vehicles(self) -> None:
251251
vehicle = vehicles_type.make_on_lane(
252252
self.road,
253253
("c", "d", 0),
254-
longitudinal=1 + self.np_random.normal() * position_deviation,
254+
longitudinal=1.0 + self.np_random.normal() * position_deviation,
255255
speed=3.5 + self.np_random.normal() * speed_deviation,
256256
)
257257
vehicle.plan_route_to("d")
@@ -262,7 +262,7 @@ def _make_vehicles(self) -> None:
262262
vehicle = vehicles_type.make_on_lane(
263263
self.road,
264264
("c", "d", 1),
265-
longitudinal=30 + self.np_random.normal() * position_deviation,
265+
longitudinal=30.0 + self.np_random.normal() * position_deviation,
266266
speed=5.5 + self.np_random.normal() * speed_deviation,
267267
)
268268
vehicle.plan_route_to("d")

highway_env/road/road.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -291,10 +291,10 @@ def lanes_dict(self) -> dict[str, AbstractLane]:
291291
@staticmethod
292292
def straight_road_network(
293293
lanes: int = 4,
294-
start: float = 0,
295-
length: float = 10000,
296-
angle: float = 0,
297-
speed_limit: float = 30,
294+
start: float = 0.0,
295+
length: float = 10000.0,
296+
angle: float = 0.0,
297+
speed_limit: float = 30.0,
298298
nodes_str: tuple[str, str] | None = None,
299299
net: RoadNetwork | None = None,
300300
) -> RoadNetwork:

0 commit comments

Comments
 (0)