|
using Unity.Barracuda; |
|
using System; |
|
using UnityEngine; |
|
using UnityEngine.Serialization; |
|
using Unity.MLAgents.Actuators; |
|
using Unity.MLAgents.Sensors.Reflection; |
|
|
|
namespace Unity.MLAgents.Policies |
|
{ |
|
|
|
|
|
|
|
[Serializable] |
|
public enum BehaviorType |
|
{ |
|
|
|
|
|
|
|
|
|
|
|
Default, |
|
|
|
|
|
|
|
|
|
HeuristicOnly, |
|
|
|
|
|
|
|
|
|
|
|
InferenceOnly |
|
} |
|
|
|
|
|
|
|
|
|
public enum ObservableAttributeOptions |
|
{ |
|
|
|
|
|
|
|
|
|
|
|
Ignore, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ExcludeInherited, |
|
|
|
|
|
|
|
|
|
|
|
ExamineAll |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
[AddComponentMenu("ML Agents/Behavior Parameters", (int)MenuGroup.Default)] |
|
public class BehaviorParameters : MonoBehaviour |
|
{ |
|
[HideInInspector, SerializeField] |
|
BrainParameters m_BrainParameters = new BrainParameters(); |
|
|
|
|
|
|
|
|
|
|
|
public delegate void PolicyUpdated(bool isInHeuristicMode); |
|
|
|
|
|
|
|
|
|
internal event PolicyUpdated OnPolicyUpdated; |
|
|
|
|
|
|
|
|
|
public BrainParameters BrainParameters |
|
{ |
|
get { return m_BrainParameters; } |
|
internal set { m_BrainParameters = value; } |
|
} |
|
|
|
[HideInInspector, SerializeField] |
|
NNModel m_Model; |
|
|
|
|
|
|
|
|
|
|
|
|
|
public NNModel Model |
|
{ |
|
get { return m_Model; } |
|
set { m_Model = value; UpdateAgentPolicy(); } |
|
} |
|
|
|
[HideInInspector, SerializeField] |
|
InferenceDevice m_InferenceDevice = InferenceDevice.Default; |
|
|
|
|
|
|
|
|
|
|
|
|
|
public InferenceDevice InferenceDevice |
|
{ |
|
get { return m_InferenceDevice; } |
|
set { m_InferenceDevice = value; UpdateAgentPolicy(); } |
|
} |
|
|
|
[HideInInspector, SerializeField] |
|
BehaviorType m_BehaviorType; |
|
|
|
|
|
|
|
|
|
public BehaviorType BehaviorType |
|
{ |
|
get { return m_BehaviorType; } |
|
set { m_BehaviorType = value; UpdateAgentPolicy(); } |
|
} |
|
|
|
[HideInInspector, SerializeField] |
|
string m_BehaviorName = "My Behavior"; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public string BehaviorName |
|
{ |
|
get { return m_BehaviorName; } |
|
set { m_BehaviorName = value; UpdateAgentPolicy(); } |
|
} |
|
|
|
|
|
|
|
|
|
[HideInInspector, SerializeField, FormerlySerializedAs("m_TeamID")] |
|
public int TeamId; |
|
|
|
|
|
[FormerlySerializedAs("m_useChildSensors")] |
|
[HideInInspector] |
|
[SerializeField] |
|
[Tooltip("Use all Sensor components attached to child GameObjects of this Agent.")] |
|
bool m_UseChildSensors = true; |
|
|
|
[HideInInspector] |
|
[SerializeField] |
|
[Tooltip("Use all Actuator components attached to child GameObjects of this Agent.")] |
|
bool m_UseChildActuators = true; |
|
|
|
|
|
|
|
|
|
|
|
public bool UseChildSensors |
|
{ |
|
get { return m_UseChildSensors; } |
|
set { m_UseChildSensors = value; } |
|
} |
|
|
|
[HideInInspector] |
|
[SerializeField] |
|
[Tooltip("Set action selection to deterministic, Only applies to inference from within unity.")] |
|
private bool m_DeterministicInference = false; |
|
|
|
|
|
|
|
|
|
public bool DeterministicInference |
|
{ |
|
get { return m_DeterministicInference; } |
|
set { m_DeterministicInference = value; } |
|
} |
|
|
|
|
|
|
|
|
|
|
|
public bool UseChildActuators |
|
{ |
|
get { return m_UseChildActuators; } |
|
set { m_UseChildActuators = value; } |
|
} |
|
|
|
[HideInInspector, SerializeField] |
|
ObservableAttributeOptions m_ObservableAttributeHandling = ObservableAttributeOptions.Ignore; |
|
|
|
|
|
|
|
|
|
public ObservableAttributeOptions ObservableAttributeHandling |
|
{ |
|
get { return m_ObservableAttributeHandling; } |
|
set { m_ObservableAttributeHandling = value; } |
|
} |
|
|
|
|
|
|
|
|
|
public string FullyQualifiedBehaviorName |
|
{ |
|
get { return m_BehaviorName + "?team=" + TeamId; } |
|
} |
|
|
|
void Awake() |
|
{ |
|
OnPolicyUpdated += mode => { }; |
|
} |
|
|
|
internal IPolicy GeneratePolicy(ActionSpec actionSpec, ActuatorManager actuatorManager) |
|
{ |
|
switch (m_BehaviorType) |
|
{ |
|
case BehaviorType.HeuristicOnly: |
|
return new HeuristicPolicy(actuatorManager, actionSpec); |
|
case BehaviorType.InferenceOnly: |
|
{ |
|
if (m_Model == null) |
|
{ |
|
var behaviorType = BehaviorType.InferenceOnly.ToString(); |
|
throw new UnityAgentsException( |
|
$"Can't use Behavior Type {behaviorType} without a model. " + |
|
"Either assign a model, or change to a different Behavior Type." |
|
); |
|
} |
|
return new BarracudaPolicy(actionSpec, actuatorManager, m_Model, m_InferenceDevice, m_BehaviorName, m_DeterministicInference); |
|
} |
|
case BehaviorType.Default: |
|
if (Academy.Instance.IsCommunicatorOn) |
|
{ |
|
return new RemotePolicy(actionSpec, actuatorManager, FullyQualifiedBehaviorName); |
|
} |
|
if (m_Model != null) |
|
{ |
|
return new BarracudaPolicy(actionSpec, actuatorManager, m_Model, m_InferenceDevice, m_BehaviorName, m_DeterministicInference); |
|
} |
|
else |
|
{ |
|
return new HeuristicPolicy(actuatorManager, actionSpec); |
|
} |
|
default: |
|
return new HeuristicPolicy(actuatorManager, actionSpec); |
|
} |
|
} |
|
|
|
|
|
|
|
|
|
|
|
public bool IsInHeuristicMode() |
|
{ |
|
if (BehaviorType == BehaviorType.HeuristicOnly) |
|
{ |
|
return true; |
|
} |
|
|
|
return BehaviorType == BehaviorType.Default && |
|
ReferenceEquals(Model, null) && |
|
(!Academy.IsInitialized || |
|
Academy.IsInitialized && |
|
!Academy.Instance.IsCommunicatorOn); |
|
} |
|
|
|
internal void UpdateAgentPolicy() |
|
{ |
|
var agent = GetComponent<Agent>(); |
|
if (agent == null) |
|
{ |
|
return; |
|
} |
|
agent.ReloadPolicy(); |
|
OnPolicyUpdated?.Invoke(IsInHeuristicMode()); |
|
} |
|
} |
|
} |
|
|