File size: 5,247 Bytes
05c9ac2 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 | namespace Unity.MLAgents.Sensors
{
/// <summary>
/// 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.
/// </summary>
public struct ObservationSpec
{
internal readonly InplaceArray<int> m_Shape;
/// <summary>
/// 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].
/// </summary>
public InplaceArray<int> Shape
{
get => m_Shape;
}
internal readonly InplaceArray<DimensionProperty> m_DimensionProperties;
/// <summary>
/// The properties of each dimensions of the observation.
/// The length of the array must be equal to the rank of the observation tensor.
/// </summary>
/// <remarks>
/// It is generally recommended to use default values provided by helper functions,
/// as not all combinations of DimensionProperty may be supported by the trainer.
/// </remarks>
public InplaceArray<DimensionProperty> DimensionProperties
{
get => m_DimensionProperties;
}
internal ObservationType m_ObservationType;
/// <summary>
/// The type of the observation, e.g. whether they are generic or
/// help determine the goal for the Agent.
/// </summary>
public ObservationType ObservationType
{
get => m_ObservationType;
}
/// <summary>
/// The number of dimensions of the observation.
/// </summary>
public int Rank
{
get { return Shape.Length; }
}
/// <summary>
/// Construct an ObservationSpec for 1-D observations of the requested length.
/// </summary>
/// <param name="length"></param>
/// <param name="obsType"></param>
/// <returns></returns>
public static ObservationSpec Vector(int length, ObservationType obsType = ObservationType.Default)
{
return new ObservationSpec(
new InplaceArray<int>(length),
new InplaceArray<DimensionProperty>(DimensionProperty.None),
obsType
);
}
/// <summary>
/// Construct an ObservationSpec for variable-length observations.
/// </summary>
/// <param name="obsSize"></param>
/// <param name="maxNumObs"></param>
/// <returns></returns>
public static ObservationSpec VariableLength(int obsSize, int maxNumObs)
{
var dimProps = new InplaceArray<DimensionProperty>(
DimensionProperty.VariableSize,
DimensionProperty.None
);
return new ObservationSpec(
new InplaceArray<int>(obsSize, maxNumObs),
dimProps
);
}
/// <summary>
/// Construct an ObservationSpec for visual-like observations, e.g. observations
/// with a height, width, and possible multiple channels.
/// </summary>
/// <param name="height"></param>
/// <param name="width"></param>
/// <param name="channels"></param>
/// <param name="obsType"></param>
/// <returns></returns>
public static ObservationSpec Visual(int height, int width, int channels, ObservationType obsType = ObservationType.Default)
{
var dimProps = new InplaceArray<DimensionProperty>(
DimensionProperty.TranslationalEquivariance,
DimensionProperty.TranslationalEquivariance,
DimensionProperty.None
);
return new ObservationSpec(
new InplaceArray<int>(height, width, channels),
dimProps,
obsType
);
}
/// <summary>
/// Create a general ObservationSpec from the shape, dimension properties, and observation type.
/// </summary>
/// <remarks>
/// Note that not all combinations of DimensionProperty may be supported by the trainer.
/// shape and dimensionProperties must have the same size.
/// </remarks>
/// <param name="shape"></param>
/// <param name="dimensionProperties"></param>
/// <param name="observationType"></param>
/// <exception cref="UnityAgentsException"></exception>
public ObservationSpec(
InplaceArray<int> shape,
InplaceArray<DimensionProperty> 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;
}
}
}
|