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);
}
}