From 8ce6282c793e815c2800976ff7de606b46b39fc7 Mon Sep 17 00:00:00 2001
From: Yangge Li <li213@illinois.edu>
Date: Tue, 4 Oct 2022 21:39:52 -0500
Subject: [PATCH] modify many car example, small modification in parser

---
 demo/tacas2023/exp2/example_controller5.py |  2 +-
 demo/tacas2023/exp3/demo6.py               |  2 +-
 verse/analysis/analysis_tree.py            |  6 ++++++
 verse/map/lane_map.py                      |  2 ++
 verse/parser/parser.py                     | 13 ++++++++++---
 5 files changed, 20 insertions(+), 5 deletions(-)

diff --git a/demo/tacas2023/exp2/example_controller5.py b/demo/tacas2023/exp2/example_controller5.py
index 2c95eee4..3414a5c2 100644
--- a/demo/tacas2023/exp2/example_controller5.py
+++ b/demo/tacas2023/exp2/example_controller5.py
@@ -49,7 +49,7 @@ def controller(ego:State, others:List[State], lane_map):
     output = copy.deepcopy(ego)
     if ego.agent_mode == VehicleMode.Normal:
         if vehicle_front(ego, others, lane_map):
-            if lane_map.h_exist(ego.lane_mode, ego.agent_mode, 'SwitchLeft'):
+            if lane_map.h_exist(ego.lane_mode, ego.agent_mode, VehicleMode.SwitchLeft):
                 output.agent_mode = VehicleMode.SwitchLeft
                 output.lane_mode = lane_map.h(ego.lane_mode, ego.agent_mode, 'SwitchLeft')
         if vehicle_front(ego, others, lane_map):
diff --git a/demo/tacas2023/exp3/demo6.py b/demo/tacas2023/exp3/demo6.py
index b73c5bda..071a9ee8 100644
--- a/demo/tacas2023/exp3/demo6.py
+++ b/demo/tacas2023/exp3/demo6.py
@@ -71,7 +71,7 @@ if __name__ == "__main__":
     #                        1, 2], 'lines', 'trace', sample_rate=1)
     # fig.show()
 
-    traces = scenario.verify(20, 0.05)
+    traces = scenario.verify(80, 0.1)
     fig = go.Figure()
     fig = reachtube_tree(traces, tmp_map, fig, 1, 2, [1, 2], 'lines', 'trace')
     fig.show()
diff --git a/verse/analysis/analysis_tree.py b/verse/analysis/analysis_tree.py
index 32407900..83dd940f 100644
--- a/verse/analysis/analysis_tree.py
+++ b/verse/analysis/analysis_tree.py
@@ -58,6 +58,8 @@ class AnalysisTreeNode:
         return rst_dict
 
     def get_track(self, agent_id, D):
+        if 'TrackMode' not in self.agent[agent_id].controller.mode_defs:
+            return ""
         for d in D:
             if d in self.agent[agent_id].controller.mode_defs['TrackMode'].modes:
                 return d
@@ -65,6 +67,10 @@ class AnalysisTreeNode:
 
     def get_mode(self, agent_id, D):
         res = []
+        if 'TrackMode' not in self.agent[agent_id].controller.mode_defs:
+            if len(D)==1:
+                return D[0]
+            return D
         for d in D:
             if d not in self.agent[agent_id].controller.mode_defs['TrackMode'].modes:
                 res.append(d)
diff --git a/verse/map/lane_map.py b/verse/map/lane_map.py
index abe532ef..a286fbaa 100644
--- a/verse/map/lane_map.py
+++ b/verse/map/lane_map.py
@@ -104,6 +104,8 @@ class LaneMap:
         return lane.get_lane_width()
 
     def h(self, lane_idx, agent_mode_src, agent_mode_dest):
+        if self.h_dict == {}:
+            return ""
         return self.h_dict[(lane_idx, agent_mode_src, agent_mode_dest)]
 
     def h_exist(self, lane_idx, agent_mode_src, agent_mode_dest):
diff --git a/verse/parser/parser.py b/verse/parser/parser.py
index 60b6ee23..eebcb893 100644
--- a/verse/parser/parser.py
+++ b/verse/parser/parser.py
@@ -623,8 +623,6 @@ def proc(node: ast.AST, env: Env) -> Any:
     elif isinstance(node, ast.Name):# and isinstance(node.ctx, ast.Load):
         return env.lookup(node.id)
     elif isinstance(node, ast.Attribute) and isinstance(node.ctx, ast.Load):
-        if isinstance(node.value, ast.Name) and node.value.id in env.mode_defs:
-            return node.attr
         obj = proc(node.value, env)
         # TODO since we know what the mode and state types contain we can do some typo checking
         if not_ir_ast(obj):
@@ -704,7 +702,16 @@ def proc(node: ast.AST, env: Env) -> Any:
                 if len(node.args) > 1:
                     raise ValueError("too many args to `copy.deepcopy`")
                 return proc(node.args[0], env)
-            return node
+            ret = copy.deepcopy(node)
+            tmp = []
+            for a in ret.args:
+                if isinstance(a, ast.Attribute) and isinstance(a.value, ast.Name) and a.value.id in env.mode_defs:
+                    tmp.append(ast.Constant(a.attr, kind=None))
+                else: 
+                    tmp.append(a)
+            ret.args = tmp
+        
+            return ret
         if isinstance(fun, ast.arg):
             if fun.arg == "copy.deepcopy":
                 raise Exception("unreachable")
-- 
GitLab