Example #1
0
 /// 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);
     }
 }
Example #3
0
        /// 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);
     }
 }
Example #5
0
        /// <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();
        }
Example #6
0
        /// <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
        }
Example #9
0
        /// <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);
            }
        }