浏览代码

[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],