From 9041ae3255b0dd2198b4689736f7734673557ce6 Mon Sep 17 00:00:00 2001
From: Yangge Li <li213@illinois.edu>
Date: Mon, 20 Jun 2022 10:56:14 -0500
Subject: [PATCH] handle cases when the returned transition is empty

---
 demo/demo2.py                                 | 29 ++++++++-----------
 demo/demo3.py                                 | 26 ++++++++---------
 demo/demo4.py                                 | 22 +++++++-------
 demo/demo7.py                                 | 20 +++++++------
 .../scene_verifier/analysis/simulator.py      |  6 +++-
 .../scene_verifier/analysis/verifier.py       |  3 +-
 .../scene_verifier/scenario/scenario.py       |  5 +++-
 7 files changed, 57 insertions(+), 54 deletions(-)

diff --git a/demo/demo2.py b/demo/demo2.py
index 8a102311..7c8d006f 100644
--- a/demo/demo2.py
+++ b/demo/demo2.py
@@ -54,22 +54,17 @@ if __name__ == "__main__":
             (VehicleMode.Normal, LaneMode.Lane1),
         ]
     )
-    # # res_list = scenario.simulate_multi(40,1)
-    # traces = scenario.verify(40)
+    # res_list = scenario.simulate(40)
+    traces = scenario.verify(40)
 
-    # fig = plt.figure(2)
-    # fig = plot_map(tmp_map, 'g', fig)
-    # fig = plot_reachtube_tree(traces, 'car1', 1, [2], 'b', fig)
-    # fig = plot_reachtube_tree(traces, 'car2', 1, [2], 'r', fig)
-    # # for traces in res_list:
-    # #     generate_simulation_anime(traces, tmp_map, fig)
-    # #     # fig,x_lim,y_lim = plot_simulation_tree(traces, 'car1', 1, [2], 'b', fig,x_lim,y_lim)
-    # #     # fig,x_lim,y_lim = plot_simulation_tree(traces, 'car2', 1, [2], 'r', fig,x_lim,y_lim)
+    fig = plt.figure(2)
+    fig = plot_map(tmp_map, 'g', fig)
+    fig = plot_reachtube_tree(traces, 'car1', 1, [2], 'b', fig)
+    fig = plot_reachtube_tree(traces, 'car2', 1, [2], 'r', fig)
+    plt.show()
 
-    # plt.show()
-
-# this is for plot-based visualization
-    traces = scenario.simulate(40)
-    fig = go.Figure()
-    fig = plotly_simulation_anime(traces, tmp_map, fig)
-    fig.show()
+    # # this is for plot-based visualization
+    # traces = scenario.simulate(40)
+    # fig = go.Figure()
+    # fig = plotly_simulation_anime(traces, tmp_map, fig)
+    # fig.show()
diff --git a/demo/demo3.py b/demo/demo3.py
index 54121e8f..1ba4fc08 100644
--- a/demo/demo3.py
+++ b/demo/demo3.py
@@ -42,7 +42,7 @@ class State:
 
 
 if __name__ == "__main__":
-    input_code_name = './example_controller4.py'
+    input_code_name = './demo/example_controller4.py'
     scenario = Scenario()
 
     car = CarAgent('car1', file_name=input_code_name)
@@ -70,18 +70,18 @@ if __name__ == "__main__":
             (VehicleMode.Normal, LaneMode.Lane1),
         ]
     )
-    # traces = scenario.simulate(70)
-    traces = scenario.verify(70)
+    traces = scenario.simulate(70)
+    # traces = scenario.verify(70)
 
