/// <inheritdoc/>
        protected override void OnMessageReceived(IncomingMessage msg)
        {
            Google.Protobuf.WellKnownTypes.Any anyMessage = null;
            try
            {
                anyMessage = Google.Protobuf.WellKnownTypes.Any.Parser.ParseFrom(msg.GetRawBytes());
            }
            catch (Google.Protobuf.InvalidProtocolBufferException)
            {
                // Bad message, nothing we can do about it, so just ignore.
                return;
            }

            if (anyMessage.Is(TrainingEnvironmentInitialized.Descriptor))
            {
                var envInitProto = anyMessage.Unpack <TrainingEnvironmentInitialized>();
                var envInitEvent = envInitProto.ToTrainingEnvironmentInitializedEvent();
                TrainingAnalytics.TrainingEnvironmentInitialized(envInitEvent);
            }
            else if (anyMessage.Is(TrainingBehaviorInitialized.Descriptor))
            {
                var behaviorInitProto     = anyMessage.Unpack <TrainingBehaviorInitialized>();
                var behaviorTrainingEvent = behaviorInitProto.ToTrainingBehaviorInitializedEvent();
                TrainingAnalytics.TrainingBehaviorInitialized(behaviorTrainingEvent);
            }
            // Don't do anything for unknown types, since the user probably can't do anything about it.
        }
        public void TestRemotePolicyEvent()
        {
            var behaviorName = "testBehavior";
            var sensor1      = new Test3DSensor("SensorA", 21, 20, 3);
            var sensor2      = new Test3DSensor("SensorB", 20, 22, 3);
            var sensors      = new List <ISensor> {
                sensor1, sensor2
            };

            var actionSpec = ActionSpec.MakeContinuous(2);

            var vectorActuator = new VectorActuator(null, actionSpec, "test'");
            var actuators      = new IActuator[] { vectorActuator };

            var remotePolicyEvent = TrainingAnalytics.GetEventForRemotePolicy(behaviorName, sensors, actionSpec, actuators);

            // The behavior name should be hashed, not pass-through.
            Assert.AreNotEqual(behaviorName, remotePolicyEvent.BehaviorName);

            Assert.AreEqual(2, remotePolicyEvent.ObservationSpecs.Count);
            Assert.AreEqual(3, remotePolicyEvent.ObservationSpecs[0].DimensionInfos.Length);
            Assert.AreEqual(20, remotePolicyEvent.ObservationSpecs[0].DimensionInfos[0].Size);
            Assert.AreEqual(0, remotePolicyEvent.ObservationSpecs[0].ObservationType);
            Assert.AreEqual("None", remotePolicyEvent.ObservationSpecs[0].CompressionType);
            Assert.AreEqual(Test3DSensor.k_BuiltInSensorType, remotePolicyEvent.ObservationSpecs[0].BuiltInSensorType);

            Assert.AreEqual(2, remotePolicyEvent.ActionSpec.NumContinuousActions);
            Assert.AreEqual(0, remotePolicyEvent.ActionSpec.NumDiscreteActions);

            Assert.AreEqual(2, remotePolicyEvent.ActuatorInfos[0].NumContinuousActions);
            Assert.AreEqual(0, remotePolicyEvent.ActuatorInfos[0].NumDiscreteActions);
        }
