using Barracuda; using System; using UnityEngine; using UnityEngine.Serialization; namespace MLAgents.Policies { /// /// Defines what type of behavior the Agent will be using /// [Serializable] public enum BehaviorType { /// /// The Agent will use the remote process for decision making. /// if unavailable, will use inference and if no model is provided, will use /// the heuristic. /// Default, /// /// The Agent will always use its heuristic /// HeuristicOnly, /// /// The Agent will always use inference with the provided /// neural network model. /// InferenceOnly } /// /// The Factory to generate policies. /// [AddComponentMenu("ML Agents/Behavior Parameters", (int)MenuGroup.Default)] public class BehaviorParameters : MonoBehaviour { [HideInInspector, SerializeField] BrainParameters m_BrainParameters = new BrainParameters(); /// /// The associated for this behavior. /// public BrainParameters brainParameters { get { return m_BrainParameters; } internal set { m_BrainParameters = value; } } [HideInInspector, SerializeField] NNModel m_Model; /// /// The neural network model used when in inference mode. /// This cannot be set directly; use /// to set it. /// public NNModel model { get { return m_Model; } internal set { m_Model = value; } } [HideInInspector, SerializeField] InferenceDevice m_InferenceDevice; /// /// How inference is performed for this Agent's model. /// This cannot be set directly; use /// to set it. /// public InferenceDevice inferenceDevice { get { return m_InferenceDevice; } internal set { m_InferenceDevice = value; } } [HideInInspector, SerializeField] BehaviorType m_BehaviorType; /// /// The BehaviorType for the Agent. /// This cannot be set directly; use /// to set it. /// public BehaviorType behaviorType { get { return m_BehaviorType; } internal set { m_BehaviorType = value; } } [HideInInspector, SerializeField] string m_BehaviorName = "My Behavior"; /// /// The name of this behavior, which is used as a base name. See /// for the full name. /// This cannot be set directly; use /// to set it. /// public string behaviorName { get { return m_BehaviorName; } internal set { m_BehaviorName = value; } } /// /// The team ID for this behavior. /// [HideInInspector, SerializeField, FormerlySerializedAs("m_TeamID")] public int TeamId; // TODO properties here instead of Agent [FormerlySerializedAs("m_useChildSensors")] [HideInInspector] [SerializeField] [Tooltip("Use all Sensor components attached to child GameObjects of this Agent.")] bool m_UseChildSensors = true; /// /// Whether or not to use all the sensor components attached to child GameObjects of the agent. /// public bool useChildSensors { get { return m_UseChildSensors; } internal set { m_UseChildSensors = value; } // TODO make public, don't allow changes at runtime } /// /// Returns the behavior name, concatenated with any other metadata (i.e. team id). /// public string fullyQualifiedBehaviorName { get { return m_BehaviorName + "?team=" + TeamId; } } internal IPolicy GeneratePolicy(Func heuristic) { switch (m_BehaviorType) { case BehaviorType.HeuristicOnly: return new HeuristicPolicy(heuristic); case BehaviorType.InferenceOnly: return new BarracudaPolicy(m_BrainParameters, m_Model, m_InferenceDevice); case BehaviorType.Default: if (Academy.Instance.IsCommunicatorOn) { return new RemotePolicy(m_BrainParameters, fullyQualifiedBehaviorName); } if (m_Model != null) { return new BarracudaPolicy(m_BrainParameters, m_Model, m_InferenceDevice); } else { return new HeuristicPolicy(heuristic); } default: return new HeuristicPolicy(heuristic); } } } }