using NUnit.Framework; | |
using System; | |
using System.Linq; | |
namespace Unity.MLAgents.Tests | |
{ | |
public static class GridObsTestUtils | |
{ | |
/// <summary> | |
/// Utility function to duplicate an array into an array of arrays | |
/// </summary> | |
/// <param name="array">array to duplicate</param> | |
/// <param name="numCopies">number of times to duplicate</param> | |
/// <returns>array of duplicated arrays</returns> | |
public static float[][] DuplicateArray(float[] array, int numCopies) | |
{ | |
float[][] duplicated = new float[numCopies][]; | |
for (int i = 0; i < numCopies; i++) | |
{ | |
duplicated[i] = array; | |
} | |
return duplicated; | |
} | |
/// <summary> | |
/// Asserts that the sub-arrays of the total array are equal to specific subarrays at specific subarray indicies and equal to a default everywhere else. | |
/// </summary> | |
/// <param name="total">Array containing all data of the grid observation. Is a concatenation of N subarrays all of the same length</param> | |
/// <param name="indicies">The indicies to verify that differ from the default array</param> | |
/// <param name="expectedArrays">The sub arrays values that differ from the default array</param> | |
/// <param name="expectedDefaultArray">The default value of a sub array</param> | |
/// <example> | |
/// If the total array is data from a 4x4x2 grid observation, total will be an array of size 32 and each sub array will have a size of 2. | |
/// Let 3 cells at indicies (0, 1), (2, 2), and (3, 0) with values ([.1, .5]), ([.9, .7]), ([0, .2]), respectively. | |
/// If the default values of cells are ([0, 0]) then the grid observation will be as follows: | |
/// [ [0, 0], [.1, .5], [ 0, 0 ], [0, 0], | |
/// [0, 0], [ 0, 0 ], [ 0, 0 ], [0, 0], | |
/// [0, 0], [ 0, 0 ], [.9, .7], [0, 0], | |
/// [0, .2], [ 0, 0 ], [ 0, 0 ], [0, 0] ] | |
/// | |
/// Which will make the total array will be the flattened array | |
/// total = [0, 0, .1, .5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, .9, .7, 0, 0, 0, .2, 0, 0, 0, 0, 0] | |
/// | |
/// The indicies of the activated cells in the flattened array will be 1, 10, and 12 | |
/// | |
/// So to verify that the total array is as expected, AssertSubarraysAtIndex should be called as | |
/// AssertSubarraysAtIndex( | |
/// total, | |
/// indicies = new int[] {1, 10, 12}, | |
/// expectedArrays = new float[][] { new float[] {.1, .5}, new float[] {.9, .7}, new float[] {0, .2}}, | |
/// expecedDefaultArray = new float[] {0, 0} | |
/// ) | |
/// </example> | |
public static void AssertSubarraysAtIndex(float[] total, int[] indicies, float[][] expectedArrays, float[] expectedDefaultArray) | |
{ | |
int totalIndex = 0; | |
int subIndex = 0; | |
int subarrayIndex = 0; | |
int lenOfData = expectedDefaultArray.Length; | |
int numArrays = total.Length / lenOfData; | |
for (int i = 0; i < numArrays; i++) | |
{ | |
totalIndex = i * lenOfData; | |
if (indicies.Contains(i)) | |
{ | |
subarrayIndex = Array.IndexOf(indicies, i); | |
for (subIndex = 0; subIndex < lenOfData; subIndex++) | |
{ | |
Assert.AreEqual(expectedArrays[subarrayIndex][subIndex], total[totalIndex], | |
"Expected " + expectedArrays[subarrayIndex][subIndex] + " at subarray index " + totalIndex + ", index = " + subIndex + " but was " + total[totalIndex]); | |
totalIndex++; | |
} | |
} | |
else | |
{ | |
for (subIndex = 0; subIndex < lenOfData; subIndex++) | |
{ | |
Assert.AreEqual(expectedDefaultArray[subIndex], total[totalIndex], | |
"Expected default value " + expectedDefaultArray[subIndex] + " at subarray index " + totalIndex + ", index = " + subIndex + " but was " + total[totalIndex]); | |
totalIndex++; | |
} | |
} | |
} | |
} | |
} | |
} | |