Beispiel #1
0
    async def get_next_event(self):
        """ Update the internal event machine and return the next
        event for processing"""
        # Grab a web socket connection if needed
        if self._sim_connection.client is None:
            message = await self._sim_connection.connect()
            # If the connection failed, report
            if message is not None:
                await self._handle_disconnect(message)
                return UnknownEvent()

        if self._prev_message_type == ServerToSimulator.PREDICTION:
            if self._prev_step_terminal[0]:
                self._prev_step_terminal[0] = False
                self._prev_step_finish = True
                event = EpisodeFinishEvent()
            else:
                event = self._process_sim_step()
            if event is not None:
                return event

        await self._ws_send_recv()

        pmt = self._prev_message_type
        if pmt == ServerToSimulator.ACKNOWLEDGE_REGISTER:
            if self._sim.predict:
                self._initial_state = self._new_state_message()
                event = EpisodeStartEvent(self._init_properties,
                                          self._initial_state)
                self._prev_step_finish = False
            else:
                event = UnknownEvent()
        elif (pmt == ServerToSimulator.SET_PROPERTIES
              or pmt == ServerToSimulator.RESET):
            event = UnknownEvent()
        elif pmt == ServerToSimulator.STOP:
            if self._prev_step_finish:
                event = UnknownEvent()
                self._prev_step_finish = False
            else:
                event = EpisodeFinishEvent()
        elif pmt == ServerToSimulator.START:
            self._initial_state = self._new_state_message()
            event = EpisodeStartEvent(self._init_properties,
                                      self._initial_state)
            self._prev_step_finish = False
        elif pmt == ServerToSimulator.PREDICTION:
            event = self._process_sim_step()
        elif pmt == ServerToSimulator.FINISHED:
            event = FinishedEvent()
        else:
            event = UnknownEvent()

        return event
Beispiel #2
0
    def get_next_event(self):
        """ Update the internal event machine and return the next
        event for processing"""
        # Grab a web socket connection if needed
        if self._ws is None:
            message = yield self._connect()
            # If the connection failed, report
            if message is not None:
                raise BonsaiServerError(
                    "Error while connecting to websocket: {}".format(message))

        if self._prev_message_type == ServerToSimulator.PREDICTION:
            if self._prev_step_terminal[0]:
                self._prev_step_terminal[0] = False
                self._prev_step_finish = True
                event = EpisodeFinishEvent()
            else:
                event = self._process_sim_step()
            if event is not None:
                raise gen.Return(event)

        yield self._ws_send_recv()

        pmt = self._prev_message_type
        if pmt == ServerToSimulator.ACKNOWLEDGE_REGISTER:
            if self._sim.predict:
                self._initial_state = self._new_state_message()
                event = EpisodeStartEvent(self._init_properties,
                                          self._initial_state)
                self._prev_step_finish = False
            else:
                event = UnknownEvent()
        if pmt == ServerToSimulator.SET_PROPERTIES or \
           pmt == ServerToSimulator.RESET:
            event = UnknownEvent()
        elif pmt == ServerToSimulator.STOP:
            if self._prev_step_finish:
                event = UnknownEvent()
                self._prev_step_finish = False
            else:
                event = EpisodeFinishEvent()
        elif pmt == ServerToSimulator.START:
            self._initial_state = self._new_state_message()
            event = EpisodeStartEvent(self._init_properties,
                                      self._initial_state)
            self._prev_step_finish = False
        elif pmt == ServerToSimulator.PREDICTION:
            event = self._process_sim_step()
        elif pmt == ServerToSimulator.FINISHED:
            event = FinishedEvent()
        else:
            event = UnknownEvent()

        raise gen.Return(event)
Beispiel #3
0
 def _process_sim_step(self):
     try:
         event = None
         step = next(self._step_iter)
         step.state = self._new_state_message()
         if self._prev_step_finish:
             event = EpisodeStartEvent(self._init_properties, step.state)
             self._prev_step_finish = False
         else:
             action_message = self._inkling.message_for_dynamic_message(
                 step.prediction, self._prediction_schema)
             action = dict_for_message(action_message)
             event = SimulateEvent(action, step, self._prev_step_terminal)
         return event
     except StopIteration:
         return None