# Copyright (c) Microsoft Corporation. All rights reserved.
# Licensed under the MIT license.
from typing import Tuple, Mapping, Any
from textworld.core import GameState, Wrapper
[docs]class Filter(Wrapper):
"""
Environment wrapper to filter what information is made available.
Requested information will be included within the `infos` dictionary
returned by `Filter.reset()` and `Filter.step(...)`. To request
specific information, create a
:py:class:`textworld.EnvInfos <textworld.core.EnvInfos>`
and set the appropriate attributes to `True`. Then, instantiate a `Filter`
wrapper with the `EnvInfos` object.
Example:
Here is an example of how to request information and retrieve it.
>>> from textworld import EnvInfos
>>> from textworld.envs.wrappers import Filter
>>> request_infos = EnvInfos(description=True, inventory=True, extras=["more"])
>>> env = textworld.start(gamefile, request_infos)
>>> env = Filter(env)
>>> ob, infos = env.reset()
>>> print(infos["description"])
>>> print(infos["inventory"])
>>> print(infos["extra.more"])
"""
def _get_requested_infos(self, game_state: GameState):
infos = {attr: getattr(game_state, attr) for attr in self.request_infos.basics}
if self.request_infos.extras:
for attr in self.request_infos.extras:
key = "extra.{}".format(attr)
infos[key] = game_state.get(key)
return infos
[docs] def step(self, command: str) -> Tuple[str, Mapping[str, Any]]:
game_state, score, done = super().step(command)
ob = game_state.feedback
infos = self._get_requested_infos(game_state)
return ob, score, done, infos
[docs] def reset(self) -> Tuple[str, Mapping[str, Any]]:
game_state = super().reset()
ob = game_state.feedback
infos = self._get_requested_infos(game_state)
return ob, infos
[docs] def copy(self) -> "Filter":
env = Filter()
env._wrapped_env = self._wrapped_env.copy()
env.request_infos = self.request_infos
return env