Skip to content

Commit bb508bd

Browse files
authored
Make SemiCompactObsevations be the only option (Metta-AI#256)
Some months ago we added SemiCompactObservations, where layers would be determined by property_name, versus (type_id, property_name). We've been using this as the default for a while, so now we're going to go ahead and remove the competition, and steal its name. No unit tests for this, since its cython. We should add some once that's addressed. Tested by building and training locally.
1 parent 7becc1c commit bb508bd

File tree

10 files changed

+13
-58
lines changed

10 files changed

+13
-58
lines changed

configs/env/mettagrid/mettagrid.yaml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ _target_: mettagrid.mettagrid_env.MettaGridEnv
33

44
report_stats_interval: 100
55
normalize_rewards: false
6-
semi_compact_obs: true
76
track_last_action: false
87

98
sampling: 0

configs/env/mettagrid/puffer.yaml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ _target_: mettagrid.mettagrid_env.MettaGridEnv
33

44
report_stats_interval: 100
55
normalize_rewards: false
6-
semi_compact_obs: true
76
track_last_action: false
87

98
sampling: 0

configs/user/sasmith.yaml

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,6 @@ wandb:
3333
track: true
3434

3535
env:
36-
# clean this up
37-
semi_compact_obs: true
3836
game:
3937
max_steps: 2000
4038

deps/mettagrid/configs/benchmark.yaml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
# This is a modified `sample.yaml` config with sampling removed, for benchmark_env_perf.py script.
22
report_stats_interval: 100
33
normalize_rewards: false
4-
semi_compact_obs: true
54
track_last_action: false
65

76
sampling: 0

deps/mettagrid/configs/show_map.yaml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
# This config is used by `tools.map.view` script.
22
report_stats_interval: 100
33
normalize_rewards: false
4-
semi_compact_obs: true
54
track_last_action: false
65

76
game:

deps/mettagrid/configs/test_basic.yaml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
_target_: mettagrid.mettagrid_env.MettaGridEnv
22

33
normalize_rewards: false
4-
semi_compact_obs: true
54
track_last_action: false
65

76
sampling: 0

deps/mettagrid/mettagrid/grid_env.pyx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -318,7 +318,6 @@ cdef class GridEnv:
318318

319319
@property
320320
def observation_space(self):
321-
space = self._obs_encoder.observation_space()
322321
return gym.spaces.Box(
323322
0,
324323
255,

deps/mettagrid/mettagrid/mettagrid.pyx

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,7 @@ from mettagrid.grid_env cimport GridEnv
1616
from mettagrid.grid_object cimport GridObject
1717
from mettagrid.observation_encoder cimport (
1818
ObsType,
19-
ObservationEncoder,
20-
SemiCompactObservationEncoder
19+
ObservationEncoder
2120
)
2221

2322
# Object imports
@@ -51,8 +50,6 @@ cdef class MettaGrid(GridEnv):
5150
self._cfg = cfg
5251

5352
obs_encoder = ObservationEncoder()
54-
if env_cfg.semi_compact_obs:
55-
obs_encoder = SemiCompactObservationEncoder()
5653
cdef vector[ActionHandler*] actions
5754
if cfg.actions.put_items.enabled:
5855
actions.push_back(new PutRecipeItems(cfg.actions.put_items))
@@ -167,7 +164,7 @@ cdef class MettaGrid(GridEnv):
167164

168165
cpdef grid_objects(self):
169166
cdef GridObject *obj
170-
cdef ObsType[:] obj_data = np.zeros(len(self.grid_features()), dtype=self._obs_encoder.obs_np_type())
167+
cdef ObsType[:] obj_data = np.zeros(len(self.grid_features()), dtype=np.uint8)
171168
cdef unsigned int obj_id, i
172169
cdef ObservationEncoder obs_encoder = self._obs_encoder
173170
cdef vector[unsigned int] offsets

deps/mettagrid/mettagrid/observation_encoder.pxd

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,4 @@ cdef class ObservationEncoder:
1414
cdef encode(self, GridObject *obj, ObsType[:] obs)
1515
cdef _encode(self, GridObject *obj, ObsType[:] obs, vector[unsigned int] offsets)
1616
cdef vector[string] feature_names(self)
17-
cpdef observation_space(self)
18-
cpdef obs_np_type(self)
19-
20-
cdef class SemiCompactObservationEncoder(ObservationEncoder):
21-
pass
2217

Lines changed: 11 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,3 @@
1-
import numpy as np
2-
import gymnasium as gym
3-
41
from libcpp.string cimport string
52
from libcpp.vector cimport vector
63
from libcpp.map cimport map
@@ -14,17 +11,13 @@ from mettagrid.objects.converter cimport Converter
1411
from mettagrid.objects.wall cimport Wall
1512

1613
cdef class ObservationEncoder:
17-
cpdef obs_np_type(self):
18-
return np.uint8
19-
2014
cdef init(self, unsigned int obs_width, unsigned int obs_height):
2115
self._obs_width = obs_width
2216
self._obs_height = obs_height
2317

2418
def __init__(self) -> None:
2519
self._offsets.resize(ObjectType.Count)
2620
self._type_feature_names.resize(ObjectType.Count)
27-
features = []
2821

2922
self._type_feature_names[ObjectType.AgentT] = Agent.feature_names()
3023
self._type_feature_names[ObjectType.WallT] = Wall.feature_names()
@@ -34,38 +27,7 @@ cdef class ObservationEncoder:
3427
# remove these types from code.
3528
for type_id in [ObjectType.AltarT, ObjectType.ArmoryT, ObjectType.FactoryT, ObjectType.GeneratorT, ObjectType.LabT, ObjectType.LaseryT, ObjectType.MineT, ObjectType.TempleT]:
3629
self._type_feature_names[type_id] = Converter.feature_names(type_id)
37-
38-
for type_id in range(ObjectType.Count):
39-
for i in range(len(self._type_feature_names[type_id])):
40-
self._offsets[type_id].push_back(len(features))
41-
features.append(self._type_feature_names[type_id][i])
42-
self._feature_names = features
43-
44-
cdef encode(self, GridObject *obj, ObsType[:] obs):
45-
self._encode(obj, obs, self._offsets[obj._type_id])
46-
47-
cdef _encode(self, GridObject *obj, ObsType[:] obs, vector[unsigned int] offsets):
48-
obj.obs(&obs[0], offsets)
49-
50-
cdef vector[string] feature_names(self):
51-
return self._feature_names
52-
53-
cpdef observation_space(self):
54-
type_info = np.iinfo(self.obs_np_type())
55-
56-
return gym.spaces.Box(
57-
low=type_info.min, high=type_info.max,
58-
shape=(
59-
len(self.feature_names()),
60-
self._obs_height, self._obs_width),
61-
dtype=self.obs_np_type()
62-
)
63-
64-
cdef class SemiCompactObservationEncoder(ObservationEncoder):
65-
def __init__(self) -> None:
66-
super().__init__()
67-
self._offsets.resize(ObjectType.Count)
68-
self._type_feature_names.resize(ObjectType.Count)
30+
6931
# Generate an offset for each unique feature name.
7032
cdef map[string, int] features
7133
cdef vector[string] feature_names
@@ -77,6 +39,15 @@ cdef class SemiCompactObservationEncoder(ObservationEncoder):
7739
# Set the offset for each feature, using the global offsets.
7840
for type_id in range(ObjectType.Count):
7941
for i in range(len(self._type_feature_names[type_id])):
80-
self._offsets[type_id][i] = features[self._type_feature_names[type_id][i]]
42+
self._offsets[type_id].push_back(features[self._type_feature_names[type_id][i]])
8143

8244
self._feature_names = feature_names
45+
46+
cdef encode(self, GridObject *obj, ObsType[:] obs):
47+
self._encode(obj, obs, self._offsets[obj._type_id])
48+
49+
cdef _encode(self, GridObject *obj, ObsType[:] obs, vector[unsigned int] offsets):
50+
obj.obs(&obs[0], offsets)
51+
52+
cdef vector[string] feature_names(self):
53+
return self._feature_names

0 commit comments

Comments
 (0)