示例#3
0
        public override int GetHashCode()
        {
            int hash = 1;

            if (BaseRLCapabilities != false)
            {
                hash ^= BaseRLCapabilities.GetHashCode();
            }
            if (ConcatenatedPngObservations != false)
            {
                hash ^= ConcatenatedPngObservations.GetHashCode();
            }
            if (CompressedChannelMapping != false)
            {
                hash ^= CompressedChannelMapping.GetHashCode();
            }
            if (HybridActions != false)
            {
                hash ^= HybridActions.GetHashCode();
            }
            if (TrainingAnalytics != false)
            {
                hash ^= TrainingAnalytics.GetHashCode();
            }
            if (VariableLengthObservation != false)
            {
                hash ^= VariableLengthObservation.GetHashCode();
            }
            if (_unknownFields != null)
            {
                hash ^= _unknownFields.GetHashCode();
            }
            return(hash);
        }
        public void TestEnableAnalytics()
        {
#if UNITY_EDITOR && MLA_UNITY_ANALYTICS_MODULE
            Assert.IsTrue(EditorAnalytics.enabled == TrainingAnalytics.EnableAnalytics());
#else
            Assert.IsFalse(TrainingAnalytics.EnableAnalytics());
#endif
        }
        public string TestTrainingBehaviorInitialized(string stringToMaybeHash)
        {
            var tbiEvent = new TrainingBehaviorInitializedEvent();

            tbiEvent.BehaviorName = stringToMaybeHash;
            tbiEvent.Config       = "{}";

            var sanitizedEvent = TrainingAnalytics.SanitizeTrainingBehaviorInitializedEvent(tbiEvent);

            return(sanitizedEvent.BehaviorName);
        }
 void SendAnalytics(IList <ISensor> sensors)
 {
     if (!m_AnalyticsSent)
     {
         m_AnalyticsSent = true;
         TrainingAnalytics.RemotePolicyInitialized(
             m_FullyQualifiedBehaviorName,
             sensors,
             m_ActionSpec,
             m_Actuators
             );
     }
 }
示例#7
0
 /// <inheritdoc />
 public void RequestDecision(AgentInfo info, List <ISensor> sensors)
 {
     if (!m_AnalyticsSent)
     {
         m_AnalyticsSent = true;
         TrainingAnalytics.RemotePolicyInitialized(
             m_FullyQualifiedBehaviorName,
             sensors,
             m_ActionSpec
             );
     }
     m_AgentId = info.episodeId;
     m_Communicator?.PutObservations(m_FullyQualifiedBehaviorName, info, sensors);
 }
示例#8
0
        /// <summary>
        /// Sends the initialization parameters through the Communicator.
        /// Is used by the academy to send initialization parameters 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>
        public bool Initialize(CommunicatorInitParameters initParameters, out UnityRLInitParameters initParametersOut)
        {
#if MLA_SUPPORTED_TRAINING_PLATFORM
            var academyParameters = new UnityRLInitializationOutputProto
            {
                Name                 = initParameters.name,
                PackageVersion       = initParameters.unityPackageVersion,
                CommunicationVersion = initParameters.unityCommunicationVersion,
                Capabilities         = initParameters.CSharpCapabilities.ToProto()
            };

            UnityInputProto input;
            UnityInputProto initializationInput;
            try
            {
                initializationInput = Initialize(
                    initParameters.port,
                    new UnityOutputProto
                {
                    RlInitializationOutput = academyParameters
                },
                    out input
                    );
            }
            catch (Exception ex)
            {
                if (ex is RpcException rpcException)
                {
                    switch (rpcException.Status.StatusCode)
                    {
                    case StatusCode.Unavailable:
                        // This is the common case where there's no trainer to connect to.
                        break;

                    case StatusCode.DeadlineExceeded:
                        // We don't currently set a deadline for connection, but likely will in the future.
                        break;

                    default:
                        Debug.Log($"Unexpected gRPC exception when trying to initialize communication: {rpcException}");
                        break;
                    }
                }
                else
                {
                    Debug.Log($"Unexpected exception when trying to initialize communication: {ex}");
                }
                initParametersOut = new UnityRLInitParameters();
                m_Channel.ShutdownAsync().Wait();
                return(false);
            }

            var pythonPackageVersion       = initializationInput.RlInitializationInput.PackageVersion;
            var pythonCommunicationVersion = initializationInput.RlInitializationInput.CommunicationVersion;
            TrainingAnalytics.SetTrainerInformation(pythonPackageVersion, pythonCommunicationVersion);

            var communicationIsCompatible = CheckCommunicationVersionsAreCompatible(
                initParameters.unityCommunicationVersion,
                pythonCommunicationVersion
                );

            // Initialization succeeded part-way. The most likely cause is a mismatch between the communicator
            // API strings, so log an explicit warning if that's the case.
            if (initializationInput != null && input == null)
            {
                if (!communicationIsCompatible)
                {
                    Debug.LogWarningFormat(
                        "Communication protocol between python ({0}) and Unity ({1}) have different " +
                        "versions which make them incompatible. Python library version: {2}.",
                        pythonCommunicationVersion, initParameters.unityCommunicationVersion,
                        pythonPackageVersion
                        );
                }
                else
                {
                    Debug.LogWarningFormat(
                        "Unknown communication error between Python. Python communication protocol: {0}, " +
                        "Python library version: {1}.",
                        pythonCommunicationVersion,
                        pythonPackageVersion
                        );
                }

                initParametersOut = new UnityRLInitParameters();
                return(false);
            }

            UpdateEnvironmentWithInput(input.RlInput);
            initParametersOut = initializationInput.RlInitializationInput.ToUnityRLInitParameters();
            // Be sure to shut down the grpc channel when the application is quitting.
            Application.quitting += NotifyQuitAndShutDownChannel;
            return(true);
#else
            initParametersOut = new UnityRLInitParameters();
            return(false);
#endif
        }
 public string TestParseBehaviorName(string fullyQualifiedBehaviorName)
 {
     return(TrainingAnalytics.ParseBehaviorName(fullyQualifiedBehaviorName));
 }
