From 112852e183c0c0661414355350da70c9859da743 Mon Sep 17 00:00:00 2001 From: Chris Elion Date: Tue, 25 Feb 2020 16:49:36 -0800 Subject: [PATCH 1/5] test WIP --- .../Sensor/SensorShapeValidatorTests.cs | 72 +++++++++++++++++++ .../Sensor/SensorShapeValidatorTests.cs.meta | 11 +++ 2 files changed, 83 insertions(+) create mode 100644 com.unity.ml-agents/Tests/Editor/Sensor/SensorShapeValidatorTests.cs create mode 100644 com.unity.ml-agents/Tests/Editor/Sensor/SensorShapeValidatorTests.cs.meta diff --git a/com.unity.ml-agents/Tests/Editor/Sensor/SensorShapeValidatorTests.cs b/com.unity.ml-agents/Tests/Editor/Sensor/SensorShapeValidatorTests.cs new file mode 100644 index 0000000000..279ba8732b --- /dev/null +++ b/com.unity.ml-agents/Tests/Editor/Sensor/SensorShapeValidatorTests.cs @@ -0,0 +1,72 @@ +using System.Collections.Generic; +using NUnit.Framework; +using UnityEngine; +using UnityEngine.TestTools; + +namespace MLAgents.Tests +{ + public class NoopSensor : ISensor + { + string m_Name = "NoopSensor"; + int[] m_Shape; + + public NoopSensor(int dim1) + { + m_Shape = new[] { dim1 }; + } + + public NoopSensor(int dim1, int dim2) + { + m_Shape = new[] { dim1, dim2, }; + } + + public NoopSensor(int dim1, int dim2, int dim3) + { + m_Shape = new[] { dim1, dim2, dim3}; + } + + public string GetName() + { + return m_Name; + } + + public int[] GetObservationShape() + { + return m_Shape; + } + + public byte[] GetCompressedObservation() + { + return null; + } + + public int Write(WriteAdapter adapter) + { + return this.ObservationSize(); + } + + public void Update() { } + + public SensorCompressionType GetCompressionType() + { + return SensorCompressionType.None; + } + } + + public class SensorShapeValidatorTests + { + [Test] + public void TestSizeMismatch() + { + var validator = new SensorShapeValidator(); + var sensorList1 = new List() { new NoopSensor(1), new NoopSensor(2, 3), new NoopSensor(4, 5, 6) }; + validator.ValidateSensors(sensorList1); + validator.ValidateSensors(sensorList1); + + var sensorList2 = new List() { new NoopSensor(1), new NoopSensor(2, 3), new NoopSensor(4, 5, 7) }; + LogAssert.Expect(LogType.Assert, "Sensor sizes much match."); + validator.ValidateSensors(sensorList2); + + } + } +} diff --git a/com.unity.ml-agents/Tests/Editor/Sensor/SensorShapeValidatorTests.cs.meta b/com.unity.ml-agents/Tests/Editor/Sensor/SensorShapeValidatorTests.cs.meta new file mode 100644 index 0000000000..c538a8a743 --- /dev/null +++ b/com.unity.ml-agents/Tests/Editor/Sensor/SensorShapeValidatorTests.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: bbfcd7a9de490454cbc37b8d7d900e7e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: From 06481b1e97843c030abbc961b351eb6f78e7d45a Mon Sep 17 00:00:00 2001 From: Chris Elion Date: Wed, 26 Feb 2020 09:35:02 -0800 Subject: [PATCH 2/5] more tests --- .../Runtime/Sensor/SensorShapeValidator.cs | 4 +- .../Sensor/SensorShapeValidatorTests.cs | 37 ++++++++++++++++++- 2 files changed, 37 insertions(+), 4 deletions(-) diff --git a/com.unity.ml-agents/Runtime/Sensor/SensorShapeValidator.cs b/com.unity.ml-agents/Runtime/Sensor/SensorShapeValidator.cs index 889a29ffe7..a49cd04c7d 100644 --- a/com.unity.ml-agents/Runtime/Sensor/SensorShapeValidator.cs +++ b/com.unity.ml-agents/Runtime/Sensor/SensorShapeValidator.cs @@ -27,12 +27,12 @@ public void ValidateSensors(List sensors) // Check for compatibility with the other Agents' Sensors // TODO make sure this only checks once per agent Debug.Assert(m_SensorShapes.Count == sensors.Count, $"Number of Sensors must match. {m_SensorShapes.Count} != {sensors.Count}"); - for (var i = 0; i < m_SensorShapes.Count; i++) + for (var i = 0; i < Mathf.Min(m_SensorShapes.Count, sensors.Count); i++) { var cachedShape = m_SensorShapes[i]; var sensorShape = sensors[i].GetObservationShape(); Debug.Assert(cachedShape.Length == sensorShape.Length, "Sensor dimensions must match."); - for (var j = 0; j < cachedShape.Length; j++) + for (var j = 0; j < Mathf.Min(cachedShape.Length, sensorShape.Length); j++) { Debug.Assert(cachedShape[j] == sensorShape[j], "Sensor sizes much match."); } diff --git a/com.unity.ml-agents/Tests/Editor/Sensor/SensorShapeValidatorTests.cs b/com.unity.ml-agents/Tests/Editor/Sensor/SensorShapeValidatorTests.cs index 279ba8732b..3987b03ab9 100644 --- a/com.unity.ml-agents/Tests/Editor/Sensor/SensorShapeValidatorTests.cs +++ b/com.unity.ml-agents/Tests/Editor/Sensor/SensorShapeValidatorTests.cs @@ -55,18 +55,51 @@ public SensorCompressionType GetCompressionType() public class SensorShapeValidatorTests { + [Test] - public void TestSizeMismatch() + public void TestShapesAgree() { var validator = new SensorShapeValidator(); var sensorList1 = new List() { new NoopSensor(1), new NoopSensor(2, 3), new NoopSensor(4, 5, 6) }; validator.ValidateSensors(sensorList1); + + var sensorList2 = new List() { new NoopSensor(1), new NoopSensor(2, 3), new NoopSensor(4, 5, 6) }; + validator.ValidateSensors(sensorList2); + } + + [Test] + public void TestNumSensorMismatch() + { + var validator = new SensorShapeValidator(); + var sensorList1 = new List() { new NoopSensor(1), new NoopSensor(2, 3), new NoopSensor(4, 5, 6) }; + validator.ValidateSensors(sensorList1); + + var sensorList2 = new List() { new NoopSensor(1), new NoopSensor(2, 3), }; + LogAssert.Expect(LogType.Assert, "Number of Sensors must match. 3 != 2"); + validator.ValidateSensors(sensorList2); + } + [Test] + public void TestDimensionMismatch() + { + var validator = new SensorShapeValidator(); + var sensorList1 = new List() { new NoopSensor(1), new NoopSensor(2, 3), new NoopSensor(4, 5, 6) }; + validator.ValidateSensors(sensorList1); + + var sensorList2 = new List() { new NoopSensor(1), new NoopSensor(2, 3), new NoopSensor(4, 5) }; + LogAssert.Expect(LogType.Assert, "Sensor dimensions must match."); + validator.ValidateSensors(sensorList2); + } + + [Test] + public void TestSizeMismatch() + { + var validator = new SensorShapeValidator(); + var sensorList1 = new List() { new NoopSensor(1), new NoopSensor(2, 3), new NoopSensor(4, 5, 6) }; validator.ValidateSensors(sensorList1); var sensorList2 = new List() { new NoopSensor(1), new NoopSensor(2, 3), new NoopSensor(4, 5, 7) }; LogAssert.Expect(LogType.Assert, "Sensor sizes much match."); validator.ValidateSensors(sensorList2); - } } } From 8bf36c475c938f3d6ef7a95d235980d49fcb9601 Mon Sep 17 00:00:00 2001 From: Chris Elion Date: Wed, 26 Feb 2020 12:56:18 -0800 Subject: [PATCH 3/5] test other order too --- Project/ProjectSettings/ProjectVersion.txt | 2 +- .../Sensor/SensorShapeValidatorTests.cs | 40 +++++++++++++++++++ 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/Project/ProjectSettings/ProjectVersion.txt b/Project/ProjectSettings/ProjectVersion.txt index 4c21eea52f..aac939d2ad 100644 --- a/Project/ProjectSettings/ProjectVersion.txt +++ b/Project/ProjectSettings/ProjectVersion.txt @@ -1 +1 @@ -m_EditorVersion: 2018.4.14f1 +m_EditorVersion: 2018.4.17f1 diff --git a/com.unity.ml-agents/Tests/Editor/Sensor/SensorShapeValidatorTests.cs b/com.unity.ml-agents/Tests/Editor/Sensor/SensorShapeValidatorTests.cs index 3987b03ab9..59daba12ad 100644 --- a/com.unity.ml-agents/Tests/Editor/Sensor/SensorShapeValidatorTests.cs +++ b/com.unity.ml-agents/Tests/Editor/Sensor/SensorShapeValidatorTests.cs @@ -77,6 +77,12 @@ public void TestNumSensorMismatch() var sensorList2 = new List() { new NoopSensor(1), new NoopSensor(2, 3), }; LogAssert.Expect(LogType.Assert, "Number of Sensors must match. 3 != 2"); validator.ValidateSensors(sensorList2); + + // Add the sensors in the other order + validator = new SensorShapeValidator(); + validator.ValidateSensors(sensorList2); + LogAssert.Expect(LogType.Assert, "Number of Sensors must match. 2 != 3"); + validator.ValidateSensors(sensorList1); } [Test] public void TestDimensionMismatch() @@ -88,6 +94,12 @@ public void TestDimensionMismatch() var sensorList2 = new List() { new NoopSensor(1), new NoopSensor(2, 3), new NoopSensor(4, 5) }; LogAssert.Expect(LogType.Assert, "Sensor dimensions must match."); validator.ValidateSensors(sensorList2); + + // Add the sensors in the other order + validator = new SensorShapeValidator(); + validator.ValidateSensors(sensorList2); + LogAssert.Expect(LogType.Assert, "Sensor dimensions must match."); + validator.ValidateSensors(sensorList1); } [Test] @@ -100,6 +112,34 @@ public void TestSizeMismatch() var sensorList2 = new List() { new NoopSensor(1), new NoopSensor(2, 3), new NoopSensor(4, 5, 7) }; LogAssert.Expect(LogType.Assert, "Sensor sizes much match."); validator.ValidateSensors(sensorList2); + + // Add the sensors in the other order + validator = new SensorShapeValidator(); + validator.ValidateSensors(sensorList2); + LogAssert.Expect(LogType.Assert, "Sensor sizes much match."); + validator.ValidateSensors(sensorList1); + } + + [Test] + public void TestEverythingMismatch() + { + var validator = new SensorShapeValidator(); + var sensorList1 = new List() { new NoopSensor(1), new NoopSensor(2, 3), new NoopSensor(4, 5, 6) }; + validator.ValidateSensors(sensorList1); + + var sensorList2 = new List() { new NoopSensor(1), new NoopSensor(9) }; + LogAssert.Expect(LogType.Assert, "Number of Sensors must match. 3 != 2"); + LogAssert.Expect(LogType.Assert, "Sensor dimensions must match."); + LogAssert.Expect(LogType.Assert, "Sensor sizes much match."); + validator.ValidateSensors(sensorList2); + + // Add the sensors in the other order + validator = new SensorShapeValidator(); + validator.ValidateSensors(sensorList2); + LogAssert.Expect(LogType.Assert, "Number of Sensors must match. 2 != 3"); + LogAssert.Expect(LogType.Assert, "Sensor dimensions must match."); + LogAssert.Expect(LogType.Assert, "Sensor sizes much match."); + validator.ValidateSensors(sensorList1); } } } From 1cb154a35fac60651b1a69f416e47c8c3b2c672b Mon Sep 17 00:00:00 2001 From: Chris Elion Date: Wed, 26 Feb 2020 12:59:29 -0800 Subject: [PATCH 4/5] undo project version change --- Project/ProjectSettings/ProjectVersion.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Project/ProjectSettings/ProjectVersion.txt b/Project/ProjectSettings/ProjectVersion.txt index aac939d2ad..4c21eea52f 100644 --- a/Project/ProjectSettings/ProjectVersion.txt +++ b/Project/ProjectSettings/ProjectVersion.txt @@ -1 +1 @@ -m_EditorVersion: 2018.4.17f1 +m_EditorVersion: 2018.4.14f1 From 962b1f193cfc7a5d7c23f5392fc23b1fe4004de7 Mon Sep 17 00:00:00 2001 From: Chris Elion Date: Thu, 27 Feb 2020 10:42:31 -0800 Subject: [PATCH 5/5] rename to DummySensor --- .../Sensor/SensorShapeValidatorTests.cs | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/com.unity.ml-agents/Tests/Editor/Sensor/SensorShapeValidatorTests.cs b/com.unity.ml-agents/Tests/Editor/Sensor/SensorShapeValidatorTests.cs index 59daba12ad..77d619f284 100644 --- a/com.unity.ml-agents/Tests/Editor/Sensor/SensorShapeValidatorTests.cs +++ b/com.unity.ml-agents/Tests/Editor/Sensor/SensorShapeValidatorTests.cs @@ -5,22 +5,22 @@ namespace MLAgents.Tests { - public class NoopSensor : ISensor + public class DummySensor : ISensor { - string m_Name = "NoopSensor"; + string m_Name = "DummySensor"; int[] m_Shape; - public NoopSensor(int dim1) + public DummySensor(int dim1) { m_Shape = new[] { dim1 }; } - public NoopSensor(int dim1, int dim2) + public DummySensor(int dim1, int dim2) { m_Shape = new[] { dim1, dim2, }; } - public NoopSensor(int dim1, int dim2, int dim3) + public DummySensor(int dim1, int dim2, int dim3) { m_Shape = new[] { dim1, dim2, dim3}; } @@ -60,10 +60,10 @@ public class SensorShapeValidatorTests public void TestShapesAgree() { var validator = new SensorShapeValidator(); - var sensorList1 = new List() { new NoopSensor(1), new NoopSensor(2, 3), new NoopSensor(4, 5, 6) }; + var sensorList1 = new List() { new DummySensor(1), new DummySensor(2, 3), new DummySensor(4, 5, 6) }; validator.ValidateSensors(sensorList1); - var sensorList2 = new List() { new NoopSensor(1), new NoopSensor(2, 3), new NoopSensor(4, 5, 6) }; + var sensorList2 = new List() { new DummySensor(1), new DummySensor(2, 3), new DummySensor(4, 5, 6) }; validator.ValidateSensors(sensorList2); } @@ -71,10 +71,10 @@ public void TestShapesAgree() public void TestNumSensorMismatch() { var validator = new SensorShapeValidator(); - var sensorList1 = new List() { new NoopSensor(1), new NoopSensor(2, 3), new NoopSensor(4, 5, 6) }; + var sensorList1 = new List() { new DummySensor(1), new DummySensor(2, 3), new DummySensor(4, 5, 6) }; validator.ValidateSensors(sensorList1); - var sensorList2 = new List() { new NoopSensor(1), new NoopSensor(2, 3), }; + var sensorList2 = new List() { new DummySensor(1), new DummySensor(2, 3), }; LogAssert.Expect(LogType.Assert, "Number of Sensors must match. 3 != 2"); validator.ValidateSensors(sensorList2); @@ -88,10 +88,10 @@ public void TestNumSensorMismatch() public void TestDimensionMismatch() { var validator = new SensorShapeValidator(); - var sensorList1 = new List() { new NoopSensor(1), new NoopSensor(2, 3), new NoopSensor(4, 5, 6) }; + var sensorList1 = new List() { new DummySensor(1), new DummySensor(2, 3), new DummySensor(4, 5, 6) }; validator.ValidateSensors(sensorList1); - var sensorList2 = new List() { new NoopSensor(1), new NoopSensor(2, 3), new NoopSensor(4, 5) }; + var sensorList2 = new List() { new DummySensor(1), new DummySensor(2, 3), new DummySensor(4, 5) }; LogAssert.Expect(LogType.Assert, "Sensor dimensions must match."); validator.ValidateSensors(sensorList2); @@ -106,10 +106,10 @@ public void TestDimensionMismatch() public void TestSizeMismatch() { var validator = new SensorShapeValidator(); - var sensorList1 = new List() { new NoopSensor(1), new NoopSensor(2, 3), new NoopSensor(4, 5, 6) }; + var sensorList1 = new List() { new DummySensor(1), new DummySensor(2, 3), new DummySensor(4, 5, 6) }; validator.ValidateSensors(sensorList1); - var sensorList2 = new List() { new NoopSensor(1), new NoopSensor(2, 3), new NoopSensor(4, 5, 7) }; + var sensorList2 = new List() { new DummySensor(1), new DummySensor(2, 3), new DummySensor(4, 5, 7) }; LogAssert.Expect(LogType.Assert, "Sensor sizes much match."); validator.ValidateSensors(sensorList2); @@ -124,10 +124,10 @@ public void TestSizeMismatch() public void TestEverythingMismatch() { var validator = new SensorShapeValidator(); - var sensorList1 = new List() { new NoopSensor(1), new NoopSensor(2, 3), new NoopSensor(4, 5, 6) }; + var sensorList1 = new List() { new DummySensor(1), new DummySensor(2, 3), new DummySensor(4, 5, 6) }; validator.ValidateSensors(sensorList1); - var sensorList2 = new List() { new NoopSensor(1), new NoopSensor(9) }; + var sensorList2 = new List() { new DummySensor(1), new DummySensor(9) }; LogAssert.Expect(LogType.Assert, "Number of Sensors must match. 3 != 2"); LogAssert.Expect(LogType.Assert, "Sensor dimensions must match."); LogAssert.Expect(LogType.Assert, "Sensor sizes much match.");