| using System.Collections.Generic; |
| using System.Diagnostics; |
| using Unity.MLAgents.Actuators; |
| using Unity.MLAgents.Sensors; |
| using Unity.MLAgents.Analytics; |
|
|
|
|
| namespace Unity.MLAgents.Policies |
| { |
| |
| |
| |
| |
| internal class RemotePolicy : IPolicy |
| { |
| int m_AgentId; |
| string m_FullyQualifiedBehaviorName; |
| ActionSpec m_ActionSpec; |
| ActionBuffers m_LastActionBuffer; |
| bool m_AnalyticsSent; |
|
|
| internal ICommunicator m_Communicator; |
|
|
| |
| |
| |
| private IList<IActuator> m_Actuators; |
|
|
| public RemotePolicy( |
| ActionSpec actionSpec, |
| IList<IActuator> actuators, |
| string fullyQualifiedBehaviorName) |
| { |
| m_FullyQualifiedBehaviorName = fullyQualifiedBehaviorName; |
| m_Communicator = Academy.Instance.Communicator; |
| m_Communicator?.SubscribeBrain(m_FullyQualifiedBehaviorName, actionSpec); |
| m_ActionSpec = actionSpec; |
| m_Actuators = actuators; |
| } |
|
|
| |
| public void RequestDecision(AgentInfo info, List<ISensor> sensors) |
| { |
| SendAnalytics(sensors); |
| m_AgentId = info.episodeId; |
| m_Communicator?.PutObservations(m_FullyQualifiedBehaviorName, info, sensors); |
| } |
|
|
| [Conditional("MLA_UNITY_ANALYTICS_MODULE")] |
| void SendAnalytics(IList<ISensor> sensors) |
| { |
| if (!m_AnalyticsSent) |
| { |
| m_AnalyticsSent = true; |
| TrainingAnalytics.RemotePolicyInitialized( |
| m_FullyQualifiedBehaviorName, |
| sensors, |
| m_ActionSpec, |
| m_Actuators |
| ); |
| } |
| } |
|
|
| |
| public ref readonly ActionBuffers DecideAction() |
| { |
| m_Communicator?.DecideBatch(); |
| var actions = m_Communicator?.GetActions(m_FullyQualifiedBehaviorName, m_AgentId); |
| m_LastActionBuffer = actions == null ? ActionBuffers.Empty : (ActionBuffers)actions; |
| return ref m_LastActionBuffer; |
| } |
|
|
| public void Dispose() |
| { |
| } |
| } |
| } |
|
|