Skip to content

Commit b4287b2

Browse files
authored
update act! for all envs & some bug fixes (#176)
* update navigation for SingleRoom envs * update act! for Catcher * update act! for CollectGems envs * update act! for DoorKey envs * update act! for DynamicObstacles envs * update act! for GoToTarget envs * update act! for GridRooms envs * update act! for Maze envs * update act! for SequentialRooms envs * update act! for Snake * update act! for Sokoban envs * update act! for Transport envs * remove old implementation of move methods
1 parent e630024 commit b4287b2

24 files changed

+308
-305
lines changed

src/envs/catcher.jl

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -69,39 +69,41 @@ function GW.reset!(env::Catcher)
6969
end
7070

7171
function GW.act!(env::Catcher, action)
72+
@assert action in Base.OneTo(NUM_ACTIONS) "Invalid action $(action). Action must be in Base.OneTo($(NUM_ACTIONS))"
73+
7274
tile_map = env.tile_map
7375
rng = env.rng
7476
_, height, width = size(tile_map)
77+
agent_position = env.agent_position
78+
gem_position = env.gem_position
7579

7680
if action == 1
77-
if env.agent_position[2] == 1
78-
new_agent_position = env.agent_position
81+
if agent_position[2] == 1
82+
new_agent_position = agent_position
7983
else
80-
new_agent_position = CartesianIndex(GW.move_left(env.agent_position.I...))
84+
new_agent_position = GW.move_left(agent_position)
8185
end
8286
elseif action == 2
83-
if env.agent_position[2] == width
84-
new_agent_position = env.agent_position
87+
if agent_position[2] == width
88+
new_agent_position = agent_position
8589
else
86-
new_agent_position = CartesianIndex(GW.move_right(env.agent_position.I...))
90+
new_agent_position = GW.move_right(agent_position)
8791
end
88-
elseif action == 3
89-
new_agent_position = env.agent_position
9092
else
91-
error("Invalid action $(action)")
93+
new_agent_position = agent_position
9294
end
9395

94-
tile_map[AGENT, env.agent_position] = false
96+
tile_map[AGENT, agent_position] = false
9597
env.agent_position = new_agent_position
9698
tile_map[AGENT, new_agent_position] = true
9799

98-
if env.gem_position[1] == height
100+
if gem_position[1] == height
99101
new_gem_position = CartesianIndex(1, rand(rng, 1 : width))
100102
else
101-
new_gem_position = CartesianIndex(GW.move_down(env.gem_position.I...))
103+
new_gem_position = GW.move_down(gem_position)
102104
end
103105

104-
tile_map[GEM, env.gem_position] = false
106+
tile_map[GEM, gem_position] = false
105107
env.gem_position = new_gem_position
106108
tile_map[GEM, new_gem_position] = true
107109

src/envs/collect_gems_directed.jl

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -35,31 +35,29 @@ function GW.reset!(env::CollectGemsDirected)
3535
end
3636

3737
function GW.act!(env::CollectGemsDirected, action)
38+
@assert action in Base.OneTo(NUM_ACTIONS) "Invalid action $(action). Action must be in Base.OneTo($(NUM_ACTIONS))"
39+
3840
inner_env = env.env
3941
tile_map = inner_env.tile_map
42+
agent_position = inner_env.agent_position
43+
agent_direction = env.agent_direction
4044

41-
if action == 1
42-
agent_position = inner_env.agent_position
43-
agent_direction = env.agent_direction
44-
new_agent_position = CartesianIndex(GW.move_forward(agent_direction, agent_position.I...))
45-
if !tile_map[WALL, new_agent_position]
46-
tile_map[AGENT, agent_position] = false
47-
inner_env.agent_position = new_agent_position
48-
tile_map[AGENT, new_agent_position] = true
45+
if action in Base.OneTo(2)
46+
if action == 1
47+
new_agent_position = GW.move_forward(agent_position, agent_direction)
48+
else
49+
new_agent_position = GW.move_backward(agent_position, agent_direction)
4950
end
50-
elseif action == 2
51-
agent_position = inner_env.agent_position
52-
agent_direction = env.agent_direction
53-
new_agent_position = CartesianIndex(GW.move_backward(agent_direction, agent_position.I...))
51+
5452
if !tile_map[WALL, new_agent_position]
5553
tile_map[AGENT, agent_position] = false
5654
inner_env.agent_position = new_agent_position
5755
tile_map[AGENT, new_agent_position] = true
5856
end
5957
elseif action == 3
60-
env.agent_direction = GW.turn_left(env.agent_direction)
61-
elseif action == 4
62-
env.agent_direction = GW.turn_right(env.agent_direction)
58+
env.agent_direction = GW.turn_left(agent_direction)
59+
else
60+
env.agent_direction = GW.turn_right(agent_direction)
6361
end
6462

6563
inner_env.reward = zero(inner_env.reward)

src/envs/collect_gems_multi_agent_undirected.jl

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ function GW.reset!(env::CollectGemsMultiAgentUndirected)
9797
end
9898

9999
function GW.act!(env::CollectGemsMultiAgentUndirected, action)
100-
@assert action in Base.OneTo(NUM_ACTIONS) "Invalid action $(action)"
100+
@assert action in Base.OneTo(NUM_ACTIONS) "Invalid action $(action). Action must be in Base.OneTo($(NUM_ACTIONS))"
101101

102102
tile_map = env.tile_map
103103
agent_positions = env.agent_positions
@@ -109,13 +109,13 @@ function GW.act!(env::CollectGemsMultiAgentUndirected, action)
109109
GEM = num_agents + 2
110110

111111
if action == 1
112-
new_agent_position = CartesianIndex(GW.move_up(agent_position.I...))
112+
new_agent_position = GW.move_up(agent_position)
113113
elseif action == 2
114-
new_agent_position = CartesianIndex(GW.move_down(agent_position.I...))
114+
new_agent_position = GW.move_down(agent_position)
115115
elseif action == 3
116-
new_agent_position = CartesianIndex(GW.move_left(agent_position.I...))
116+
new_agent_position = GW.move_left(agent_position)
117117
else
118-
new_agent_position = CartesianIndex(GW.move_right(agent_position.I...))
118+
new_agent_position = GW.move_right(agent_position)
119119
end
120120

121121
if !any(@view tile_map[1 : num_agents + 1, new_agent_position]) # assuming WALL = num_agents + 1

src/envs/collect_gems_undirected.jl

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -85,20 +85,23 @@ function GW.reset!(env::CollectGemsUndirected)
8585
end
8686

8787
function GW.act!(env::CollectGemsUndirected, action)
88+
@assert action in Base.OneTo(NUM_ACTIONS) "Invalid action $(action). Action must be in Base.OneTo($(NUM_ACTIONS))"
89+
8890
tile_map = env.tile_map
91+
agent_position = env.agent_position
8992

9093
if action == 1
91-
new_agent_position = CartesianIndex(GW.move_up(env.agent_position.I...))
94+
new_agent_position = GW.move_up(agent_position)
9295
elseif action == 2
93-
new_agent_position = CartesianIndex(GW.move_down(env.agent_position.I...))
96+
new_agent_position = GW.move_down(agent_position)
9497
elseif action == 3
95-
new_agent_position = CartesianIndex(GW.move_left(env.agent_position.I...))
96-
elseif action == 4
97-
new_agent_position = CartesianIndex(GW.move_right(env.agent_position.I...))
98+
new_agent_position = GW.move_left(agent_position)
99+
else
100+
new_agent_position = GW.move_right(agent_position)
98101
end
99102

100103
if !tile_map[WALL, new_agent_position]
101-
tile_map[AGENT, env.agent_position] = false
104+
tile_map[AGENT, agent_position] = false
102105
env.agent_position = new_agent_position
103106
tile_map[AGENT, new_agent_position] = true
104107
end

src/envs/door_key_directed.jl

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -37,35 +37,33 @@ function GW.reset!(env::DoorKeyDirected)
3737
end
3838

3939
function GW.act!(env::DoorKeyDirected, action)
40+
@assert action in Base.OneTo(NUM_ACTIONS) "Invalid action $(action). Action must be in Base.OneTo($(NUM_ACTIONS))"
41+
4042
inner_env = env.env
4143
tile_map = inner_env.tile_map
44+
agent_position = inner_env.agent_position
45+
agent_direction = env.agent_direction
4246

43-
if action == 1
44-
agent_position = inner_env.agent_position
45-
agent_direction = env.agent_direction
46-
new_agent_position = CartesianIndex(GW.move_forward(agent_direction, agent_position.I...))
47-
if !(tile_map[DOOR, new_agent_position] || tile_map[WALL, new_agent_position]) || (tile_map[DOOR, new_agent_position] && inner_env.has_key)
48-
tile_map[AGENT, agent_position] = false
49-
inner_env.agent_position = new_agent_position
50-
tile_map[AGENT, new_agent_position] = true
47+
if action in Base.OneTo(2)
48+
if action == 1
49+
new_agent_position = GW.move_forward(agent_position, agent_direction)
50+
else
51+
new_agent_position = GW.move_backward(agent_position, agent_direction)
5152
end
52-
elseif action == 2
53-
agent_position = inner_env.agent_position
54-
agent_direction = env.agent_direction
55-
new_agent_position = CartesianIndex(GW.move_backward(agent_direction, agent_position.I...))
53+
5654
if !(tile_map[DOOR, new_agent_position] || tile_map[WALL, new_agent_position]) || (tile_map[DOOR, new_agent_position] && inner_env.has_key)
5755
tile_map[AGENT, agent_position] = false
5856
inner_env.agent_position = new_agent_position
5957
tile_map[AGENT, new_agent_position] = true
6058
end
6159
elseif action == 3
62-
env.agent_direction = GW.turn_left(env.agent_direction)
60+
env.agent_direction = GW.turn_left(agent_direction)
6361
elseif action == 4
64-
env.agent_direction = GW.turn_right(env.agent_direction)
62+
env.agent_direction = GW.turn_right(agent_direction)
6563
else
66-
if tile_map[KEY, inner_env.agent_position]
64+
if tile_map[KEY, agent_position]
6765
inner_env.has_key = true
68-
tile_map[KEY, inner_env.agent_position] = false
66+
tile_map[KEY, agent_position] = false
6967
end
7068
end
7169

src/envs/door_key_undirected.jl

Lines changed: 16 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -128,40 +128,31 @@ function GW.reset!(env::DoorKeyUndirected)
128128
end
129129

130130
function GW.act!(env::DoorKeyUndirected, action)
131+
@assert action in Base.OneTo(NUM_ACTIONS) "Invalid action $(action). Action must be in Base.OneTo($(NUM_ACTIONS))"
132+
131133
tile_map = env.tile_map
134+
agent_position = env.agent_position
132135

133-
if action == 1
134-
new_agent_position = CartesianIndex(GW.move_up(env.agent_position.I...))
135-
if !(tile_map[DOOR, new_agent_position] || tile_map[WALL, new_agent_position]) || (tile_map[DOOR, new_agent_position] && env.has_key)
136-
tile_map[AGENT, env.agent_position] = false
137-
env.agent_position = new_agent_position
138-
tile_map[AGENT, new_agent_position] = true
139-
end
140-
elseif action == 2
141-
new_agent_position = CartesianIndex(GW.move_down(env.agent_position.I...))
142-
if !(tile_map[DOOR, new_agent_position] || tile_map[WALL, new_agent_position]) || (tile_map[DOOR, new_agent_position] && env.has_key)
143-
tile_map[AGENT, env.agent_position] = false
144-
env.agent_position = new_agent_position
145-
tile_map[AGENT, new_agent_position] = true
136+
if action in Base.OneTo(4)
137+
if action == 1
138+
new_agent_position = GW.move_up(agent_position)
139+
elseif action == 2
140+
new_agent_position = GW.move_down(agent_position)
141+
elseif action == 3
142+
new_agent_position = GW.move_left(agent_position)
143+
else
144+
new_agent_position = GW.move_right(agent_position)
146145
end
147-
elseif action == 3
148-
new_agent_position = CartesianIndex(GW.move_left(env.agent_position.I...))
149-
if !(tile_map[DOOR, new_agent_position] || tile_map[WALL, new_agent_position]) || (tile_map[DOOR, new_agent_position] && env.has_key)
150-
tile_map[AGENT, env.agent_position] = false
151-
env.agent_position = new_agent_position
152-
tile_map[AGENT, new_agent_position] = true
153-
end
154-
elseif action == 4
155-
new_agent_position = CartesianIndex(GW.move_right(env.agent_position.I...))
146+
156147
if !(tile_map[DOOR, new_agent_position] || tile_map[WALL, new_agent_position]) || (tile_map[DOOR, new_agent_position] && env.has_key)
157-
tile_map[AGENT, env.agent_position] = false
148+
tile_map[AGENT, agent_position] = false
158149
env.agent_position = new_agent_position
159150
tile_map[AGENT, new_agent_position] = true
160151
end
161152
else
162-
if tile_map[KEY, env.agent_position]
153+
if tile_map[KEY, agent_position]
163154
env.has_key = true
164-
tile_map[KEY, env.agent_position] = false
155+
tile_map[KEY, agent_position] = false
165156
end
166157
end
167158

src/envs/dynamic_obstacles_directed.jl

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -36,32 +36,31 @@ function GW.reset!(env::DynamicObstaclesDirected)
3636
end
3737

3838
function GW.act!(env::DynamicObstaclesDirected, action)
39+
@assert action in Base.OneTo(NUM_ACTIONS) "Invalid action $(action). Action must be in Base.OneTo($(NUM_ACTIONS))"
40+
3941
inner_env = env.env
4042
tile_map = inner_env.tile_map
4143
DOUM.update_obstacles!(inner_env)
4244

43-
if action == 1
44-
agent_position = inner_env.agent_position
45-
agent_direction = env.agent_direction
46-
new_agent_position = CartesianIndex(GW.move_forward(agent_direction, agent_position.I...))
47-
if !tile_map[WALL, new_agent_position]
48-
tile_map[AGENT, agent_position] = false
49-
inner_env.agent_position = new_agent_position
50-
tile_map[AGENT, new_agent_position] = true
45+
agent_position = inner_env.agent_position
46+
agent_direction = env.agent_direction
47+
48+
if action in Base.OneTo(2)
49+
if action == 1
50+
new_agent_position = GW.move_forward(agent_position, agent_direction)
51+
else
52+
new_agent_position = GW.move_backward(agent_position, agent_direction)
5153
end
52-
elseif action == 2
53-
agent_position = inner_env.agent_position
54-
agent_direction = env.agent_direction
55-
new_agent_position = CartesianIndex(GW.move_backward(agent_direction, agent_position.I...))
54+
5655
if !tile_map[WALL, new_agent_position]
5756
tile_map[AGENT, agent_position] = false
5857
inner_env.agent_position = new_agent_position
5958
tile_map[AGENT, new_agent_position] = true
6059
end
6160
elseif action == 3
62-
env.agent_direction = GW.turn_left(env.agent_direction)
63-
elseif action == 4
64-
env.agent_direction = GW.turn_right(env.agent_direction)
61+
env.agent_direction = GW.turn_left(agent_direction)
62+
else
63+
env.agent_direction = GW.turn_right(agent_direction)
6564
end
6665

6766
if tile_map[GOAL, inner_env.agent_position]

src/envs/dynamic_obstacles_undirected.jl

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -93,21 +93,25 @@ function GW.reset!(env::DynamicObstaclesUndirected)
9393
end
9494

9595
function GW.act!(env::DynamicObstaclesUndirected, action)
96+
@assert action in Base.OneTo(NUM_ACTIONS) "Invalid action $(action). Action must be in Base.OneTo($(NUM_ACTIONS))"
97+
9698
tile_map = env.tile_map
9799
update_obstacles!(env)
98100

101+
agent_position = env.agent_position
102+
99103
if action == 1
100-
new_agent_position = CartesianIndex(GW.move_up(env.agent_position.I...))
104+
new_agent_position = GW.move_up(agent_position)
101105
elseif action == 2
102-
new_agent_position = CartesianIndex(GW.move_down(env.agent_position.I...))
106+
new_agent_position = GW.move_down(agent_position)
103107
elseif action == 3
104-
new_agent_position = CartesianIndex(GW.move_left(env.agent_position.I...))
105-
elseif action == 4
106-
new_agent_position = CartesianIndex(GW.move_right(env.agent_position.I...))
108+
new_agent_position = GW.move_left(agent_position)
109+
else
110+
new_agent_position = GW.move_right(agent_position)
107111
end
108112

109113
if !tile_map[WALL, new_agent_position]
110-
tile_map[AGENT, env.agent_position] = false
114+
tile_map[AGENT, agent_position] = false
111115
env.agent_position = new_agent_position
112116
tile_map[AGENT, new_agent_position] = true
113117
end

src/envs/go_to_target_directed.jl

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -36,31 +36,29 @@ function GW.reset!(env::GoToTargetDirected)
3636
end
3737

3838
function GW.act!(env::GoToTargetDirected, action)
39+
@assert action in Base.OneTo(NUM_ACTIONS) "Invalid action $(action). Action must be in Base.OneTo($(NUM_ACTIONS))"
40+
3941
inner_env = env.env
4042
tile_map = inner_env.tile_map
43+
agent_position = inner_env.agent_position
44+
agent_direction = env.agent_direction
4145

42-
if action == 1
43-
agent_position = inner_env.agent_position
44-
agent_direction = env.agent_direction
45-
new_agent_position = CartesianIndex(GW.move_forward(agent_direction, agent_position.I...))
46-
if !tile_map[WALL, new_agent_position]
47-
tile_map[AGENT, agent_position] = false
48-
inner_env.agent_position = new_agent_position
49-
tile_map[AGENT, new_agent_position] = true
46+
if action in Base.OneTo(2)
47+
if action == 1
48+
new_agent_position = GW.move_forward(agent_position, agent_direction)
49+
else
50+
new_agent_position = GW.move_backward(agent_position, agent_direction)
5051
end
51-
elseif action == 2
52-
agent_position = inner_env.agent_position
53-
agent_direction = env.agent_direction
54-
new_agent_position = CartesianIndex(GW.move_backward(agent_direction, agent_position.I...))
52+
5553
if !tile_map[WALL, new_agent_position]
5654
tile_map[AGENT, agent_position] = false
5755
inner_env.agent_position = new_agent_position
5856
tile_map[AGENT, new_agent_position] = true
5957
end
6058
elseif action == 3
61-
env.agent_direction = GW.turn_left(env.agent_direction)
62-
elseif action == 4
63-
env.agent_direction = GW.turn_right(env.agent_direction)
59+
env.agent_direction = GW.turn_left(agent_direction)
60+
else
61+
env.agent_direction = GW.turn_right(agent_direction)
6462
end
6563

6664
agent_position = inner_env.agent_position

0 commit comments

Comments
 (0)