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