Skip to content

Commit 2397a15

Browse files
Merge pull request #438 from flow-project/velocity_bottleneck_tests
Velocity bottleneck tests
2 parents f8cc6c1 + 533a036 commit 2397a15

File tree

4 files changed

+134
-32
lines changed

4 files changed

+134
-32
lines changed

flow/controllers/__init__.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
BCMController, OVMController, LinearOVM, IDMController, \
1717
SimCarFollowingController
1818
from flow.controllers.velocity_controllers import FollowerStopper, \
19-
PISaturation, HandTunedVelocityController
19+
PISaturation
2020

2121
# lane change controllers
2222
from flow.controllers.base_lane_changing_controller import \
@@ -33,7 +33,6 @@
3333
"RLController", "BaseController", "BaseLaneChangeController", "BaseRouter",
3434
"CFMController", "BCMController", "OVMController", "LinearOVM",
3535
"IDMController", "SimCarFollowingController", "FollowerStopper",
36-
"PISaturation", "HandTunedVelocityController", "StaticLaneChanger",
37-
"SimLaneChangeController", "ContinuousRouter", "GridRouter",
38-
"BayBridgeRouter"
36+
"PISaturation", "StaticLaneChanger", "SimLaneChangeController",
37+
"ContinuousRouter", "GridRouter", "BayBridgeRouter"
3938
]

flow/controllers/velocity_controllers.py

Lines changed: 0 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -182,33 +182,6 @@ def get_accel(self, env):
182182
return min(accel, self.max_accel)
183183

184184

