Bases: FeatureExtractor[DeltaFeature]
A component for detecting changes in vision.
Source code in roc/feature_extractors/delta.py
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112 | @register_component("delta", "perception")
class Delta(FeatureExtractor[DeltaFeature]):
"""A component for detecting changes in vision."""
def __init__(self) -> None:
super().__init__()
self.prev_viz: IntGrid | None = None
def event_filter(self, e: PerceptionEvent) -> bool:
return isinstance(e.data, VisionData)
def get_feature(self, e: PerceptionEvent) -> None:
data = e.data
assert isinstance(data, VisionData)
prev = self.prev_viz
# XXX: NLE reuses numpy arrays rather than creating new ones
self.prev_viz = curr = IntGrid(data.glyphs.copy())
if prev is None:
# can't get difference when there was nothing before this
self.settled()
return None
# roughly make sure that things are the same size
assert prev.height == curr.height
assert prev.width == curr.width
for new_point in curr.points():
old_point = prev.get_point(new_point.x, new_point.y)
if old_point.val != new_point.val:
self.pb_conn.send(
DeltaFeature(
origin_id=self.id,
point=(new_point.x, new_point.y),
old_val=old_point.val,
new_val=new_point.val,
)
)
self.settled()
|
Source code in roc/feature_extractors/delta.py
| def __init__(self) -> None:
super().__init__()
self.prev_viz: IntGrid | None = None
|
Source code in roc/feature_extractors/delta.py
| def event_filter(self, e: PerceptionEvent) -> bool:
return isinstance(e.data, VisionData)
|
Source code in roc/feature_extractors/delta.py
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112 | def get_feature(self, e: PerceptionEvent) -> None:
data = e.data
assert isinstance(data, VisionData)
prev = self.prev_viz
# XXX: NLE reuses numpy arrays rather than creating new ones
self.prev_viz = curr = IntGrid(data.glyphs.copy())
if prev is None:
# can't get difference when there was nothing before this
self.settled()
return None
# roughly make sure that things are the same size
assert prev.height == curr.height
assert prev.width == curr.width
for new_point in curr.points():
old_point = prev.get_point(new_point.x, new_point.y)
if old_point.val != new_point.val:
self.pb_conn.send(
DeltaFeature(
origin_id=self.id,
point=(new_point.x, new_point.y),
old_val=old_point.val,
new_val=new_point.val,
)
)
self.settled()
|