|
using NUnit.Framework; |
|
using UnityEngine; |
|
using System.IO.Abstractions.TestingHelpers; |
|
using System.Reflection; |
|
using Unity.MLAgents.Actuators; |
|
using Unity.MLAgents.CommunicatorObjects; |
|
using Unity.MLAgents.Sensors; |
|
using Unity.MLAgents.Demonstrations; |
|
using Unity.MLAgents.Policies; |
|
using Unity.MLAgents.Utils.Tests; |
|
|
|
namespace Unity.MLAgents.Tests |
|
{ |
|
[TestFixture] |
|
public class DemonstrationTests |
|
{ |
|
const string k_DemoDirectory = "Assets/Demonstrations/"; |
|
const string k_ExtensionType = ".demo"; |
|
const string k_DemoName = "Test"; |
|
|
|
[SetUp] |
|
public void SetUp() |
|
{ |
|
if (Academy.IsInitialized) |
|
{ |
|
Academy.Instance.Dispose(); |
|
} |
|
} |
|
|
|
[Test] |
|
public void TestSanitization() |
|
{ |
|
const string dirtyString = "abc1234567&!@"; |
|
const string knownCleanString = "abc123"; |
|
var cleanString = DemonstrationRecorder.SanitizeName(dirtyString, 6); |
|
Assert.AreNotEqual(dirtyString, cleanString); |
|
Assert.AreEqual(cleanString, knownCleanString); |
|
} |
|
|
|
[Test] |
|
public void TestStoreInitialize() |
|
{ |
|
var fileSystem = new MockFileSystem(); |
|
|
|
var gameobj = new GameObject("gameObj"); |
|
|
|
var bp = gameobj.AddComponent<BehaviorParameters>(); |
|
bp.BrainParameters.VectorObservationSize = 3; |
|
bp.BrainParameters.NumStackedVectorObservations = 2; |
|
bp.BrainParameters.VectorActionDescriptions = new[] { "TestActionA", "TestActionB" }; |
|
bp.BrainParameters.ActionSpec = ActionSpec.MakeDiscrete(2, 2); |
|
|
|
gameobj.AddComponent<TestAgent>(); |
|
|
|
Assert.IsFalse(fileSystem.Directory.Exists(k_DemoDirectory)); |
|
|
|
var demoRec = gameobj.AddComponent<DemonstrationRecorder>(); |
|
demoRec.Record = true; |
|
demoRec.DemonstrationName = k_DemoName; |
|
demoRec.DemonstrationDirectory = k_DemoDirectory; |
|
var demoWriter = demoRec.LazyInitialize(fileSystem); |
|
|
|
Assert.IsTrue(fileSystem.Directory.Exists(k_DemoDirectory)); |
|
Assert.IsTrue(fileSystem.FileExists(k_DemoDirectory + k_DemoName + k_ExtensionType)); |
|
|
|
var agentInfo = new AgentInfo |
|
{ |
|
reward = 1f, |
|
discreteActionMasks = new[] { false, true }, |
|
done = true, |
|
episodeId = 5, |
|
maxStepReached = true, |
|
storedActions = new ActionBuffers(null, new[] { 0, 1 }), |
|
}; |
|
|
|
|
|
demoWriter.Record(agentInfo, new System.Collections.Generic.List<ISensor>()); |
|
demoRec.Close(); |
|
|
|
|
|
demoWriter.Close(); |
|
demoRec.Close(); |
|
|
|
|
|
demoWriter.Record(agentInfo, new System.Collections.Generic.List<ISensor>()); |
|
} |
|
|
|
public class ObservationAgent : TestAgent |
|
{ |
|
public override void CollectObservations(VectorSensor sensor) |
|
{ |
|
collectObservationsCalls += 1; |
|
sensor.AddObservation(1f); |
|
sensor.AddObservation(2f); |
|
sensor.AddObservation(3f); |
|
} |
|
} |
|
|
|
[Test] |
|
public void TestAgentWrite() |
|
{ |
|
var agentGo1 = new GameObject("TestAgent"); |
|
var bpA = agentGo1.AddComponent<BehaviorParameters>(); |
|
bpA.BrainParameters.VectorObservationSize = 3; |
|
bpA.BrainParameters.NumStackedVectorObservations = 1; |
|
bpA.BrainParameters.VectorActionDescriptions = new[] { "TestActionA", "TestActionB" }; |
|
bpA.BrainParameters.ActionSpec = ActionSpec.MakeDiscrete(2, 2); |
|
|
|
agentGo1.AddComponent<ObservationAgent>(); |
|
var agent1 = agentGo1.GetComponent<ObservationAgent>(); |
|
|
|
agentGo1.AddComponent<DemonstrationRecorder>(); |
|
var demoRecorder = agentGo1.GetComponent<DemonstrationRecorder>(); |
|
var fileSystem = new MockFileSystem(); |
|
demoRecorder.DemonstrationDirectory = k_DemoDirectory; |
|
demoRecorder.DemonstrationName = "TestBrain"; |
|
demoRecorder.Record = true; |
|
demoRecorder.LazyInitialize(fileSystem); |
|
|
|
var agentEnableMethod = typeof(Agent).GetMethod("OnEnable", |
|
BindingFlags.Instance | BindingFlags.NonPublic); |
|
var agentSendInfo = typeof(Agent).GetMethod("SendInfo", |
|
BindingFlags.Instance | BindingFlags.NonPublic); |
|
|
|
agentEnableMethod?.Invoke(agent1, new object[] { }); |
|
|
|
|
|
agent1.RequestDecision(); |
|
agentSendInfo?.Invoke(agent1, new object[] { }); |
|
|
|
demoRecorder.Close(); |
|
|
|
|
|
var reader = fileSystem.File.OpenRead("Assets/Demonstrations/TestBrain.demo"); |
|
reader.Seek(DemonstrationWriter.MetaDataBytes + 1, 0); |
|
BrainParametersProto.Parser.ParseDelimitedFrom(reader); |
|
|
|
var agentInfoProto = AgentInfoActionPairProto.Parser.ParseDelimitedFrom(reader).AgentInfo; |
|
var obs = agentInfoProto.Observations[2]; |
|
{ |
|
var vecObs = obs.FloatData.Data; |
|
Assert.AreEqual(bpA.BrainParameters.VectorObservationSize, vecObs.Count); |
|
for (var i = 0; i < vecObs.Count; i++) |
|
{ |
|
Assert.AreEqual((float)i + 1, vecObs[i]); |
|
} |
|
} |
|
} |
|
} |
|
} |
|
|