コード例 #1
0
    /// Collects the information from the brains and sends it accross the socket
    public void GiveBrainInfo(Brain brain, Dictionary <Agent, AgentInfo> agentInfo)
    {
        var brainName = brain.gameObject.name;

        triedSendState[brainName] = true;


        current_agents[brainName].Clear();
        foreach (Agent agent in agentInfo.Keys)
        {
            current_agents[brainName].Add(agent);
        }
        if (current_agents[brainName].Count() > 0)
        {
            hasSentState[brainName] = true;
            sMessage.brain_name     = brainName;
            sMessage.agents.Clear();
            sMessage.vectorObservations.Clear();
            sMessage.rewards.Clear();
            sMessage.memories.Clear();
            sMessage.dones.Clear();
            sMessage.previousVectorActions.Clear();
            sMessage.previousTextActions.Clear();
            sMessage.maxes.Clear();
            sMessage.textObservations.Clear();

            int memorySize = 0;
            foreach (Agent agent in current_agents[brainName])
            {
                memorySize = Mathf.Max(agentInfo[agent].memories.Count, memorySize);
            }

            foreach (Agent agent in current_agents[brainName])
            {
                sMessage.agents.Add(agentInfo[agent].id);
                sMessage.vectorObservations.AddRange(agentInfo[agent].stackedVectorObservation);
                sMessage.rewards.Add(agentInfo[agent].reward);
                sMessage.memories.AddRange(agentInfo[agent].memories);
                for (int j = 0; j < memorySize - agentInfo[agent].memories.Count; j++)
                {
                    sMessage.memories.Add(0f);
                }
                sMessage.dones.Add(agentInfo[agent].done);
                sMessage.previousVectorActions.AddRange(agentInfo[agent].storedVectorActions.ToList());
                sMessage.previousTextActions.Add(agentInfo[agent].storedTextActions);
                sMessage.maxes.Add(agentInfo[agent].maxStepReached);
                sMessage.textObservations.Add(agentInfo[agent].textObservation);
            }



            sMessageString = JsonUtility.ToJson(sMessage);
            sender.Send(AppendLength(Encoding.ASCII.GetBytes(sMessageString)));
            Receive();
            int i = 0;
            foreach (resolution res in brain.brainParameters.cameraResolutions)
            {
                foreach (Agent agent in current_agents[brainName])
                {
                    sender.Send(AppendLength(TexToByteArray(agentInfo[agent].visualObservations[i])));
                    Receive();
                }
                i++;
            }
        }
        if (triedSendState.Values.All(x => x))
        {
            if (hasSentState.Values.Any(x => x) || academy.IsDone())
            {
                // if all the brains listed have sent their state
                sender.Send(AppendLength(Encoding.ASCII.GetBytes("END_OF_MESSAGE:" + (academy.IsDone() ? "True" : "False"))));


                UpdateCommand();
                if (GetCommand() == ExternalCommand.STEP)
                {
                    UpdateActions();
                }
            }

            foreach (string k in current_agents.Keys)
            {
                hasSentState[k]   = false;
                triedSendState[k] = false;
            }
        }
    }