namespace MLAgents.Sensors { /// /// The compression setting for visual/camera observations. /// public enum SensorCompressionType { /// /// No compression. Data is preserved as float arrays. /// None, /// /// PNG format. Data will be stored in binary format. /// PNG } /// /// Sensor interface for generating observations. /// For custom implementations, it is recommended to instead. /// public interface ISensor { /// /// Returns the size of the observations that will be generated. /// For example, a sensor that observes the velocity of a rigid body (in 3D) would return /// new {3}. A sensor that returns an RGB image would return new [] {Height, Width, 3} /// /// Size of the observations that will be generated. int[] GetObservationShape(); /// /// Write the observation data directly to the . /// This is considered an advanced interface; for a simpler approach, use /// and override instead. /// Note that this (and ) may /// be called multiple times per agent step, so should not mutate any internal state. /// /// Where the observations will be written to. /// The number of elements written. int Write(ObservationWriter writer); /// /// 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. /// /// Compressed observation. byte[] GetCompressedObservation(); /// /// Update any internal state of the sensor. This is called once per each agent step. /// void Update(); /// /// Resets the internal states of the sensor. This is called at the end of an Agent's episode. /// Most implementations can leave this empty. /// void Reset(); /// /// Return the compression type being used. If no compression is used, return /// . /// /// Compression type used by the sensor. SensorCompressionType GetCompressionType(); /// /// 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. /// /// The name of the sensor. string GetName(); } /// /// Helper methods to be shared by all classes that implement . /// public static class SensorExtensions { /// /// Get the total number of elements in the ISensor's observation (i.e. the product of the /// shape elements). /// /// /// public static int ObservationSize(this ISensor sensor) { var shape = sensor.GetObservationShape(); var count = 1; foreach (var dim in shape) { count *= dim; } return count; } } }