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