|
using System; |
|
|
|
namespace Unity.MLAgents.Sensors |
|
{ |
|
|
|
|
|
|
|
public class BufferSensor : ISensor, IBuiltInSensor |
|
{ |
|
private string m_Name; |
|
private int m_MaxNumObs; |
|
private int m_ObsSize; |
|
float[] m_ObservationBuffer; |
|
int m_CurrentNumObservables; |
|
ObservationSpec m_ObservationSpec; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public BufferSensor(int maxNumberObs, int obsSize, string name) |
|
{ |
|
m_Name = name; |
|
m_MaxNumObs = maxNumberObs; |
|
m_ObsSize = obsSize; |
|
m_ObservationBuffer = new float[m_ObsSize * m_MaxNumObs]; |
|
m_CurrentNumObservables = 0; |
|
m_ObservationSpec = ObservationSpec.VariableLength(m_MaxNumObs, m_ObsSize); |
|
} |
|
|
|
|
|
public ObservationSpec GetObservationSpec() |
|
{ |
|
return m_ObservationSpec; |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public void AppendObservation(float[] obs) |
|
{ |
|
if (obs.Length != m_ObsSize) |
|
{ |
|
throw new UnityAgentsException( |
|
"The BufferSensor was expecting an observation of size " + |
|
$"{m_ObsSize} but received {obs.Length} observations instead." |
|
); |
|
} |
|
if (m_CurrentNumObservables >= m_MaxNumObs) |
|
{ |
|
return; |
|
} |
|
for (int i = 0; i < obs.Length; i++) |
|
{ |
|
m_ObservationBuffer[m_CurrentNumObservables * m_ObsSize + i] = obs[i]; |
|
} |
|
m_CurrentNumObservables++; |
|
} |
|
|
|
|
|
public int Write(ObservationWriter writer) |
|
{ |
|
for (int i = 0; i < m_ObsSize * m_MaxNumObs; i++) |
|
{ |
|
writer[i] = m_ObservationBuffer[i]; |
|
} |
|
return m_ObsSize * m_MaxNumObs; |
|
} |
|
|
|
|
|
public virtual byte[] GetCompressedObservation() |
|
{ |
|
return null; |
|
} |
|
|
|
|
|
public void Update() |
|
{ |
|
Reset(); |
|
} |
|
|
|
|
|
public void Reset() |
|
{ |
|
m_CurrentNumObservables = 0; |
|
Array.Clear(m_ObservationBuffer, 0, m_ObservationBuffer.Length); |
|
} |
|
|
|
|
|
public CompressionSpec GetCompressionSpec() |
|
{ |
|
return CompressionSpec.Default(); |
|
} |
|
|
|
|
|
public string GetName() |
|
{ |
|
return m_Name; |
|
} |
|
|
|
|
|
public BuiltInSensorType GetBuiltInSensorType() |
|
{ |
|
return BuiltInSensorType.BufferSensor; |
|
} |
|
} |
|
} |
|
|