185-
class HandTunedVelocityController(FollowerStopper):
186-
def __init__(self,
187-
veh_id,
188-
v_regions,
189-
car_following_params,
190-
danger_edges=None):
191-
super().__init__(
192-
veh_id, car_following_params, v_regions[0],
193-
danger_edges=danger_edges)
194-
self.v_regions = v_regions
195-
196-
def get_accel(self, env):
197-
edge = env.k.vehicle.get_edge(self.veh_id)
198-
if edge:
199-
if edge[0] != ':' and edge in env.controlled_edges:
200-
pos = env.k.vehicle.get_position(self.veh_id)
201-
# find what segment we fall into
202-
bucket = np.searchsorted(env.slices[edge], pos) - 1
203-
action = self.v_regions[bucket +
204-
env.action_index[int(edge) - 1]]
205-
# set the desired velocity of the controller to the action
206-
controller = env.k.vehicle.get_acc_controller(self.veh_id)
207-
controller.v_des = action
208-
209-
return super().get_accel(env)
210-
211-
212185
class FeedbackController(FollowerStopper):
213186
def __init__(self,
214187
veh_id,

flow/core/kernel/vehicle/traci.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -323,6 +323,10 @@ def test_set_speed(self, veh_id, speed):
323323
"""Set the speed of the specified vehicle."""
324324
self.__sumo_obs[veh_id][tc.VAR_SPEED] = speed
325325

326+
def test_set_edge(self, veh_id, edge):
327+
"""Set the speed of the specified vehicle."""
328+
self.__sumo_obs[veh_id][tc.VAR_ROAD_ID] = edge
329+
326330
def set_follower(self, veh_id, follower):
327331
"""Set the follower of the specified vehicle."""
328332
self.__vehicles[veh_id]["follower"] = follower

tests/fast_tests/test_controllers.py

Lines changed: 127 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from flow.controllers.routing_controllers import ContinuousRouter
99
from flow.controllers.car_following_models import IDMController, \
1010
OVMController, BCMController, LinearOVM, CFMController
11+
from flow.controllers import FollowerStopper, PISaturation
1112
from tests.setup_scripts import ring_road_exp_setup
1213
import os
1314
import numpy as np
@@ -23,7 +24,6 @@ class TestCFMController(unittest.TestCase):
2324
def setUp(self):
2425
# add a few vehicles to the network using the requested model
2526
# also make sure that the input params are what is expected
26-
2727
contr_params = {
2828
"time_delay": 0,
2929
"k_d": 1,
@@ -456,5 +456,131 @@ def test_static_lane_changer(self):
456456
self.assertEqual(sum(np.array(lanes)), 0)
457457

458458

459+
class TestFollowerStopper(unittest.TestCase):
460+
461+
"""
462+
Makes sure that vehicles with a static lane-changing controller do not
463+
change lanes.
464+
"""
465+
466+
def setUp(self):
467+
# add a few vehicles to the network using the requested model
468+
# also make sure that the input params are what is expected
469+
contr_params = {"v_des": 7.5}
470+
471+
vehicles = VehicleParams()
472+
vehicles.add(
473+
veh_id="test_0",
474+
acceleration_controller=(FollowerStopper, contr_params),
475+
routing_controller=(ContinuousRouter, {}),
476+
car_following_params=SumoCarFollowingParams(
477+
accel=20, decel=5),
478+
num_vehicles=5)
479+
480+
# create the environment and scenario classes for a ring road
481+
self.env, scenario = ring_road_exp_setup(vehicles=vehicles)
482+
483+
def tearDown(self):
484+
# terminate the traci instance
485+
self.env.terminate()
486+
487+
# free data used by the class
488+
self.env = None
489+
490+
def test_get_action(self):
491+
self.env.reset()
492+
ids = self.env.k.vehicle.get_ids()
493+
494+
test_headways = [5, 10, 15, 20, 25]
495+
test_speeds = [5, 7.5, 7.5, 8, 7]
496+
for i, veh_id in enumerate(ids):
497+
self.env.k.vehicle.set_headway(veh_id, test_headways[i])
498+
self.env.k.vehicle.test_set_speed(veh_id, test_speeds[i])
499+
500+
requested_accel = [
501+
self.env.k.vehicle.get_acc_controller(veh_id).get_action(self.env)
502+
for veh_id in ids
503+
]
504+
505+
expected_accel = [-16.666667, 0, 0., -5., 5.]
506+
507+
np.testing.assert_array_almost_equal(requested_accel, expected_accel)
508+
509+
def test_find_intersection_dist(self):
510+
self.env.reset()
511+
ids = self.env.k.vehicle.get_ids()
512+
513+
test_edges = ["", "center"]
514+
for i, veh_id in enumerate(ids):
515+
if i < 2:
516+
self.env.k.vehicle.test_set_edge(veh_id, test_edges[i])
517+
518+
requested = [
519+
self.env.k.vehicle.get_acc_controller(
520+
veh_id).find_intersection_dist(self.env)
521+
for veh_id in ids
522+
]
523+
524+
expected = [-10, 0, 23., 34.5, 46.]
525+
526+
np.testing.assert_array_almost_equal(requested, expected)
527+
528+
# we also check that the accel value is None when this value is
529+
# negative
530+
self.assertIsNone(self.env.k.vehicle.get_acc_controller(
531+
ids[0]).get_action(self.env))
532+
533+
534+
class TestPISaturation(unittest.TestCase):
535+
536+
"""
537+
Makes sure that vehicles with a static lane-changing controller do not
538+
change lanes.
539+
"""
540+
541+
def setUp(self):
542+
# add a few vehicles to the network using the requested model
543+
# also make sure that the input params are what is expected
544+
contr_params = {}
545+
546+
vehicles = VehicleParams()
547+
vehicles.add(
548+
veh_id="test_0",
549+
acceleration_controller=(PISaturation, contr_params),
550+
routing_controller=(ContinuousRouter, {}),
551+
car_following_params=SumoCarFollowingParams(
552+
accel=20, decel=5),
553+
num_vehicles=5)
554+
555+
# create the environment and scenario classes for a ring road
556+
self.env, scenario = ring_road_exp_setup(vehicles=vehicles)
557+
558+
def tearDown(self):
559+
# terminate the traci instance
560+
self.env.terminate()
561+
562+
# free data used by the class
563+
self.env = None
564+
565+
def test_get_action(self):
566+
self.env.reset()
567+
ids = self.env.k.vehicle.get_ids()
568+
569+
test_headways = [5, 10, 15, 20, 25]
570+
test_speeds = [5, 7.5, 7.5, 8, 7]
571+
for i, veh_id in enumerate(ids):
572+
self.env.k.vehicle.set_headway(veh_id, test_headways[i])
573+
self.env.k.vehicle.test_set_speed(veh_id, test_speeds[i])
574+
575+
requested_accel = [
576+
self.env.k.vehicle.get_acc_controller(veh_id).get_action(self.env)
577+
for veh_id in ids
578+
]
579+
580+
expected_accel = [20., -36.847826, -35.76087, -37.173913, -31.086957]
581+
582+
np.testing.assert_array_almost_equal(requested_accel, expected_accel)
583+
584+
459585
if __name__ == '__main__':
460586
unittest.main()

0 commit comments

Comments
 (0)