/// This is called by the Academy at the start of the environemnt. public void InitializeBrain(Academy aca, MLAgents.Batcher brainBatcher) { UpdateCoreBrains(); coreBrain.InitializeCoreBrain(brainBatcher); aca.BrainDecideAction += DecideAction; isInitialized = true; }
/// Nothing to implement /// Nothing to implement public void InitializeCoreBrain(MLAgents.Batcher brainBatcher) { if ((brainBatcher == null) || (!broadcast)) { this.brainBatcher = null; } else { this.brainBatcher = brainBatcher; this.brainBatcher.SubscribeBrain(brain.gameObject.name); } }
/// Create the reference to decision public void InitializeCoreBrain(MLAgents.Batcher brainBatcher) { decision = brain.gameObject.GetComponent <Decision>(); if ((brainBatcher == null) || (!broadcast)) { this.brainBatcher = null; } else { this.brainBatcher = brainBatcher; ; this.brainBatcher.SubscribeBrain(brain.gameObject.name); } }
/// Generates the communicator for the Academy if none was present and /// subscribe to ExternalCommunicator if it was present. public void InitializeCoreBrain(MLAgents.Batcher brainBatcher) { if (brainBatcher == null) { brainBatcher = null; throw new UnityAgentsException(string.Format("The brain {0} was set to" + " External mode" + " but Unity was unable to read the" + " arguments passed at launch.", brain.gameObject.name)); } else { this.brainBatcher = brainBatcher; this.brainBatcher.SubscribeBrain(brain.gameObject.name); } }
/// <summary> /// Initializes the environment, configures it and initialized the Academy. /// </summary> private void InitializeEnvironment() { InitializeAcademy(); Communicator communicator = null; var exposedBrains = broadcastHub.broadcastingBrains.Where(x => x != null).ToList();; var controlledBrains = broadcastHub.broadcastingBrains.Where( x => x != null && x is LearningBrain && broadcastHub.IsControlled(x)); foreach (LearningBrain brain in controlledBrains) { 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 }); } } brainBatcher = new Batcher(communicator); foreach (var trainingBrain in exposedBrains) { trainingBrain.SetBatcher(brainBatcher); } if (communicator != null) { isCommunicatorOn = true; var academyParameters = new CommunicatorObjects.UnityRLInitializationOutput(); academyParameters.Name = gameObject.name; academyParameters.Version = 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 = brainBatcher.SendAcademyParameters(academyParameters); Random.InitState(pythonParameters.Seed); Application.logMessageReceived += HandleLog; logPath = Path.GetFullPath(".") + "/UnitySDK.log"; logWriter = new StreamWriter(logPath, false); logWriter.WriteLine(System.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(); }
/// <summary> /// Initializes the environment, configures it and initialized the Academy. /// </summary> // 初始化 private void InitializeEnvironment() { // 保存旧值 originalGravity = Physics.gravity; originalFixedDeltaTime = Time.fixedDeltaTime; originalMaximumDeltaTime = Time.maximumDeltaTime; // 调用虚函数 // InitializeAcademy() InitializeAcademy(); Communicator communicator = null; // BroadcastHub: 简单的Brain的列表 // 获取所有的Brain var exposedBrains = broadcastHub.broadcastingBrains.Where(x => x != null).ToList();; // 获取受控制的LearningBrain var controlledBrains = broadcastHub.broadcastingBrains.Where( x => x != null && x is LearningBrain && broadcastHub.IsControlled(x) ); // 设置Brain是Controlled foreach (LearningBrain brain in controlledBrains) { // 标记_isControlled = true; 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; // 如果有,需要控制的LearningBrain // 则表示,需要TensorFlow // 所以,尝试连接默认端口 if (controlledBrains.ToList().Count > 0) { communicator = new RPCCommunicator( new CommunicatorParameters { port = 5005 }); } } // 创建Batcher brainBatcher = new Batcher(communicator); // Brain设置到Batcher // Batcher,是用来,连接Brain和Agent的地方 foreach (var trainingBrain in exposedBrains) { trainingBrain.SetBatcher(brainBatcher); } if (communicator != null) { isCommunicatorOn = true; // 创建UnityRLInitializationOutput消息 var academyParameters = new CommunicatorObjects.UnityRLInitializationOutput(); academyParameters.Name = gameObject.name; academyParameters.Version = kApiVersion; // 从需要控制的Brain中 // 获取BrainParameters // 填写到消息中 foreach (var brain in exposedBrains) { var bp = brain.brainParameters; academyParameters.BrainParameters.Add(bp.ToProto(brain.name, broadcastHub.IsControlled(brain))); } // 填写EnvironmentParameters academyParameters.EnvironmentParameters = new CommunicatorObjects.EnvironmentParametersProto(); foreach (var key in resetParameters.Keys) { academyParameters.EnvironmentParameters.FloatParameters.Add(key, resetParameters[key]); } // Q: 通过Batcher发送消息? var pythonParameters = brainBatcher.SendAcademyParameters(academyParameters); Random.InitState(pythonParameters.Seed); // 监听Unity消息 Application.logMessageReceived += HandleLog; // 写入日志 // 当前开始时间 logPath = Path.GetFullPath(".") + "/UnitySDK.log"; using (var fs = File.Open(logPath, FileMode.Append, FileAccess.Write, FileShare.ReadWrite)) { logWriter = new StreamWriter(fs); logWriter.WriteLine(System.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 += () => { }; DestroyAction += () => { }; 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(); }
/// <summary> /// Initializes the environment, configures it and initialized the Academy. /// </summary> private void InitializeEnvironment() { // Retrieve Brain and initialize Academy var brains = GetBrains(gameObject); InitializeAcademy(); MLAgents.Communicator communicator = null; // Try to launch the communicator by usig the arguments passed at launch try { communicator = new MLAgents.RPCCommunicator( new MLAgents.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 MLAgents.RPCCommunicator( new MLAgents.CommunicatorParameters { port = 5005 }); } } brainBatcher = new MLAgents.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 MLAgents.CommunicatorObjects.UnityRLInitializationOutput(); academyParameters.Name = gameObject.name; academyParameters.Version = kApiVersion; foreach (var brain in brains) { var bp = brain.brainParameters; academyParameters.BrainParameters.Add( MLAgents.Batcher.BrainParametersConvertor( bp, brain.gameObject.name, (MLAgents.CommunicatorObjects.BrainTypeProto) brain.brainType)); } academyParameters.EnvironmentParameters = new MLAgents.CommunicatorObjects.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(System.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(); }
/// Loads the tensorflow graph model to generate a TFGraph object public void InitializeCoreBrain(MLAgents.Batcher brainBatcher) { #if ENABLE_TENSORFLOW #if UNITY_ANDROID && !UNITY_EDITOR // This needs to ba called only once and will raise an exception if // there are multiple internal brains try{ TensorFlowSharp.Android.NativeBinding.Init(); } catch { } #endif if ((brainBatcher == null) || (!broadcast)) { this.brainBatcher = null; } else { this.brainBatcher = brainBatcher; this.brainBatcher.SubscribeBrain(brain.gameObject.name); } if (graphModel != null) { graph = new TFGraph(); graph.Import(graphModel.bytes); session = new TFSession(graph); // TODO: Make this a loop over a dynamic set of graph inputs if ((graphScope.Length > 1) && (graphScope[graphScope.Length - 1] != '/')) { graphScope = graphScope + '/'; } if (graph[graphScope + BatchSizePlaceholderName] != null) { hasBatchSize = true; } if ((graph[graphScope + RecurrentInPlaceholderName] != null) && (graph[graphScope + RecurrentOutPlaceholderName] != null)) { hasRecurrent = true; var runner = session.GetRunner(); runner.Fetch(graph[graphScope + "memory_size"][0]); var networkOutput = runner.Run()[0].GetValue(); memorySize = (int)networkOutput; } if (graph[graphScope + VectorObservationPlacholderName] != null) { hasState = true; } if (graph[graphScope + PreviousActionPlaceholderName] != null) { hasPrevAction = true; } if (graph[graphScope + "value_estimate"] != null) { hasValueEstimate = true; } if (graph[graphScope + ActionMaskPlaceholderName] != null) { hasMaskedActions = true; } } observationMatrixList = new List <float[, , , ]>(); texturesHolder = new List <Texture2D>(); #endif }
/// <summary> /// Initializes the environment, configures it and initialized the Academy. /// </summary> private void InitializeEnvironment() { originalGravity = Physics.gravity; originalFixedDeltaTime = Time.fixedDeltaTime; originalMaximumDeltaTime = Time.maximumDeltaTime; InitializeAcademy(); Communicator communicator = null; var spawnPrefab = agentSpawner.GetPrefabFor(GetAgentId()); var spawnAgentPrefabs = spawnPrefab.GetComponentsInChildren <Agent>(); var spawnAgentPrefabBrains = spawnAgentPrefabs .Where(x => x.brain as LearningBrain != null) .Select(x => x.brain) .ToList(); var spawnerEnabled = spawnAgentPrefabBrains.Count > 0; var hubBrains = broadcastHub.broadcastingBrains.Where(x => x != null).ToList();; var hubControlledBrains = broadcastHub.broadcastingBrains.Where( x => x != null && x is LearningBrain && broadcastHub.IsControlled(x)); IEnumerable <Brain> exposedBrains = spawnerEnabled ? spawnAgentPrefabBrains : hubBrains; IEnumerable <Brain> controlledBrains = hubControlledBrains; if (spawnerEnabled) { controlledBrains = IsTrainingMode() ? spawnAgentPrefabBrains : new List <Brain>(); } // 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 }); } } foreach (LearningBrain brain in controlledBrains) { brain.SetToControlledExternally(); } brainBatcher = new Batcher(communicator); foreach (var trainingBrain in exposedBrains) { trainingBrain.SetBatcher(brainBatcher); } if (communicator != null) { isCommunicatorOn = true; var academyParameters = new CommunicatorObjects.UnityRLInitializationOutput(); academyParameters.Name = gameObject.name; academyParameters.Version = 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 = brainBatcher.SendAcademyParameters(academyParameters); Random.InitState(pythonParameters.Seed); Application.logMessageReceived += HandleLog; logPath = Path.GetFullPath(".") + "/UnitySDK.log"; using (var fs = File.Open(logPath, FileMode.Append, FileAccess.Write, FileShare.ReadWrite)) { logWriter = new StreamWriter(fs); logWriter.WriteLine(System.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 += () => { }; DestroyAction += () => { }; 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(); if (spawnerEnabled) { agentSpawner.SpawnSpawnableEnv(this.gameObject, GetNumAgents(), spawnPrefab); } }