2023-09-21 10:13:01 +01:00
|
|
|
from abc import ABC, abstractmethod
|
|
|
|
|
from typing import Any, Dict, List
|
|
|
|
|
|
2023-10-02 17:21:43 +01:00
|
|
|
class AbstractReward():
|
|
|
|
|
def __init__(self):
|
|
|
|
|
...
|
2023-09-21 10:13:01 +01:00
|
|
|
|
2023-10-06 20:32:52 +01:00
|
|
|
@abstractmethod
|
2023-10-02 17:21:43 +01:00
|
|
|
def calculate(self, state:Dict) -> float:
|
|
|
|
|
return 0.3
|
2023-09-21 10:13:01 +01:00
|
|
|
|
2023-10-06 20:32:52 +01:00
|
|
|
class DummyReward(AbstractReward):
|
|
|
|
|
|
|
|
|
|
def calculate(self, state: Dict) -> float:
|
|
|
|
|
return -0.1
|
2023-09-21 10:13:01 +01:00
|
|
|
|
2023-10-02 17:21:43 +01:00
|
|
|
class RewardFunction():
|
2023-10-06 20:32:52 +01:00
|
|
|
__rew_class_identifiers:Dict[str,type[AbstractReward]] = {
|
|
|
|
|
"DUMMY" : DummyReward
|
|
|
|
|
}
|
2023-10-02 17:21:43 +01:00
|
|
|
def __init__(self, reward_function:AbstractReward):
|
|
|
|
|
self.reward: AbstractReward = reward_function
|
2023-09-21 10:13:01 +01:00
|
|
|
|
2023-10-02 17:21:43 +01:00
|
|
|
def calculate(self, state:Dict) -> float:
|
|
|
|
|
return self.reward.calculate(state)
|
2023-10-06 20:32:52 +01:00
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
|
def from_config(cls, cfg:Dict) -> "RewardFunction":
|
|
|
|
|
for rew_component_cfg in cfg['reward_components']:
|
|
|
|
|
rew_type = rew_component_cfg['type']
|
|
|
|
|
rew_component = cls.__rew_class_identifiers[rew_type]()
|
|
|
|
|
new = cls(reward_function=rew_component)
|
|
|
|
|
return new
|
|
|
|
|
|