/// <summary> /// Performs a single environment update to the Academy, Brain and Agent /// objects within the environment. /// </summary> void EnvironmentStep() { if (m_ModeSwitched) { ConfigureEnvironment(); m_ModeSwitched = false; } if ((m_IsCommunicatorOn) && (m_LastCommunicatorMessageNumber != m_BrainBatcher.GetNumberMessageReceived())) { m_LastCommunicatorMessageNumber = m_BrainBatcher.GetNumberMessageReceived(); if (m_BrainBatcher.GetCommand() == CommunicatorObjects.CommandProto.Reset) { UpdateResetParameters(); SetIsInference(!m_BrainBatcher.GetIsTraining()); ForcedFullReset(); } if (m_BrainBatcher.GetCommand() == CommunicatorObjects.CommandProto.Quit) { #if UNITY_EDITOR EditorApplication.isPlaying = false; #endif Application.Quit(); return; } } else if (!m_FirstAcademyReset) { UpdateResetParameters(); ForcedFullReset(); } AgentSetStatus(m_StepCount); AgentResetIfDone(); AgentSendState(); BrainDecideAction(); AcademyStep(); AgentAct(); m_StepCount += 1; m_TotalStepCount += 1; }
/// <summary> /// Performs a single environment update to the Academy, Brain and Agent /// objects within the environment. /// </summary> void EnvironmentStep() { if (modeSwitched) { ConfigureEnvironment(); modeSwitched = false; } if ((isCommunicatorOn) && (lastCommunicatorMessageNumber != brainBatcher.GetNumberMessageReceived())) { lastCommunicatorMessageNumber = brainBatcher.GetNumberMessageReceived(); if (brainBatcher.GetCommand() == CommandProto.Reset) { // Update reset parameters. var newResetParameters = brainBatcher.GetEnvironmentParameters(); if (newResetParameters != null) { foreach (var kv in newResetParameters.FloatParameters) { resetParameters[kv.Key] = kv.Value; } } SetIsInference(!brainBatcher.GetIsTraining()); ForcedFullReset(); } if (brainBatcher.GetCommand() == CommandProto.Quit) { #if UNITY_EDITOR EditorApplication.isPlaying = false; #endif Application.Quit(); return; } } else if (!firstAcademyReset) { ForcedFullReset(); } if ((stepCount >= maxSteps) && maxSteps > 0) { maxStepReached = true; Done(); } AgentSetStatus(maxStepReached, done, stepCount); brainBatcher.RegisterAcademyDoneFlag(done); if (done) { EnvironmentReset(); } AgentResetIfDone(); AgentSendState(); BrainDecideAction(); AcademyStep(); AgentAct(); stepCount += 1; }
/// <summary> /// Initializes the environment, configures it and initialized the Academy. /// </summary> private void InitializeEnvironment() { m_OriginalGravity = Physics.gravity; m_OriginalFixedDeltaTime = Time.fixedDeltaTime; m_OriginalMaximumDeltaTime = Time.maximumDeltaTime; InitializeAcademy(); ICommunicator communicator; var exposedBrains = broadcastHub.broadcastingBrains.Where(x => x != null).ToList(); var controlledBrains = broadcastHub.broadcastingBrains.Where( x => x != null && x is LearningBrain && broadcastHub.IsControlled(x)); foreach (var brain1 in controlledBrains) { var brain = (LearningBrain)brain1; brain.SetToControlledExternally(); } // Try to launch the communicator by usig the arguments passed at launch try { communicator = new RpcCommunicator( new CommunicatorParameters { port = ReadArgs() }); } // If it fails, we check if there are any external brains in the scene // If there are : Launch the communicator on the default port // If there arn't, there is no need for a communicator and it is set // to null catch { communicator = null; if (controlledBrains.ToList().Count > 0) { communicator = new RpcCommunicator( new CommunicatorParameters { port = 5005 }); } } m_BrainBatcher = new Batcher(communicator); foreach (var trainingBrain in exposedBrains) { trainingBrain.SetBatcher(m_BrainBatcher); } if (communicator != null) { m_IsCommunicatorOn = true; var academyParameters = new CommunicatorObjects.UnityRLInitializationOutput(); academyParameters.Name = gameObject.name; academyParameters.Version = k_KApiVersion; foreach (var brain in exposedBrains) { var bp = brain.brainParameters; academyParameters.BrainParameters.Add( bp.ToProto(brain.name, broadcastHub.IsControlled(brain))); } academyParameters.EnvironmentParameters = new CommunicatorObjects.EnvironmentParametersProto(); foreach (var key in resetParameters.Keys) { academyParameters.EnvironmentParameters.FloatParameters.Add( key, resetParameters[key] ); } var pythonParameters = m_BrainBatcher.SendAcademyParameters(academyParameters); Random.InitState(pythonParameters.Seed); } // If a communicator is enabled/provided, then we assume we are in // training mode. In the absence of a communicator, we assume we are // in inference mode. m_IsInference = !m_IsCommunicatorOn; BrainDecideAction += () => { }; DestroyAction += () => { }; AgentSetStatus += (i) => { }; AgentResetIfDone += () => { }; AgentSendState += () => { }; AgentAct += () => { }; AgentForceReset += () => { }; // Configure the environment using the configurations provided by // the developer in the Editor. SetIsInference(!m_BrainBatcher.GetIsTraining()); ConfigureEnvironment(); }
/// <summary> /// Initializes the environment, configures it and initialized the Academy. /// </summary> private void InitializeEnvironment() { // Retrieve Brain and initialize Academy var brains = GetBrains(gameObject); InitializeAcademy(); Communicator communicator = null; // Try to launch the communicator by usig the arguments passed at launch try { communicator = new RPCCommunicator( new CommunicatorParameters { port = ReadArgs() }); } // If it fails, we check if there are any external brains in the scene // If there are : Launch the communicator on the default port // If there arn't, there is no need for a communicator and it is set // to null catch { communicator = null; var externalBrain = brains.FirstOrDefault(b => b.brainType == BrainType.External); if (externalBrain != null) { communicator = new RPCCommunicator( new CommunicatorParameters { port = 5005 }); } } brainBatcher = new Batcher(communicator); // Initialize Brains and communicator (if present) foreach (var brain in brains) { brain.InitializeBrain(this, brainBatcher); } if (communicator != null) { isCommunicatorOn = true; var academyParameters = new UnityRLInitializationOutput(); academyParameters.Name = gameObject.name; academyParameters.Version = kApiVersion; foreach (var brain in brains) { var bp = brain.brainParameters; academyParameters.BrainParameters.Add( Batcher.BrainParametersConvertor( bp, brain.gameObject.name, (BrainTypeProto) brain.brainType)); } academyParameters.EnvironmentParameters = new EnvironmentParametersProto(); foreach (var key in resetParameters.Keys) { academyParameters.EnvironmentParameters.FloatParameters.Add( key, resetParameters[key] ); } var pythonParameters = brainBatcher.SendAcademyParameters(academyParameters); Random.InitState(pythonParameters.Seed); Application.logMessageReceived += HandleLog; logPath = Path.GetFullPath(".") + "/unity-environment.log"; logWriter = new StreamWriter(logPath, false); logWriter.WriteLine(DateTime.Now.ToString()); logWriter.WriteLine(" "); logWriter.Close(); } // If a communicator is enabled/provided, then we assume we are in // training mode. In the absence of a communicator, we assume we are // in inference mode. isInference = !isCommunicatorOn; BrainDecideAction += () => { }; AgentSetStatus += (m, d, i) => { }; AgentResetIfDone += () => { }; AgentSendState += () => { }; AgentAct += () => { }; AgentForceReset += () => { }; // Configure the environment using the configurations provided by // the developer in the Editor. SetIsInference(!brainBatcher.GetIsTraining()); ConfigureEnvironment(); }