From 1940bf874062e3763a851dd1292a1eaf9b941624 Mon Sep 17 00:00:00 2001
From: "Egli Adrian (IT-SCI-API-PFI)" <adrian.egli@sbb.ch>
Date: Tue, 20 Aug 2019 14:00:28 +0200
Subject: [PATCH] generator

---
 flatland/envs/generators.py                   | 138 +++++++-----------
 ...test_flatland_env_sparse_rail_generator.py |   4 +-
 2 files changed, 58 insertions(+), 84 deletions(-)

diff --git a/flatland/envs/generators.py b/flatland/envs/generators.py
index 8eae9312..4589633e 100644
--- a/flatland/envs/generators.py
+++ b/flatland/envs/generators.py
@@ -670,26 +670,17 @@ def realistic_rail_generator(nr_start_goal=1, seed=0, add_max_dead_end=20, two_t
 
         np.random.seed(seed + num_resets)
 
-        max_n_track_seg = np.random.choice([3, 4, 5, 6]) + int(two_track_back_bone)
+        max_n_track_seg = np.random.choice([3, 4, 5]) + int(two_track_back_bone)
         x_offsets = np.arange(0, height, max_n_track_seg).astype(int)
 
-        agents_positions_forward = []
-        agents_directions_forward = []
-        agents_positions_backward = []
-        agents_directions_backward = []
+        agents_positions = []
+        agents_directions = []
         agents_targets = []
 
-        idx_forward = []
-        idx_backward = []
-
-        idx_target = 0
         for off_set_loop in range(len(x_offsets)):
             off_set = x_offsets[off_set_loop]
             # second track
-            data = np.arange(
-                int((width - 4 - 2 * int(
-                    two_track_back_bone) - max_n_track_seg) / max_n_track_seg)) * max_n_track_seg + 4 + int(
-                two_track_back_bone)
+            data = np.arange(3, width - 4, 3)
             n_track_seg = np.random.choice(max_n_track_seg) + 1
 
             track_2 = False
@@ -732,6 +723,13 @@ def realistic_rail_generator(nr_start_goal=1, seed=0, add_max_dead_end=20, two_t
                                           two_track_back_bone_loop))
                         new_path = connect_rail(rail_trans, rail_array, start_track, goal_track)
 
