def handle_gym_message(self, envelope: Envelope) -> None: """ Forward a message to gym. :param envelope: the envelope :return: None """ gym_message = GymSerializer().decode(envelope.message) performative = gym_message.get("performative") if GymMessage.Performative( performative) == GymMessage.Performative.ACT: action = gym_message.get("action") step_id = gym_message.get("step_id") observation, reward, done, info = self.gym_env.step( action) # type: ignore msg = GymMessage(performative=GymMessage.Performative.PERCEPT, observation=observation, reward=reward, done=done, info=info, step_id=step_id) msg_bytes = GymSerializer().encode(msg) envelope = Envelope(to=envelope.sender, sender=DEFAULT_GYM, protocol_id=GymMessage.protocol_id, message=msg_bytes) self._send(envelope) elif GymMessage.Performative( performative) == GymMessage.Performative.RESET: self.gym_env.reset() # type: ignore elif GymMessage.Performative( performative) == GymMessage.Performative.CLOSE: self.gym_env.close() # type: ignore
def decode(self, obj: bytes) -> Message: """ Decode the message. :param obj: the bytes object :return: the message """ json_msg = json.loads(obj.decode("utf-8")) performative = GymMessage.Performative(json_msg["performative"]) new_body = copy.copy(json_msg) new_body["type"] = performative if performative == GymMessage.Performative.ACT: action_bytes = base64.b64decode(json_msg["action"]) action = pickle.loads(action_bytes) new_body["action"] = action new_body["step_id"] = json_msg["step_id"] elif performative == GymMessage.Performative.PERCEPT: # observation, reward and info are gym implementation specific, done is boolean observation_bytes = base64.b64decode(json_msg["observation"]) observation = pickle.loads(observation_bytes) new_body["observation"] = observation reward_bytes = base64.b64decode(json_msg["reward"]) reward = pickle.loads(reward_bytes) new_body["reward"] = reward info_bytes = base64.b64decode(json_msg["info"]) info = pickle.loads(info_bytes) new_body["info"] = info new_body["step_id"] = json_msg["step_id"] gym_message = GymMessage(performative=performative, body=new_body) return gym_message
def encode(self, msg: Message) -> bytes: """ Decode the message. :param msg: the message object :return: the bytes """ performative = GymMessage.Performative(msg.get("performative")) new_body = copy.copy(msg.body) new_body["performative"] = performative.value if performative == GymMessage.Performative.ACT: action = msg.body["action"] # type: Any action_bytes = base64.b64encode( pickle.dumps(action)).decode("utf-8") new_body["action"] = action_bytes new_body["step_id"] = msg.body["step_id"] elif performative == GymMessage.Performative.PERCEPT: # observation, reward and info are gym implementation specific, done is boolean observation = msg.body["observation"] # type: Any observation_bytes = base64.b64encode( pickle.dumps(observation)).decode("utf-8") new_body["observation"] = observation_bytes reward = msg.body["reward"] # type: Any reward_bytes = base64.b64encode( pickle.dumps(reward)).decode("utf-8") new_body["reward"] = reward_bytes info = msg.body["info"] # type: Any info_bytes = base64.b64encode(pickle.dumps(info)).decode("utf-8") new_body["info"] = info_bytes new_body["step_id"] = msg.body["step_id"] gym_message_bytes = json.dumps(new_body).encode("utf-8") return gym_message_bytes
def handle_envelope(self, envelope: Envelope) -> None: """ Handle envelopes. :param envelope: the envelope :return: None """ gym_msg = GymSerializer().decode(envelope.message) gym_msg_performative = GymMessage.Performative( gym_msg.get("performative")) if gym_msg_performative == GymMessage.Performative.PERCEPT: assert self.context.tasks is not None, "Incorrect initialization." assert len(self.context.tasks) == 1, "Too many tasks loaded!" gym_task = cast(GymTask, self.context.tasks[0]) gym_task.proxy_env_queue.put(gym_msg) else: raise ValueError( "Unexpected performative or no step_id: {}".format( gym_msg_performative))
def handle(self, message: Message, sender: str) -> None: """ Handle messages. :param message: the message :param sender: the sender :return: None """ gym_msg = cast(GymMessage, message) gym_msg_performative = GymMessage.Performative( gym_msg.get("performative")) if gym_msg_performative == GymMessage.Performative.PERCEPT: assert self.context.tasks is not None, "Incorrect initialization." assert len(self.context.tasks) == 1, "Too many tasks loaded!" gym_task = cast(GymTask, self.context.tasks[0]) gym_task.proxy_env_queue.put(gym_msg) else: raise ValueError( "Unexpected performative or no step_id: {}".format( gym_msg_performative))