using System.Reflection;
namespace Unity.MLAgents.Sensors.Reflection
{
///
/// Construction info for a ReflectionSensorBase.
///
internal struct ReflectionSensorInfo
{
public object Object;
public FieldInfo FieldInfo;
public PropertyInfo PropertyInfo;
public ObservableAttribute ObservableAttribute;
public string SensorName;
}
///
/// Abstract base class for reflection-based sensors.
///
internal abstract class ReflectionSensorBase : ISensor
{
protected object m_Object;
// Exactly one of m_FieldInfo and m_PropertyInfo should be non-null.
protected FieldInfo m_FieldInfo;
protected PropertyInfo m_PropertyInfo;
// Not currently used, but might want later.
protected ObservableAttribute m_ObservableAttribute;
// Cached sensor names and shapes.
string m_SensorName;
int[] m_Shape;
public ReflectionSensorBase(ReflectionSensorInfo reflectionSensorInfo, int size)
{
m_Object = reflectionSensorInfo.Object;
m_FieldInfo = reflectionSensorInfo.FieldInfo;
m_PropertyInfo = reflectionSensorInfo.PropertyInfo;
m_ObservableAttribute = reflectionSensorInfo.ObservableAttribute;
m_SensorName = reflectionSensorInfo.SensorName;
m_Shape = new[] {size};
}
///
public int[] GetObservationShape()
{
return m_Shape;
}
///
public int Write(ObservationWriter writer)
{
WriteReflectedField(writer);
return m_Shape[0];
}
internal abstract void WriteReflectedField(ObservationWriter writer);
///
/// Get either the reflected field, or return the reflected property.
/// This should be used by implementations in their WriteReflectedField() method.
///
///
protected object GetReflectedValue()
{
return m_FieldInfo != null ?
m_FieldInfo.GetValue(m_Object) :
m_PropertyInfo.GetMethod.Invoke(m_Object, null);
}
///
public byte[] GetCompressedObservation()
{
return null;
}
///
public void Update() {}
///
public void Reset() {}
///
public SensorCompressionType GetCompressionType()
{
return SensorCompressionType.None;
}
///
public string GetName()
{
return m_SensorName;
}
}
}