from coopihc.observation.BaseObservationEngine import BaseObservationEngine
import copy
[docs]class CascadedObservationEngine(BaseObservationEngine):
"""CascadedObservationEngine
Cascades (serially) several observation engines.
Gamestate --> Engine1 --> Engine2 --> ... --> EngineN --> Observation
:param engine_list: list of observation engines
:type engine_list: list(:py:mod:`Observation Engine<coopihc.observation>`)
"""
def __init__(self, engine_list, *args, **kwargs):
super().__init__(*args, **kwargs)
self.engine_list = engine_list
def __content__(self):
"""__content__
Custom class repr
:return: custom repr
:rtype: dictionnary
"""
return {
self.__class__.__name__: {
"Engine{}".format(ni): i.__content__()
for ni, i in enumerate(self.engine_list)
}
}
[docs] def observe(self, game_state):
"""observe
Serial observations (i.e. output of an engine becomes input of the next one)
:param game_state: game state
:type game_state: `State<coopihc.base.State.State`
:return: (observation, obs reward)
:rtype: tuple(`State<coopihc.base.State.State`, float)
"""
game_state = copy.deepcopy(game_state)
rewards = 0
for engine in self.engine_list:
new_obs, new_reward = engine.observe(game_state)
game_state.update(new_obs)
rewards += new_reward
return game_state, rewards