from coopihc.inference.BaseInferenceEngine import BaseInferenceEngine
# Base Inference Engine: does nothing but return the same state. Any new inference method can subclass InferenceEngine to have a buffer and add_observation method (required by the bundle)
[docs]class DualInferenceEngine(BaseInferenceEngine):
    """BaseInferenceEngine
    The base Inference Engine from which other engines can be defined. This engine does nothing but return the same state. Any new inference method can subclass ``InferenceEngine`` to have a buffer and ``add_observation`` method (required by the bundle)
    :param buffer_depth: number of observations that are stored, defaults to 1
    :type buffer_depth: int, optional
    """
    """"""
    def __init__(
        self,
        primary_inference_engine,
        dual_inference_engine,
        primary_kwargs={},
        dual_kwargs={},
        order="primary-first",
        **kwargs
    ):
        self.order = order
        self._mode = "primary"
        if type(primary_inference_engine).__name__ == "type":
            self.primary_engine = primary_inference_engine(**primary_kwargs)
        else:
            self.primary_engine = primary_inference_engine
        if type(dual_inference_engine).__name__ == "type":
            self.dual_engine = dual_inference_engine(**dual_kwargs)
        else:
            self.dual_engine = dual_inference_engine
        super().__init__(**kwargs)
    @property
    def host(self):
        return self._host
    @host.setter
    def host(self, value):
        self._host = value
        self.primary_engine.host = value
        self.dual_engine.host = value
    # Set mode to read-only
    @property
    def mode(self):
        return self._mode
    @property
    def buffer(self):
        if self.mode == "primary":
            return self.primary_engine.buffer
        else:
            return self.dual_engine.buffer
    @buffer.setter
    def buffer(self, value):
        if self.mode == "primary":
            self.primary_engine.buffer = value
        else:
            self.dual_engine.buffer = value
    @BaseInferenceEngine.default_value
    def infer(self, agent_observation=None):
        if self._mode == "primary":
            state, primary_reward = self.primary_engine.infer(
                agent_observation=agent_observation
            )
            return state, primary_reward
        else:
            state, dual_reward = self.dual_engine.infer(
                agent_observation=agent_observation
            )
            return state, dual_reward