namespace Unity.MLAgents.Sensors { /// /// A description of the observations that an ISensor produces. /// This includes the size of the observation, the properties of each dimension, and how the observation /// should be used for training. /// public struct ObservationSpec { internal readonly InplaceArray m_Shape; /// /// The size of the observations that will be generated. /// For example, a sensor that observes the velocity of a rigid body (in 3D) would use [3]. /// A sensor that returns an RGB image would use [Height, Width, 3]. /// public InplaceArray Shape { get => m_Shape; } internal readonly InplaceArray m_DimensionProperties; /// /// The properties of each dimensions of the observation. /// The length of the array must be equal to the rank of the observation tensor. /// /// /// It is generally recommended to use default values provided by helper functions, /// as not all combinations of DimensionProperty may be supported by the trainer. /// public InplaceArray DimensionProperties { get => m_DimensionProperties; } internal ObservationType m_ObservationType; /// /// The type of the observation, e.g. whether they are generic or /// help determine the goal for the Agent. /// public ObservationType ObservationType { get => m_ObservationType; } /// /// The number of dimensions of the observation. /// public int Rank { get { return Shape.Length; } } /// /// Construct an ObservationSpec for 1-D observations of the requested length. /// /// /// /// public static ObservationSpec Vector(int length, ObservationType obsType = ObservationType.Default) { return new ObservationSpec( new InplaceArray(length), new InplaceArray(DimensionProperty.None), obsType ); } /// /// Construct an ObservationSpec for variable-length observations. /// /// /// /// public static ObservationSpec VariableLength(int obsSize, int maxNumObs) { var dimProps = new InplaceArray( DimensionProperty.VariableSize, DimensionProperty.None ); return new ObservationSpec( new InplaceArray(obsSize, maxNumObs), dimProps ); } /// /// Construct an ObservationSpec for visual-like observations, e.g. observations /// with a height, width, and possible multiple channels. /// /// /// /// /// /// public static ObservationSpec Visual(int height, int width, int channels, ObservationType obsType = ObservationType.Default) { var dimProps = new InplaceArray( DimensionProperty.TranslationalEquivariance, DimensionProperty.TranslationalEquivariance, DimensionProperty.None ); return new ObservationSpec( new InplaceArray(height, width, channels), dimProps, obsType ); } /// /// Create a general ObservationSpec from the shape, dimension properties, and observation type. /// /// /// Note that not all combinations of DimensionProperty may be supported by the trainer. /// shape and dimensionProperties must have the same size. /// /// /// /// /// public ObservationSpec( InplaceArray shape, InplaceArray dimensionProperties, ObservationType observationType = ObservationType.Default ) { if (shape.Length != dimensionProperties.Length) { throw new UnityAgentsException("shape and dimensionProperties must have the same length."); } m_Shape = shape; m_DimensionProperties = dimensionProperties; m_ObservationType = observationType; } } }