using System; | |
using System.Collections.Generic; | |
namespace Unity.MLAgents.Sensors | |
{ | |
/// <summary> | |
/// The Dimension property flags of the observations | |
/// </summary> | |
[ | ]|
public enum DimensionProperty | |
{ | |
/// <summary> | |
/// No properties specified. | |
/// </summary> | |
Unspecified = 0, | |
/// <summary> | |
/// No Property of the observation in that dimension. Observation can be processed with | |
/// fully connected networks. | |
/// </summary> | |
None = 1, | |
/// <summary> | |
/// Means it is suitable to do a convolution in this dimension. | |
/// </summary> | |
TranslationalEquivariance = 2, | |
/// <summary> | |
/// Means that there can be a variable number of observations in this dimension. | |
/// The observations are unordered. | |
/// </summary> | |
VariableSize = 4, | |
} | |
/// <summary> | |
/// The ObservationType enum of the Sensor. | |
/// </summary> | |
public enum ObservationType | |
{ | |
/// <summary> | |
/// Collected observations are generic. | |
/// </summary> | |
Default = 0, | |
/// <summary> | |
/// Collected observations contain goal information. | |
/// </summary> | |
GoalSignal = 1, | |
} | |
/// <summary> | |
/// Sensor interface for generating observations. | |
/// </summary> | |
public interface ISensor | |
{ | |
/// <summary> | |
/// Returns a description of the observations that will be generated by the sensor. | |
/// See <see cref="ObservationSpec"/> for more details, and helper methods to create one. | |
/// </summary> | |
/// <returns>An object describing the observation.</returns> | |
ObservationSpec GetObservationSpec(); | |
/// <summary> | |
/// Write the observation data directly to the <see cref="ObservationWriter"/>. | |
/// Note that this (and <see cref="GetCompressedObservation"/>) may | |
/// be called multiple times per agent step, so should not mutate any internal state. | |
/// </summary> | |
/// <param name="writer">Where the observations will be written to.</param> | |
/// <returns>The number of elements written.</returns> | |
int Write(ObservationWriter writer); | |
/// <summary> | |
/// Return a compressed representation of the observation. For small observations, | |
/// this should generally not be implemented. However, compressing large observations | |
/// (such as visual results) can significantly improve model training time. | |
/// </summary> | |
/// <returns>Compressed observation.</returns> | |
byte[] GetCompressedObservation(); | |
/// <summary> | |
/// Update any internal state of the sensor. This is called once per each agent step. | |
/// </summary> | |
void Update(); | |
/// <summary> | |
/// Resets the internal state of the sensor. This is called at the end of an Agent's episode. | |
/// Most implementations can leave this empty. | |
/// </summary> | |
void Reset(); | |
/// <summary> | |
/// Return information on the compression type being used. If no compression is used, return | |
/// <see cref="CompressionSpec.Default()"/>. | |
/// </summary> | |
/// <returns>An object describing the compression used by the sensor.</returns> | |
CompressionSpec GetCompressionSpec(); | |
/// <summary> | |
/// Get the name of the sensor. This is used to ensure deterministic sorting of the sensors | |
/// on an Agent, so the naming must be consistent across all sensors and agents. | |
/// </summary> | |
/// <returns>The name of the sensor.</returns> | |
string GetName(); | |
} | |
/// <summary> | |
/// Helper methods to be shared by all classes that implement <see cref="ISensor"/>. | |
/// </summary> | |
public static class SensorExtensions | |
{ | |
/// <summary> | |
/// Get the total number of elements in the ISensor's observation (i.e. the product of the | |
/// shape elements). | |
/// </summary> | |
/// <param name="sensor"></param> | |
/// <returns></returns> | |
public static int ObservationSize(this ISensor sensor) | |
{ | |
var obsSpec = sensor.GetObservationSpec(); | |
var count = 1; | |
for (var i = 0; i < obsSpec.Rank; i++) | |
{ | |
count *= obsSpec.Shape[i]; | |
} | |
return count; | |
} | |
} | |
internal static class SensorUtils | |
{ | |
internal static void SortSensors(List<ISensor> sensors) | |
{ | |
// Use InvariantCulture to ensure consistent sorting between different culture settings. | |
sensors.Sort((x, y) => string.Compare(x.GetName(), y.GetName(), StringComparison.InvariantCulture)); | |
} | |
} | |
} | |