using Barracuda;
using System;
using UnityEngine;
using UnityEngine.Serialization;
namespace MLAgents.Policies
{
///
/// The Factory to generate policies.
///
[AddComponentMenu("ML Agents/Behavior Parameters", (int)MenuGroup.Default)]
internal class BehaviorParameters : MonoBehaviour
{
[Serializable]
enum BehaviorType
{
Default,
HeuristicOnly,
InferenceOnly
}
[HideInInspector]
[SerializeField]
BrainParameters m_BrainParameters = new BrainParameters();
[HideInInspector]
[SerializeField]
NNModel m_Model;
[HideInInspector]
[SerializeField]
InferenceDevice m_InferenceDevice;
[HideInInspector]
[SerializeField]
// Disable warning /com.unity.ml-agents/Runtime/Policy/BehaviorParameters.cs(...):
// warning CS0649: Field 'BehaviorParameters.m_BehaviorType' is never assigned to,
// and will always have its default value
// This field is set in the custom editor.
#pragma warning disable 0649
BehaviorType m_BehaviorType;
#pragma warning restore 0649
[HideInInspector]
[SerializeField]
string m_BehaviorName = "My Behavior";
///
/// The team ID for this behavior.
///
[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;
///
/// The associated for this behavior.
///
internal BrainParameters brainParameters
{
get { return m_BrainParameters; }
}
///
/// Whether or not to use all the sensor components attached to child GameObjects of the agent.
///
public bool useChildSensors
{
get { return m_UseChildSensors; }
}
///
/// The name of this behavior, which is used as a base name. See
/// for the full name.
///
public string behaviorName
{
get { return m_BehaviorName; }
}
///
/// Returns the behavior name, concatenated with any other metadata (i.e. team id).
///
public string fullyQualifiedBehaviorName
{
get { return m_BehaviorName + "?team=" + TeamId; }
}
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 (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);
}
}
///
/// Updates the model and related details for this behavior.
///
/// New name for the behavior.
/// New neural network model for this behavior.
/// New inference device for this behavior.
public void GiveModel(
string newBehaviorName,
NNModel model,
InferenceDevice inferenceDevice = InferenceDevice.CPU)
{
m_Model = model;
m_InferenceDevice = inferenceDevice;
m_BehaviorName = newBehaviorName;
}
}
}