示例#10
0
        public UnityRLInitParameters Initialize(CommunicatorInitParameters initParameters)
        {
            var academyParameters = new UnityRLInitializationOutputProto
            {
                Name                 = initParameters.name,
                PackageVersion       = initParameters.unityPackageVersion,
                CommunicationVersion = initParameters.unityCommunicationVersion,
                Capabilities         = initParameters.CSharpCapabilities.ToProto()
            };

            UnityInputProto input;
            UnityInputProto initializationInput;

            try
            {
                initializationInput = Initialize(
                    new UnityOutputProto
                {
                    RlInitializationOutput = academyParameters
                },
                    out input);

                var pythonPackageVersion       = initializationInput.RlInitializationInput.PackageVersion;
                var pythonCommunicationVersion = initializationInput.RlInitializationInput.CommunicationVersion;
                var unityCommunicationVersion  = initParameters.unityCommunicationVersion;

                TrainingAnalytics.SetTrainerInformation(pythonPackageVersion, pythonCommunicationVersion);

                var communicationIsCompatible = CheckCommunicationVersionsAreCompatible(unityCommunicationVersion,
                                                                                        pythonCommunicationVersion,
                                                                                        pythonPackageVersion);

                // Initialization succeeded part-way. The most likely cause is a mismatch between the communicator
                // API strings, so log an explicit warning if that's the case.
                if (initializationInput != null && input == null)
                {
                    if (!communicationIsCompatible)
                    {
                        Debug.LogWarningFormat(
                            "Communication protocol between python ({0}) and Unity ({1}) have different " +
                            "versions which make them incompatible. Python library version: {2}.",
                            pythonCommunicationVersion, initParameters.unityCommunicationVersion,
                            pythonPackageVersion
                            );
                    }
                    else
                    {
                        Debug.LogWarningFormat(
                            "Unknown communication error between Python. Python communication protocol: {0}, " +
                            "Python library version: {1}.",
                            pythonCommunicationVersion,
                            pythonPackageVersion
                            );
                    }

                    throw new UnityAgentsException("ICommunicator.Initialize() failed.");
                }
            }
            catch
            {
                var exceptionMessage = "The Communicator was unable to connect. Please make sure the External " +
                                       "process is ready to accept communication with Unity.";

                // Check for common error condition and add details to the exception message.
                var httpProxy  = Environment.GetEnvironmentVariable("HTTP_PROXY");
                var httpsProxy = Environment.GetEnvironmentVariable("HTTPS_PROXY");
                if (httpProxy != null || httpsProxy != null)
                {
                    exceptionMessage += " Try removing HTTP_PROXY and HTTPS_PROXY from the" +
                                        "environment variables and try again.";
                }
                throw new UnityAgentsException(exceptionMessage);
            }

            UpdateEnvironmentWithInput(input.RlInput);
            return(initializationInput.RlInitializationInput.ToUnityRLInitParameters());
        }