'''
Copyright 2021 OpenDILab. All Rights Reserved:
Description: Base simulator.
'''
import os
import sys
from abc import ABC, abstractmethod
from typing import Any, Dict
from easydict import EasyDict
import copy
from ding.utils.default_helper import deep_merge_dicts
[docs]class BaseSimulator(ABC):
    """
    Base class for simulators.
    :Arguments:
        - cfg (Dict): Config Dict
    :Interfaces: apply_control, run_step
    """
    config = dict()
    def __init__(self, cfg: Dict):
        if 'cfg_type' not in cfg:
            self._cfg = self.__class__.default_config()
            self._cfg = deep_merge_dicts(self._cfg, cfg)
        else:
            self._cfg = cfg
[docs]    @abstractmethod
    def apply_control(self, control: Dict):
        """
        Apply control signal to hero vehicle. It will take effect in the next world tick.
        :Arguments:
            control (Dict): Control signal dict
        """
        raise NotImplementedError 
[docs]    @abstractmethod
    def run_step(self):
        """
        Run one step for simulator.
        """
        raise NotImplementedError 
    @classmethod
    def default_config(cls: type) -> EasyDict:
        cfg = EasyDict(cls.config)
        cfg.cfg_type = cls.__name__ + 'Config'
        return copy.deepcopy(cfg)