using System;
using System.Collections.Generic;
using UnityEngine;
using MLAgents.CommunicatorObjects;
namespace MLAgents
{
public struct EnvironmentResetParameters
{
///
/// Mapping of string : float which defines which parameters can be
/// reset from python.
///
public ResetParameters resetParameters;
///
/// The protobuf for custom reset parameters.
/// NOTE: This is the last remaining relic of gRPC protocol
/// that is left in our code. We need to decide how to handle this
/// moving forward.
///
public CustomResetParametersProto customResetParameters;
}
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 version;
///
/// The set of environment parameters defined by the user that will be sent to the communicator.
///
public EnvironmentResetParameters environmentResetParameters;
}
public struct UnityRLInitParameters
{
///
/// An RNG seed sent from the python process to Unity.
///
public int seed;
}
public struct UnityRLInputParameters
{
///
/// Boolean sent back from python to indicate whether or not training is happening.
///
public bool isTraining;
}
///
/// Delegate for handling quite events sent back from the communicator.
///
public delegate void QuitCommandHandler();
///
/// Delegate for handling reset parameter updates sent from the communicator.
///
///
public delegate void ResetCommandHandler(EnvironmentResetParameters resetParams);
///
/// Delegate to handle UnityRLInputParameters updates from the communicator.
///
///
public 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 : IBatchedDecisionMaker
{
///
/// Quit was received by the communicator.
///
event QuitCommandHandler QuitCommandReceived;
///
/// Reset command sent back from the communicator.
///
event ResetCommandHandler ResetCommandReceived;
///
/// Unity RL Input was received by the communicator.
///
event RLInputReceivedHandler RLInputReceived;
///
/// Sends the academy parameters through the Communicator.
/// Is used by the academy to send the AcademyParameters to the communicator.
///
/// The External Initialization Parameters received.
/// The Unity Initialization Parameters to be sent.
UnityRLInitParameters Initialize(CommunicatorInitParameters initParameters);
///
/// Registers a new Brain to the Communicator.
///
/// The name or key uniquely identifying the Brain
/// The Parameters for the Brain being registered
void SubscribeBrain(string name, BrainParameters brainParameters);
///
/// Gets the AgentActions based on the batching key.
///
/// A key to identify which actions to get
///
Dictionary GetActions(string key);
}
public interface IBatchedDecisionMaker : IDisposable
{
void PutObservations(string key, Agent agent);
void DecideBatch();
}
}