| 2 | |
| 3 | |
| 4 | class MicrogridStep: |
| 5 | def __init__(self, reward_shaping_func=None, cost_info=None): |
| 6 | self._reward_shaping_func = reward_shaping_func |
| 7 | self.cost_info = cost_info |
| 8 | self._obs = dict() |
| 9 | self._reward = 0.0 |
| 10 | self._done = False |
| 11 | self._info = dict(absorbed_energy=[], provided_energy=[]) |
| 12 | |
| 13 | def append(self, module_name, obs, reward, done, info): |
| 14 | try: |
| 15 | self._obs[module_name].append(obs) |
| 16 | except KeyError: |
| 17 | self._obs[module_name] = [obs] |
| 18 | self._reward += reward |
| 19 | if done: |
| 20 | self._done = True |
| 21 | |
| 22 | try: |
| 23 | self._info[module_name].append(info) |
| 24 | except KeyError: |
| 25 | self._info[module_name] = [info] |
| 26 | |
| 27 | for key, value in info.items(): |
| 28 | try: |
| 29 | self._info[key].append(value) |
| 30 | except KeyError: |
| 31 | pass |
| 32 | |
| 33 | def balance(self, shape_reward=False): |
| 34 | provided_energy = np.sum(self._info['provided_energy']) |
| 35 | absorbed_energy = np.sum(self._info['absorbed_energy']) |
| 36 | |
| 37 | if shape_reward: |
| 38 | return provided_energy, absorbed_energy, self._reward, self.shaped_reward() |
| 39 | |
| 40 | return provided_energy, absorbed_energy, self._reward, None |
| 41 | |
| 42 | def output(self): |
| 43 | return self._obs, self.shaped_reward(), self._done, self._output_info() |
| 44 | |
| 45 | def shaped_reward(self): |
| 46 | if self._reward_shaping_func is None: |
| 47 | return self._reward |
| 48 | elif not callable(self._reward_shaping_func): |
| 49 | raise TypeError(f'reward_shaping_func {self._reward_shaping_func} is not callable.') |
| 50 | |
| 51 | assert isinstance(self.cost_info, dict) |
| 52 | return self._reward_shaping_func(self._reward, self._output_info(), self.cost_info) |
| 53 | |
| 54 | |
| 55 | def _output_info(self): |
| 56 | return {k: v for k, v in self._info.items() if k not in ('absorbed_energy', 'provided_energy')} |
| 57 | |
| 58 | @property |
| 59 | def obs(self): |
| 60 | return self._obs |
| 61 | |