From 4b45e8e8b1d6d4b91fc757acf735f2125484c685 Mon Sep 17 00:00:00 2001 From: MLErik <baerenjesus@gmail.com> Date: Tue, 8 Oct 2019 16:23:59 -0400 Subject: [PATCH] updated tests and found issue with synchronicity --- README.md | 2 +- docs/specifications/railway.md | 2 +- docs/tutorials/01_gettingstarted.rst | 2 +- docs/tutorials/02_observationbuilder.rst | 4 +- docs/tutorials/05_multispeed.md | 2 +- .../Simple_Realistic_Railway_Generator.py | 2 +- ...ion_example_02_SingleAgentNavigationObs.py | 2 +- ...servation_example_03_ObservePredictions.py | 2 +- examples/debugging_example_DELETE.py | 2 +- examples/simple_example_3.py | 2 +- examples/training_example.py | 2 +- flatland/envs/rail_env.py | 3 +- flatland/envs/rail_generators.py | 4 +- tests/test_flatland_envs_rail_env.py | 2 +- tests/test_multi_speed.py | 4 +- tests/test_random_seeding.py | 139 ++++++++---------- tests/test_speed_classes.py | 2 +- 17 files changed, 80 insertions(+), 98 deletions(-) diff --git a/README.md b/README.md index 14102def..0f621c1b 100644 --- a/README.md +++ b/README.md @@ -106,7 +106,7 @@ env = RailEnv( nr_extra=1, min_dist=8, max_dist=99999, - seed=0), + seed=1), schedule_generator=complex_schedule_generator(), number_of_agents=NUMBER_OF_AGENTS) diff --git a/docs/specifications/railway.md b/docs/specifications/railway.md index 04867f08..ec707f87 100644 --- a/docs/specifications/railway.md +++ b/docs/specifications/railway.md @@ -380,7 +380,7 @@ ScheduleGenerator = Callable[[GridTransitionMap, int, Optional[Any]], ScheduleGe We can then produce `RailGenerator`s by currying: ```python def sparse_rail_generator(num_cities=5, num_intersections=4, num_trainstations=2, min_node_dist=20, node_radius=2, - num_neighb=3, grid_mode=False, enhance_intersection=False, seed=0): + num_neighb=3, grid_mode=False, enhance_intersection=False, seed=1): def generator(width, height, num_agents, num_resets=0): diff --git a/docs/tutorials/01_gettingstarted.rst b/docs/tutorials/01_gettingstarted.rst index 2be0fee2..e3a2f41a 100644 --- a/docs/tutorials/01_gettingstarted.rst +++ b/docs/tutorials/01_gettingstarted.rst @@ -145,7 +145,7 @@ Next we configure the difficulty of our task by modifying the complex_rail_gener nr_extra=10, min_dist=10, max_dist=99999, - seed=0), + seed=1), number_of_agents=5) The difficulty of a railway network depends on the dimensions (`width` x `height`) and the number of agents in the network. diff --git a/docs/tutorials/02_observationbuilder.rst b/docs/tutorials/02_observationbuilder.rst index f6e718ab..8afcf710 100644 --- a/docs/tutorials/02_observationbuilder.rst +++ b/docs/tutorials/02_observationbuilder.rst @@ -118,7 +118,7 @@ Note that this simple strategy fails when multiple agents are present, as each a env = RailEnv(width=7, height=7, rail_generator=complex_rail_generator(nr_start_goal=10, nr_extra=1, \ - min_dist=8, max_dist=99999, seed=0), + min_dist=8, max_dist=99999, seed=1), number_of_agents=2, obs_builder_object=SingleAgentNavigationObs()) @@ -267,7 +267,7 @@ We can then use this new observation builder and the renderer to visualize the o # Initiate Environment env = RailEnv(width=10, height=10, - rail_generator=complex_rail_generator(nr_start_goal=5, nr_extra=1, min_dist=8, max_dist=99999, seed=0), + rail_generator=complex_rail_generator(nr_start_goal=5, nr_extra=1, min_dist=8, max_dist=99999, seed=1), number_of_agents=3, obs_builder_object=CustomObsBuilder) diff --git a/docs/tutorials/05_multispeed.md b/docs/tutorials/05_multispeed.md index 99db7ee6..118d4c59 100644 --- a/docs/tutorials/05_multispeed.md +++ b/docs/tutorials/05_multispeed.md @@ -64,7 +64,7 @@ ScheduleGenerator = Callable[[GridTransitionMap, int, Optional[Any]], ScheduleGe We can then produce `RailGenerator`s by currying: ```python def sparse_rail_generator(num_cities=5, num_intersections=4, num_trainstations=2, min_node_dist=20, node_radius=2, - num_neighb=3, grid_mode=False, enhance_intersection=False, seed=0): + num_neighb=3, grid_mode=False, enhance_intersection=False, seed=1): def generator(width, height, num_agents, num_resets=0): diff --git a/examples/Simple_Realistic_Railway_Generator.py b/examples/Simple_Realistic_Railway_Generator.py index 9124edd1..d4f013d5 100644 --- a/examples/Simple_Realistic_Railway_Generator.py +++ b/examples/Simple_Realistic_Railway_Generator.py @@ -201,7 +201,7 @@ def realistic_rail_generator(max_num_cities=5, nbr_of_switches_per_station_track=2, connect_max_nbr_of_shortes_city=4, do_random_connect_stations=False, - seed=0, + seed=1, print_out_info=True) -> RailGenerator: """ This is a level generator which generates a realistic rail configurations diff --git a/examples/custom_observation_example_02_SingleAgentNavigationObs.py b/examples/custom_observation_example_02_SingleAgentNavigationObs.py index 3c10e415..aa9da849 100644 --- a/examples/custom_observation_example_02_SingleAgentNavigationObs.py +++ b/examples/custom_observation_example_02_SingleAgentNavigationObs.py @@ -75,7 +75,7 @@ def main(args): env = RailEnv(width=7, height=7, rail_generator=complex_rail_generator(nr_start_goal=10, nr_extra=1, min_dist=5, max_dist=99999, - seed=0), + seed=1), schedule_generator=complex_schedule_generator(), number_of_agents=1, obs_builder_object=SingleAgentNavigationObs()) diff --git a/examples/custom_observation_example_03_ObservePredictions.py b/examples/custom_observation_example_03_ObservePredictions.py index 97fac09c..7af7499a 100644 --- a/examples/custom_observation_example_03_ObservePredictions.py +++ b/examples/custom_observation_example_03_ObservePredictions.py @@ -125,7 +125,7 @@ def main(args): env = RailEnv(width=10, height=10, rail_generator=complex_rail_generator(nr_start_goal=5, nr_extra=1, min_dist=8, max_dist=99999, - seed=0), + seed=1), schedule_generator=complex_schedule_generator(), number_of_agents=3, obs_builder_object=custom_obs_builder) diff --git a/examples/debugging_example_DELETE.py b/examples/debugging_example_DELETE.py index 1f094c09..9de330c9 100644 --- a/examples/debugging_example_DELETE.py +++ b/examples/debugging_example_DELETE.py @@ -57,7 +57,7 @@ class SingleAgentNavigationObs(ObservationBuilder): env = RailEnv(width=14, height=14, - rail_generator=complex_rail_generator(nr_start_goal=10, nr_extra=1, min_dist=5, max_dist=99999, seed=0), + rail_generator=complex_rail_generator(nr_start_goal=10, nr_extra=1, min_dist=5, max_dist=99999, seed=1), schedule_generator=complex_schedule_generator(), number_of_agents=2, obs_builder_object=SingleAgentNavigationObs()) diff --git a/examples/simple_example_3.py b/examples/simple_example_3.py index 61b83c3b..f294279d 100644 --- a/examples/simple_example_3.py +++ b/examples/simple_example_3.py @@ -13,7 +13,7 @@ np.random.seed(1) env = RailEnv(width=7, height=7, - rail_generator=complex_rail_generator(nr_start_goal=10, nr_extra=1, min_dist=5, max_dist=99999, seed=0), + rail_generator=complex_rail_generator(nr_start_goal=10, nr_extra=1, min_dist=5, max_dist=99999, seed=1), schedule_generator=complex_schedule_generator(), number_of_agents=2, obs_builder_object=TreeObsForRailEnv(max_depth=2)) diff --git a/examples/training_example.py b/examples/training_example.py index 8b42586b..9d663171 100644 --- a/examples/training_example.py +++ b/examples/training_example.py @@ -16,7 +16,7 @@ TreeObservation = TreeObsForRailEnv(max_depth=2, predictor=ShortestPathPredictor LocalGridObs = LocalObsForRailEnv(view_height=10, view_width=2, center=2) env = RailEnv(width=20, height=20, - rail_generator=complex_rail_generator(nr_start_goal=10, nr_extra=2, min_dist=8, max_dist=99999, seed=0), + rail_generator=complex_rail_generator(nr_start_goal=10, nr_extra=2, min_dist=8, max_dist=99999, seed=1), schedule_generator=complex_schedule_generator(), obs_builder_object=TreeObservation, number_of_agents=3) diff --git a/flatland/envs/rail_env.py b/flatland/envs/rail_env.py index 7e4697dd..4b48b611 100644 --- a/flatland/envs/rail_env.py +++ b/flatland/envs/rail_env.py @@ -160,7 +160,6 @@ class RailEnv(Environment): self.rail_generator: RailGenerator = rail_generator self.schedule_generator: ScheduleGenerator = schedule_generator - self.rail_generator = rail_generator self.rail: Optional[GridTransitionMap] = None self.width = width self.height = height @@ -217,7 +216,7 @@ class RailEnv(Environment): # Uniform distribution parameters for malfunction duration self.min_number_of_steps_broken = malfunction_min_duration self.max_number_of_steps_broken = malfunction_max_duration - # Rest environment + # Reset environment self.reset() self.num_resets = 0 # yes, set it to zero again! diff --git a/flatland/envs/rail_generators.py b/flatland/envs/rail_generators.py index 242e11d7..ced33635 100644 --- a/flatland/envs/rail_generators.py +++ b/flatland/envs/rail_generators.py @@ -40,7 +40,7 @@ def complex_rail_generator(nr_start_goal=1, nr_extra=100, min_dist=20, max_dist=99999, - seed=0) -> RailGenerator: + seed=1) -> RailGenerator: """ complex_rail_generator @@ -272,7 +272,7 @@ def rail_from_grid_transition_map(rail_map) -> RailGenerator: return generator -def random_rail_generator(cell_type_relative_proportion=[1.0] * 11, seed=0) -> RailGenerator: +def random_rail_generator(cell_type_relative_proportion=[1.0] * 11, seed=1) -> RailGenerator: """ Dummy random level generator: - fill in cells at random in [width-2, height-2] diff --git a/tests/test_flatland_envs_rail_env.py b/tests/test_flatland_envs_rail_env.py index e0281bb0..7c8a65fd 100644 --- a/tests/test_flatland_envs_rail_env.py +++ b/tests/test_flatland_envs_rail_env.py @@ -28,7 +28,7 @@ def test_load_env(): def test_save_load(): env = RailEnv(width=10, height=10, - rail_generator=complex_rail_generator(nr_start_goal=2, nr_extra=5, min_dist=6, seed=0), + rail_generator=complex_rail_generator(nr_start_goal=2, nr_extra=5, min_dist=6, seed=1), schedule_generator=complex_schedule_generator(), number_of_agents=2) env.reset() diff --git a/tests/test_multi_speed.py b/tests/test_multi_speed.py index 3cd0a4c1..d190a576 100644 --- a/tests/test_multi_speed.py +++ b/tests/test_multi_speed.py @@ -1,4 +1,5 @@ import numpy as np +from test_utils import ReplayConfig, Replay, run_replay_config, set_penalties_for_replay from flatland.core.grid.grid4 import Grid4TransitionsEnum from flatland.envs.observations import TreeObsForRailEnv @@ -7,7 +8,6 @@ from flatland.envs.rail_env import RailEnv, RailEnvActions from flatland.envs.rail_generators import complex_rail_generator, rail_from_grid_transition_map from flatland.envs.schedule_generators import complex_schedule_generator, random_schedule_generator from flatland.utils.simple_rail import make_simple_rail -from test_utils import ReplayConfig, Replay, run_replay_config, set_penalties_for_replay np.random.seed(1) @@ -52,7 +52,7 @@ def test_multi_speed_init(): env = RailEnv(width=50, height=50, rail_generator=complex_rail_generator(nr_start_goal=10, nr_extra=1, min_dist=8, max_dist=99999, - seed=0), + seed=1), schedule_generator=complex_schedule_generator(), number_of_agents=5) # Initialize the agent with the parameters corresponding to the environment and observation_builder diff --git a/tests/test_random_seeding.py b/tests/test_random_seeding.py index b374b21d..2a783dff 100644 --- a/tests/test_random_seeding.py +++ b/tests/test_random_seeding.py @@ -36,7 +36,7 @@ def test_random_seeding(): # Test generation print assert env.agents[0].position == (3, 6) # print("env.agents[0].initial_position == {}".format(env.agents[0].initial_position)) - #print("assert env.agents[0].position == {}".format(env.agents[0].position)) + # print("assert env.agents[0].position == {}".format(env.agents[0].position)) def test_seeding_and_observations(): @@ -110,81 +110,64 @@ def test_seeding_and_malfunction(): 'max_duration': 10} # Make two seperate envs with different and see if the exhibit the same malfunctions # Global Observation - env = RailEnv(width=25, - height=30, - rail_generator=rail_from_grid_transition_map(rail), - schedule_generator=random_schedule_generator(seed=12), - number_of_agents=10, - obs_builder_object=GlobalObsForRailEnv(), - stochastic_data=stochastic_data, # Malfunction data generator - ) - - # Tree Observation - env2 = RailEnv(width=25, - height=30, - rail_generator=rail_from_grid_transition_map(rail), - schedule_generator=random_schedule_generator(seed=12), - number_of_agents=10, - obs_builder_object=GlobalObsForRailEnv(), - stochastic_data=stochastic_data, # Malfunction data generator - ) - - env.reset(False, False, False, random_seed=12) - env2.reset(False, False, False, random_seed=12) - - # Check that both environments produce the same initial start positions - assert env.agents[0].initial_position == env2.agents[0].initial_position - assert env.agents[1].initial_position == env2.agents[1].initial_position - assert env.agents[2].initial_position == env2.agents[2].initial_position - assert env.agents[3].initial_position == env2.agents[3].initial_position - assert env.agents[4].initial_position == env2.agents[4].initial_position - assert env.agents[5].initial_position == env2.agents[5].initial_position - assert env.agents[6].initial_position == env2.agents[6].initial_position - assert env.agents[7].initial_position == env2.agents[7].initial_position - assert env.agents[8].initial_position == env2.agents[8].initial_position - assert env.agents[9].initial_position == env2.agents[9].initial_position - - action_dict = {} - for step in range(10): - for a in range(env.get_num_agents()): - action = np.random.randint(4) - action_dict[a] = action - print(env.agents[a].malfunction_data['malfunction'], env2.agents[a].malfunction_data['malfunction']) - env.step(action_dict) - env2.step(action_dict) - - - # Check that both environments end up in the same position - - assert env.agents[0].position == env2.agents[0].position - assert env.agents[1].position == env2.agents[1].position - assert env.agents[2].position == env2.agents[2].position - assert env.agents[3].position == env2.agents[3].position - assert env.agents[4].position == env2.agents[4].position - assert env.agents[5].position == env2.agents[5].position - assert env.agents[6].position == env2.agents[6].position - assert env.agents[7].position == env2.agents[7].position - assert env.agents[8].position == env2.agents[8].position - assert env.agents[9].position == env2.agents[9].position - for a in range(env.get_num_agents()): - print("assert env.agents[{}].position == env2.agents[{}].position".format(a, a)) - + for tests in range(1, 100): + env = RailEnv(width=25, + height=30, + rail_generator=rail_from_grid_transition_map(rail), + schedule_generator=random_schedule_generator(), + number_of_agents=10, + random_seed=tests, + obs_builder_object=GlobalObsForRailEnv(), + stochastic_data=stochastic_data, # Malfunction data generator + ) -def tests_new_distributio(): - def _exp_distirbution_synced(rate): - """ - Generates sample from exponential distribution - We need this to guarantee synchronity between different instances with same seed. - :param rate: - :return: - """ - u = np.random.rand() - x = - np.log(1 - u) * rate - return x - - numbers = [] - for i in range(100): - rate1 = 2 - rate2 = 100 - print((_exp_distirbution_synced(rate1), _exp_distirbution_synced(rate2))) - print(numbers) + # Tree Observation + env2 = RailEnv(width=25, + height=30, + rail_generator=rail_from_grid_transition_map(rail), + schedule_generator=random_schedule_generator(), + number_of_agents=10, + random_seed=tests, + obs_builder_object=GlobalObsForRailEnv(), + stochastic_data=stochastic_data, # Malfunction data generator + ) + + env.reset(True, False, True, random_seed=tests) + env2.reset(True, False, True, random_seed=tests) + + # Check that both environments produce the same initial start positions + assert env.agents[0].initial_position == env2.agents[0].initial_position + assert env.agents[1].initial_position == env2.agents[1].initial_position + assert env.agents[2].initial_position == env2.agents[2].initial_position + assert env.agents[3].initial_position == env2.agents[3].initial_position + assert env.agents[4].initial_position == env2.agents[4].initial_position + assert env.agents[5].initial_position == env2.agents[5].initial_position + assert env.agents[6].initial_position == env2.agents[6].initial_position + assert env.agents[7].initial_position == env2.agents[7].initial_position + assert env.agents[8].initial_position == env2.agents[8].initial_position + assert env.agents[9].initial_position == env2.agents[9].initial_position + + action_dict = {} + for step in range(10): + for a in range(env.get_num_agents()): + action = np.random.randint(4) + action_dict[a] = action + # print("----------------------") + # print(env.agents[a].malfunction_data, env.agents[a].status) + # print(env2.agents[a].malfunction_data, env2.agents[a].status) + + env.step(action_dict) + env2.step(action_dict) + + # Check that both environments end up in the same position + + assert env.agents[0].position == env2.agents[0].position + assert env.agents[1].position == env2.agents[1].position + assert env.agents[2].position == env2.agents[2].position + assert env.agents[3].position == env2.agents[3].position + assert env.agents[4].position == env2.agents[4].position + assert env.agents[5].position == env2.agents[5].position + assert env.agents[6].position == env2.agents[6].position + assert env.agents[7].position == env2.agents[7].position + assert env.agents[8].position == env2.agents[8].position + assert env.agents[9].position == env2.agents[9].position diff --git a/tests/test_speed_classes.py b/tests/test_speed_classes.py index ff5ee56a..1fcf3b3e 100644 --- a/tests/test_speed_classes.py +++ b/tests/test_speed_classes.py @@ -21,7 +21,7 @@ def test_rail_env_speed_intializer(): env = RailEnv(width=50, height=50, rail_generator=complex_rail_generator(nr_start_goal=10, nr_extra=1, min_dist=8, max_dist=99999, - seed=0), + seed=1), schedule_generator=complex_schedule_generator(), number_of_agents=10) env.reset() -- GitLab