using System.Collections.Generic;
using System;
namespace MLAgents.SideChannels
{
///
/// Side channel that is comprised of a collection of float variables, represented by
///
///
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);
}
}
}