|
from mlagents_envs.side_channel import SideChannel, IncomingMessage, OutgoingMessage |
|
import uuid |
|
from typing import Dict, Optional, List |
|
|
|
|
|
class FloatPropertiesChannel(SideChannel): |
|
""" |
|
This is the SideChannel for float properties shared with Unity. |
|
You can modify the float properties of an environment with the commands |
|
set_property, get_property and list_properties. |
|
""" |
|
|
|
def __init__(self, channel_id: uuid.UUID = None) -> None: |
|
self._float_properties: Dict[str, float] = {} |
|
if channel_id is None: |
|
channel_id = uuid.UUID("60ccf7d0-4f7e-11ea-b238-784f4387d1f7") |
|
super().__init__(channel_id) |
|
|
|
def on_message_received(self, msg: IncomingMessage) -> None: |
|
""" |
|
Is called by the environment to the side channel. Can be called |
|
multiple times per step if multiple messages are meant for that |
|
SideChannel. |
|
""" |
|
k = msg.read_string() |
|
v = msg.read_float32() |
|
self._float_properties[k] = v |
|
|
|
def set_property(self, key: str, value: float) -> None: |
|
""" |
|
Sets a property in the Unity Environment. |
|
:param key: The string identifier of the property. |
|
:param value: The float value of the property. |
|
""" |
|
self._float_properties[key] = value |
|
msg = OutgoingMessage() |
|
msg.write_string(key) |
|
msg.write_float32(value) |
|
super().queue_message_to_send(msg) |
|
|
|
def get_property(self, key: str) -> Optional[float]: |
|
""" |
|
Gets a property in the Unity Environment. If the property was not |
|
found, will return None. |
|
:param key: The string identifier of the property. |
|
:return: The float value of the property or None. |
|
""" |
|
return self._float_properties.get(key) |
|
|
|
def list_properties(self) -> List[str]: |
|
""" |
|
Returns a list of all the string identifiers of the properties |
|
currently present in the Unity Environment. |
|
""" |
|
return list(self._float_properties.keys()) |
|
|
|
def get_property_dict_copy(self) -> Dict[str, float]: |
|
""" |
|
Returns a copy of the float properties. |
|
:return: |
|
""" |
|
return dict(self._float_properties) |
|
|