From c7abe0da51542970b56e7356d744a419f9d623bd Mon Sep 17 00:00:00 2001
From: "Egli Adrian (IT-SCI-API-PFI)" <adrian.egli@sbb.ch>
Date: Tue, 1 Oct 2019 08:00:58 +0200
Subject: [PATCH]                         #TODO why can this happen?

---
 flatland/envs/rail_generators.py | 67 ++++++++++++++++++--------------
 notebooks/Scene_Editor.ipynb     | 20 ++--------
 2 files changed, 41 insertions(+), 46 deletions(-)

diff --git a/flatland/envs/rail_generators.py b/flatland/envs/rail_generators.py
index bcb14570..dda11d40 100644
--- a/flatland/envs/rail_generators.py
+++ b/flatland/envs/rail_generators.py
@@ -557,8 +557,6 @@ def sparse_rail_generator(num_cities=5, grid_mode=False, max_inter_city_rails=4,
 
         # Graph to be able to create correct start/end pairs for schedule
 
-
-
         node_radius = int(np.ceil((max_tracks_in_city + 2) / 2.0)) + 1
         if 3 > max_tracks_in_city:
             rail_in_city = 3
@@ -709,20 +707,20 @@ def sparse_rail_generator(num_cities=5, grid_mode=False, max_inter_city_rails=4,
             start_idx = int((nr_of_connection_points - number_of_out_rails) / 2)
             for direction in range(4):
                 connection_slots = np.arange(connections_per_direction[direction]) - int(
-                        connections_per_direction[direction] / 2)
+                    connections_per_direction[direction] / 2)
                 for connection_idx in range(connections_per_direction[direction]):
                     if direction == 0:
                         tmp_coordinates = (
-                        node_position[0] - node_size, node_position[1] + connection_slots[connection_idx])
+                            node_position[0] - node_size, node_position[1] + connection_slots[connection_idx])
                     if direction == 1:
                         tmp_coordinates = (
-                        node_position[0] + connection_slots[connection_idx], node_position[1] + node_size)
+                            node_position[0] + connection_slots[connection_idx], node_position[1] + node_size)
                     if direction == 2:
                         tmp_coordinates = (
-                        node_position[0] + node_size, node_position[1] + connection_slots[connection_idx])
+                            node_position[0] + node_size, node_position[1] + connection_slots[connection_idx])
                     if direction == 3:
                         tmp_coordinates = (
-                        node_position[0] + connection_slots[connection_idx], node_position[1] - node_size)
+                            node_position[0] + connection_slots[connection_idx], node_position[1] - node_size)
                     connection_points_coordinates_inner[direction].append(tmp_coordinates)
                     if connection_idx in range(start_idx, start_idx + number_of_out_rails + 1):
                         connection_points_coordinates_outer[direction].append(tmp_coordinates)
@@ -758,29 +756,37 @@ def sparse_rail_generator(num_cities=5, grid_mode=False, max_inter_city_rails=4,
 
                 # If no closest neighbour was found look at the neighbouring connections
                 tmp_direction = (direction - 1) % 4
-                while neighb_idx is None:
-                    neighb_idx = neighbours[tmp_direction]
-                    tmp_direction = (direction + 1) % 4
-
-                connected_to_city.append(neighb_idx)
-                for tmp_out_connection_point in connection_points[current_node][direction]:
-                    # Find closest connection point
-                    min_connection_dist = np.inf
-                    for dir in range(4):
-                        current_points = connection_points[neighb_idx][dir]
-                        for tmp_in_connection_point in current_points:
-                            tmp_dist = distance_on_rail(tmp_out_connection_point, tmp_in_connection_point,
-                                                    metric="Manhattan")
-                            if tmp_dist < min_connection_dist:
-                                min_connection_dist = tmp_dist
-                                neighb_connection_point = tmp_in_connection_point
-                                neighbour_direction = dir
-                    new_line = connect_cities(rail_trans, grid_map, tmp_out_connection_point, neighb_connection_point,
-                                              city_cells)
-                    G.add_edge(current_node, neighb_idx, direction=direction, length=len(new_line))
-                    G.add_edge(neighb_idx, current_node, direction=neighbour_direction, length=len(new_line))
-
-                    all_paths.extend(new_line)
+                filtered_neighbours = list(filter(None, neighbours))
+                if len(filtered_neighbours) > 0:
+                    while neighb_idx is None:
+                        neighb_idx = filtered_neighbours[tmp_direction % len(filtered_neighbours)]
+                        tmp_direction = (direction + 1) % 4
+
+                    connected_to_city.append(neighb_idx)
+                    for tmp_out_connection_point in connection_points[current_node][direction]:
+                        # Find closest connection point
+                        min_connection_dist = np.inf
+                        for dir in range(4):
+                            current_points = connection_points[neighb_idx][dir]
+                            for tmp_in_connection_point in current_points:
+                                tmp_dist = distance_on_rail(tmp_out_connection_point, tmp_in_connection_point,
+                                                            metric="Manhattan")
+                                if tmp_dist < min_connection_dist:
+                                    min_connection_dist = tmp_dist
+                                    neighb_connection_point = tmp_in_connection_point
+                                    neighbour_direction = dir
+                        new_line = connect_cities(rail_trans, grid_map, tmp_out_connection_point,
+                                                  neighb_connection_point,
+                                                  city_cells)
+                        G.add_edge(current_node, neighb_idx, direction=direction, length=len(new_line))
+                        G.add_edge(neighb_idx, current_node, direction=neighbour_direction, length=len(new_line))
+
+                        all_paths.extend(new_line)
+
+                    else:
+                        # TODO why can this happen?
+                        warnings.warn("all neighbours are NONE!")
+
                 direction += 1
 
         return all_paths
@@ -1007,4 +1013,5 @@ def sparse_rail_generator(num_cities=5, grid_mode=False, max_inter_city_rails=4,
                 return np.abs(city_position[0] - position[0]) % 2
             else:
                 return (np.abs(city_position[0] - position[0]) + 1) % 2
+
     return generator
diff --git a/notebooks/Scene_Editor.ipynb b/notebooks/Scene_Editor.ipynb
index acf418e6..5ee1c839 100644
--- a/notebooks/Scene_Editor.ipynb
+++ b/notebooks/Scene_Editor.ipynb
@@ -9,7 +9,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 1,
+   "execution_count": 4,
    "metadata": {},
    "outputs": [
     {
@@ -32,7 +32,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 2,
+   "execution_count": 5,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -62,7 +62,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 3,
+   "execution_count": 6,
    "metadata": {
     "scrolled": false
    },
@@ -70,7 +70,7 @@
     {
      "data": {
       "application/vnd.jupyter.widget-view+json": {
-       "model_id": "84809032a2f84b908e889f90594b3d62",
+       "model_id": "8e968bb6c8204596a24df0a8ad9e8440",
        "version_major": 2,
        "version_minor": 0
       },
@@ -80,18 +80,6 @@
      },
      "metadata": {},
      "output_type": "display_data"
-    },
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "load file:  temp.pkl\n",
-      "Regenerate size 5 5\n",
-      "load file:  temp.pkl\n",
-      "load file:  temp.pkl\n",
-      "Regenerate size 5 5\n",
-      "load file:  temp.pkl\n"
-     ]
     }
    ],
    "source": [
-- 
GitLab