浏览代码

[MLA-12] update protobuf for vector observations (#2862)

/develop-newnormalization
GitHub 5 年前
当前提交
e6f549dc
共有 56 个文件被更改,包括 8693 次插入3369 次删除
  1. 13
      UnitySDK/Assets/ML-Agents/Editor/Tests/DemonstrationTests.cs
  2. 64
      UnitySDK/Assets/ML-Agents/Scripts/Agent.cs
  3. 72
      UnitySDK/Assets/ML-Agents/Scripts/Grpc/CommunicatorObjects/AgentInfo.cs
  4. 72
      UnitySDK/Assets/ML-Agents/Scripts/Grpc/CommunicatorObjects/BrainParameters.cs
  5. 2
      UnitySDK/Assets/ML-Agents/Scripts/Grpc/CommunicatorObjects/Observation.cs.meta
  6. 46
      UnitySDK/Assets/ML-Agents/Scripts/Grpc/GrpcExtensions.cs
  7. 20
      UnitySDK/Assets/ML-Agents/Scripts/Sensor/ISensor.cs
  8. 8
      UnitySDK/Assets/ML-Agents/Scripts/Sensor/SensorBase.cs
  9. 3
      UnitySDK/Assets/ML-Agents/Scripts/Sensor/StackingSensor.cs
  10. 1001
      demos/Expert3DBall.demo
  11. 1001
      demos/Expert3DBallHard.demo
  12. 294
      demos/ExpertBasic.demo
  13. 403
      demos/ExpertBouncer.demo
  14. 993
      demos/ExpertCrawlerDyn.demo
  15. 1000
      demos/ExpertFood.demo
  16. 485
      demos/ExpertGrid.demo
  17. 978
      demos/ExpertHallway.demo
  18. 1001
      demos/ExpertPyramid.demo
  19. 1001
      demos/ExpertReacher.demo
  20. 1001
      demos/ExpertTennis.demo
  21. 6
      gym-unity/gym_unity/envs/__init__.py
  22. 5
      gym-unity/gym_unity/tests/test_gym.py
  23. 130
      ml-agents-envs/mlagents/envs/brain.py
  24. 33
      ml-agents-envs/mlagents/envs/communicator_objects/agent_info_pb2.py
  25. 14
      ml-agents-envs/mlagents/envs/communicator_objects/agent_info_pb2.pyi
  26. 28
      ml-agents-envs/mlagents/envs/communicator_objects/brain_parameters_pb2.py
  27. 8
      ml-agents-envs/mlagents/envs/communicator_objects/brain_parameters_pb2.pyi
  28. 36
      ml-agents-envs/mlagents/envs/mock_communicator.py
  29. 25
      ml-agents-envs/mlagents/envs/tests/test_brain.py
  30. 4
      ml-agents-envs/mlagents/envs/tests/test_envs.py
  31. 4
      ml-agents/mlagents/trainers/models.py
  32. 8
      ml-agents/mlagents/trainers/tests/mock_brain.py
  33. 232
      ml-agents/mlagents/trainers/tests/test.demo
  34. 232
      ml-agents/mlagents/trainers/tests/test_demo_dir/test.demo
  35. 232
      ml-agents/mlagents/trainers/tests/test_demo_dir/test2.demo
  36. 232
      ml-agents/mlagents/trainers/tests/test_demo_dir/test3.demo
  37. 18
      ml-agents/mlagents/trainers/tests/test_ppo.py
  38. 24
      ml-agents/mlagents/trainers/tests/test_simple_rl.py
  39. 116
      ml-agents/mlagents/trainers/tests/testdcvis.demo
  40. 6
      protobuf-definitions/proto/mlagents/envs/communicator_objects/agent_info.proto
  41. 4
      protobuf-definitions/proto/mlagents/envs/communicator_objects/brain_parameters.proto
  42. 433
      UnitySDK/Assets/ML-Agents/Scripts/Grpc/CommunicatorObjects/Observation.cs
  43. 29
      UnitySDK/Assets/ML-Agents/Scripts/Sensor/Observation.cs
  44. 169
      ml-agents-envs/mlagents/envs/communicator_objects/observation_pb2.py
  45. 96
      ml-agents-envs/mlagents/envs/communicator_objects/observation_pb2.pyi
  46. 22
      protobuf-definitions/proto/mlagents/envs/communicator_objects/observation.proto
  47. 234
      UnitySDK/Assets/ML-Agents/Scripts/Grpc/CommunicatorObjects/CompressedObservation.cs
  48. 24
      UnitySDK/Assets/ML-Agents/Scripts/Sensor/CompressedObservation.cs
  49. 113
      ml-agents-envs/mlagents/envs/communicator_objects/compressed_observation_pb2.py
  50. 72
      ml-agents-envs/mlagents/envs/communicator_objects/compressed_observation_pb2.pyi
  51. 15
      protobuf-definitions/proto/mlagents/envs/communicator_objects/compressed_observation.proto
  52. 0
      /UnitySDK/Assets/ML-Agents/Scripts/Grpc/CommunicatorObjects/Observation.cs.meta
  53. 0
      /UnitySDK/Assets/ML-Agents/Scripts/Sensor/Observation.cs.meta

13
UnitySDK/Assets/ML-Agents/Editor/Tests/DemonstrationTests.cs


done = true,
id = 5,
maxStepReached = true,
floatObservations = new List<float>() { 1f, 1f, 1f },
storedVectorActions = new[] { 0f, 1f },
};

BrainParametersProto.Parser.ParseDelimitedFrom(reader);
var agentInfoProto = AgentInfoProto.Parser.ParseDelimitedFrom(reader);
var obs = agentInfoProto.StackedVectorObservation;
Assert.AreEqual(obs.Count, bpA.brainParameters.vectorObservationSize);
for (var i = 0; i < obs.Count; i++)
var obs = agentInfoProto.Observations[2]; // skip dummy sensors
Assert.AreEqual((float) i+1, obs[i]);
var vecObs = obs.FloatData.Data;
Assert.AreEqual(bpA.brainParameters.vectorObservationSize, vecObs.Count);
for (var i = 0; i < vecObs.Count; i++)
{
Assert.AreEqual((float) i+1, vecObs[i]);
}
}
}

64
UnitySDK/Assets/ML-Agents/Scripts/Agent.cs


using System;
using System.Collections.Generic;
using UnityEngine;
using Barracuda;

public struct AgentInfo
{
/// <summary>
/// Most recent compressed observations.
/// Most recent observations.
public List<CompressedObservation> compressedObservations;
// TODO struct?
public List<float> floatObservations;
public List<Observation> observations;
/// <summary>
/// Keeps track of the last vector action taken by the Brain.

/// </summary>
DemonstrationRecorder m_Recorder;
/// <summary>
/// List of sensors used to generate observations.
/// Currently generated from attached SensorComponents, and a legacy VectorSensor
/// </summary>
/// <summary>
/// VectorSensor which is written to by AddVectorObs
/// </summary>
/// <summary>
/// Internal buffer used for generating float observations.
/// </summary>
float[] m_VectorSensorBuffer;
WriteAdapter m_WriteAdapter = new WriteAdapter();
/// MonoBehaviour function that is called when the attached GameObject

}
}
m_Info.compressedObservations = new List<CompressedObservation>();
m_Info.floatObservations = new List<float>();
m_Info.floatObservations.AddRange(
new float[param.vectorObservationSize
* param.numStackedVectorObservations]);
m_Info.observations = new List<Observation>();
}
/// <summary>

Debug.Assert(!sensors[i].GetName().Equals(sensors[i + 1].GetName()), "Sensor names must be unique.");
}
#endif
// Create a buffer for writing vector sensor data too
int numFloatObservations = 0;
for (var i = 0; i < sensors.Count; i++)
{
if (sensors[i].GetCompressionType() == SensorCompressionType.None)
{
numFloatObservations += sensors[i].ObservationSize();
}
}
m_VectorSensorBuffer = new float[numFloatObservations];
}
/// <summary>

}
m_Info.storedVectorActions = m_Action.vectorActions;
m_Info.compressedObservations.Clear();
m_Info.observations.Clear();
m_ActionMasker.ResetMask();
UpdateSensors();
using (TimerStack.Instance.Scoped("CollectObservations"))

if (m_Recorder != null && m_Recorder.record && Application.isEditor)
{
// This is a bit of a hack - if we're in inference mode, compressed observations won't be generated
// This is a bit of a hack - if we're in inference mode, observations won't be generated
if (m_Info.compressedObservations.Count == 0)
if (m_Info.observations.Count == 0)
{
GenerateSensorData();
}

/// </summary>
public void GenerateSensorData()
{
int floatsWritten = 0;
// Generate data for all Sensors
for (var i = 0; i < sensors.Count; i++)

{
m_WriteAdapter.SetTarget(m_Info.floatObservations, floatsWritten);
floatsWritten += sensor.Write(m_WriteAdapter);
// only handles 1D
// TODO handle in communicator code instead
m_WriteAdapter.SetTarget(m_VectorSensorBuffer, floatsWritten);
var numFloats = sensor.Write(m_WriteAdapter);
var floatObs = new Observation
{
FloatData = new ArraySegment<float>(m_VectorSensorBuffer, floatsWritten, numFloats),
Shape = sensor.GetFloatObservationShape(),
CompressionType = sensor.GetCompressionType()
};
m_Info.observations.Add(floatObs);
floatsWritten += numFloats;
var compressedObs = new CompressedObservation
var compressedObs = new Observation
Data = sensor.GetCompressedObservation(),
CompressedData = sensor.GetCompressedObservation(),
m_Info.compressedObservations.Add(compressedObs);
m_Info.observations.Add(compressedObs);
}
}
}

72
UnitySDK/Assets/ML-Agents/Scripts/Grpc/CommunicatorObjects/AgentInfo.cs


byte[] descriptorData = global::System.Convert.FromBase64String(
string.Concat(
"CjNtbGFnZW50cy9lbnZzL2NvbW11bmljYXRvcl9vYmplY3RzL2FnZW50X2lu",
"Zm8ucHJvdG8SFGNvbW11bmljYXRvcl9vYmplY3RzGj9tbGFnZW50cy9lbnZz",
"L2NvbW11bmljYXRvcl9vYmplY3RzL2NvbXByZXNzZWRfb2JzZXJ2YXRpb24u",
"cHJvdG8inQIKDkFnZW50SW5mb1Byb3RvEiIKGnN0YWNrZWRfdmVjdG9yX29i",
"c2VydmF0aW9uGAEgAygCEh0KFXN0b3JlZF92ZWN0b3JfYWN0aW9ucxgEIAMo",
"AhIOCgZyZXdhcmQYByABKAISDAoEZG9uZRgIIAEoCBIYChBtYXhfc3RlcF9y",
"ZWFjaGVkGAkgASgIEgoKAmlkGAogASgFEhMKC2FjdGlvbl9tYXNrGAsgAygI",
"ElEKF2NvbXByZXNzZWRfb2JzZXJ2YXRpb25zGA0gAygLMjAuY29tbXVuaWNh",
"dG9yX29iamVjdHMuQ29tcHJlc3NlZE9ic2VydmF0aW9uUHJvdG9KBAgCEANK",
"BAgDEARKBAgFEAZKBAgGEAdKBAgMEA1CH6oCHE1MQWdlbnRzLkNvbW11bmlj",
"YXRvck9iamVjdHNiBnByb3RvMw=="));
"Zm8ucHJvdG8SFGNvbW11bmljYXRvcl9vYmplY3RzGjRtbGFnZW50cy9lbnZz",
"L2NvbW11bmljYXRvcl9vYmplY3RzL29ic2VydmF0aW9uLnByb3RvIuoBCg5B",
"Z2VudEluZm9Qcm90bxIdChVzdG9yZWRfdmVjdG9yX2FjdGlvbnMYBCADKAIS",
"DgoGcmV3YXJkGAcgASgCEgwKBGRvbmUYCCABKAgSGAoQbWF4X3N0ZXBfcmVh",
"Y2hlZBgJIAEoCBIKCgJpZBgKIAEoBRITCgthY3Rpb25fbWFzaxgLIAMoCBI8",
"CgxvYnNlcnZhdGlvbnMYDSADKAsyJi5jb21tdW5pY2F0b3Jfb2JqZWN0cy5P",
"YnNlcnZhdGlvblByb3RvSgQIARACSgQIAhADSgQIAxAESgQIBRAGSgQIBhAH",
"SgQIDBANQh+qAhxNTEFnZW50cy5Db21tdW5pY2F0b3JPYmplY3RzYgZwcm90",
"bzM="));
new pbr::FileDescriptor[] { global::MLAgents.CommunicatorObjects.CompressedObservationReflection.Descriptor, },
new pbr::FileDescriptor[] { global::MLAgents.CommunicatorObjects.ObservationReflection.Descriptor, },
new pbr::GeneratedClrTypeInfo(typeof(global::MLAgents.CommunicatorObjects.AgentInfoProto), global::MLAgents.CommunicatorObjects.AgentInfoProto.Parser, new[]{ "StackedVectorObservation", "StoredVectorActions", "Reward", "Done", "MaxStepReached", "Id", "ActionMask", "CompressedObservations" }, null, null, null)
new pbr::GeneratedClrTypeInfo(typeof(global::MLAgents.CommunicatorObjects.AgentInfoProto), global::MLAgents.CommunicatorObjects.AgentInfoProto.Parser, new[]{ "StoredVectorActions", "Reward", "Done", "MaxStepReached", "Id", "ActionMask", "Observations" }, null, null, null)
}));
}
#endregion

[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public AgentInfoProto(AgentInfoProto other) : this() {
stackedVectorObservation_ = other.stackedVectorObservation_.Clone();
storedVectorActions_ = other.storedVectorActions_.Clone();
reward_ = other.reward_;
done_ = other.done_;

compressedObservations_ = other.compressedObservations_.Clone();
observations_ = other.observations_.Clone();
_unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
}

}
/// <summary>Field number for the "stacked_vector_observation" field.</summary>
public const int StackedVectorObservationFieldNumber = 1;
private static readonly pb::FieldCodec<float> _repeated_stackedVectorObservation_codec
= pb::FieldCodec.ForFloat(10);
private readonly pbc::RepeatedField<float> stackedVectorObservation_ = new pbc::RepeatedField<float>();
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public pbc::RepeatedField<float> StackedVectorObservation {
get { return stackedVectorObservation_; }
}
/// <summary>Field number for the "stored_vector_actions" field.</summary>

get { return actionMask_; }
}
/// <summary>Field number for the "compressed_observations" field.</summary>
public const int CompressedObservationsFieldNumber = 13;
private static readonly pb::FieldCodec<global::MLAgents.CommunicatorObjects.CompressedObservationProto> _repeated_compressedObservations_codec
= pb::FieldCodec.ForMessage(106, global::MLAgents.CommunicatorObjects.CompressedObservationProto.Parser);
private readonly pbc::RepeatedField<global::MLAgents.CommunicatorObjects.CompressedObservationProto> compressedObservations_ = new pbc::RepeatedField<global::MLAgents.CommunicatorObjects.CompressedObservationProto>();
/// <summary>Field number for the "observations" field.</summary>
public const int ObservationsFieldNumber = 13;
private static readonly pb::FieldCodec<global::MLAgents.CommunicatorObjects.ObservationProto> _repeated_observations_codec
= pb::FieldCodec.ForMessage(106, global::MLAgents.CommunicatorObjects.ObservationProto.Parser);
private readonly pbc::RepeatedField<global::MLAgents.CommunicatorObjects.ObservationProto> observations_ = new pbc::RepeatedField<global::MLAgents.CommunicatorObjects.ObservationProto>();
public pbc::RepeatedField<global::MLAgents.CommunicatorObjects.CompressedObservationProto> CompressedObservations {
get { return compressedObservations_; }
public pbc::RepeatedField<global::MLAgents.CommunicatorObjects.ObservationProto> Observations {
get { return observations_; }
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]

if (ReferenceEquals(other, this)) {
return true;
}
if(!stackedVectorObservation_.Equals(other.stackedVectorObservation_)) return false;
if(!storedVectorActions_.Equals(other.storedVectorActions_)) return false;
if (!pbc::ProtobufEqualityComparers.BitwiseSingleEqualityComparer.Equals(Reward, other.Reward)) return false;
if (Done != other.Done) return false;

if(!compressedObservations_.Equals(other.compressedObservations_)) return false;
if(!observations_.Equals(other.observations_)) return false;
return Equals(_unknownFields, other._unknownFields);
}

hash ^= stackedVectorObservation_.GetHashCode();
hash ^= storedVectorActions_.GetHashCode();
if (Reward != 0F) hash ^= pbc::ProtobufEqualityComparers.BitwiseSingleEqualityComparer.GetHashCode(Reward);
if (Done != false) hash ^= Done.GetHashCode();

hash ^= compressedObservations_.GetHashCode();
hash ^= observations_.GetHashCode();
if (_unknownFields != null) {
hash ^= _unknownFields.GetHashCode();
}

[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public void WriteTo(pb::CodedOutputStream output) {
stackedVectorObservation_.WriteTo(output, _repeated_stackedVectorObservation_codec);
storedVectorActions_.WriteTo(output, _repeated_storedVectorActions_codec);
if (Reward != 0F) {
output.WriteRawTag(61);

output.WriteInt32(Id);
}
actionMask_.WriteTo(output, _repeated_actionMask_codec);
compressedObservations_.WriteTo(output, _repeated_compressedObservations_codec);
observations_.WriteTo(output, _repeated_observations_codec);
if (_unknownFields != null) {
_unknownFields.WriteTo(output);
}

public int CalculateSize() {
int size = 0;
size += stackedVectorObservation_.CalculateSize(_repeated_stackedVectorObservation_codec);
size += storedVectorActions_.CalculateSize(_repeated_storedVectorActions_codec);
if (Reward != 0F) {
size += 1 + 4;

size += 1 + pb::CodedOutputStream.ComputeInt32Size(Id);
}
size += actionMask_.CalculateSize(_repeated_actionMask_codec);
size += compressedObservations_.CalculateSize(_repeated_compressedObservations_codec);
size += observations_.CalculateSize(_repeated_observations_codec);
if (_unknownFields != null) {
size += _unknownFields.CalculateSize();
}

if (other == null) {
return;
}
stackedVectorObservation_.Add(other.stackedVectorObservation_);
storedVectorActions_.Add(other.storedVectorActions_);
if (other.Reward != 0F) {
Reward = other.Reward;

Id = other.Id;
}
actionMask_.Add(other.actionMask_);
compressedObservations_.Add(other.compressedObservations_);
observations_.Add(other.observations_);
_unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
}

default:
_unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
break;
case 10:
case 13: {
stackedVectorObservation_.AddEntriesFrom(input, _repeated_stackedVectorObservation_codec);
break;
}
case 34:
case 37: {
storedVectorActions_.AddEntriesFrom(input, _repeated_storedVectorActions_codec);

break;
}
case 106: {
compressedObservations_.AddEntriesFrom(input, _repeated_compressedObservations_codec);
observations_.AddEntriesFrom(input, _repeated_observations_codec);
break;
}
}

72
UnitySDK/Assets/ML-Agents/Scripts/Grpc/CommunicatorObjects/BrainParameters.cs


"CjltbGFnZW50cy9lbnZzL2NvbW11bmljYXRvcl9vYmplY3RzL2JyYWluX3Bh",
"cmFtZXRlcnMucHJvdG8SFGNvbW11bmljYXRvcl9vYmplY3RzGjNtbGFnZW50",
"cy9lbnZzL2NvbW11bmljYXRvcl9vYmplY3RzL3NwYWNlX3R5cGUucHJvdG8i",
"lwIKFEJyYWluUGFyYW1ldGVyc1Byb3RvEh8KF3ZlY3Rvcl9vYnNlcnZhdGlv",
"bl9zaXplGAEgASgFEicKH251bV9zdGFja2VkX3ZlY3Rvcl9vYnNlcnZhdGlv",
"bnMYAiABKAUSGgoSdmVjdG9yX2FjdGlvbl9zaXplGAMgAygFEiIKGnZlY3Rv",
"cl9hY3Rpb25fZGVzY3JpcHRpb25zGAUgAygJEkYKGHZlY3Rvcl9hY3Rpb25f",
"c3BhY2VfdHlwZRgGIAEoDjIkLmNvbW11bmljYXRvcl9vYmplY3RzLlNwYWNl",
"VHlwZVByb3RvEhIKCmJyYWluX25hbWUYByABKAkSEwoLaXNfdHJhaW5pbmcY",
"CCABKAhKBAgEEAVCH6oCHE1MQWdlbnRzLkNvbW11bmljYXRvck9iamVjdHNi",
"BnByb3RvMw=="));
"2QEKFEJyYWluUGFyYW1ldGVyc1Byb3RvEhoKEnZlY3Rvcl9hY3Rpb25fc2l6",
"ZRgDIAMoBRIiChp2ZWN0b3JfYWN0aW9uX2Rlc2NyaXB0aW9ucxgFIAMoCRJG",
"Chh2ZWN0b3JfYWN0aW9uX3NwYWNlX3R5cGUYBiABKA4yJC5jb21tdW5pY2F0",
"b3Jfb2JqZWN0cy5TcGFjZVR5cGVQcm90bxISCgpicmFpbl9uYW1lGAcgASgJ",
"EhMKC2lzX3RyYWluaW5nGAggASgISgQIARACSgQIAhADSgQIBBAFQh+qAhxN",
"TEFnZW50cy5Db21tdW5pY2F0b3JPYmplY3RzYgZwcm90bzM="));
new pbr::GeneratedClrTypeInfo(typeof(global::MLAgents.CommunicatorObjects.BrainParametersProto), global::MLAgents.CommunicatorObjects.BrainParametersProto.Parser, new[]{ "VectorObservationSize", "NumStackedVectorObservations", "VectorActionSize", "VectorActionDescriptions", "VectorActionSpaceType", "BrainName", "IsTraining" }, null, null, null)
new pbr::GeneratedClrTypeInfo(typeof(global::MLAgents.CommunicatorObjects.BrainParametersProto), global::MLAgents.CommunicatorObjects.BrainParametersProto.Parser, new[]{ "VectorActionSize", "VectorActionDescriptions", "VectorActionSpaceType", "BrainName", "IsTraining" }, null, null, null)
}));
}
#endregion

