using System; | |
using System.Collections.Generic; | |
using Unity.MLAgents.Actuators; | |
using Unity.MLAgents.Sensors; | |
namespace Unity.MLAgents | |
{ | |
public struct CommunicatorInitParameters | |
{ | |
/// <summary> | |
/// Port to listen for connections on. | |
/// </summary> | |
public int port; | |
/// <summary> | |
/// The name of the environment. | |
/// </summary> | |
public string name; | |
/// <summary> | |
/// The version of the Unity SDK. | |
/// </summary> | |
public string unityPackageVersion; | |
/// <summary> | |
/// The version of the communication API. | |
/// </summary> | |
public string unityCommunicationVersion; | |
/// <summary> | |
/// The RL capabilities of the C# codebase. | |
/// </summary> | |
public UnityRLCapabilities CSharpCapabilities; | |
} | |
public struct UnityRLInitParameters | |
{ | |
/// <summary> | |
/// A random number generator (RNG) seed sent from the python process to Unity. | |
/// </summary> | |
public int seed; | |
/// <summary> | |
/// The number of areas to replicate if Training Area Replication is used in the scene. | |
/// </summary> | |
public int numAreas; | |
/// <summary> | |
/// The library version of the python process. | |
/// </summary> | |
public string pythonLibraryVersion; | |
/// <summary> | |
/// The version of the communication API that python is using. | |
/// </summary> | |
public string pythonCommunicationVersion; | |
/// <summary> | |
/// The RL capabilities of the Trainer codebase. | |
/// </summary> | |
public UnityRLCapabilities TrainerCapabilities; | |
} | |
internal struct UnityRLInputParameters | |
{ | |
/// <summary> | |
/// Boolean sent back from python to indicate whether or not training is happening. | |
/// </summary> | |
public bool isTraining; | |
} | |
/// <summary> | |
/// Delegate for handling quit events sent back from the communicator. | |
/// </summary> | |
public delegate void QuitCommandHandler(); | |
/// <summary> | |
/// Delegate for handling reset parameter updates sent from the communicator. | |
/// </summary> | |
public delegate void ResetCommandHandler(); | |
/// <summary> | |
/// Delegate to handle UnityRLInputParameters updates from the communicator. | |
/// </summary> | |
/// <param name="inputParams"></param> | |
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 | |
exchange 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 | |
{ | |
/// <summary> | |
/// Quit was received by the communicator. | |
/// </summary> | |
event QuitCommandHandler QuitCommandReceived; | |
/// <summary> | |
/// Reset command sent back from the communicator. | |
/// </summary> | |
event ResetCommandHandler ResetCommandReceived; | |
/// <summary> | |
/// Sends the academy parameters through the Communicator. | |
/// Is used by the academy to send the AcademyParameters to the communicator. | |
/// </summary> | |
/// <returns>Whether the connection was successful.</returns> | |
/// <param name="initParameters">The Unity Initialization Parameters to be sent.</param> | |
/// <param name="initParametersOut">The External Initialization Parameters received</param> | |
bool Initialize(CommunicatorInitParameters initParameters, out UnityRLInitParameters initParametersOut); | |
/// <summary> | |
/// Registers a new Brain to the Communicator. | |
/// </summary> | |
/// <param name="name">The name or key uniquely identifying the Brain.</param> | |
/// <param name="actionSpec"> Description of the actions for the Agent.</param> | |
void SubscribeBrain(string name, ActionSpec actionSpec); | |
/// <summary> | |
/// Sends the observations of one Agent. | |
/// </summary> | |
/// <param name="brainKey">Batch Key.</param> | |
/// <param name="info">Agent info.</param> | |
/// <param name="sensors">The list of ISensors of the Agent.</param> | |
void PutObservations(string brainKey, AgentInfo info, List<ISensor> sensors); | |
/// <summary> | |
/// 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. | |
/// </summary> | |
void DecideBatch(); | |
/// <summary> | |
/// Gets the AgentActions based on the batching key. | |
/// </summary> | |
/// <param name="key">A key to identify which behavior actions to get.</param> | |
/// <param name="agentId">A key to identify which Agent actions to get.</param> | |
/// <returns></returns> | |
ActionBuffers GetActions(string key, int agentId); | |
} | |
} | |