+                        if (goal_track[1] - start_track[1]) > 1:
+                            add_pos = (
+                                int((start_track[0] + goal_track[0]) / 2), int((start_track[1] + goal_track[1]) / 2))
+                            agents_positions.append(add_pos)
+                            agents_directions.append(([1, 3][off_set_loop % 2]))
+                            agents_targets.append(add_pos)
+
                         add_rail(width, height, grid_map,
                                  (x_offsets[off_set_loop - 1] + int(two_track_back_bone_loop),
                                   width - 2 - int(two_track_back_bone_loop)),
@@ -776,6 +774,13 @@ def realistic_rail_generator(nr_start_goal=1, seed=0, add_max_dead_end=20, two_t
                                       int(two_track_back_bone_loop))
                         new_path = connect_rail(rail_trans, rail_array, start_track, goal_track)
 
+                        if (goal_track[1] - start_track[1]) > 1:
+                            add_pos = (
+                                int((start_track[0] + goal_track[0]) / 2), int((start_track[1] + goal_track[1]) / 2))
+                            agents_positions.append(add_pos)
+                            agents_directions.append(([1, 3][off_set_loop % 2]))
+                            agents_targets.append(add_pos)
+
                         add_rail(width, height, grid_map,
                                  (x_offsets[off_set_loop - 1] + int(two_track_back_bone_loop),
                                   1 + int(two_track_back_bone_loop)),
@@ -833,50 +838,39 @@ def realistic_rail_generator(nr_start_goal=1, seed=0, add_max_dead_end=20, two_t
                         make_switch_w_e(width, height, grid_map, c)
 
                     add_pos = (int((start[0] + goal[0]) / 2), int((start[1] + goal[1]) / 2))
-                    if nbr_track_loop % 2 == 0:
-                        agents_positions_forward.append(add_pos)
-                        agents_directions_forward.append(([1, 3][off_set_loop % 2]))
-                        idx_forward.append(idx_target)
-                    else:
-                        agents_positions_backward.append(add_pos)
-                        agents_directions_backward.append(([1, 3][off_set_loop % 2]))
-                        idx_backward.append(idx_target)
-
-                    add_pos = (int((start[0] + goal[0]) / 2), int((2 * start[1] + goal[1]) / 3), idx_target)
+                    agents_positions.append(add_pos)
+                    agents_directions.append(([1, 3][off_set_loop % 2]))
+                    add_pos = (int((start[0] + goal[0]) / 2), int((2 * start[1] + goal[1]) / 3))
                     agents_targets.append(add_pos)
-                    idx_target += 1
 
-            for pos_y in np.random.choice(np.arange(width - 7) + 3, min(width - 7, add_max_dead_end), False):
+            pos_ys = np.random.choice(np.arange(width - 7) + 3, min(width - 7, add_max_dead_end), False)
+            for pos_y in pos_ys:
                 pos_x = off_set + 1 + int(two_track_back_bone)
                 if pos_x < height - 1:
                     ok = True
-                    for k in range(6):
-                        c = (pos_x - 1, pos_y - k + 1)
-                        ok &= grid_map.grid[c[0]][c[1]] == 1025
+                    for k in range(4):
+                        if two_track_back_bone:
+                            c = (pos_x - 1, pos_y - k + 1)
+                            ok &= grid_map.grid[c[0]][c[1]] == 1025
                         c = (pos_x, pos_y - k + 1)
                         ok &= grid_map.grid[c[0]][c[1]] == 0
                     if ok:
-                        if np.random.random() < 0.5:
+                        if np.random.random() < 0.95:
                             start_track = (pos_x, pos_y)
                             goal_track = (pos_x, pos_y - 2)
                             new_path = connect_rail(rail_trans, rail_array, start_track, goal_track)
                             if len(new_path) > 0:
                                 c = (pos_x - 1, pos_y - 1)
                                 make_switch_e_w(width, height, grid_map, c)
-                                if np.random.random() < 0.5:
-                                    add_pos = (
-                                        int((goal_track[0] + start_track[0]) / 2),
-                                        int((goal_track[1] + start_track[1]) / 2),
-                                        idx_target)
-                                    agents_positions_backward.append(add_pos)
-                                    agents_directions_backward.append(3)
-                                    idx_backward.append(idx_target)
-                                    add_pos = (
-                                        int((goal_track[0] + start_track[0]) / 2),
-                                        int((goal_track[1] + start_track[1]) / 2),
-                                        idx_target)
-                                    agents_targets.append(add_pos)
-                                    idx_target += 1
+                                add_pos = (
+                                    int((goal_track[0] + start_track[0]) / 2),
+                                    int((goal_track[1] + start_track[1]) / 2))
+                                agents_positions.append(add_pos)
+                                agents_directions.append(3)
+                                add_pos = (
+                                    int((goal_track[0] + start_track[0]) / 2),
+                                    int((goal_track[1] + start_track[1]) / 2))
+                                agents_targets.append(add_pos)
                         else:
                             start_track = (pos_x, pos_y)
                             goal_track = (pos_x, pos_y - 2)
@@ -884,20 +878,15 @@ def realistic_rail_generator(nr_start_goal=1, seed=0, add_max_dead_end=20, two_t
                             if len(new_path) > 0:
                                 c = (pos_x - 1, pos_y + 1)
                                 make_switch_w_e(width, height, grid_map, c)
-                                if np.random.random() < 0.5:
-                                    add_pos = (
-                                        int((goal_track[0] + start_track[0]) / 2),
-                                        int((goal_track[1] + start_track[1]) / 2),
-                                        idx_target)
-                                    agents_positions_forward.append(add_pos)
-                                    agents_directions_forward.append(1)
-                                    idx_forward.append(idx_target)
-                                    add_pos = (
-                                        int((goal_track[0] + start_track[0]) / 2),
-                                        int((goal_track[1] + start_track[1]) / 2),
-                                        idx_target)
-                                    agents_targets.append(add_pos)
-                                    idx_target += 1
+                                add_pos = (
+                                    int((goal_track[0] + start_track[0]) / 2),
+                                    int((goal_track[1] + start_track[1]) / 2))
+                                agents_positions.append(add_pos)
+                                agents_directions.append(1)
+                                add_pos = (
+                                    int((goal_track[0] + start_track[0]) / 2),
+                                    int((goal_track[1] + start_track[1]) / 2))
+                                agents_targets.append(add_pos)
 
         agents_position = []
         agents_target = []
@@ -907,30 +896,15 @@ def realistic_rail_generator(nr_start_goal=1, seed=0, add_max_dead_end=20, two_t
             t = np.random.choice(range(len(agents_targets)))
             d = agents_targets[t]
             agents_targets.pop(t)
-            if np.random.random() < 0.5:  # d[2] < idx_target:
-                if len(idx_backward) > 0:
-                    agents_target.append((d[0], d[1]))
-                    sel = np.random.choice(range(len(idx_backward)))
-                    # backward
-                    p = agents_positions_backward[sel]
-                    d = agents_directions_backward[sel]
-                    agents_positions_backward.pop(sel)
-                    agents_directions_backward.pop(sel)
-                    idx_backward.pop(sel)
-                    agents_position.append((p[0], p[1]))
-                    agents_direction.append(d)
-            else:
-                if len(idx_forward) > 0:
-                    agents_target.append((d[0], d[1]))
-                    sel = np.random.choice(range(len(idx_forward)))
-                    # forward
-                    p = agents_positions_forward[sel]
-                    d = agents_directions_forward[sel]
-                    agents_positions_forward.pop(sel)
-                    agents_directions_forward.pop(sel)
-                    idx_forward.pop(sel)
-                    agents_position.append((p[0], p[1]))
-                    agents_direction.append(d)
+            agents_target.append((d[0], d[1]))
+            sel = np.random.choice(range(len(agents_positions)))
+            # backward
+            p = agents_positions[sel]
+            d = agents_directions[sel]
+            agents_positions.pop(sel)
+            agents_directions.pop(sel)
+            agents_position.append((p[0], p[1]))
+            agents_direction.append(d)
 
         return grid_map, agents_position, agents_direction, agents_target, [1.0] * len(agents_position)
 
@@ -1070,7 +1044,7 @@ def sparse_rail_generator(num_cities=100, num_intersections=10, num_trainstation
                                     width - 1)
                 while (station_x, station_y) in train_stations or (station_x, station_y) == node_positions[
                     trainstation_node] or \
-                        rail_array[(station_x, station_y)] != 0:
+                    rail_array[(station_x, station_y)] != 0:
                     station_x = np.clip(
                         node_positions[trainstation_node][0] + np.random.randint(-node_radius, node_radius),
                         0,
diff --git a/tests/test_flatland_env_sparse_rail_generator.py b/tests/test_flatland_env_sparse_rail_generator.py
index 8f494df8..b3ee348c 100644
--- a/tests/test_flatland_env_sparse_rail_generator.py
+++ b/tests/test_flatland_env_sparse_rail_generator.py
@@ -8,7 +8,7 @@ from flatland.envs.rail_env import RailEnv
 from flatland.utils.rendertools import RenderTool, AgentRenderVariant
 
 def test_realistic_rail_generator(vizualization_folder_name=None):
-    for test_loop in range(5):
+    for test_loop in range(50):
         print("test_loop", test_loop)
         num_agents = np.random.randint(10, 30)
         env = RailEnv(width=np.random.randint(40, 80),
@@ -51,4 +51,4 @@ def test_sparse_rail_generator():
     env_renderer.render_env(show=True, show_observations=True, show_predictions=False)
     env_renderer.close_window()
 
-# test_realistic_rail_generator("./../rendering/")
+#test_realistic_rail_generator("./../rendering/")
-- 
GitLab