diff --git a/pyreason_gym/pyreason_grid_world/graph/game_graph.graphml b/pyreason_gym/pyreason_grid_world/graph/game_graph.graphml
index dcfe857..6798475 100644
--- a/pyreason_gym/pyreason_grid_world/graph/game_graph.graphml
+++ b/pyreason_gym/pyreason_grid_world/graph/game_graph.graphml
@@ -7,12 +7,16 @@
+
+
+
+
@@ -240,6 +244,7 @@
0
1
0,0
+ 1
1
@@ -253,6 +258,7 @@
0
1
0,0
+ 1
1
@@ -262,6 +268,42 @@
1
1
+
+ 1
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 1
+ 0,0
+ 1
+
+
+ 1
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 1
+ 0,0
+ 1
+
+
+ 1
+ 1
+
+
+ 1
+ 1
+
1
@@ -357,6 +399,9 @@
1
+
+ 1
+
1
@@ -964,6 +1009,9 @@
1
+
+ 1
+
1
@@ -1070,5 +1118,23 @@
1
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
diff --git a/pyreason_gym/pyreason_grid_world/pyreason_grid_world.py b/pyreason_gym/pyreason_grid_world/pyreason_grid_world.py
index 3ce1ac0..218e668 100644
--- a/pyreason_gym/pyreason_grid_world/pyreason_grid_world.py
+++ b/pyreason_gym/pyreason_grid_world/pyreason_grid_world.py
@@ -11,14 +11,14 @@ def __init__(self, grid_size, num_agents_per_team):
# Keep track of the next timestep to start
self.next_time = 0
-
+
# Pyreason settings
pr.settings.verbose = False
pr.settings.atom_trace = False
pr.settings.canonical = True
pr.settings.inconsistency_check = False
pr.settings.static_graph_facts = False
- pr.settings.store_interpretation_changes = False
+ # pr.settings.store_interpretation_changes = True
current_path = os.path.abspath(os.path.dirname(__file__))
# Load the graph
@@ -49,20 +49,21 @@ def move(self, action):
fact_off = pr.fact_node.Fact(f'red_action_{i+1}_off', f'red-soldier-{i+1}', pr.label.Label(red_available_actions[a]), pr.interval.closed(0,0), self.next_time+1, self.next_time+1)
facts.append(fact_on)
facts.append(fact_off)
-
+
for i, a in enumerate(blue_team_actions):
if a != 8:
fact_on = pr.fact_node.Fact(f'blue_action_{i+1}', f'blue-soldier-{i+1}', pr.label.Label(blue_available_actions[a]), pr.interval.closed(1,1), self.next_time, self.next_time)
fact_off = pr.fact_node.Fact(f'blue_action_{i+1}_off', f'blue-soldier-{i+1}', pr.label.Label(blue_available_actions[a]), pr.interval.closed(0,0), self.next_time+1, self.next_time+1)
facts.append(fact_on)
facts.append(fact_off)
-
+
self.interpretation = pr.reason(1, again=True, node_facts=facts)
+ # pr.save_rule_trace(self.interpretation)
self.next_time = self.interpretation.time + 1
def get_obs(self):
observation = {'red_team': [], 'blue_team': [], 'red_bullets': [], 'blue_bullets': []}
-
+
# Gather bullet info for red and blue bullets
(red_bullet_positions, blue_bullet_positions), (red_bullet_directions, blue_bullet_directions), (red_killed_who, blue_killed_who) = self._get_bullet_info()
for red_pos, red_dir in zip(red_bullet_positions, red_bullet_directions):
@@ -99,14 +100,14 @@ def get_obs(self):
observation['blue_team'].append({'pos': np.array(blue_pos_coords, dtype=np.int32), 'health': np.array([blue_health], dtype=np.float32), 'killed': list(blue_killed_who[i-1])})
return observation
-
+
def get_obstacle_locations(self):
# Return the coordinates of all the mountains in the grid to be able to draw them
relevant_edges = [edge for edge in self.interpretation.edges if edge[1]=='mountain']
obstacle_positions = [int(edge[0]) for edge in relevant_edges]
obstacle_positions_coords = np.array([[pos%self.grid_size, pos//self.grid_size] for pos in obstacle_positions])
return obstacle_positions_coords
-
+
def get_base_locations(self):
# Return the locations of the two bases
relevant_edges = [edge for edge in self.interpretation.edges if 'base' in edge[0]]
@@ -127,7 +128,8 @@ def _get_bullet_info(self):
positions = (red_bullet_positions_coords, blue_bullet_positions_coords)
# Get info about who killed whom. Stored in the form a list for every agent: (red-killer: [blue-casualties]) or (blue-killer: [red-casualties])
- kill_info_edges = [edge for edge in self.interpretation.edges if pr.label.Label('killed') in self.interpretation.interpretations_edge[edge].world]
+ kill_info_edges = [edge for edge in self.interpretation.edges if pr.label.Label('killed') in self.interpretation.interpretations_edge[edge].world
+ and self.interpretation.interpretations_edge[edge].world[pr.label.Label('killed')] == pr.interval.closed(1, 1)]
kill_info_edges = sorted(kill_info_edges, key=lambda x: int(x[0][-1]))
red_killed_who_tuple = [(int(edge[0][-1]), int(edge[1][-1])) for edge in kill_info_edges if 'red' in edge[0]]
blue_killed_who_tuple = [(int(edge[0][-1]), int(edge[1][-1])) for edge in kill_info_edges if 'blue' in edge[0]]
diff --git a/pyreason_gym/pyreason_grid_world/yamls/rules.yaml b/pyreason_gym/pyreason_grid_world/yamls/rules.yaml
index 5580c7e..adccc8e 100644
--- a/pyreason_gym/pyreason_grid_world/yamls/rules.yaml
+++ b/pyreason_gym/pyreason_grid_world/yamls/rules.yaml
@@ -45,28 +45,26 @@ bullet_hit_just_died_red_rule:
bullet_hit_just_died_off_blue_rule:
target: justDied
target_criteria:
- - [health, 0.1, 1]
+ - [health, 0, 0]
+ - [justDied, 1, 1]
- [teamBlue, 1, 1]
delta_t: 1
- immediate: true
neigh_criteria:
- [edge, [target, loc], atLoc, [1,1]]
- [edge, [loc, bullet], atLoc, [1,1]]
- - [edge, [loc, bullet], life, [0.1, 1]]
- [node, [bullet], teamRed, [1,1]]
ann_fn: [0, 0]
bullet_hit_just_died_off_red_rule:
target: justDied
target_criteria:
- - [health, 0.1, 1]
+ - [health, 0, 0]
+ - [justDied, 1, 1]
- [teamRed, 1, 1]
delta_t: 1
- immediate: true
neigh_criteria:
- [edge, [target, loc], atLoc, [1,1]]
- [edge, [loc, bullet], atLoc, [1,1]]
- - [edge, [loc, bullet], life, [0.1, 1]]
- [node, [bullet], teamBlue, [1,1]]
ann_fn: [0, 0]
@@ -79,7 +77,7 @@ bullet_hit_rule:
immediate: true
neigh_criteria:
ann_fn: [0, 0]
-
+
add_kill_blue_info_rule:
target:
target_criteria:
@@ -108,6 +106,14 @@ add_kill_red_info_rule:
edges: [target, player, killed]
ann_fn: [1, 1]
+remove_kill_info_rule:
+ target: killed
+ target_criteria:
+ - [killed, 1, 1]
+ delta_t: 1
+ neigh_criteria:
+ ann_fn: [0, 0]
+
remove_bullet_after_hit_blue_rule:
target: life
target_criteria:
@@ -122,6 +128,20 @@ remove_bullet_after_hit_blue_rule:
ann_fn: [0, 0]
+# Sometimes a bullet is scheduled to move to a location twice before it has actually moved
+# This prevents the bullet from re-appearing
+remove_bullet_after_hit_blue_rule_2:
+ target: life
+ target_criteria:
+ - [life, 0, 0]
+ delta_t: 1
+ neigh_criteria:
+ - [node, [player], justDied, [1,1]]
+ - [node, [target], teamRed, [1,1]]
+ - [node, [player], teamBlue, [1,1]]
+
+ ann_fn: [0, 0]
+
remove_bullet_after_hit_red_rule:
target: life
target_criteria:
@@ -136,11 +156,28 @@ remove_bullet_after_hit_red_rule:
ann_fn: [0, 0]
+# Sometimes a bullet is scheduled to move to a location twice before it has actually moved
+# This prevents the bullet from re-appearing
+remove_bullet_after_hit_red_rule_2:
+ target: life
+ target_criteria:
+ - [life, 0, 0]
+ delta_t: 1
+ neigh_criteria:
+ - [node, [player], justDied, [1,1]]
+ - [node, [target], teamBlue, [1,1]]
+ - [node, [player], teamRed, [1,1]]
+
+ ann_fn: [0, 0]
+
+
+# Blue-agent-1
# Moving rules
# Move UP
-move_up_rule_1:
+move_up_rule_1_b1:
target:
target_criteria:
+ - [blue-soldier-1, 1, 1]
- [moveUp, 1, 1]
- [health, 0.1, 1]
delta_t: 0
@@ -153,9 +190,10 @@ move_up_rule_1:
edges: [target, newLoc, atLoc]
ann_fn: [0.5,0.5]
-move_up_rule_2:
+move_up_rule_2_b1:
target:
target_criteria:
+ - [blue-soldier-1, 1, 1]
- [moveUp, 1, 1]
- [health, 0.1, 1]
delta_t: 0
@@ -168,34 +206,37 @@ move_up_rule_2:
edges: [newLoc, target, atLoc]
ann_fn: [0.5,0.5]
-move_up_change_prev_rule_1:
+move_up_change_prev_rule_1_b1:
target: atLoc
target_criteria:
- [atLoc, 1, 1]
delta_t: 0
immediate: true
neigh_criteria:
+ - [node, [source], blue-soldier-1, [1,1]]
- [edge, [target, newLoc], up, [1,1]]
- [edge, [source, newLoc], atLoc, [0.5,0.5]]
ann_fn: [0,0]
-move_up_change_prev_rule_2:
+move_up_change_prev_rule_2_b1:
target: atLoc
target_criteria:
- [atLoc, 1, 1]
delta_t: 0
immediate: true
neigh_criteria:
+ - [node, [target], blue-soldier-1, [1,1]]
- [edge, [source, newLoc], up, [1,1]]
- [edge, [newLoc, target], atLoc, [0.5,0.5]]
ann_fn: [0,0]
# Move DOWN
-move_down_rule_1:
+move_down_rule_1_b1:
target:
target_criteria:
+ - [blue-soldier-1, 1, 1]
- [moveDown, 1, 1]
- [health, 0.1, 1]
delta_t: 0
@@ -208,9 +249,10 @@ move_down_rule_1:
edges: [target, newLoc, atLoc]
ann_fn: [0.5,0.5]
-move_down_rule_2:
+move_down_rule_2_b1:
target:
target_criteria:
+ - [blue-soldier-1, 1, 1]
- [moveDown, 1, 1]
- [health, 0.1, 1]
delta_t: 0
@@ -223,34 +265,37 @@ move_down_rule_2:
edges: [newLoc, target, atLoc]
ann_fn: [0.5,0.5]
-move_down_change_prev_rule_1:
+move_down_change_prev_rule_1_b1:
target: atLoc
target_criteria:
- [atLoc, 1, 1]
delta_t: 0
immediate: true
neigh_criteria:
+ - [node, [source], blue-soldier-1, [1,1]]
- [edge, [target, newLoc], down, [1,1]]
- [edge, [source, newLoc], atLoc, [0.5,0.5]]
ann_fn: [0,0]
-move_down_change_prev_rule_2:
+move_down_change_prev_rule_2_b1:
target: atLoc
target_criteria:
- [atLoc, 1, 1]
delta_t: 0
immediate: true
neigh_criteria:
+ - [node, [target], blue-soldier-1, [1,1]]
- [edge, [source, newLoc], down, [1,1]]
- [edge, [newLoc, target], atLoc, [0.5,0.5]]
ann_fn: [0,0]
# Move LEFT
-move_left_rule_1:
+move_left_rule_1_b1:
target:
target_criteria:
+ - [blue-soldier-1, 1, 1]
- [moveLeft, 1, 1]
- [health, 0.1, 1]
delta_t: 0
@@ -263,9 +308,10 @@ move_left_rule_1:
edges: [target, newLoc, atLoc]
ann_fn: [0.5,0.5]
-move_left_rule_2:
+move_left_rule_2_b1:
target:
target_criteria:
+ - [blue-soldier-1, 1, 1]
- [moveLeft, 1, 1]
- [health, 0.1, 1]
delta_t: 0
@@ -278,34 +324,53 @@ move_left_rule_2:
edges: [newLoc, target, atLoc]
ann_fn: [0.5,0.5]
-move_left_change_prev_rule_1:
+move_left_change_prev_rule_1_b1:
target: atLoc
target_criteria:
- [atLoc, 1, 1]
delta_t: 0
immediate: true
neigh_criteria:
+ - [node, [source], blue-soldier-1, [1,1]]
- [edge, [target, newLoc], left, [1,1]]
- [edge, [source, newLoc], atLoc, [0.5,0.5]]
ann_fn: [0,0]
-move_left_change_prev_rule_2:
+move_left_change_prev_rule_2_b1:
target: atLoc
target_criteria:
- [atLoc, 1, 1]
delta_t: 0
immediate: true
neigh_criteria:
+ - [node, [target], blue-soldier-1, [1,1]]
- [edge, [source, newLoc], left, [1,1]]
- [edge, [newLoc, target], atLoc, [0.5,0.5]]
ann_fn: [0,0]
# Move RIGHT
-move_right_rule_1:
+move_right_rule_1_b1:
+ target:
+ target_criteria:
+ - [blue-soldier-1, 1, 1]
+ - [moveRight, 1, 1]
+ - [health, 0.1, 1]
+ delta_t: 0
+ immediate: true
+ neigh_criteria:
+ - [edge, [target, oldLoc], atLoc, [1,1]]
+ - [edge, [oldLoc, newLoc], right, [1,1]]
+ - [node, [newLoc], blocked, [0,0]]
+
+ edges: [target, newLoc, atLoc]
+ ann_fn: [0.5,0.5]
+
+move_right_rule_2_b1:
target:
target_criteria:
+ - [blue-soldier-1, 1, 1]
- [moveRight, 1, 1]
- [health, 0.1, 1]
delta_t: 0
@@ -315,16 +380,716 @@ move_right_rule_1:
- [edge, [oldLoc, newLoc], right, [1,1]]
- [node, [newLoc], blocked, [0,0]]
+ edges: [newLoc, target, atLoc]
+ ann_fn: [0.5,0.5]
+
+move_right_change_prev_rule_1_b1:
+ target: atLoc
+ target_criteria:
+ - [atLoc, 1, 1]
+ delta_t: 0
+ immediate: true
+ neigh_criteria:
+ - [node, [source], blue-soldier-1, [1,1]]
+ - [edge, [target, newLoc], right, [1,1]]
+ - [edge, [source, newLoc], atLoc, [0.5,0.5]]
+
+ ann_fn: [0,0]
+
+move_right_change_prev_rule_2_b1:
+ target: atLoc
+ target_criteria:
+ - [atLoc, 1, 1]
+ delta_t: 0
+ immediate: true
+ neigh_criteria:
+ - [node, [target], blue-soldier-1, [1,1]]
+ - [edge, [source, newLoc], right, [1,1]]
+ - [edge, [newLoc, target], atLoc, [0.5,0.5]]
+
+ ann_fn: [0,0]
+
+# Blue-agent-2
+# Moving rules
+# Move UP
+move_up_rule_1_b2:
+ target:
+ target_criteria:
+ - [blue-soldier-2, 1, 1]
+ - [moveUp, 1, 1]
+ - [health, 0.1, 1]
+ delta_t: 1
+ immediate: true
+ neigh_criteria:
+ - [edge, [target, oldLoc], atLoc, [1,1]]
+ - [edge, [oldLoc, newLoc], up, [1,1]]
+ - [node, [newLoc], blocked, [0,0]]
+
+ edges: [target, newLoc, atLoc]
+ ann_fn: [0.5,0.5]
+
+move_up_rule_2_b2:
+ target:
+ target_criteria:
+ - [blue-soldier-2, 1, 1]
+ - [moveUp, 1, 1]
+ - [health, 0.1, 1]
+ delta_t: 1
+ immediate: true
+ neigh_criteria:
+ - [edge, [target, oldLoc], atLoc, [1,1]]
+ - [edge, [oldLoc, newLoc], up, [1,1]]
+ - [node, [newLoc], blocked, [0,0]]
+
+ edges: [newLoc, target, atLoc]
+ ann_fn: [0.5,0.5]
+
+move_up_change_prev_rule_1_b2:
+ target: atLoc
+ target_criteria:
+ - [atLoc, 1, 1]
+ delta_t: 0
+ immediate: true
+ neigh_criteria:
+ - [node, [source], blue-soldier-2, [1,1]]
+ - [edge, [target, newLoc], up, [1,1]]
+ - [edge, [source, newLoc], atLoc, [0.5,0.5]]
+
+ ann_fn: [0,0]
+
+move_up_change_prev_rule_2_b2:
+ target: atLoc
+ target_criteria:
+ - [atLoc, 1, 1]
+ delta_t: 0
+ immediate: true
+ neigh_criteria:
+ - [node, [target], blue-soldier-2, [1,1]]
+ - [edge, [source, newLoc], up, [1,1]]
+ - [edge, [newLoc, target], atLoc, [0.5,0.5]]
+
+ ann_fn: [0,0]
+
+# Move DOWN
+move_down_rule_1_b2:
+ target:
+ target_criteria:
+ - [blue-soldier-2, 1, 1]
+ - [moveDown, 1, 1]
+ - [health, 0.1, 1]
+ delta_t: 1
+ immediate: true
+ neigh_criteria:
+ - [edge, [target, oldLoc], atLoc, [1,1]]
+ - [edge, [oldLoc, newLoc], down, [1,1]]
+ - [node, [newLoc], blocked, [0,0]]
+
+ edges: [target, newLoc, atLoc]
+ ann_fn: [0.5,0.5]
+
+move_down_rule_2_b2:
+ target:
+ target_criteria:
+ - [blue-soldier-2, 1, 1]
+ - [moveDown, 1, 1]
+ - [health, 0.1, 1]
+ delta_t: 1
+ immediate: true
+ neigh_criteria:
+ - [edge, [target, oldLoc], atLoc, [1,1]]
+ - [edge, [oldLoc, newLoc], down, [1,1]]
+ - [node, [newLoc], blocked, [0,0]]
+
+ edges: [newLoc, target, atLoc]
+ ann_fn: [0.5,0.5]
+
+move_down_change_prev_rule_1_b2:
+ target: atLoc
+ target_criteria:
+ - [atLoc, 1, 1]
+ delta_t: 0
+ immediate: true
+ neigh_criteria:
+ - [node, [source], blue-soldier-2, [1,1]]
+ - [edge, [target, newLoc], down, [1,1]]
+ - [edge, [source, newLoc], atLoc, [0.5,0.5]]
+
+ ann_fn: [0,0]
+
+move_down_change_prev_rule_2_b2:
+ target: atLoc
+ target_criteria:
+ - [atLoc, 1, 1]
+ delta_t: 0
+ immediate: true
+ neigh_criteria:
+ - [node, [target], blue-soldier-2, [1,1]]
+ - [edge, [source, newLoc], down, [1,1]]
+ - [edge, [newLoc, target], atLoc, [0.5,0.5]]
+
+ ann_fn: [0,0]
+
+# Move LEFT
+move_left_rule_1_b2:
+ target:
+ target_criteria:
+ - [blue-soldier-2, 1, 1]
+ - [moveLeft, 1, 1]
+ - [health, 0.1, 1]
+ delta_t: 1
+ immediate: true
+ neigh_criteria:
+ - [edge, [target, oldLoc], atLoc, [1,1]]
+ - [edge, [oldLoc, newLoc], left, [1,1]]
+ - [node, [newLoc], blocked, [0,0]]
+
+ edges: [target, newLoc, atLoc]
+ ann_fn: [0.5,0.5]
+
+move_left_rule_2_b2:
+ target:
+ target_criteria:
+ - [blue-soldier-2, 1, 1]
+ - [moveLeft, 1, 1]
+ - [health, 0.1, 1]
+ delta_t: 1
+ immediate: true
+ neigh_criteria:
+ - [edge, [target, oldLoc], atLoc, [1,1]]
+ - [edge, [oldLoc, newLoc], left, [1,1]]
+ - [node, [newLoc], blocked, [0,0]]
+
+ edges: [newLoc, target, atLoc]
+ ann_fn: [0.5,0.5]
+
+move_left_change_prev_rule_1_b2:
+ target: atLoc
+ target_criteria:
+ - [atLoc, 1, 1]
+ delta_t: 0
+ immediate: true
+ neigh_criteria:
+ - [node, [source], blue-soldier-2, [1,1]]
+ - [edge, [target, newLoc], left, [1,1]]
+ - [edge, [source, newLoc], atLoc, [0.5,0.5]]
+
+ ann_fn: [0,0]
+
+move_left_change_prev_rule_2_b2:
+ target: atLoc
+ target_criteria:
+ - [atLoc, 1, 1]
+ delta_t: 0
+ immediate: true
+ neigh_criteria:
+ - [node, [target], blue-soldier-2, [1,1]]
+ - [edge, [source, newLoc], left, [1,1]]
+ - [edge, [newLoc, target], atLoc, [0.5,0.5]]
+
+ ann_fn: [0,0]
+
+# Move RIGHT
+move_right_rule_1_b2:
+ target:
+ target_criteria:
+ - [blue-soldier-2, 1, 1]
+ - [moveRight, 1, 1]
+ - [health, 0.1, 1]
+ delta_t: 1
+ immediate: true
+ neigh_criteria:
+ - [edge, [target, oldLoc], atLoc, [1,1]]
+ - [edge, [oldLoc, newLoc], right, [1,1]]
+ - [node, [newLoc], blocked, [0,0]]
+
edges: [target, newLoc, atLoc]
ann_fn: [0.5,0.5]
-move_right_rule_2:
+move_right_rule_2_b2:
target:
target_criteria:
+ - [blue-soldier-2, 1, 1]
- [moveRight, 1, 1]
- [health, 0.1, 1]
+ delta_t: 1
+ immediate: true
+ neigh_criteria:
+ - [edge, [target, oldLoc], atLoc, [1,1]]
+ - [edge, [oldLoc, newLoc], right, [1,1]]
+ - [node, [newLoc], blocked, [0,0]]
+
+ edges: [newLoc, target, atLoc]
+ ann_fn: [0.5,0.5]
+
+move_right_change_prev_rule_1_b2:
+ target: atLoc
+ target_criteria:
+ - [atLoc, 1, 1]
delta_t: 0
immediate: true
+ neigh_criteria:
+ - [node, [source], blue-soldier-2, [1,1]]
+ - [edge, [target, newLoc], right, [1,1]]
+ - [edge, [source, newLoc], atLoc, [0.5,0.5]]
+
+ ann_fn: [0,0]
+
+move_right_change_prev_rule_2_b2:
+ target: atLoc
+ target_criteria:
+ - [atLoc, 1, 1]
+ delta_t: 0
+ immediate: true
+ neigh_criteria:
+ - [node, [target], blue-soldier-2, [1,1]]
+ - [edge, [source, newLoc], right, [1,1]]
+ - [edge, [newLoc, target], atLoc, [0.5,0.5]]
+
+ ann_fn: [0,0]
+
+# red-agent-1
+# Moving rules
+# Move UP
+move_up_rule_1_r1:
+ target:
+ target_criteria:
+ - [red-soldier-1, 1, 1]
+ - [moveUp, 1, 1]
+ - [health, 0.1, 1]
+ delta_t: 0
+ immediate: true
+ neigh_criteria:
+ - [edge, [target, oldLoc], atLoc, [1,1]]
+ - [edge, [oldLoc, newLoc], up, [1,1]]
+ - [node, [newLoc], blocked, [0,0]]
+
+ edges: [target, newLoc, atLoc]
+ ann_fn: [0.5,0.5]
+
+move_up_rule_2_r1:
+ target:
+ target_criteria:
+ - [red-soldier-1, 1, 1]
+ - [moveUp, 1, 1]
+ - [health, 0.1, 1]
+ delta_t: 0
+ immediate: true
+ neigh_criteria:
+ - [edge, [target, oldLoc], atLoc, [1,1]]
+ - [edge, [oldLoc, newLoc], up, [1,1]]
+ - [node, [newLoc], blocked, [0,0]]
+
+ edges: [newLoc, target, atLoc]
+ ann_fn: [0.5,0.5]
+
+move_up_change_prev_rule_1_r1:
+ target: atLoc
+ target_criteria:
+ - [atLoc, 1, 1]
+ delta_t: 0
+ immediate: true
+ neigh_criteria:
+ - [node, [source], red-soldier-1, [1,1]]
+ - [edge, [target, newLoc], up, [1,1]]
+ - [edge, [source, newLoc], atLoc, [0.5,0.5]]
+
+ ann_fn: [0,0]
+
+move_up_change_prev_rule_2_r1:
+ target: atLoc
+ target_criteria:
+ - [atLoc, 1, 1]
+ delta_t: 0
+ immediate: true
+ neigh_criteria:
+ - [node, [target], red-soldier-1, [1,1]]
+ - [edge, [source, newLoc], up, [1,1]]
+ - [edge, [newLoc, target], atLoc, [0.5,0.5]]
+
+ ann_fn: [0,0]
+
+# Move DOWN
+move_down_rule_1_r1:
+ target:
+ target_criteria:
+ - [red-soldier-1, 1, 1]
+ - [moveDown, 1, 1]
+ - [health, 0.1, 1]
+ delta_t: 0
+ immediate: true
+ neigh_criteria:
+ - [edge, [target, oldLoc], atLoc, [1,1]]
+ - [edge, [oldLoc, newLoc], down, [1,1]]
+ - [node, [newLoc], blocked, [0,0]]
+
+ edges: [target, newLoc, atLoc]
+ ann_fn: [0.5,0.5]
+
+move_down_rule_2_r1:
+ target:
+ target_criteria:
+ - [red-soldier-1, 1, 1]
+ - [moveDown, 1, 1]
+ - [health, 0.1, 1]
+ delta_t: 0
+ immediate: true
+ neigh_criteria:
+ - [edge, [target, oldLoc], atLoc, [1,1]]
+ - [edge, [oldLoc, newLoc], down, [1,1]]
+ - [node, [newLoc], blocked, [0,0]]
+
+ edges: [newLoc, target, atLoc]
+ ann_fn: [0.5,0.5]
+
+move_down_change_prev_rule_1_r1:
+ target: atLoc
+ target_criteria:
+ - [atLoc, 1, 1]
+ delta_t: 0
+ immediate: true
+ neigh_criteria:
+ - [node, [source], red-soldier-1, [1,1]]
+ - [edge, [target, newLoc], down, [1,1]]
+ - [edge, [source, newLoc], atLoc, [0.5,0.5]]
+
+ ann_fn: [0,0]
+
+move_down_change_prev_rule_2_r1:
+ target: atLoc
+ target_criteria:
+ - [atLoc, 1, 1]
+ delta_t: 0
+ immediate: true
+ neigh_criteria:
+ - [node, [target], red-soldier-1, [1,1]]
+ - [edge, [source, newLoc], down, [1,1]]
+ - [edge, [newLoc, target], atLoc, [0.5,0.5]]
+
+ ann_fn: [0,0]
+
+# Move LEFT
+move_left_rule_1_r1:
+ target:
+ target_criteria:
+ - [red-soldier-1, 1, 1]
+ - [moveLeft, 1, 1]
+ - [health, 0.1, 1]
+ delta_t: 0
+ immediate: true
+ neigh_criteria:
+ - [edge, [target, oldLoc], atLoc, [1,1]]
+ - [edge, [oldLoc, newLoc], left, [1,1]]
+ - [node, [newLoc], blocked, [0,0]]
+
+ edges: [target, newLoc, atLoc]
+ ann_fn: [0.5,0.5]
+
+move_left_rule_2_r1:
+ target:
+ target_criteria:
+ - [red-soldier-1, 1, 1]
+ - [moveLeft, 1, 1]
+ - [health, 0.1, 1]
+ delta_t: 0
+ immediate: true
+ neigh_criteria:
+ - [edge, [target, oldLoc], atLoc, [1,1]]
+ - [edge, [oldLoc, newLoc], left, [1,1]]
+ - [node, [newLoc], blocked, [0,0]]
+
+ edges: [newLoc, target, atLoc]
+ ann_fn: [0.5,0.5]
+
+move_left_change_prev_rule_1_r1:
+ target: atLoc
+ target_criteria:
+ - [atLoc, 1, 1]
+ delta_t: 0
+ immediate: true
+ neigh_criteria:
+ - [node, [source], red-soldier-1, [1,1]]
+ - [edge, [target, newLoc], left, [1,1]]
+ - [edge, [source, newLoc], atLoc, [0.5,0.5]]
+
+ ann_fn: [0,0]
+
+move_left_change_prev_rule_2_r1:
+ target: atLoc
+ target_criteria:
+ - [atLoc, 1, 1]
+ delta_t: 0
+ immediate: true
+ neigh_criteria:
+ - [node, [target], red-soldier-1, [1,1]]
+ - [edge, [source, newLoc], left, [1,1]]
+ - [edge, [newLoc, target], atLoc, [0.5,0.5]]
+
+ ann_fn: [0,0]
+
+# Move RIGHT
+move_right_rule_1_r1:
+ target:
+ target_criteria:
+ - [red-soldier-1, 1, 1]
+ - [moveRight, 1, 1]
+ - [health, 0.1, 1]
+ delta_t: 0
+ immediate: true
+ neigh_criteria:
+ - [edge, [target, oldLoc], atLoc, [1,1]]
+ - [edge, [oldLoc, newLoc], right, [1,1]]
+ - [node, [newLoc], blocked, [0,0]]
+
+ edges: [target, newLoc, atLoc]
+ ann_fn: [0.5,0.5]
+
+move_right_rule_2_r1:
+ target:
+ target_criteria:
+ - [red-soldier-1, 1, 1]
+ - [moveRight, 1, 1]
+ - [health, 0.1, 1]
+ delta_t: 0
+ immediate: true
+ neigh_criteria:
+ - [edge, [target, oldLoc], atLoc, [1,1]]
+ - [edge, [oldLoc, newLoc], right, [1,1]]
+ - [node, [newLoc], blocked, [0,0]]
+
+ edges: [newLoc, target, atLoc]
+ ann_fn: [0.5,0.5]
+
+move_right_change_prev_rule_1_r1:
+ target: atLoc
+ target_criteria:
+ - [atLoc, 1, 1]
+ delta_t: 0
+ immediate: true
+ neigh_criteria:
+ - [node, [source], red-soldier-1, [1,1]]
+ - [edge, [target, newLoc], right, [1,1]]
+ - [edge, [source, newLoc], atLoc, [0.5,0.5]]
+
+ ann_fn: [0,0]
+
+move_right_change_prev_rule_2_r1:
+ target: atLoc
+ target_criteria:
+ - [atLoc, 1, 1]
+ delta_t: 0
+ immediate: true
+ neigh_criteria:
+ - [node, [target], red-soldier-1, [1,1]]
+ - [edge, [source, newLoc], right, [1,1]]
+ - [edge, [newLoc, target], atLoc, [0.5,0.5]]
+
+ ann_fn: [0,0]
+
+
+# red-agent-2
+# Moving rules
+# Move UP
+move_up_rule_1_r2:
+ target:
+ target_criteria:
+ - [red-soldier-2, 1, 1]
+ - [moveUp, 1, 1]
+ - [health, 0.1, 1]
+ delta_t: 1
+ immediate: true
+ neigh_criteria:
+ - [edge, [target, oldLoc], atLoc, [1,1]]
+ - [edge, [oldLoc, newLoc], up, [1,1]]
+ - [node, [newLoc], blocked, [0,0]]
+
+ edges: [target, newLoc, atLoc]
+ ann_fn: [0.5,0.5]
+
+move_up_rule_2_r2:
+ target:
+ target_criteria:
+ - [red-soldier-2, 1, 1]
+ - [moveUp, 1, 1]
+ - [health, 0.1, 1]
+ delta_t: 1
+ immediate: true
+ neigh_criteria:
+ - [edge, [target, oldLoc], atLoc, [1,1]]
+ - [edge, [oldLoc, newLoc], up, [1,1]]
+ - [node, [newLoc], blocked, [0,0]]
+
+ edges: [newLoc, target, atLoc]
+ ann_fn: [0.5,0.5]
+
+move_up_change_prev_rule_1_r2:
+ target: atLoc
+ target_criteria:
+ - [atLoc, 1, 1]
+ delta_t: 0
+ immediate: true
+ neigh_criteria:
+ - [node, [source], red-soldier-2, [1,1]]
+ - [edge, [target, newLoc], up, [1,1]]
+ - [edge, [source, newLoc], atLoc, [0.5,0.5]]
+
+ ann_fn: [0,0]
+
+move_up_change_prev_rule_2_r2:
+ target: atLoc
+ target_criteria:
+ - [atLoc, 1, 1]
+ delta_t: 0
+ immediate: true
+ neigh_criteria:
+ - [node, [target], red-soldier-2, [1,1]]
+ - [edge, [source, newLoc], up, [1,1]]
+ - [edge, [newLoc, target], atLoc, [0.5,0.5]]
+
+ ann_fn: [0,0]
+
+# Move DOWN
+move_down_rule_1_r2:
+ target:
+ target_criteria:
+ - [red-soldier-2, 1, 1]
+ - [moveDown, 1, 1]
+ - [health, 0.1, 1]
+ delta_t: 1
+ immediate: true
+ neigh_criteria:
+ - [edge, [target, oldLoc], atLoc, [1,1]]
+ - [edge, [oldLoc, newLoc], down, [1,1]]
+ - [node, [newLoc], blocked, [0,0]]
+
+ edges: [target, newLoc, atLoc]
+ ann_fn: [0.5,0.5]
+
+move_down_rule_2_r2:
+ target:
+ target_criteria:
+ - [red-soldier-2, 1, 1]
+ - [moveDown, 1, 1]
+ - [health, 0.1, 1]
+ delta_t: 1
+ immediate: true
+ neigh_criteria:
+ - [edge, [target, oldLoc], atLoc, [1,1]]
+ - [edge, [oldLoc, newLoc], down, [1,1]]
+ - [node, [newLoc], blocked, [0,0]]
+
+ edges: [newLoc, target, atLoc]
+ ann_fn: [0.5,0.5]
+
+move_down_change_prev_rule_1_r2:
+ target: atLoc
+ target_criteria:
+ - [atLoc, 1, 1]
+ delta_t: 0
+ immediate: true
+ neigh_criteria:
+ - [node, [source], red-soldier-2, [1,1]]
+ - [edge, [target, newLoc], down, [1,1]]
+ - [edge, [source, newLoc], atLoc, [0.5,0.5]]
+
+ ann_fn: [0,0]
+
+move_down_change_prev_rule_2_r2:
+ target: atLoc
+ target_criteria:
+ - [atLoc, 1, 1]
+ delta_t: 0
+ immediate: true
+ neigh_criteria:
+ - [node, [target], red-soldier-2, [1,1]]
+ - [edge, [source, newLoc], down, [1,1]]
+ - [edge, [newLoc, target], atLoc, [0.5,0.5]]
+
+ ann_fn: [0,0]
+
+# Move LEFT
+move_left_rule_1_r2:
+ target:
+ target_criteria:
+ - [red-soldier-2, 1, 1]
+ - [moveLeft, 1, 1]
+ - [health, 0.1, 1]
+ delta_t: 1
+ immediate: true
+ neigh_criteria:
+ - [edge, [target, oldLoc], atLoc, [1,1]]
+ - [edge, [oldLoc, newLoc], left, [1,1]]
+ - [node, [newLoc], blocked, [0,0]]
+
+ edges: [target, newLoc, atLoc]
+ ann_fn: [0.5,0.5]
+
+move_left_rule_2_r2:
+ target:
+ target_criteria:
+ - [red-soldier-2, 1, 1]
+ - [moveLeft, 1, 1]
+ - [health, 0.1, 1]
+ delta_t: 1
+ immediate: true
+ neigh_criteria:
+ - [edge, [target, oldLoc], atLoc, [1,1]]
+ - [edge, [oldLoc, newLoc], left, [1,1]]
+ - [node, [newLoc], blocked, [0,0]]
+
+ edges: [newLoc, target, atLoc]
+ ann_fn: [0.5,0.5]
+
+move_left_change_prev_rule_1_r2:
+ target: atLoc
+ target_criteria:
+ - [atLoc, 1, 1]
+ delta_t: 0
+ immediate: true
+ neigh_criteria:
+ - [node, [source], red-soldier-2, [1,1]]
+ - [edge, [target, newLoc], left, [1,1]]
+ - [edge, [source, newLoc], atLoc, [0.5,0.5]]
+
+ ann_fn: [0,0]
+
+move_left_change_prev_rule_2_r2:
+ target: atLoc
+ target_criteria:
+ - [atLoc, 1, 1]
+ delta_t: 0
+ immediate: true
+ neigh_criteria:
+ - [node, [target], red-soldier-2, [1,1]]
+ - [edge, [source, newLoc], left, [1,1]]
+ - [edge, [newLoc, target], atLoc, [0.5,0.5]]
+
+ ann_fn: [0,0]
+
+# Move RIGHT
+move_right_rule_1_r2:
+ target:
+ target_criteria:
+ - [red-soldier-2, 1, 1]
+ - [moveRight, 1, 1]
+ - [health, 0.1, 1]
+ delta_t: 1
+ immediate: true
+ neigh_criteria:
+ - [edge, [target, oldLoc], atLoc, [1,1]]
+ - [edge, [oldLoc, newLoc], right, [1,1]]
+ - [node, [newLoc], blocked, [0,0]]
+
+ edges: [target, newLoc, atLoc]
+ ann_fn: [0.5,0.5]
+
+move_right_rule_2_r2:
+ target:
+ target_criteria:
+ - [red-soldier-2, 1, 1]
+ - [moveRight, 1, 1]
+ - [health, 0.1, 1]
+ delta_t: 1
+ immediate: true
neigh_criteria:
- [edge, [target, oldLoc], atLoc, [1,1]]
- [edge, [oldLoc, newLoc], right, [1,1]]
@@ -333,25 +1098,27 @@ move_right_rule_2:
edges: [newLoc, target, atLoc]
ann_fn: [0.5,0.5]
-move_right_change_prev_rule_1:
+move_right_change_prev_rule_1_r2:
target: atLoc
target_criteria:
- [atLoc, 1, 1]
delta_t: 0
immediate: true
neigh_criteria:
+ - [node, [source], red-soldier-2, [1,1]]
- [edge, [target, newLoc], right, [1,1]]
- [edge, [source, newLoc], atLoc, [0.5,0.5]]
ann_fn: [0,0]
-move_right_change_prev_rule_2:
+move_right_change_prev_rule_2_r2:
target: atLoc
target_criteria:
- [atLoc, 1, 1]
delta_t: 0
immediate: true
neigh_criteria:
+ - [node, [target], red-soldier-2, [1,1]]
- [edge, [source, newLoc], right, [1,1]]
- [edge, [newLoc, target], atLoc, [0.5,0.5]]
diff --git a/tests/multi_agent_shoot/gen_graph_test.py b/tests/multi_agent_shoot/gen_graph_test.py
index 893ace2..e22e816 100644
--- a/tests/multi_agent_shoot/gen_graph_test.py
+++ b/tests/multi_agent_shoot/gen_graph_test.py
@@ -72,10 +72,12 @@ def generate_graph(grid_dim, num_agents_per_team, base_loc, start_loc, obstacle_
# =======================================================================
# Initialize players health, action choice and team
for i in range(1, num_agents_per_team + 1):
+ dict1 = {f'red-soldier-{i}': 1}
+ dict2 = {f'blue-soldier-{i}': 1}
g.add_node(f'red-soldier-{i}', health=1, moveUp=0, moveDown=0, moveLeft=0, moveRight=0, shootUpRed=0,
- shootDownRed=0, shootLeftRed=0, shootRightRed=0, teamRed=1, justDied='0,0')
+ shootDownRed=0, shootLeftRed=0, shootRightRed=0, teamRed=1, justDied='0,0', **dict1)
g.add_node(f'blue-soldier-{i}', health=1, moveUp=0, moveDown=0, moveLeft=0, moveRight=0, shootUpBlue=0,
- shootDownBlue=0, shootLeftBlue=0, shootRightBlue=0, teamBlue=1, justDied='0,0')
+ shootDownBlue=0, shootLeftBlue=0, shootRightBlue=0, teamBlue=1, justDied='0,0', **dict2)
# Teams
g.add_edge(f'red-soldier-{i}', 'red-base', team=1)
g.add_edge(f'blue-soldier-{i}', 'blue-base', team=1)
@@ -97,7 +99,7 @@ def generate_graph(grid_dim, num_agents_per_team, base_loc, start_loc, obstacle_
def main():
## Red is first then Blue
- generate_graph(grid_dim=8, num_agents_per_team=2, base_loc=[7, 56], start_loc=[[2,16], [5, 21]],
+ generate_graph(grid_dim=8, num_agents_per_team=2, base_loc=[7, 56], start_loc=[[0,16], [5, 21]],
obstacle_loc=[26, 27, 34, 35, 36, 44])
diff --git a/tests/multi_agent_shoot/test.py b/tests/multi_agent_shoot/test.py
index 171c484..93c8da2 100644
--- a/tests/multi_agent_shoot/test.py
+++ b/tests/multi_agent_shoot/test.py
@@ -7,42 +7,63 @@
action = {
'red_team': [7,7],
- 'blue_team': [1,3]
+ 'blue_team': [6,6]
}
obs = env.step(action)
print(obs)
time.sleep(1)
action = {
- 'red_team': [0,0],
- 'blue_team': [1,0]
+ 'red_team': [2,8],
+ 'blue_team': [1,8]
}
obs = env.step(action)
print(obs)
time.sleep(1)
action = {
- 'red_team': [1,2],
- 'blue_team': [1,0]
+ 'red_team': [2,2],
+ 'blue_team': [6,6]
}
obs = env.step(action)
print(obs)
time.sleep(1)
action = {
- 'red_team': [1,2],
- 'blue_team': [1,0]
+ 'red_team': [2,8],
+ 'blue_team': [1,8]
}
obs = env.step(action)
print(obs)
time.sleep(1)
action = {
'red_team': [2,2],
- 'blue_team': [1,0]
+ 'blue_team': [1,1]
+}
+obs = env.step(action)
+print(obs)
+time.sleep(1)
+action = {
+ 'red_team': [2,8],
+ 'blue_team': [1,8]
+}
+obs = env.step(action)
+print(obs)
+time.sleep(1)
+action = {
+ 'red_team': [2,2],
+ 'blue_team': [1,1]
+}
+obs = env.step(action)
+print(obs)
+time.sleep(1)
+action = {
+ 'red_team': [2,8],
+ 'blue_team': [1,8]
}
obs = env.step(action)
print(obs)
time.sleep(1)
action = {
'red_team': [2,2],
- 'blue_team': [1,0]
+ 'blue_team': [1,1]
}
obs = env.step(action)
print(obs)
diff --git a/tests/non_markov_map/gen_graph_test.py b/tests/non_markov_map/gen_graph_test.py
new file mode 100644
index 0000000..c5860d7
--- /dev/null
+++ b/tests/non_markov_map/gen_graph_test.py
@@ -0,0 +1,107 @@
+import networkx as nx
+
+
+def generate_graph(grid_dim, num_agents_per_team, base_loc, start_loc, obstacle_loc):
+ # Check parameters
+ assert len(base_loc) == 2, 'There are only two bases--supply two locations'
+ assert len(start_loc) == 2, 'There are only two teams--supply lists of start positions for each team in a nested list'
+ assert len(start_loc[0]) == num_agents_per_team and len(start_loc[1]) == num_agents_per_team, 'Supply correct number of start locations'
+
+ g = nx.DiGraph()
+
+ # Game variables
+ game_height = grid_dim
+ game_width = grid_dim
+
+ # =======================================================================
+ # Add a node for each grid location in the game
+ nodes = list(range(0, game_height * game_width))
+ g.add_nodes_from([str(node) for node in nodes], blocked='0,0')
+
+ # =======================================================================
+ # Add edges connecting each of the grid nodes. Add up, down, left, right attributes to correct edges
+ # Right edges
+ for node in g.nodes:
+ if (int(node) + 1) % game_width != 0:
+ g.add_edge(node, str(int(node) + 1), right=1)
+
+ # Left edges
+ for node in g.nodes:
+ if int(node) % game_width != 0:
+ g.add_edge(node, str(int(node) - 1), left=1)
+
+ # Up edges
+ for node in g.nodes:
+ if (int(node) // game_width) + 1 != game_height:
+ g.add_edge(node, str(int(node) + game_width), up=1)
+
+ # Down edges
+ for node in g.nodes:
+ if int(node) // game_width != 0:
+ g.add_edge(node, str(int(node) - game_width), down=1)
+
+ # Add edges between border nodes and end nodes to demarcate the end of the grid world. Bullets will disappear after it crosses this end
+ g.add_node('end', blocked=1)
+ # Bottom border
+ for i in range(game_width):
+ g.add_edge(f'{i}', 'end', down=1)
+ # Top border
+ for i in range(game_width):
+ g.add_edge(f'{i + game_width * (game_height - 1)}', 'end', up=1)
+ # Left border
+ for i in range(game_height):
+ g.add_edge(f'{i * game_width}', 'end', left=1)
+ # Right border
+ for i in range(game_height):
+ g.add_edge(f'{i * game_width + game_width - 1}', 'end', right=1)
+
+ # =======================================================================
+ # Add the bases and connect them to the correct location: bottom right and top left
+ g.add_node('red-base')
+ g.add_node('blue-base')
+ g.add_edge('red-base', str(base_loc[0]), atLoc=1)
+ g.add_edge('blue-base', str(base_loc[1]), atLoc=1)
+
+ # =======================================================================
+ # Add mountains and obstacle attributes
+ mountain_loc = obstacle_loc
+ g.add_node('mountain', isMountain=1)
+ for i in mountain_loc:
+ g.add_edge(str(i), 'mountain', atLoc=1)
+
+ # =======================================================================
+ # Initialize players health, action choice and team
+ for i in range(1, num_agents_per_team + 1):
+ dict1 = {f'red-soldier-{i}': 1}
+ dict2 = {f'blue-soldier-{i}': 1}
+ g.add_node(f'red-soldier-{i}', health=1, moveUp=0, moveDown=0, moveLeft=0, moveRight=0, shootUpRed=0,
+ shootDownRed=0, shootLeftRed=0, shootRightRed=0, teamRed=1, justDied='0,0', **dict1)
+ g.add_node(f'blue-soldier-{i}', health=1, moveUp=0, moveDown=0, moveLeft=0, moveRight=0, shootUpBlue=0,
+ shootDownBlue=0, shootLeftBlue=0, shootRightBlue=0, teamBlue=1, justDied='0,0', **dict2)
+ # Teams
+ g.add_edge(f'red-soldier-{i}', 'red-base', team=1)
+ g.add_edge(f'blue-soldier-{i}', 'blue-base', team=1)
+ # Soldier Start Locations (dual edge)
+ g.add_edge(f'red-soldier-{i}', str(start_loc[0][i - 1]), atLoc=1)
+ g.add_edge(f'blue-soldier-{i}', str(start_loc[1][i - 1]), atLoc=1)
+ g.add_edge(str(start_loc[0][i - 1]), f'red-soldier-{i}', atLoc=1)
+ g.add_edge(str(start_loc[1][i - 1]), f'blue-soldier-{i}', atLoc=1)
+ # Bullets
+ g.add_node(f'red-bullet-{i}', teamRed=1, bullet=1)
+ g.add_node(f'blue-bullet-{i}', teamBlue=1, bullet=1)
+ g.add_edge(f'red-soldier-{i}', f'red-bullet-{i}', bullet=1)
+ g.add_edge(f'blue-soldier-{i}', f'blue-bullet-{i}', bullet=1)
+
+ # =======================================================================
+
+ nx.write_graphml_lxml(g, 'pyreason_gym/pyreason_grid_world/graph/game_graph.graphml', named_key_ids=True)
+
+
+def main():
+ ## Red is first then Blue
+ generate_graph(grid_dim=8, num_agents_per_team=2, base_loc=[7, 56], start_loc=[[7,7], [56, 56]],
+ obstacle_loc=[26, 27, 34, 35, 36, 44])
+
+
+if __name__ == '__main__':
+ main()
diff --git a/tests/non_markov_test/gen_graph_test.py b/tests/non_markov_test/gen_graph_test.py
new file mode 100644
index 0000000..7e2b699
--- /dev/null
+++ b/tests/non_markov_test/gen_graph_test.py
@@ -0,0 +1,107 @@
+import networkx as nx
+
+
+def generate_graph(grid_dim, num_agents_per_team, base_loc, start_loc, obstacle_loc):
+ # Check parameters
+ assert len(base_loc) == 2, 'There are only two bases--supply two locations'
+ assert len(start_loc) == 2, 'There are only two teams--supply lists of start positions for each team in a nested list'
+ assert len(start_loc[0]) == num_agents_per_team and len(start_loc[1]) == num_agents_per_team, 'Supply correct number of start locations'
+
+ g = nx.DiGraph()
+
+ # Game variables
+ game_height = grid_dim
+ game_width = grid_dim
+
+ # =======================================================================
+ # Add a node for each grid location in the game
+ nodes = list(range(0, game_height * game_width))
+ g.add_nodes_from([str(node) for node in nodes], blocked='0,0')
+
+ # =======================================================================
+ # Add edges connecting each of the grid nodes. Add up, down, left, right attributes to correct edges
+ # Right edges
+ for node in g.nodes:
+ if (int(node) + 1) % game_width != 0:
+ g.add_edge(node, str(int(node) + 1), right=1)
+
+ # Left edges
+ for node in g.nodes:
+ if int(node) % game_width != 0:
+ g.add_edge(node, str(int(node) - 1), left=1)
+
+ # Up edges
+ for node in g.nodes:
+ if (int(node) // game_width) + 1 != game_height:
+ g.add_edge(node, str(int(node) + game_width), up=1)
+
+ # Down edges
+ for node in g.nodes:
+ if int(node) // game_width != 0:
+ g.add_edge(node, str(int(node) - game_width), down=1)
+
+ # Add edges between border nodes and end nodes to demarcate the end of the grid world. Bullets will disappear after it crosses this end
+ g.add_node('end', blocked=1)
+ # Bottom border
+ for i in range(game_width):
+ g.add_edge(f'{i}', 'end', down=1)
+ # Top border
+ for i in range(game_width):
+ g.add_edge(f'{i + game_width * (game_height - 1)}', 'end', up=1)
+ # Left border
+ for i in range(game_height):
+ g.add_edge(f'{i * game_width}', 'end', left=1)
+ # Right border
+ for i in range(game_height):
+ g.add_edge(f'{i * game_width + game_width - 1}', 'end', right=1)
+
+ # =======================================================================
+ # Add the bases and connect them to the correct location: bottom right and top left
+ g.add_node('red-base')
+ g.add_node('blue-base')
+ g.add_edge('red-base', str(base_loc[0]), atLoc=1)
+ g.add_edge('blue-base', str(base_loc[1]), atLoc=1)
+
+ # =======================================================================
+ # Add mountains and obstacle attributes
+ mountain_loc = obstacle_loc
+ g.add_node('mountain', isMountain=1)
+ for i in mountain_loc:
+ g.add_edge(str(i), 'mountain', atLoc=1)
+
+ # =======================================================================
+ # Initialize players health, action choice and team
+ for i in range(1, num_agents_per_team + 1):
+ dict1 = {f'red-soldier-{i}': 1}
+ dict2 = {f'blue-soldier-{i}': 1}
+ g.add_node(f'red-soldier-{i}', health=1, moveUp=0, moveDown=0, moveLeft=0, moveRight=0, shootUpRed=0,
+ shootDownRed=0, shootLeftRed=0, shootRightRed=0, teamRed=1, justDied='0,0', **dict1)
+ g.add_node(f'blue-soldier-{i}', health=1, moveUp=0, moveDown=0, moveLeft=0, moveRight=0, shootUpBlue=0,
+ shootDownBlue=0, shootLeftBlue=0, shootRightBlue=0, teamBlue=1, justDied='0,0', **dict2)
+ # Teams
+ g.add_edge(f'red-soldier-{i}', 'red-base', team=1)
+ g.add_edge(f'blue-soldier-{i}', 'blue-base', team=1)
+ # Soldier Start Locations (dual edge)
+ g.add_edge(f'red-soldier-{i}', str(start_loc[0][i - 1]), atLoc=1)
+ g.add_edge(f'blue-soldier-{i}', str(start_loc[1][i - 1]), atLoc=1)
+ g.add_edge(str(start_loc[0][i - 1]), f'red-soldier-{i}', atLoc=1)
+ g.add_edge(str(start_loc[1][i - 1]), f'blue-soldier-{i}', atLoc=1)
+ # Bullets
+ g.add_node(f'red-bullet-{i}', teamRed=1, bullet=1)
+ g.add_node(f'blue-bullet-{i}', teamBlue=1, bullet=1)
+ g.add_edge(f'red-soldier-{i}', f'red-bullet-{i}', bullet=1)
+ g.add_edge(f'blue-soldier-{i}', f'blue-bullet-{i}', bullet=1)
+
+ # =======================================================================
+
+ nx.write_graphml_lxml(g, 'pyreason_gym/pyreason_grid_world/graph/game_graph.graphml', named_key_ids=True)
+
+
+def main():
+ ## Red is first then Blue
+ generate_graph(grid_dim=8, num_agents_per_team=2, base_loc=[7, 56], start_loc=[[48,56], [55, 63]],
+ obstacle_loc=[26, 27, 34, 35, 36, 44])
+
+
+if __name__ == '__main__':
+ main()
diff --git a/tests/non_markov_test/test.py b/tests/non_markov_test/test.py
new file mode 100644
index 0000000..6cffbfe
--- /dev/null
+++ b/tests/non_markov_test/test.py
@@ -0,0 +1,38 @@
+import pyreason_gym
+import gym
+import time
+
+env = gym.make('PyReasonGridWorld-v0', render_mode='human', num_agents_per_team=2)
+obs = env.reset()
+print("\n")
+print("Starting Experiment with init obs:")
+print(obs)
+print("\n")
+action = {
+ 'red_team': [7, 7],
+ 'blue_team': [2, 2]
+ }
+obs = env.step(action)
+print(obs)
+print("\n")
+time.sleep(1)
+for ss in range(6):
+ print("Step", ss)
+ if ss % 2 == 0:
+ print("Taking both actions")
+ action = {
+ 'red_team': [2, 2],
+ 'blue_team': [2, 2]
+ }
+ else:
+ print("Taking first agent actions")
+ action = {
+ 'red_team': [2,2],
+ 'blue_team': [8,2]
+ }
+ obs = env.step(action)
+ print(obs)
+ print("\n")
+ time.sleep(1)
+
+env.close()
\ No newline at end of file
diff --git a/tests/same_location_shoot_all_dir/test.py b/tests/same_location_shoot_all_dir/test.py
index e6dacad..1215b20 100644
--- a/tests/same_location_shoot_all_dir/test.py
+++ b/tests/same_location_shoot_all_dir/test.py
@@ -2,7 +2,7 @@
import gym
import time
-env = gym.make('PyReasonGridWorld-v0', render_mode='human')
+env = gym.make('PyReasonGridWorld-v0', render_mode='human', num_agents_per_team=1)
obs = env.reset()
action = {
'red_team': [3],
@@ -39,11 +39,4 @@
obs = env.step(action)
print(obs)
time.sleep(1)
-action = {
- 'red_team': [2],
- 'blue_team': [1]
-}
-obs = env.step(action)
-print(obs)
-time.sleep(1)
env.close()
\ No newline at end of file