[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public BrainParametersProto(BrainParametersProto other) : this() {
vectorObservationSize_ = other.vectorObservationSize_;
numStackedVectorObservations_ = other.numStackedVectorObservations_;
vectorActionSize_ = other.vectorActionSize_.Clone();
vectorActionDescriptions_ = other.vectorActionDescriptions_.Clone();
vectorActionSpaceType_ = other.vectorActionSpaceType_;

return new BrainParametersProto(this);
}
/// <summary>Field number for the "vector_observation_size" field.</summary>
public const int VectorObservationSizeFieldNumber = 1;
private int vectorObservationSize_;
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public int VectorObservationSize {
get { return vectorObservationSize_; }
set {
vectorObservationSize_ = value;
}
}
/// <summary>Field number for the "num_stacked_vector_observations" field.</summary>
public const int NumStackedVectorObservationsFieldNumber = 2;
private int numStackedVectorObservations_;
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public int NumStackedVectorObservations {
get { return numStackedVectorObservations_; }
set {
numStackedVectorObservations_ = value;
}
}
/// <summary>Field number for the "vector_action_size" field.</summary>
public const int VectorActionSizeFieldNumber = 3;
private static readonly pb::FieldCodec<int> _repeated_vectorActionSize_codec

if (ReferenceEquals(other, this)) {
return true;
}
if (VectorObservationSize != other.VectorObservationSize) return false;
if (NumStackedVectorObservations != other.NumStackedVectorObservations) return false;
if(!vectorActionSize_.Equals(other.vectorActionSize_)) return false;
if(!vectorActionDescriptions_.Equals(other.vectorActionDescriptions_)) return false;
if (VectorActionSpaceType != other.VectorActionSpaceType) return false;

[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public override int GetHashCode() {
int hash = 1;
if (VectorObservationSize != 0) hash ^= VectorObservationSize.GetHashCode();
if (NumStackedVectorObservations != 0) hash ^= NumStackedVectorObservations.GetHashCode();
hash ^= vectorActionSize_.GetHashCode();
hash ^= vectorActionDescriptions_.GetHashCode();
if (VectorActionSpaceType != 0) hash ^= VectorActionSpaceType.GetHashCode();

[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public void WriteTo(pb::CodedOutputStream output) {
if (VectorObservationSize != 0) {
output.WriteRawTag(8);
output.WriteInt32(VectorObservationSize);
}
if (NumStackedVectorObservations != 0) {
output.WriteRawTag(16);
output.WriteInt32(NumStackedVectorObservations);
}
vectorActionSize_.WriteTo(output, _repeated_vectorActionSize_codec);
vectorActionDescriptions_.WriteTo(output, _repeated_vectorActionDescriptions_codec);
if (VectorActionSpaceType != 0) {

[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public int CalculateSize() {
int size = 0;
if (VectorObservationSize != 0) {
size += 1 + pb::CodedOutputStream.ComputeInt32Size(VectorObservationSize);
}
if (NumStackedVectorObservations != 0) {
size += 1 + pb::CodedOutputStream.ComputeInt32Size(NumStackedVectorObservations);
}
size += vectorActionSize_.CalculateSize(_repeated_vectorActionSize_codec);
size += vectorActionDescriptions_.CalculateSize(_repeated_vectorActionDescriptions_codec);
if (VectorActionSpaceType != 0) {

if (other == null) {
return;
}
if (other.VectorObservationSize != 0) {
VectorObservationSize = other.VectorObservationSize;
}
if (other.NumStackedVectorObservations != 0) {
NumStackedVectorObservations = other.NumStackedVectorObservations;
}
vectorActionSize_.Add(other.vectorActionSize_);
vectorActionDescriptions_.Add(other.vectorActionDescriptions_);
if (other.VectorActionSpaceType != 0) {

default:
_unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
break;
case 8: {
VectorObservationSize = input.ReadInt32();
break;
}
case 16: {
NumStackedVectorObservations = input.ReadInt32();
break;
}
case 26:
case 24: {
vectorActionSize_.AddEntriesFrom(input, _repeated_vectorActionSize_codec);

2
UnitySDK/Assets/ML-Agents/Scripts/Grpc/CommunicatorObjects/Observation.cs.meta


fileFormatVersion: 2
guid: 55ac40ee8d5b74b9e80d3def9d4ef6e0
guid: 9fbba5f80821d4f02b4239a8e16eebfa
MonoImporter:
externalObjects: {}
serializedVersion: 2

46
UnitySDK/Assets/ML-Agents/Scripts/Grpc/GrpcExtensions.cs


{
var agentInfoProto = new AgentInfoProto
{
StackedVectorObservation = { ai.floatObservations },
StoredVectorActions = { ai.storedVectorActions },
Reward = ai.reward,
MaxStepReached = ai.maxStepReached,

agentInfoProto.ActionMask.AddRange(ai.actionMasks);
}
if (ai.compressedObservations != null)
if (ai.observations != null)
foreach (var obs in ai.compressedObservations)
foreach (var obs in ai.observations)
agentInfoProto.CompressedObservations.Add(obs.ToProto());
agentInfoProto.Observations.Add(obs.ToProto());
}
}

{
var brainParametersProto = new BrainParametersProto
{
VectorObservationSize = bp.vectorObservationSize,
NumStackedVectorObservations = bp.numStackedVectorObservations,
VectorActionSize = { bp.vectorActionSize },
VectorActionSpaceType =
(SpaceTypeProto)bp.vectorActionSpaceType,

{
var bp = new BrainParameters
{
vectorObservationSize = bpp.VectorObservationSize,
numStackedVectorObservations = bpp.NumStackedVectorObservations,
vectorActionSize = bpp.VectorActionSize.ToArray(),
vectorActionDescriptions = bpp.VectorActionDescriptions.ToArray(),
vectorActionSpaceType = (SpaceType)bpp.VectorActionSpaceType

return agentActions;
}
public static CompressedObservationProto ToProto(this CompressedObservation obs)
public static ObservationProto ToProto(this Observation obs)
var obsProto = new CompressedObservationProto
ObservationProto obsProto = null;
if (obs.CompressedData != null)
Data = ByteString.CopyFrom(obs.Data),
CompressionType = (CompressionTypeProto)obs.CompressionType,
};
// Make sure that uncompressed data is empty
if (obs.FloatData.Count != 0)
{
Debug.LogWarning("Observation has both compressed and uncompressed data set. Using compressed.");
}
obsProto = new ObservationProto
{
CompressedData = ByteString.CopyFrom(obs.CompressedData),
CompressionType = (CompressionTypeProto)obs.CompressionType,
};
}
else
{
var floatDataProto = new ObservationProto.Types.FloatData
{
Data = { obs.FloatData },
};
obsProto = new ObservationProto
{
FloatData = floatDataProto,
CompressionType = (CompressionTypeProto)obs.CompressionType,
};
}
obsProto.Shape.AddRange(obs.Shape);
return obsProto;
}

20
UnitySDK/Assets/ML-Agents/Scripts/Sensor/ISensor.cs


string GetName();
}
public static class ISensorExtensions
{
/// <summary>
/// Get the total number of elements in the ISensor's observation (i.e. the product of the shape elements).
/// </summary>
/// <param name="sensor"></param>
/// <returns></returns>
public static int ObservationSize(this ISensor sensor)
{
var shape = sensor.GetFloatObservationShape();
int count = 1;
for (var i = 0; i < shape.Length; i++)
{
count *= shape[i];
}
return count;
}
}
}

8
UnitySDK/Assets/ML-Agents/Scripts/Sensor/SensorBase.cs


public virtual int Write(WriteAdapter adapter)
{
// TODO reuse buffer for similar agents, don't call GetFloatObservationShape()
int[] shape = GetFloatObservationShape();
int numFloats = 1;
foreach (var dim in shape)
{
numFloats *= dim;
}
var numFloats = this.ObservationSize();
float[] buffer = new float[numFloats];
WriteObservation(buffer);

3
UnitySDK/Assets/ML-Agents/Scripts/Sensor/StackingSensor.cs


var shape = wrapped.GetFloatObservationShape();
m_Shape = new int[shape.Length];
m_UnstackedObservationSize = 1;
m_UnstackedObservationSize = wrapped.ObservationSize();
m_UnstackedObservationSize *= shape[d];
}
// TODO support arbitrary stacking dimension

1001
demos/Expert3DBall.demo
文件差异内容过多而无法显示
查看文件

1001
demos/Expert3DBallHard.demo
文件差异内容过多而无法显示
查看文件

294
demos/ExpertBasic.demo


 ExpertBasicI -��W?*: BasicLearningc
P�?"P���������h
 ExpertBasicI -��W?*: BasicLearning�
P�?"P���������jW
"R
P�?�
�#�P���������h
�#�P���������jW
"R
P�?�
�#�P���������h
�#�P���������jW
"R
P�?�
�#�P���������h
�#�P���������jW
"R
P�?�
�#�P���������h
�#�P���������jW
"R
P�?�
�#�P���������h
�#�P���������jW
"R
P�?�
�#�P���������j
P�?"@=�p}?@P���������h
�#�P���������jW
"R
P�?�
P�?"@=�p}?@P���������jW
"R
P�?�
�#�P���������h
�#�P���������jW
"R
P�?�
�#�P���������h
�#�P���������jW
"R
P�?�
�#�P���������h
�#�P���������jW
"R
P�?�
�#�P���������h
�#�P���������jW
"R
P�?�
�#�P���������h
�#�P���������jW
"R
P�?�
�#�P���������j
P�?"@=�p}?@P���������h
�#�P���������jW
"R
P�?�
P�?"@=�p}?@P���������jW
"R
P�?�
�#�P���������h
�#�P���������jW
"R
P�?�
�#�P���������h
�#�P���������jW
"R
P�?�
�#�P���������h
�#�P���������jW
"R
P�?�
�#�P���������h
�#�P���������jW
"R
P�?�
�#�P���������h
�#�P���������jW
"R
P�?�
�#�P���������j
P�?"@=�p}?@P���������h
�#�P���������jW
"R
P�?�
P�?"@=�p}?@P���������jW
"R
P�?�
�#�P���������h
�#�P���������jW
"R
P�?�
�#�P���������h
�#�P���������jW
"R
P�?�
�#�P���������h
�#�P���������jW
"R
P�?�
�#�P���������h
�#�P���������jW
"R
P�?�
�#�P���������h
�#�P���������jW
"R
P�?�
�#�P���������j
P�?"@=�p}?@P���������h
�#�P���������jW
"R
P�?�
P�?"@=�p}?@P���������jW
"R
P�?�
�#�P���������h
�#�P���������jW
"R
P�?�
�#�P���������h
�#�P���������jW
"R
P�?�
�#�P���������h
�#�P���������jW
"R
P�?�
�#�P���������h
�#�P���������jW
"R
P�?�
�#�P���������h
�#�P���������jW
"R
P�?�
�#�P���������j
P�?"@=�p}?@P���������h
�#�P���������jW
"R
P�?�
P�?"@=�p}?@P���������jW
"R
P�?�
�#�P���������h
�#�P���������jW
"R
P�?�
�#�P���������h
�#�P���������jW
"R
P�?�
�#�P���������h
�#�P���������jW
"R
P�?�
�#�P���������h
�#�P���������jW
"R
P�?�
�#�P���������h
�#�P���������jW
"R
P�?�
�#�P���������j
P�?"@=�p}?@P���������h
�#�P���������jW
"R
P�?�
P�?"@=�p}?@P���������jW
"R
P�?�
�#�P���������h
�#�P���������jW
"R
P�?�
�#�P���������h
�#�P���������jW
"R
P�?�
�#�P���������h
�#�P���������jW
"R
P�?�
�#�P���������h
�#�P���������jW
"R
P�?�
�#�P���������h
�#�P���������jW
"R
P�?�
�#�P���������j
P�?"@=�p}?@P���������h
�#�P���������jW
"R
P�?�
P�?"@=�p}?@P���������jW
"R
P�?�
�#�P���������h
�#�P���������jW
"R
P�?�
�#�P���������h
�#�P���������jW
"R
P�?�
�#�P���������h
�#�P���������jW
"R
P�?�
�#�P���������h
�#�P���������jW
"R
P�?�
�#�P���������h
�#�P���������jW
"R
P�?�
�#�P���������j
P�?"@=�p}?@P���������h
�#�P���������jW
"R
P�?�
P�?"@=�p}?@P���������jW
"R
P�?�
�#�P���������h
�#�P���������jW
"R
P�?�
�#�P���������h
�#�P���������jW
"R
P�?�
�#�P���������h
�#�P���������jW
"R
P�?�
�#�P���������h
�#�P���������jW
"R
P�?�
�#�P���������h
�#�P���������jW
"R
P�?�
�#�P���������j
P�?"@=�p}?@P���������h
�#�P���������jW
"R
P�?�
P�?"@=�p}?@P���������jW
"R
P�?�
�#�P���������h
�#�P���������jW
"R
P�?�
�#�P���������h
�#�P���������jW
"R
P�?�
�#�P���������h
�#�P���������jW
"R
P�?�
�#�P���������h
�#�P���������jW
"R
P�?�
�#�P���������h
�#�P���������jW
"R
P�?�
�#�P���������j
P�?"@=�p}?@P���������h
�#�P���������jW
"R
P�?�
P�?"@=�p}?@P���������jW
"R
P�?�
�#�P���������h
�#�P���������jW
"R
P�?�
�#�P��������� ExpertBasicI -��W?
�#�P���������jW
"R
P�?

403
demos/ExpertBouncer.demo


 ExpertBouncer` -�ćA ***0:BouncerLearningc
 ExpertBouncer` -�ćA ***0:BouncerLearning�
H~� ��
o?>�K@Dp�?l`@6��?" P���������jO
"J
o?>�K@Dp�?l`@6��?" P���������h
o?>�K@Dp�?l`@6��?�
H~� ��
o?>�K@Dp�?l`@6��?^ @��t?xXO?���@.5��" ��>C���X�=6�|?P���������jO
"J
o?>�K@Dp�?l`@6��?^ @��t?xXO?���@.5��" ��>C���X�=6�|?P���������h
o?>�K@Dp�?l`@6��?^ @��t?xXO?���@.5���
o?>�K@Dp�?l`@6��?^ @��t?xXO?��о��@.5���� ���G?&����*�W��@��" �*�����1�о=�i}?P���������h
H^ @��t?xXO?��о��@.5���� ���G?&����*�W��@��K�6�B�6?W鿶�X?�]@���" �o&�ո>|>=��?P���������h
H�� ���G?&����*�W��@��K�6�B�6?W鿶�X?�]@������?PXQ?���'#+���%@���?" y�>/�+��.þ=��|?P���������h
HK�6�B�6?W鿶�X?�]@������?PXQ?���'#+���%@���?n��:�[?�@�-#�V�>@�ӕ@" �f��!о�%?=Qj|?P���������h
H���?PXQ?���'#+���%@���?n��:�[?�@�-#�V�>@�ӕ@Iڼ�]�?���@LPA@=;�@Fe~?" ^��>[#����>=Lp}?P���������h
Hn��:�[?�@�-#�V�>@�ӕ@Iڼ�]�?���@LPA@=;�@Fe~?��a@�m?�{�"��?k1@Rc�@" ��>���_��=��}?P���������h
HIڼ�]�?���@LPA@=;�@Fe~?��a@�m?�{�"��?k1@Rc�@r��?H0c?Yc�@�c⿏��@���" q%��Z��+V?=��y?P���������h
H��a@�m?�{�"��?k1@Rc�@r��?H0c?Yc�@�c⿏��@���Dl����L?8(�� 3��]�@ƭV?" l����B��S�=l�{?P���������h
Hr��?H0c?Yc�@�c⿏��@���Dl����L?8(�� 3��]�@ƭV?���}�7?+-�? j�?�>�@�>" +Xp>��(>���>=E�~?P���������h
HDl����L?8(�� 3��]�@ƭV?���}�7?+-�? j�?�>�@�>��T?v#m?���S_O��ֵ@ks�@" 7vR>.��}�@�=g+?P���������h
H���}�7?+-�? j�?�>�@�>��T?v#m?���S_O��ֵ@ks�@J���u�J?٥�@W��x��@��z?" �i�]qZ::��>=b�}?P���������h
H��T?v#m?���S_O��ֵ@ks�@J���u�J?٥�@W��x��@��z?(c&�$�M?���N�;�,k@>b�@" ��>ސ��)�6�=�p|?P���������h
HJ���u�J?٥�@W��x��@��z?(c&�$�M?���N�;�,k@>b�@�f���e?&Y�@T@=G@%�#�" � > �˾��?=�~?P���������h
H(c&�$�M?���N�;�,k@>b�@�f���e?&Y�@T@=G@%�#�)X�@ڵ}?d{�J��4T@GD��" ���>1�!�~ �=]\|?P���������h
H�f���e?&Y�@T@=G@%�#�)X�@ڵ}?d{�J��4T@GD��Ja��c�I?�S뾤Qk���Q@J��?" ��W��$�9�>=�!{?P���������h
H)X�@ڵ}?d{�J��4T@GD��Ja��c�I?�S뾤Qk���Q@J��?E�>��Rp? ��@r�s��@���" ��>iI)�<A?=��|?P���������h
HJa��c�I?�S뾤Qk���Q@J��?E�>��Rp? ��@r�s��@���ñ��f8R?w�!�]^�K$@�4 >" �?�i�q���H�=%ky?P���������j
Hδ�@@x��?�@{��@��j�" ��n=`��چ�>=~?@P���������h
Hδ�@@x��?�@{��@��j�*�����W?�.�S @FԀ@���@" �+^� �m�bѾ=~cx?P���������h
Hδ�@@x��?�@{��@��j�*�����W?�.�S @FԀ@���@���@��U?4&�@��8@�(�@��\@" ��i?�"��(?=y?P���������h
H*�����W?�.�S @FԀ@���@���@��U?4&�@��8@�(�@��\@����=�a?�ޏ?ȓ}>��@��" ҄�i�p�Y܊�=�I�?P���������h
H���@��U?4&�@��8@�(�@��\@����=�a?�ޏ?ȓ}>��@��$?>�u?^�����.@�� @f�'�" Z�.>ZJ�H�L�=��?P���������h
H����=�a?�ޏ?ȓ}>��@��$?>�u?^�����.@�� @f�'���;@ʋV?��>�� ����@����" ��_>��g�l�X>=|?P���������h
o?>�K@Dp�?l`@6��?^ @��t?xXO?��о��@.5���� ���G?&����*�W��@��" �*�����1�о=�i}?P���������jO
"J
H~� ��
o?>�K@Dp�?l`@6��?^ @��t?xXO?���@.5���� ���G?&����*�W��@���
H^ @��t?xXO?��о��@.5���� ���G?&����*�W��@��K�6�B�6?W鿶�X?�]@���" �o&�ո>|>=��?P���������jO
"J
H^ @��t?xXO?��о��@.5���� ���G?&����*�W��@��K�6�B�6?W鿶�X?�]@����
H�� ���G?&����*�W��@��K�6�B�6?W鿶�X?�]@������?PXQ?���'#+���%@���?" y�>/�+��.þ=��|?P���������jO
"J
H�� ���G?&����*�W��@��K�6�B�6?W鿶�X?�]@������?PXQ?���'#+���%@���?�
HK�6�B�6?W鿶�X?�]@������?PXQ?���'#+���%@���?n��:�[?�@�-#�V�>@�ӕ@" �f��!о�%?=Qj|?P���������jO
"J
HK�6�B�6?W鿶�X?�]@������?PXQ?���'#+���%@���?n��:�[?�@�-#�V�>@�ӕ@�
H���?PXQ?���'#+���%@���?n��:�[?�@�-#�V�>@�ӕ@Iڼ�]�?���@LPA@=;�@Fe~?" ^��>[#����>=Lp}?P���������jO
"J
H���?PXQ?���'#+���%@���?n��:�[?�@�-#�V�>@�ӕ@Iڼ�]�?���@LPA@=;�@Fe~?�
Hn��:�[?�@�-#�V�>@�ӕ@Iڼ�]�?���@LPA@=;�@Fe~?��a@�m?�{�"��?k1@Rc�@" ��>���_��=��}?P���������jO
"J
Hn��:�[?�@�-#�V�>@�ӕ@Iڼ�]�?���@LPA@=;�@Fe~?��a@�m?�{�"��?k1@Rc�@�
HIڼ�]�?���@LPA@=;�@Fe~?��a@�m?�{�"��?k1@Rc�@r��?H0c?Yc�@�c⿏��@���" q%��Z��+V?=��y?P���������jO
"J
HIڼ�]�?���@LPA@=;�@Fe~?��a@�m?�{�"��?k1@Rc�@r��?H0c?Yc�@�c⿏��@����
H��a@�m?�{�"��?k1@Rc�@r��?H0c?Yc�@�c⿏��@���Dl����L?8(�� 3��]�@ƭV?" l����B��S�=l�{?P���������jO
"J
H��a@�m?�{�"��?k1@Rc�@r��?H0c?Yc�@�c⿏��@���Dl����L?8(�� 3��]�@ƭV?�
Hr��?H0c?Yc�@�c⿏��@���Dl����L?8(�� 3��]�@ƭV?���}�7?+-�? j�?�>�@�>" +Xp>��(>���>=E�~?P���������jO
"J
Hr��?H0c?Yc�@�c⿏��@���Dl����L?8(�� 3��]�@ƭV?���}�7?+-�? j�?�>�@�>�
HDl����L?8(�� 3��]�@ƭV?���}�7?+-�? j�?�>�@�>��T?v#m?���S_O��ֵ@ks�@" 7vR>.��}�@�=g+?P���������jO
"J
HDl����L?8(�� 3��]�@ƭV?���}�7?+-�? j�?�>�@�>��T?v#m?���S_O��ֵ@ks�@�
H���}�7?+-�? j�?�>�@�>��T?v#m?���S_O��ֵ@ks�@J���u�J?٥�@W��x��@��z?" �i�]qZ::��>=b�}?P���������jO
"J
H���}�7?+-�? j�?�>�@�>��T?v#m?���S_O��ֵ@ks�@J���u�J?٥�@W��x��@��z?�
H��T?v#m?���S_O��ֵ@ks�@J���u�J?٥�@W��x��@��z?(c&�$�M?���N�;�,k@>b�@" ��>ސ��)�6�=�p|?P���������jO
"J
H��T?v#m?���S_O��ֵ@ks�@J���u�J?٥�@W��x��@��z?(c&�$�M?���N�;�,k@>b�@�
HJ���u�J?٥�@W��x��@��z?(c&�$�M?���N�;�,k@>b�@�f���e?&Y�@T@=G@%�#�" � > �˾��?=�~?P���������jO
"J
HJ���u�J?٥�@W��x��@��z?(c&�$�M?���N�;�,k@>b�@�f���e?&Y�@T@=G@%�#��
H(c&�$�M?���N�;�,k@>b�@�f���e?&Y�@T@=G@%�#�)X�@ڵ}?d{�J��4T@GD��" ���>1�!�~ �=]\|?P���������jO
"J
H(c&�$�M?���N�;�,k@>b�@�f���e?&Y�@T@=G@%�#�)X�@ڵ}?d{�J��4T@GD���
H�f���e?&Y�@T@=G@%�#�)X�@ڵ}?d{�J��4T@GD��Ja��c�I?�S뾤Qk���Q@J��?" ��W��$�9�>=�!{?P���������jO
"J
H�f���e?&Y�@T@=G@%�#�)X�@ڵ}?d{�J��4T@GD��Ja��c�I?�S뾤Qk���Q@J��?�
H)X�@ڵ}?d{�J��4T@GD��Ja��c�I?�S뾤Qk���Q@J��?E�>��Rp? ��@r�s��@���" ��>iI)�<A?=��|?P���������jO
"J
H)X�@ڵ}?d{�J��4T@GD��Ja��c�I?�S뾤Qk���Q@J��?E�>��Rp? ��@r�s��@����
HJa��c�I?�S뾤Qk���Q@J��?E�>��Rp? ��@r�s��@���ñ��f8R?w�!�]^�K$@�4 >" �?�i�q���H�=%ky?P���������jO
"J
HJa��c�I?�S뾤Qk���Q@J��?E�>��Rp? ��@r�s��@���ñ��f8R?w�!�]^�K$@�4 >�
Hδ�@@x��?�@{��@��j�" ��n=`��چ�>=~?@P���������jO
"J
Hδ�@@x��?�@{��@��j��
Hδ�@@x��?�@{��@��j�*�����W?�.�S @FԀ@���@" �+^� �m�bѾ=~cx?P���������jO
"J
Hδ�@@x��?�@{��@��j�*�����W?�.�S @FԀ@���@�
Hδ�@@x��?�@{��@��j�*�����W?�.�S @FԀ@���@���@��U?4&�@��8@�(�@��\@" ��i?�"��(?=y?P���������jO
"J
Hδ�@@x��?�@{��@��j�*�����W?�.�S @FԀ@���@���@��U?4&�@��8@�(�@��\@�
H*�����W?�.�S @FԀ@���@���@��U?4&�@��8@�(�@��\@����=�a?�ޏ?ȓ}>��@��" ҄�i�p�Y܊�=�I�?P���������jO
"J
H*�����W?�.�S @FԀ@���@���@��U?4&�@��8@�(�@��\@����=�a?�ޏ?ȓ}>��@Ό
H���@��U?4&�@��8@�(�@��\@����=�a?�ޏ?ȓ}>��@��$?>�u?^�����.@�� @f�'�" Z�.>ZJ�H�L�=��?P���������jO
"J
H���@��U?4&�@��8@�(�@��\@����=�a?�ޏ?ȓ}>��@��$?>�u?^�����.@�� @f�'��
H����=�a?�ޏ?ȓ}>��@��$?>�u?^�����.@�� @f�'���;@ʋV?��>�� ����@����" ��_>��g�l�X>=|?P���������jO
"J
H����=�a?�ޏ?ȓ}>��@��$?>�u?^�����.@�� @f�'���;@ʋV?��>�� ����@�����
4�<j��=\n}?P���������h
H��;@ʋV?��>�� ����@���������R?����%@�Zn@H�j���t?0�\?��^��%@�Zn@H�j�" �-�>=\о�l�>=C �P���������h
H�����R?����%@�Zn@H�j���t?0�\?��^��%@�Zn@H�j��z?B1m?��t��3���M�@�)@" �t�:8��&��=��~?P���������h
H��t?0�\?��^��%@�Zn@H�j��z?B1m?��t��3���M�@�)@ �D�q?c?A�3���M�@�)@" �H/�K�u=��^?=�ڧ�P���������h
H�z?B1m?��t��3���M�@�)@ �D�q?c?A�3���M�@�)@�����s?i"�?�$�5�@�z��" �?�����1)�=�{?P���������h
H �D�q?c?A�3���M�@�)@�����s?i"�?�$�5�@�z��Xd���R?P�[�X�>5ja@�r�" 1W��#^���׾=�{?P���������h
H�����s?i"�?�$�5�@�z��Xd���R?P�[�X�>5ja@�r� ��?� s?�鸿��(�z��@ƨG�" ��?�~��)>=�F}?P���������h
HXd���R?P�[�X�>5ja@�r� ��?� s?�鸿��(�z��@ƨG�lX���u? /���`�1C@�v�@" q^�����,D�=�[?P���������h
H ��?� s?�鸿��(�z��@ƨG�lX���u? /���`�1C@�v�@�l}�J'J?~�A�`�1C@�v�@" �����=�_^?=�N�P���������h
HlX���u? /���`�1C@�v�@�l}�J'J?~�A�`�1C@�v�@�-����w?��@i6����@� ��" � 2�]dc�ne��=��{?P���������h
4�<j��=\n}?P���������jO
"J
H$?>�u?^�����.@�� @f�'���;@ʋV?��>�� ����@���������R?����%@�Zn@H�j��
H��;@ʋV?��>�� ����@���������R?����%@�Zn@H�j���t?0�\?��^��%@�Zn@H�j�" �-�>=\о�l�>=C �P���������jO
"J
H��;@ʋV?��>�� ����@���������R?����%@�Zn@H�j���t?0�\?��^��%@�Zn@H�j��
H�����R?����%@�Zn@H�j���t?0�\?��^��%@�Zn@H�j��z?B1m?��t��3���M�@�)@" �t�:8��&��=��~?P���������jO
"J
H�����R?����%@�Zn@H�j���t?0�\?��^��%@�Zn@H�j��z?B1m?��t��3���M�@�)@�
H��t?0�\?��^��%@�Zn@H�j��z?B1m?��t��3���M�@�)@ �D�q?c?A�3���M�@�)@" �H/�K�u=��^?=�ڧ�P���������jO
"J
H��t?0�\?��^��%@�Zn@H�j��z?B1m?��t��3���M�@�)@ �D�q?c?A�3���M�@�)@�
H�z?B1m?��t��3���M�@�)@ �D�q?c?A�3���M�@�)@�����s?i"�?�$�5�@�z��" �?�����1)�=�{?P���������jO
"J
H�z?B1m?��t��3���M�@�)@ �D�q?c?A�3���M�@�)@�����s?i"�?�$�5�@�z���
H �D�q?c?A�3���M�@�)@�����s?i"�?�$�5�@�z��Xd���R?P�[�X�>5ja@�r�" 1W��#^���׾=�{?P���������jO
"J
H �D�q?c?A�3���M�@�)@�����s?i"�?�$�5�@�z��Xd���R?P�[�X�>5ja@�r��
H�����s?i"�?�$�5�@�z��Xd���R?P�[�X�>5ja@�r� ��?� s?�鸿��(�z��@ƨG�" ��?�~��)>=�F}?P���������jO
"J
H�����s?i"�?�$�5�@�z��Xd���R?P�[�X�>5ja@�r� ��?� s?�鸿��(�z��@ƨG��
HXd���R?P�[�X�>5ja@�r� ��?� s?�鸿��(�z��@ƨG�lX���u? /���`�1C@�v�@" q^�����,D�=�[?P���������jO
"J
HXd���R?P�[�X�>5ja@�r� ��?� s?�鸿��(�z��@ƨG�lX���u? /���`�1C@�v�@�
H ��?� s?�鸿��(�z��@ƨG�lX���u? /���`�1C@�v�@�l}�J'J?~�A�`�1C@�v�@" �����=�_^?=�N�P���������jO
"J
H ��?� s?�鸿��(�z��@ƨG�lX���u? /���`�1C@�v�@�l}�J'J?~�A�`�1C@�v�@�
HlX���u? /���`�1C@�v�@�l}�J'J?~�A�`�1C@�v�@�-����w?��@i6����@� ��" � 2�]dc�ne��=��{?P���������jO
"J
HlX���u? /���`�1C@�v�@�l}�J'J?~�A�`�1C@�v�@�-����w?��@i6����@� ���
�=�~?P���������h
H�-����w?��@i6����@� ��,$��pb?RKI��~?vk�@���?ܒt@S?��?�~?vk�@���?" �/5?;�׾3�>=RM\�P���������h
H,$��pb?RKI��~?vk�@���?ܒt@S?��?�~?vk�@���?�V����z?�i@�o�?��@���" ����"��)�>=�2?P���������h
Hܒt@S?��?�~?vk�@���?�V����z?�i@�o�?��@�����@l��?�چ�F�?���@����" �>C��C;�=�D}?P���������j
H]ۙ�@B�Q�H-m@�9�@����" ��|�%���X�ȼ=�~?@P���������h
H]ۙ�@B�Q�H-m@�9�@�����a�@x~O?)���&`5�u�V@u�2�" ϓ[? r��$��=�q|?P���������h
H]ۙ�@B�Q�H-m@�9�@�����a�@x~O?)���&`5�u�V@u�2��l���P?+���cQ%����@����" �5d�N��tx>=%U{?P���������h
H�a�@x~O?)���&`5�u�V@u�2��l���P?+���cQ%����@������(�!}?�U�������Y�@k� @" ?�=-��'���=0�?P���������h
H�l���P?+���cQ%����@������(�!}?�U�������Y�@k� @il��r>M?�X�@��5@��@3S��" k�J�������\?=�|?P���������h
H��(�!}?�U�������Y�@k� @il��r>M?�X�@��5@��@3S���u�@�k?����+����@n�?" �;>?[;����Y�="z?P���������h
Hil��r>M?�X�@��5@��@3S���u�@�k?����+����@n�?�����p?�~@,�þjZ�@���" �����Z���"?=z|?P���������h
H�u�@�k?����+����@n�?�����p?�~@,�þjZ�@����]G@^�`?����:��x��@�T�@" Ī�>�/J=.D��=�~?P���������h
H�����p?�~@,�þjZ�@����]G@^�`?����:��x��@�T�@(���f?B��@O�>@�N�@� ��" �������?=b7}?P���������h
�=�~?P���������jO
"J
H�l}�J'J?~�A�`�1C@�v�@�-����w?��@i6����@� ��,$��pb?RKI��~?vk�@���?�
H�-����w?��@i6����@� ��,$��pb?RKI��~?vk�@���?ܒt@S?��?�~?vk�@���?" �/5?;�׾3�>=RM\�P���������jO
"J
H�-����w?��@i6����@� ��,$��pb?RKI��~?vk�@���?ܒt@S?��?�~?vk�@���?�
H,$��pb?RKI��~?vk�@���?ܒt@S?��?�~?vk�@���?�V����z?�i@�o�?��@���" ����"��)�>=�2?P���������jO
"J
H,$��pb?RKI��~?vk�@���?ܒt@S?��?�~?vk�@���?�V����z?�i@�o�?��@�꿹
Hܒt@S?��?�~?vk�@���?�V����z?�i@�o�?��@�����@l��?�چ�F�?���@����" �>C��C;�=�D}?P���������jO
"J
Hܒt@S?��?�~?vk�@���?�V����z?�i@�o�?��@�����@l��?�چ�F�?���@�����
H]ۙ�@B�Q�H-m@�9�@����" ��|�%���X�ȼ=�~?@P���������jO
"J
H]ۙ�@B�Q�H-m@�9�@�����
H]ۙ�@B�Q�H-m@�9�@�����a�@x~O?)���&`5�u�V@u�2�" ϓ[? r��$��=�q|?P���������jO
"J
H]ۙ�@B�Q�H-m@�9�@�����a�@x~O?)���&`5�u�V@u�2��
H]ۙ�@B�Q�H-m@�9�@�����a�@x~O?)���&`5�u�V@u�2��l���P?+���cQ%����@����" �5d�N��tx>=%U{?P���������jO
"J
H]ۙ�@B�Q�H-m@�9�@�����a�@x~O?)���&`5�u�V@u�2��l���P?+���cQ%����@�����
H�a�@x~O?)���&`5�u�V@u�2��l���P?+���cQ%����@������(�!}?�U�������Y�@k� @" ?�=-��'���=0�?P���������jO
"J
H�a�@x~O?)���&`5�u�V@u�2��l���P?+���cQ%����@������(�!}?�U�������Y�@k� @�
H�l���P?+���cQ%����@������(�!}?�U�������Y�@k� @il��r>M?�X�@��5@��@3S��" k�J�������\?=�|?P���������jO
"J
H�l���P?+���cQ%����@������(�!}?�U�������Y�@k� @il��r>M?�X�@��5@��@3S⿹
H��(�!}?�U�������Y�@k� @il��r>M?�X�@��5@��@3S���u�@�k?����+����@n�?" �;>?[;����Y�="z?P���������jO
"J
H��(�!}?�U�������Y�@k� @il��r>M?�X�@��5@��@3S���u�@�k?����+����@n�?�
Hil��r>M?�X�@��5@��@3S���u�@�k?����+����@n�?�����p?�~@,�þjZ�@���" �����Z���"?=z|?P���������jO
"J
Hil��r>M?�X�@��5@��@3S���u�@�k?����+����@n�?�����p?�~@,�þjZ�@����
H�u�@�k?����+����@n�?�����p?�~@,�þjZ�@����]G@^�`?����:��x��@�T�@" Ī�>�/J=.D��=�~?P���������jO
"J
H�u�@�k?����+����@n�?�����p?�~@,�þjZ�@����]G@^�`?����:��x��@�T�@�
H�����p?�~@,�þjZ�@����]G@^�`?����:��x��@�T�@(���f?B��@O�>@�N�@� ��" �������?=b7}?P���������jO
"J
H�����p?�~@,�þjZ�@����]G@^�`?����:��x��@�T�@(���f?B��@O�>@�N�@� ���
�����4��.�@��D@" CyR?+� |�=��x?P���������h
�����4��.�@��D@" CyR?+� |�=��x?P���������jO
"J
H�]G@^�`?����:��x��@�T�@(���f?B��@O�>@�N�@� ���ƽ@�2g?
�����4��.�@��D@�
H(���f?B��@O�>@�N�@� ���ƽ@�2g?
�����4��.�@��D@)>��(RE?���@:�����;@4,�?" �tj��� �%o?=ӗx?P���������jO
"J
�����4��.�@��D@)>��(RE?���@:�����;@4,�?" �tj��� �%o?=ӗx?P���������h
�����4��.�@��D@)>��(RE?���@:�����;@4,�?�
H�ƽ@�2g?
�����4��.�@��D@)>��(RE?���@:�����;@4,�?�Ӟ���c?rw�?Jo��P@��" S�U>��H��X�=(|?P���������jO
"J
�����4��.�@��D@)>��(RE?���@:�����;@4,�?�Ӟ���c?rw�?Jo��P@��" S�U>��H��X�=(|?P���������h
�����4��.�@��D@)>��(RE?���@:�����;@4,�?�Ӟ���c?rw�?Jo��P@���
���V�]?=�g�\U@@V��@�8�?" �[4=-+Y���k�=��|?P���������h
���V�]?=�g�\U@@V��@�8�?" �[4=-+Y���k�=��|?P���������jO
"J
H)>��(RE?���@:�����;@4,�?�Ӟ���c?rw�?Jo��P@��
���V�]?=�g�\U@@V��@�8�?�
���V�]?=�g�\U@@V��@�8�?(T�@��Z?��]@U��Wj�@�"�?" ��P?H��rt�>=yX|?P���������h
���V�]?=�g�\U@@V��@�8�?(T�@��Z?��]@U��Wj�@�"�?" ��P?H��rt�>=yX|?P���������jO
"J
H�Ӟ���c?rw�?Jo��P@��
���V�]?=�g�\U@@V��@�8�?(T�@��Z?��]@U��Wj�@�"�?�
H
���V�]?=�g�\U@@V��@�8�?(T�@��Z?��]@U��Wj�@�"�?D5�f_Y?���>�Ǔ�J�@w�޿" ��|�Ԃ�>��9�=o{?P���������jO
"J
���V�]?=�g�\U@@V��@�8�?(T�@��Z?��]@U��Wj�@�"�?D5�f_Y?���>�Ǔ�J�@w�޿" ��|�Ԃ�>��9�=o{?P���������h
H(T�@��Z?��]@U��Wj�@�"�?D5�f_Y?���>�Ǔ�J�@w�޿�{�@|�N?x_�I@ ��@)L�@" KG^?׭�>U�'�=y�{?P���������h
HD5�f_Y?���>�Ǔ�J�@w�޿�{�@|�N?x_�I@ ��@)L�@�f���M?A�@.�?����@��" s:ᄍ�����,?=��|?P���������h
���V�]?=�g�\U@@V��@�8�?(T�@��Z?��]@U��Wj�@�"�?D5�f_Y?���>�Ǔ�J�@w�޿�
H(T�@��Z?��]@U��Wj�@�"�?D5�f_Y?���>�Ǔ�J�@w�޿�{�@|�N?x_�I@ ��@)L�@" KG^?׭�>U�'�=y�{?P���������jO
"J
H(T�@��Z?��]@U��Wj�@�"�?D5�f_Y?���>�Ǔ�J�@w�޿�{�@|�N?x_�I@ ��@)L�@�
HD5�f_Y?���>�Ǔ�J�@w�޿�{�@|�N?x_�I@ ��@)L�@�f���M?A�@.�?����@��" s:ᄍ�����,?=��|?P���������jO
"J
HD5�f_Y?���>�Ǔ�J�@w�޿�{�@|�N?x_�I@ ��@)L�@�f���M?A�@.�?����@���
�=\;N�P���������h
H�f���M?A�@.�?����@��0JG�2��?�s�>.�?����@�� }!�J�R?3!O���@���@�O�@" �M=s�-���T�=�~?P���������h
H0JG�2��?�s�>.�?����@�� }!�J�R?3!O���@���@�O�@�E�@�^?P��@X:@,^�@��0�" c3?���� �?=��{?P���������j
Ha�<�@���?B@�@� �?" W���E*���;t�=T���@P���������h
Ha�<�@���?B@�@� �?~�q@jI�@n��??B@�@� �?" �.,?�.r�6v�>=a�#�P���������h
�=\;N�P���������jO
"J
H�{�@|�N?x_�I@ ��@)L�@�f���M?A�@.�?����@��0JG�2��?�s�>.�?����@���
H�f���M?A�@.�?����@��0JG�2��?�s�>.�?����@�� }!�J�R?3!O���@���@�O�@" �M=s�-���T�=�~?P���������jO
"J
H�f���M?A�@.�?����@��0JG�2��?�s�>.�?����@�� }!�J�R?3!O���@���@�O�@�
H0JG�2��?�s�>.�?����@�� }!�J�R?3!O���@���@�O�@�E�@�^?P��@X:@,^�@��0�" c3?���� �?=��{?P���������jO
"J
H0JG�2��?�s�>.�?����@�� }!�J�R?3!O���@���@�O�@�E�@�^?P��@X:@,^�@��0��
Ha�<�@���?B@�@� �?" W���E*���;t�=T���@P���������jO
"J
Ha�<�@���?B@�@� �?�
Ha�<�@���?B@�@� �?~�q@jI�@n��??B@�@� �?" �.,?�.r�6v�>=a�#�P���������jO
"J
Ha�<�@���?B@�@� �?~�q@jI�@n��??B@�@� �?�
1����O����==X�~?P���������h
H~�q@jI�@n��??B@�@� �?��l���p?O@�k@��@��ĿVO�@�m�?4����<�@r{�" ��5?�~.�%�ܾ=�}?P���������h
H��l���p?O@�k@��@��ĿVO�@�m�?4����<�@r{�9���?��?)gW���<�@r{�" 0�v��㪾�*B==fM��P���������h
HVO�@�m�?4����<�@r{�9���?��?)gW���<�@r{�>���S�?LA���.�?R��@H��" �۽<��r���==��?P���������h
H9���?��?)gW���<�@r{�>���S�?LA���.�?R��@H�����@v(x?�_s����B?�@gj:�" c�B?��μL1��=^u}?P���������h
H>���S�?LA���.�?R��@H�����@v(x?�_s����B?�@gj:�]g���K?�/���k@ ��@LlC@" l�W����>���='i|?P���������h
H���@v(x?�_s����B?�@gj:�]g���K?�/���k@ ��@LlC@�t�@�"E?��A�k@ ��@LlC@" ��w?�^�>2~R?=���P���������h
H]g���K?�/���k@ ��@LlC@�t�@�"E?��A�k@ ��@LlC@�E�?�c?���?����`��@jZ.?" �3��4���=${?P���������h
H�t�@�"E?��A�k@ ��@LlC@�E�?�c?���?����`��@jZ.?�����tp?�< @m�l�HK�@S-�" *q(�3�V�wD==��}?P���������h
H�E�?�c?���?����`��@jZ.?�����tp?�< @m�l�HK�@S-�����)G�?`������?�7�@C�@" ���>ۉ+� ���=�S~?P���������h
H�����tp?�< @m�l�HK�@S-�����)G�?`������?�7�@C�@9�Z@��a?2L9@|M ��Z�@��˾" ���>��o��o?=���?P���������h
H����)G�?`������?�7�@C�@9�Z@��a?2L9@|M ��Z�@��˾U��zm`?����0��@r2�@Κ�" T�*�'��<�E��=|5}?P���������h
H9�Z@��a?2L9@|M ��Z�@��˾U��zm`?����0��@r2�@Κ�T|Af�N?</W��,!�c��@�:��" e�~?]{>;..==փ{?P���������h
HU��zm`?����0��@r2�@�T|Af�N?</W��,!�c��@�:��Yb���]?�����,!�c��@�:��" a=q�=q�<K�z�=E���P���������h
HT|Af�N?</W��,!�c��@�:��Yb���]?�����,!�c��@�:��i�y���9?�ݵ��,!�c��@�:��" � _=�O�9���==�xH�P���������h
HYb���]?�����,!�c��@�:��i�y���9?�ݵ��,!�c��@�:��������r?P֊�� !��{�@:�n@" �D>����6��==-N?P���������h
Hi�y���9?�ݵ��,!�c��@�:��������r?P֊�� !��{�@:�n@/��?K?5$�@d��>JZ�@֫�?" �8Y��[=Ē/?=��}?P���������h
1����O����==X�~?P���������jO
"J
Ha�<�@���?B@�@� �?~�q@jI�@n��??B@�@� �?��l���p?O@�k@��@��Ŀ�
H~�q@jI�@n��??B@�@� �?��l���p?O@�k@��@��ĿVO�@�m�?4����<�@r{�" ��5?�~.�%�ܾ=�}?P���������jO
"J
H~�q@jI�@n��??B@�@� �?��l���p?O@�k@��@��ĿVO�@�m�?4����<�@r{��
H��l���p?O@�k@��@��ĿVO�@�m�?4����<�@r{�9���?��?)gW���<�@r{�" 0�v��㪾�*B==fM��P���������jO
"J
H��l���p?O@�k@��@��ĿVO�@�m�?4����<�@r{�9���?��?)gW���<�@r{��
HVO�@�m�?4����<�@r{�9���?��?)gW���<�@r{�>���S�?LA���.�?R��@H��" �۽<��r���==��?P���������jO
"J
HVO�@�m�?4����<�@r{�9���?��?)gW���<�@r{�>���S�?LA���.�?R��@H���
H9���?��?)gW���<�@r{�>���S�?LA���.�?R��@H�����@v(x?�_s����B?�@gj:�" c�B?��μL1��=^u}?P���������jO
"J
H9���?��?)gW���<�@r{�>���S�?LA���.�?R��@H�����@v(x?�_s����B?�@gj:��
H>���S�?LA���.�?R��@H�����@v(x?�_s����B?�@gj:�]g���K?�/���k@ ��@LlC@" l�W����>���='i|?P���������jO
"J
H>���S�?LA���.�?R��@H�����@v(x?�_s����B?�@gj:�]g���K?�/���k@ ��@LlC@�
H���@v(x?�_s����B?�@gj:�]g���K?�/���k@ ��@LlC@�t�@�"E?��A�k@ ��@LlC@" ��w?�^�>2~R?=���P���������jO
"J
H���@v(x?�_s����B?�@gj:�]g���K?�/���k@ ��@LlC@�t�@�"E?��A�k@ ��@LlC@�
H]g���K?�/���k@ ��@LlC@�t�@�"E?��A�k@ ��@LlC@�E�?�c?���?����`��@jZ.?" �3��4���=${?P���������jO
"J
H]g���K?�/���k@ ��@LlC@�t�@�"E?��A�k@ ��@LlC@�E�?�c?���?����`��@jZ.?�
H�t�@�"E?��A�k@ ��@LlC@�E�?�c?���?����`��@jZ.?�����tp?�< @m�l�HK�@S-�" *q(�3�V�wD==��}?P���������jO
"J
H�t�@�"E?��A�k@ ��@LlC@�E�?�c?���?����`��@jZ.?�����tp?�< @m�l�HK�@S-��
H�E�?�c?���?����`��@jZ.?�����tp?�< @m�l�HK�@S-�����)G�?`������?�7�@C�@" ���>ۉ+� ���=�S~?P���������jO
"J
H�E�?�c?���?����`��@jZ.?�����tp?�< @m�l�HK�@S-�����)G�?`������?�7�@C�@�
H�����tp?�< @m�l�HK�@S-�����)G�?`������?�7�@C�@9�Z@��a?2L9@|M ��Z�@��˾" ���>��o��o?=���?P���������jO
"J
H�����tp?�< @m�l�HK�@S-�����)G�?`������?�7�@C�@9�Z@��a?2L9@|M ��Z�@��˾�
H����)G�?`������?�7�@C�@9�Z@��a?2L9@|M ��Z�@��˾U��zm`?����0��@r2�@Κ�" T�*�'��<�E��=|5}?P���������jO
"J
H����)G�?`������?�7�@C�@9�Z@��a?2L9@|M ��Z�@��˾U��zm`?����0��@r2�@Κ��
H9�Z@��a?2L9@|M ��Z�@��˾U��zm`?����0��@r2�@Κ�T|Af�N?</W��,!�c��@�:��" e�~?]{>;..==փ{?P���������jO
"J
H9�Z@��a?2L9@|M ��Z�@��˾U��zm`?����0��@r2�@Κ�T|Af�N?</W��,!�c��@�:���
HU��zm`?����0��@r2�@�T|Af�N?</W��,!�c��@�:��Yb���]?�����,!�c��@�:��" a=q�=q�<K�z�=E���P���������jO
"J
HU��zm`?����0��@r2�@�T|Af�N?</W��,!�c��@�:��Yb���]?�����,!�c��@�:���
HT|Af�N?</W��,!�c��@�:��Yb���]?�����,!�c��@�:��i�y���9?�ݵ��,!�c��@�:��" � _=�O�9���==�xH�P���������jO
"J
HT|Af�N?</W��,!�c��@�:��Yb���]?�����,!�c��@�:��i�y���9?�ݵ��,!�c��@�:���
HYb���]?�����,!�c��@�:��i�y���9?�ݵ��,!�c��@�:��������r?P֊�� !��{�@:�n@" �D>����6��==-N?P���������jO
"J
HYb���]?�����,!�c��@�:��i�y���9?�ݵ��,!�c��@�:��������r?P֊�� !��{�@:�n@�
Hi�y���9?�ݵ��,!�c��@�:��������r?P֊�� !��{�@:�n@/��?K?5$�@d��>JZ�@֫�?" �8Y��[=Ē/?=��}?P���������jO
"J
Hi�y���9?�ݵ��,!�c��@�:��������r?P֊�� !��{�@:�n@/��?K?5$�@d��>JZ�@֫�?�
�W����@�'�" ��>�we�� %�=9�|?P���������j
H�5 �@�6�?6D�@r�<@���" 0O6�Sa�d[�>=�}?@P���������h
H�5 �@�6�?6D�@r�<@�����@a�h?ܿ7�6D�@r�<@���" ;Q�>�T� ���=�G�P���������h
H�5 �@�6�?6D�@r�<@�����@a�h?ܿ7�6D�@r�<@����$�@�@?�ho��/�@U_�@:�" �5�������=Ŧ?P���������h
H��@a�h?ܿ7�6D�@r�<@����$�@�@?�ho��/�@U_�@:�l)>@�9O?D�l��<p>���@���@" G\"�����7H>=*�?P���������h
�W����@�'�" ��>�we�� %�=9�|?P���������jO
"J
H������r?P֊�� !��{�@:�n@/��?K?5$�@d��>JZ�@֫�?`�@v\�?)+�
�W����@�'��
H�5 �@�6�?6D�@r�<@���" 0O6�Sa�d[�>=�}?@P���������jO
"J
H�5 �@�6�?6D�@r�<@����
H�5 �@�6�?6D�@r�<@�����@a�h?ܿ7�6D�@r�<@���" ;Q�>�T� ���=�G�P���������jO
"J
H�5 �@�6�?6D�@r�<@�����@a�h?ܿ7�6D�@r�<@����
H�5 �@�6�?6D�@r�<@�����@a�h?ܿ7�6D�@r�<@����$�@�@?�ho��/�@U_�@:�" �5�������=Ŧ?P���������jO
"J
H�5 �@�6�?6D�@r�<@�����@a�h?ܿ7�6D�@r�<@����$�@�@?�ho��/�@U_�@:��
H��@a�h?ܿ7�6D�@r�<@����$�@�@?�ho��/�@U_�@:�l)>@�9O?D�l��<p>���@���@" G\"�����7H>=*�?P���������jO
"J
H��@a�h?ܿ7�6D�@r�<@����$�@�@?�ho��/�@U_�@:�l)>@�9O?D�l��<p>���@���@�
:?c1A-��?'ט@ᘿ" �fž (�;{ 5?=D;}?P���������h
:?c1A-��?'ט@ᘿ" �fž (�;{ 5?=D;}?P���������jO
"J
H�$�@�@?�ho��/�@U_�@:�l)>@�9O?D�l��<p>���@���@z�8��
:?c1A-��?'ט@ᘿ�
:?c1A-��?'ט@ᘿ� @��m?�`x��C���q@�k�?" Z��>���w�=�a{?P���������h
:?c1A-��?'ט@ᘿ� @��m?�`x��C���q@�k�?" Z��>���w�=�a{?P���������jO
"J
Hl)>@�9O?D�l��<p>���@���@z�8��
:?c1A-��?'ט@ᘿ� @��m?�`x��C���q@�k�?�
�%�$?=^H{?P���������h
H� @��m?�`x��C���q@�k�?;f���G[?���@/'`��B�@|�?%O���S?�<?�_{@�K@��?" #�*>�:���|�=�z?P���������h
H;f���G[?���@/'`��B�@|�?%O���S?�<?�_{@�K@��?���@��s?�=��.�?�/�@ƈ�" 3tL?�0H�����=`�z?P���������h
�%�$?=^H{?P���������jO
"J
Hz�8��
:?c1A-��?'ט@ᘿ� @��m?�`x��C���q@�k�?;f���G[?���@/'`��B�@|�?�
H� @��m?�`x��C���q@�k�?;f���G[?���@/'`��B�@|�?%O���S?�<?�_{@�K@��?" #�*>�:���|�=�z?P���������jO
"J
H� @��m?�`x��C���q@�k�?;f���G[?���@/'`��B�@|�?%O���S?�<?�_{@�K@��?�
H;f���G[?���@/'`��B�@|�?%O���S?�<?�_{@�K@��?���@��s?�=��.�?�/�@ƈ�" 3tL?�0H�����=`�z?P���������jO
"J
H;f���G[?���@/'`��B�@|�?%O���S?�<?�_{@�K@��?���@��s?�=��.�?�/�@ƈ��
H%O���S?�<?�_{@�K@��?���@��s?�=��.�?�/�@ƈ�_{�=v
W?J��Ą�@[�8@�Ք�" *����s �K��=��|?P���������jO
"J
W?J��Ą�@[�8@�Ք�" *����s �K��=��|?P���������h
W?J��Ą�@[�8@�Ք��
|?P���������h
|?P���������jO
"J
H���@��s?�=��.�?�/�@ƈ�_{�=v
W?J��Ą�@[�8@�Ք�V�@�Nc?���@�N@QQտ�
�>=$o�?P���������h
HV�@�Nc?���@�N@QQտ'?�?�`V?�)����%���@���>���� ]r?�z�?��H����@���" :'���˻[�==W�~?P���������h
H'?�?�`V?�)����%���@���>���� ]r?�z�?��H����@����?��G?����n<?�!@b� �" ?��>c�n>_Z��=D�}?P���������h
H���� ]r?�z�?��H����@����?��G?����n<?�!@b� �� +?��z?\#���*R�㲒@8�@" N<y{ �!��>=��}?P���������h
H�?��G?����n<?�!@b� �� +?��z?\#���*R�㲒@8�@s�b�)S?0�@�'�uy�@��@" ���� ���+?=��|?P���������h
�>=$o�?P���������jO
"J
H_{�=v
W?J��Ą�@[�8@�Ք�V�@�Nc?���@�N@QQտ'?�?�`V?�)����%���@���>�
HV�@�Nc?���@�N@QQտ'?�?�`V?�)����%���@���>���� ]r?�z�?��H����@���" :'���˻[�==W�~?P���������jO
"J
HV�@�Nc?���@�N@QQտ'?�?�`V?�)����%���@���>���� ]r?�z�?��H����@����
H'?�?�`V?�)����%���@���>���� ]r?�z�?��H����@����?��G?����n<?�!@b� �" ?��>c�n>_Z��=D�}?P���������jO
"J
H'?�?�`V?�)����%���@���>���� ]r?�z�?��H����@����?��G?����n<?�!@b� ��
H���� ]r?�z�?��H����@����?��G?����n<?�!@b� �� +?��z?\#���*R�㲒@8�@" N<y{ �!��>=��}?P���������jO
"J
H���� ]r?�z�?��H����@����?��G?����n<?�!@b� �� +?��z?\#���*R�㲒@8�@�
H�?��G?����n<?�!@b� �� +?��z?\#���*R�㲒@8�@s�b�)S?0�@�'�uy�@��@" ���� ���+?=��|?P���������jO
"J
H�?��G?����n<?�!@b� �� +?��z?\#���*R�㲒@8�@s�b�)S?0�@�'�uy�@��@�
!�?�G @hI_��j�@�@" � =�O*==˰�=�z?P��������� ExpertBouncer` -�ćA
!�?�G @hI_��j�@�@" � =�O*==˰�=�z?P���������jO
"J
H� +?��z?\#���*R�㲒@8�@s�b�)S?0�@�'�uy�@��@Z���
!�?�G @hI_��j�@�@

993
demos/ExpertCrawlerDyn.demo
文件差异内容过多而无法显示
查看文件

1000
demos/ExpertFood.demo
文件差异内容过多而无法显示
查看文件

485
demos/ExpertGrid.demo
文件差异内容过多而无法显示
查看文件

978
demos/ExpertHallway.demo
文件差异内容过多而无法显示
查看文件

1001
demos/ExpertPyramid.demo
文件差异内容过多而无法显示
查看文件

1001
demos/ExpertReacher.demo
文件差异内容过多而无法显示
查看文件

1001
demos/ExpertTennis.demo
文件差异内容过多而无法显示
查看文件

6
gym-unity/gym_unity/envs/__init__.py


"Otherwise, please note that only the first will be provided in the observation."
)
if brain.num_stacked_vector_observations != 1:
raise UnityGymException(
"There can only be one stacked vector observation in a UnityEnvironment "
"if it is wrapped in a gym."
)
# Check for number of agents in scene.
initial_info = self._env.reset()[self.brain_name]
self._check_agents(len(initial_info.agents))

5
gym-unity/gym_unity/tests/test_gym.py


def create_mock_brainparams(
number_visual_observations=0,
num_stacked_vector_observations=1,
vector_action_space_type="continuous",
vector_observation_space_size=3,
vector_action_space_size=None,

CameraResolution(width=8, height=8, num_channels=3)
for _ in range(number_visual_observations)
]
mock_brain.return_value.num_stacked_vector_observations = (
num_stacked_vector_observations
)
mock_brain.return_value.vector_action_space_type = vector_action_space_type
mock_brain.return_value.vector_observation_space_size = (
vector_observation_space_size

130
ml-agents-envs/mlagents/envs/brain.py


from mlagents.envs.communicator_objects.agent_info_pb2 import AgentInfoProto
from mlagents.envs.communicator_objects.brain_parameters_pb2 import BrainParametersProto
from mlagents.envs.communicator_objects.observation_pb2 import ObservationProto
from mlagents.envs.timers import hierarchical_timer, timed
from typing import Dict, List, NamedTuple, Optional
from PIL import Image

def gray_scale(self) -> bool:
return self.num_channels == 1
def __str__(self):
return f"CameraResolution({self.height}, {self.width}, {self.num_channels})"
class BrainParameters:
def __init__(

num_stacked_vector_observations: int,
camera_resolutions: List[CameraResolution],
vector_action_space_size: List[int],
vector_action_descriptions: List[str],

"""
self.brain_name = brain_name
self.vector_observation_space_size = vector_observation_space_size
self.num_stacked_vector_observations = num_stacked_vector_observations
self.number_visual_observations = len(camera_resolutions)
self.camera_resolutions = camera_resolutions
self.vector_action_space_size = vector_action_space_size

def __str__(self):
return """Unity brain name: {}
Number of Visual Observations (per agent): {}
Camera Resolutions: {}
Number of stacked Vector Observation: {}
str([str(cr) for cr in self.camera_resolutions]),
str(self.num_stacked_vector_observations),
self.vector_action_space_type,
str(self.vector_action_space_size),
", ".join(self.vector_action_descriptions),

:return: BrainParameter object.
"""
resolutions = [
CameraResolution(x.shape[0], x.shape[1], x.shape[2])
for x in agent_info.compressed_observations
CameraResolution(obs.shape[0], obs.shape[1], obs.shape[2])
for obs in agent_info.observations
if len(obs.shape) >= 3
total_vector_obs = sum(
obs.shape[0] for obs in agent_info.observations if len(obs.shape) == 1
)
brain_param_proto.brain_name,
brain_param_proto.vector_observation_size,
brain_param_proto.num_stacked_vector_observations,
resolutions,
list(brain_param_proto.vector_action_size),
list(brain_param_proto.vector_action_descriptions),
brain_param_proto.vector_action_space_type,
brain_name=brain_param_proto.brain_name,
vector_observation_space_size=total_vector_obs,
camera_resolutions=resolutions,
vector_action_space_size=list(brain_param_proto.vector_action_size),
vector_action_descriptions=list(
brain_param_proto.vector_action_descriptions
),
vector_action_space_type=brain_param_proto.vector_action_space_type,
)
return brain_params

"""
Converts list of agent infos to BrainInfo.
"""
vis_obs: List[np.ndarray] = []
for i in range(brain_params.number_visual_observations):
obs = [
BrainInfo.process_pixels(
x.compressed_observations[i].data,
brain_params.camera_resolutions[i].gray_scale,
)
for x in agent_info_list
]
vis_obs += [obs]
vis_obs = BrainInfo._process_visual_observations(brain_params, agent_info_list)
total_num_actions = sum(brain_params.vector_action_space_size)
mask_actions = np.ones((len(agent_info_list), total_num_actions))

"An agent had a NaN reward for brain " + brain_params.brain_name
)
if len(agent_info_list) == 0:
vector_obs = np.zeros(
(
0,
brain_params.vector_observation_space_size
* brain_params.num_stacked_vector_observations,
vector_obs = BrainInfo._process_vector_observations(
brain_params, agent_info_list
)
agents = [f"${worker_id}-{x.id}" for x in agent_info_list]
brain_info = BrainInfo(
visual_observation=vis_obs,
vector_observation=vector_obs,
reward=[x.reward if not np.isnan(x.reward) else 0 for x in agent_info_list],
agents=agents,
local_done=[x.done for x in agent_info_list],
vector_action=np.array([x.stored_vector_actions for x in agent_info_list]),
max_reached=[x.max_step_reached for x in agent_info_list],
action_mask=mask_actions,
)
return brain_info
@staticmethod
def _process_visual_observations(
brain_params: BrainParameters, agent_info_list: List[AgentInfoProto]
) -> List[np.ndarray]:
visual_observation_protos: List[List[ObservationProto]] = []
# Grab the visual observations - need this together so we can iterate with the camera observations
for agent in agent_info_list:
agent_vis: List[ObservationProto] = []
for proto_obs in agent.observations:
is_visual = len(proto_obs.shape) == 3
if is_visual:
agent_vis.append(proto_obs)
visual_observation_protos.append(agent_vis)
vis_obs: List[np.ndarray] = []
for i in range(brain_params.number_visual_observations):
# TODO check compression type, handle uncompressed visuals
obs = [
BrainInfo.process_pixels(
agent_obs[i].compressed_data,
brain_params.camera_resolutions[i].gray_scale,
)
for agent_obs in visual_observation_protos
]
vis_obs += [obs]
return vis_obs
@staticmethod
def _process_vector_observations(
brain_params: BrainParameters, agent_info_list: List[AgentInfoProto]
) -> np.ndarray:
if len(agent_info_list) == 0:
vector_obs = np.zeros((0, brain_params.vector_observation_space_size))
for x in agent_info_list:
np_obs = np.array(x.stacked_vector_observation)
for agent_info in agent_info_list:
vec_obs = [
obs for obs in agent_info.observations if len(obs.shape) == 1
]
# Concatenate vector obs
proto_vector_obs: List[float] = []
for vo in vec_obs:
# TODO consider itertools.chain here
proto_vector_obs.extend(vo.float_data.data)
np_obs = np.array(proto_vector_obs)
# Check for NaNs or infs in the observations
# If there's a NaN in the observations, the dot() result will be NaN
# If there's an Inf (either sign) then the result will be Inf

logger.warning(
f"An agent had a NaN observation for brain {brain_params.brain_name}"
)
agents = [f"${worker_id}-{x.id}" for x in agent_info_list]
brain_info = BrainInfo(
visual_observation=vis_obs,
vector_observation=vector_obs,
reward=[x.reward if not np.isnan(x.reward) else 0 for x in agent_info_list],
agents=agents,
local_done=[x.done for x in agent_info_list],
vector_action=np.array([x.stored_vector_actions for x in agent_info_list]),
max_reached=[x.max_step_reached for x in agent_info_list],
action_mask=mask_actions,
)
return brain_info
return vector_obs
def safe_concat_lists(l1: Optional[List], l2: Optional[List]) -> Optional[List]:

33
ml-agents-envs/mlagents/envs/communicator_objects/agent_info_pb2.py


_sym_db = _symbol_database.Default()
from mlagents.envs.communicator_objects import compressed_observation_pb2 as mlagents_dot_envs_dot_communicator__objects_dot_compressed__observation__pb2
from mlagents.envs.communicator_objects import observation_pb2 as mlagents_dot_envs_dot_communicator__objects_dot_observation__pb2
DESCRIPTOR = _descriptor.FileDescriptor(

serialized_pb=_b('\n3mlagents/envs/communicator_objects/agent_info.proto\x12\x14\x63ommunicator_objects\x1a?mlagents/envs/communicator_objects/compressed_observation.proto\"\x9d\x02\n\x0e\x41gentInfoProto\x12\"\n\x1astacked_vector_observation\x18\x01 \x03(\x02\x12\x1d\n\x15stored_vector_actions\x18\x04 \x03(\x02\x12\x0e\n\x06reward\x18\x07 \x01(\x02\x12\x0c\n\x04\x64one\x18\x08 \x01(\x08\x12\x18\n\x10max_step_reached\x18\t \x01(\x08\x12\n\n\x02id\x18\n \x01(\x05\x12\x13\n\x0b\x61\x63tion_mask\x18\x0b \x03(\x08\x12Q\n\x17\x63ompressed_observations\x18\r \x03(\x0b\x32\x30.communicator_objects.CompressedObservationProtoJ\x04\x08\x02\x10\x03J\x04\x08\x03\x10\x04J\x04\x08\x05\x10\x06J\x04\x08\x06\x10\x07J\x04\x08\x0c\x10\rB\x1f\xaa\x02\x1cMLAgents.CommunicatorObjectsb\x06proto3')
serialized_pb=_b('\n3mlagents/envs/communicator_objects/agent_info.proto\x12\x14\x63ommunicator_objects\x1a\x34mlagents/envs/communicator_objects/observation.proto\"\xea\x01\n\x0e\x41gentInfoProto\x12\x1d\n\x15stored_vector_actions\x18\x04 \x03(\x02\x12\x0e\n\x06reward\x18\x07 \x01(\x02\x12\x0c\n\x04\x64one\x18\x08 \x01(\x08\x12\x18\n\x10max_step_reached\x18\t \x01(\x08\x12\n\n\x02id\x18\n \x01(\x05\x12\x13\n\x0b\x61\x63tion_mask\x18\x0b \x03(\x08\x12<\n\x0cobservations\x18\r \x03(\x0b\x32&.communicator_objects.ObservationProtoJ\x04\x08\x01\x10\x02J\x04\x08\x02\x10\x03J\x04\x08\x03\x10\x04J\x04\x08\x05\x10\x06J\x04\x08\x06\x10\x07J\x04\x08\x0c\x10\rB\x1f\xaa\x02\x1cMLAgents.CommunicatorObjectsb\x06proto3')
dependencies=[mlagents_dot_envs_dot_communicator__objects_dot_compressed__observation__pb2.DESCRIPTOR,])
dependencies=[mlagents_dot_envs_dot_communicator__objects_dot_observation__pb2.DESCRIPTOR,])

containing_type=None,
fields=[
_descriptor.FieldDescriptor(
name='stacked_vector_observation', full_name='communicator_objects.AgentInfoProto.stacked_vector_observation', index=0,
number=1, type=2, cpp_type=6, label=3,
has_default_value=False, default_value=[],
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None, file=DESCRIPTOR),
_descriptor.FieldDescriptor(
name='stored_vector_actions', full_name='communicator_objects.AgentInfoProto.stored_vector_actions', index=1,
name='stored_vector_actions', full_name='communicator_objects.AgentInfoProto.stored_vector_actions', index=0,
number=4, type=2, cpp_type=6, label=3,
has_default_value=False, default_value=[],
message_type=None, enum_type=None, containing_type=None,

name='reward', full_name='communicator_objects.AgentInfoProto.reward', index=2,
name='reward', full_name='communicator_objects.AgentInfoProto.reward', index=1,
number=7, type=2, cpp_type=6, label=1,
has_default_value=False, default_value=float(0),
message_type=None, enum_type=None, containing_type=None,

name='done', full_name='communicator_objects.AgentInfoProto.done', index=3,
name='done', full_name='communicator_objects.AgentInfoProto.done', index=2,
number=8, type=8, cpp_type=7, label=1,
has_default_value=False, default_value=False,
message_type=None, enum_type=None, containing_type=None,

name='max_step_reached', full_name='communicator_objects.AgentInfoProto.max_step_reached', index=4,
name='max_step_reached', full_name='communicator_objects.AgentInfoProto.max_step_reached', index=3,
number=9, type=8, cpp_type=7, label=1,
has_default_value=False, default_value=False,
message_type=None, enum_type=None, containing_type=None,

name='id', full_name='communicator_objects.AgentInfoProto.id', index=5,
name='id', full_name='communicator_objects.AgentInfoProto.id', index=4,
number=10, type=5, cpp_type=1, label=1,
has_default_value=False, default_value=0,
message_type=None, enum_type=None, containing_type=None,

name='action_mask', full_name='communicator_objects.AgentInfoProto.action_mask', index=6,
name='action_mask', full_name='communicator_objects.AgentInfoProto.action_mask', index=5,
number=11, type=8, cpp_type=7, label=3,
has_default_value=False, default_value=[],
message_type=None, enum_type=None, containing_type=None,

name='compressed_observations', full_name='communicator_objects.AgentInfoProto.compressed_observations', index=7,
name='observations', full_name='communicator_objects.AgentInfoProto.observations', index=6,
number=13, type=11, cpp_type=10, label=3,
has_default_value=False, default_value=[],
message_type=None, enum_type=None, containing_type=None,

extension_ranges=[],
oneofs=[
],
serialized_start=143,
serialized_end=428,
serialized_start=132,
serialized_end=366,
_AGENTINFOPROTO.fields_by_name['compressed_observations'].message_type = mlagents_dot_envs_dot_communicator__objects_dot_compressed__observation__pb2._COMPRESSEDOBSERVATIONPROTO
_AGENTINFOPROTO.fields_by_name['observations'].message_type = mlagents_dot_envs_dot_communicator__objects_dot_observation__pb2._OBSERVATIONPROTO
DESCRIPTOR.message_types_by_name['AgentInfoProto'] = _AGENTINFOPROTO
_sym_db.RegisterFileDescriptor(DESCRIPTOR)

14
ml-agents-envs/mlagents/envs/communicator_objects/agent_info_pb2.pyi


Message as google___protobuf___message___Message,
)
from mlagents.envs.communicator_objects.compressed_observation_pb2 import (
CompressedObservationProto as mlagents___envs___communicator_objects___compressed_observation_pb2___CompressedObservationProto,
from mlagents.envs.communicator_objects.observation_pb2 import (
ObservationProto as mlagents___envs___communicator_objects___observation_pb2___ObservationProto,
)
from typing import (

class AgentInfoProto(google___protobuf___message___Message):
DESCRIPTOR: google___protobuf___descriptor___Descriptor = ...
stacked_vector_observation = ... # type: google___protobuf___internal___containers___RepeatedScalarFieldContainer[builtin___float]
stored_vector_actions = ... # type: google___protobuf___internal___containers___RepeatedScalarFieldContainer[builtin___float]
reward = ... # type: builtin___float
done = ... # type: builtin___bool

@property
def compressed_observations(self) -> google___protobuf___internal___containers___RepeatedCompositeFieldContainer[mlagents___envs___communicator_objects___compressed_observation_pb2___CompressedObservationProto]: ...
def observations(self) -> google___protobuf___internal___containers___RepeatedCompositeFieldContainer[mlagents___envs___communicator_objects___observation_pb2___ObservationProto]: ...
stacked_vector_observation : typing___Optional[typing___Iterable[builtin___float]] = None,
stored_vector_actions : typing___Optional[typing___Iterable[builtin___float]] = None,
reward : typing___Optional[builtin___float] = None,
done : typing___Optional[builtin___bool] = None,

compressed_observations : typing___Optional[typing___Iterable[mlagents___envs___communicator_objects___compressed_observation_pb2___CompressedObservationProto]] = None,
observations : typing___Optional[typing___Iterable[mlagents___envs___communicator_objects___observation_pb2___ObservationProto]] = None,
) -> None: ...
@classmethod
def FromString(cls, s: builtin___bytes) -> AgentInfoProto: ...

def ClearField(self, field_name: typing_extensions___Literal[u"action_mask",u"compressed_observations",u"done",u"id",u"max_step_reached",u"reward",u"stacked_vector_observation",u"stored_vector_actions"]) -> None: ...
def ClearField(self, field_name: typing_extensions___Literal[u"action_mask",u"done",u"id",u"max_step_reached",u"observations",u"reward",u"stored_vector_actions"]) -> None: ...
def ClearField(self, field_name: typing_extensions___Literal[u"action_mask",b"action_mask",u"compressed_observations",b"compressed_observations",u"done",b"done",u"id",b"id",u"max_step_reached",b"max_step_reached",u"reward",b"reward",u"stacked_vector_observation",b"stacked_vector_observation",u"stored_vector_actions",b"stored_vector_actions"]) -> None: ...
def ClearField(self, field_name: typing_extensions___Literal[u"action_mask",b"action_mask",u"done",b"done",u"id",b"id",u"max_step_reached",b"max_step_reached",u"observations",b"observations",u"reward",b"reward",u"stored_vector_actions",b"stored_vector_actions"]) -> None: ...

28
ml-agents-envs/mlagents/envs/communicator_objects/brain_parameters_pb2.py


name='mlagents/envs/communicator_objects/brain_parameters.proto',
package='communicator_objects',
syntax='proto3',
serialized_pb=_b('\n9mlagents/envs/communicator_objects/brain_parameters.proto\x12\x14\x63ommunicator_objects\x1a\x33mlagents/envs/communicator_objects/space_type.proto\"\x97\x02\n\x14\x42rainParametersProto\x12\x1f\n\x17vector_observation_size\x18\x01 \x01(\x05\x12\'\n\x1fnum_stacked_vector_observations\x18\x02 \x01(\x05\x12\x1a\n\x12vector_action_size\x18\x03 \x03(\x05\x12\"\n\x1avector_action_descriptions\x18\x05 \x03(\t\x12\x46\n\x18vector_action_space_type\x18\x06 \x01(\x0e\x32$.communicator_objects.SpaceTypeProto\x12\x12\n\nbrain_name\x18\x07 \x01(\t\x12\x13\n\x0bis_training\x18\x08 \x01(\x08J\x04\x08\x04\x10\x05\x42\x1f\xaa\x02\x1cMLAgents.CommunicatorObjectsb\x06proto3')
serialized_pb=_b('\n9mlagents/envs/communicator_objects/brain_parameters.proto\x12\x14\x63ommunicator_objects\x1a\x33mlagents/envs/communicator_objects/space_type.proto\"\xd9\x01\n\x14\x42rainParametersProto\x12\x1a\n\x12vector_action_size\x18\x03 \x03(\x05\x12\"\n\x1avector_action_descriptions\x18\x05 \x03(\t\x12\x46\n\x18vector_action_space_type\x18\x06 \x01(\x0e\x32$.communicator_objects.SpaceTypeProto\x12\x12\n\nbrain_name\x18\x07 \x01(\t\x12\x13\n\x0bis_training\x18\x08 \x01(\x08J\x04\x08\x01\x10\x02J\x04\x08\x02\x10\x03J\x04\x08\x04\x10\x05\x42\x1f\xaa\x02\x1cMLAgents.CommunicatorObjectsb\x06proto3')
,
dependencies=[mlagents_dot_envs_dot_communicator__objects_dot_space__type__pb2.DESCRIPTOR,])

containing_type=None,
fields=[
_descriptor.FieldDescriptor(
name='vector_observation_size', full_name='communicator_objects.BrainParametersProto.vector_observation_size', index=0,
number=1, type=5, cpp_type=1, label=1,
has_default_value=False, default_value=0,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None, file=DESCRIPTOR),
_descriptor.FieldDescriptor(
name='num_stacked_vector_observations', full_name='communicator_objects.BrainParametersProto.num_stacked_vector_observations', index=1,
number=2, type=5, cpp_type=1, label=1,
has_default_value=False, default_value=0,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None, file=DESCRIPTOR),
_descriptor.FieldDescriptor(
name='vector_action_size', full_name='communicator_objects.BrainParametersProto.vector_action_size', index=2,
name='vector_action_size', full_name='communicator_objects.BrainParametersProto.vector_action_size', index=0,
number=3, type=5, cpp_type=1, label=3,
has_default_value=False, default_value=[],
message_type=None, enum_type=None, containing_type=None,

name='vector_action_descriptions', full_name='communicator_objects.BrainParametersProto.vector_action_descriptions', index=3,
name='vector_action_descriptions', full_name='communicator_objects.BrainParametersProto.vector_action_descriptions', index=1,
number=5, type=9, cpp_type=9, label=3,
has_default_value=False, default_value=[],
message_type=None, enum_type=None, containing_type=None,

name='vector_action_space_type', full_name='communicator_objects.BrainParametersProto.vector_action_space_type', index=4,
name='vector_action_space_type', full_name='communicator_objects.BrainParametersProto.vector_action_space_type', index=2,
number=6, type=14, cpp_type=8, label=1,
has_default_value=False, default_value=0,
message_type=None, enum_type=None, containing_type=None,

name='brain_name', full_name='communicator_objects.BrainParametersProto.brain_name', index=5,
name='brain_name', full_name='communicator_objects.BrainParametersProto.brain_name', index=3,
number=7, type=9, cpp_type=9, label=1,
has_default_value=False, default_value=_b("").decode('utf-8'),
message_type=None, enum_type=None, containing_type=None,

name='is_training', full_name='communicator_objects.BrainParametersProto.is_training', index=6,
name='is_training', full_name='communicator_objects.BrainParametersProto.is_training', index=4,
number=8, type=8, cpp_type=7, label=1,
has_default_value=False, default_value=False,
message_type=None, enum_type=None, containing_type=None,

oneofs=[
],
serialized_start=137,
serialized_end=416,
serialized_end=354,
)
_BRAINPARAMETERSPROTO.fields_by_name['vector_action_space_type'].enum_type = mlagents_dot_envs_dot_communicator__objects_dot_space__type__pb2._SPACETYPEPROTO

8
ml-agents-envs/mlagents/envs/communicator_objects/brain_parameters_pb2.pyi


class BrainParametersProto(google___protobuf___message___Message):
DESCRIPTOR: google___protobuf___descriptor___Descriptor = ...
vector_observation_size = ... # type: builtin___int
num_stacked_vector_observations = ... # type: builtin___int
vector_action_size = ... # type: google___protobuf___internal___containers___RepeatedScalarFieldContainer[builtin___int]
vector_action_descriptions = ... # type: google___protobuf___internal___containers___RepeatedScalarFieldContainer[typing___Text]
vector_action_space_type = ... # type: mlagents___envs___communicator_objects___space_type_pb2___SpaceTypeProto

def __init__(self,
*,
vector_observation_size : typing___Optional[builtin___int] = None,
num_stacked_vector_observations : typing___Optional[builtin___int] = None,
vector_action_size : typing___Optional[typing___Iterable[builtin___int]] = None,
vector_action_descriptions : typing___Optional[typing___Iterable[typing___Text]] = None,
vector_action_space_type : typing___Optional[mlagents___envs___communicator_objects___space_type_pb2___SpaceTypeProto] = None,

def MergeFrom(self, other_msg: google___protobuf___message___Message) -> None: ...
def CopyFrom(self, other_msg: google___protobuf___message___Message) -> None: ...
if sys.version_info >= (3,):
def ClearField(self, field_name: typing_extensions___Literal[u"brain_name",u"is_training",u"num_stacked_vector_observations",u"vector_action_descriptions",u"vector_action_size",u"vector_action_space_type",u"vector_observation_size"]) -> None: ...
def ClearField(self, field_name: typing_extensions___Literal[u"brain_name",u"is_training",u"vector_action_descriptions",u"vector_action_size",u"vector_action_space_type"]) -> None: ...
def ClearField(self, field_name: typing_extensions___Literal[u"brain_name",b"brain_name",u"is_training",b"is_training",u"num_stacked_vector_observations",b"num_stacked_vector_observations",u"vector_action_descriptions",b"vector_action_descriptions",u"vector_action_size",b"vector_action_size",u"vector_action_space_type",b"vector_action_space_type",u"vector_observation_size",b"vector_observation_size"]) -> None: ...
def ClearField(self, field_name: typing_extensions___Literal[u"brain_name",b"brain_name",u"is_training",b"is_training",u"vector_action_descriptions",b"vector_action_descriptions",u"vector_action_size",b"vector_action_size",u"vector_action_space_type",b"vector_action_space_type"]) -> None: ...

36
ml-agents-envs/mlagents/envs/mock_communicator.py


from mlagents.envs.communicator_objects.unity_input_pb2 import UnityInputProto
from mlagents.envs.communicator_objects.unity_output_pb2 import UnityOutputProto
from mlagents.envs.communicator_objects.agent_info_pb2 import AgentInfoProto
from mlagents.envs.communicator_objects.compressed_observation_pb2 import (
CompressedObservationProto,
CompressionTypeProto,
from mlagents.envs.communicator_objects.observation_pb2 import (
ObservationProto,
NONE as COMPRESSION_TYPE_NONE,
PNG as COMPRESSION_TYPE_PNG,
)

discrete_action=False,
visual_inputs=0,
stack=True,
num_agents=3,
brain_name="RealFakeBrain",
vec_obs_size=3,

self.num_agents = num_agents
self.brain_name = brain_name
self.vec_obs_size = vec_obs_size
if stack:
self.num_stacks = 2
else:
self.num_stacks = 1
vector_observation_size=self.vec_obs_size,
num_stacked_vector_observations=self.num_stacks,
vector_action_size=[2],
vector_action_descriptions=["", ""],
vector_action_space_type=int(not self.is_discrete),

else:
vector_action = [1, 2]
list_agent_info = []
if self.num_stacks == 1:
observation = [1, 2, 3]
else:
observation = [1, 2, 3, 1, 2, 3]
vector_obs = [1, 2, 3]
compressed_obs = [
CompressedObservationProto(
data=None, shape=[30, 40, 3], compression_type=CompressionTypeProto.PNG
observations = [
ObservationProto(
compressed_data=None,
shape=[30, 40, 3],
compression_type=COMPRESSION_TYPE_PNG,
vector_obs_proto = ObservationProto(
float_data=ObservationProto.FloatData(data=vector_obs),
shape=[len(vector_obs)],
compression_type=COMPRESSION_TYPE_NONE,
)
observations.append(vector_obs_proto)
stacked_vector_observation=observation,
compressed_observations=compressed_obs,
observations=observations,
)
)
dict_agent_info["RealFakeBrain"] = UnityRLOutputProto.ListAgentInfoProto(

25
ml-agents-envs/mlagents/envs/tests/test_brain.py


from typing import List
import logging
import numpy as np
import sys

from mlagents.envs.communicator_objects.observation_pb2 import (
ObservationProto,
NONE as COMPRESSION_TYPE_NONE,
)
num_stacked_vector_observations=1,
camera_resolutions=[],
vector_action_space_size=[],
vector_action_descriptions=[],

def _make_agent_info_proto(vector_obs: List[float]) -> AgentInfoProto:
obs = ObservationProto(
float_data=ObservationProto.FloatData(data=vector_obs),
shape=[len(vector_obs)],
compression_type=COMPRESSION_TYPE_NONE,
)
agent_info_proto = AgentInfoProto(observations=[obs])
return agent_info_proto
agent_info_proto = AgentInfoProto()
agent_info_proto.stacked_vector_observation.extend([1.0, 2.0, float("nan")])
agent_info_proto = _make_agent_info_proto([1.0, 2.0, float("nan")])
brain_info = BrainInfo.from_agent_proto(1, [agent_info_proto], test_brain)
# nan gets set to 0.0

@mock.patch.object(np, "nan_to_num", wraps=np.nan_to_num)
@mock.patch.object(logging.Logger, "warning")
def test_from_agent_proto_inf(mock_warning, mock_nan_to_num):
agent_info_proto = AgentInfoProto()
agent_info_proto.stacked_vector_observation.extend([1.0, float("inf"), 0.0])
agent_info_proto = _make_agent_info_proto([1.0, float("inf"), 0.0])
brain_info = BrainInfo.from_agent_proto(1, [agent_info_proto], test_brain)
# inf should get set to float_max

"""
Check that all finite values skips the nan_to_num call
"""
agent_info_proto = AgentInfoProto()
agent_info_proto.stacked_vector_observation.extend([1.0, 2.0, 3.0])
agent_info_proto = _make_agent_info_proto([1.0, 2.0, 3.0])
brain_info = BrainInfo.from_agent_proto(1, [agent_info_proto], test_brain)
expected = [1.0, 2.0, 3.0]

4
ml-agents-envs/mlagents/envs/tests/test_envs.py


)
assert (
len(brain_info["RealFakeBrain"].vector_observations[0])
== brain.vector_observation_space_size * brain.num_stacked_vector_observations
== brain.vector_observation_space_size
)

)
assert (
len(brain_info["RealFakeBrain"].vector_observations[0])
== brain.vector_observation_space_size * brain.num_stacked_vector_observations
== brain.vector_observation_space_size
)
print("\n\n\n\n\n\n\n" + str(brain_info["RealFakeBrain"].local_done))

4
ml-agents/mlagents/trainers/models.py


self.m_size = 0
self.normalize = normalize
self.act_size = brain.vector_action_space_size
self.vec_obs_size = (
brain.vector_observation_space_size * brain.num_stacked_vector_observations
)
self.vec_obs_size = brain.vector_observation_space_size
self.vis_obs_size = brain.number_visual_observations
tf.Variable(
int(brain.vector_action_space_type == "continuous"),

8
ml-agents/mlagents/trainers/tests/mock_brain.py


def create_mock_brainparams(
number_visual_observations=0,
num_stacked_vector_observations=1,
vector_action_space_type="continuous",
vector_observation_space_size=3,
vector_action_space_size=None,

vector_action_space_size = [2]
mock_brain = mock.Mock()
mock_brain.return_value.number_visual_observations = number_visual_observations
mock_brain.return_value.num_stacked_vector_observations = (
num_stacked_vector_observations
)
mock_brain.return_value.vector_action_space_type = vector_action_space_type
mock_brain.return_value.vector_observation_space_size = (
vector_observation_space_size

def make_brain_parameters(
discrete_action: bool = False,
visual_inputs: int = 0,
stack: bool = True,
vec_obs_size: int = 3,
vec_obs_size: int = 6,
) -> BrainParameters:
resolutions = [
CameraResolution(width=30, height=40, num_channels=3)

return BrainParameters(
vector_observation_space_size=vec_obs_size,
num_stacked_vector_observations=2 if stack else 1,
camera_resolutions=resolutions,
vector_action_space_size=[2],
vector_action_descriptions=["", ""],

232
ml-agents/mlagents/trainers/tests/test.demo


Test9 -��@**0: Ball3DBrain7
�k?����<� ���@HZ��"P���������<
�k?����<� ���;|@HZ���"{�"=���=P���������<
�k?����<� ��0r@HZ���"��"=���=P���������<
�k?����<� ���a@HZ��Z<�"=���=P���������<
�k?����<� ���BK@HZ���"{�"=���=P���������<
�k?����<� ��|a.@HZ������"=���=P���������<
�k?����<� ���8 @HZ��Z��"=���=P���������<
�k?����<� �����?HZ��r���"=���=P���������<
�k?����<� ��0FH?HZ���"��"=���=P���������<
�k?����<�뵾�+?D#���>����7-�>"=���=P���������<
Test9 -��@**0: Ball3DBrain`
�k?����<� ���@HZ��"P���������j'
""
�k?����<� ���@HZ��e
�k?����<� ���;|@HZ���"{�"=���=P���������j'
""
�k?����<� ���;|@HZ���"{�e
�k?����<� ��0r@HZ���"��"=���=P���������j'
""
�k?����<� ��0r@HZ���"��e
�k?����<� ���a@HZ��Z<�"=���=P���������j'
""
�k?����<� ���a@HZ��Z<�e
�k?����<� ���BK@HZ���"{�"=���=P���������j'
""
�k?����<� ���BK@HZ���"{�e
�k?����<� ��|a.@HZ������"=���=P���������j'
""
�k?����<� ��|a.@HZ������e
�k?����<� ���8 @HZ��Z��"=���=P���������j'
""
�k?����<� ���8 @HZ��Z��e
�k?����<� �����?HZ��r���"=���=P���������j'
""
�k?����<� �����?HZ��r���e
�k?����<� ��0FH?HZ���"��"=���=P���������j'
""
�k?����<� ��0FH?HZ���"��e
�k?����<�뵾�+?D#���>����7-�>"=���=P���������j'
""
�k?����<�뵾�+?D#���>����7-�>e
����">ש��`Ъ>"=���=P���������<
�k?����<@w��� *?����A�3>b���_L�>"=���=P���������<
����">ש��`Ъ>"=���=P���������j'
""
�k?����<`��P�*?�
����">ש��`Ъ>e
�k?����<@w��� *?����A�3>b���_L�>"=���=P���������j'
""
�k?����<@w��� *?����A�3>b���_L�>e
hƼ���>"=���=P���������<
�k?����<����`�(?�!����T>H׼�R�>"=���=P���������<
�k?����<���� (?�I����e>.9�����>"=���=P���������<
�k?����<@u�PV'?�v��Rv>����U$?"=���=P���������<
�k?����<�r[��&?��h��>]��x� ?"=���=P���������<
�k?����<�%@�@�%?hBZ�8׋>�Y �g�?"=���=P���������<
�k?����<@.#��$?�K�A(�>����Y?"=���=P���������<
�k?����<��P�#?P;�`��>�0��$?"=���=P���������<
�k?����<��Ƚ0�"?�*��Τ>m�&�3�,?"=���=P���������<
�k?����<������!?HF� '�>� /�T�5?"=���=P���������<
�k?����<L��p� ?�Rr�>�g7��A>?"=���=P���������<
�k?����< �;�b?���6˽>(�?�\G?"=���=P���������<
�k?����<R6=�'?�?���>`6H�/�O?"=���=P���������<
�k?����<�d�=��? ����l�><�P��rX?"=���=P���������<
�k?����<y>��?�H����> Y��a?"=���=P���������<
�k?����<�i,>P&?�ٽ �>3~a��i?"=���=P���������<
�k?����<@Z>��?HN��K�>��i�ӆr?"=���=P���������<
�k?����<���>p7?�p�=���>�Rr��K{?"=���=P���������<
�k?����<��>��?`�<>��>��z��?"=���=P���������<
�k?����<`d�>�?�s�>�!?����CZ�?"=���=P���������<
�k?����<���>@l?@=�>�G?B�����?"=���=P���������<
�k?����<y�>P�?b?�m?�扽� �?"=���=P���������<
�k?����<��?�?�?]� ?����f�?"=���=P���������<
�k?����<@�?@( ?��<?��?�I�����?"=���=P���������<
�k?����<�� ?L ?�c[?��?�x��<�?"=���=P���������<
�k?����<��/?�b ?�!{?e?6���zp�?"=���=P���������<
�k?����<@W??�k?�ލ?�&?[ߞ�hȤ?"=���=P���������<
�k?����<NO?0g?��?�J!?m �� �?"=���=P���������<
�k?����<��_?pU?hȯ?�n%?�=��Nw�?"=���=P���������<
�k?����<�yp?P6?�c�?=�)?�f��Eα?"=���=P���������<
�k?����<׀?��>ln�?t�-?]����$�?"=���=P���������<
�k?����<X��?���>��?W�1?�ó�A{�?"=���=P���������<
�k?����<���?@�>���?��5?����BѾ?"=���=P���������<
�k?����<���?�g�>@1:?�%���&�?"=���=P���������<
�k?����<�Q�?���>_�@*?>?�L��T|�?"=���=P���������<
�k?����<���? ��>@�`B?A�Ľf��?"=���=P���������<
�k?����<�˸?]�>hd$@�AF?*{��2�?"=���=P���������<
�k?����<���? ��>��.@C?6�K�r-�?"=���=P���������<
�k?����<XN�? U�>P\9@9A?��ڿC��?"=���=P���������>
yM�����=4g=�@,��?"=��@P���������<
yM�����=4g=�;|@,��?�"{�"=���=P���������<
yM�����=4g=0r@,��?�"��"=���=P���������<
yM�����=4g=�a@,��?Z<�"=���=P���������<
yM�����=4g=�BK@,��?�"{�"=���=P���������<
yM�����=4g=|a.@,��?����"=���=P���������Test9 -��@
hƼ���>"=���=P���������j'
""
�k?����< ���0s)?8����ID>
hƼ���>e
�k?����<����`�(?�!����T>H׼�R�>"=���=P���������j'
""
�k?����<����`�(?�!����T>H׼�R�>e
�k?����<���� (?�I����e>.9�����>"=���=P���������j'
""
�k?����<���� (?�I����e>.9�����>e
�k?����<@u�PV'?�v��Rv>����U$?"=���=P���������j'
""
�k?����<@u�PV'?�v��Rv>����U$?e
�k?����<�r[��&?��h��>]��x� ?"=���=P���������j'
""
�k?����<�r[��&?��h��>]��x� ?e
�k?����<�%@�@�%?hBZ�8׋>�Y �g�?"=���=P���������j'
""
�k?����<�%@�@�%?hBZ�8׋>�Y �g�?e
�k?����<@.#��$?�K�A(�>����Y?"=���=P���������j'
""
�k?����<@.#��$?�K�A(�>����Y?e
�k?����<��P�#?P;�`��>�0��$?"=���=P���������j'
""
�k?����<��P�#?P;�`��>�0��$?e
�k?����<��Ƚ0�"?�*��Τ>m�&�3�,?"=���=P���������j'
""
�k?����<��Ƚ0�"?�*��Τ>m�&�3�,?e
�k?����<������!?HF� '�>� /�T�5?"=���=P���������j'
""
�k?����<������!?HF� '�>� /�T�5?e
�k?����<L��p� ?�Rr�>�g7��A>?"=���=P���������j'
""
�k?����<L��p� ?�Rr�>�g7��A>?e
�k?����< �;�b?���6˽>(�?�\G?"=���=P���������j'
""
�k?����< �;�b?���6˽>(�?�\G?e
�k?����<R6=�'?�?���>`6H�/�O?"=���=P���������j'
""
�k?����<R6=�'?�?���>`6H�/�O?e
�k?����<�d�=��? ����l�><�P��rX?"=���=P���������j'
""
�k?����<�d�=��? ����l�><�P��rX?e
�k?����<y>��?�H����> Y��a?"=���=P���������j'
""
�k?����<y>��?�H����> Y��a?e
�k?����<�i,>P&?�ٽ �>3~a��i?"=���=P���������j'
""
�k?����<�i,>P&?�ٽ �>3~a��i?e
�k?����<@Z>��?HN��K�>��i�ӆr?"=���=P���������j'
""
�k?����<@Z>��?HN��K�>��i�ӆr?e
�k?����<���>p7?�p�=���>�Rr��K{?"=���=P���������j'
""
�k?����<���>p7?�p�=���>�Rr��K{?e
�k?����<��>��?`�<>��>��z��?"=���=P���������j'
""
�k?����<��>��?`�<>��>��z��?e
�k?����<`d�>�?�s�>�!?����CZ�?"=���=P���������j'
""
�k?����<`d�>�?�s�>�!?����CZ�?e
�k?����<���>@l?@=�>�G?B�����?"=���=P���������j'
""
�k?����<���>@l?@=�>�G?B�����?e
�k?����<y�>P�?b?�m?�扽� �?"=���=P���������j'
""
�k?����<y�>P�?b?�m?�扽� �?e
�k?����<��?�?�?]� ?����f�?"=���=P���������j'
""
�k?����<��?�?�?]� ?����f�?e
�k?����<@�?@( ?��<?��?�I�����?"=���=P���������j'
""
�k?����<@�?@( ?��<?��?�I�����?e
�k?����<�� ?L ?�c[?��?�x��<�?"=���=P���������j'
""
�k?����<�� ?L ?�c[?��?�x��<�?e
�k?����<��/?�b ?�!{?e?6���zp�?"=���=P���������j'
""
�k?����<��/?�b ?�!{?e?6���zp�?e
�k?����<@W??�k?�ލ?�&?[ߞ�hȤ?"=���=P���������j'
""
�k?����<@W??�k?�ލ?�&?[ߞ�hȤ?e
�k?����<NO?0g?��?�J!?m �� �?"=���=P���������j'
""
�k?����<NO?0g?��?�J!?m �� �?e
�k?����<��_?pU?hȯ?�n%?�=��Nw�?"=���=P���������j'
""
�k?����<��_?pU?hȯ?�n%?�=��Nw�?e
�k?����<�yp?P6?�c�?=�)?�f��Eα?"=���=P���������j'
""
�k?����<�yp?P6?�c�?=�)?�f��Eα?e
�k?����<׀?��>ln�?t�-?]����$�?"=���=P���������j'
""
�k?����<׀?��>ln�?t�-?]����$�?e
�k?����<X��?���>��?W�1?�ó�A{�?"=���=P���������j'
""
�k?����<X��?���>��?W�1?�ó�A{�?e
�k?����<���?@�>���?��5?����BѾ?"=���=P���������j'
""
�k?����<���?@�>���?��5?����BѾ?e
�k?����<���?�g�>@1:?�%���&�?"=���=P���������j'
""
�k?����<���?�g�>@1:?�%���&�?e
�k?����<�Q�?���>_�@*?>?�L��T|�?"=���=P���������j'
""
�k?����<�Q�?���>_�@*?>?�L��T|�?e
�k?����<���? ��>@�`B?A�Ľf��?"=���=P���������j'
""
�k?����<���? ��>@�`B?A�Ľf��?e
�k?����<�˸?]�>hd$@�AF?*{��2�?"=���=P���������j'
""
�k?����<�˸?]�>hd$@�AF?*{��2�?e
�k?����<���? ��>��.@C?6�K�r-�?"=���=P���������j'
""
�k?����<���? ��>��.@C?6�K�r-�?e
�k?����<XN�? U�>P\9@9A?��ڿC��?"=���=P���������j'
""
�k?����<XN�? U�>P\9@9A?��ڿC��?g
yM�����=4g=�@,��?"=��@P���������j'
""
yM�����=4g=�@,��?e
yM�����=4g=�;|@,��?�"{�"=���=P���������j'
""
yM�����=4g=�;|@,��?�"{�e
yM�����=4g=0r@,��?�"��"=���=P���������j'
""
yM�����=4g=0r@,��?�"��e
yM�����=4g=�a@,��?Z<�"=���=P���������j'
""
yM�����=4g=�a@,��?Z<�e
yM�����=4g=�BK@,��?�"{�"=���=P���������j'
""
yM�����=4g=�BK@,��?�"{�e
yM�����=4g=|a.@,��?����"=���=P���������j'
""
yM�����=4g=|a.@,��?����

232
ml-agents/mlagents/trainers/tests/test_demo_dir/test.demo


Test9 -��@**0: Ball3DBrain7
�k?����<� ���@HZ��"P���������<
�k?����<� ���;|@HZ���"{�"=���=P���������<
�k?����<� ��0r@HZ���"��"=���=P���������<
�k?����<� ���a@HZ��Z<�"=���=P���������<
�k?����<� ���BK@HZ���"{�"=���=P���������<
�k?����<� ��|a.@HZ������"=���=P���������<
�k?����<� ���8 @HZ��Z��"=���=P���������<
�k?����<� �����?HZ��r���"=���=P���������<
�k?����<� ��0FH?HZ���"��"=���=P���������<
�k?����<�뵾�+?D#���>����7-�>"=���=P���������<
Test9 -��@**0: Ball3DBrain`
�k?����<� ���@HZ��"P���������j'
""
�k?����<� ���@HZ��e
�k?����<� ���;|@HZ���"{�"=���=P���������j'
""
�k?����<� ���;|@HZ���"{�e
�k?����<� ��0r@HZ���"��"=���=P���������j'
""
�k?����<� ��0r@HZ���"��e
�k?����<� ���a@HZ��Z<�"=���=P���������j'
""
�k?����<� ���a@HZ��Z<�e
�k?����<� ���BK@HZ���"{�"=���=P���������j'
""
�k?����<� ���BK@HZ���"{�e
�k?����<� ��|a.@HZ������"=���=P���������j'
""
�k?����<� ��|a.@HZ������e
�k?����<� ���8 @HZ��Z��"=���=P���������j'
""
�k?����<� ���8 @HZ��Z��e
�k?����<� �����?HZ��r���"=���=P���������j'
""
�k?����<� �����?HZ��r���e
�k?����<� ��0FH?HZ���"��"=���=P���������j'
""
�k?����<� ��0FH?HZ���"��e
�k?����<�뵾�+?D#���>����7-�>"=���=P���������j'
""
�k?����<�뵾�+?D#���>����7-�>e
����">ש��`Ъ>"=���=P���������<
�k?����<@w��� *?����A�3>b���_L�>"=���=P���������<
����">ש��`Ъ>"=���=P���������j'
""
�k?����<`��P�*?�
����">ש��`Ъ>e
�k?����<@w��� *?����A�3>b���_L�>"=���=P���������j'
""
�k?����<@w��� *?����A�3>b���_L�>e
hƼ���>"=���=P���������<
�k?����<����`�(?�!����T>H׼�R�>"=���=P���������<
�k?����<���� (?�I����e>.9�����>"=���=P���������<
�k?����<@u�PV'?�v��Rv>����U$?"=���=P���������<
�k?����<�r[��&?��h��>]��x� ?"=���=P���������<
�k?����<�%@�@�%?hBZ�8׋>�Y �g�?"=���=P���������<
�k?����<@.#��$?�K�A(�>����Y?"=���=P���������<
�k?����<��P�#?P;�`��>�0��$?"=���=P���������<
�k?����<��Ƚ0�"?�*��Τ>m�&�3�,?"=���=P���������<
�k?����<������!?HF� '�>� /�T�5?"=���=P���������<
�k?����<L��p� ?�Rr�>�g7��A>?"=���=P���������<
�k?����< �;�b?���6˽>(�?�\G?"=���=P���������<
�k?����<R6=�'?�?���>`6H�/�O?"=���=P���������<
�k?����<�d�=��? ����l�><�P��rX?"=���=P���������<
�k?����<y>��?�H����> Y��a?"=���=P���������<
�k?����<�i,>P&?�ٽ �>3~a��i?"=���=P���������<
�k?����<@Z>��?HN��K�>��i�ӆr?"=���=P���������<
�k?����<���>p7?�p�=���>�Rr��K{?"=���=P���������<
�k?����<��>��?`�<>��>��z��?"=���=P���������<
�k?����<`d�>�?�s�>�!?����CZ�?"=���=P���������<
�k?����<���>@l?@=�>�G?B�����?"=���=P���������<
�k?����<y�>P�?b?�m?�扽� �?"=���=P���������<
�k?����<��?�?�?]� ?����f�?"=���=P���������<
�k?����<@�?@( ?��<?��?�I�����?"=���=P���������<
�k?����<�� ?L ?�c[?��?�x��<�?"=���=P���������<
�k?����<��/?�b ?�!{?e?6���zp�?"=���=P���������<
�k?����<@W??�k?�ލ?�&?[ߞ�hȤ?"=���=P���������<
�k?����<NO?0g?��?�J!?m �� �?"=���=P���������<
�k?����<��_?pU?hȯ?�n%?�=��Nw�?"=���=P���������<
�k?����<�yp?P6?�c�?=�)?�f��Eα?"=���=P���������<
�k?����<׀?��>ln�?t�-?]����$�?"=���=P���������<
�k?����<X��?���>��?W�1?�ó�A{�?"=���=P���������<
�k?����<���?@�>���?��5?����BѾ?"=���=P���������<
�k?����<���?�g�>@1:?�%���&�?"=���=P���������<
�k?����<�Q�?���>_�@*?>?�L��T|�?"=���=P���������<
�k?����<���? ��>@�`B?A�Ľf��?"=���=P���������<
�k?����<�˸?]�>hd$@�AF?*{��2�?"=���=P���������<
�k?����<���? ��>��.@C?6�K�r-�?"=���=P���������<
�k?����<XN�? U�>P\9@9A?��ڿC��?"=���=P���������>
yM�����=4g=�@,��?"=��@P���������<
yM�����=4g=�;|@,��?�"{�"=���=P���������<
yM�����=4g=0r@,��?�"��"=���=P���������<
yM�����=4g=�a@,��?Z<�"=���=P���������<
yM�����=4g=�BK@,��?�"{�"=���=P���������<
yM�����=4g=|a.@,��?����"=���=P���������Test9 -��@
hƼ���>"=���=P���������j'
""
�k?����< ���0s)?8����ID>
hƼ���>e
�k?����<����`�(?�!����T>H׼�R�>"=���=P���������j'
""
�k?����<����`�(?�!����T>H׼�R�>e
�k?����<���� (?�I����e>.9�����>"=���=P���������j'
""
�k?����<���� (?�I����e>.9�����>e
�k?����<@u�PV'?�v��Rv>����U$?"=���=P���������j'
""
�k?����<@u�PV'?�v��Rv>����U$?e
�k?����<�r[��&?��h��>]��x� ?"=���=P���������j'
""
�k?����<�r[��&?��h��>]��x� ?e
�k?����<�%@�@�%?hBZ�8׋>�Y �g�?"=���=P���������j'
""
�k?����<�%@�@�%?hBZ�8׋>�Y �g�?e
�k?����<@.#��$?�K�A(�>����Y?"=���=P���������j'
""
�k?����<@.#��$?�K�A(�>����Y?e
�k?����<��P�#?P;�`��>�0��$?"=���=P���������j'
""
�k?����<��P�#?P;�`��>�0��$?e
�k?����<��Ƚ0�"?�*��Τ>m�&�3�,?"=���=P���������j'
""
�k?����<��Ƚ0�"?�*��Τ>m�&�3�,?e
�k?����<������!?HF� '�>� /�T�5?"=���=P���������j'
""
�k?����<������!?HF� '�>� /�T�5?e
�k?����<L��p� ?�Rr�>�g7��A>?"=���=P���������j'
""
�k?����<L��p� ?�Rr�>�g7��A>?e
�k?����< �;�b?���6˽>(�?�\G?"=���=P���������j'
""
�k?����< �;�b?���6˽>(�?�\G?e
�k?����<R6=�'?�?���>`6H�/�O?"=���=P���������j'
""
�k?����<R6=�'?�?���>`6H�/�O?e
�k?����<�d�=��? ����l�><�P��rX?"=���=P���������j'
""
�k?����<�d�=��? ����l�><�P��rX?e
�k?����<y>��?�H����> Y��a?"=���=P���������j'
""
�k?����<y>��?�H����> Y��a?e
�k?����<�i,>P&?�ٽ �>3~a��i?"=���=P���������j'
""
�k?����<�i,>P&?�ٽ �>3~a��i?e
�k?����<@Z>��?HN��K�>��i�ӆr?"=���=P���������j'
""
�k?����<@Z>��?HN��K�>��i�ӆr?e
�k?����<���>p7?�p�=���>�Rr��K{?"=���=P���������j'
""
�k?����<���>p7?�p�=���>�Rr��K{?e
�k?����<��>��?`�<>��>��z��?"=���=P���������j'
""
�k?����<��>��?`�<>��>��z��?e
�k?����<`d�>�?�s�>�!?����CZ�?"=���=P���������j'
""
�k?����<`d�>�?�s�>�!?����CZ�?e
�k?����<���>@l?@=�>�G?B�����?"=���=P���������j'
""
�k?����<���>@l?@=�>�G?B�����?e
�k?����<y�>P�?b?�m?�扽� �?"=���=P���������j'
""
�k?����<y�>P�?b?�m?�扽� �?e
�k?����<��?�?�?]� ?����f�?"=���=P���������j'
""
�k?����<��?�?�?]� ?����f�?e
�k?����<@�?@( ?��<?��?�I�����?"=���=P���������j'
""
�k?����<@�?@( ?��<?��?�I�����?e
�k?����<�� ?L ?�c[?��?�x��<�?"=���=P���������j'
""
�k?����<�� ?L ?�c[?��?�x��<�?e
�k?����<��/?�b ?�!{?e?6���zp�?"=���=P���������j'
""
�k?����<��/?�b ?�!{?e?6���zp�?e
�k?����<@W??�k?�ލ?�&?[ߞ�hȤ?"=���=P���������j'
""
�k?����<@W??�k?�ލ?�&?[ߞ�hȤ?e
�k?����<NO?0g?��?�J!?m �� �?"=���=P���������j'
""
�k?����<NO?0g?��?�J!?m �� �?e
�k?����<��_?pU?hȯ?�n%?�=��Nw�?"=���=P���������j'
""
�k?����<��_?pU?hȯ?�n%?�=��Nw�?e
�k?����<�yp?P6?�c�?=�)?�f��Eα?"=���=P���������j'
""
�k?����<�yp?P6?�c�?=�)?�f��Eα?e
�k?����<׀?��>ln�?t�-?]����$�?"=���=P���������j'
""
�k?����<׀?��>ln�?t�-?]����$�?e
�k?����<X��?���>��?W�1?�ó�A{�?"=���=P���������j'
""
�k?����<X��?���>��?W�1?�ó�A{�?e
�k?����<���?@�>���?��5?����BѾ?"=���=P���������j'
""
�k?����<���?@�>���?��5?����BѾ?e
�k?����<���?�g�>@1:?�%���&�?"=���=P���������j'
""
�k?����<���?�g�>@1:?�%���&�?e
�k?����<�Q�?���>_�@*?>?�L��T|�?"=���=P���������j'
""
�k?����<�Q�?���>_�@*?>?�L��T|�?e
�k?����<���? ��>@�`B?A�Ľf��?"=���=P���������j'
""
�k?����<���? ��>@�`B?A�Ľf��?e
�k?����<�˸?]�>hd$@�AF?*{��2�?"=���=P���������j'
""
�k?����<�˸?]�>hd$@�AF?*{��2�?e
�k?����<���? ��>��.@C?6�K�r-�?"=���=P���������j'
""
�k?����<���? ��>��.@C?6�K�r-�?e
�k?����<XN�? U�>P\9@9A?��ڿC��?"=���=P���������j'
""
�k?����<XN�? U�>P\9@9A?��ڿC��?g
yM�����=4g=�@,��?"=��@P���������j'
""
yM�����=4g=�@,��?e
yM�����=4g=�;|@,��?�"{�"=���=P���������j'
""
yM�����=4g=�;|@,��?�"{�e
yM�����=4g=0r@,��?�"��"=���=P���������j'
""
yM�����=4g=0r@,��?�"��e
yM�����=4g=�a@,��?Z<�"=���=P���������j'
""
yM�����=4g=�a@,��?Z<�e
yM�����=4g=�BK@,��?�"{�"=���=P���������j'
""
yM�����=4g=�BK@,��?�"{�e
yM�����=4g=|a.@,��?����"=���=P���������j'
""
yM�����=4g=|a.@,��?����

232
ml-agents/mlagents/trainers/tests/test_demo_dir/test2.demo


Test9 -��@**0: Ball3DBrain7
�k?����<� ���@HZ��"P���������<
�k?����<� ���;|@HZ���"{�"=���=P���������<
�k?����<� ��0r@HZ���"��"=���=P���������<
�k?����<� ���a@HZ��Z<�"=���=P���������<
�k?����<� ���BK@HZ���"{�"=���=P���������<
�k?����<� ��|a.@HZ������"=���=P���������<
�k?����<� ���8 @HZ��Z��"=���=P���������<
�k?����<� �����?HZ��r���"=���=P���������<
�k?����<� ��0FH?HZ���"��"=���=P���������<
�k?����<�뵾�+?D#���>����7-�>"=���=P���������<
Test9 -��@**0: Ball3DBrain`
�k?����<� ���@HZ��"P���������j'
""
�k?����<� ���@HZ��e
�k?����<� ���;|@HZ���"{�"=���=P���������j'
""
�k?����<� ���;|@HZ���"{�e
�k?����<� ��0r@HZ���"��"=���=P���������j'
""
�k?����<� ��0r@HZ���"��e
�k?����<� ���a@HZ��Z<�"=���=P���������j'
""
�k?����<� ���a@HZ��Z<�e
�k?����<� ���BK@HZ���"{�"=���=P���������j'
""
�k?����<� ���BK@HZ���"{�e
�k?����<� ��|a.@HZ������"=���=P���������j'
""
�k?����<� ��|a.@HZ������e
�k?����<� ���8 @HZ��Z��"=���=P���������j'
""
�k?����<� ���8 @HZ��Z��e
�k?����<� �����?HZ��r���"=���=P���������j'
""
�k?����<� �����?HZ��r���e
�k?����<� ��0FH?HZ���"��"=���=P���������j'
""
�k?����<� ��0FH?HZ���"��e
�k?����<�뵾�+?D#���>����7-�>"=���=P���������j'
""
�k?����<�뵾�+?D#���>����7-�>e
����">ש��`Ъ>"=���=P���������<
�k?����<@w��� *?����A�3>b���_L�>"=���=P���������<
����">ש��`Ъ>"=���=P���������j'
""
�k?����<`��P�*?�
����">ש��`Ъ>e
�k?����<@w��� *?����A�3>b���_L�>"=���=P���������j'
""
�k?����<@w��� *?����A�3>b���_L�>e
hƼ���>"=���=P���������<
�k?����<����`�(?�!����T>H׼�R�>"=���=P���������<
�k?����<���� (?�I����e>.9�����>"=���=P���������<
�k?����<@u�PV'?�v��Rv>����U$?"=���=P���������<
�k?����<�r[��&?��h��>]��x� ?"=���=P���������<
�k?����<�%@�@�%?hBZ�8׋>�Y �g�?"=���=P���������<
�k?����<@.#��$?�K�A(�>����Y?"=���=P���������<
�k?����<��P�#?P;�`��>�0��$?"=���=P���������<
�k?����<��Ƚ0�"?�*��Τ>m�&�3�,?"=���=P���������<
�k?����<������!?HF� '�>� /�T�5?"=���=P���������<
�k?����<L��p� ?�Rr�>�g7��A>?"=���=P���������<
�k?����< �;�b?���6˽>(�?�\G?"=���=P���������<
�k?����<R6=�'?�?���>`6H�/�O?"=���=P���������<
�k?����<�d�=��? ����l�><�P��rX?"=���=P���������<
�k?����<y>��?�H����> Y��a?"=���=P���������<
�k?����<�i,>P&?�ٽ �>3~a��i?"=���=P���������<
�k?����<@Z>��?HN��K�>��i�ӆr?"=���=P���������<
�k?����<���>p7?�p�=���>�Rr��K{?"=���=P���������<
�k?����<��>��?`�<>��>��z��?"=���=P���������<
�k?����<`d�>�?�s�>�!?����CZ�?"=���=P���������<
�k?����<���>@l?@=�>�G?B�����?"=���=P���������<
�k?����<y�>P�?b?�m?�扽� �?"=���=P���������<
�k?����<��?�?�?]� ?����f�?"=���=P���������<
�k?����<@�?@( ?��<?��?�I�����?"=���=P���������<
�k?����<�� ?L ?�c[?��?�x��<�?"=���=P���������<
�k?����<��/?�b ?�!{?e?6���zp�?"=���=P���������<
�k?����<@W??�k?�ލ?�&?[ߞ�hȤ?"=���=P���������<
�k?����<NO?0g?��?�J!?m �� �?"=���=P���������<
�k?����<��_?pU?hȯ?�n%?�=��Nw�?"=���=P���������<
�k?����<�yp?P6?�c�?=�)?�f��Eα?"=���=P���������<
�k?����<׀?��>ln�?t�-?]����$�?"=���=P���������<
�k?����<X��?���>��?W�1?�ó�A{�?"=���=P���������<
�k?����<���?@�>���?��5?����BѾ?"=���=P���������<
�k?����<���?�g�>@1:?�%���&�?"=���=P���������<
�k?����<�Q�?���>_�@*?>?�L��T|�?"=���=P���������<
�k?����<���? ��>@�`B?A�Ľf��?"=���=P���������<
�k?����<�˸?]�>hd$@�AF?*{��2�?"=���=P���������<
�k?����<���? ��>��.@C?6�K�r-�?"=���=P���������<
�k?����<XN�? U�>P\9@9A?��ڿC��?"=���=P���������>
yM�����=4g=�@,��?"=��@P���������<
yM�����=4g=�;|@,��?�"{�"=���=P���������<
yM�����=4g=0r@,��?�"��"=���=P���������<
yM�����=4g=�a@,��?Z<�"=���=P���������<
yM�����=4g=�BK@,��?�"{�"=���=P���������<
yM�����=4g=|a.@,��?����"=���=P���������Test9 -��@
hƼ���>"=���=P���������j'
""
�k?����< ���0s)?8����ID>
hƼ���>e
�k?����<����`�(?�!����T>H׼�R�>"=���=P���������j'
""
�k?����<����`�(?�!����T>H׼�R�>e
�k?����<���� (?�I����e>.9�����>"=���=P���������j'
""
�k?����<���� (?�I����e>.9�����>e
�k?����<@u�PV'?�v��Rv>����U$?"=���=P���������j'
""
�k?����<@u�PV'?�v��Rv>����U$?e
�k?����<�r[��&?��h��>]��x� ?"=���=P���������j'
""
�k?����<�r[��&?��h��>]��x� ?e
�k?����<�%@�@�%?hBZ�8׋>�Y �g�?"=���=P���������j'
""
�k?����<�%@�@�%?hBZ�8׋>�Y �g�?e
�k?����<@.#��$?�K�A(�>����Y?"=���=P���������j'
""
�k?����<@.#��$?�K�A(�>����Y?e
�k?����<��P�#?P;�`��>�0��$?"=���=P���������j'
""
�k?����<��P�#?P;�`��>�0��$?e
�k?����<��Ƚ0�"?�*��Τ>m�&�3�,?"=���=P���������j'
""
�k?����<��Ƚ0�"?�*��Τ>m�&�3�,?e
�k?����<������!?HF� '�>� /�T�5?"=���=P���������j'
""
�k?����<������!?HF� '�>� /�T�5?e
�k?����<L��p� ?�Rr�>�g7��A>?"=���=P���������j'
""
�k?����<L��p� ?�Rr�>�g7��A>?e
�k?����< �;�b?���6˽>(�?�\G?"=���=P���������j'
""
�k?����< �;�b?���6˽>(�?�\G?e
�k?����<R6=�'?�?���>`6H�/�O?"=���=P���������j'
""
�k?����<R6=�'?�?���>`6H�/�O?e
�k?����<�d�=��? ����l�><�P��rX?"=���=P���������j'
""
�k?����<�d�=��? ����l�><�P��rX?e
�k?����<y>��?�H����> Y��a?"=���=P���������j'
""
�k?����<y>��?�H����> Y��a?e
�k?����<�i,>P&?�ٽ �>3~a��i?"=���=P���������j'
""
�k?����<�i,>P&?�ٽ �>3~a��i?e
�k?����<@Z>��?HN��K�>��i�ӆr?"=���=P���������j'
""
�k?����<@Z>��?HN��K�>��i�ӆr?e
�k?����<���>p7?�p�=���>�Rr��K{?"=���=P���������j'
""
�k?����<���>p7?�p�=���>�Rr��K{?e
�k?����<��>��?`�<>��>��z��?"=���=P���������j'
""
�k?����<��>��?`�<>��>��z��?e
�k?����<`d�>�?�s�>�!?����CZ�?"=���=P���������j'
""
�k?����<`d�>�?�s�>�!?����CZ�?e
�k?����<���>@l?@=�>�G?B�����?"=���=P���������j'
""
�k?����<���>@l?@=�>�G?B�����?e
�k?����<y�>P�?b?�m?�扽� �?"=���=P���������j'
""
�k?����<y�>P�?b?�m?�扽� �?e
�k?����<��?�?�?]� ?����f�?"=���=P���������j'
""
�k?����<��?�?�?]� ?����f�?e
�k?����<@�?@( ?��<?��?�I�����?"=���=P���������j'
""
�k?����<@�?@( ?��<?��?�I�����?e
�k?����<�� ?L ?�c[?��?�x��<�?"=���=P���������j'
""
�k?����<�� ?L ?�c[?��?�x��<�?e
�k?����<��/?�b ?�!{?e?6���zp�?"=���=P���������j'
""
�k?����<��/?�b ?�!{?e?6���zp�?e
�k?����<@W??�k?�ލ?�&?[ߞ�hȤ?"=���=P���������j'
""
�k?����<@W??�k?�ލ?�&?[ߞ�hȤ?e
�k?����<NO?0g?��?�J!?m �� �?"=���=P���������j'
""
�k?����<NO?0g?��?�J!?m �� �?e
�k?����<��_?pU?hȯ?�n%?�=��Nw�?"=���=P���������j'
""
�k?����<��_?pU?hȯ?�n%?�=��Nw�?e
�k?����<�yp?P6?�c�?=�)?�f��Eα?"=���=P���������j'
""
�k?����<�yp?P6?�c�?=�)?�f��Eα?e
�k?����<׀?��>ln�?t�-?]����$�?"=���=P���������j'
""
�k?����<׀?��>ln�?t�-?]����$�?e
�k?����<X��?���>��?W�1?�ó�A{�?"=���=P���������j'
""
�k?����<X��?���>��?W�1?�ó�A{�?e
�k?����<���?@�>���?��5?����BѾ?"=���=P���������j'
""
�k?����<���?@�>���?��5?����BѾ?e
�k?����<���?�g�>@1:?�%���&�?"=���=P���������j'
""
�k?����<���?�g�>@1:?�%���&�?e
�k?����<�Q�?���>_�@*?>?�L��T|�?"=���=P���������j'
""
�k?����<�Q�?���>_�@*?>?�L��T|�?e
�k?����<���? ��>@�`B?A�Ľf��?"=���=P���������j'
""
�k?����<���? ��>@�`B?A�Ľf��?e
�k?����<�˸?]�>hd$@�AF?*{��2�?"=���=P���������j'
""
�k?����<�˸?]�>hd$@�AF?*{��2�?e
�k?����<���? ��>��.@C?6�K�r-�?"=���=P���������j'
""
�k?����<���? ��>��.@C?6�K�r-�?e
�k?����<XN�? U�>P\9@9A?��ڿC��?"=���=P���������j'
""
�k?����<XN�? U�>P\9@9A?��ڿC��?g
yM�����=4g=�@,��?"=��@P���������j'
""
yM�����=4g=�@,��?e
yM�����=4g=�;|@,��?�"{�"=���=P���������j'
""
yM�����=4g=�;|@,��?�"{�e
yM�����=4g=0r@,��?�"��"=���=P���������j'
""
yM�����=4g=0r@,��?�"��e
yM�����=4g=�a@,��?Z<�"=���=P���������j'
""
yM�����=4g=�a@,��?Z<�e
yM�����=4g=�BK@,��?�"{�"=���=P���������j'
""
yM�����=4g=�BK@,��?�"{�e
yM�����=4g=|a.@,��?����"=���=P���������j'
""
yM�����=4g=|a.@,��?����

232
ml-agents/mlagents/trainers/tests/test_demo_dir/test3.demo


Test9 -��@**0: Ball3DBrain7
�k?����<� ���@HZ��"P���������<
�k?����<� ���;|@HZ���"{�"=���=P���������<
�k?����<� ��0r@HZ���"��"=���=P���������<
�k?����<� ���a@HZ��Z<�"=���=P���������<
�k?����<� ���BK@HZ���"{�"=���=P���������<
�k?����<� ��|a.@HZ������"=���=P���������<
�k?����<� ���8 @HZ��Z��"=���=P���������<
�k?����<� �����?HZ��r���"=���=P���������<
�k?����<� ��0FH?HZ���"��"=���=P���������<
�k?����<�뵾�+?D#���>����7-�>"=���=P���������<
Test9 -��@**0: Ball3DBrain`
�k?����<� ���@HZ��"P���������j'
""
�k?����<� ���@HZ��e
�k?����<� ���;|@HZ���"{�"=���=P���������j'
""
�k?����<� ���;|@HZ���"{�e
�k?����<� ��0r@HZ���"��"=���=P���������j'
""
�k?����<� ��0r@HZ���"��e
�k?����<� ���a@HZ��Z<�"=���=P���������j'
""
�k?����<� ���a@HZ��Z<�e
�k?����<� ���BK@HZ���"{�"=���=P���������j'
""
�k?����<� ���BK@HZ���"{�e
�k?����<� ��|a.@HZ������"=���=P���������j'
""
�k?����<� ��|a.@HZ������e
�k?����<� ���8 @HZ��Z��"=���=P���������j'
""
�k?����<� ���8 @HZ��Z��e
�k?����<� �����?HZ��r���"=���=P���������j'
""
�k?����<� �����?HZ��r���e
�k?����<� ��0FH?HZ���"��"=���=P���������j'
""
�k?����<� ��0FH?HZ���"��e
�k?����<�뵾�+?D#���>����7-�>"=���=P���������j'
""
�k?����<�뵾�+?D#���>����7-�>e
����">ש��`Ъ>"=���=P���������<
�k?����<@w��� *?����A�3>b���_L�>"=���=P���������<
����">ש��`Ъ>"=���=P���������j'
""
�k?����<`��P�*?�
����">ש��`Ъ>e
�k?����<@w��� *?����A�3>b���_L�>"=���=P���������j'
""
�k?����<@w��� *?����A�3>b���_L�>e
hƼ���>"=���=P���������<
�k?����<����`�(?�!����T>H׼�R�>"=���=P���������<
�k?����<���� (?�I����e>.9�����>"=���=P���������<
�k?����<@u�PV'?�v��Rv>����U$?"=���=P���������<
�k?����<�r[��&?��h��>]��x� ?"=���=P���������<
�k?����<�%@�@�%?hBZ�8׋>�Y �g�?"=���=P���������<
�k?����<@.#��$?�K�A(�>����Y?"=���=P���������<
�k?����<��P�#?P;�`��>�0��$?"=���=P���������<
�k?����<��Ƚ0�"?�*��Τ>m�&�3�,?"=���=P���������<
�k?����<������!?HF� '�>� /�T�5?"=���=P���������<
�k?����<L��p� ?�Rr�>�g7��A>?"=���=P���������<
�k?����< �;�b?���6˽>(�?�\G?"=���=P���������<
�k?����<R6=�'?�?���>`6H�/�O?"=���=P���������<
�k?����<�d�=��? ����l�><�P��rX?"=���=P���������<
�k?����<y>��?�H����> Y��a?"=���=P���������<
�k?����<�i,>P&?�ٽ �>3~a��i?"=���=P���������<
�k?����<@Z>��?HN��K�>��i�ӆr?"=���=P���������<
�k?����<���>p7?�p�=���>�Rr��K{?"=���=P���������<
�k?����<��>��?`�<>��>��z��?"=���=P���������<
�k?����<`d�>�?�s�>�!?����CZ�?"=���=P���������<
�k?����<���>@l?@=�>�G?B�����?"=���=P���������<
�k?����<y�>P�?b?�m?�扽� �?"=���=P���������<
�k?����<��?�?�?]� ?����f�?"=���=P���������<
�k?����<@�?@( ?��<?��?�I�����?"=���=P���������<
�k?����<�� ?L ?�c[?��?�x��<�?"=���=P���������<
�k?����<��/?�b ?�!{?e?6���zp�?"=���=P���������<
�k?����<@W??�k?�ލ?�&?[ߞ�hȤ?"=���=P���������<
�k?����<NO?0g?��?�J!?m �� �?"=���=P���������<
�k?����<��_?pU?hȯ?�n%?�=��Nw�?"=���=P���������<
�k?����<�yp?P6?�c�?=�)?�f��Eα?"=���=P���������<
�k?����<׀?��>ln�?t�-?]����$�?"=���=P���������<
�k?����<X��?���>��?W�1?�ó�A{�?"=���=P���������<
�k?����<���?@�>���?��5?����BѾ?"=���=P���������<
�k?����<���?�g�>@1:?�%���&�?"=���=P���������<
�k?����<�Q�?���>_�@*?>?�L��T|�?"=���=P���������<
�k?����<���? ��>@�`B?A�Ľf��?"=���=P���������<
�k?����<�˸?]�>hd$@�AF?*{��2�?"=���=P���������<
�k?����<���? ��>��.@C?6�K�r-�?"=���=P���������<
�k?����<XN�? U�>P\9@9A?��ڿC��?"=���=P���������>
yM�����=4g=�@,��?"=��@P���������<
yM�����=4g=�;|@,��?�"{�"=���=P���������<
yM�����=4g=0r@,��?�"��"=���=P���������<
yM�����=4g=�a@,��?Z<�"=���=P���������<
yM�����=4g=�BK@,��?�"{�"=���=P���������<
yM�����=4g=|a.@,��?����"=���=P���������Test9 -��@
hƼ���>"=���=P���������j'
""
�k?����< ���0s)?8����ID>
hƼ���>e
�k?����<����`�(?�!����T>H׼�R�>"=���=P���������j'
""
�k?����<����`�(?�!����T>H׼�R�>e
�k?����<���� (?�I����e>.9�����>"=���=P���������j'
""
�k?����<���� (?�I����e>.9�����>e
�k?����<@u�PV'?�v��Rv>����U$?"=���=P���������j'
""
�k?����<@u�PV'?�v��Rv>����U$?e
�k?����<�r[��&?��h��>]��x� ?"=���=P���������j'
""
�k?����<�r[��&?��h��>]��x� ?e
�k?����<�%@�@�%?hBZ�8׋>�Y �g�?"=���=P���������j'
""
�k?����<�%@�@�%?hBZ�8׋>�Y �g�?e
�k?����<@.#��$?�K�A(�>����Y?"=���=P���������j'
""
�k?����<@.#��$?�K�A(�>����Y?e
�k?����<��P�#?P;�`��>�0��$?"=���=P���������j'
""
�k?����<��P�#?P;�`��>�0��$?e
�k?����<��Ƚ0�"?�*��Τ>m�&�3�,?"=���=P���������j'
""
�k?����<��Ƚ0�"?�*��Τ>m�&�3�,?e
�k?����<������!?HF� '�>� /�T�5?"=���=P���������j'
""
�k?����<������!?HF� '�>� /�T�5?e
�k?����<L��p� ?�Rr�>�g7��A>?"=���=P���������j'
""
�k?����<L��p� ?�Rr�>�g7��A>?e
�k?����< �;�b?���6˽>(�?�\G?"=���=P���������j'
""
�k?����< �;�b?���6˽>(�?�\G?e
�k?����<R6=�'?�?���>`6H�/�O?"=���=P���������j'
""
�k?����<R6=�'?�?���>`6H�/�O?e
�k?����<�d�=��? ����l�><�P��rX?"=���=P���������j'
""
�k?����<�d�=��? ����l�><�P��rX?e
�k?����<y>��?�H����> Y��a?"=���=P���������j'
""
�k?����<y>��?�H����> Y��a?e
�k?����<�i,>P&?�ٽ �>3~a��i?"=���=P���������j'
""
�k?����<�i,>P&?�ٽ �>3~a��i?e
�k?����<@Z>��?HN��K�>��i�ӆr?"=���=P���������j'
""
�k?����<@Z>��?HN��K�>��i�ӆr?e
�k?����<���>p7?�p�=���>�Rr��K{?"=���=P���������j'
""
�k?����<���>p7?�p�=���>�Rr��K{?e
�k?����<��>��?`�<>��>��z��?"=���=P���������j'
""
�k?����<��>��?`�<>��>��z��?e
�k?����<`d�>�?�s�>�!?����CZ�?"=���=P���������j'
""
�k?����<`d�>�?�s�>�!?����CZ�?e
�k?����<���>@l?@=�>�G?B�����?"=���=P���������j'
""
�k?����<���>@l?@=�>�G?B�����?e
�k?����<y�>P�?b?�m?�扽� �?"=���=P���������j'
""
�k?����<y�>P�?b?�m?�扽� �?e
�k?����<��?�?�?]� ?����f�?"=���=P���������j'
""
�k?����<��?�?�?]� ?����f�?e
�k?����<@�?@( ?��<?��?�I�����?"=���=P���������j'
""
�k?����<@�?@( ?��<?��?�I�����?e
�k?����<�� ?L ?�c[?��?�x��<�?"=���=P���������j'
""
�k?����<�� ?L ?�c[?��?�x��<�?e
�k?����<��/?�b ?�!{?e?6���zp�?"=���=P���������j'
""
�k?����<��/?�b ?�!{?e?6���zp�?e
�k?����<@W??�k?�ލ?�&?[ߞ�hȤ?"=���=P���������j'
""
�k?����<@W??�k?�ލ?�&?[ߞ�hȤ?e
�k?����<NO?0g?��?�J!?m �� �?"=���=P���������j'
""
�k?����<NO?0g?��?�J!?m �� �?e
�k?����<��_?pU?hȯ?�n%?�=��Nw�?"=���=P���������j'
""
�k?����<��_?pU?hȯ?�n%?�=��Nw�?e
�k?����<�yp?P6?�c�?=�)?�f��Eα?"=���=P���������j'
""
�k?����<�yp?P6?�c�?=�)?�f��Eα?e
�k?����<׀?��>ln�?t�-?]����$�?"=���=P���������j'
""
�k?����<׀?��>ln�?t�-?]����$�?e
�k?����<X��?���>��?W�1?�ó�A{�?"=���=P���������j'
""
�k?����<X��?���>��?W�1?�ó�A{�?e
�k?����<���?@�>���?��5?����BѾ?"=���=P���������j'
""
�k?����<���?@�>���?��5?����BѾ?e
�k?����<���?�g�>@1:?�%���&�?"=���=P���������j'
""
�k?����<���?�g�>@1:?�%���&�?e
�k?����<�Q�?���>_�@*?>?�L��T|�?"=���=P���������j'
""
�k?����<�Q�?���>_�@*?>?�L��T|�?e
�k?����<���? ��>@�`B?A�Ľf��?"=���=P���������j'
""
�k?����<���? ��>@�`B?A�Ľf��?e
�k?����<�˸?]�>hd$@�AF?*{��2�?"=���=P���������j'
""
�k?����<�˸?]�>hd$@�AF?*{��2�?e
�k?����<���? ��>��.@C?6�K�r-�?"=���=P���������j'
""
�k?����<���? ��>��.@C?6�K�r-�?e
�k?����<XN�? U�>P\9@9A?��ڿC��?"=���=P���������j'
""
�k?����<XN�? U�>P\9@9A?��ڿC��?g
yM�����=4g=�@,��?"=��@P���������j'
""
yM�����=4g=�@,��?e
yM�����=4g=�;|@,��?�"{�"=���=P���������j'
""
yM�����=4g=�;|@,��?�"{�e
yM�����=4g=0r@,��?�"��"=���=P���������j'
""
yM�����=4g=0r@,��?�"��e
yM�����=4g=�a@,��?Z<�"=���=P���������j'
""
yM�����=4g=�a@,��?Z<�e
yM�����=4g=�BK@,��?�"{�"=���=P���������j'
""
yM�����=4g=�BK@,��?�"{�e
yM�����=4g=|a.@,��?����"=���=P���������j'
""
yM�����=4g=|a.@,��?����

18
ml-agents/mlagents/trainers/tests/test_ppo.py


def test_trainer_increment_step(dummy_config):
trainer_params = dummy_config
brain_params = BrainParameters("test_brain", 1, 1, [], [2], [], 0)
brain_params = BrainParameters(
brain_name="test_brain",
vector_observation_space_size=1,
camera_resolutions=[],
vector_action_space_size=[2],
vector_action_descriptions=[],
vector_action_space_type=0,
)
trainer = PPOTrainer(brain_params, 0, trainer_params, True, False, 0, "0", False)
policy_mock = mock.Mock()

def test_add_rewards_output(dummy_config):
brain_params = BrainParameters("test_brain", 1, 1, [], [2], [], 0)
brain_params = BrainParameters(
brain_name="test_brain",
vector_observation_space_size=1,
camera_resolutions=[],
vector_action_space_size=[2],
vector_action_descriptions=[],
vector_action_space_type=0,
)
dummy_config["summary_path"] = "./summaries/test_trainer_summary"
dummy_config["model_path"] = "./models/test_trainer_models/TestModel"
trainer = PPOTrainer(brain_params, 0, dummy_config, True, False, 0, "0", False)

24
ml-agents/mlagents/trainers/tests/test_simple_rl.py


from mlagents.envs.base_unity_environment import BaseUnityEnvironment
from mlagents.envs.brain import BrainInfo, AllBrainInfo, BrainParameters
from mlagents.envs.communicator_objects.agent_info_pb2 import AgentInfoProto
from mlagents.envs.communicator_objects.observation_pb2 import (
ObservationProto,
NONE as COMPRESSION_TYPE_NONE,
)
from mlagents.envs.simple_env_manager import SimpleEnvManager
from mlagents.envs.sampler_class import SamplerManager

brain_params = BrainParameters(
brain_name=BRAIN_NAME,
vector_observation_space_size=OBS_SIZE,
num_stacked_vector_observations=1,
camera_resolutions=[],
vector_action_space_size=[2] if use_discrete else [1],
vector_action_descriptions=["moveDirection"],

else:
reward = -TIME_PENALTY
vector_obs = [self.goal] * OBS_SIZE
vector_obs_proto = ObservationProto(
float_data=ObservationProto.FloatData(data=vector_obs),
shape=[len(vector_obs)],
compression_type=COMPRESSION_TYPE_NONE,
)
stacked_vector_observation=[self.goal] * OBS_SIZE, reward=reward, done=done
reward=reward, done=done, observations=[vector_obs_proto]
)
if done:

) -> AllBrainInfo: # type: ignore
self._reset_agent()
vector_obs = [self.goal] * OBS_SIZE
vector_obs_proto = ObservationProto(
float_data=ObservationProto.FloatData(data=vector_obs),
shape=[len(vector_obs)],
compression_type=COMPRESSION_TYPE_NONE,
)
stacked_vector_observation=[self.goal] * OBS_SIZE,
done=False,
max_step_reached=False,
done=False, max_step_reached=False, observations=[vector_obs_proto]
return {
BRAIN_NAME: BrainInfo.from_agent_proto(
0, [agent_info], self._brains[BRAIN_NAME]

116
ml-agents/mlagents/trainers/tests/testdcvis.demo


bcvis& -****:VisualFoodCollectorLearning� "P‡�������j�
bcvis& -****:VisualFoodCollectorLearning� "P‡�������j�
͗b�$P ���� IԳN��O0s��J�)�Q����=�bs`��s)&4|H�@ujٸ��6�0�䃞�{\x�t8����6��I��Wꝏ�����c��k�k.���؈�Kh��������rD�^��fRݐ��.��BG�/<'�:C�Yt��S�&b�]%תz�Ǿ�R� �����}��� ��¿�&�>���t��uel#��w���T����j�����K�X��Ô���r��.#?�wqMD��D ��r�`(�N���'�; m��ko� ����c���I�R�i�Э� /��6��d�`�9�j��D�̢O-�����7�S�Qv]U�iD� ���|5ÕI�IEND�B`�� "P‡�������j�
͗b�$P ���� IԳN��O0s��J�)�Q����=�bs`��s)&4|H�@ujٸ��6�0�䃞�{\x�t8����6��I��Wꝏ�����c��k�k.���؈�Kh��������rD�^��fRݐ��.��BG�/<'�:C�Yt��S�&b�]%תz�Ǿ�R� �����}��� ��¿�&�>���t��uel#��w���T����j�����K�X��Ô���r��.#?�wqMD��D ��r�`(�N���'�; m��ko� ����c���I�R�i�Э� /��6��d�`�9�j��D�̢O-�����7�S�Qv]U�iD� ���|5ÕI�IEND�B`�j
"� "P‡�������j�
͗b�$P ���� IԳN��O0s��J�)�Q����=�bs`��s)&4|H�@ujٸ��6�0�䃞�{\x�t8����6��I��Wꝏ�����c��k�k.���؈�Kh��������rD�^��fRݐ��.��BG�/<'�:C�Yt��S�&b�]%תz�Ǿ�R� �����}��� ��¿�&�>���t��uel#��w���T����j�����K�X��Ô���r��.#?�wqMD��D ��r�`(�N���'�; m��ko� ����c���I�R�i�Э� /��6��d�`�9�j��D�̢O-�����7�S�Qv]U�iD� ���|5ÕI�IEND�B`�� "P‡�������j�
͗b�$P ���� IԳN��O0s��J�)�Q����=�bs`��s)&4|H�@ujٸ��6�0�䃞�{\x�t8����6��I��Wꝏ�����c��k�k.���؈�Kh��������rD�^��fRݐ��.��BG�/<'�:C�Yt��S�&b�]%תz�Ǿ�R� �����}��� ��¿�&�>���t��uel#��w���T����j�����K�X��Ô���r��.#?�wqMD��D ��r�`(�N���'�; m��ko� ����c���I�R�i�Э� /��6��d�`�9�j��D�̢O-�����7�S�Qv]U�iD� ���|5ÕI�IEND�B`�j
"� "P‡�������j�
͗b�$P ���� IԳN��O0s��J�)�Q����=�bs`��s)&4|H�@ujٸ��6�0�䃞�{\x�t8����6��I��Wꝏ�����c��k�k.���؈�Kh��������rD�^��fRݐ��.��BG�/<'�:C�Yt��S�&b�]%תz�Ǿ�R� �����}��� ��¿�&�>���t��uel#��w���T����j�����K�X��Ô���r��.#?�wqMD��D ��r�`(�N���'�; m��ko� ����c���I�R�i�Э� /��6��d�`�9�j��D�̢O-�����7�S�Qv]U�iD� ���|5ÕI�IEND�B`�� "P‡�������j�
͗b�$P ���� IԳN��O0s��J�)�Q����=�bs`��s)&4|H�@ujٸ��6�0�䃞�{\x�t8����6��I��Wꝏ�����c��k�k.���؈�Kh��������rD�^��fRݐ��.��BG�/<'�:C�Yt��S�&b�]%תz�Ǿ�R� �����}��� ��¿�&�>���t��uel#��w���T����j�����K�X��Ô���r��.#?�wqMD��D ��r�`(�N���'�; m��ko� ����c���I�R�i�Э� /��6��d�`�9�j��D�̢O-�����7�S�Qv]U�iD� ���|5ÕI�IEND�B`�j
"� "P‡�������j�
͗b�$P ���� IԳN��O0s��J�)�Q����=�bs`��s)&4|H�@ujٸ��6�0�䃞�{\x�t8����6��I��Wꝏ�����c��k�k.���؈�Kh��������rD�^��fRݐ��.��BG�/<'�:C�Yt��S�&b�]%תz�Ǿ�R� �����}��� ��¿�&�>���t��uel#��w���T����j�����K�X��Ô���r��.#?�wqMD��D ��r�`(�N���'�; m��ko� ����c���I�R�i�Э� /��6��d�`�9�j��D�̢O-�����7�S�Qv]U�iD� ���|5ÕI�IEND�B`�� "P‡�������j�
͗b�$P ���� IԳN��O0s��J�)�Q����=�bs`��s)&4|H�@ujٸ��6�0�䃞�{\x�t8����6��I��Wꝏ�����c��k�k.���؈�Kh��������rD�^��fRݐ��.��BG�/<'�:C�Yt��S�&b�]%תz�Ǿ�R� �����}��� ��¿�&�>���t��uel#��w���T����j�����K�X��Ô���r��.#?�wqMD��D ��r�`(�N���'�; m��ko� ����c���I�R�i�Э� /��6��d�`�9�j��D�̢O-�����7�S�Qv]U�iD� ���|5ÕI�IEND�B`�j
"� "P‡�������j�
͗b�$P ���� IԳN��O0s��J�)�Q����=�bs`��s)&4|H�@ujٸ��6�0�䃞�{\x�t8����6��I��Wꝏ�����c��k�k.���؈�Kh��������rD�^��fRݐ��.��BG�/<'�:C�Yt��S�&b�]%תz�Ǿ�R� �����}��� ��¿�&�>���t��uel#��w���T����j�����K�X��Ô���r��.#?�wqMD��D ��r�`(�N���'�; m��ko� ����c���I�R�i�Э� /��6��d�`�9�j��D�̢O-�����7�S�Qv]U�iD� ���|5ÕI�IEND�B`��"@�?P‡�������j�
͗b�$P ���� IԳN��O0s��J�)�Q����=�bs`��s)&4|H�@ujٸ��6�0�䃞�{\x�t8����6��I��Wꝏ�����c��k�k.���؈�Kh��������rD�^��fRݐ��.��BG�/<'�:C�Yt��S�&b�]%תz�Ǿ�R� �����}��� ��¿�&�>���t��uel#��w���T����j�����K�X��Ô���r��.#?�wqMD��D ��r�`(�N���'�; m��ko� ����c���I�R�i�Э� /��6��d�`�9�j��D�̢O-�����7�S�Qv]U�iD� ���|5ÕI�IEND�B`�j
"�"@�?P‡�������j�
TT��PNG

IHDRTT� ���IDATx�Xͮ�D����$W�@�-j T]!$6���'�Ux ��a�W@����X���R����$�mn�1ߙ��s��6�l�u�����o��ط�7��4���J�x�䛺��ʷ+��h۾���(�+߮|g�m�.z{��m߶}g�m�.z{ڷm߶}g�m�.z{ڷm߶}g�m�.z{ڷm߶}g��m׾���������q�������F�&Z����>o@���9�n����|����|���������ۏ��8�����׵ ���򗿿�<K����x����P����`����1��݋4�����+��6��G7�E�H���Y2;N�w������OGx�&i��=��f~��ܣ8�:�� ��{!�:Nn��?=� �/� �� ���?>�%�EP���A�q7~v�?�͵�����X��ߣG��R*�*���KB�/��.]r|�x���ePA� ��"_fK�1X,�%�A�[�'y��7��y��]F��Mje"�%@���lET����X��#r���E�<��<���i��sh�<�=|��wG�9��G�b=<�آ��[j[�|*��ّY��^ ��B�"q¡�����q6���ϔ?ܘ�G�����8 �3 �BhORn���1�̕=���P0q���a ��Ģ#����/��Φ'��ω�"�γ�Lܳ ""Po�`0@�q���+Ec���d�<��\�r����Y��^9�|�o �������hoZd�g0�fx��NOSO��T��0����"v��Y:�CSL]�Y({��ɘ3��W�V��^�����AX>�@Ap6:û ˚/��p4<�@0?Mg�Y��7,����!�A ֟ձb�% Jn�yi�_Q�5��Ѻ*IM���)�C

��\��F����B��2����a��c��� ��5o��݄�3ʓI'e~�I�9VL���8��E�'\�=v�Q�$mﰁu�u�}����&ֵ��0��J��Y8&`�Y���z���<���NF0 Yg����JՙJ�\��]��B
������ ������s���6q�D���Z�i>�[�D0<���E���럞N�z��H2b-�3�?�J �2s�5?v����z�=/���1�P;��D;�.UE��l��1#����#)�v{�M�ʫi@�yrH��^��d ����`�_ψF��[���R{6�~ɛT)E�J�~��\��(�^u����몔�J��ެ��u=b/|y>����˛h� s�D�Ԩـ���G �Ul��Ni���I��@�Ƨ����~k�&Vx��5���G^��^�"ۃ����y�:a5E�dmF2K��M����Ug���-6�uI�z4K��t�F鉘��Ȗ��dv�^��-��-�>��b.�>��`V� �������jR�r<s���ω�D`V��q�Y�ʨ���*�Ì�N#ov�Y
���tT���i���{�~������ޔ�:x�P�a栭��������i��_IEND�B`��"@�?P‡�������j�
���tT���i���{�~������ޔ�:x�P�a栭��������i��_IEND�B`�j
"�"@�?P‡�������j�
TT��PNG

IHDRTT� ���IDATx�Xͮ�D����$W�@�-j T]!$6���'�Ux ��a�W@����X���R����$�mn�1ߙ��s��6�l�u�����o��ط�7��4���J�x�䛺��ʷ+��h۾���(�+߮|g�m�.z{��m߶}g�m�.z{ڷm߶}g�m�.z{ڷm߶}g�m�.z{ڷm߶}g��m׾���������q�������F�&Z����>o@���9�n����|����|���������ۏ��8�����׵ ���򗿿�<K����x����P����`����1��݋4�����+��6��G7�E�H���Y2;N�w������OGx�&i��=��f~��ܣ8�:�� ��{!�:Nn��?=� �/� �� ���?>�%�EP���A�q7~v�?�͵�����X��ߣG��R*�*���KB�/��.]r|�x���ePA� ��"_fK�1X,�%�A�[�'y��7��y��]F��Mje"�%@���lET����X��#r���E�<��<���i��sh�<�=|��wG�9��G�b=<�آ��[j[�|*��ّY��^ ��B�"q¡�����q6���ϔ?ܘ�G�����8 �3 �BhORn���1�̕=���P0q���a ��Ģ#����/��Φ'��ω�"�γ�Lܳ ""Po�`0@�q���+Ec���d�<��\�r����Y��^9�|�o �������hoZd�g0�fx��NOSO��T��0����"v��Y:�CSL]�Y({��ɘ3��W�V��^�����AX>�@Ap6:û ˚/��p4<�@0?Mg�Y��7,����!�A ֟ձb�% Jn�yi�_Q�5��Ѻ*IM���)�C

��\��F����B��2����a��c��� ��5o��݄�3ʓI'e~�I�9VL���8��E�'\�=v�Q�$mﰁu�u�}����&ֵ��0��J��Y8&`�Y���z���<���NF0 Yg����JՙJ�\��]��B
������ ������s���6q�D���Z�i>�[�D0<���E���럞N�z��H2b-�3�?�J �2s�5?v����z�=/���1�P;��D;�.UE��l��1#����#)�v{�M�ʫi@�yrH��^��d ����`�_ψF��[���R{6�~ɛT)E�J�~��\��(�^u����몔�J��ެ��u=b/|y>����˛h� s�D�Ԩـ���G �Ul��Ni���I��@�Ƨ����~k�&Vx��5���G^��^�"ۃ����y�:a5E�dmF2K��M����Ug���-6�uI�z4K��t�F鉘��Ȗ��dv�^��-��-�>��b.�>��`V� �������jR�r<s���ω�D`V��q�Y�ʨ���*�Ì�N#ov�Y
���tT���i���{�~������ޔ�:x�P�a栭��������i��_IEND�B`��"@�?P‡�������j�
���tT���i���{�~������ޔ�:x�P�a栭��������i��_IEND�B`�j
"�"@�?P‡�������j�
TT��PNG

IHDRTT� ���IDATx�Xͮ�D����$W�@�-j T]!$6���'�Ux ��a�W@����X���R����$�mn�1ߙ��s��6�l�u�����o��ط�7��4���J�x�䛺��ʷ+��h۾���(�+߮|g�m�.z{��m߶}g�m�.z{ڷm߶}g�m�.z{ڷm߶}g�m�.z{ڷm߶}g��m׾���������q�������F�&Z����>o@���9�n����|����|���������ۏ��8�����׵ ���򗿿�<K����x����P����`����1��݋4�����+��6��G7�E�H���Y2;N�w������OGx�&i��=��f~��ܣ8�:�� ��{!�:Nn��?=� �/� �� ���?>�%�EP���A�q7~v�?�͵�����X��ߣG��R*�*���KB�/��.]r|�x���ePA� ��"_fK�1X,�%�A�[�'y��7��y��]F��Mje"�%@���lET����X��#r���E�<��<���i��sh�<�=|��wG�9��G�b=<�آ��[j[�|*��ّY��^ ��B�"q¡�����q6���ϔ?ܘ�G�����8 �3 �BhORn���1�̕=���P0q���a ��Ģ#����/��Φ'��ω�"�γ�Lܳ ""Po�`0@�q���+Ec���d�<��\�r����Y��^9�|�o �������hoZd�g0�fx��NOSO��T��0����"v��Y:�CSL]�Y({��ɘ3��W�V��^�����AX>�@Ap6:û ˚/��p4<�@0?Mg�Y��7,����!�A ֟ձb�% Jn�yi�_Q�5��Ѻ*IM���)�C

��\��F����B��2����a��c��� ��5o��݄�3ʓI'e~�I�9VL���8��E�'\�=v�Q�$mﰁu�u�}����&ֵ��0��J��Y8&`�Y���z���<���NF0 Yg����JՙJ�\��]��B
������ ������s���6q�D���Z�i>�[�D0<���E���럞N�z��H2b-�3�?�J �2s�5?v����z�=/���1�P;��D;�.UE��l��1#����#)�v{�M�ʫi@�yrH��^��d ����`�_ψF��[���R{6�~ɛT)E�J�~��\��(�^u����몔�J��ެ��u=b/|y>����˛h� s�D�Ԩـ���G �Ul��Ni���I��@�Ƨ����~k�&Vx��5���G^��^�"ۃ����y�:a5E�dmF2K��M����Ug���-6�uI�z4K��t�F鉘��Ȗ��dv�^��-��-�>��b.�>��`V� �������jR�r<s���ω�D`V��q�Y�ʨ���*�Ì�N#ov�Y
���tT���i���{�~������ޔ�:x�P�a栭��������i��_IEND�B`��"@�?P‡�������j�
���tT���i���{�~������ޔ�:x�P�a栭��������i��_IEND�B`�j
"�"@�?P‡�������j�
TT��PNG

IHDRTT� ���IDATx�Xͮ�D����$W�@�-j T]!$6���'�Ux ��a�W@����X���R����$�mn�1ߙ��s��6�l�u�����o��ط�7��4���J�x�䛺��ʷ+��h۾���(�+߮|g�m�.z{��m߶}g�m�.z{ڷm߶}g�m�.z{ڷm߶}g�m�.z{ڷm߶}g��m׾���������q�������F�&Z����>o@���9�n����|����|���������ۏ��8�����׵ ���򗿿�<K����x����P����`����1��݋4�����+��6��G7�E�H���Y2;N�w������OGx�&i��=��f~��ܣ8�:�� ��{!�:Nn��?=� �/� �� ���?>�%�EP���A�q7~v�?�͵�����X��ߣG��R*�*���KB�/��.]r|�x���ePA� ��"_fK�1X,�%�A�[�'y��7��y��]F��Mje"�%@���lET����X��#r���E�<��<���i��sh�<�=|��wG�9��G�b=<�آ��[j[�|*��ّY��^ ��B�"q¡�����q6���ϔ?ܘ�G�����8 �3 �BhORn���1�̕=���P0q���a ��Ģ#����/��Φ'��ω�"�γ�Lܳ ""Po�`0@�q���+Ec���d�<��\�r����Y��^9�|�o �������hoZd�g0�fx��NOSO��T��0����"v��Y:�CSL]�Y({��ɘ3��W�V��^�����AX>�@Ap6:û ˚/��p4<�@0?Mg�Y��7,����!�A ֟ձb�% Jn�yi�_Q�5��Ѻ*IM���)�C

��\��F����B��2����a��c��� ��5o��݄�3ʓI'e~�I�9VL���8��E�'\�=v�Q�$mﰁu�u�}����&ֵ��0��J��Y8&`�Y���z���<���NF0 Yg����JՙJ�\��]��B
������ ������s���6q�D���Z�i>�[�D0<���E���럞N�z��H2b-�3�?�J �2s�5?v����z�=/���1�P;��D;�.UE��l��1#����#)�v{�M�ʫi@�yrH��^��d ����`�_ψF��[���R{6�~ɛT)E�J�~��\��(�^u����몔�J��ެ��u=b/|y>����˛h� s�D�Ԩـ���G �Ul��Ni���I��@�Ƨ����~k�&Vx��5���G^��^�"ۃ����y�:a5E�dmF2K��M����Ug���-6�uI�z4K��t�F鉘��Ȗ��dv�^��-��-�>��b.�>��`V� �������jR�r<s���ω�D`V��q�Y�ʨ���*�Ì�N#ov�Y
���tT���i���{�~������ޔ�:x�P�a栭��������i��_IEND�B`��"@�?P‡�������j�
���tT���i���{�~������ޔ�:x�P�a栭��������i��_IEND�B`�j
"�"@�?P‡�������j�
TT��PNG

IHDRTT� ���IDATx�Xͮ�D����$W�@�-j T]!$6���'�Ux ��a�W@����X���R����$�mn�1ߙ��s��6�l�u�����o��ط�7��4���J�x�䛺��ʷ+��h۾���(�+߮|g�m�.z{��m߶}g�m�.z{ڷm߶}g�m�.z{ڷm߶}g�m�.z{ڷm߶}g��m׾���������q�������F�&Z����>o@���9�n����|����|���������ۏ��8�����׵ ���򗿿�<K����x����P����`����1��݋4�����+��6��G7�E�H���Y2;N�w������OGx�&i��=��f~��ܣ8�:�� ��{!�:Nn��?=� �/� �� ���?>�%�EP���A�q7~v�?�͵�����X��ߣG��R*�*���KB�/��.]r|�x���ePA� ��"_fK�1X,�%�A�[�'y��7��y��]F��Mje"�%@���lET����X��#r���E�<��<���i��sh�<�=|��wG�9��G�b=<�آ��[j[�|*��ّY��^ ��B�"q¡�����q6���ϔ?ܘ�G�����8 �3 �BhORn���1�̕=���P0q���a ��Ģ#����/��Φ'��ω�"�γ�Lܳ ""Po�`0@�q���+Ec���d�<��\�r����Y��^9�|�o �������hoZd�g0�fx��NOSO��T��0����"v��Y:�CSL]�Y({��ɘ3��W�V��^�����AX>�@Ap6:û ˚/��p4<�@0?Mg�Y��7,����!�A ֟ձb�% Jn�yi�_Q�5��Ѻ*IM���)�C

��\��F����B��2����a��c��� ��5o��݄�3ʓI'e~�I�9VL���8��E�'\�=v�Q�$mﰁu�u�}����&ֵ��0��J��Y8&`�Y���z���<���NF0 Yg����JՙJ�\��]��B
������ ������s���6q�D���Z�i>�[�D0<���E���럞N�z��H2b-�3�?�J �2s�5?v����z�=/���1�P;��D;�.UE��l��1#����#)�v{�M�ʫi@�yrH��^��d ����`�_ψF��[���R{6�~ɛT)E�J�~��\��(�^u����몔�J��ެ��u=b/|y>����˛h� s�D�Ԩـ���G �Ul��Ni���I��@�Ƨ����~k�&Vx��5���G^��^�"ۃ����y�:a5E�dmF2K��M����Ug���-6�uI�z4K��t�F鉘��Ȗ��dv�^��-��-�>��b.�>��`V� �������jR�r<s���ω�D`V��q�Y�ʨ���*�Ì�N#ov�Y
���tT���i���{�~������ޔ�:x�P�a栭��������i��_IEND�B`�� "�?�?�?�?P‡�������j�
���tT���i���{�~������ޔ�:x�P�a栭��������i��_IEND�B`�j
"� "�?�?�?�?P‡�������j�
TT� �PNG

IHDRTT� ���IDATx�X�n\E�IF��� X�����k�� ;~�=_6Y@/ $�x,#�P�����OUw�nj��-n�"�z�:U�n�뉗_|��b��Gsκ�����v�۝��ڱ��M�۝ow~�h�~�7���ڱo�~�h�~�7���۱o�~�h�~�7���۱o�~�h�~�7���۱o�~�x����__}������◿��k��]^^�-�����]�k!�^��ln�����.�Ƿ��/�G��C�ڷ ��JL߄���z/�c��{8�i]G���/�������Ez�z�K_~���G�=��LMQ����?����O�럯7�l^���Tj-�Q~���o��o���v� m��������ꇫ����Pp�.�S�_r��ψ�����b/4���H�?y��L�2fONO(uq~�*�7R?O�)����$�

�"�f�Ш7uo3����`V���V�oxY�v(���e�n;j�fq��)�<�C���>+�m�;���C�C춋��wT���7��i��A�K 삟y�ӹ�bw:���c9ԕ9��=��&\��(o{;e��͝�}�|��(�۪Ц���3�3��܅�v��m�v��T��!���Q��s�.���� ���7�˲K�ڱ�� �vQ����w{;[�iS�hgSU�YD�"��y��� �IEND�B`�� "�?�?�?�?P‡�������j�
�"�f�Ш7uo3����`V���V�oxY�v(���e�n;j�fq��)�<�C���>+�m�;���C�C춋��wT���7��i��A�K 삟y�ӹ�bw:���c9ԕ9��=��&\��(o{;e��͝�}�|��(�۪Ц���3�3��܅�v��m�v��T��!���Q��s�.���� ���7�˲K�ڱ�� �vQ����w{;[�iS�hgSU�YD�"��y��� �IEND�B`�j
"� "�?�?�?�?P‡�������j�
TT� �PNG

IHDRTT� ���IDATx�X�n\E�IF��� X�����k�� ;~�=_6Y@/ $�x,#�P�����OUw�nj��-n�"�z�:U�n�뉗_|��b��Gsκ�����v�۝��ڱ��M�۝ow~�h�~�7���ڱo�~�h�~�7���۱o�~�h�~�7���۱o�~�h�~�7���۱o�~�x����__}������◿��k��]^^�-�����]�k!�^��ln�����.�Ƿ��/�G��C�ڷ ��JL߄���z/�c��{8�i]G���/�������Ez�z�K_~���G�=��LMQ����?����O�럯7�l^���Tj-�Q~���o��o���v� m��������ꇫ����Pp�.�S�_r��ψ�����b/4���H�?y��L�2fONO(uq~�*�7R?O�)����$�

�"�f�Ш7uo3����`V���V�oxY�v(���e�n;j�fq��)�<�C���>+�m�;���C�C춋��wT���7��i��A�K 삟y�ӹ�bw:���c9ԕ9��=��&\��(o{;e��͝�}�|��(�۪Ц���3�3��܅�v��m�v��T��!���Q��s�.���� ���7�˲K�ڱ�� �vQ����w{;[�iS�hgSU�YD�"��y��� �IEND�B`�� "�?�?�?�?P‡�������j�
�"�f�Ш7uo3����`V���V�oxY�v(���e�n;j�fq��)�<�C���>+�m�;���C�C춋��wT���7��i��A�K 삟y�ӹ�bw:���c9ԕ9��=��&\��(o{;e��͝�}�|��(�۪Ц���3�3��܅�v��m�v��T��!���Q��s�.���� ���7�˲K�ڱ�� �vQ����w{;[�iS�hgSU�YD�"��y��� �IEND�B`�j
"� "�?�?�?�?P‡�������j�
TT� �PNG

IHDRTT� ���IDATx�X�n\E�IF��� X�����k�� ;~�=_6Y@/ $�x,#�P�����OUw�nj��-n�"�z�:U�n�뉗_|��b��Gsκ�����v�۝��ڱ��M�۝ow~�h�~�7���ڱo�~�h�~�7���۱o�~�h�~�7���۱o�~�h�~�7���۱o�~�x����__}������◿��k��]^^�-�����]�k!�^��ln�����.�Ƿ��/�G��C�ڷ ��JL߄���z/�c��{8�i]G���/�������Ez�z�K_~���G�=��LMQ����?����O�럯7�l^���Tj-�Q~���o��o���v� m��������ꇫ����Pp�.�S�_r��ψ�����b/4���H�?y��L�2fONO(uq~�*�7R?O�)����$�

�"�f�Ш7uo3����`V���V�oxY�v(���e�n;j�fq��)�<�C���>+�m�;���C�C춋��wT���7��i��A�K 삟y�ӹ�bw:���c9ԕ9��=��&\��(o{;e��͝�}�|��(�۪Ц���3�3��܅�v��m�v��T��!���Q��s�.���� ���7�˲K�ڱ�� �vQ����w{;[�iS�hgSU�YD�"��y��� �IEND�B`�� "�?�?�?�?P‡�������j�
�"�f�Ш7uo3����`V���V�oxY�v(���e�n;j�fq��)�<�C���>+�m�;���C�C춋��wT���7��i��A�K 삟y�ӹ�bw:���c9ԕ9��=��&\��(o{;e��͝�}�|��(�۪Ц���3�3��܅�v��m�v��T��!���Q��s�.���� ���7�˲K�ڱ�� �vQ����w{;[�iS�hgSU�YD�"��y��� �IEND�B`�j
"� "�?�?�?�?P‡�������j�
TT� �PNG

IHDRTT� ���IDATx�X�n\E�IF��� X�����k�� ;~�=_6Y@/ $�x,#�P�����OUw�nj��-n�"�z�:U�n�뉗_|��b��Gsκ�����v�۝��ڱ��M�۝ow~�h�~�7���ڱo�~�h�~�7���۱o�~�h�~�7���۱o�~�h�~�7���۱o�~�x����__}������◿��k��]^^�-�����]�k!�^��ln�����.�Ƿ��/�G��C�ڷ ��JL߄���z/�c��{8�i]G���/�������Ez�z�K_~���G�=��LMQ����?����O�럯7�l^���Tj-�Q~���o��o���v� m��������ꇫ����Pp�.�S�_r��ψ�����b/4���H�?y��L�2fONO(uq~�*�7R?O�)����$�

�"�f�Ш7uo3����`V���V�oxY�v(���e�n;j�fq��)�<�C���>+�m�;���C�C춋��wT���7��i��A�K 삟y�ӹ�bw:���c9ԕ9��=��&\��(o{;e��͝�}�|��(�۪Ц���3�3��܅�v��m�v��T��!���Q��s�.���� ���7�˲K�ڱ�� �vQ����w{;[�iS�hgSU�YD�"��y��� �IEND�B`�� "�?�?�?�?P‡�������j�
�"�f�Ш7uo3����`V���V�oxY�v(���e�n;j�fq��)�<�C���>+�m�;���C�C춋��wT���7��i��A�K 삟y�ӹ�bw:���c9ԕ9��=��&\��(o{;e��͝�}�|��(�۪Ц���3�3��܅�v��m�v��T��!���Q��s�.���� ���7�˲K�ڱ�� �vQ����w{;[�iS�hgSU�YD�"��y��� �IEND�B`�j
"� "�?�?�?�?P‡�������j�
TT� �PNG

IHDRTT� ���IDATx�X�n\E�IF��� X�����k�� ;~�=_6Y@/ $�x,#�P�����OUw�nj��-n�"�z�:U�n�뉗_|��b��Gsκ�����v�۝��ڱ��M�۝ow~�h�~�7���ڱo�~�h�~�7���۱o�~�h�~�7���۱o�~�h�~�7���۱o�~�x����__}������◿��k��]^^�-�����]�k!�^��ln�����.�Ƿ��/�G��C�ڷ ��JL߄���z/�c��{8�i]G���/�������Ez�z�K_~���G�=��LMQ����?����O�럯7�l^���Tj-�Q~���o��o���v� m��������ꇫ����Pp�.�S�_r��ψ�����b/4���H�?y��L�2fONO(uq~�*�7R?O�)����$�

�"�f�Ш7uo3����`V���V�oxY�v(���e�n;j�fq��)�<�C���>+�m�;���C�C춋��wT���7��i��A�K 삟y�ӹ�bw:���c9ԕ9��=��&\��(o{;e��͝�}�|��(�۪Ц���3�3��܅�v��m�v��T��!���Q��s�.���� ���7�˲K�ڱ�� �vQ����w{;[�iS�hgSU�YD�"��y��� �IEND�B`�� "@@�?�?P‡�������j�
�"�f�Ш7uo3����`V���V�oxY�v(���e�n;j�fq��)�<�C���>+�m�;���C�C춋��wT���7��i��A�K 삟y�ӹ�bw:���c9ԕ9��=��&\��(o{;e��͝�}�|��(�۪Ц���3�3��܅�v��m�v��T��!���Q��s�.���� ���7�˲K�ڱ�� �vQ����w{;[�iS�hgSU�YD�"��y��� �IEND�B`�j
"� "@@�?�?P‡�������j�
TT� �PNG

IHDRTT� ���IDATx�Y1r$7 Ժ�"m��WN�������p��p��Y�8�*�A��93������V��M��pV��/������7{m��=����ϝ�;����~���-ϝ�;����~��>/�y�����


}�M�LU�BK:�R��b�f����59M���?<<ʣn�_�F0?T�b���b���d*P�z�S�o��*�O�*9F�A��G��o���̈�J��Ki43�L�5�(�e��Ҹu�c��\0\�Ǟ����.��h�7�P)ʎ'��:J�0��2���˻���O�K�z�@C�`��5��8��k�#��؇G]:HO�϶����*�)!�z�+�d�r�w��u����n)`�i�Z;(�jv��a���b�Pj��C��=��,��01g��A&s�Lٶ7D.�E[r4&�p��:���j��;�N���}T���g�=\�C,$�@KC��u�s��<�%��ݙg0�nģ7���(ŷ�A���K�"Ȁe)�؇|^�6) �� ��-���Y*�{�/89ϋ��[�=O�m{(����<Y�nu�29���I��$�� R�x���}l�d-��Hb��h���j����Ԑk�:��X�� &ŀ��5`+��;ۓCٍ5�zB��?�TWA$�ů��[L/a>&�<J1s��EQҘ���N�O�t4<=|��`'�T�T1W�H��kr�e`�L���V����U� %/#�vGg8�50�l:�h-�yNr��T�B8����P s� �3v��Z�T�����W�,�s���p�F��o�F ����k�Rv�%�v�1!z^����,��/�b!ʅ��'Qә�bE$z�i��a�F07���;]�2]�Ȩ�<�#>f\�Up�q{p8ZLpX �l���%/��E5/#D���]�cD�"����n�N����pԺ��X %'���򖍅�P�������7vjB��XKW���ܔ�` 5����(�ml18��nG<z������4���1����u)-�,�QS�=ܔj�b7�'�������OW���0�
�0o#8�����1���4? �I�[8�w���cs:!��B���Hf_�*�������<|17�[N��IEND�B`�� "@@�?�?P‡�������j�
�0o#8�����1���4? �I�[8�w���cs:!��B���Hf_�*�������<|17�[N��IEND�B`�j
"� "@@�?�?P‡�������j�
TT� �PNG

IHDRTT� ���IDATx�Y1r$7 Ժ�"m��WN�������p��p��Y�8�*�A��93������V��M��pV��/������7{m��=����ϝ�;����~���-ϝ�;����~��>/�y�����


}�M�LU�BK:�R��b�f����59M���?<<ʣn�_�F0?T�b���b���d*P�z�S�o��*�O�*9F�A��G��o���̈�J��Ki43�L�5�(�e��Ҹu�c��\0\�Ǟ����.��h�7�P)ʎ'��:J�0��2���˻���O�K�z�@C�`��5��8��k�#��؇G]:HO�϶����*�)!�z�+�d�r�w��u����n)`�i�Z;(�jv��a���b�Pj��C��=��,��01g��A&s�Lٶ7D.�E[r4&�p��:���j��;�N���}T���g�=\�C,$�@KC��u�s��<�%��ݙg0�nģ7���(ŷ�A���K�"Ȁe)�؇|^�6) �� ��-���Y*�{�/89ϋ��[�=O�m{(����<Y�nu�29���I��$�� R�x���}l�d-��Hb��h���j����Ԑk�:��X�� &ŀ��5`+��;ۓCٍ5�zB��?�TWA$�ů��[L/a>&�<J1s��EQҘ���N�O�t4<=|��`'�T�T1W�H��kr�e`�L���V����U� %/#�vGg8�50�l:�h-�yNr��T�B8����P s� �3v��Z�T�����W�,�s���p�F��o�F ����k�Rv�%�v�1!z^����,��/�b!ʅ��'Qә�bE$z�i��a�F07���;]�2]�Ȩ�<�#>f\�Up�q{p8ZLpX �l���%/��E5/#D���]�cD�"����n�N����pԺ��X %'���򖍅�P�������7vjB��XKW���ܔ�` 5����(�ml18��nG<z������4���1����u)-�,�QS�=ܔj�b7�'�������OW���0�
�0o#8�����1���4? �I�[8�w���cs:!��B���Hf_�*�������<|17�[N��IEND�B`�� "@@�?�?P‡�������j�
�0o#8�����1���4? �I�[8�w���cs:!��B���Hf_�*�������<|17�[N��IEND�B`�j
"� "@@�?�?P‡�������j�
TT� �PNG

IHDRTT� ���IDATx�Y1r$7 Ժ�"m��WN�������p��p��Y�8�*�A��93������V��M��pV��/������7{m��=����ϝ�;����~���-ϝ�;����~��>/�y�����


}�M�LU�BK:�R��b�f����59M���?<<ʣn�_�F0?T�b���b���d*P�z�S�o��*�O�*9F�A��G��o���̈�J��Ki43�L�5�(�e��Ҹu�c��\0\�Ǟ����.��h�7�P)ʎ'��:J�0��2���˻���O�K�z�@C�`��5��8��k�#��؇G]:HO�϶����*�)!�z�+�d�r�w��u����n)`�i�Z;(�jv��a���b�Pj��C��=��,��01g��A&s�Lٶ7D.�E[r4&�p��:���j��;�N���}T���g�=\�C,$�@KC��u�s��<�%��ݙg0�nģ7���(ŷ�A���K�"Ȁe)�؇|^�6) �� ��-���Y*�{�/89ϋ��[�=O�m{(����<Y�nu�29���I��$�� R�x���}l�d-��Hb��h���j����Ԑk�:��X�� &ŀ��5`+��;ۓCٍ5�zB��?�TWA$�ů��[L/a>&�<J1s��EQҘ���N�O�t4<=|��`'�T�T1W�H��kr�e`�L���V����U� %/#�vGg8�50�l:�h-�yNr��T�B8����P s� �3v��Z�T�����W�,�s���p�F��o�F ����k�Rv�%�v�1!z^����,��/�b!ʅ��'Qә�bE$z�i��a�F07���;]�2]�Ȩ�<�#>f\�Up�q{p8ZLpX �l���%/��E5/#D���]�cD�"����n�N����pԺ��X %'���򖍅�P�������7vjB��XKW���ܔ�` 5����(�ml18��nG<z������4���1����u)-�,�QS�=ܔj�b7�'�������OW���0�
�0o#8�����1���4? �I�[8�w���cs:!��B���Hf_�*�������<|17�[N��IEND�B`�� "@@�?�?P‡�������j�
�0o#8�����1���4? �I�[8�w���cs:!��B���Hf_�*�������<|17�[N��IEND�B`�j
"� "@@�?�?P‡�������j�
TT� �PNG

IHDRTT� ���IDATx�Y1r$7 Ժ�"m��WN�������p��p��Y�8�*�A��93������V��M��pV��/������7{m��=����ϝ�;����~���-ϝ�;����~��>/�y�����


}�M�LU�BK:�R��b�f����59M���?<<ʣn�_�F0?T�b���b���d*P�z�S�o��*�O�*9F�A��G��o���̈�J��Ki43�L�5�(�e��Ҹu�c��\0\�Ǟ����.��h�7�P)ʎ'��:J�0��2���˻���O�K�z�@C�`��5��8��k�#��؇G]:HO�϶����*�)!�z�+�d�r�w��u����n)`�i�Z;(�jv��a���b�Pj��C��=��,��01g��A&s�Lٶ7D.�E[r4&�p��:���j��;�N���}T���g�=\�C,$�@KC��u�s��<�%��ݙg0�nģ7���(ŷ�A���K�"Ȁe)�؇|^�6) �� ��-���Y*�{�/89ϋ��[�=O�m{(����<Y�nu�29���I��$�� R�x���}l�d-��Hb��h���j����Ԑk�:��X�� &ŀ��5`+��;ۓCٍ5�zB��?�TWA$�ů��[L/a>&�<J1s��EQҘ���N�O�t4<=|��`'�T�T1W�H��kr�e`�L���V����U� %/#�vGg8�50�l:�h-�yNr��T�B8����P s� �3v��Z�T�����W�,�s���p�F��o�F ����k�Rv�%�v�1!z^����,��/�b!ʅ��'Qә�bE$z�i��a�F07���;]�2]�Ȩ�<�#>f\�Up�q{p8ZLpX �l���%/��E5/#D���]�cD�"����n�N����pԺ��X %'���򖍅�P�������7vjB��XKW���ܔ�` 5����(�ml18��nG<z������4���1����u)-�,�QS�=ܔj�b7�'�������OW���0�
�0o#8�����1���4? �I�[8�w���cs:!��B���Hf_�*�������<|17�[N��IEND�B`�� "@@�?�?P‡�������j�
�0o#8�����1���4? �I�[8�w���cs:!��B���Hf_�*�������<|17�[N��IEND�B`�j
"� "@@�?�?P‡�������j�
TT� �PNG

IHDRTT� ���IDATx�Y1r$7 Ժ�"m��WN�������p��p��Y�8�*�A��93������V��M��pV��/������7{m��=����ϝ�;����~���-ϝ�;����~��>/�y�����


}�M�LU�BK:�R��b�f����59M���?<<ʣn�_�F0?T�b���b���d*P�z�S�o��*�O�*9F�A��G��o���̈�J��Ki43�L�5�(�e��Ҹu�c��\0\�Ǟ����.��h�7�P)ʎ'��:J�0��2���˻���O�K�z�@C�`��5��8��k�#��؇G]:HO�϶����*�)!�z�+�d�r�w��u����n)`�i�Z;(�jv��a���b�Pj��C��=��,��01g��A&s�Lٶ7D.�E[r4&�p��:���j��;�N���}T���g�=\�C,$�@KC��u�s��<�%��ݙg0�nģ7���(ŷ�A���K�"Ȁe)�؇|^�6) �� ��-���Y*�{�/89ϋ��[�=O�m{(����<Y�nu�29���I��$�� R�x���}l�d-��Hb��h���j����Ԑk�:��X�� &ŀ��5`+��;ۓCٍ5�zB��?�TWA$�ů��[L/a>&�<J1s��EQҘ���N�O�t4<=|��`'�T�T1W�H��kr�e`�L���V����U� %/#�vGg8�50�l:�h-�yNr��T�B8����P s� �3v��Z�T�����W�,�s���p�F��o�F ����k�Rv�%�v�1!z^����,��/�b!ʅ��'Qә�bE$z�i��a�F07���;]�2]�Ȩ�<�#>f\�Up�q{p8ZLpX �l���%/��E5/#D���]�cD�"����n�N����pԺ��X %'���򖍅�P�������7vjB��XKW���ܔ�` 5����(�ml18��nG<z������4���1����u)-�,�QS�=ܔj�b7�'�������OW���0�
�0o#8�����1���4? �I�[8�w���cs:!��B���Hf_�*�������<|17�[N��IEND�B`�� "�?�?@�?P‡�������j�
�0o#8�����1���4? �I�[8�w���cs:!��B���Hf_�*�������<|17�[N��IEND�B`�j
"� "�?�?@�?P‡�������j�
TT� �PNG

IHDRTT� ���IDATx�Y��U݁�T��d���GP�|!99F������]�

`)��k�`fᙇ����^V#��R?M~ )� X�� j��3��#O^���2�1 ��1�l<Ǖ,��:��|�m�Y�w�P�[�98��|�}����t�r�GФ��+3
E���T8���e�G:���`k\Sh>KCJU��:��,y�!�B��db%BX�,T
!LAZ�!?I2��$7$_x�Ą��I��-;8�`��% ~���ƒ��Fw���yɱu8�$�3�|^�" _9���_��k8J��y#~��I�1#�������m���0}0�Nwa3�/�$O+����<u��m�t
��8z_)i�<���U#݌�#�O�k�1�c췋��wR�4~�ƙR6)�d�삟yǟRy8c9���c���1��5%��D�/�mo���s}Gxh#V���lx��d�X�|F��t#�]�l��0�EKghlJ�?���4iNۅm�^x�����&U�� Ixn:������ږ�Is�e��?��σ���IEND�B`�� "�?�?@�?P‡�������j�
��8z_)i�<���U#݌�#�O�k�1�c췋��wR�4~�ƙR6)�d�삟yǟRy8c9���c���1��5%��D�/�mo���s}Gxh#V���lx��d�X�|F��t#�]�l��0�EKghlJ�?���4iNۅm�^x�����&U�� Ixn:������ږ�Is�e��?��σ���IEND�B`�j
"� "�?�?@�?P‡�������j�
TT� �PNG

IHDRTT� ���IDATx�Y��U݁�T��d���GP�|!99F������]�

`)��k�`fᙇ����^V#��R?M~ )� X�� j��3��#O^���2�1 ��1�l<Ǖ,��:��|�m�Y�w�P�[�98��|�}����t�r�GФ��+3
E���T8���e�G:���`k\Sh>KCJU��:��,y�!�B��db%BX�,T
!LAZ�!?I2��$7$_x�Ą��I��-;8�`��% ~���ƒ��Fw���yɱu8�$�3�|^�" _9���_��k8J��y#~��I�1#�������m���0}0�Nwa3�/�$O+����<u��m�t
��8z_)i�<���U#݌�#�O�k�1�c췋��wR�4~�ƙR6)�d�삟yǟRy8c9���c���1��5%��D�/�mo���s}Gxh#V���lx��d�X�|F��t#�]�l��0�EKghlJ�?���4iNۅm�^x�����&U�� Ixn:������ږ�Is�e��?��σ���IEND�B`�� "�?�?@�?P‡�������j�
��8z_)i�<���U#݌�#�O�k�1�c췋��wR�4~�ƙR6)�d�삟yǟRy8c9���c���1��5%��D�/�mo���s}Gxh#V���lx��d�X�|F��t#�]�l��0�EKghlJ�?���4iNۅm�^x�����&U�� Ixn:������ږ�Is�e��?��σ���IEND�B`�j
"� "�?�?@�?P‡�������j�
TT� �PNG

IHDRTT� ���IDATx�Y��U݁�T��d���GP�|!99F������]�

`)��k�`fᙇ����^V#��R?M~ )� X�� j��3��#O^���2�1 ��1�l<Ǖ,��:��|�m�Y�w�P�[�98��|�}����t�r�GФ��+3
E���T8���e�G:���`k\Sh>KCJU��:��,y�!�B��db%BX�,T
!LAZ�!?I2��$7$_x�Ą��I��-;8�`��% ~���ƒ��Fw���yɱu8�$�3�|^�" _9���_��k8J��y#~��I�1#�������m���0}0�Nwa3�/�$O+����<u��m�t
��8z_)i�<���U#݌�#�O�k�1�c췋��wR�4~�ƙR6)�d�삟yǟRy8c9���c���1��5%��D�/�mo���s}Gxh#V���lx��d�X�|F��t#�]�l��0�EKghlJ�?���4iNۅm�^x�����&U�� Ixn:������ږ�Is�e��?��σ���IEND�B`�� "�?�?@�?P‡�������j�
��8z_)i�<���U#݌�#�O�k�1�c췋��wR�4~�ƙR6)�d�삟yǟRy8c9���c���1��5%��D�/�mo���s}Gxh#V���lx��d�X�|F��t#�]�l��0�EKghlJ�?���4iNۅm�^x�����&U�� Ixn:������ږ�Is�e��?��σ���IEND�B`�j
"� "�?�?@�?P‡�������j�
TT� �PNG

IHDRTT� ���IDATx�Y��U݁�T��d���GP�|!99F������]�

`)��k�`fᙇ����^V#��R?M~ )� X�� j��3��#O^���2�1 ��1�l<Ǖ,��:��|�m�Y�w�P�[�98��|�}����t�r�GФ��+3
E���T8���e�G:���`k\Sh>KCJU��:��,y�!�B��db%BX�,T
!LAZ�!?I2��$7$_x�Ą��I��-;8�`��% ~���ƒ��Fw���yɱu8�$�3�|^�" _9���_��k8J��y#~��I�1#�������m���0}0�Nwa3�/�$O+����<u��m�t
��8z_)i�<���U#݌�#�O�k�1�c췋��wR�4~�ƙR6)�d�삟yǟRy8c9���c���1��5%��D�/�mo���s}Gxh#V���lx��d�X�|F��t#�]�l��0�EKghlJ�?���4iNۅm�^x�����&U�� Ixn:������ږ�Is�e��?��σ���IEND�B`�� "�?�?@�?P‡�������j�
��8z_)i�<���U#݌�#�O�k�1�c췋��wR�4~�ƙR6)�d�삟yǟRy8c9���c���1��5%��D�/�mo���s}Gxh#V���lx��d�X�|F��t#�]�l��0�EKghlJ�?���4iNۅm�^x�����&U�� Ixn:������ږ�Is�e��?��σ���IEND�B`�j
"� "�?�?@�?P‡�������j�
TT� �PNG

IHDRTT� ���IDATx�Y��U݁�T��d���GP�|!99F������]�

`)��k�`fᙇ����^V#��R?M~ )� X�� j��3��#O^���2�1 ��1�l<Ǖ,��:��|�m�Y�w�P�[�98��|�}����t�r�GФ��+3
E���T8���e�G:���`k\Sh>KCJU��:��,y�!�B��db%BX�,T
!LAZ�!?I2��$7$_x�Ą��I��-;8�`��% ~���ƒ��Fw���yɱu8�$�3�|^�" _9���_��k8J��y#~��I�1#�������m���0}0�Nwa3�/�$O+����<u��m�t
��8z_)i�<���U#݌�#�O�k�1�c췋��wR�4~�ƙR6)�d�삟yǟRy8c9���c���1��5%��D�/�mo���s}Gxh#V���lx��d�X�|F��t#�]�l��0�EKghlJ�?���4iNۅm�^x�����&U�� Ixn:������ږ�Is�e��?��σ���IEND�B`�� "�?�?�?P‡�������j�
��8z_)i�<���U#݌�#�O�k�1�c췋��wR�4~�ƙR6)�d�삟yǟRy8c9���c���1��5%��D�/�mo���s}Gxh#V���lx��d�X�|F��t#�]�l��0�EKghlJ�?���4iNۅm�^x�����&U�� Ixn:������ږ�Is�e��?��σ���IEND�B`�j
"� "�?�?�?P‡�������j�
Aq9��Pd�#�6V_x�b��DŽ�t��]:H��[��R~��� LǓ�F/i˖���Cyg>�e/��bš>��x����-����$�gFAU�,�hԛ���vwb�`�����^���}2�,����Na؈���¨�cO?rB��m_�(8j`�;T:ļ]�ϼ�:D���3�mh�b�س ��;�����鸧;��PW�(R���p-R����픥>7wN�m�� .�o�R�"���Ψ�72� [����l� �S����g�'i"�i���� /�66:�d�(˜d�ce#�vQ���{�U7�����Y��"��]�>���IEND�B`�� "�?�?�?P‡�������j�
Aq9��Pd�#�6V_x�b��DŽ�t��]:H��[��R~��� LǓ�F/i˖���Cyg>�e/��bš>��x����-����$�gFAU�,�hԛ���vwb�`�����^���}2�,����Na؈���¨�cO?rB��m_�(8j`�;T:ļ]�ϼ�:D���3�mh�b�س ��;�����鸧;��PW�(R���p-R����픥>7wN�m�� .�o�R�"���Ψ�72� [����l� �S����g�'i"�i���� /�66:�d�(˜d�ce#�vQ���{�U7�����Y��"��]�>���IEND�B`�j
"� "�?�?�?P‡�������j�
Aq9��Pd�#�6V_x�b��DŽ�t��]:H��[��R~��� LǓ�F/i˖���Cyg>�e/��bš>��x����-����$�gFAU�,�hԛ���vwb�`�����^���}2�,����Na؈���¨�cO?rB��m_�(8j`�;T:ļ]�ϼ�:D���3�mh�b�س ��;�����鸧;��PW�(R���p-R����픥>7wN�m�� .�o�R�"���Ψ�72� [����l� �S����g�'i"�i���� /�66:�d�(˜d�ce#�vQ���{�U7�����Y��"��]�>���IEND�B`�� "�?�?�?P‡�������j�
Aq9��Pd�#�6V_x�b��DŽ�t��]:H��[��R~��� LǓ�F/i˖���Cyg>�e/��bš>��x����-����$�gFAU�,�hԛ���vwb�`�����^���}2�,����Na؈���¨�cO?rB��m_�(8j`�;T:ļ]�ϼ�:D���3�mh�b�س ��;�����鸧;��PW�(R���p-R����픥>7wN�m�� .�o�R�"���Ψ�72� [����l� �S����g�'i"�i���� /�66:�d�(˜d�ce#�vQ���{�U7�����Y��"��]�>���IEND�B`�j
"� "�?�?�?P‡�������j�
Aq9��Pd�#�6V_x�b��DŽ�t��]:H��[��R~��� LǓ�F/i˖���Cyg>�e/��bš>��x����-����$�gFAU�,�hԛ���vwb�`�����^���}2�,����Na؈���¨�cO?rB��m_�(8j`�;T:ļ]�ϼ�:D���3�mh�b�س ��;�����鸧;��PW�(R���p-R����픥>7wN�m�� .�o�R�"���Ψ�72� [����l� �S����g�'i"�i���� /�66:�d�(˜d�ce#�vQ���{�U7�����Y��"��]�>���IEND�B`�� "�?�?�?P‡�������j�
Aq9��Pd�#�6V_x�b��DŽ�t��]:H��[��R~��� LǓ�F/i˖���Cyg>�e/��bš>��x����-����$�gFAU�,�hԛ���vwb�`�����^���}2�,����Na؈���¨�cO?rB��m_�(8j`�;T:ļ]�ϼ�:D���3�mh�b�س ��;�����鸧;��PW�(R���p-R����픥>7wN�m�� .�o�R�"���Ψ�72� [����l� �S����g�'i"�i���� /�66:�d�(˜d�ce#�vQ���{�U7�����Y��"��]�>���IEND�B`�j
"� "�?�?�?P‡�������j�
Aq9��Pd�#�6V_x�b��DŽ�t��]:H��[��R~��� LǓ�F/i˖���Cyg>�e/��bš>��x����-����$�gFAU�,�hԛ���vwb�`�����^���}2�,����Na؈���¨�cO?rB��m_�(8j`�;T:ļ]�ϼ�:D���3�mh�b�س ��;�����鸧;��PW�(R���p-R����픥>7wN�m�� .�o�R�"���Ψ�72� [����l� �S����g�'i"�i���� /�66:�d�(˜d�ce#�vQ���{�U7�����Y��"��]�>���IEND�B`�� "�?�?�?P‡�������j�
Aq9��Pd�#�6V_x�b��DŽ�t��]:H��[��R~��� LǓ�F/i˖���Cyg>�e/��bš>��x����-����$�gFAU�,�hԛ���vwb�`�����^���}2�,����Na؈���¨�cO?rB��m_�(8j`�;T:ļ]�ϼ�:D���3�mh�b�س ��;�����鸧;��PW�(R���p-R����픥>7wN�m�� .�o�R�"���Ψ�72� [����l� �S����g�'i"�i���� /�66:�d�(˜d�ce#�vQ���{�U7�����Y��"��]�>���IEND�B`�j
"� "�?�?�?P‡�������j�
Aq9��Pd�#�6V_x�b��DŽ�t��]:H��[��R~��� LǓ�F/i˖���Cyg>�e/��bš>��x����-����$�gFAU�,�hԛ���vwb�`�����^���}2�,����Na؈���¨�cO?rB��m_�(8j`�;T:ļ]�ϼ�:D���3�mh�b�س ��;�����鸧;��PW�(R���p-R����픥>7wN�m�� .�o�R�"���Ψ�72� [����l� �S����g�'i"�i���� /�66:�d�(˜d�ce#�vQ���{�U7�����Y��"��]�>���IEND�B`��"@P‡�������j�
Aq9��Pd�#�6V_x�b��DŽ�t��]:H��[��R~��� LǓ�F/i˖���Cyg>�e/��bš>��x����-����$�gFAU�,�hԛ���vwb�`�����^���}2�,����Na؈���¨�cO?rB��m_�(8j`�;T:ļ]�ϼ�:D���3�mh�b�س ��;�����鸧;��PW�(R���p-R����픥>7wN�m�� .�o�R�"���Ψ�72� [����l� �S����g�'i"�i���� /�66:�d�(˜d�ce#�vQ���{�U7�����Y��"��]�>���IEND�B`�j
"�"@P‡�������j�
TT��PNG

IHDRTT� ���IDATx�Z�nE�I��bG�+BA)�&���y�#$x�9'`��H�8ή����P�S�U��3;��ǑfF#w�|����q���Ά�\j�X�X�Pw��q�؁q�����q�ǝ`Ʊএ�8������p���~�q�؁q����m?��8���8������~�c�?�'��I\��������* қ����M�Z$k�TPI�2Z�kQ����^���#�_�n�^q��F?�}�������u6W�����/fEq

8������<���-,�G��������P[��!ѐC��m�(�s�l�A�Z�ٙ'����s^;�lD{rt
�l>�y<���+���~�n��h����ZPB ���h���X��i'�ݸ�^}�a��7n�_�Ώ�7�a��ڽFP�hd$�HLX1!������f�@сs����ӗ7�߄�O�9�x�ލ=���f��Rl���PFFL-E@���X���|2X'(=+��ك��W=�hi����(F�4K�ӈ�����)�L�*#�����l�%~��*~إՈ//E�����Q|Д$LwR�������M���:4!�i)ђ�W��XF��,E@�E(^,��Ym�}]1��%���*��N6��(��o��b�ġR����w&���d�j�35X�Q[���W`B҂
C�v����~$^�Y��J��)�;�(x�#[`k{]��C���i V�4�:���+�[�H!z��[��KaLI>,�U�La��ڄQp_n�����|�p�$��2qBeW���0��M_Ď(Lu�� \/K��A�KYe,9��ҁ$Rk��2ӵ#1�b���M[�����C��UX�� J-5HG�Q�w��l=��C�Kv�E:$�["�b��v 2q�Ł�j�tFJ�c�|h�xb�X�:j���j?�b���#����*��Z�(PT������������I+F�ߴ���� °ځ�tB9����y����&Z��I�ʅK#A��Sa�V:�(U�`(�H ^�Z�����ʀ�v��Xх'v԰v6�wS��HN$U�/��{$�u�� /p�!�uBZ�c�F�j�����z� O<��t�z�6���a`��3�I�gL���^�_��w��Ɖ�v���3"W���r�D:���8�)��a/���� �8B�vƦ�It��) :b�u� Uu��}��}`�Z�o�n�.U�j�ϼqu��/�@��6#�F��x� �K�v���aL3�qR]�I� �„p�w���Y�������#�_c#�ⵕ  |���daG{��M#\�Z���eUZ�e���j��z�S� ϱZ֚\g`��U�Ɉ��8ӋR����:���V]!d�(N#��?��˙$�%JIEND�B`��"@P‡�������j�
C�v����~$^�Y��J��)�;�(x�#[`k{]��C���i V�4�:���+�[�H!z��[��KaLI>,�U�La��ڄQp_n�����|�p�$��2qBeW���0��M_Ď(Lu�� \/K��A�KYe,9��ҁ$Rk��2ӵ#1�b���M[�����C��UX�� J-5HG�Q�w��l=��C�Kv�E:$�["�b��v 2q�Ł�j�tFJ�c�|h�xb�X�:j���j?�b���#����*��Z�(PT������������I+F�ߴ���� °ځ�tB9����y����&Z��I�ʅK#A��Sa�V:�(U�`(�H ^�Z�����ʀ�v��Xх'v԰v6�wS��HN$U�/��{$�u�� /p�!�uBZ�c�F�j�����z� O<��t�z�6���a`��3�I�gL���^�_��w��Ɖ�v���3"W���r�D:���8�)��a/���� �8B�vƦ�It��) :b�u� Uu��}��}`�Z�o�n�.U�j�ϼqu��/�@��6#�F��x� �K�v���aL3�qR]�I� �„p�w���Y�������#�_c#�ⵕ  |���daG{��M#\�Z���eUZ�e���j��z�S� ϱZ֚\g`��U�Ɉ��8ӋR����:���V]!d�(N#��?��˙$�%JIEND�B`�j
"�"@P‡�������j�
TT��PNG

IHDRTT� ���IDATx�Z�nE�I��bG�+BA)�&���y�#$x�9'`��H�8ή����P�S�U��3;��ǑfF#w�|����q���Ά�\j�X�X�Pw��q�؁q�����q�ǝ`Ʊএ�8������p���~�q�؁q����m?��8���8������~�c�?�'��I\��������* қ����M�Z$k�TPI�2Z�kQ����^���#�_�n�^q��F?�}�������u6W�����/fEq

8������<���-,�G��������P[��!ѐC��m�(�s�l�A�Z�ٙ'����s^;�lD{rt
�l>�y<���+���~�n��h����ZPB ���h���X��i'�ݸ�^}�a��7n�_�Ώ�7�a��ڽFP�hd$�HLX1!������f�@сs����ӗ7�߄�O�9�x�ލ=���f��Rl���PFFL-E@���X���|2X'(=+��ك��W=�hi����(F�4K�ӈ�����)�L�*#�����l�%~��*~إՈ//E�����Q|Д$LwR�������M���:4!�i)ђ�W��XF��,E@�E(^,��Ym�}]1��%���*��N6��(��o��b�ġR����w&���d�j�35X�Q[���W`B҂
C�v����~$^�Y��J��)�;�(x�#[`k{]��C���i V�4�:���+�[�H!z��[��KaLI>,�U�La��ڄQp_n�����|�p�$��2qBeW���0��M_Ď(Lu�� \/K��A�KYe,9��ҁ$Rk��2ӵ#1�b���M[�����C��UX�� J-5HG�Q�w��l=��C�Kv�E:$�["�b��v 2q�Ł�j�tFJ�c�|h�xb�X�:j���j?�b���#����*��Z�(PT������������I+F�ߴ���� °ځ�tB9����y����&Z��I�ʅK#A��Sa�V:�(U�`(�H ^�Z�����ʀ�v��Xх'v԰v6�wS��HN$U�/��{$�u�� /p�!�uBZ�c�F�j�����z� O<��t�z�6���a`��3�I�gL���^�_��w��Ɖ�v���3"W���r�D:���8�)��a/���� �8B�vƦ�It��) :b�u� Uu��}��}`�Z�o�n�.U�j�ϼqu��/�@��6#�F��x� �K�v���aL3�qR]�I� �„p�w���Y�������#�_c#�ⵕ  |���daG{��M#\�Z���eUZ�e���j��z�S� ϱZ֚\g`��U�Ɉ��8ӋR����:���V]!d�(N#��?��˙$�%JIEND�B`��"@P‡�������j�
C�v����~$^�Y��J��)�;�(x�#[`k{]��C���i V�4�:���+�[�H!z��[��KaLI>,�U�La��ڄQp_n�����|�p�$��2qBeW���0��M_Ď(Lu�� \/K��A�KYe,9��ҁ$Rk��2ӵ#1�b���M[�����C��UX�� J-5HG�Q�w��l=��C�Kv�E:$�["�b��v 2q�Ł�j�tFJ�c�|h�xb�X�:j���j?�b���#����*��Z�(PT������������I+F�ߴ���� °ځ�tB9����y����&Z��I�ʅK#A��Sa�V:�(U�`(�H ^�Z�����ʀ�v��Xх'v԰v6�wS��HN$U�/��{$�u�� /p�!�uBZ�c�F�j�����z� O<��t�z�6���a`��3�I�gL���^�_��w��Ɖ�v���3"W���r�D:���8�)��a/���� �8B�vƦ�It��) :b�u� Uu��}��}`�Z�o�n�.U�j�ϼqu��/�@��6#�F��x� �K�v���aL3�qR]�I� �„p�w���Y�������#�_c#�ⵕ  |���daG{��M#\�Z���eUZ�e���j��z�S� ϱZ֚\g`��U�Ɉ��8ӋR����:���V]!d�(N#��?��˙$�%JIEND�B`�j
"�"@P‡�������j�
TT��PNG

IHDRTT� ���IDATx�Z�nE�I��bG�+BA)�&���y�#$x�9'`��H�8ή����P�S�U��3;��ǑfF#w�|����q���Ά�\j�X�X�Pw��q�؁q�����q�ǝ`Ʊএ�8������p���~�q�؁q����m?��8���8������~�c�?�'��I\��������* қ����M�Z$k�TPI�2Z�kQ����^���#�_�n�^q��F?�}�������u6W�����/fEq

8������<���-,�G��������P[��!ѐC��m�(�s�l�A�Z�ٙ'����s^;�lD{rt
�l>�y<���+���~�n��h����ZPB ���h���X��i'�ݸ�^}�a��7n�_�Ώ�7�a��ڽFP�hd$�HLX1!������f�@сs����ӗ7�߄�O�9�x�ލ=���f��Rl���PFFL-E@���X���|2X'(=+��ك��W=�hi����(F�4K�ӈ�����)�L�*#�����l�%~��*~إՈ//E�����Q|Д$LwR�������M���:4!�i)ђ�W��XF��,E@�E(^,��Ym�}]1��%���*��N6��(��o��b�ġR����w&���d�j�35X�Q[���W`B҂
C�v����~$^�Y��J��)�;�(x�#[`k{]��C���i V�4�:���+�[�H!z��[��KaLI>,�U�La��ڄQp_n�����|�p�$��2qBeW���0��M_Ď(Lu�� \/K��A�KYe,9��ҁ$Rk��2ӵ#1�b���M[�����C��UX�� J-5HG�Q�w��l=��C�Kv�E:$�["�b��v 2q�Ł�j�tFJ�c�|h�xb�X�:j���j?�b���#����*��Z�(PT������������I+F�ߴ���� °ځ�tB9����y����&Z��I�ʅK#A��Sa�V:�(U�`(�H ^�Z�����ʀ�v��Xх'v԰v6�wS��HN$U�/��{$�u�� /p�!�uBZ�c�F�j�����z� O<��t�z�6���a`��3�I�gL���^�_��w��Ɖ�v���3"W���r�D:���8�)��a/���� �8B�vƦ�It��) :b�u� Uu��}��}`�Z�o�n�.U�j�ϼqu��/�@��6#�F��x� �K�v���aL3�qR]�I� �„p�w���Y�������#�_c#�ⵕ  |���daG{��M#\�Z���eUZ�e���j��z�S� ϱZ֚\g`��U�Ɉ��8ӋR����:���V]!d�(N#��?��˙$�%JIEND�B`��"@P‡�������j�
C�v����~$^�Y��J��)�;�(x�#[`k{]��C���i V�4�:���+�[�H!z��[��KaLI>,�U�La��ڄQp_n�����|�p�$��2qBeW���0��M_Ď(Lu�� \/K��A�KYe,9��ҁ$Rk��2ӵ#1�b���M[�����C��UX�� J-5HG�Q�w��l=��C�Kv�E:$�["�b��v 2q�Ł�j�tFJ�c�|h�xb�X�:j���j?�b���#����*��Z�(PT������������I+F�ߴ���� °ځ�tB9����y����&Z��I�ʅK#A��Sa�V:�(U�`(�H ^�Z�����ʀ�v��Xх'v԰v6�wS��HN$U�/��{$�u�� /p�!�uBZ�c�F�j�����z� O<��t�z�6���a`��3�I�gL���^�_��w��Ɖ�v���3"W���r�D:���8�)��a/���� �8B�vƦ�It��) :b�u� Uu��}��}`�Z�o�n�.U�j�ϼqu��/�@��6#�F��x� �K�v���aL3�qR]�I� �„p�w���Y�������#�_c#�ⵕ  |���daG{��M#\�Z���eUZ�e���j��z�S� ϱZ֚\g`��U�Ɉ��8ӋR����:���V]!d�(N#��?��˙$�%JIEND�B`�j
"�"@P‡�������j�
TT��PNG

IHDRTT� ���IDATx�Z�nE�I��bG�+BA)�&���y�#$x�9'`��H�8ή����P�S�U��3;��ǑfF#w�|����q���Ά�\j�X�X�Pw��q�؁q�����q�ǝ`Ʊএ�8������p���~�q�؁q����m?��8���8������~�c�?�'��I\��������* қ����M�Z$k�TPI�2Z�kQ����^���#�_�n�^q��F?�}�������u6W�����/fEq

8������<���-,�G��������P[��!ѐC��m�(�s�l�A�Z�ٙ'����s^;�lD{rt
�l>�y<���+���~�n��h����ZPB ���h���X��i'�ݸ�^}�a��7n�_�Ώ�7�a��ڽFP�hd$�HLX1!������f�@сs����ӗ7�߄�O�9�x�ލ=���f��Rl���PFFL-E@���X���|2X'(=+��ك��W=�hi����(F�4K�ӈ�����)�L�*#�����l�%~��*~إՈ//E�����Q|Д$LwR�������M���:4!�i)ђ�W��XF��,E@�E(^,��Ym�}]1��%���*��N6��(��o��b�ġR����w&���d�j�35X�Q[���W`B҂
C�v����~$^�Y��J��)�;�(x�#[`k{]��C���i V�4�:���+�[�H!z��[��KaLI>,�U�La��ڄQp_n�����|�p�$��2qBeW���0��M_Ď(Lu�� \/K��A�KYe,9��ҁ$Rk��2ӵ#1�b���M[�����C��UX�� J-5HG�Q�w��l=��C�Kv�E:$�["�b��v 2q�Ł�j�tFJ�c�|h�xb�X�:j���j?�b���#����*��Z�(PT������������I+F�ߴ���� °ځ�tB9����y����&Z��I�ʅK#A��Sa�V:�(U�`(�H ^�Z�����ʀ�v��Xх'v԰v6�wS��HN$U�/��{$�u�� /p�!�uBZ�c�F�j�����z� O<��t�z�6���a`��3�I�gL���^�_��w��Ɖ�v���3"W���r�D:���8�)��a/���� �8B�vƦ�It��) :b�u� Uu��}��}`�Z�o�n�.U�j�ϼqu��/�@��6#�F��x� �K�v���aL3�qR]�I� �„p�w���Y�������#�_c#�ⵕ  |���daG{��M#\�Z���eUZ�e���j��z�S� ϱZ֚\g`��U�Ɉ��8ӋR����:���V]!d�(N#��?��˙$�%JIEND�B`��"@P‡�������j�
C�v����~$^�Y��J��)�;�(x�#[`k{]��C���i V�4�:���+�[�H!z��[��KaLI>,�U�La��ڄQp_n�����|�p�$��2qBeW���0��M_Ď(Lu�� \/K��A�KYe,9��ҁ$Rk��2ӵ#1�b���M[�����C��UX�� J-5HG�Q�w��l=��C�Kv�E:$�["�b��v 2q�Ł�j�tFJ�c�|h�xb�X�:j���j?�b���#����*��Z�(PT������������I+F�ߴ���� °ځ�tB9����y����&Z��I�ʅK#A��Sa�V:�(U�`(�H ^�Z�����ʀ�v��Xх'v԰v6�wS��HN$U�/��{$�u�� /p�!�uBZ�c�F�j�����z� O<��t�z�6���a`��3�I�gL���^�_��w��Ɖ�v���3"W���r�D:���8�)��a/���� �8B�vƦ�It��) :b�u� Uu��}��}`�Z�o�n�.U�j�ϼqu��/�@��6#�F��x� �K�v���aL3�qR]�I� �„p�w���Y�������#�_c#�ⵕ  |���daG{��M#\�Z���eUZ�e���j��z�S� ϱZ֚\g`��U�Ɉ��8ӋR����:���V]!d�(N#��?��˙$�%JIEND�B`�j
"�"@P‡�������j�
TT��PNG

IHDRTT� ���IDATx�Z�nE�I��bG�+BA)�&���y�#$x�9'`��H�8ή����P�S�U��3;��ǑfF#w�|����q���Ά�\j�X�X�Pw��q�؁q�����q�ǝ`Ʊএ�8������p���~�q�؁q����m?��8���8������~�c�?�'��I\��������* қ����M�Z$k�TPI�2Z�kQ����^���#�_�n�^q��F?�}�������u6W�����/fEq

8������<���-,�G��������P[��!ѐC��m�(�s�l�A�Z�ٙ'����s^;�lD{rt
�l>�y<���+���~�n��h����ZPB ���h���X��i'�ݸ�^}�a��7n�_�Ώ�7�a��ڽFP�hd$�HLX1!������f�@сs����ӗ7�߄�O�9�x�ލ=���f��Rl���PFFL-E@���X���|2X'(=+��ك��W=�hi����(F�4K�ӈ�����)�L�*#�����l�%~��*~إՈ//E�����Q|Д$LwR�������M���:4!�i)ђ�W��XF��,E@�E(^,��Ym�}]1��%���*��N6��(��o��b�ġR����w&���d�j�35X�Q[���W`B҂
C�v����~$^�Y��J��)�;�(x�#[`k{]��C���i V�4�:���+�[�H!z��[��KaLI>,�U�La��ڄQp_n�����|�p�$��2qBeW���0��M_Ď(Lu�� \/K��A�KYe,9��ҁ$Rk��2ӵ#1�b���M[�����C��UX�� J-5HG�Q�w��l=��C�Kv�E:$�["�b��v 2q�Ł�j�tFJ�c�|h�xb�X�:j���j?�b���#����*��Z�(PT������������I+F�ߴ���� °ځ�tB9����y����&Z��I�ʅK#A��Sa�V:�(U�`(�H ^�Z�����ʀ�v��Xх'v԰v6�wS��HN$U�/��{$�u�� /p�!�uBZ�c�F�j�����z� O<��t�z�6���a`��3�I�gL���^�_��w��Ɖ�v���3"W���r�D:���8�)��a/���� �8B�vƦ�It��) :b�u� Uu��}��}`�Z�o�n�.U�j�ϼqu��/�@��6#�F��x� �K�v���aL3�qR]�I� �„p�w���Y�������#�_c#�ⵕ  |���daG{��M#\�Z���eUZ�e���j��z�S� ϱZ֚\g`��U�Ɉ��8ӋR����:���V]!d�(N#��?��˙$�%JIEND�B`��"@P‡�������j�
C�v����~$^�Y��J��)�;�(x�#[`k{]��C���i V�4�:���+�[�H!z��[��KaLI>,�U�La��ڄQp_n�����|�p�$��2qBeW���0��M_Ď(Lu�� \/K��A�KYe,9��ҁ$Rk��2ӵ#1�b���M[�����C��UX�� J-5HG�Q�w��l=��C�Kv�E:$�["�b��v 2q�Ł�j�tFJ�c�|h�xb�X�:j���j?�b���#����*��Z�(PT������������I+F�ߴ���� °ځ�tB9����y����&Z��I�ʅK#A��Sa�V:�(U�`(�H ^�Z�����ʀ�v��Xх'v԰v6�wS��HN$U�/��{$�u�� /p�!�uBZ�c�F�j�����z� O<��t�z�6���a`��3�I�gL���^�_��w��Ɖ�v���3"W���r�D:���8�)��a/���� �8B�vƦ�It��) :b�u� Uu��}��}`�Z�o�n�.U�j�ϼqu��/�@��6#�F��x� �K�v���aL3�qR]�I� �„p�w���Y�������#�_c#�ⵕ  |���daG{��M#\�Z���eUZ�e���j��z�S� ϱZ֚\g`��U�Ɉ��8ӋR����:���V]!d�(N#��?��˙$�%JIEND�B`�j
"�"@P‡�������j�
TT��PNG

IHDRTT� ���IDATx�ZK�E�%��ټ �\,ʕK�q��=?q������ʕ�P�8�1+���;�;TuWuU�􌽎c��L��z|_���=�d�ٗ_e]���j��w�|WW�_�~�;8�~�wp�]����+�� �۾���x����}'�o�.z��۾���@��;���i�o�~�wp�������}����3����{<zx���7��$|�ɭ&���-͜����_?�c���eY?���-7�T����v ��m��/�8yx2=<�}���y�߻}�ȊrR��tyZU���j2�\�.o��p�?�e?�}����lA�b�,������<-�C��>}u�Q�T�f�yV��:���r>E?�f�,����&��t���W>}t����QSA�*ۍo�~����q {������q����?<��Gw���tAYg�}&A(g���Y�Aͬ�W͎<�91�3:�S^36j6&�

%
%�ԑu��>��^U�ʋ�R=��F�z꩔/ԏ�E%�n�"\��Ho ��Uy���-[��Q�RV�a}�1pQŞF�����(,��D� ��7zG�W���+8�O)�΍}qB���'� �Jȓ�������򫎣ի_âȡ�)�jnm2PV�=C�@�r �����o����uO�����]��� �[ �M�Q֠(w��ds���!:�I�A�3ρB��Bu&h:��2�!��qHwA��y�#�(t�Ӟc�j��٪PK#��<���@�� sT�EVohm� �'��{Ȥ�KW�5�Qo�·C�ȇ74�n�x<��3��/�F G�H]x�(U>� ���s��L�`i}�}\N����U~Ðz�Y)iD"I}"y �3������0�j�)���!x6V�d����&�:@ӂ��pnc���t��0!YBX���i����L���p����1~�`��<�y�,|���؇qW����W�N�g1��?=��܏q�I"o?e������}&�m�a"�I��b���H覚��l������f����3$s ��7p&H����j�P��ImWCw��"��$��Y��Y�D��'TԔ�60E>��{p��-�ݒ��K� � o^���.O�h���8;ou�<��}��Ρj0~��o�7`+N��5G_�ƴ�����A6:��Ԧ�V�Aj�.����m���N+��V�袩7�8��5[�
qF�% t^i(Dn�e'�N��՚���f�w!��^/#��wEj��k^{-v��,=�J�]nq�,�s; ��hp�9U���� L��6r�IB�l4X���Y4 �i��������
�)�/��ED$(DLIEND�B`��"@P‡�������j�
�)�/��ED$(DLIEND�B`�j
"�"@P‡�������j�
TT��PNG

IHDRTT� ���IDATx�ZK�E�%��ټ �\,ʕK�q��=?q������ʕ�P�8�1+���;�;TuWuU�􌽎c��L��z|_���=�d�ٗ_e]���j��w�|WW�_�~�;8�~�wp�]����+�� �۾���x����}'�o�.z��۾���@��;���i�o�~�wp�������}����3����{<zx���7��$|�ɭ&���-͜����_?�c���eY?���-7�T����v ��m��/�8yx2=<�}���y�߻}�ȊrR��tyZU���j2�\�.o��p�?�e?�}����lA�b�,������<-�C��>}u�Q�T�f�yV��:���r>E?�f�,����&��t���W>}t����QSA�*ۍo�~����q {������q����?<��Gw���tAYg�}&A(g���Y�Aͬ�W͎<�91�3:�S^36j6&�

%
%�ԑu��>��^U�ʋ�R=��F�z꩔/ԏ�E%�n�"\��Ho ��Uy���-[��Q�RV�a}�1pQŞF�����(,��D� ��7zG�W���+8�O)�΍}qB���'� �Jȓ�������򫎣ի_âȡ�)�jnm2PV�=C�@�r �����o����uO�����]��� �[ �M�Q֠(w��ds���!:�I�A�3ρB��Bu&h:��2�!��qHwA��y�#�(t�Ӟc�j��٪PK#��<���@�� sT�EVohm� �'��{Ȥ�KW�5�Qo�·C�ȇ74�n�x<��3��/�F G�H]x�(U>� ���s��L�`i}�}\N����U~Ðz�Y)iD"I}"y �3������0�j�)���!x6V�d����&�:@ӂ��pnc���t��0!YBX���i����L���p����1~�`��<�y�,|���؇qW����W�N�g1��?=��܏q�I"o?e������}&�m�a"�I��b���H覚��l������f����3$s ��7p&H����j�P��ImWCw��"��$��Y��Y�D��'TԔ�60E>��{p��-�ݒ��K� � o^���.O�h���8;ou�<��}��Ρj0~��o�7`+N��5G_�ƴ�����A6:��Ԧ�V�Aj�.����m���N+��V�袩7�8��5[�
qF�% t^i(Dn�e'�N��՚���f�w!��^/#��wEj��k^{-v��,=�J�]nq�,�s; ��hp�9U���� L��6r�IB�l4X���Y4 �i��������
�)�/��ED$(DLIEND�B`��"@P‡�������j�
�)�/��ED$(DLIEND�B`�j
"�"@P‡�������j�
TT��PNG

IHDRTT� ���IDATx�ZK�E�%��ټ �\,ʕK�q��=?q������ʕ�P�8�1+���;�;TuWuU�􌽎c��L��z|_���=�d�ٗ_e]���j��w�|WW�_�~�;8�~�wp�]����+�� �۾���x����}'�o�.z��۾���@��;���i�o�~�wp�������}����3����{<zx���7��$|�ɭ&���-͜����_?�c���eY?���-7�T����v ��m��/�8yx2=<�}���y�߻}�ȊrR��tyZU���j2�\�.o��p�?�e?�}����lA�b�,������<-�C��>}u�Q�T�f�yV��:���r>E?�f�,����&��t���W>}t����QSA�*ۍo�~����q {������q����?<��Gw���tAYg�}&A(g���Y�Aͬ�W͎<�91�3:�S^36j6&�

%
%�ԑu��>��^U�ʋ�R=��F�z꩔/ԏ�E%�n�"\��Ho ��Uy���-[��Q�RV�a}�1pQŞF�����(,��D� ��7zG�W���+8�O)�΍}qB���'� �Jȓ�������򫎣ի_âȡ�)�jnm2PV�=C�@�r �����o����uO�����]��� �[ �M�Q֠(w��ds���!:�I�A�3ρB��Bu&h:��2�!��qHwA��y�#�(t�Ӟc�j��٪PK#��<���@�� sT�EVohm� �'��{Ȥ�KW�5�Qo�·C�ȇ74�n�x<��3��/�F G�H]x�(U>� ���s��L�`i}�}\N����U~Ðz�Y)iD"I}"y �3������0�j�)���!x6V�d����&�:@ӂ��pnc���t��0!YBX���i����L���p����1~�`��<�y�,|���؇qW����W�N�g1��?=��܏q�I"o?e������}&�m�a"�I��b���H覚��l������f����3$s ��7p&H����j�P��ImWCw��"��$��Y��Y�D��'TԔ�60E>��{p��-�ݒ��K� � o^���.O�h���8;ou�<��}��Ρj0~��o�7`+N��5G_�ƴ�����A6:��Ԧ�V�Aj�.����m���N+��V�袩7�8��5[�
qF�% t^i(Dn�e'�N��՚���f�w!��^/#��wEj��k^{-v��,=�J�]nq�,�s; ��hp�9U���� L��6r�IB�l4X���Y4 �i��������
�)�/��ED$(DLIEND�B`�bcvis& 
�)�/��ED$(DLIEND�B`�j
"

6
protobuf-definitions/proto/mlagents/envs/communicator_objects/agent_info.proto


syntax = "proto3";
import "mlagents/envs/communicator_objects/compressed_observation.proto";
import "mlagents/envs/communicator_objects/observation.proto";
repeated float stacked_vector_observation = 1;
reserved 1; // deprecated repeated float stacked_vector_observation = 1;
reserved 2; // deprecated repeated bytes visual_observations = 2;
reserved 3; // deprecated string text_observation = 3;
repeated float stored_vector_actions = 4;

int32 id = 10;
repeated bool action_mask = 11;
reserved 12; // deprecated CustomObservationProto custom_observation = 12;
repeated CompressedObservationProto compressed_observations = 13;
repeated ObservationProto observations = 13;
}

4
protobuf-definitions/proto/mlagents/envs/communicator_objects/brain_parameters.proto


package communicator_objects;
message BrainParametersProto {
int32 vector_observation_size = 1;
int32 num_stacked_vector_observations = 2;
reserved 1; // deprecated int32 vector_observation_size = 1;
reserved 2; // deprecated int32 num_stacked_vector_observations = 2;
repeated int32 vector_action_size = 3;
reserved 4; // deprecated repeated ResolutionProto camera_resolutions
repeated string vector_action_descriptions = 5;

433
UnitySDK/Assets/ML-Agents/Scripts/Grpc/CommunicatorObjects/Observation.cs


// <auto-generated>
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: mlagents/envs/communicator_objects/observation.proto
// </auto-generated>
#pragma warning disable 1591, 0612, 3021
#region Designer generated code
using pb = global::Google.Protobuf;
using pbc = global::Google.Protobuf.Collections;
using pbr = global::Google.Protobuf.Reflection;
using scg = global::System.Collections.Generic;
namespace MLAgents.CommunicatorObjects {
/// <summary>Holder for reflection information generated from mlagents/envs/communicator_objects/observation.proto</summary>
public static partial class ObservationReflection {
#region Descriptor
/// <summary>File descriptor for mlagents/envs/communicator_objects/observation.proto</summary>
public static pbr::FileDescriptor Descriptor {
get { return descriptor; }
}
private static pbr::FileDescriptor descriptor;
static ObservationReflection() {
byte[] descriptorData = global::System.Convert.FromBase64String(
string.Concat(
"CjRtbGFnZW50cy9lbnZzL2NvbW11bmljYXRvcl9vYmplY3RzL29ic2VydmF0",
"aW9uLnByb3RvEhRjb21tdW5pY2F0b3Jfb2JqZWN0cyL5AQoQT2JzZXJ2YXRp",
"b25Qcm90bxINCgVzaGFwZRgBIAMoBRJEChBjb21wcmVzc2lvbl90eXBlGAIg",
"ASgOMiouY29tbXVuaWNhdG9yX29iamVjdHMuQ29tcHJlc3Npb25UeXBlUHJv",
"dG8SGQoPY29tcHJlc3NlZF9kYXRhGAMgASgMSAASRgoKZmxvYXRfZGF0YRgE",
"IAEoCzIwLmNvbW11bmljYXRvcl9vYmplY3RzLk9ic2VydmF0aW9uUHJvdG8u",
"RmxvYXREYXRhSAAaGQoJRmxvYXREYXRhEgwKBGRhdGEYASADKAJCEgoQb2Jz",
"ZXJ2YXRpb25fZGF0YSopChRDb21wcmVzc2lvblR5cGVQcm90bxIICgROT05F",
"EAASBwoDUE5HEAFCH6oCHE1MQWdlbnRzLkNvbW11bmljYXRvck9iamVjdHNi",
"BnByb3RvMw=="));
descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
new pbr::FileDescriptor[] { },
new pbr::GeneratedClrTypeInfo(new[] {typeof(global::MLAgents.CommunicatorObjects.CompressionTypeProto), }, new pbr::GeneratedClrTypeInfo[] {
new pbr::GeneratedClrTypeInfo(typeof(global::MLAgents.CommunicatorObjects.ObservationProto), global::MLAgents.CommunicatorObjects.ObservationProto.Parser, new[]{ "Shape", "CompressionType", "CompressedData", "FloatData" }, new[]{ "ObservationData" }, null, new pbr::GeneratedClrTypeInfo[] { new pbr::GeneratedClrTypeInfo(typeof(global::MLAgents.CommunicatorObjects.ObservationProto.Types.FloatData), global::MLAgents.CommunicatorObjects.ObservationProto.Types.FloatData.Parser, new[]{ "Data" }, null, null, null)})
}));
}
#endregion
}
#region Enums
public enum CompressionTypeProto {
[pbr::OriginalName("NONE")] None = 0,
[pbr::OriginalName("PNG")] Png = 1,
}
#endregion
#region Messages
public sealed partial class ObservationProto : pb::IMessage<ObservationProto> {
private static readonly pb::MessageParser<ObservationProto> _parser = new pb::MessageParser<ObservationProto>(() => new ObservationProto());
private pb::UnknownFieldSet _unknownFields;
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public static pb::MessageParser<ObservationProto> Parser { get { return _parser; } }
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public static pbr::MessageDescriptor Descriptor {
get { return global::MLAgents.CommunicatorObjects.ObservationReflection.Descriptor.MessageTypes[0]; }
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
pbr::MessageDescriptor pb::IMessage.Descriptor {
get { return Descriptor; }
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public ObservationProto() {
OnConstruction();
}
partial void OnConstruction();
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public ObservationProto(ObservationProto other) : this() {
shape_ = other.shape_.Clone();
compressionType_ = other.compressionType_;
switch (other.ObservationDataCase) {
case ObservationDataOneofCase.CompressedData:
CompressedData = other.CompressedData;
break;
case ObservationDataOneofCase.FloatData:
FloatData = other.FloatData.Clone();
break;
}
_unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public ObservationProto Clone() {
return new ObservationProto(this);
}
/// <summary>Field number for the "shape" field.</summary>
public const int ShapeFieldNumber = 1;
private static readonly pb::FieldCodec<int> _repeated_shape_codec
= pb::FieldCodec.ForInt32(10);
private readonly pbc::RepeatedField<int> shape_ = new pbc::RepeatedField<int>();
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public pbc::RepeatedField<int> Shape {
get { return shape_; }
}
/// <summary>Field number for the "compression_type" field.</summary>
public const int CompressionTypeFieldNumber = 2;
private global::MLAgents.CommunicatorObjects.CompressionTypeProto compressionType_ = 0;
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public global::MLAgents.CommunicatorObjects.CompressionTypeProto CompressionType {
get { return compressionType_; }
set {
compressionType_ = value;
}
}
/// <summary>Field number for the "compressed_data" field.</summary>
public const int CompressedDataFieldNumber = 3;
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public pb::ByteString CompressedData {
get { return observationDataCase_ == ObservationDataOneofCase.CompressedData ? (pb::ByteString) observationData_ : pb::ByteString.Empty; }
set {
observationData_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
observationDataCase_ = ObservationDataOneofCase.CompressedData;
}
}
/// <summary>Field number for the "float_data" field.</summary>
public const int FloatDataFieldNumber = 4;
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public global::MLAgents.CommunicatorObjects.ObservationProto.Types.FloatData FloatData {
get { return observationDataCase_ == ObservationDataOneofCase.FloatData ? (global::MLAgents.CommunicatorObjects.ObservationProto.Types.FloatData) observationData_ : null; }
set {
observationData_ = value;
observationDataCase_ = value == null ? ObservationDataOneofCase.None : ObservationDataOneofCase.FloatData;
}
}
private object observationData_;
/// <summary>Enum of possible cases for the "observation_data" oneof.</summary>
public enum ObservationDataOneofCase {
None = 0,
CompressedData = 3,
FloatData = 4,
}
private ObservationDataOneofCase observationDataCase_ = ObservationDataOneofCase.None;
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public ObservationDataOneofCase ObservationDataCase {
get { return observationDataCase_; }
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public void ClearObservationData() {
observationDataCase_ = ObservationDataOneofCase.None;
observationData_ = null;
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public override bool Equals(object other) {
return Equals(other as ObservationProto);
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public bool Equals(ObservationProto other) {
if (ReferenceEquals(other, null)) {
return false;
}
if (ReferenceEquals(other, this)) {
return true;
}
if(!shape_.Equals(other.shape_)) return false;
if (CompressionType != other.CompressionType) return false;
if (CompressedData != other.CompressedData) return false;
if (!object.Equals(FloatData, other.FloatData)) return false;
if (ObservationDataCase != other.ObservationDataCase) return false;
return Equals(_unknownFields, other._unknownFields);
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public override int GetHashCode() {
int hash = 1;
hash ^= shape_.GetHashCode();
if (CompressionType != 0) hash ^= CompressionType.GetHashCode();
if (observationDataCase_ == ObservationDataOneofCase.CompressedData) hash ^= CompressedData.GetHashCode();
if (observationDataCase_ == ObservationDataOneofCase.FloatData) hash ^= FloatData.GetHashCode();
hash ^= (int) observationDataCase_;
if (_unknownFields != null) {
hash ^= _unknownFields.GetHashCode();
}
return hash;
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public override string ToString() {
return pb::JsonFormatter.ToDiagnosticString(this);
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public void WriteTo(pb::CodedOutputStream output) {
shape_.WriteTo(output, _repeated_shape_codec);
if (CompressionType != 0) {
output.WriteRawTag(16);
output.WriteEnum((int) CompressionType);
}
if (observationDataCase_ == ObservationDataOneofCase.CompressedData) {
output.WriteRawTag(26);
output.WriteBytes(CompressedData);
}
if (observationDataCase_ == ObservationDataOneofCase.FloatData) {
output.WriteRawTag(34);
output.WriteMessage(FloatData);
}
if (_unknownFields != null) {
_unknownFields.WriteTo(output);
}
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public int CalculateSize() {
int size = 0;
size += shape_.CalculateSize(_repeated_shape_codec);
if (CompressionType != 0) {
size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) CompressionType);
}
if (observationDataCase_ == ObservationDataOneofCase.CompressedData) {
size += 1 + pb::CodedOutputStream.ComputeBytesSize(CompressedData);
}
if (observationDataCase_ == ObservationDataOneofCase.FloatData) {
size += 1 + pb::CodedOutputStream.ComputeMessageSize(FloatData);
}
if (_unknownFields != null) {
size += _unknownFields.CalculateSize();
}
return size;
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public void MergeFrom(ObservationProto other) {
if (other == null) {
return;
}
shape_.Add(other.shape_);
if (other.CompressionType != 0) {
CompressionType = other.CompressionType;
}
switch (other.ObservationDataCase) {
case ObservationDataOneofCase.CompressedData:
CompressedData = other.CompressedData;
break;
case ObservationDataOneofCase.FloatData:
if (FloatData == null) {
FloatData = new global::MLAgents.CommunicatorObjects.ObservationProto.Types.FloatData();
}
FloatData.MergeFrom(other.FloatData);
break;
}
_unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public void MergeFrom(pb::CodedInputStream input) {
uint tag;
while ((tag = input.ReadTag()) != 0) {
switch(tag) {
default:
_unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
break;
case 10:
case 8: {
shape_.AddEntriesFrom(input, _repeated_shape_codec);
break;
}
case 16: {
compressionType_ = (global::MLAgents.CommunicatorObjects.CompressionTypeProto) input.ReadEnum();
break;
}
case 26: {
CompressedData = input.ReadBytes();
break;
}
case 34: {
global::MLAgents.CommunicatorObjects.ObservationProto.Types.FloatData subBuilder = new global::MLAgents.CommunicatorObjects.ObservationProto.Types.FloatData();
if (observationDataCase_ == ObservationDataOneofCase.FloatData) {
subBuilder.MergeFrom(FloatData);
}
input.ReadMessage(subBuilder);
FloatData = subBuilder;
break;
}
}
}
}
#region Nested types
/// <summary>Container for nested types declared in the ObservationProto message type.</summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public static partial class Types {
public sealed partial class FloatData : pb::IMessage<FloatData> {
private static readonly pb::MessageParser<FloatData> _parser = new pb::MessageParser<FloatData>(() => new FloatData());
private pb::UnknownFieldSet _unknownFields;
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public static pb::MessageParser<FloatData> Parser { get { return _parser; } }
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public static pbr::MessageDescriptor Descriptor {
get { return global::MLAgents.CommunicatorObjects.ObservationProto.Descriptor.NestedTypes[0]; }
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
pbr::MessageDescriptor pb::IMessage.Descriptor {
get { return Descriptor; }
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public FloatData() {
OnConstruction();
}
partial void OnConstruction();
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public FloatData(FloatData other) : this() {
data_ = other.data_.Clone();
_unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public FloatData Clone() {
return new FloatData(this);
}
/// <summary>Field number for the "data" field.</summary>
public const int DataFieldNumber = 1;
private static readonly pb::FieldCodec<float> _repeated_data_codec
= pb::FieldCodec.ForFloat(10);
private readonly pbc::RepeatedField<float> data_ = new pbc::RepeatedField<float>();
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public pbc::RepeatedField<float> Data {
get { return data_; }
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public override bool Equals(object other) {
return Equals(other as FloatData);
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public bool Equals(FloatData other) {
if (ReferenceEquals(other, null)) {
return false;
}
if (ReferenceEquals(other, this)) {
return true;
}
if(!data_.Equals(other.data_)) return false;
return Equals(_unknownFields, other._unknownFields);
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public override int GetHashCode() {
int hash = 1;
hash ^= data_.GetHashCode();
if (_unknownFields != null) {
hash ^= _unknownFields.GetHashCode();
}
return hash;
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public override string ToString() {
return pb::JsonFormatter.ToDiagnosticString(this);
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public void WriteTo(pb::CodedOutputStream output) {
data_.WriteTo(output, _repeated_data_codec);
if (_unknownFields != null) {
_unknownFields.WriteTo(output);
}
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public int CalculateSize() {
int size = 0;
size += data_.CalculateSize(_repeated_data_codec);
if (_unknownFields != null) {
size += _unknownFields.CalculateSize();
}
return size;
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public void MergeFrom(FloatData other) {
if (other == null) {
return;
}
data_.Add(other.data_);
_unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public void MergeFrom(pb::CodedInputStream input) {
uint tag;
while ((tag = input.ReadTag()) != 0) {
switch(tag) {
default:
_unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
break;
case 10:
case 13: {
data_.AddEntriesFrom(input, _repeated_data_codec);
break;
}
}
}
}
}
}
#endregion
}
#endregion
}
#endregion Designer generated code

29
UnitySDK/Assets/ML-Agents/Scripts/Sensor/Observation.cs


using System;
using UnityEngine;
namespace MLAgents.Sensor
{
public struct Observation
{
/// <summary>
/// The compressed sensor data. Assumed to be non-null if CompressionType != CompressionType.None
/// </summary>
public byte[] CompressedData;
/// <summary>
/// Uncompressed sensor data. Assumed to be non-empty if CompressionType == CompressionType.None
/// </summary>
public ArraySegment<float> FloatData;
/// <summary>
/// The format of the compressed data
/// </summary>
public SensorCompressionType CompressionType;
/// <summary>
/// The uncompressed dimensions of the data.
/// E.g. for RGB visual observations, this will be {Width, Height, 3}
/// </summary>
public int[] Shape;
}
}

169
ml-agents-envs/mlagents/envs/communicator_objects/observation_pb2.py


# Generated by the protocol buffer compiler. DO NOT EDIT!
# source: mlagents/envs/communicator_objects/observation.proto
import sys
_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1'))
from google.protobuf.internal import enum_type_wrapper
from google.protobuf import descriptor as _descriptor
from google.protobuf import message as _message
from google.protobuf import reflection as _reflection
from google.protobuf import symbol_database as _symbol_database
from google.protobuf import descriptor_pb2
# @@protoc_insertion_point(imports)
_sym_db = _symbol_database.Default()
DESCRIPTOR = _descriptor.FileDescriptor(
name='mlagents/envs/communicator_objects/observation.proto',
package='communicator_objects',
syntax='proto3',
serialized_pb=_b('\n4mlagents/envs/communicator_objects/observation.proto\x12\x14\x63ommunicator_objects\"\xf9\x01\n\x10ObservationProto\x12\r\n\x05shape\x18\x01 \x03(\x05\x12\x44\n\x10\x63ompression_type\x18\x02 \x01(\x0e\x32*.communicator_objects.CompressionTypeProto\x12\x19\n\x0f\x63ompressed_data\x18\x03 \x01(\x0cH\x00\x12\x46\n\nfloat_data\x18\x04 \x01(\x0b\x32\x30.communicator_objects.ObservationProto.FloatDataH\x00\x1a\x19\n\tFloatData\x12\x0c\n\x04\x64\x61ta\x18\x01 \x03(\x02\x42\x12\n\x10observation_data*)\n\x14\x43ompressionTypeProto\x12\x08\n\x04NONE\x10\x00\x12\x07\n\x03PNG\x10\x01\x42\x1f\xaa\x02\x1cMLAgents.CommunicatorObjectsb\x06proto3')
)
_COMPRESSIONTYPEPROTO = _descriptor.EnumDescriptor(
name='CompressionTypeProto',
full_name='communicator_objects.CompressionTypeProto',
filename=None,
file=DESCRIPTOR,
values=[
_descriptor.EnumValueDescriptor(
name='NONE', index=0, number=0,
options=None,
type=None),
_descriptor.EnumValueDescriptor(
name='PNG', index=1, number=1,
options=None,
type=None),
],
containing_type=None,
options=None,
serialized_start=330,
serialized_end=371,
)
_sym_db.RegisterEnumDescriptor(_COMPRESSIONTYPEPROTO)
CompressionTypeProto = enum_type_wrapper.EnumTypeWrapper(_COMPRESSIONTYPEPROTO)
NONE = 0
PNG = 1
_OBSERVATIONPROTO_FLOATDATA = _descriptor.Descriptor(
name='FloatData',
full_name='communicator_objects.ObservationProto.FloatData',
filename=None,
file=DESCRIPTOR,
containing_type=None,
fields=[
_descriptor.FieldDescriptor(
name='data', full_name='communicator_objects.ObservationProto.FloatData.data', index=0,
number=1, type=2, cpp_type=6, label=3,
has_default_value=False, default_value=[],
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None, file=DESCRIPTOR),
],
extensions=[
],
nested_types=[],
enum_types=[
],
options=None,
is_extendable=False,
syntax='proto3',
extension_ranges=[],
oneofs=[
],
serialized_start=283,
serialized_end=308,
)
_OBSERVATIONPROTO = _descriptor.Descriptor(
name='ObservationProto',
full_name='communicator_objects.ObservationProto',
filename=None,
file=DESCRIPTOR,
containing_type=None,
fields=[
_descriptor.FieldDescriptor(
name='shape', full_name='communicator_objects.ObservationProto.shape', index=0,
number=1, type=5, cpp_type=1, label=3,
has_default_value=False, default_value=[],
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None, file=DESCRIPTOR),
_descriptor.FieldDescriptor(
name='compression_type', full_name='communicator_objects.ObservationProto.compression_type', index=1,
number=2, type=14, cpp_type=8, label=1,
has_default_value=False, default_value=0,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None, file=DESCRIPTOR),
_descriptor.FieldDescriptor(
name='compressed_data', full_name='communicator_objects.ObservationProto.compressed_data', index=2,
number=3, type=12, cpp_type=9, label=1,
has_default_value=False, default_value=_b(""),
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None, file=DESCRIPTOR),
_descriptor.FieldDescriptor(
name='float_data', full_name='communicator_objects.ObservationProto.float_data', index=3,
number=4, type=11, cpp_type=10, label=1,
has_default_value=False, default_value=None,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None, file=DESCRIPTOR),
],
extensions=[
],
nested_types=[_OBSERVATIONPROTO_FLOATDATA, ],
enum_types=[
],
options=None,
is_extendable=False,
syntax='proto3',
extension_ranges=[],
oneofs=[
_descriptor.OneofDescriptor(
name='observation_data', full_name='communicator_objects.ObservationProto.observation_data',
index=0, containing_type=None, fields=[]),
],
serialized_start=79,
serialized_end=328,
)
_OBSERVATIONPROTO_FLOATDATA.containing_type = _OBSERVATIONPROTO
_OBSERVATIONPROTO.fields_by_name['compression_type'].enum_type = _COMPRESSIONTYPEPROTO
_OBSERVATIONPROTO.fields_by_name['float_data'].message_type = _OBSERVATIONPROTO_FLOATDATA
_OBSERVATIONPROTO.oneofs_by_name['observation_data'].fields.append(
_OBSERVATIONPROTO.fields_by_name['compressed_data'])
_OBSERVATIONPROTO.fields_by_name['compressed_data'].containing_oneof = _OBSERVATIONPROTO.oneofs_by_name['observation_data']
_OBSERVATIONPROTO.oneofs_by_name['observation_data'].fields.append(
_OBSERVATIONPROTO.fields_by_name['float_data'])
_OBSERVATIONPROTO.fields_by_name['float_data'].containing_oneof = _OBSERVATIONPROTO.oneofs_by_name['observation_data']
DESCRIPTOR.message_types_by_name['ObservationProto'] = _OBSERVATIONPROTO
DESCRIPTOR.enum_types_by_name['CompressionTypeProto'] = _COMPRESSIONTYPEPROTO
_sym_db.RegisterFileDescriptor(DESCRIPTOR)
ObservationProto = _reflection.GeneratedProtocolMessageType('ObservationProto', (_message.Message,), dict(
FloatData = _reflection.GeneratedProtocolMessageType('FloatData', (_message.Message,), dict(
DESCRIPTOR = _OBSERVATIONPROTO_FLOATDATA,
__module__ = 'mlagents.envs.communicator_objects.observation_pb2'
# @@protoc_insertion_point(class_scope:communicator_objects.ObservationProto.FloatData)
))
,
DESCRIPTOR = _OBSERVATIONPROTO,
__module__ = 'mlagents.envs.communicator_objects.observation_pb2'
# @@protoc_insertion_point(class_scope:communicator_objects.ObservationProto)
))
_sym_db.RegisterMessage(ObservationProto)
_sym_db.RegisterMessage(ObservationProto.FloatData)
DESCRIPTOR.has_options = True
DESCRIPTOR._options = _descriptor._ParseOptions(descriptor_pb2.FileOptions(), _b('\252\002\034MLAgents.CommunicatorObjects'))
# @@protoc_insertion_point(module_scope)

96
ml-agents-envs/mlagents/envs/communicator_objects/observation_pb2.pyi


# @generated by generate_proto_mypy_stubs.py. Do not edit!
import sys
from google.protobuf.descriptor import (
Descriptor as google___protobuf___descriptor___Descriptor,
EnumDescriptor as google___protobuf___descriptor___EnumDescriptor,
)
from google.protobuf.internal.containers import (
RepeatedScalarFieldContainer as google___protobuf___internal___containers___RepeatedScalarFieldContainer,
)
from google.protobuf.message import (
Message as google___protobuf___message___Message,
)
from typing import (
Iterable as typing___Iterable,
List as typing___List,
Optional as typing___Optional,
Tuple as typing___Tuple,
cast as typing___cast,
)
from typing_extensions import (
Literal as typing_extensions___Literal,
)
builtin___bool = bool
builtin___bytes = bytes
builtin___float = float
builtin___int = int
builtin___str = str
class CompressionTypeProto(builtin___int):
DESCRIPTOR: google___protobuf___descriptor___EnumDescriptor = ...
@classmethod
def Name(cls, number: builtin___int) -> builtin___str: ...
@classmethod
def Value(cls, name: builtin___str) -> 'CompressionTypeProto': ...
@classmethod
def keys(cls) -> typing___List[builtin___str]: ...
@classmethod
def values(cls) -> typing___List['CompressionTypeProto']: ...
@classmethod
def items(cls) -> typing___List[typing___Tuple[builtin___str, 'CompressionTypeProto']]: ...
NONE = typing___cast('CompressionTypeProto', 0)
PNG = typing___cast('CompressionTypeProto', 1)
NONE = typing___cast('CompressionTypeProto', 0)
PNG = typing___cast('CompressionTypeProto', 1)
class ObservationProto(google___protobuf___message___Message):
DESCRIPTOR: google___protobuf___descriptor___Descriptor = ...
class FloatData(google___protobuf___message___Message):
DESCRIPTOR: google___protobuf___descriptor___Descriptor = ...
data = ... # type: google___protobuf___internal___containers___RepeatedScalarFieldContainer[builtin___float]
def __init__(self,
*,
data : typing___Optional[typing___Iterable[builtin___float]] = None,
) -> None: ...
@classmethod
def FromString(cls, s: builtin___bytes) -> ObservationProto.FloatData: ...
def MergeFrom(self, other_msg: google___protobuf___message___Message) -> None: ...
def CopyFrom(self, other_msg: google___protobuf___message___Message) -> None: ...
if sys.version_info >= (3,):
def ClearField(self, field_name: typing_extensions___Literal[u"data"]) -> None: ...
else:
def ClearField(self, field_name: typing_extensions___Literal[u"data",b"data"]) -> None: ...
shape = ... # type: google___protobuf___internal___containers___RepeatedScalarFieldContainer[builtin___int]
compression_type = ... # type: CompressionTypeProto
compressed_data = ... # type: builtin___bytes
@property
def float_data(self) -> ObservationProto.FloatData: ...
def __init__(self,
*,
shape : typing___Optional[typing___Iterable[builtin___int]] = None,
compression_type : typing___Optional[CompressionTypeProto] = None,
compressed_data : typing___Optional[builtin___bytes] = None,
float_data : typing___Optional[ObservationProto.FloatData] = None,
) -> None: ...
@classmethod
def FromString(cls, s: builtin___bytes) -> ObservationProto: ...
def MergeFrom(self, other_msg: google___protobuf___message___Message) -> None: ...
def CopyFrom(self, other_msg: google___protobuf___message___Message) -> None: ...
if sys.version_info >= (3,):
def HasField(self, field_name: typing_extensions___Literal[u"compressed_data",u"float_data",u"observation_data"]) -> builtin___bool: ...
def ClearField(self, field_name: typing_extensions___Literal[u"compressed_data",u"compression_type",u"float_data",u"observation_data",u"shape"]) -> None: ...
else:
def HasField(self, field_name: typing_extensions___Literal[u"compressed_data",b"compressed_data",u"float_data",b"float_data",u"observation_data",b"observation_data"]) -> builtin___bool: ...
def ClearField(self, field_name: typing_extensions___Literal[u"compressed_data",b"compressed_data",u"compression_type",b"compression_type",u"float_data",b"float_data",u"observation_data",b"observation_data",u"shape",b"shape"]) -> None: ...
def WhichOneof(self, oneof_group: typing_extensions___Literal[u"observation_data",b"observation_data"]) -> typing_extensions___Literal["compressed_data","float_data"]: ...

22
protobuf-definitions/proto/mlagents/envs/communicator_objects/observation.proto


syntax = "proto3";
option csharp_namespace = "MLAgents.CommunicatorObjects";
package communicator_objects;
enum CompressionTypeProto {
NONE = 0;
PNG = 1;
}
message ObservationProto {
message FloatData {
repeated float data = 1;
}
repeated int32 shape = 1;
CompressionTypeProto compression_type = 2;
oneof observation_data {
bytes compressed_data = 3;
FloatData float_data = 4;
}
}

234
UnitySDK/Assets/ML-Agents/Scripts/Grpc/CommunicatorObjects/CompressedObservation.cs


// <auto-generated>
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: mlagents/envs/communicator_objects/compressed_observation.proto
// </auto-generated>
#pragma warning disable 1591, 0612, 3021
#region Designer generated code
using pb = global::Google.Protobuf;
using pbc = global::Google.Protobuf.Collections;
using pbr = global::Google.Protobuf.Reflection;
using scg = global::System.Collections.Generic;
namespace MLAgents.CommunicatorObjects {
/// <summary>Holder for reflection information generated from mlagents/envs/communicator_objects/compressed_observation.proto</summary>
public static partial class CompressedObservationReflection {
#region Descriptor
/// <summary>File descriptor for mlagents/envs/communicator_objects/compressed_observation.proto</summary>
public static pbr::FileDescriptor Descriptor {
get { return descriptor; }
}
private static pbr::FileDescriptor descriptor;
static CompressedObservationReflection() {
byte[] descriptorData = global::System.Convert.FromBase64String(
string.Concat(
"Cj9tbGFnZW50cy9lbnZzL2NvbW11bmljYXRvcl9vYmplY3RzL2NvbXByZXNz",
"ZWRfb2JzZXJ2YXRpb24ucHJvdG8SFGNvbW11bmljYXRvcl9vYmplY3RzIn8K",
"GkNvbXByZXNzZWRPYnNlcnZhdGlvblByb3RvEg0KBXNoYXBlGAEgAygFEkQK",
"EGNvbXByZXNzaW9uX3R5cGUYAiABKA4yKi5jb21tdW5pY2F0b3Jfb2JqZWN0",
"cy5Db21wcmVzc2lvblR5cGVQcm90bxIMCgRkYXRhGAMgASgMKikKFENvbXBy",
"ZXNzaW9uVHlwZVByb3RvEggKBE5PTkUQABIHCgNQTkcQAUIfqgIcTUxBZ2Vu",
"dHMuQ29tbXVuaWNhdG9yT2JqZWN0c2IGcHJvdG8z"));
descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
new pbr::FileDescriptor[] { },
new pbr::GeneratedClrTypeInfo(new[] {typeof(global::MLAgents.CommunicatorObjects.CompressionTypeProto), }, new pbr::GeneratedClrTypeInfo[] {
new pbr::GeneratedClrTypeInfo(typeof(global::MLAgents.CommunicatorObjects.CompressedObservationProto), global::MLAgents.CommunicatorObjects.CompressedObservationProto.Parser, new[]{ "Shape", "CompressionType", "Data" }, null, null, null)
}));
}
#endregion
}
#region Enums
public enum CompressionTypeProto {
[pbr::OriginalName("NONE")] None = 0,
[pbr::OriginalName("PNG")] Png = 1,
}
#endregion
#region Messages
public sealed partial class CompressedObservationProto : pb::IMessage<CompressedObservationProto> {
private static readonly pb::MessageParser<CompressedObservationProto> _parser = new pb::MessageParser<CompressedObservationProto>(() => new CompressedObservationProto());
private pb::UnknownFieldSet _unknownFields;
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public static pb::MessageParser<CompressedObservationProto> Parser { get { return _parser; } }
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public static pbr::MessageDescriptor Descriptor {
get { return global::MLAgents.CommunicatorObjects.CompressedObservationReflection.Descriptor.MessageTypes[0]; }
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
pbr::MessageDescriptor pb::IMessage.Descriptor {
get { return Descriptor; }
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public CompressedObservationProto() {
OnConstruction();
}
partial void OnConstruction();
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public CompressedObservationProto(CompressedObservationProto other) : this() {
shape_ = other.shape_.Clone();
compressionType_ = other.compressionType_;
data_ = other.data_;
_unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public CompressedObservationProto Clone() {
return new CompressedObservationProto(this);
}
/// <summary>Field number for the "shape" field.</summary>
public const int ShapeFieldNumber = 1;
private static readonly pb::FieldCodec<int> _repeated_shape_codec
= pb::FieldCodec.ForInt32(10);
private readonly pbc::RepeatedField<int> shape_ = new pbc::RepeatedField<int>();
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public pbc::RepeatedField<int> Shape {
get { return shape_; }
}
/// <summary>Field number for the "compression_type" field.</summary>
public const int CompressionTypeFieldNumber = 2;
private global::MLAgents.CommunicatorObjects.CompressionTypeProto compressionType_ = 0;
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public global::MLAgents.CommunicatorObjects.CompressionTypeProto CompressionType {
get { return compressionType_; }
set {
compressionType_ = value;
}
}
/// <summary>Field number for the "data" field.</summary>
public const int DataFieldNumber = 3;
private pb::ByteString data_ = pb::ByteString.Empty;
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public pb::ByteString Data {
get { return data_; }
set {
data_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
}
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public override bool Equals(object other) {
return Equals(other as CompressedObservationProto);
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public bool Equals(CompressedObservationProto other) {
if (ReferenceEquals(other, null)) {
return false;
}
if (ReferenceEquals(other, this)) {
return true;
}
if(!shape_.Equals(other.shape_)) return false;
if (CompressionType != other.CompressionType) return false;
if (Data != other.Data) return false;
return Equals(_unknownFields, other._unknownFields);
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public override int GetHashCode() {
int hash = 1;
hash ^= shape_.GetHashCode();
if (CompressionType != 0) hash ^= CompressionType.GetHashCode();
if (Data.Length != 0) hash ^= Data.GetHashCode();
if (_unknownFields != null) {
hash ^= _unknownFields.GetHashCode();
}
return hash;
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public override string ToString() {
return pb::JsonFormatter.ToDiagnosticString(this);
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public void WriteTo(pb::CodedOutputStream output) {
shape_.WriteTo(output, _repeated_shape_codec);
if (CompressionType != 0) {
output.WriteRawTag(16);
output.WriteEnum((int) CompressionType);
}
if (Data.Length != 0) {
output.WriteRawTag(26);
output.WriteBytes(Data);
}
if (_unknownFields != null) {
_unknownFields.WriteTo(output);
}
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public int CalculateSize() {
int size = 0;
size += shape_.CalculateSize(_repeated_shape_codec);
if (CompressionType != 0) {
size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) CompressionType);
}
if (Data.Length != 0) {
size += 1 + pb::CodedOutputStream.ComputeBytesSize(Data);
}
if (_unknownFields != null) {
size += _unknownFields.CalculateSize();
}
return size;
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public void MergeFrom(CompressedObservationProto other) {
if (other == null) {
return;
}
shape_.Add(other.shape_);
if (other.CompressionType != 0) {
CompressionType = other.CompressionType;
}
if (other.Data.Length != 0) {
Data = other.Data;
}
_unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public void MergeFrom(pb::CodedInputStream input) {
uint tag;
while ((tag = input.ReadTag()) != 0) {
switch(tag) {
default:
_unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
break;
case 10:
case 8: {
shape_.AddEntriesFrom(input, _repeated_shape_codec);
break;
}
case 16: {
compressionType_ = (global::MLAgents.CommunicatorObjects.CompressionTypeProto) input.ReadEnum();
break;
}
case 26: {
Data = input.ReadBytes();
break;
}
}
}
}
}
#endregion
}
#endregion Designer generated code

24
UnitySDK/Assets/ML-Agents/Scripts/Sensor/CompressedObservation.cs


using System;
using UnityEngine;
namespace MLAgents.Sensor
{
public struct CompressedObservation
{
/// <summary>
/// The compressed data.
/// </summary>
public byte[] Data;
/// <summary>
/// The format of the compressed data
/// </summary>
public SensorCompressionType CompressionType;
/// <summary>
/// The uncompressed dimensions of the data.
/// E.g. for RGB visual observations, this will be {Width, Height, 3}
/// </summary>
public int[] Shape;
}
}

113
ml-agents-envs/mlagents/envs/communicator_objects/compressed_observation_pb2.py


# Generated by the protocol buffer compiler. DO NOT EDIT!
# source: mlagents/envs/communicator_objects/compressed_observation.proto
import sys
_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1'))
from google.protobuf.internal import enum_type_wrapper
from google.protobuf import descriptor as _descriptor
from google.protobuf import message as _message
from google.protobuf import reflection as _reflection
from google.protobuf import symbol_database as _symbol_database
from google.protobuf import descriptor_pb2
# @@protoc_insertion_point(imports)
_sym_db = _symbol_database.Default()
DESCRIPTOR = _descriptor.FileDescriptor(
name='mlagents/envs/communicator_objects/compressed_observation.proto',
package='communicator_objects',
syntax='proto3',
serialized_pb=_b('\n?mlagents/envs/communicator_objects/compressed_observation.proto\x12\x14\x63ommunicator_objects\"\x7f\n\x1a\x43ompressedObservationProto\x12\r\n\x05shape\x18\x01 \x03(\x05\x12\x44\n\x10\x63ompression_type\x18\x02 \x01(\x0e\x32*.communicator_objects.CompressionTypeProto\x12\x0c\n\x04\x64\x61ta\x18\x03 \x01(\x0c*)\n\x14\x43ompressionTypeProto\x12\x08\n\x04NONE\x10\x00\x12\x07\n\x03PNG\x10\x01\x42\x1f\xaa\x02\x1cMLAgents.CommunicatorObjectsb\x06proto3')
)
_COMPRESSIONTYPEPROTO = _descriptor.EnumDescriptor(
name='CompressionTypeProto',
full_name='communicator_objects.CompressionTypeProto',
filename=None,
file=DESCRIPTOR,
values=[
_descriptor.EnumValueDescriptor(
name='NONE', index=0, number=0,
options=None,
type=None),
_descriptor.EnumValueDescriptor(
name='PNG', index=1, number=1,
options=None,
type=None),
],
containing_type=None,
options=None,
serialized_start=218,
serialized_end=259,
)
_sym_db.RegisterEnumDescriptor(_COMPRESSIONTYPEPROTO)
CompressionTypeProto = enum_type_wrapper.EnumTypeWrapper(_COMPRESSIONTYPEPROTO)
NONE = 0
PNG = 1
_COMPRESSEDOBSERVATIONPROTO = _descriptor.Descriptor(
name='CompressedObservationProto',
full_name='communicator_objects.CompressedObservationProto',
filename=None,
file=DESCRIPTOR,
containing_type=None,
fields=[
_descriptor.FieldDescriptor(
name='shape', full_name='communicator_objects.CompressedObservationProto.shape', index=0,
number=1, type=5, cpp_type=1, label=3,
has_default_value=False, default_value=[],
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None, file=DESCRIPTOR),
_descriptor.FieldDescriptor(
name='compression_type', full_name='communicator_objects.CompressedObservationProto.compression_type', index=1,
number=2, type=14, cpp_type=8, label=1,
has_default_value=False, default_value=0,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None, file=DESCRIPTOR),
_descriptor.FieldDescriptor(
name='data', full_name='communicator_objects.CompressedObservationProto.data', index=2,
number=3, type=12, cpp_type=9, label=1,
has_default_value=False, default_value=_b(""),
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None, file=DESCRIPTOR),
],
extensions=[
],
nested_types=[],
enum_types=[
],
options=None,
is_extendable=False,
syntax='proto3',
extension_ranges=[],
oneofs=[
],
serialized_start=89,
serialized_end=216,
)
_COMPRESSEDOBSERVATIONPROTO.fields_by_name['compression_type'].enum_type = _COMPRESSIONTYPEPROTO
DESCRIPTOR.message_types_by_name['CompressedObservationProto'] = _COMPRESSEDOBSERVATIONPROTO
DESCRIPTOR.enum_types_by_name['CompressionTypeProto'] = _COMPRESSIONTYPEPROTO
_sym_db.RegisterFileDescriptor(DESCRIPTOR)
CompressedObservationProto = _reflection.GeneratedProtocolMessageType('CompressedObservationProto', (_message.Message,), dict(
DESCRIPTOR = _COMPRESSEDOBSERVATIONPROTO,
__module__ = 'mlagents.envs.communicator_objects.compressed_observation_pb2'
# @@protoc_insertion_point(class_scope:communicator_objects.CompressedObservationProto)
))
_sym_db.RegisterMessage(CompressedObservationProto)
DESCRIPTOR.has_options = True
DESCRIPTOR._options = _descriptor._ParseOptions(descriptor_pb2.FileOptions(), _b('\252\002\034MLAgents.CommunicatorObjects'))
# @@protoc_insertion_point(module_scope)

72
ml-agents-envs/mlagents/envs/communicator_objects/compressed_observation_pb2.pyi


# @generated by generate_proto_mypy_stubs.py. Do not edit!
import sys
from google.protobuf.descriptor import (
Descriptor as google___protobuf___descriptor___Descriptor,
EnumDescriptor as google___protobuf___descriptor___EnumDescriptor,
)
from google.protobuf.internal.containers import (
RepeatedScalarFieldContainer as google___protobuf___internal___containers___RepeatedScalarFieldContainer,
)
from google.protobuf.message import (
Message as google___protobuf___message___Message,
)
from typing import (
Iterable as typing___Iterable,
List as typing___List,
Optional as typing___Optional,
Tuple as typing___Tuple,
cast as typing___cast,
)
from typing_extensions import (
Literal as typing_extensions___Literal,
)
builtin___bool = bool
builtin___bytes = bytes
builtin___float = float
builtin___int = int
builtin___str = str
class CompressionTypeProto(builtin___int):
DESCRIPTOR: google___protobuf___descriptor___EnumDescriptor = ...
@classmethod
def Name(cls, number: builtin___int) -> builtin___str: ...
@classmethod
def Value(cls, name: builtin___str) -> 'CompressionTypeProto': ...
@classmethod
def keys(cls) -> typing___List[builtin___str]: ...
@classmethod
def values(cls) -> typing___List['CompressionTypeProto']: ...
@classmethod
def items(cls) -> typing___List[typing___Tuple[builtin___str, 'CompressionTypeProto']]: ...
NONE = typing___cast('CompressionTypeProto', 0)
PNG = typing___cast('CompressionTypeProto', 1)
NONE = typing___cast('CompressionTypeProto', 0)
PNG = typing___cast('CompressionTypeProto', 1)
class CompressedObservationProto(google___protobuf___message___Message):
DESCRIPTOR: google___protobuf___descriptor___Descriptor = ...
shape = ... # type: google___protobuf___internal___containers___RepeatedScalarFieldContainer[builtin___int]
compression_type = ... # type: CompressionTypeProto
data = ... # type: builtin___bytes
def __init__(self,
*,
shape : typing___Optional[typing___Iterable[builtin___int]] = None,
compression_type : typing___Optional[CompressionTypeProto] = None,
data : typing___Optional[builtin___bytes] = None,
) -> None: ...
@classmethod
def FromString(cls, s: builtin___bytes) -> CompressedObservationProto: ...
def MergeFrom(self, other_msg: google___protobuf___message___Message) -> None: ...
def CopyFrom(self, other_msg: google___protobuf___message___Message) -> None: ...
if sys.version_info >= (3,):
def ClearField(self, field_name: typing_extensions___Literal[u"compression_type",u"data",u"shape"]) -> None: ...
else:
def ClearField(self, field_name: typing_extensions___Literal[u"compression_type",b"compression_type",u"data",b"data",u"shape",b"shape"]) -> None: ...

15
protobuf-definitions/proto/mlagents/envs/communicator_objects/compressed_observation.proto


syntax = "proto3";
option csharp_namespace = "MLAgents.CommunicatorObjects";
package communicator_objects;
enum CompressionTypeProto {
NONE = 0;
PNG = 1;
}
message CompressedObservationProto {
repeated int32 shape = 1;
CompressionTypeProto compression_type = 2;
bytes data = 3;
}

/UnitySDK/Assets/ML-Agents/Scripts/Grpc/CommunicatorObjects/CompressedObservation.cs.meta → /UnitySDK/Assets/ML-Agents/Scripts/Grpc/CommunicatorObjects/Observation.cs.meta

/UnitySDK/Assets/ML-Agents/Scripts/Sensor/CompressedObservation.cs.meta → /UnitySDK/Assets/ML-Agents/Scripts/Sensor/Observation.cs.meta

部分文件因为文件数量过多而无法显示

正在加载...
取消
保存