using Barracuda; using System; using UnityEngine; namespace MLAgents { /// /// The Factory to generate policies. /// public class BehaviorParameters : MonoBehaviour { [Serializable] private enum BehaviorType { Default, HeuristicOnly, InferenceOnly } [HideInInspector] [SerializeField] BrainParameters m_BrainParameters = new BrainParameters(); [HideInInspector] [SerializeField] NNModel m_Model; [HideInInspector] [SerializeField] InferenceDevice m_InferenceDevice; [HideInInspector] [SerializeField] BehaviorType m_BehaviorType; [HideInInspector] [SerializeField] string m_BehaviorName = "My Behavior"; public BrainParameters brainParameters { get { return m_BrainParameters; } } public string behaviorName { get { return m_BehaviorName; } } public 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 (FindObjectOfType().IsCommunicatorOn) { return new RemotePolicy(m_BrainParameters, m_BehaviorName); } if (m_Model != null) { return new BarracudaPolicy(m_BrainParameters, m_Model, m_InferenceDevice); } else { return new HeuristicPolicy(heuristic); } default: return new HeuristicPolicy(heuristic); } } public void GiveModel( string behaviorName, NNModel model, InferenceDevice inferenceDevice = InferenceDevice.CPU) { m_Model = model; m_InferenceDevice = inferenceDevice; m_BehaviorName = behaviorName; } } }