-    fig = plt.figure(2)
-    fig = plot_map(tmp_map, 'g', fig)
-    fig = plot_reachtube_tree(traces, 'car1', 1, [2], 'b', fig)
-    fig = plot_reachtube_tree(traces, 'car2', 1, [2], 'r', fig)
-    fig = plot_reachtube_tree(traces, 'car3', 1, [2], 'r', fig)
-    fig = plot_reachtube_tree(traces, 'car4', 1, [2], 'r', fig)
-    plt.show()    
+    # fig = plt.figure(2)
+    # fig = plot_map(tmp_map, 'g', fig)
+    # fig = plot_reachtube_tree(traces, 'car1', 1, [2], 'b', fig)
+    # fig = plot_reachtube_tree(traces, 'car2', 1, [2], 'r', fig)
+    # fig = plot_reachtube_tree(traces, 'car3', 1, [2], 'r', fig)
+    # fig = plot_reachtube_tree(traces, 'car4', 1, [2], 'r', fig)
+    # plt.show()    
 
-    # fig = go.Figure()
-    # fig = plotly_simulation_anime(traces, tmp_map, fig)
-    # fig.show()
+    fig = go.Figure()
+    fig = plotly_simulation_anime(traces, tmp_map, fig)
+    fig.show()
 
diff --git a/demo/demo4.py b/demo/demo4.py
index a7b1bb85..86d69d5e 100644
--- a/demo/demo4.py
+++ b/demo/demo4.py
@@ -79,18 +79,18 @@ if __name__ == "__main__":
             (VehicleMode.Normal, LaneMode.Lane3),
         ]
     )
-    # traces = scenario.simulate(80)
-    traces = scenario.verify(80)
+    traces = scenario.simulate(80)
+    # traces = scenario.verify(80)
 
-    fig = plt.figure(2)
-    fig = plot_map(tmp_map, 'g', fig)
-    fig = plot_reachtube_tree(traces, 'car1', 1, [2], 'b', fig)
-    fig = plot_reachtube_tree(traces, 'car2', 1, [2], 'r', fig)
-    fig = plot_reachtube_tree(traces, 'car3', 1, [2], 'r', fig)
-    fig = plot_reachtube_tree(traces, 'car4', 1, [2], 'r', fig)
-    fig = plot_reachtube_tree(traces, 'car5', 1, [2], 'r', fig)
-    fig = plot_reachtube_tree(traces, 'car6', 1, [2], 'r', fig)
-    plt.show()
+    # fig = plt.figure(2)
+    # fig = plot_map(tmp_map, 'g', fig)
+    # fig = plot_reachtube_tree(traces, 'car1', 1, [2], 'b', fig)
+    # fig = plot_reachtube_tree(traces, 'car2', 1, [2], 'r', fig)
+    # fig = plot_reachtube_tree(traces, 'car3', 1, [2], 'r', fig)
+    # fig = plot_reachtube_tree(traces, 'car4', 1, [2], 'r', fig)
+    # fig = plot_reachtube_tree(traces, 'car5', 1, [2], 'r', fig)
+    # fig = plot_reachtube_tree(traces, 'car6', 1, [2], 'r', fig)
+    # plt.show()
 
     # fig = go.Figure()
     # fig = plotly_simulation_anime(traces, tmp_map, fig)
diff --git a/demo/demo7.py b/demo/demo7.py
index 0b93f3f6..fd2b0b39 100644
--- a/demo/demo7.py
+++ b/demo/demo7.py
@@ -45,7 +45,7 @@ class State:
 
 
 if __name__ == "__main__":
-    input_code_name = './example_controller8.py'
+    input_code_name = './demo/example_controller8.py'
     scenario = Scenario()
 
     car = CarAgent('car1', file_name=input_code_name)
@@ -89,17 +89,19 @@ if __name__ == "__main__":
             (VehicleMode.Normal, LaneMode.Lane3),
         ]
     )
-    traces = scenario.simulate(80)
-    # traces = scenario.verify(80)
+    traces = scenario.simulate(20)
+    # traces = scenario.verify(15)
 
     # fig = plt.figure(2)
     # fig = plot_map(tmp_map, 'g', fig)
