using System; using System.Collections.Generic; using Unity.MLAgents.Actuators; using Unity.MLAgents.Sensors; namespace Unity.MLAgents { /// /// Communicator initialization parameters. /// public struct CommunicatorInitParameters { /// /// Port to listen for connections on. /// public int port; /// /// The name of the environment. /// public string name; /// /// The version of the Unity SDK. /// public string unityPackageVersion; /// /// The version of the communication API. /// public string unityCommunicationVersion; /// /// The RL capabilities of the C# codebase. /// public UnityRLCapabilities CSharpCapabilities; } /// /// Initialization parameters for the Unity environment. /// public struct UnityRLInitParameters { /// /// A random number generator (RNG) seed sent from the python process to Unity. /// public int seed; /// /// The number of areas to replicate if Training Area Replication is used in the scene. /// public int numAreas; /// /// The library version of the python process. /// public string pythonLibraryVersion; /// /// The version of the communication API that python is using. /// public string pythonCommunicationVersion; /// /// The RL capabilities of the Trainer codebase. /// public UnityRLCapabilities TrainerCapabilities; } internal struct UnityRLInputParameters { /// /// Boolean sent back from python to indicate whether or not training is happening. /// public bool isTraining; } /// /// Delegate for handling quit events sent back from the communicator. /// public delegate void QuitCommandHandler(); /// /// Delegate for handling reset parameter updates sent from the communicator. /// public delegate void ResetCommandHandler(); /// /// Delegate to handle UnityRLInputParameters updates from the communicator. /// /// internal delegate void RLInputReceivedHandler(UnityRLInputParameters inputParams); /// /// This is the interface of the Communicators. /// This does not need to be modified nor implemented to create a Unity environment. /// /// When the Unity Communicator is initialized, it will wait for the External Communicator /// to be initialized as well. The two communicators will then exchange their first messages /// that will usually contain information for initialization (information that does not need /// to be resent at each new exchange). /// /// By convention a Unity input is from External to Unity and a Unity output is from Unity to /// External. Inputs and outputs are relative to Unity. /// /// By convention, when the Unity Communicator and External Communicator call exchange, the /// exchange is NOT simultaneous but sequential. This means that when a side of the /// communication calls exchange, the other will receive the result of its previous /// xchange call. /// This is what happens when A calls exchange a single time: /// A sends data_1 to B -> B receives data_1 -> B generates and sends data_2 -> A receives data_2 /// When A calls exchange, it sends data_1 and receives data_2 /// /// Since the messages are sent back and forth with exchange and simultaneously when calling /// initialize, External sends two messages at initialization. /// /// The structure of the messages is as follows: /// UnityMessage /// ...Header /// ...UnityOutput /// ......UnityRLOutput /// ......UnityRLInitializationOutput /// ...UnityInput /// ......UnityRLInput /// ......UnityRLInitializationInput /// /// UnityOutput and UnityInput can be extended to provide functionalities beyond RL /// UnityRLOutput and UnityRLInput can be extended to provide new RL functionalities /// /// public interface ICommunicator : IDisposable { /// /// Quit was received by the communicator. /// event QuitCommandHandler QuitCommandReceived; /// /// Reset command sent back from the communicator. /// event ResetCommandHandler ResetCommandReceived; /// /// Sends the academy parameters through the Communicator. /// Is used by the academy to send the AcademyParameters to the communicator. /// /// Whether the connection was successful. /// The Unity Initialization Parameters to be sent. /// The External Initialization Parameters received bool Initialize(CommunicatorInitParameters initParameters, out UnityRLInitParameters initParametersOut); /// /// Registers a new Brain to the Communicator. /// /// The name or key uniquely identifying the Brain. /// Description of the actions for the Agent. void SubscribeBrain(string name, ActionSpec actionSpec); /// /// Sends the observations of one Agent. /// /// Batch Key. /// Agent info. /// The list of ISensors of the Agent. void PutObservations(string brainKey, AgentInfo info, List sensors); /// /// Signals the ICommunicator that the Agents are now ready to receive their action /// and that if the communicator has not yet received an action for one of the Agents /// it needs to get one at this point. /// void DecideBatch(); /// /// Gets the AgentActions based on the batching key. /// /// A key to identify which behavior actions to get. /// A key to identify which Agent actions to get. /// `ActionBuffers` corresponding to the input key. ActionBuffers GetActions(string key, int agentId); } }