diff --git a/examples/exp_configs/non_rl/highway_single.py b/examples/exp_configs/non_rl/highway_single.py
index 46b18c0e9..0ced89f27 100644
--- a/examples/exp_configs/non_rl/highway_single.py
+++ b/examples/exp_configs/non_rl/highway_single.py
@@ -1,9 +1,5 @@
-"""Multi-agent highway with ramps example.
-
-Trains a non-constant number of agents, all sharing the same policy, on the
-highway with ramps network.
-"""
-from flow.controllers import BandoFTLController
+"""Example of an open network with human-driven vehicles."""
+from flow.controllers import IDMController
from flow.core.params import EnvParams
from flow.core.params import NetParams
from flow.core.params import InitialConfig
@@ -11,15 +7,21 @@
from flow.core.params import VehicleParams
from flow.core.params import SumoParams
from flow.core.params import SumoLaneChangeParams
+from flow.core.params import SumoCarFollowingParams
from flow.networks import HighwayNetwork
from flow.envs import TestEnv
from flow.networks.highway import ADDITIONAL_NET_PARAMS
-TRAFFIC_SPEED = 11
-END_SPEED = 16
-TRAFFIC_FLOW = 2056
-HORIZON = 3600
-INCLUDE_NOISE = False
+# the speed of vehicles entering the network
+TRAFFIC_SPEED = 24.1
+# the maximum speed at the downstream boundary edge
+END_SPEED = 6.0
+# the inflow rate of vehicles
+TRAFFIC_FLOW = 2215
+# the simulation time horizon (in steps)
+HORIZON = 1500
+# whether to include noise in the car-following models
+INCLUDE_NOISE = True
additional_net_params = ADDITIONAL_NET_PARAMS.copy()
additional_net_params.update({
@@ -31,28 +33,30 @@
"speed_limit": 30,
# number of edges to divide the highway into
"num_edges": 2,
- # whether to include a ghost edge of length 500m. This edge is provided a
- # different speed limit.
+ # whether to include a ghost edge. This edge is provided a different speed
+ # limit.
"use_ghost_edge": True,
# speed limit for the ghost edge
- "ghost_speed_limit": END_SPEED
+ "ghost_speed_limit": END_SPEED,
+ # length of the downstream ghost edge with the reduced speed limit
+ "boundary_cell_length": 300,
})
vehicles = VehicleParams()
vehicles.add(
"human",
- num_vehicles=0,
+ acceleration_controller=(IDMController, {
+ 'a': 1.3,
+ 'b': 2.0,
+ 'noise': 0.3 if INCLUDE_NOISE else 0.0
+ }),
+ car_following_params=SumoCarFollowingParams(
+ min_gap=0.5
+ ),
lane_change_params=SumoLaneChangeParams(
- lane_change_mode="strategic",
+ model="SL2015",
+ lc_sublane=2.0,
),
- acceleration_controller=(BandoFTLController, {
- 'alpha': .5,
- 'beta': 20.0,
- 'h_st': 12.0,
- 'h_go': 50.0,
- 'v_max': 30.0,
- 'noise': 1.0 if INCLUDE_NOISE else 0.0,
- }),
)
inflows = InFlows()
@@ -64,8 +68,6 @@
depart_speed=TRAFFIC_SPEED,
name="idm_highway_inflow")
-# SET UP FLOW PARAMETERS
-
flow_params = dict(
# name of the experiment
exp_tag='highway-single',
@@ -82,14 +84,15 @@
# environment related parameters (see flow.core.params.EnvParams)
env=EnvParams(
horizon=HORIZON,
- warmup_steps=0,
- sims_per_step=1,
+ warmup_steps=500,
+ sims_per_step=3,
),
# sumo-related parameters (see flow.core.params.SumoParams)
sim=SumoParams(
- sim_step=0.5,
+ sim_step=0.4,
render=False,
+ use_ballistic=True,
restart_instance=False
),
diff --git a/examples/exp_configs/non_rl/i210_subnetwork.py b/examples/exp_configs/non_rl/i210_subnetwork.py
index dd85c56cf..eda037068 100644
--- a/examples/exp_configs/non_rl/i210_subnetwork.py
+++ b/examples/exp_configs/non_rl/i210_subnetwork.py
@@ -1,9 +1,9 @@
"""I-210 subnetwork example."""
import os
-
import numpy as np
-from flow.controllers.car_following_models import IDMController
+from flow.controllers import IDMController
+from flow.controllers import I210Router
from flow.core.params import SumoParams
from flow.core.params import EnvParams
from flow.core.params import NetParams
@@ -15,7 +15,49 @@
from flow.envs import TestEnv
from flow.networks.i210_subnetwork import I210SubNetwork, EDGES_DISTRIBUTION
-# create the base vehicle type that will be used for inflows
+# =========================================================================== #
+# Specify some configurable constants. #
+# =========================================================================== #
+
+# whether to include the upstream ghost edge in the network
+WANT_GHOST_CELL = True
+# whether to include the downstream slow-down edge in the network
+WANT_DOWNSTREAM_BOUNDARY = True
+# whether to include vehicles on the on-ramp
+ON_RAMP = True
+# the inflow rate of vehicles (in veh/hr)
+INFLOW_RATE = 5 * 2215
+# the speed of inflowing vehicles from the main edge (in m/s)
+INFLOW_SPEED = 24.1
+
+# =========================================================================== #
+# Specify the path to the network template. #
+# =========================================================================== #
+
+if WANT_DOWNSTREAM_BOUNDARY:
+ NET_TEMPLATE = os.path.join(
+ config.PROJECT_PATH,
+ "examples/exp_configs/templates/sumo/i210_with_ghost_cell_with_"
+ "downstream.xml")
+elif WANT_GHOST_CELL:
+ NET_TEMPLATE = os.path.join(
+ config.PROJECT_PATH,
+ "examples/exp_configs/templates/sumo/i210_with_ghost_cell.xml")
+else:
+ NET_TEMPLATE = os.path.join(
+ config.PROJECT_PATH,
+ "examples/exp_configs/templates/sumo/test2.net.xml")
+
+# If the ghost cell is not being used, remove it from the initial edges that
+# vehicles can be placed on.
+edges_distribution = EDGES_DISTRIBUTION.copy()
+if not WANT_GHOST_CELL:
+ edges_distribution.remove("ghost0")
+
+# =========================================================================== #
+# Specify vehicle-specific information and inflows. #
+# =========================================================================== #
+
vehicles = VehicleParams()
vehicles.add(
"human",
@@ -24,35 +66,39 @@
lane_change_mode="strategic",
),
acceleration_controller=(IDMController, {
- "a": 0.3, "b": 2.0, "noise": 0.5
+ "a": 1.3,
+ "b": 2.0,
+ "noise": 0.3,
}),
+ routing_controller=(I210Router, {}) if ON_RAMP else None,
)
inflow = InFlows()
# main highway
inflow.add(
veh_type="human",
- edge="119257914",
- vehs_per_hour=8378,
- departLane="random",
- departSpeed=23)
+ edge="ghost0" if WANT_GHOST_CELL else "119257914",
+ vehs_per_hour=INFLOW_RATE,
+ departLane="best",
+ departSpeed=INFLOW_SPEED)
# on ramp
-# inflow.add(
-# veh_type="human",
-# edge="27414345",
-# vehs_per_hour=321,
-# departLane="random",
-# departSpeed=20)
-# inflow.add(
-# veh_type="human",
-# edge="27414342#0",
-# vehs_per_hour=421,
-# departLane="random",
-# departSpeed=20)
-
-NET_TEMPLATE = os.path.join(
- config.PROJECT_PATH,
- "examples/exp_configs/templates/sumo/test2.net.xml")
+if ON_RAMP:
+ inflow.add(
+ veh_type="human",
+ edge="27414345",
+ vehs_per_hour=500,
+ departLane="random",
+ departSpeed=10)
+ inflow.add(
+ veh_type="human",
+ edge="27414342#0",
+ vehs_per_hour=500,
+ departLane="random",
+ departSpeed=10)
+
+# =========================================================================== #
+# Generate the flow_params dict with all relevant simulation information. #
+# =========================================================================== #
flow_params = dict(
# name of the experiment
@@ -69,7 +115,7 @@
# simulation-related parameters
sim=SumoParams(
- sim_step=0.5,
+ sim_step=0.4,
render=False,
color_by_speed=True,
use_ballistic=True
@@ -77,14 +123,18 @@
# environment related parameters (see flow.core.params.EnvParams)
env=EnvParams(
- horizon=4500,
+ horizon=10000,
),
# network-related parameters (see flow.core.params.NetParams and the
# network's documentation or ADDITIONAL_NET_PARAMS component)
net=NetParams(
inflows=inflow,
- template=NET_TEMPLATE
+ template=NET_TEMPLATE,
+ additional_params={
+ "on_ramp": ON_RAMP,
+ "ghost_edge": WANT_GHOST_CELL,
+ }
),
# vehicles to be placed in the network at the start of a rollout (see
@@ -94,10 +144,14 @@
# parameters specifying the positioning of vehicles upon initialization/
# reset (see flow.core.params.InitialConfig)
initial=InitialConfig(
- edges_distribution=EDGES_DISTRIBUTION,
+ edges_distribution=edges_distribution,
),
)
+# =========================================================================== #
+# Specify custom callable that is logged during simulation runtime. #
+# =========================================================================== #
+
edge_id = "119257908#1-AddedOnRampEdge"
custom_callables = {
"avg_merge_speed": lambda env: np.nan_to_num(np.mean(
diff --git a/examples/exp_configs/non_rl/i210_subnetwork_sweep.py b/examples/exp_configs/non_rl/i210_subnetwork_sweep.py
deleted file mode 100644
index 28cba81ce..000000000
--- a/examples/exp_configs/non_rl/i210_subnetwork_sweep.py
+++ /dev/null
@@ -1,151 +0,0 @@
-"""I-210 subnetwork example.
-
-In this case flow_params is a list of dicts. This is to test the effects of
-multiple human-driver model parameters on the flow traffic.
-"""
-from collections import OrderedDict
-from copy import deepcopy
-import itertools
-import os
-import numpy as np
-
-from flow.core.params import SumoParams
-from flow.core.params import EnvParams
-from flow.core.params import NetParams
-from flow.core.params import SumoLaneChangeParams
-from flow.core.params import VehicleParams
-from flow.core.params import InitialConfig
-from flow.core.params import InFlows
-import flow.config as config
-from flow.envs import TestEnv
-from flow.networks.i210_subnetwork import I210SubNetwork, EDGES_DISTRIBUTION
-
-# the default parameters for all lane change parameters
-default_dict = {
- "lane_change_mode": "strategic",
- "model": "LC2013",
- "lc_strategic": 1.0,
- "lc_cooperative": 1.0,
- "lc_speed_gain": 1.0,
- "lc_keep_right": 1.0,
- "lc_look_ahead_left": 2.0,
- "lc_speed_gain_right": 1.0,
- "lc_sublane": 1.0,
- "lc_pushy": 0,
- "lc_pushy_gap": 0.6,
- "lc_assertive": 1,
- "lc_accel_lat": 1.0
-}
-
-# values to sweep through for some lane change parameters
-sweep_dict = OrderedDict({
- "lc_strategic": [1.0, 2.0, 4.0, 8.0],
- "lc_cooperative": [1.0, 2.0],
- "lc_look_ahead_left": [2.0, 4.0]
-})
-
-# Create a list of possible lane change parameter combinations.
-all_names = sorted(sweep_dict)
-combinations = itertools.product(*(sweep_dict[name] for name in all_names))
-combination_list = list(combinations)
-res = []
-for val in combination_list:
- curr_dict = {}
- for elem, name in zip(val, all_names):
- curr_dict[name] = elem
- res.append(curr_dict)
-
-# Create a list of all possible flow_params dictionaries to sweep through the
-# different lane change parameters.
-flow_params = []
-
-for lane_change_dict in res:
- # no vehicles in the network. The lane change parameters of inflowing
- # vehicles are updated here.
- vehicles = VehicleParams()
- update_dict = deepcopy(default_dict)
- update_dict.update(lane_change_dict)
- vehicles.add(
- "human",
- num_vehicles=0,
- lane_change_params=SumoLaneChangeParams(**update_dict)
- )
-
- inflow = InFlows()
- # main highway
- inflow.add(
- veh_type="human",
- edge="119257914",
- vehs_per_hour=8378,
- # probability=1.0,
- departLane="random",
- departSpeed=20)
- # on ramp
- inflow.add(
- veh_type="human",
- edge="27414345",
- vehs_per_hour=321,
- departLane="random",
- departSpeed=20)
- inflow.add(
- veh_type="human",
- edge="27414342#0",
- vehs_per_hour=421,
- departLane="random",
- departSpeed=20)
-
- NET_TEMPLATE = os.path.join(
- config.PROJECT_PATH,
- "examples/exp_configs/templates/sumo/test2.net.xml")
-
- params = dict(
- # name of the experiment
- exp_tag='I-210_subnetwork',
-
- # name of the flow environment the experiment is running on
- env_name=TestEnv,
-
- # name of the network class the experiment is running on
- network=I210SubNetwork,
-
- # simulator that is used by the experiment
- simulator='traci',
-
- # simulation-related parameters
- sim=SumoParams(
- sim_step=0.8,
- render=True,
- color_by_speed=True
- ),
-
- # environment related parameters (see flow.core.params.EnvParams)
- env=EnvParams(
- horizon=4500, # one hour of run time
- ),
-
- # network-related parameters (see flow.core.params.NetParams and the
- # network's documentation or ADDITIONAL_NET_PARAMS component)
- net=NetParams(
- inflows=inflow,
- template=NET_TEMPLATE
- ),
-
- # vehicles to be placed in the network at the start of a rollout (see
- # flow.core.params.VehicleParams)
- veh=vehicles,
-
- # parameters specifying the positioning of vehicles upon
- # initialization/reset (see flow.core.params.InitialConfig)
- initial=InitialConfig(
- edges_distribution=EDGES_DISTRIBUTION,
- ),
- )
-
- # Store the next flow_params dict.
- flow_params.append(params)
-
-
-custom_callables = {
- "avg_merge_speed": lambda env: np.mean(env.k.vehicle.get_speed(
- env.k.vehicle.get_ids_by_edge("119257908#1-AddedOnRampEdge")))
-}
diff --git a/examples/exp_configs/rl/multiagent/multiagent_i210.py b/examples/exp_configs/rl/multiagent/multiagent_i210.py
index 94f709ff4..a6d194708 100644
--- a/examples/exp_configs/rl/multiagent/multiagent_i210.py
+++ b/examples/exp_configs/rl/multiagent/multiagent_i210.py
@@ -35,6 +35,10 @@
# percentage of autonomous vehicles compared to human vehicles on highway
PENETRATION_RATE = 10
+# TODO: temporary fix
+edges_distribution = EDGES_DISTRIBUTION.copy()
+edges_distribution.remove("ghost0")
+
# SET UP PARAMETERS FOR THE ENVIRONMENT
additional_env_params = ADDITIONAL_ENV_PARAMS.copy()
additional_env_params.update({
@@ -145,7 +149,11 @@
# network's documentation or ADDITIONAL_NET_PARAMS component)
net=NetParams(
inflows=inflow,
- template=NET_TEMPLATE
+ template=NET_TEMPLATE,
+ additional_params={
+ "on_ramp": False,
+ "ghost_edge": False
+ }
),
# vehicles to be placed in the network at the start of a rollout (see
@@ -155,7 +163,7 @@
# parameters specifying the positioning of vehicles upon initialization/
# reset (see flow.core.params.InitialConfig)
initial=InitialConfig(
- edges_distribution=EDGES_DISTRIBUTION,
+ edges_distribution=edges_distribution,
),
)
diff --git a/examples/exp_configs/templates/sumo/i210_with_ghost_cell.xml b/examples/exp_configs/templates/sumo/i210_with_ghost_cell.xml
new file mode 100644
index 000000000..66e5a1131
--- /dev/null
+++ b/examples/exp_configs/templates/sumo/i210_with_ghost_cell.xml
@@ -0,0 +1,5719 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/exp_configs/templates/sumo/i210_with_ghost_cell_with_downstream.xml b/examples/exp_configs/templates/sumo/i210_with_ghost_cell_with_downstream.xml
new file mode 100644
index 000000000..10d4d8d45
--- /dev/null
+++ b/examples/exp_configs/templates/sumo/i210_with_ghost_cell_with_downstream.xml
@@ -0,0 +1,5719 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/flow/controllers/__init__.py b/flow/controllers/__init__.py
index 4dfcf05b7..a61d16980 100755
--- a/flow/controllers/__init__.py
+++ b/flow/controllers/__init__.py
@@ -28,7 +28,7 @@
# routing controllers
from flow.controllers.base_routing_controller import BaseRouter
from flow.controllers.routing_controllers import ContinuousRouter, \
- GridRouter, BayBridgeRouter
+ GridRouter, BayBridgeRouter, I210Router
__all__ = [
"RLController", "BaseController", "BaseLaneChangeController", "BaseRouter",
@@ -36,5 +36,6 @@
"IDMController", "SimCarFollowingController", "FollowerStopper",
"PISaturation", "StaticLaneChanger", "SimLaneChangeController",
"ContinuousRouter", "GridRouter", "BayBridgeRouter", "LACController",
- "GippsController", "NonLocalFollowerStopper", "BandoFTLController"
+ "GippsController", "NonLocalFollowerStopper", "BandoFTLController",
+ "I210Router"
]
diff --git a/flow/controllers/routing_controllers.py b/flow/controllers/routing_controllers.py
index e6ccdde78..02aa34cb4 100755
--- a/flow/controllers/routing_controllers.py
+++ b/flow/controllers/routing_controllers.py
@@ -124,3 +124,29 @@ def choose_route(self, env):
new_route = super().choose_route(env)
return new_route
+
+
+class I210Router(ContinuousRouter):
+ """Assists in choosing routes in select cases for the I-210 sub-network.
+
+ Extension to the Continuous Router.
+
+ Usage
+ -----
+ See base class for usage example.
+ """
+
+ def choose_route(self, env):
+ """See parent class."""
+ edge = env.k.vehicle.get_edge(self.veh_id)
+ lane = env.k.vehicle.get_lane(self.veh_id)
+
+ # vehicles on these edges in lanes 4 and 5 are not going to be able to
+ # make it out in time
+ if edge == "119257908#1-AddedOffRampEdge" and lane in [5, 4, 3]:
+ new_route = env.available_routes[
+ "119257908#1-AddedOffRampEdge"][0][0]
+ else:
+ new_route = super().choose_route(env)
+
+ return new_route
diff --git a/flow/networks/highway.py b/flow/networks/highway.py
index 7e9c18ad5..e48331cf9 100644
--- a/flow/networks/highway.py
+++ b/flow/networks/highway.py
@@ -14,11 +14,13 @@
"speed_limit": 30,
# number of edges to divide the highway into
"num_edges": 1,
- # whether to include a ghost edge of length 500m. This edge is provided a
- # different speed limit.
+ # whether to include a ghost edge. This edge is provided a different speed
+ # limit.
"use_ghost_edge": False,
# speed limit for the ghost edge
"ghost_speed_limit": 25,
+ # length of the downstream ghost edge with the reduced speed limit
+ "boundary_cell_length": 500
}
@@ -34,9 +36,11 @@ class HighwayNetwork(Network):
* **lanes** : number of lanes in the highway
* **speed_limit** : max speed limit of the highway
* **num_edges** : number of edges to divide the highway into
- * **use_ghost_edge** : whether to include a ghost edge of length 500m. This
- edge is provided a different speed limit.
+ * **use_ghost_edge** : whether to include a ghost edge. This edge is
+ provided a different speed limit.
* **ghost_speed_limit** : speed limit for the ghost edge
+ * **boundary_cell_length** : length of the downstream ghost edge with the
+ reduced speed limit
Usage
-----
@@ -70,8 +74,6 @@ def __init__(self,
if p not in net_params.additional_params:
raise KeyError('Network parameter "{}" not supplied'.format(p))
- self.end_length = 500
-
super().__init__(name, vehicles, net_params, initial_config,
traffic_lights)
@@ -80,6 +82,7 @@ def specify_nodes(self, net_params):
length = net_params.additional_params["length"]
num_edges = net_params.additional_params.get("num_edges", 1)
segment_lengths = np.linspace(0, length, num_edges+1)
+ end_length = net_params.additional_params["boundary_cell_length"]
nodes = []
for i in range(num_edges+1):
@@ -92,7 +95,7 @@ def specify_nodes(self, net_params):
if self.net_params.additional_params["use_ghost_edge"]:
nodes += [{
"id": "edge_{}".format(num_edges + 1),
- "x": length + self.end_length,
+ "x": length + end_length,
"y": 0
}]
@@ -103,6 +106,7 @@ def specify_edges(self, net_params):
length = net_params.additional_params["length"]
num_edges = net_params.additional_params.get("num_edges", 1)
segment_length = length/float(num_edges)
+ end_length = net_params.additional_params["boundary_cell_length"]
edges = []
for i in range(num_edges):
@@ -120,7 +124,7 @@ def specify_edges(self, net_params):
"type": "highway_end",
"from": "edge_{}".format(num_edges),
"to": "edge_{}".format(num_edges + 1),
- "length": self.end_length
+ "length": end_length
}]
return edges
diff --git a/flow/networks/i210_subnetwork.py b/flow/networks/i210_subnetwork.py
index d8e05efb5..b86a0dc8a 100644
--- a/flow/networks/i210_subnetwork.py
+++ b/flow/networks/i210_subnetwork.py
@@ -1,9 +1,18 @@
"""Contains the I-210 sub-network class."""
-
from flow.networks.base import Network
+from flow.core.params import InitialConfig
+from flow.core.params import TrafficLightParams
+
+ADDITIONAL_NET_PARAMS = {
+ # whether to include vehicle on the on-ramp
+ "on_ramp": False,
+ # whether to include the downstream slow-down edge in the network
+ "ghost_edge": False,
+}
EDGES_DISTRIBUTION = [
# Main highway
+ "ghost0",
"119257914",
"119257908#0",
"119257908#1-AddedOnRampEdge",
@@ -25,6 +34,12 @@
class I210SubNetwork(Network):
"""A network used to simulate the I-210 sub-network.
+ Requires from net_params:
+
+ * **on_ramp** : whether to include vehicle on the on-ramp
+ * **ghost_edge** : whether to include the downstream slow-down edge in the
+ network
+
Usage
-----
>>> from flow.core.params import NetParams
@@ -39,103 +54,145 @@ class I210SubNetwork(Network):
>>> )
"""
- def specify_routes(self, net_params):
- """See parent class.
+ def __init__(self,
+ name,
+ vehicles,
+ net_params,
+ initial_config=InitialConfig(),
+ traffic_lights=TrafficLightParams()):
+ """Initialize the I210 sub-network scenario."""
+ for p in ADDITIONAL_NET_PARAMS.keys():
+ if p not in net_params.additional_params:
+ raise KeyError('Network parameter "{}" not supplied'.format(p))
+
+ super(I210SubNetwork, self).__init__(
+ name=name,
+ vehicles=vehicles,
+ net_params=net_params,
+ initial_config=initial_config,
+ traffic_lights=traffic_lights,
+ )
- Routes for vehicles moving through the bay bridge from Oakland to San
- Francisco.
- """
+ def specify_routes(self, net_params):
+ """See parent class."""
rts = {
- # Main highway
"119257914": [
- (["119257914", "119257908#0", "119257908#1-AddedOnRampEdge",
- "119257908#1", "119257908#1-AddedOffRampEdge", "119257908#2",
- "119257908#3"],
- 1), # HOV: 1509 (on ramp: 57), Non HOV: 6869 (onramp: 16)
- # (["119257914", "119257908#0", "119257908#1-AddedOnRampEdge",
- # "119257908#1", "119257908#1-AddedOffRampEdge", "173381935"],
- # 17 / 8378)
- ],
- # "119257908#0": [
- # (["119257908#0", "119257908#1-AddedOnRampEdge", "119257908#1",
- # "119257908#1-AddedOffRampEdge", "119257908#2",
- # "119257908#3"],
- # 1.0),
- # # (["119257908#0", "119257908#1-AddedOnRampEdge", "119257908#1",
- # # "119257908#1-AddedOffRampEdge", "173381935"],
- # # 0.5),
- # ],
- # "119257908#1-AddedOnRampEdge": [
- # (["119257908#1-AddedOnRampEdge", "119257908#1",
- # "119257908#1-AddedOffRampEdge", "119257908#2",
- # "119257908#3"],
- # 1.0),
- # # (["119257908#1-AddedOnRampEdge", "119257908#1",
- # # "119257908#1-AddedOffRampEdge", "173381935"],
- # # 0.5),
- # ],
- # "119257908#1": [
- # (["119257908#1", "119257908#1-AddedOffRampEdge", "119257908#2",
- # "119257908#3"],
- # 1.0),
- # # (["119257908#1", "119257908#1-AddedOffRampEdge", "173381935"],
- # # 0.5),
- # ],
- # "119257908#1-AddedOffRampEdge": [
- # (["119257908#1-AddedOffRampEdge", "119257908#2",
- # "119257908#3"],
- # 1.0),
- # # (["119257908#1-AddedOffRampEdge", "173381935"],
- # # 0.5),
- # ],
- # "119257908#2": [
- # (["119257908#2", "119257908#3"], 1),
- # ],
- # "119257908#3": [
- # (["119257908#3"], 1),
- # ],
- #
- # # On-ramp
- # "27414345": [
- # (["27414345", "27414342#1-AddedOnRampEdge",
- # "27414342#1",
- # "119257908#1-AddedOnRampEdge", "119257908#1",
- # "119257908#1-AddedOffRampEdge", "119257908#2",
- # "119257908#3"],
- # 1 - 9 / 321),
- # (["27414345", "27414342#1-AddedOnRampEdge",
- # "27414342#1",
- # "119257908#1-AddedOnRampEdge", "119257908#1",
- # "119257908#1-AddedOffRampEdge", "173381935"],
- # 9 / 321),
- # ],
- # "27414342#0": [
- # (["27414342#0", "27414342#1-AddedOnRampEdge",
- # "27414342#1",
- # "119257908#1-AddedOnRampEdge", "119257908#1",
- # "119257908#1-AddedOffRampEdge", "119257908#2",
- # "119257908#3"],
- # 1 - 20 / 421),
- # (["27414342#0", "27414342#1-AddedOnRampEdge",
- # "27414342#1",
- # "119257908#1-AddedOnRampEdge", "119257908#1",
- # "119257908#1-AddedOffRampEdge", "173381935"],
- # 20 / 421),
- # ],
- # "27414342#1-AddedOnRampEdge": [
- # (["27414342#1-AddedOnRampEdge", "27414342#1", "119257908#1-AddedOnRampEdge",
- # "119257908#1", "119257908#1-AddedOffRampEdge", "119257908#2",
- # "119257908#3"],
- # 0.5),
- # (["27414342#1-AddedOnRampEdge", "27414342#1", "119257908#1-AddedOnRampEdge",
- # "119257908#1", "119257908#1-AddedOffRampEdge", "173381935"],
- # 0.5),
- # ],
- #
- # # Off-ramp
- # "173381935": [
- # (["173381935"], 1),
- # ],
+ (["119257914",
+ "119257908#0",
+ "119257908#1-AddedOnRampEdge",
+ "119257908#1",
+ "119257908#1-AddedOffRampEdge",
+ "119257908#2",
+ "119257908#3"], 1.0),
+ ]
}
+ if net_params.additional_params["ghost_edge"]:
+ rts.update({
+ "ghost0": [
+ (["ghost0",
+ "119257914",
+ "119257908#0",
+ "119257908#1-AddedOnRampEdge",
+ "119257908#1",
+ "119257908#1-AddedOffRampEdge",
+ "119257908#2",
+ "119257908#3"], 1),
+ ],
+ })
+
+ if net_params.additional_params["on_ramp"]:
+ rts.update({
+ # Main highway
+ "119257908#0": [
+ (["119257908#0",
+ "119257908#1-AddedOnRampEdge",
+ "119257908#1",
+ "119257908#1-AddedOffRampEdge",
+ "119257908#2",
+ "119257908#3"], 1.0),
+ ],
+ "119257908#1-AddedOnRampEdge": [
+ (["119257908#1-AddedOnRampEdge",
+ "119257908#1",
+ "119257908#1-AddedOffRampEdge",
+ "119257908#2",
+ "119257908#3"], 1.0),
+ ],
+ "119257908#1": [
+ (["119257908#1",
+ "119257908#1-AddedOffRampEdge",
+ "119257908#2",
+ "119257908#3"], 1.0),
+ ],
+ "119257908#1-AddedOffRampEdge": [
+ (["119257908#1-AddedOffRampEdge",
+ "119257908#2",
+ "119257908#3"], 1.0),
+ ],
+ "119257908#2": [
+ (["119257908#2",
+ "119257908#3"], 1),
+ ],
+ "119257908#3": [
+ (["119257908#3"], 1),
+ ],
+
+ # On-ramp
+ "27414345": [
+ (["27414345",
+ "27414342#1-AddedOnRampEdge",
+ "27414342#1",
+ "119257908#1-AddedOnRampEdge",
+ "119257908#1",
+ "119257908#1-AddedOffRampEdge",
+ "119257908#2",
+ "119257908#3"], 1 - 9 / 321),
+ (["27414345",
+ "27414342#1-AddedOnRampEdge",
+ "27414342#1",
+ "119257908#1-AddedOnRampEdge",
+ "119257908#1",
+ "119257908#1-AddedOffRampEdge",
+ "173381935"], 9 / 321),
+ ],
+ "27414342#0": [
+ (["27414342#0",
+ "27414342#1-AddedOnRampEdge",
+ "27414342#1",
+ "119257908#1-AddedOnRampEdge",
+ "119257908#1",
+ "119257908#1-AddedOffRampEdge",
+ "119257908#2",
+ "119257908#3"], 1 - 20 / 421),
+ (["27414342#0",
+ "27414342#1-AddedOnRampEdge",
+ "27414342#1",
+ "119257908#1-AddedOnRampEdge",
+ "119257908#1",
+ "119257908#1-AddedOffRampEdge",
+ "173381935"], 20 / 421),
+ ],
+ "27414342#1-AddedOnRampEdge": [
+ (["27414342#1-AddedOnRampEdge",
+ "27414342#1",
+ "119257908#1-AddedOnRampEdge",
+ "119257908#1",
+ "119257908#1-AddedOffRampEdge",
+ "119257908#2",
+ "119257908#3"], 0.5),
+ (["27414342#1-AddedOnRampEdge",
+ "27414342#1",
+ "119257908#1-AddedOnRampEdge",
+ "119257908#1",
+ "119257908#1-AddedOffRampEdge",
+ "173381935"], 0.5),
+ ],
+
+ # Off-ramp
+ "173381935": [
+ (["173381935"], 1),
+ ],
+ })
+
return rts
diff --git a/flow/networks/ring.py b/flow/networks/ring.py
index de4d17503..ceef22a78 100755
--- a/flow/networks/ring.py
+++ b/flow/networks/ring.py
@@ -37,7 +37,7 @@ class RingNetwork(Network):
>>> from flow.core.params import NetParams
>>> from flow.core.params import VehicleParams
>>> from flow.core.params import InitialConfig
- >>> from flow.scenarios import RingNetwork
+ >>> from flow.networks import RingNetwork
>>>
>>> network = RingNetwork(
>>> name='ring_road',
diff --git a/tests/fast_tests/test_scenarios.py b/tests/fast_tests/test_scenarios.py
index d72a50b17..5fccdcb3b 100644
--- a/tests/fast_tests/test_scenarios.py
+++ b/tests/fast_tests/test_scenarios.py
@@ -5,8 +5,11 @@
from flow.networks import BottleneckNetwork, FigureEightNetwork, \
TrafficLightGridNetwork, HighwayNetwork, RingNetwork, MergeNetwork, \
MiniCityNetwork, MultiRingNetwork
+from flow.networks import I210SubNetwork
from tests.setup_scripts import highway_exp_setup
+import flow.config as config
+
__all__ = [
"MultiRingNetwork", "MiniCityNetwork"
]
@@ -97,7 +100,8 @@ def test_additional_net_params(self):
"speed_limit": 30,
"num_edges": 1,
"use_ghost_edge": False,
- "ghost_speed_limit": 25
+ "ghost_speed_limit": 25,
+ "boundary_cell_length": 300,
}
)
)
@@ -116,7 +120,8 @@ def test_ghost_edge(self):
"speed_limit": 30,
"num_edges": 1,
"use_ghost_edge": False,
- "ghost_speed_limit": 25
+ "ghost_speed_limit": 25,
+ "boundary_cell_length": 300,
})
)
env.reset()
@@ -131,7 +136,7 @@ def test_ghost_edge(self):
self.assertEqual(env.k.network.speed_limit("highway_0"), 30)
# =================================================================== #
- # With a ghost edge #
+ # With a ghost edge (300m, 25m/s) #
# =================================================================== #
# create the network
@@ -142,13 +147,14 @@ def test_ghost_edge(self):
"speed_limit": 30,
"num_edges": 1,
"use_ghost_edge": True,
- "ghost_speed_limit": 25
+ "ghost_speed_limit": 25,
+ "boundary_cell_length": 300,
})
)
env.reset()
# check the network length
- self.assertEqual(env.k.network.length(), 1500.1)
+ self.assertEqual(env.k.network.length(), 1300.1)
# check the edge list
self.assertEqual(env.k.network.get_edge_list(),
@@ -158,6 +164,35 @@ def test_ghost_edge(self):
self.assertEqual(env.k.network.speed_limit("highway_0"), 30)
self.assertEqual(env.k.network.speed_limit("highway_end"), 25)
+ # =================================================================== #
+ # With a ghost edge (500m, 10m/s) #
+ # =================================================================== #
+
+ # create the network
+ env, _, _ = highway_exp_setup(
+ net_params=NetParams(additional_params={
+ "length": 1000,
+ "lanes": 4,
+ "speed_limit": 30,
+ "num_edges": 1,
+ "use_ghost_edge": True,
+ "ghost_speed_limit": 10,
+ "boundary_cell_length": 500,
+ })
+ )
+ env.reset()
+
+ # check the network length
+ self.assertEqual(env.k.network.length(), 1500.1)
+
+ # check the edge list
+ self.assertEqual(env.k.network.get_edge_list(),
+ ["highway_0", "highway_end"])
+
+ # check the speed limits of the edges
+ self.assertEqual(env.k.network.speed_limit("highway_0"), 30)
+ self.assertEqual(env.k.network.speed_limit("highway_end"), 10)
+
class TestRingNetwork(unittest.TestCase):
@@ -219,6 +254,150 @@ def test_additional_net_params(self):
)
+class TestI210SubNetwork(unittest.TestCase):
+
+ """Tests I210SubNetwork in flow/networks/i210_subnetwork.py."""
+
+ def test_additional_net_params(self):
+ """Ensures that not returning the correct params leads to an error."""
+ self.assertTrue(
+ test_additional_params(
+ network_class=I210SubNetwork,
+ additional_params={
+ "on_ramp": False,
+ "ghost_edge": False,
+ }
+ )
+ )
+
+ def test_specify_routes(self):
+ """Validates that the routes are properly specified for the network.
+
+ This is done simply by checking the initial edges routes are specified
+ from, which alternates based on choice of network configuration.
+
+ This method tests the routes for the following cases:
+
+ 1. on_ramp = False, ghost_edge = False
+ 2. on_ramp = True, ghost_edge = False
+ 3. on_ramp = False, ghost_edge = True
+ 4. on_ramp = True, ghost_edge = True
+ """
+ # test case 1
+ network = I210SubNetwork(
+ name='test-3',
+ vehicles=VehicleParams(),
+ net_params=NetParams(
+ template=os.path.join(
+ config.PROJECT_PATH,
+ "examples/exp_configs/templates/sumo/test2.net.xml"
+ ),
+ additional_params={
+ "on_ramp": False,
+ "ghost_edge": False,
+ },
+ ),
+ )
+
+ self.assertEqual(
+ ['119257914'],
+ sorted(list(network.specify_routes(network.net_params).keys()))
+ )
+
+ del network
+
+ # test case 2
+ network = I210SubNetwork(
+ name='test-3',
+ vehicles=VehicleParams(),
+ net_params=NetParams(
+ template=os.path.join(
+ config.PROJECT_PATH,
+ "examples/exp_configs/templates/sumo/test2.net.xml"
+ ),
+ additional_params={
+ "on_ramp": True,
+ "ghost_edge": True,
+ },
+ ),
+ )
+
+ self.assertEqual(
+ ['119257908#0',
+ '119257908#1',
+ '119257908#1-AddedOffRampEdge',
+ '119257908#1-AddedOnRampEdge',
+ '119257908#2',
+ '119257908#3',
+ '119257914',
+ '173381935',
+ '27414342#0',
+ '27414342#1-AddedOnRampEdge',
+ '27414345',
+ 'ghost0'],
+ sorted(list(network.specify_routes(network.net_params).keys()))
+ )
+
+ del network
+
+ # test case 3
+ network = I210SubNetwork(
+ name='test-3',
+ vehicles=VehicleParams(),
+ net_params=NetParams(
+ template=os.path.join(
+ config.PROJECT_PATH,
+ "examples/exp_configs/templates/sumo/test2.net.xml"
+ ),
+ additional_params={
+ "on_ramp": False,
+ "ghost_edge": True,
+ },
+ ),
+ )
+
+ self.assertEqual(
+ ['119257914', 'ghost0'],
+ sorted(list(network.specify_routes(network.net_params).keys()))
+ )
+
+ del network
+
+ # test case 4
+ network = I210SubNetwork(
+ name='test-3',
+ vehicles=VehicleParams(),
+ net_params=NetParams(
+ template=os.path.join(
+ config.PROJECT_PATH,
+ "examples/exp_configs/templates/sumo/test2.net.xml"
+ ),
+ additional_params={
+ "on_ramp": True,
+ "ghost_edge": True,
+ },
+ ),
+ )
+
+ self.assertEqual(
+ ['119257908#0',
+ '119257908#1',
+ '119257908#1-AddedOffRampEdge',
+ '119257908#1-AddedOnRampEdge',
+ '119257908#2',
+ '119257908#3',
+ '119257914',
+ '173381935',
+ '27414342#0',
+ '27414342#1-AddedOnRampEdge',
+ '27414345',
+ 'ghost0'],
+ sorted(list(network.specify_routes(network.net_params).keys()))
+ )
+
+ del network
+
+
###############################################################################
# Utility methods #
###############################################################################
diff --git a/tests/fast_tests/test_vehicles.py b/tests/fast_tests/test_vehicles.py
index b791bba64..a4643025b 100644
--- a/tests/fast_tests/test_vehicles.py
+++ b/tests/fast_tests/test_vehicles.py
@@ -261,6 +261,7 @@ def test_no_junctions_highway(self):
"num_edges": 1,
"use_ghost_edge": False,
"ghost_speed_limit": 25,
+ "boundary_cell_length": 300,
}
net_params = NetParams(additional_params=additional_net_params)
vehicles = VehicleParams()
@@ -335,6 +336,7 @@ def test_no_junctions_highway(self):
"num_edges": 1,
"use_ghost_edge": False,
"ghost_speed_limit": 25,
+ "boundary_cell_length": 300,
}
net_params = NetParams(additional_params=additional_net_params)
vehicles = VehicleParams()
@@ -405,6 +407,7 @@ def test_no_junctions_highway(self):
"num_edges": 3,
"use_ghost_edge": False,
"ghost_speed_limit": 25,
+ "boundary_cell_length": 300,
}
net_params = NetParams(additional_params=additional_net_params)
vehicles = VehicleParams()
@@ -474,6 +477,7 @@ def test_no_junctions_highway(self):
"num_edges": 3,
"use_ghost_edge": False,
"ghost_speed_limit": 25,
+ "boundary_cell_length": 300,
}
net_params = NetParams(additional_params=additional_net_params)
vehicles = VehicleParams()
diff --git a/tests/setup_scripts.py b/tests/setup_scripts.py
index ac88d2e42..343bad906 100644
--- a/tests/setup_scripts.py
+++ b/tests/setup_scripts.py
@@ -346,6 +346,7 @@ def highway_exp_setup(sim_params=None,
"num_edges": 1,
"use_ghost_edge": False,
"ghost_speed_limit": 25,
+ "boundary_cell_length": 300,
}
net_params = NetParams(additional_params=additional_net_params)