-    # fig = plot_reachtube_tree(traces, 'car1', 1, [2], 'b', fig)
-    # fig = plot_reachtube_tree(traces, 'car2', 1, [2], 'r', fig)
-    # fig = plot_reachtube_tree(traces, 'car3', 1, [2], 'r', fig)
-    # fig = plot_reachtube_tree(traces, 'car4', 1, [2], 'r', fig)
-    # fig = plot_reachtube_tree(traces, 'car5', 1, [2], 'r', fig)
-    # fig = plot_reachtube_tree(traces, 'car6', 1, [2], 'r', fig)
+    # fig = plot_reachtube_tree(traces, 'car1', 1, [2], 'r', fig)
+    # fig = plot_reachtube_tree(traces, 'car2', 1, [2], 'g', fig)
+    # fig = plot_reachtube_tree(traces, 'car3', 1, [2], 'g', fig)
+    # fig = plot_reachtube_tree(traces, 'car4', 1, [2], 'g', fig)
+    # fig = plot_reachtube_tree(traces, 'car5', 1, [2], 'g', fig)
+    # fig = plot_reachtube_tree(traces, 'car6', 1, [2], 'g', fig)
+    # fig = plot_reachtube_tree(traces, 'car7', 1, [2], 'g', fig)
+    # fig = plot_reachtube_tree(traces, 'car8', 1, [2], 'g', fig)
     # plt.show()
 
     fig = go.Figure()
diff --git a/dryvr_plus_plus/scene_verifier/analysis/simulator.py b/dryvr_plus_plus/scene_verifier/analysis/simulator.py
index fab7aa29..c1099ecb 100644
--- a/dryvr_plus_plus/scene_verifier/analysis/simulator.py
+++ b/dryvr_plus_plus/scene_verifier/analysis/simulator.py
@@ -34,7 +34,7 @@ class Simulator:
         while simulation_queue != []:
             node:AnalysisTreeNode = simulation_queue.pop(0)
             print(node.start_time, node.mode)
-            remain_time = time_horizon - node.start_time
+            remain_time = round(time_horizon - node.start_time,10)
             if remain_time <= 0:
                 continue
             # For trace not already simulated
@@ -49,6 +49,10 @@ class Simulator:
 
             transitions, transition_idx = transition_graph.get_transition_simulate_new(node)
 
+            # If there's no transitions (returned transitions is empty), continue
+            if not transitions:
+                continue
+
             # truncate the computed trajectories from idx and store the content after truncate
             truncated_trace = {}
             for agent_idx in node.agent:
diff --git a/dryvr_plus_plus/scene_verifier/analysis/verifier.py b/dryvr_plus_plus/scene_verifier/analysis/verifier.py
index 01fcdca1..123729a6 100644
--- a/dryvr_plus_plus/scene_verifier/analysis/verifier.py
+++ b/dryvr_plus_plus/scene_verifier/analysis/verifier.py
@@ -65,8 +65,7 @@ class Verifier:
                     # print("here")
             
             # TODO: Check safety conditions here
-            if node.trace['car1'][-1][0] > 50.01:
-                print("stop here")
+
             # Get all possible transitions to next mode
             all_possible_transitions = transition_graph.get_transition_verify_new(node)
             max_end_idx = 0
diff --git a/dryvr_plus_plus/scene_verifier/scenario/scenario.py b/dryvr_plus_plus/scene_verifier/scenario/scenario.py
index 142b5172..8a064619 100644
--- a/dryvr_plus_plus/scene_verifier/scenario/scenario.py
+++ b/dryvr_plus_plus/scene_verifier/scenario/scenario.py
@@ -253,7 +253,10 @@ class Scenario:
                                 tmp = tmp[1]
                                 for var in discrete_variable_dict:
                                     tmp = tmp.replace(var, f"'{discrete_variable_dict[var]}'")
-                                possible_dest[i] = eval(tmp)
+                                res = eval(tmp)
+                                if not isinstance(res, list):
+                                    res = [res]
+                                possible_dest[i] = res 
                             else:
                                 tmp = tmp[1].split('.')
                                 if tmp[0].strip(' ') in agent.controller.modes:
-- 
GitLab