| using System.Collections; |
| using System.Collections.Generic; |
| using Unity.MLAgents; |
| using Unity.MLAgents.Policies; |
| using Unity.MLAgents.Sensors; |
| using Unity.MLAgents.Sensors.Reflection; |
| using NUnit.Framework; |
| using Unity.MLAgents.Actuators; |
| using UnityEngine; |
| using UnityEngine.TestTools; |
|
|
| namespace Tests |
| { |
| public class PublicApiAgent : Agent |
| { |
| public int numHeuristicCalls; |
|
|
| [Observable] |
| public float ObservableFloat; |
|
|
| public override void Heuristic(in ActionBuffers actionsOut) |
| { |
| numHeuristicCalls++; |
| base.Heuristic(actionsOut); |
| } |
| } |
|
|
| |
| public class StackingComponent : SensorComponent |
| { |
| public SensorComponent wrappedComponent; |
| public int numStacks; |
|
|
| public override ISensor[] CreateSensors() |
| { |
| var wrappedSensors = wrappedComponent.CreateSensors(); |
| var sensorsOut = new ISensor[wrappedSensors.Length]; |
| for (var i = 0; i < wrappedSensors.Length; i++) |
| { |
| sensorsOut[i] = new StackingSensor(wrappedSensors[i], numStacks); |
| } |
|
|
| return sensorsOut; |
| } |
| } |
|
|
| public class RuntimeApiTest |
| { |
| [SetUp] |
| public static void Setup() |
| { |
| if (Academy.IsInitialized) |
| { |
| Academy.Instance.Dispose(); |
| } |
| Academy.Instance.AutomaticSteppingEnabled = false; |
| } |
|
|
| [UnityTest] |
| public IEnumerator RuntimeApiTestWithEnumeratorPasses() |
| { |
| Academy.Instance.InferenceSeed = 1337; |
| var gameObject = new GameObject(); |
|
|
| var behaviorParams = gameObject.AddComponent<BehaviorParameters>(); |
| behaviorParams.BrainParameters.VectorObservationSize = 3; |
| behaviorParams.BrainParameters.NumStackedVectorObservations = 2; |
| behaviorParams.BrainParameters.VectorActionDescriptions = new[] { "Continuous1", "TestActionA", "TestActionB" }; |
| behaviorParams.BrainParameters.ActionSpec = new ActionSpec(1, new[] { 2, 2 }); |
| behaviorParams.BehaviorName = "TestBehavior"; |
| behaviorParams.TeamId = 42; |
| behaviorParams.UseChildSensors = true; |
| behaviorParams.DeterministicInference = false; |
| behaviorParams.ObservableAttributeHandling = ObservableAttributeOptions.ExamineAll; |
|
|
|
|
| |
| behaviorParams.BehaviorType = BehaviorType.Default; |
| #if MLA_UNITY_PHYSICS_MODULE |
| var sensorComponent = gameObject.AddComponent<RayPerceptionSensorComponent3D>(); |
| sensorComponent.SensorName = "ray3d"; |
| sensorComponent.DetectableTags = new List<string> { "Player", "Respawn" }; |
| sensorComponent.RaysPerDirection = 3; |
|
|
| |
| |
| var wrappingSensorComponent = gameObject.AddComponent<StackingComponent>(); |
| wrappingSensorComponent.wrappedComponent = sensorComponent; |
| wrappingSensorComponent.numStacks = 3; |
|
|
| |
| Assert.IsNull(sensorComponent.RaySensor); |
| #endif |
|
|
|
|
| |
| |
| behaviorParams.BehaviorType = BehaviorType.HeuristicOnly; |
|
|
| |
| var agent = gameObject.AddComponent<PublicApiAgent>(); |
|
|
| |
| var decisionRequester = gameObject.AddComponent<DecisionRequester>(); |
| decisionRequester.DecisionPeriod = 2; |
| decisionRequester.TakeActionsBetweenDecisions = true; |
|
|
| #if MLA_UNITY_PHYSICS_MODULE |
| |
| Assert.IsNotNull(sensorComponent.RaySensor); |
| #endif |
| |
| var otherDevice = behaviorParams.InferenceDevice == InferenceDevice.Burst ? InferenceDevice.ComputeShader : InferenceDevice.Burst; |
| agent.SetModel(behaviorParams.BehaviorName, behaviorParams.Model, otherDevice); |
|
|
| agent.AddReward(1.0f); |
|
|
| |
| yield return null; |
|
|
| Academy.Instance.EnvironmentStep(); |
|
|
| var actions = agent.GetStoredActionBuffers().DiscreteActions; |
| |
| Assert.AreEqual(new ActionSegment<int>(new[] { 0, 0 }), actions); |
| Assert.AreEqual(1, agent.numHeuristicCalls); |
|
|
| Academy.Instance.EnvironmentStep(); |
| Assert.AreEqual(1, agent.numHeuristicCalls); |
|
|
| Academy.Instance.EnvironmentStep(); |
| Assert.AreEqual(2, agent.numHeuristicCalls); |
| } |
| } |
| } |
|
|