using System.Collections.Generic; using System; namespace MLAgents.SideChannels { /// /// Side channel that is comprised of a collection of float variables. /// public class FloatPropertiesChannel : SideChannel { Dictionary m_FloatProperties = new Dictionary(); Dictionary> m_RegisteredActions = new Dictionary>(); private const string k_FloatPropertiesDefaultId = "60ccf7d0-4f7e-11ea-b238-784f4387d1f7"; /// /// Initializes the side channel with the provided channel ID. /// /// ID for the side channel. public FloatPropertiesChannel(Guid channelId = default(Guid)) { if (channelId == default(Guid)) { ChannelId = new Guid(k_FloatPropertiesDefaultId); } else { ChannelId = channelId; } } /// public override void OnMessageReceived(IncomingMessage msg) { var key = msg.ReadString(); var value = msg.ReadFloat32(); m_FloatProperties[key] = value; Action action; m_RegisteredActions.TryGetValue(key, out action); action?.Invoke(value); } /// public void SetProperty(string key, float value) { m_FloatProperties[key] = value; using (var msgOut = new OutgoingMessage()) { msgOut.WriteString(key); msgOut.WriteFloat32(value); QueueMessageToSend(msgOut); } Action action; m_RegisteredActions.TryGetValue(key, out action); action?.Invoke(value); } public float GetPropertyWithDefault(string key, float defaultValue) { float valueOut; bool hasKey = m_FloatProperties.TryGetValue(key, out valueOut); return hasKey ? valueOut : defaultValue; } public void RegisterCallback(string key, Action action) { m_RegisteredActions[key] = action; } public IList ListProperties() { return new List(m_FloatProperties.Keys); } } }