From a37b89664a4049caadcc5623ed5b5d199ec33b46 Mon Sep 17 00:00:00 2001 From: Chris Elion Date: Fri, 1 Nov 2019 17:07:28 -0700 Subject: [PATCH 01/19] WIP observation proto --- .../Editor/Tests/DemonstrationTests.cs | 2 +- UnitySDK/Assets/ML-Agents/Scripts/Agent.cs | 53 ++- .../Grpc/CommunicatorObjects/AgentInfo.cs | 39 +- .../CompressedObservation.cs | 392 +++++++++++++++++- .../ML-Agents/Scripts/Grpc/GrpcExtensions.cs | 43 +- .../Scripts/Sensor/CompressedObservation.cs | 6 +- ml-agents-envs/mlagents/envs/brain.py | 100 +++-- .../communicator_objects/agent_info_pb2.py | 8 +- .../communicator_objects/agent_info_pb2.pyi | 10 +- .../compressed_observation_pb2.py | 116 +++++- .../compressed_observation_pb2.pyi | 45 ++ .../communicator_objects/agent_info.proto | 2 +- .../compressed_observation.proto | 14 + 13 files changed, 736 insertions(+), 94 deletions(-) diff --git a/UnitySDK/Assets/ML-Agents/Editor/Tests/DemonstrationTests.cs b/UnitySDK/Assets/ML-Agents/Editor/Tests/DemonstrationTests.cs index c9c2cee7e3..df64c05be7 100644 --- a/UnitySDK/Assets/ML-Agents/Editor/Tests/DemonstrationTests.cs +++ b/UnitySDK/Assets/ML-Agents/Editor/Tests/DemonstrationTests.cs @@ -50,7 +50,7 @@ public void TestStoreInitalize() done = true, id = 5, maxStepReached = true, - floatObservations = new List() { 1f, 1f, 1f }, + //floatObservations = new List() { 1f, 1f, 1f }, storedTextActions = "TestAction", storedVectorActions = new[] { 0f, 1f }, textObservation = "TestAction", diff --git a/UnitySDK/Assets/ML-Agents/Scripts/Agent.cs b/UnitySDK/Assets/ML-Agents/Scripts/Agent.cs index 65bd16dc37..d6f9eef967 100644 --- a/UnitySDK/Assets/ML-Agents/Scripts/Agent.cs +++ b/UnitySDK/Assets/ML-Agents/Scripts/Agent.cs @@ -1,3 +1,4 @@ +using System; using System.Collections.Generic; using UnityEngine; using Barracuda; @@ -13,12 +14,9 @@ namespace MLAgents public struct AgentInfo { /// - /// Most recent compressed observations. + /// Most recent observations. /// - public List compressedObservations; - - // TODO struct? - public List floatObservations; + public List observations; /// /// Most recent text observation. @@ -253,6 +251,7 @@ public AgentInfo Info public List sensors; public VectorSensor collectObservationsSensor; + float[] m_VectorSensorBuffer; WriteAdapter m_WriteAdapter = new WriteAdapter(); @@ -471,11 +470,7 @@ void ResetData() m_Info.textObservation = ""; m_Action.textActions = ""; - m_Info.compressedObservations = new List(); - m_Info.floatObservations = new List(); - m_Info.floatObservations.AddRange( - new float[param.vectorObservationSize - * param.numStackedVectorObservations]); + m_Info.observations = new List(); m_Info.customObservation = null; } @@ -548,6 +543,20 @@ public void InitializeSensors() 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++) + { + Debug.Log($"compression = {sensors[i].GetCompressionType()}"); + if (sensors[i].GetCompressionType() == SensorCompressionType.None) + { + // TODO handle multi-D + numFloatObservations += sensors[i].GetFloatObservationShape()[0]; + } + } + + Debug.Log($"numFloatObservations={numFloatObservations} sensors.Count={sensors.Count}"); + m_VectorSensorBuffer = new float[numFloatObservations]; } /// @@ -562,7 +571,7 @@ void SendInfoToBrain() m_Info.storedVectorActions = m_Action.vectorActions; m_Info.storedTextActions = m_Action.textActions; - m_Info.compressedObservations.Clear(); + m_Info.observations.Clear(); m_ActionMasker.ResetMask(); using (TimerStack.Instance.Scoped("CollectObservations")) { @@ -583,7 +592,7 @@ void SendInfoToBrain() { // This is a bit of a hack - if we're in inference mode, compressed observations won't be generated // But we need these to be generated for the recorder. So generate them here. - if (m_Info.compressedObservations.Count == 0) + if (m_Info.observations.Count == 0) { GenerateSensorData(); } @@ -610,18 +619,28 @@ public void GenerateSensorData() var sensor = sensors[i]; if (sensor.GetCompressionType() == SensorCompressionType.None) { - 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(m_VectorSensorBuffer, floatsWritten, numFloats), + Shape = sensor.GetFloatObservationShape(), + CompressionType = sensor.GetCompressionType() + }; + m_Info.observations.Add(floatObs); + floatsWritten += numFloats; } else { - var compressedObs = new CompressedObservation + var compressedObs = new Observation { - Data = sensor.GetCompressedObservation(), + CompressedData = sensor.GetCompressedObservation(), Shape = sensor.GetFloatObservationShape(), CompressionType = sensor.GetCompressionType() }; - m_Info.compressedObservations.Add(compressedObs); + m_Info.observations.Add(compressedObs); } } } diff --git a/UnitySDK/Assets/ML-Agents/Scripts/Grpc/CommunicatorObjects/AgentInfo.cs b/UnitySDK/Assets/ML-Agents/Scripts/Grpc/CommunicatorObjects/AgentInfo.cs index 83756e69f9..3a701dedb9 100644 --- a/UnitySDK/Assets/ML-Agents/Scripts/Grpc/CommunicatorObjects/AgentInfo.cs +++ b/UnitySDK/Assets/ML-Agents/Scripts/Grpc/CommunicatorObjects/AgentInfo.cs @@ -28,21 +28,20 @@ static AgentInfoReflection() { "Zm8ucHJvdG8SFGNvbW11bmljYXRvcl9vYmplY3RzGj9tbGFnZW50cy9lbnZz", "L2NvbW11bmljYXRvcl9vYmplY3RzL2NvbXByZXNzZWRfb2JzZXJ2YXRpb24u", "cHJvdG8aO21sYWdlbnRzL2VudnMvY29tbXVuaWNhdG9yX29iamVjdHMvY3Vz", - "dG9tX29ic2VydmF0aW9uLnByb3RvIowDCg5BZ2VudEluZm9Qcm90bxIiChpz", + "dG9tX29ic2VydmF0aW9uLnByb3RvIvcCCg5BZ2VudEluZm9Qcm90bxIiChpz", "dGFja2VkX3ZlY3Rvcl9vYnNlcnZhdGlvbhgBIAMoAhIYChB0ZXh0X29ic2Vy", "dmF0aW9uGAMgASgJEh0KFXN0b3JlZF92ZWN0b3JfYWN0aW9ucxgEIAMoAhIb", "ChNzdG9yZWRfdGV4dF9hY3Rpb25zGAUgASgJEg4KBnJld2FyZBgHIAEoAhIM", "CgRkb25lGAggASgIEhgKEG1heF9zdGVwX3JlYWNoZWQYCSABKAgSCgoCaWQY", "CiABKAUSEwoLYWN0aW9uX21hc2sYCyADKAgSSAoSY3VzdG9tX29ic2VydmF0", "aW9uGAwgASgLMiwuY29tbXVuaWNhdG9yX29iamVjdHMuQ3VzdG9tT2JzZXJ2", - "YXRpb25Qcm90bxJRChdjb21wcmVzc2VkX29ic2VydmF0aW9ucxgNIAMoCzIw", - "LmNvbW11bmljYXRvcl9vYmplY3RzLkNvbXByZXNzZWRPYnNlcnZhdGlvblBy", - "b3RvSgQIAhADSgQIBhAHQh+qAhxNTEFnZW50cy5Db21tdW5pY2F0b3JPYmpl", - "Y3RzYgZwcm90bzM=")); + "YXRpb25Qcm90bxI8CgxvYnNlcnZhdGlvbnMYDSADKAsyJi5jb21tdW5pY2F0", + "b3Jfb2JqZWN0cy5PYnNlcnZhdGlvblByb3RvSgQIAhADSgQIBhAHQh+qAhxN", + "TEFnZW50cy5Db21tdW5pY2F0b3JPYmplY3RzYgZwcm90bzM=")); descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData, new pbr::FileDescriptor[] { global::MLAgents.CommunicatorObjects.CompressedObservationReflection.Descriptor, global::MLAgents.CommunicatorObjects.CustomObservationReflection.Descriptor, }, new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] { - new pbr::GeneratedClrTypeInfo(typeof(global::MLAgents.CommunicatorObjects.AgentInfoProto), global::MLAgents.CommunicatorObjects.AgentInfoProto.Parser, new[]{ "StackedVectorObservation", "TextObservation", "StoredVectorActions", "StoredTextActions", "Reward", "Done", "MaxStepReached", "Id", "ActionMask", "CustomObservation", "CompressedObservations" }, null, null, null) + new pbr::GeneratedClrTypeInfo(typeof(global::MLAgents.CommunicatorObjects.AgentInfoProto), global::MLAgents.CommunicatorObjects.AgentInfoProto.Parser, new[]{ "StackedVectorObservation", "TextObservation", "StoredVectorActions", "StoredTextActions", "Reward", "Done", "MaxStepReached", "Id", "ActionMask", "CustomObservation", "Observations" }, null, null, null) })); } #endregion @@ -84,7 +83,7 @@ public AgentInfoProto(AgentInfoProto other) : this() { id_ = other.id_; actionMask_ = other.actionMask_.Clone(); CustomObservation = other.customObservation_ != null ? other.CustomObservation.Clone() : null; - compressedObservations_ = other.compressedObservations_.Clone(); + observations_ = other.observations_.Clone(); _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); } @@ -200,14 +199,14 @@ public int Id { } } - /// Field number for the "compressed_observations" field. - public const int CompressedObservationsFieldNumber = 13; - private static readonly pb::FieldCodec _repeated_compressedObservations_codec - = pb::FieldCodec.ForMessage(106, global::MLAgents.CommunicatorObjects.CompressedObservationProto.Parser); - private readonly pbc::RepeatedField compressedObservations_ = new pbc::RepeatedField(); + /// Field number for the "observations" field. + public const int ObservationsFieldNumber = 13; + private static readonly pb::FieldCodec _repeated_observations_codec + = pb::FieldCodec.ForMessage(106, global::MLAgents.CommunicatorObjects.ObservationProto.Parser); + private readonly pbc::RepeatedField observations_ = new pbc::RepeatedField(); [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public pbc::RepeatedField CompressedObservations { - get { return compressedObservations_; } + public pbc::RepeatedField Observations { + get { return observations_; } } [global::System.Diagnostics.DebuggerNonUserCodeAttribute] @@ -233,7 +232,7 @@ public bool Equals(AgentInfoProto other) { if (Id != other.Id) return false; if(!actionMask_.Equals(other.actionMask_)) return false; if (!object.Equals(CustomObservation, other.CustomObservation)) return false; - if(!compressedObservations_.Equals(other.compressedObservations_)) return false; + if(!observations_.Equals(other.observations_)) return false; return Equals(_unknownFields, other._unknownFields); } @@ -250,7 +249,7 @@ public override int GetHashCode() { if (Id != 0) hash ^= Id.GetHashCode(); hash ^= actionMask_.GetHashCode(); if (customObservation_ != null) hash ^= CustomObservation.GetHashCode(); - hash ^= compressedObservations_.GetHashCode(); + hash ^= observations_.GetHashCode(); if (_unknownFields != null) { hash ^= _unknownFields.GetHashCode(); } @@ -295,7 +294,7 @@ public void WriteTo(pb::CodedOutputStream output) { output.WriteRawTag(98); output.WriteMessage(CustomObservation); } - compressedObservations_.WriteTo(output, _repeated_compressedObservations_codec); + observations_.WriteTo(output, _repeated_observations_codec); if (_unknownFields != null) { _unknownFields.WriteTo(output); } @@ -328,7 +327,7 @@ public int CalculateSize() { if (customObservation_ != null) { size += 1 + pb::CodedOutputStream.ComputeMessageSize(CustomObservation); } - size += compressedObservations_.CalculateSize(_repeated_compressedObservations_codec); + size += observations_.CalculateSize(_repeated_observations_codec); if (_unknownFields != null) { size += _unknownFields.CalculateSize(); } @@ -367,7 +366,7 @@ public void MergeFrom(AgentInfoProto other) { } CustomObservation.MergeFrom(other.CustomObservation); } - compressedObservations_.Add(other.compressedObservations_); + observations_.Add(other.observations_); _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); } @@ -426,7 +425,7 @@ public void MergeFrom(pb::CodedInputStream input) { break; } case 106: { - compressedObservations_.AddEntriesFrom(input, _repeated_compressedObservations_codec); + observations_.AddEntriesFrom(input, _repeated_observations_codec); break; } } diff --git a/UnitySDK/Assets/ML-Agents/Scripts/Grpc/CommunicatorObjects/CompressedObservation.cs b/UnitySDK/Assets/ML-Agents/Scripts/Grpc/CommunicatorObjects/CompressedObservation.cs index 1b7a0f9296..9a1e495b25 100644 --- a/UnitySDK/Assets/ML-Agents/Scripts/Grpc/CommunicatorObjects/CompressedObservation.cs +++ b/UnitySDK/Assets/ML-Agents/Scripts/Grpc/CommunicatorObjects/CompressedObservation.cs @@ -28,13 +28,20 @@ static CompressedObservationReflection() { "ZWRfb2JzZXJ2YXRpb24ucHJvdG8SFGNvbW11bmljYXRvcl9vYmplY3RzIn8K", "GkNvbXByZXNzZWRPYnNlcnZhdGlvblByb3RvEg0KBXNoYXBlGAEgAygFEkQK", "EGNvbXByZXNzaW9uX3R5cGUYAiABKA4yKi5jb21tdW5pY2F0b3Jfb2JqZWN0", - "cy5Db21wcmVzc2lvblR5cGVQcm90bxIMCgRkYXRhGAMgASgMKikKFENvbXBy", - "ZXNzaW9uVHlwZVByb3RvEggKBE5PTkUQABIHCgNQTkcQAUIfqgIcTUxBZ2Vu", - "dHMuQ29tbXVuaWNhdG9yT2JqZWN0c2IGcHJvdG8z")); + "cy5Db21wcmVzc2lvblR5cGVQcm90bxIMCgRkYXRhGAMgASgMIvkBChBPYnNl", + "cnZhdGlvblByb3RvEg0KBXNoYXBlGAEgAygFEkQKEGNvbXByZXNzaW9uX3R5", + "cGUYAiABKA4yKi5jb21tdW5pY2F0b3Jfb2JqZWN0cy5Db21wcmVzc2lvblR5", + "cGVQcm90bxIZCg9jb21wcmVzc2VkX2RhdGEYAyABKAxIABJGCgpmbG9hdF9k", + "YXRhGAQgASgLMjAuY29tbXVuaWNhdG9yX29iamVjdHMuT2JzZXJ2YXRpb25Q", + "cm90by5GbG9hdERhdGFIABoZCglGbG9hdERhdGESDAoEZGF0YRgBIAMoAkIS", + "ChBvYnNlcnZhdGlvbl9kYXRhKikKFENvbXByZXNzaW9uVHlwZVByb3RvEggK", + "BE5PTkUQABIHCgNQTkcQAUIfqgIcTUxBZ2VudHMuQ29tbXVuaWNhdG9yT2Jq", + "ZWN0c2IGcHJvdG8z")); 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) + new pbr::GeneratedClrTypeInfo(typeof(global::MLAgents.CommunicatorObjects.CompressedObservationProto), global::MLAgents.CommunicatorObjects.CompressedObservationProto.Parser, new[]{ "Shape", "CompressionType", "Data" }, null, null, null), + 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 @@ -227,6 +234,383 @@ public void MergeFrom(pb::CodedInputStream input) { } + /// + /// TODO remove compressed + /// + public sealed partial class ObservationProto : pb::IMessage { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new ObservationProto()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pbr::MessageDescriptor Descriptor { + get { return global::MLAgents.CommunicatorObjects.CompressedObservationReflection.Descriptor.MessageTypes[1]; } + } + + [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); + } + + /// Field number for the "shape" field. + public const int ShapeFieldNumber = 1; + private static readonly pb::FieldCodec _repeated_shape_codec + = pb::FieldCodec.ForInt32(10); + private readonly pbc::RepeatedField shape_ = new pbc::RepeatedField(); + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public pbc::RepeatedField Shape { + get { return shape_; } + } + + /// Field number for the "compression_type" field. + 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; + } + } + + /// Field number for the "compressed_data" field. + 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; + } + } + + /// Field number for the "float_data" field. + 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_; + /// Enum of possible cases for the "observation_data" oneof. + 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 + /// Container for nested types declared in the ObservationProto message type. + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static partial class Types { + public sealed partial class FloatData : pb::IMessage { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new FloatData()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pb::MessageParser 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); + } + + /// Field number for the "data" field. + public const int DataFieldNumber = 1; + private static readonly pb::FieldCodec _repeated_data_codec + = pb::FieldCodec.ForFloat(10); + private readonly pbc::RepeatedField data_ = new pbc::RepeatedField(); + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public pbc::RepeatedField 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 } diff --git a/UnitySDK/Assets/ML-Agents/Scripts/Grpc/GrpcExtensions.cs b/UnitySDK/Assets/ML-Agents/Scripts/Grpc/GrpcExtensions.cs index 95f59349a6..2b0bd737fb 100644 --- a/UnitySDK/Assets/ML-Agents/Scripts/Grpc/GrpcExtensions.cs +++ b/UnitySDK/Assets/ML-Agents/Scripts/Grpc/GrpcExtensions.cs @@ -19,7 +19,7 @@ public static AgentInfoProto ToProto(this AgentInfo ai) { var agentInfoProto = new AgentInfoProto { - StackedVectorObservation = { ai.floatObservations }, + //StackedVectorObservation = { ai.floatObservations }, StoredVectorActions = { ai.storedVectorActions }, StoredTextActions = ai.storedTextActions, TextObservation = ai.textObservation, @@ -35,11 +35,11 @@ public static AgentInfoProto ToProto(this AgentInfo ai) 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()); } } @@ -175,13 +175,38 @@ public static List ToAgentActionList(this UnityRLInputProto.Types.L return agentActions; } - public static CompressedObservationProto ToProto(this CompressedObservation obs) + public static ObservationProto ToProto(this Observation obs) { - var obsProto = new CompressedObservationProto + if (obs.CompressedData != null && obs.FloatData != null) { - Data = ByteString.CopyFrom(obs.Data), - CompressionType = (CompressionTypeProto)obs.CompressionType, - }; + // TODO XOR + + } + + ObservationProto obsProto = null; + ; + if (obs.CompressedData != null) + { + 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; } diff --git a/UnitySDK/Assets/ML-Agents/Scripts/Sensor/CompressedObservation.cs b/UnitySDK/Assets/ML-Agents/Scripts/Sensor/CompressedObservation.cs index 5dfe6f85bf..61dcc7147b 100644 --- a/UnitySDK/Assets/ML-Agents/Scripts/Sensor/CompressedObservation.cs +++ b/UnitySDK/Assets/ML-Agents/Scripts/Sensor/CompressedObservation.cs @@ -3,12 +3,14 @@ namespace MLAgents.Sensor { - public struct CompressedObservation + public struct Observation { /// /// The compressed data. /// - public byte[] Data; + public byte[] CompressedData; + + public ArraySegment FloatData; /// /// The format of the compressed data diff --git a/ml-agents-envs/mlagents/envs/brain.py b/ml-agents-envs/mlagents/envs/brain.py index d815421ccc..c5b55bc82b 100644 --- a/ml-agents-envs/mlagents/envs/brain.py +++ b/ml-agents-envs/mlagents/envs/brain.py @@ -4,6 +4,7 @@ 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.compressed_observation_pb2 import ObservationProto from mlagents.envs.timers import hierarchical_timer, timed from typing import Dict, List, NamedTuple, Optional from PIL import Image @@ -74,7 +75,7 @@ def from_proto( """ resolutions = [ CameraResolution(x.shape[0], x.shape[1], x.shape[2]) - for x in agent_info.compressed_observations + for x in agent_info.observations if len(x.shape) >= 3 ] brain_params = BrainParameters( @@ -166,15 +167,23 @@ def from_agent_proto( 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] + vector_observation_protos: List[List[ObservationProto]] = [] + visual_observation_protos: List[List[ObservationProto]] = [] + + # Split the observations into vector (len(shape)==1) and visual (len(shape)==3) lists + for agent in agent_info_list: + agent_vis: List[ObservationProto] = [] + agent_vec: List[ObservationProto] = [] + for proto_obs in agent.observations: + is_visual = len(proto_obs.shape) == 3 + if is_visual: + agent_vis.append(proto_obs) + else: + agent_vec.append(proto_obs) + vector_observation_protos.append(agent_vec) + visual_observation_protos.append(agent_vis) + + vis_obs = BrainInfo._process_visual_observations(brain_params, visual_observation_protos) total_num_actions = sum(brain_params.vector_action_space_size) mask_actions = np.ones((len(agent_info_list), total_num_actions)) @@ -190,6 +199,48 @@ def from_agent_proto( "An agent had a NaN reward for brain " + brain_params.brain_name ) + vector_obs = BrainInfo._process_vector_observations(brain_params, agent_info_list, vector_observation_protos) + + agents = [f"${worker_id}-{x.id}" for x in agent_info_list] + brain_info = BrainInfo( + visual_observation=vis_obs, + vector_observation=vector_obs, + text_observations=[x.text_observation for x in agent_info_list], + 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]), + text_action=[list(x.stored_text_actions) for x in agent_info_list], + max_reached=[x.max_step_reached for x in agent_info_list], + custom_observations=[x.custom_observation for x in agent_info_list], + action_mask=mask_actions, + ) + return brain_info + + @staticmethod + def _process_visual_observations( + brain_params: BrainParameters, + visual_observations: List[List[ObservationProto]] + ) -> List[np.ndarray]: + 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_observations + ] + vis_obs += [obs] + return vis_obs + + @staticmethod + def _process_vector_observations( + brain_params: BrainParameters, + agent_info_list: List[AgentInfoProto], + vector_observations: List[List[ObservationProto]] + ) -> np.ndarray: if len(agent_info_list) == 0: vector_obs = np.zeros( ( @@ -202,8 +253,16 @@ def from_agent_proto( stacked_obs = [] has_nan = False has_inf = False - for x in agent_info_list: - np_obs = np.array(x.stacked_vector_observation) + for x, vec_obs in zip(agent_info_list, vector_observations): + # Concatenate vector obs + proto_vector_obs = [] + for vo in vec_obs: + proto_vector_obs.extend(vo.float_data.data) + if proto_vector_obs: + #assert proto_vector_obs == x.stacked_vector_observation + np_obs = np.array(proto_vector_obs) + else: + np_obs = np.array(x.stacked_vector_observation) # 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 @@ -224,22 +283,7 @@ def from_agent_proto( 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, - text_observations=[x.text_observation for x in agent_info_list], - 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]), - text_action=[list(x.stored_text_actions) for x in agent_info_list], - max_reached=[x.max_step_reached for x in agent_info_list], - custom_observations=[x.custom_observation 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]: diff --git a/ml-agents-envs/mlagents/envs/communicator_objects/agent_info_pb2.py b/ml-agents-envs/mlagents/envs/communicator_objects/agent_info_pb2.py index ceebf9d7f8..491220cf2c 100644 --- a/ml-agents-envs/mlagents/envs/communicator_objects/agent_info_pb2.py +++ b/ml-agents-envs/mlagents/envs/communicator_objects/agent_info_pb2.py @@ -21,7 +21,7 @@ name='mlagents/envs/communicator_objects/agent_info.proto', package='communicator_objects', syntax='proto3', - serialized_pb=_b('\n3mlagents/envs/communicator_objects/agent_info.proto\x12\x14\x63ommunicator_objects\x1a?mlagents/envs/communicator_objects/compressed_observation.proto\x1a;mlagents/envs/communicator_objects/custom_observation.proto\"\x8c\x03\n\x0e\x41gentInfoProto\x12\"\n\x1astacked_vector_observation\x18\x01 \x03(\x02\x12\x18\n\x10text_observation\x18\x03 \x01(\t\x12\x1d\n\x15stored_vector_actions\x18\x04 \x03(\x02\x12\x1b\n\x13stored_text_actions\x18\x05 \x01(\t\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\x12H\n\x12\x63ustom_observation\x18\x0c \x01(\x0b\x32,.communicator_objects.CustomObservationProto\x12Q\n\x17\x63ompressed_observations\x18\r \x03(\x0b\x32\x30.communicator_objects.CompressedObservationProtoJ\x04\x08\x02\x10\x03J\x04\x08\x06\x10\x07\x42\x1f\xaa\x02\x1cMLAgents.CommunicatorObjectsb\x06proto3') + serialized_pb=_b('\n3mlagents/envs/communicator_objects/agent_info.proto\x12\x14\x63ommunicator_objects\x1a?mlagents/envs/communicator_objects/compressed_observation.proto\x1a;mlagents/envs/communicator_objects/custom_observation.proto\"\xf7\x02\n\x0e\x41gentInfoProto\x12\"\n\x1astacked_vector_observation\x18\x01 \x03(\x02\x12\x18\n\x10text_observation\x18\x03 \x01(\t\x12\x1d\n\x15stored_vector_actions\x18\x04 \x03(\x02\x12\x1b\n\x13stored_text_actions\x18\x05 \x01(\t\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\x12H\n\x12\x63ustom_observation\x18\x0c \x01(\x0b\x32,.communicator_objects.CustomObservationProto\x12<\n\x0cobservations\x18\r \x03(\x0b\x32&.communicator_objects.ObservationProtoJ\x04\x08\x02\x10\x03J\x04\x08\x06\x10\x07\x42\x1f\xaa\x02\x1cMLAgents.CommunicatorObjectsb\x06proto3') , dependencies=[mlagents_dot_envs_dot_communicator__objects_dot_compressed__observation__pb2.DESCRIPTOR,mlagents_dot_envs_dot_communicator__objects_dot_custom__observation__pb2.DESCRIPTOR,]) @@ -106,7 +106,7 @@ is_extension=False, extension_scope=None, options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='compressed_observations', full_name='communicator_objects.AgentInfoProto.compressed_observations', index=10, + name='observations', full_name='communicator_objects.AgentInfoProto.observations', index=10, number=13, type=11, cpp_type=10, label=3, has_default_value=False, default_value=[], message_type=None, enum_type=None, containing_type=None, @@ -125,11 +125,11 @@ oneofs=[ ], serialized_start=204, - serialized_end=600, + serialized_end=579, ) _AGENTINFOPROTO.fields_by_name['custom_observation'].message_type = mlagents_dot_envs_dot_communicator__objects_dot_custom__observation__pb2._CUSTOMOBSERVATIONPROTO -_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_compressed__observation__pb2._OBSERVATIONPROTO DESCRIPTOR.message_types_by_name['AgentInfoProto'] = _AGENTINFOPROTO _sym_db.RegisterFileDescriptor(DESCRIPTOR) diff --git a/ml-agents-envs/mlagents/envs/communicator_objects/agent_info_pb2.pyi b/ml-agents-envs/mlagents/envs/communicator_objects/agent_info_pb2.pyi index efca605704..36fecdcdd8 100644 --- a/ml-agents-envs/mlagents/envs/communicator_objects/agent_info_pb2.pyi +++ b/ml-agents-envs/mlagents/envs/communicator_objects/agent_info_pb2.pyi @@ -14,7 +14,7 @@ from google.protobuf.message import ( ) from mlagents.envs.communicator_objects.compressed_observation_pb2 import ( - CompressedObservationProto as mlagents___envs___communicator_objects___compressed_observation_pb2___CompressedObservationProto, + ObservationProto as mlagents___envs___communicator_objects___compressed_observation_pb2___ObservationProto, ) from mlagents.envs.communicator_objects.custom_observation_pb2 import ( @@ -54,7 +54,7 @@ class AgentInfoProto(google___protobuf___message___Message): def custom_observation(self) -> mlagents___envs___communicator_objects___custom_observation_pb2___CustomObservationProto: ... @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___compressed_observation_pb2___ObservationProto]: ... def __init__(self, *, @@ -68,7 +68,7 @@ class AgentInfoProto(google___protobuf___message___Message): id : typing___Optional[builtin___int] = None, action_mask : typing___Optional[typing___Iterable[builtin___bool]] = None, custom_observation : typing___Optional[mlagents___envs___communicator_objects___custom_observation_pb2___CustomObservationProto] = 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___compressed_observation_pb2___ObservationProto]] = None, ) -> None: ... @classmethod def FromString(cls, s: builtin___bytes) -> AgentInfoProto: ... @@ -76,7 +76,7 @@ class AgentInfoProto(google___protobuf___message___Message): def CopyFrom(self, other_msg: google___protobuf___message___Message) -> None: ... if sys.version_info >= (3,): def HasField(self, field_name: typing_extensions___Literal[u"custom_observation"]) -> builtin___bool: ... - def ClearField(self, field_name: typing_extensions___Literal[u"action_mask",u"compressed_observations",u"custom_observation",u"done",u"id",u"max_step_reached",u"reward",u"stacked_vector_observation",u"stored_text_actions",u"stored_vector_actions",u"text_observation"]) -> None: ... + def ClearField(self, field_name: typing_extensions___Literal[u"action_mask",u"custom_observation",u"done",u"id",u"max_step_reached",u"observations",u"reward",u"stacked_vector_observation",u"stored_text_actions",u"stored_vector_actions",u"text_observation"]) -> None: ... else: def HasField(self, field_name: typing_extensions___Literal[u"custom_observation",b"custom_observation"]) -> builtin___bool: ... - def ClearField(self, field_name: typing_extensions___Literal[u"action_mask",b"action_mask",u"compressed_observations",b"compressed_observations",u"custom_observation",b"custom_observation",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_text_actions",b"stored_text_actions",u"stored_vector_actions",b"stored_vector_actions",u"text_observation",b"text_observation"]) -> None: ... + def ClearField(self, field_name: typing_extensions___Literal[u"action_mask",b"action_mask",u"custom_observation",b"custom_observation",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"stacked_vector_observation",b"stacked_vector_observation",u"stored_text_actions",b"stored_text_actions",u"stored_vector_actions",b"stored_vector_actions",u"text_observation",b"text_observation"]) -> None: ... diff --git a/ml-agents-envs/mlagents/envs/communicator_objects/compressed_observation_pb2.py b/ml-agents-envs/mlagents/envs/communicator_objects/compressed_observation_pb2.py index 5ff3611f53..f7053220ff 100644 --- a/ml-agents-envs/mlagents/envs/communicator_objects/compressed_observation_pb2.py +++ b/ml-agents-envs/mlagents/envs/communicator_objects/compressed_observation_pb2.py @@ -20,7 +20,7 @@ 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') + 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\"\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( @@ -40,8 +40,8 @@ ], containing_type=None, options=None, - serialized_start=218, - serialized_end=259, + serialized_start=470, + serialized_end=511, ) _sym_db.RegisterEnumDescriptor(_COMPRESSIONTYPEPROTO) @@ -95,8 +95,103 @@ serialized_end=216, ) + +_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=423, + serialized_end=448, +) + +_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=219, + serialized_end=468, +) + _COMPRESSEDOBSERVATIONPROTO.fields_by_name['compression_type'].enum_type = _COMPRESSIONTYPEPROTO +_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['CompressedObservationProto'] = _COMPRESSEDOBSERVATIONPROTO +DESCRIPTOR.message_types_by_name['ObservationProto'] = _OBSERVATIONPROTO DESCRIPTOR.enum_types_by_name['CompressionTypeProto'] = _COMPRESSIONTYPEPROTO _sym_db.RegisterFileDescriptor(DESCRIPTOR) @@ -107,6 +202,21 @@ )) _sym_db.RegisterMessage(CompressedObservationProto) +ObservationProto = _reflection.GeneratedProtocolMessageType('ObservationProto', (_message.Message,), dict( + + FloatData = _reflection.GeneratedProtocolMessageType('FloatData', (_message.Message,), dict( + DESCRIPTOR = _OBSERVATIONPROTO_FLOATDATA, + __module__ = 'mlagents.envs.communicator_objects.compressed_observation_pb2' + # @@protoc_insertion_point(class_scope:communicator_objects.ObservationProto.FloatData) + )) + , + DESCRIPTOR = _OBSERVATIONPROTO, + __module__ = 'mlagents.envs.communicator_objects.compressed_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')) diff --git a/ml-agents-envs/mlagents/envs/communicator_objects/compressed_observation_pb2.pyi b/ml-agents-envs/mlagents/envs/communicator_objects/compressed_observation_pb2.pyi index 41a3e719e4..140458436c 100644 --- a/ml-agents-envs/mlagents/envs/communicator_objects/compressed_observation_pb2.pyi +++ b/ml-agents-envs/mlagents/envs/communicator_objects/compressed_observation_pb2.pyi @@ -70,3 +70,48 @@ class CompressedObservationProto(google___protobuf___message___Message): 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: ... + +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"]: ... diff --git a/protobuf-definitions/proto/mlagents/envs/communicator_objects/agent_info.proto b/protobuf-definitions/proto/mlagents/envs/communicator_objects/agent_info.proto index fee14c036b..3c81fbaddd 100644 --- a/protobuf-definitions/proto/mlagents/envs/communicator_objects/agent_info.proto +++ b/protobuf-definitions/proto/mlagents/envs/communicator_objects/agent_info.proto @@ -19,5 +19,5 @@ message AgentInfoProto { int32 id = 10; repeated bool action_mask = 11; CustomObservationProto custom_observation = 12; - repeated CompressedObservationProto compressed_observations = 13; + repeated ObservationProto observations = 13; } diff --git a/protobuf-definitions/proto/mlagents/envs/communicator_objects/compressed_observation.proto b/protobuf-definitions/proto/mlagents/envs/communicator_objects/compressed_observation.proto index 0a6798cd2d..68b62cc562 100644 --- a/protobuf-definitions/proto/mlagents/envs/communicator_objects/compressed_observation.proto +++ b/protobuf-definitions/proto/mlagents/envs/communicator_objects/compressed_observation.proto @@ -13,3 +13,17 @@ message CompressedObservationProto { CompressionTypeProto compression_type = 2; bytes data = 3; } + +// TODO remove compressed +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; + } +} From 0dd70ffcae6933cfa81162f37c213fca243048f5 Mon Sep 17 00:00:00 2001 From: Chris Elion Date: Mon, 4 Nov 2019 11:25:13 -0800 Subject: [PATCH 02/19] ISensor extension --- .../ML-Agents/Scripts/Sensor/ISensor.cs | 20 +++++++++++++++++++ .../ML-Agents/Scripts/Sensor/SensorBase.cs | 8 +------- .../Scripts/Sensor/StackingSensor.cs | 3 +-- 3 files changed, 22 insertions(+), 9 deletions(-) diff --git a/UnitySDK/Assets/ML-Agents/Scripts/Sensor/ISensor.cs b/UnitySDK/Assets/ML-Agents/Scripts/Sensor/ISensor.cs index cc0abc7ed2..17aba3886a 100644 --- a/UnitySDK/Assets/ML-Agents/Scripts/Sensor/ISensor.cs +++ b/UnitySDK/Assets/ML-Agents/Scripts/Sensor/ISensor.cs @@ -49,4 +49,24 @@ public interface ISensor { string GetName(); } + public static class ISensorExtensions + { + /// + /// Get the total number of elements in the ISensor's observation (i.e. the product of the shape elements). + /// + /// + /// + 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; + } + } + } diff --git a/UnitySDK/Assets/ML-Agents/Scripts/Sensor/SensorBase.cs b/UnitySDK/Assets/ML-Agents/Scripts/Sensor/SensorBase.cs index 3043c1822e..e25430d6f4 100644 --- a/UnitySDK/Assets/ML-Agents/Scripts/Sensor/SensorBase.cs +++ b/UnitySDK/Assets/ML-Agents/Scripts/Sensor/SensorBase.cs @@ -23,13 +23,7 @@ public abstract class SensorBase : ISensor 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); diff --git a/UnitySDK/Assets/ML-Agents/Scripts/Sensor/StackingSensor.cs b/UnitySDK/Assets/ML-Agents/Scripts/Sensor/StackingSensor.cs index e80543a519..3153676d86 100644 --- a/UnitySDK/Assets/ML-Agents/Scripts/Sensor/StackingSensor.cs +++ b/UnitySDK/Assets/ML-Agents/Scripts/Sensor/StackingSensor.cs @@ -47,11 +47,10 @@ public StackingSensor(ISensor wrapped, int numStackedObservations) var shape = wrapped.GetFloatObservationShape(); m_Shape = new int[shape.Length]; - m_UnstackedObservationSize = 1; + m_UnstackedObservationSize = wrapped.ObservationSize(); for (int d = 0; d < shape.Length; d++) { m_Shape[d] = shape[d]; - m_UnstackedObservationSize *= shape[d]; } // TODO support arbitrary stacking dimension From d49eee426994ca7b4c85d9d6bf98c79743ed8edb Mon Sep 17 00:00:00 2001 From: Chris Elion Date: Mon, 4 Nov 2019 12:20:15 -0800 Subject: [PATCH 03/19] use Sensor extenstion --- UnitySDK/Assets/ML-Agents/Scripts/Agent.cs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/UnitySDK/Assets/ML-Agents/Scripts/Agent.cs b/UnitySDK/Assets/ML-Agents/Scripts/Agent.cs index d6f9eef967..cdbd4fdf4f 100644 --- a/UnitySDK/Assets/ML-Agents/Scripts/Agent.cs +++ b/UnitySDK/Assets/ML-Agents/Scripts/Agent.cs @@ -550,8 +550,7 @@ public void InitializeSensors() Debug.Log($"compression = {sensors[i].GetCompressionType()}"); if (sensors[i].GetCompressionType() == SensorCompressionType.None) { - // TODO handle multi-D - numFloatObservations += sensors[i].GetFloatObservationShape()[0]; + numFloatObservations += sensors[i].ObservationSize(); } } @@ -611,7 +610,6 @@ void SendInfoToBrain() /// public void GenerateSensorData() { - int floatsWritten = 0; // Generate data for all Sensors for (var i = 0; i < sensors.Count; i++) From e40d3628d7f647bc4f2218499f024d477e4eab8f Mon Sep 17 00:00:00 2001 From: Chris Elion Date: Wed, 6 Nov 2019 10:39:34 -0800 Subject: [PATCH 04/19] precommit fixes --- ml-agents-envs/mlagents/envs/brain.py | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/ml-agents-envs/mlagents/envs/brain.py b/ml-agents-envs/mlagents/envs/brain.py index 3d9cdc4415..c24995930d 100644 --- a/ml-agents-envs/mlagents/envs/brain.py +++ b/ml-agents-envs/mlagents/envs/brain.py @@ -4,7 +4,9 @@ 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.compressed_observation_pb2 import ObservationProto +from mlagents.envs.communicator_objects.compressed_observation_pb2 import ( + ObservationProto, +) from mlagents.envs.timers import hierarchical_timer, timed from typing import Dict, List, NamedTuple, Optional from PIL import Image @@ -75,7 +77,8 @@ def from_proto( """ resolutions = [ CameraResolution(x.shape[0], x.shape[1], x.shape[2]) - for x in agent_info.observations if len(x.shape) >= 3 + for x in agent_info.observations + if len(x.shape) >= 3 ] brain_params = BrainParameters( @@ -177,7 +180,9 @@ def from_agent_proto( vector_observation_protos.append(agent_vec) visual_observation_protos.append(agent_vis) - vis_obs = BrainInfo._process_visual_observations(brain_params, visual_observation_protos) + vis_obs = BrainInfo._process_visual_observations( + brain_params, visual_observation_protos + ) total_num_actions = sum(brain_params.vector_action_space_size) mask_actions = np.ones((len(agent_info_list), total_num_actions)) @@ -193,7 +198,9 @@ def from_agent_proto( "An agent had a NaN reward for brain " + brain_params.brain_name ) - vector_obs = BrainInfo._process_vector_observations(brain_params, agent_info_list, vector_observation_protos) + vector_obs = BrainInfo._process_vector_observations( + brain_params, agent_info_list, vector_observation_protos + ) agents = [f"${worker_id}-{x.id}" for x in agent_info_list] brain_info = BrainInfo( @@ -210,8 +217,7 @@ def from_agent_proto( @staticmethod def _process_visual_observations( - brain_params: BrainParameters, - visual_observations: List[List[ObservationProto]] + brain_params: BrainParameters, visual_observations: List[List[ObservationProto]] ) -> List[np.ndarray]: vis_obs: List[np.ndarray] = [] for i in range(brain_params.number_visual_observations): @@ -230,7 +236,7 @@ def _process_visual_observations( def _process_vector_observations( brain_params: BrainParameters, agent_info_list: List[AgentInfoProto], - vector_observations: List[List[ObservationProto]] + vector_observations: List[List[ObservationProto]], ) -> np.ndarray: if len(agent_info_list) == 0: vector_obs = np.zeros( @@ -246,11 +252,12 @@ def _process_vector_observations( has_inf = False for x, vec_obs in zip(agent_info_list, vector_observations): # Concatenate vector obs - proto_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) if proto_vector_obs: - #assert proto_vector_obs == x.stacked_vector_observation + # assert proto_vector_obs == x.stacked_vector_observation np_obs = np.array(proto_vector_obs) else: np_obs = np.array(x.stacked_vector_observation) From 09ba7dd3e02c04503edbe7e844de9e27609b4753 Mon Sep 17 00:00:00 2001 From: Chris Elion Date: Wed, 6 Nov 2019 11:13:15 -0800 Subject: [PATCH 05/19] fix test protos --- .../mlagents/envs/mock_communicator.py | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/ml-agents-envs/mlagents/envs/mock_communicator.py b/ml-agents-envs/mlagents/envs/mock_communicator.py index 7cbf1d436d..291e087bc6 100755 --- a/ml-agents-envs/mlagents/envs/mock_communicator.py +++ b/ml-agents-envs/mlagents/envs/mock_communicator.py @@ -9,7 +9,7 @@ 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, + ObservationProto, CompressionTypeProto, ) @@ -75,11 +75,19 @@ def _get_agent_infos(self): observation = [1, 2, 3, 1, 2, 3] compressed_obs = [ - CompressedObservationProto( - data=None, shape=[30, 40, 3], compression_type=CompressionTypeProto.PNG + ObservationProto( + compressed_data=None, + shape=[30, 40, 3], + compression_type=CompressionTypeProto.PNG, ) for _ in range(self.visual_inputs) ] + vector_obs = ObservationProto( + float_data=ObservationProto.FloatData(data=observation), + shape=[len(observation)], + compression_type=CompressionTypeProto.NONE, + ) + compressed_obs.append(vector_obs) for i in range(self.num_agents): list_agent_info.append( @@ -90,7 +98,7 @@ def _get_agent_infos(self): done=(i == 2), max_step_reached=False, id=i, - compressed_observations=compressed_obs, + observations=compressed_obs, ) ) dict_agent_info["RealFakeBrain"] = UnityRLOutputProto.ListAgentInfoProto( From bb6d3020d33b818115125cf4ff54f94352897674 Mon Sep 17 00:00:00 2001 From: Chris Elion Date: Wed, 6 Nov 2019 13:17:43 -0800 Subject: [PATCH 06/19] before demo convert --- ml-agents-envs/mlagents/envs/brain.py | 37 ++++++++++++++----- .../mlagents/envs/mock_communicator.py | 13 ++----- ml-agents/mlagents/trainers/tests/test_ppo.py | 20 +++++++++- 3 files changed, 48 insertions(+), 22 deletions(-) diff --git a/ml-agents-envs/mlagents/envs/brain.py b/ml-agents-envs/mlagents/envs/brain.py index c24995930d..1dfc45221e 100644 --- a/ml-agents-envs/mlagents/envs/brain.py +++ b/ml-agents-envs/mlagents/envs/brain.py @@ -23,6 +23,9 @@ class CameraResolution(NamedTuple): 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__( @@ -52,6 +55,7 @@ def __init__( def __str__(self): return """Unity brain name: {} Number of Visual Observations (per agent): {} + Camera Resolutions: {} Vector Observation space size (per agent): {} Number of stacked Vector Observation: {} Vector Action space type: {} @@ -59,6 +63,7 @@ def __str__(self): Vector Action descriptions: {}""".format( self.brain_name, str(self.number_visual_observations), + str([str(cr) for cr in self.camera_resolutions]), str(self.vector_observation_space_size), str(self.num_stacked_vector_observations), self.vector_action_space_type, @@ -76,19 +81,31 @@ def from_proto( :return: BrainParameter object. """ resolutions = [ - CameraResolution(x.shape[0], x.shape[1], x.shape[2]) - for x in agent_info.observations - if len(x.shape) >= 3 + 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 + ) + + assert ( + total_vector_obs + == brain_param_proto.vector_observation_size + * brain_param_proto.num_stacked_vector_observations + ), f"total_vector_obs = {total_vector_obs}. brain_param_proto.vector_observation_size={brain_param_proto.vector_observation_size} brain_param_proto.num_stacked_vector_observations={brain_param_proto.num_stacked_vector_observations}" # noqa + brain_params = BrainParameters( - 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=brain_param_proto.vector_observation_size, + num_stacked_vector_observations=brain_param_proto.num_stacked_vector_observations, + 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 diff --git a/ml-agents-envs/mlagents/envs/mock_communicator.py b/ml-agents-envs/mlagents/envs/mock_communicator.py index 291e087bc6..ec539e397c 100755 --- a/ml-agents-envs/mlagents/envs/mock_communicator.py +++ b/ml-agents-envs/mlagents/envs/mock_communicator.py @@ -19,7 +19,7 @@ def __init__( self, discrete_action=False, visual_inputs=0, - stack=True, + # stack=True, num_agents=3, brain_name="RealFakeBrain", vec_obs_size=3, @@ -38,15 +38,11 @@ def __init__( 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 def initialize(self, inputs: UnityInputProto) -> UnityOutputProto: bp = BrainParametersProto( vector_observation_size=self.vec_obs_size, - num_stacked_vector_observations=self.num_stacks, + num_stacked_vector_observations=1, # TODO REMOVE vector_action_size=[2], vector_action_descriptions=["", ""], vector_action_space_type=int(not self.is_discrete), @@ -69,10 +65,7 @@ def _get_agent_infos(self): 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] + observation = [1, 2, 3] compressed_obs = [ ObservationProto( diff --git a/ml-agents/mlagents/trainers/tests/test_ppo.py b/ml-agents/mlagents/trainers/tests/test_ppo.py index 441ed6a3a8..5d32107e2c 100644 --- a/ml-agents/mlagents/trainers/tests/test_ppo.py +++ b/ml-agents/mlagents/trainers/tests/test_ppo.py @@ -298,7 +298,15 @@ def test_rl_functions(): 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, + num_stacked_vector_observations=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() @@ -355,7 +363,15 @@ def test_trainer_update_policy(mock_env, dummy_config, use_discrete): 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, + num_stacked_vector_observations=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) From ae4c9ea1a476abb6a04b111ae74a4b3845e96f99 Mon Sep 17 00:00:00 2001 From: Chris Elion Date: Wed, 6 Nov 2019 13:26:12 -0800 Subject: [PATCH 07/19] convert demo files --- demos/Expert3DBall.demo | Bin 33573 -> 56056 bytes demos/Expert3DBallHard.demo | Bin 58328 -> 111290 bytes demos/ExpertBasic.demo | Bin 7762 -> 14308 bytes demos/ExpertBouncer.demo | Bin 10175 -> 18021 bytes demos/ExpertCrawlerDyn.demo | Bin 903354 -> 1671132 bytes demos/ExpertCrawlerSta.demo | Bin 3906198 -> 7226628 bytes demos/ExpertFood.demo | Bin 564635 -> 1078243 bytes demos/ExpertGrid.demo | Bin 804736 -> 806994 bytes demos/ExpertHallway.demo | Bin 3415462 -> 4453063 bytes demos/ExpertPush.demo | Bin 2907246 -> 5767331 bytes demos/ExpertPyramid.demo | Bin 1418668 -> 2809425 bytes demos/ExpertReacher.demo | Bin 597743 -> 1101860 bytes demos/ExpertTennis.demo | Bin 144968 -> 272778 bytes demos/ExpertWalker.demo | Bin 4312635 -> 7924504 bytes ml-agents/mlagents/trainers/tests/test.demo | Bin 3551 -> 5871 bytes .../trainers/tests/test_demo_dir/test.demo | Bin 3551 -> 5871 bytes .../trainers/tests/test_demo_dir/test2.demo | Bin 3551 -> 5871 bytes .../trainers/tests/test_demo_dir/test3.demo | Bin 3551 -> 5871 bytes .../mlagents/trainers/tests/testdcvis.demo | Bin 66353 -> 66606 bytes 19 files changed, 0 insertions(+), 0 deletions(-) diff --git a/demos/Expert3DBall.demo b/demos/Expert3DBall.demo index 2e8447a4ddc44023b32ef2f10299013ecf915290..a57ed4bdd549ab1e8680b94111db5a405f212187 100644 GIT binary patch delta 9878 zcmYk==UWJD7{=kFLDL?Utsx_oj7Ss}5i%;GQWQxUsgx~ytL(k^CVTIhz4zX$?D2Zt z*9Z6Y?Y_?AIeve@vwXDSw``-SUIvjF-tH!Gj^+lYwze7Gwgxd7shWEA8u$zjMJl0Oj7d|LL*C*?GfG{|<6?T|c@Jcw(4 z?YQQbP69~+WDUt0$a9kC5PK8t*qcZviX;lMfMfyWHpy*>wW)TjO{Eh|5)8>C$%LFI zIS;Wk(~hN?befSggN!B_4LL$`L?qMvUnbLBDh(9=-Xa4?20(U@?0|eC`2?w9@h_ZJ z!$LZ}NP0omlB|WiAbA0Cu+)x&rF6QGbb%}+SqQm9atC5lKsz=Cq!U6C0?8uDf?OcE z04Y#VI|T|#r#VS;$QY6_kfS6=AqIuCV^Bys4M`e829gYf>?GL<`AqT|;#OG8ZiS`X zo1`~n9mzV#OOlt6N=39&sfcvCl5~YEB3T5vOL7-ds;G8K6_rkVlJ<~kB-0=lNiISP z7Sm3_V$um934n|x84Ec^atvZvTswxvrQ=271sOy#2(pW07vu}c7f8(#TCQ0_%6&-s zK-QD2hrA+r1#v8?9mkT=i6)7LEGAhDxkqvjQrb#8rLCmXfusXuI>~g%C6Y^!Le|anL#oGa+%~Zq;Og76fP^B zmLx49<4MLtPLP~{7?;zIaXINUB54E}LNWxhhhz`r8_73F?ebc#U0%wGB#DrXBpV@b zNZvrIRM1Y93exFD(hahdWGUnU$pc8)irOh#Q92z-IzncW%!FJaxdJI-tDPdY(rHD~ z3NnFY0^}sgNk~3B?c}qQPGgeBkf9_)A$v*oLcWuHht#pxavggq_ao^C*+jAl@|NT+ zq^g5K9FG~!yx-e_CbD-{D8Pu(Xx9LDJPL6K{k_YhP)$r2dP$7 zJJqU6Czd1@vYcc&!DyQe8VH)urQ0;tLs0G90p>WIyC5$xldKXD!!tmU1#lGGq(M7RY;&_Yfx+?Krte zrw2(7$O@7bkjEsCAr)M;Q^8d_;UwXZIV5u+*GaBJir3Ii@fy-;L(&E^nPf8L49OXY zshf68-K673;s;45NrxODIRN=Z@(WV0rk3l~lyVA53S=wER>%jE50L7$v{Sv7bmB&q(5XE$u`JGl8+GQdfIWWC!L-oJt3<| zRzaSUJcZbLXvfw=I-N;6L*|jpgWM#!2`O1$J0o<^cDoH9NncC7uR6HF2e$t1~yoF_RCv23Cp%O=ukM$!y2nq)NO z2+0wV%%=Y`nN6kAK;iE#GJs?NWCzI($S0CdkQ)B~!dW%^rPGU~7i2BTTF48M7Z8VL z+Hq(moh~F@APY$rLhg{rW?L!uA?X8IPqH5JisTiMb4v^_2(;=5gE?YX_`AYH?Qmeg|YqghhUy{C%4I~>NuSs4*DtFLMsPjVkpCR96RLZuT*5(=3?G6Qm%sV-a@K&(N5Ja(&4cGlL1vT8hFl}L1}WAiPr!`4y$Rv_UkkcfmAtrI!F^Q9oFNrT?ILUCx zevLZciyElO#j7kZggxCwUKXir0=)ymWey^nk1&Spj)W@)%MfK|2)^ zq!UgO4w*wT2XdX{I;40n?G*1Noi-$GAd^WZL(Y(#ftdEzj%jb{_>uTQ(n-=G2S^S; zev$lw)a#?=dVQpvLXra6O0pI5f#d_EdSC5S?<<`+k~qjpl9iArBu^j}6SY$@Q92PM z5sQn^_>=fUMv;ty940vo`9tyt;yF~yo&Sp#`a@*HA6Ts!u|r4vOG1zA9{0CJn;HpDtz WJJ#va2_^}KWRhe;&Xb%^xBVZYf?Cf2 delta 4939 zcmW;PTUga)8U^qNO(jCWN+LqRe@R3rP>F;HSV0IPSV1TvP(dhiu!0Z}(1K9Td_gG4 zp@I;QL&Zr>Qh^`{Qi*`)iyX&sJY0<9IF8O*@6CRG@3+?8m+N`2*B9Jc4p!jRCk7;W2 zW4tdz{UVQfnp!@OZ;ep4Xks3}oj6}p@6Ts)5$YA`EMQW|$#Em=r~Eo7o+psByh9S8XuFqwkdM9zkqdd`qqbEMobEgm^dxc z)U%6tS3zl_`A=%OyhlO0cMYW>qpPD9NihsBy& zyqIt0P_n3hG24;GntI!q$vAXWbjO&E`3&0 zpFhjwA#_2s%#_JVQ%xN)Wn%Z7rVO8>N}zbr1L&N{+>GsEGfn+q#?Hzmnp(Jo+O&kp zecUs0hc4BW>ry5|P>smOTvJb&^Uc?s?R&V-%Dv4(Q)?}l?6qKGy-ZV&FXLSR#ft7i zXGB{yO|8+GrfFgqID~nT*p1Kf{EWsP1&xb z+M!~RnXRV&D{{4E`x@>Ow(M-Q)6@z(YL^`oQ+rMQNA7ee#Gc7jXi&7_6-~YT3g2R1 zVcXfr3^stz5;nr-Pqfw>zGVIZ6fD4Fh6hbE#wWhb>GDN$Q=Xuyvd~SO(srnVSe7? zT?M6y=DTBlL^~mGcc%I7Y&&{jemr*wuR{CLn{HRTSOzz{Jkvnt~=4TU=A*e=V z^A6_c9lrU#!}dMgXXW1ZF6QT5CVSsyV*MWG=RMv9P^{=KbVjt*AM@kSG|iuFs{qVT z0Pj2~TGSfAWXt=QpZA#@hbl#ufta5_zU4qsqUJ!h12AUt}DK z`4Oc+L6J-=BiZ)cj``Wny9vq_O>SqBv;*_AgUMy6U*r*m`HA9NBa|(gh+;c&C+24- zlZ#NVNGF;}eKh7Lnu$>i=0}tO`N#0>Jk%|E6vK91EaoSci9sCZM`RzzWEOW<922)) zn4eu#EtDbB{{-_Rvi*eZY1|#3u;cP6=I2u?>{BLspJ9IFj)QzZV=@J`iJapxKkkzc~?MtL<75- z>`21=Br!P+HH#dQF+a(CD~FOr{mE=creJ|9V^7z&Rm5DCpv7MEV`N?N;6FMbYRKVm| z0p_QGiA5piN0bSL7xL`}G%7MIV!N{l^HaoRslxn-)+r{}agQh_eqUpLzNXrtVv$)f z=11gO%=R_hCyLqGSc3T}p>~xpG5rSfBX>F!@(q)#(4c5TDdwk?Z?UCpn;gXa$ejuW zA7oN}kcrnJ%+Dd-El|G5xD4|nN`ZpPm{yjt?OBfbDd*h;<%%ZDnIs*?{2XR-8R{2# zRA7E8_|^zzizX`APOQZIR5G~;^@?<=nABHceyW%lRbzfc36Os^-_AqbqDS(#vF=;U z&$mnrzQg>8?7!ph%;N6)j)~j%n4j;dS|~%LUxWD(+19Wx`5a+Vc!Y^lJ?5vLcNLT-n%{u=5$%M$ z8<^%duh3+ATzIFsAZgeYJD^E1G=9;i%o zX@KplUobzvFu4hx5-s|b$+2HCKff}u_zm+T%7nsy~ZhF+GX-kvkmaFsc6o^YaH2 zqdze}q6EnQPrjXpx7xRL~j=JBX=C+JIiDWYMV7J)G_@(Mry15 diff --git a/demos/Expert3DBallHard.demo b/demos/Expert3DBallHard.demo index e3c976ce2519e63f7d7969177bb3c7e777768b31..ab670b116af8b8ec072d22f8d1028b42e77ec4a4 100644 GIT binary patch delta 11209 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 delta 3712 zcmYk8dvH@#8o=j*%0h)Ua6v!{4X?R8+9t5D0-aK{l9y5Bjs=Zt^x^}F}? zzWJyhf$ROKCD5Nhd4JA0Qrut}sDkti-?#?oP(3h%qMkwV zF12egE{Di)@>!~=NF^{ol>?ChDgrVDhL(1{9UI~YT~XkzGXvgB21g6cTOvfw& z7iV!MlIw=R92H!%`6l*)4y|)oN6TD(Kx`f^^JEyDM-`Xy2^`JmfN8dhfD9cf?=a{4 z>x&e){35%fxqw^D1%6Nq6?nLST8m|mK6$gFJpJyD&rbQnIEb>3XG|snwuU1r#y73TuvZ=ITuFCy->Zv z2Djg0_?Z7|Uinn1>C&X|7hhK{u=#MbbQd5sP^RqWHStm6lm*W=PB z!|H0P$lO4n_XZABu2B(?LEXqZd_F%oYZaKdi5-&s2d?pL@u}^M_Y_`%>RVI zxKAk4`YC}kpK>M?bwl-MDmc#ZP2_Jnw0y=oqM!2vB46P0ybQh0Q^nZ}1a@EGfOJkp zK!(zg({>@Yfc0$euXYnBsoOxuU=~m#L=l3W2p(=w$tpK=PMdSb5nCIoE8^ zbd}-juCWf&b=pyNgFw*@%B0*P(0-FM@oR1fx2fQ3<(sx!di`yd(Q%vq{cT_A^><{L z`ZX2YzeC`{9sattRjt1*L&|@6g#8YFvp!JZyKmSPm+o?j{jMK8?FtOKM=clI2^?vs zldFS3b_e%`zV(9VferqVVEC~IEW-Xj8gcY{0$abQOwJDkhW@}A={q;H{-{FaA>WuD z>R|baRiypQ4=_E#Wv2|Kk5Td7Fp0pUP7b&pstCwhjwJDr%1*zgCP|7mqPs+I(K@?J zT`H}zyX4pO9{6zfQxe*=$2}yX{ksR7gFSJs=qYu%@gJw;)$}CErgcj)OgEDxnx$3t zmat2^k&M8flNszW;hbj@u=Q!lt)-{6T0-A0)tFUlbuIYxw=z6{>{>Vodc&j42pm+?Saul%XN`uq6#2zCDa7Gt8)b z+RWzIaGduH7kX(JmbQ$<(g`CCQ=d^rX=pSn?L7v8|0)dD$Kt$htbkpkurwzf4>XMz z%gS+B6i7EptMT`(uF}d(y0>D;7Zzq)KLKrvCkQY$4n+vcnm$pK#;q6=o{ljaCmHt@ zPZrAfB+1_}6`vh^jv1FsMWbyhn-kM;zBEnPtIqTfL0)aIv7;IUIbDxz0PIxf1#f$faR*9vw z3WL(#HbPTYi?gIPbYF#`FRx{`sd%HR%s7;VIdukU8cp?gsIb0eE0I?i>v&?k0bXtW7Khc_9f$4y3P za32eOv>$=%`xzWKfOGi)0Xz2MM`}5Y2TF&;(sdAvst+5bo+IKc*HOA}#*mZ8n5`m= Vw)tTJMh>C~L0Jn#q|%@?^#ArlpP&E$ diff --git a/demos/ExpertBasic.demo b/demos/ExpertBasic.demo index e2b62d34d2aa63c1270cc6b0d2be52da89a14b86..3507497222bf482628a70e78281dea7435abaf17 100644 GIT binary patch literal 14308 zcmeH{KT1PE5Qlwe5h8*}ieM$$30^>u1i?bE2sYLtL1Ga?w6GEM1|GuFBcu@z;Z1qqxQ$%%$Km7u6aT|H#DJMXG_4`@C2;0C+OUi1YPG#khy6Ivd*8txv2?U_ugnC z)lVZbED~NO550cnn@P(Fo8Ln{H}oFrbn%1k4Rjz&d+^&P_?sb-o0d zo0cH!{0W?!n!t5stkRhXEA$@lJR-a8DPeAC0&NoOYzdefo`7}s1f83bpzC}IGB+(j z*7*}SH#LFl%2=f{5mx9u;CV!L+f%~a&;;5f*4Yv;H#`CB>#f~@l= zaBgY>*OjqKXCkc7d%*LE?6#+bxuFTPNvyLaU~YH<*4YzuZc2i#^CigKv;lHOTgUl1gx_s=-iY9UFS=XxoHWq&Y!@!sR>+H z#wwkOutM(v&m*$io)YGUCeS9a&X$0=;R#r0Ptdt33A)agAam0aWSu{Ob5j$zu8dVW z6Jdqk1D;1@w>>4y4Nag;Vx27kbHfv`&YqxiQxbHYFG1#}CCEB|0_UbCa9tUzbSAZfvo5VU>0_KJ%V4Xcd=cXj+I$wg!O-qn<{shiVP2jpRR_RQH6?zYN Q9+BPllrT3mfi{VCKQF~%<^TWy literal 7762 zcmeI%F-ikL6b9fdT7(2a#A2}$?F26%NP=J?SfsNKA;egO5G`y3y@7|Y^a$R=tJsLn z+nqJDzJGSu$-M4O;V#aaZ}y)*%Yu0~+v{IGE~l%9i}C$@l3yM6PhY-n1|2){?*49e zkZqlG&UT6`uBYSGV!oJ7dZX%^@bUTY^O~+b+NRmj`|I~lF|yk>2K{Z=DU9KH@ALR$ z6DW)&gqpF$kRKC(FeU_X3`2KqS{H5{u@-t;J`IN1CcO)D_?}vSlXzJ48+Rmx=wtnN zmKgG50uaW8AdX>33riq|CrIDChJQ zrOF|A zb6W5!hv1RNh^L|gi<+10h9eX>Ok;jDeCt^uU`n_=Lsv=TL zKjdE{cB!^)h)7tDAV@62Y94Hama(K6BlqX(p63k`=YFibN_ zBYDfH@|Hoh!Ds{NmC-BGgq4O9Rv4Z#IzZd6~!NW*O0&F8T6zg^f5&>f6d}~3SK;h@n^K;*DG*(H&u}T=8FgigBI;aXdph_}IBE2(uN1Cpp;dB)Y z&l#N~byri>T@BSXqirOslPaqdss%<1NH3a$+|S_ zk!1g=|2DSany9V#dYJ-OTdAQ3Td9Eudt~&86s@HyS_{=7qeCRMjw-bdsyL%K(i@{U zq{(_3PS(RP%P5N!ZlEgM0M#a=O{7mopGdJr8pax7c*W=nsjrEuz9y*l80{fBgn1%| zC^=DH2t6adpU7}L5&ipnV`;oGgUv*P%|Hi?4v;)Y?JzuJbcUn_snUW_Z86$HvUE^o>40jU(LB;Mqidx8P8#-i G4*dt;(i9^A delta 835 zcmXw%PfrtJ5XQ3>Ed{KsRr-AAp!N99WG9ded<53;2ia zTzaty7Z0W%!KfTO^klesG0}sG7qOg7xad6Z$Yt`*@0ocr&t`u-H$H6cSBz~6q6@({ z6}(IsKEIRvrq70=s*w))12t(kSld14bG1W0Fqt9M>;pdN1Kv818oz*A4ttaer}_0F zjK0<{D@XkfeTgW#7lHOZ0`2L5Xg%f|gYf%32>y0RxHY8c*~Lvh%%exq30C+-`V+-u z>(c+3VTYznMX!h98#S@tHAQoow=ZM56aznv32($WyTG6L5{TZn~h91r*X>51KQFkU# z1Iwew7M#CY=v&vs*_z~F84fn7gJqy~Gorc7+t+olEcj_wcq7ZfZs=fB;P$j|b6PcL zbg-F+`qaO+qBr*07e#kGt7v;x&XpeXuX3>QZi>xePSN-r_{TZ$Jx6%m;dt}lC-dN) z1=O8es6n3N<#oI~`qrZCSW6tQ!10!JyaKdtK{S_ndl`PE+j6g4du8E=E~l&LbQSQub>a1O QPFL0Gs^Fcweqbd30m11F0ssI2 diff --git a/demos/ExpertCrawlerDyn.demo b/demos/ExpertCrawlerDyn.demo index a653f93c119416fc252c9df5023e81792883f443..75b9381bf2dba1d9c04fcdaa18df46c28078b8da 100644 GIT binary patch delta 36962 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 X8W^(NkOn?qVMqg)ylqGyD)fHN#+ z1@q^EO^Q~xQQ7WoRcz0#%54^**w@3AJ8Gw5ci*Yp;k$WPv!6dN$19psyt3&ZRqV4z zlsn|4Vz)V|+<~Y0yJgAzc`{wmY|@oY{fc5ITvl$sEX7vKQf}`Y{%*ld{@jqkuRF!fk z*6??=zw_tQT1E4%MY~|7qVij1cae$`ag7z&+rKdt-Bd;S`xhEo%DAnI?xxG$ryZ2t zmJ06#b?HRa7($y2sY+vcz@@v4j;83zChUQhkgg?FHUL^afGQp&Cw5jcnvXz_9nS9k z2c+@`RWKf!JD$pQkQ4KXGJZ@)51YPzTam)MIlpd}fU-8JY@4rP5qPU3INSXh8w zpUMlaq)N8PngOSG;Dw@*Z-2PZ?A~=PIbs&rsXXRM1y>p!|o7 zQw`|04eT0fia#s&9%`hj{FeQjL5-VHJ}ne~gyMTI)ReKm4Z2wy_Sz0mR0qn#0Q#y= zxf;nyR#zFD`=IOhVgG0jg_u*0{h?R=sMNvG=)qLdPreY=zgQvt;a$4$5Qc* z&;Um&#+fJSQ{?o{EM)gt%qE^tjt3Pn7wS5f+CE=Ssusz(7=Z2&z}{&El(L)(S`D>Y zO_c{hD}tz!5P86Uql^~Y(c`wU`$R&jkyPO>Xx=U=Z;zZ<9F*}h0X;l{-Srq$bCk+D z1x-FhT|FZwhN&{%T|f`Kz&`#eRCa|*%7#W{Q#v=HV>c+xzvY2|doqUJM=vO1k9iFB zeXLaab71!~rn(n$;aM)D*E{sgf7!Qxf{Z^=Rn^djYUxDN{E`!NWGrfr-q4OcPY;@{M_Cv{H;pLME^-ptL&gj< z^h#6qt9>DtzLeo0==?xRZ-|@(Tgw;vZ7JPoYLnsiIwv*A}5A>wb>}$tEI^(HQCuo@y^}zi z{yd~P^C-(j(5;1(nYY|W`OBF3CwkQi_KY>q#5I&r2$U8~>93QMkWDhihM|{iXFn4K z*+)@Yd!Qq`DfNAF;ukGr@L}}4L+l5SLl(!W`qR+P)09^V^gWq!KPwO9q|4Zvfo_<= zUXcT>%b}caL2qtS4!7kbC0E9(2k4p)*kAku1^h$VzJMM+r>sikB<`h*1^E8<*1coD zR{?oeP-dT@>oru=cc}Y!D*T5$P*W@8a-+tI?$oHU@>AAt2Ayq6g{VVq)Tuzt#{87a zbY-0EfNs-)UEKgm(5L)5Lu#EV@2+xE&{M`fb97U4_TT-W$bOXjVCc&rD#r?%YDHz* z$OFbBWPBKl9z2%a!4Z1tK&4ECMopv=C(DWU3>i;7(0x7Ft>!{SbEvolQ2zx~^ddQF z@Rf0UIl9|&_CBkj>{V2F5Y#1zs#ynZT1QoGkOy40$mke}o*cm*xC_$VMV0M?mhYpA z56FpKoQ&qj&|{CXd!K?-PEiF((A*>{H$_g&(`5X(f*y8-eO5M9okeBdfF|9bjPF3{ zw<&{r@<3>TjB$_AOCPZ(K7)ooqqIw*qa~C^xt#dFkul^Gdj3cD=xWHanriq8?fOd9 zewP!E-!gitHc|8p73JR{xUj7WWYmPJYyqurLAhu_Z#5}LohJO2Q`^W`t%t6q$6jm% zEit0(xB)*S~g?-WME!lGiLS6$Y^I_19p_GZWoJ82mm_7!*;t%#K6Cmda zlz|I$&Y23G0=1n&1x=F&%4f+qH5=V_HoM0EphNR1|HV+_#gvbaoD>Gg*uN6pY$bc` zS}1BQGB$^!>xZ*{+yRB`pd9x?ul7)>2cgjisiYWrK&R4V2iPtq^S>77hu_e^G!>rl=$D&lXb>)+J&J91K$C*$HnbccuR zot{D|PpF_`s8umlUJk7&r%GPQ1NQG^w5URlt7P~20;ztX3jc%V{YT~floN}389&t& zf3ItAxLQ-?AH=TBp_*n?mIgFggSx8Klpn8QYZ>o4q6c3MLa&Tuzq%W8*-aT9fX?ry^rGb?I9|q>`qgfDbV3$ zD&RcS4cdhpx4xBDJAz+EkdXoK&}!aY-NDQJ-C}Gn8sf1$T#9cc<3&l#@~u87KOoTlZsc zIT(r`MEP1ljjX65J7~Tgl|Nh_u>3>DF9-Ap2X?oK&}SDadnz<#DwQ!^PK?}Syq|*} zG>3h{0;v3dRI)cT(wjQtD<@h@WjtAh?z4)0SP)bgNX4#$`mLi>{(|;wqUtxx172Y= zdhbHd+Q}Za59+*+s*Z*>MpG5Ba^iegMu$`ANhjIYCP6w$ROwl0*;(qvc{#DYB%@h2 zdQ2Ak;u{L>xk2RLMw)Y*vdn{S{8vRZrP7N}!1)l+i0F?IorEMovQB z%NSdYUQ)$=<|}0XmD2hN9r;12|CSTK1{s5!G*|Sz#?6%<@4*(3MGLB46WXasd9{MR z>r(D*_|GRUrFZIYXY#l-U&M`eZ6<2Go596+TNIsPT|-c|N++e0KfC(Ah;) zh#%C(j|vQsld|P9POe3_S<9{-3MGV4ej6dRjgrV zoY3M%M~vFJ2EVSx?z*h93PzS#On-_;48ucca(uV$a!SZ z{WN;TDfTPLkaIF+a2`5$jtad9wY^9MU6u#RGi98*iEew7UE?lv=nmzd4>iuGd~73#(jCg_Mn&|7 zy7s2Fo5)F(g^Y`X&>aS`cd~*~hEYLwP%AsCd?d7DBvmq69; zf<|njbhbgqwo;m5@<2e8jG_C`3-+?dL_>X}l}b+lcE>Z-9g+*r<1%_Bp=TztZ$Aqe zpQWnOp$+NOr;Bpplp&-24fMq8>}zgA+PA5aTxe-7WnTn6E~IQ8$O8%g$XHZ@-cZb* z_Y#`@lCt<0y7`teeJ>}G6*6XgMX&tAe)R|B@`Ez0gU;7ddJS?C+(?}t@t79sieB7Y zUHR>v)`aXdDa}^UVO=Vq9n_>9<=a6XDAJd4pewq0SN6J|(2kyzrz!N!gmN>Nlk9#n zwhTo#7|Q<11`4&IoJK&ehf@Plo&_Q#Lc82h*tpH)x<673(1n zsLYjdcM-bBB6d?h=$bDTxfJTQlnPreC)KNDTna&V3}M&X2&HbIg111ew@_=h$w_I1 zj1zm%t@p6EJP5@fpnT(?MsZZpVQBtgD*vcFV0lW$uN3r%6n3{X=<|6h`w}$e5|wd9 zPK>f;yuXDWbc=n$J*fOHm0SRgETGO5$%)ou8BboI`@CQuRt^=GQL%5Jes3t1573_X zRQ*SJz^htD@Bh%VzO#q@hC2VIsvDq<4OE2+|7DvC&P`-=(9lryBy|ntx4c#d($S$x z+d#|OP%qlaiLIWDW?j%@IDX^mcG#hzgg zO|++sMnh?%DE%>V5;8%?*h%Om6WPy9gY2hKTCUKMS(LiFocPU_F?b<*-U9Z6K9GeE zRUZKD44}MLK;M^B?knYioV7Bxu17aq&tCBtwC*p;c{}uG8|4r#Cn-B*tlE#Rxu5+- z3=|MU*&c!(CQw#K?kMN zhBBUZL-*~*Zq*wq>P5wwLH*6BXbU-M=r7~;Fm$(J?0xK@Y+EXPB-CXjRWk=y0J$VXy;7mw&CROGREqAAiJ>|r1o{Z++=&_60z5O8-f2v>^GrZ_9;@a;eHfXni5&@(6nS zkaGM-9!PyIWA#gPt(WY@Z=oe`DZ7u*qYspIg`C9K$XNITz5YM;+*-)1mNHk-Qv4(4 z8(PYb*QAjaKi-I@GNx-P^4sjIKYK{o`~f zWIE;O2EB5nQoW$jUR2T?c|d1@jAy>+e!lG1OQHKqsQ5pj0e@04t9X(gB&T;aAiHm1 zHrWE@Y^EZ@psr!m_6Rwt+9~7W0d$80?49DElvpb0Fx2WWRel^=ahxhSDG%5u$!L*= z9(SJI=MtoPi7L#1=4DWMS#n}=L&nd$=;3$ST??R^d@Ab!H2DE_^^u$yK9ljT3_Y-n zef%4!>@}729vbnU(y4@wRZyDM@<6~>8AE@g7yM$6X@L4RD3z|Jt-$U^+R87vuCX@1 zWX~2ddg-8NYO`-|0~xoWsyaX$I#8cF$%&JZjP^ay6T7po=>uu^p-Rl5rRJ1P z%4VQEkT6unB75`(JNCR$(Ckr^#W?8ZSju#QoJ2aym@y5#aw_}PS&+*t%Fq)!??LI! zmXqN5GRF9z7kjgx4uI?eD9shn;pJ4oYN*L-%6F|iP!uBLz+dR*f3eqXgLZ7AJR_lR z5tQ2wImzB5V@nLWK@9t+1Sm9taykaRK1xkEAt%XaWUM@gu5ph2`31=T0%da*dT@nG z$c6@HQ?b|N0hPaH+|5Jx$YVFX4_zywA|FHD9#dgYnLAU9fcaH>L|b7q9)M%CRBbi9e&G}8Zv&hLXT+0 z?$#dq+>XlDgQn+QU`yGKgdUEdtVYX8+&CEvT+r*B+3!t(Jf~1*GokA=+yE_%`DG$`lm2r77 zy3=BIeShez9~H6;YO{|Mx|VaMqQ>7ugZybj*O>& zqx=5NZj}oa-J{|Pq5g$b^nE#Lcr4>~F}hnZd!Lt3b~zRP7V7ers`&tI`ao5Fk_TLB zWOV$2p8OwsU@fFut5jNv>PaX&zBx9TndZ{&g;&5pAa7z0R z=;&xlW2~I`JIEL^89jdzd-Qb3ayr%E3hi>GYTf0;V~&iTi_kL`vTyT+jC`reCD8gM zl*^yc+ZB}KDtRC^P{!&F=vo`ti#J0{HdA(C(4*~?b%dP6@079d0DAp?_S{&=E0!`p z4Ba?HnH-gqh?6p=r=V9PvtKz6IiIHtE6?-RpD8-Hn8U?i)MU{_*R*a=e#>)ft z&N5m|Lyw!v?lTKgokbOTK=VAPJTE!1m@ng}H+r}?yK4Yc<4JHo9gCnecgO<)dt?laK`)4Ak4b>~CMcDD4A^~?sqVO3 zc%G5b>l}LKS@!K0Ama;E)fH&N73x!loH$*R(f$s4;%)Xdd60Gq*tql}eP&^4y8Kc4~l z&!BAFp$BeM!fa^ZY$|rHJfN~r#$7*j4?lL(Wze;yROCvi+e#{IwVYH3$+)x;-Ekwk z-c~4e3l$s=wGOA&M#@R)E*U2dqFWziZy688$5FmVphiciq7%^k6IA{wdB8GR#;-K= zh%|P$%h2abRCXpbC6mg?mJ_3!GTz@q54y)bp%5xBppqX#BOg*{9?OZ=a~V&{(S6F< zhrNXg-%zn1pne}Hl`3dYB~@Q74|si((YqEs>$kF}g|$)qHALq&%5S$?O@X}|)u@Ul zZTKZSx0KOA7d=UbeQjGvr!7_55n9%fdZ8yLw#G7=^+b>9!M@l;p*MJ|)6q+&v7d2;>|H4>FX)IT zr9MYa{Qf6nurGR^5BtF-ki`YhV|UzZ1J{+4k$AKfXRUH<`e_C6Kz57g!#D)6bCloiW3`5N8kHM{zIDB&ID zR{^P2P~KH?Qt(B_zF+93zu14*Ly`5Ad!x1reNkQp zKBJ)QkyQ9tsLNQY#sS*oKvg=)11^(gbex5rJd-`p1Jd=N%H}}J=TOD-`RVM@S0KwPR6`cDD~qblkrR(wGJ58r zXXLVPD}s!QsLDss`bU(@GwAJ8%JGFfkXj~V^}py^|FRcuJ#?fCUZsmqwz3cX5K@!N`?(GHr} zjxy4N(mGN4267V8S;p92=p{Yb&zM5?rj%A+=!hky-d|4q2Fn<1i=Jo0esBb2F@mc9 z1KRlqFpx z{t@WxVJhSV)aC>gcuG#nl4P7rL$^s|SHBD;T%!CkA+=1(J6lc)Zpheo58d=0`|koM zvVd}b2z_}#B7owZA=f~U7LdIxU zf}EJU$oMf0J!~5LELW&{7M1AAP3<=78;)t5>g1dSd>b;-ZL4Db<7PbE(;xfz=6p;t_i8PBP22J& z(2!BvgG^`@_*TdbZE6M%)oNhS(1H3T{t;wDn;(G!-w(OzNZ@+^vno9&3x+vaFwa9m zU>*{}^TSY>ABOT=I4tJEVLdMlk9lGEzw^dO|GRFCqG8?>&2zk% znB&Ft+$T2XKCwODjEnhZT+g`^V9uSu^UOq;XD0IeH3{agNj%p`j=4s1&s$Ss-kQ>L zv^1EbrSaS)9p*0SJYUR!`CJrHU&MOER6YNVb7_HVNPAl^T-mIN0#vXtQ6*Fr977?i@8Ku&&$eV zURK_7uu7PNRr1`l3g)I&JRhuv`Cv8AiECm`T+{Qw+L#B{_I$4{=6iKL7ifUFKm*V7 z8eyK-$n&ozn140#T(>#qy3IZBY=L=a3(v7zV~*Y0bI-Pzd$#p_tv%*z?LFt{ggHki z&(peKp4P?lr*4=(b@N=cC+4a>J#Xrbc~fuCk^5ne+|P5z0hl`u@O*9%=5vEQXBdh( z!%)xThGQN#-1F;^m|u_dTy_lRvSU228i#q+IM1OcVh%mgbIZw?TTb?TY%1nsQ$44c zfjPwt&%(WtbZ+^So~b=6x$X zCs>6!!79)F)?n_p#`EoUm~XH1oOdJUyc<2w-i&$nX3yWZV*b9>bFJ-|Yi;+uZ71e! zJ3YtPgE__?&)xQ6?zYeK6AMl*@Fy^d>Jx@N0dGb-uAC6=GaNKjHQvl;!g#wAVb3zJYo44bLxbVSaJTbE&(SOWpOn z;y&gT_dSPrggL|`&&{7;ZvMpc;b)i+Kl7aQCFZ0rJr913dGKq`58h&a@YZvo510#m z@Vww7<^>-;|M`sh&u7o|zhSQb&GYUbn0Np19QQZoxWE6-TY3lj-&y&04!98*`~Pc0 zu3!YUVMYjo+VCY5L2alWmY_Cl2~SWPqDCU94V|M9)P@Vu2x>#7m;|+9LTrNC@HQ?% zZ783Bpf;>YL{J;TCMBp1t&As8-A7|s10?>64Ztr#5rUbR2Lvw=KaJB_O zZAjmmpf-$cOHdnLwI`?zWjYbmhLv3iYD1{*1ht_>PlDQTlz$}#s13>c@rK$kbO1qZ zcr=KhHWV33P#YEvC#Vg9MiJD8hGPh7!`^WOwITjQg4)n`GC^&)HI<+?t`23cjHdOmSP#ZRXB&ZEhz7W)gPTvS>gMKFX--l&@+K}-# zLH!rDjK_zBN}qod7<+))P%aojZCD+Gpf-dFO;8(Jg(avB$HNoUhLn*AYQyj-1hwHw zG=kbtEG9v1SQ49{HUx=BP#YR2AgB%d6A{#ggh>f%L;vIiwc$=mg4&QT4MA;~la8P^ z{K!C18)|1Js14h*64Zv6IS6V)_gn7y*p{IF3tKy2SNeQ|PS^v~hCN*fYD2v41ht`0 zPlDQTvo}F)$lZ^iHq0DAP#eAuBB%{Dh7#0#H^#rw{=|+OuaBwq0ZActIP#XqrC#Vhgb`sQv0(%H*!@PY2wc*zRg4$5` zFhOnDd6b|w#6Ce#8+x81s14W75Y&bo=Lu@Vw2K6_;nQV;+EDcxL2cM{gP=AQ1$8)C#Gs14l`5Y&dti3n;#)}#crVRCYU z+VCMIL2am%hM+dAPe)K2B4i|}4ec@$)P~bp32H;y90avtbS{G0@FEXEZ77wWpf;>1 zNKhL>6d|Y$&5IG#hQlQYYD3b}1hrvsS%TW|pgcisC{&4{HY}(@P#gYKBd87aYZBCk z-L(m7L)>}rpK z+Hj!@L2by?ouD>M=t)o;-u5P_4dwe0)P^+!2x>#v!34FT^-zM^aAG(?ZAdkWpf-#c zLr@!@jw7fI#U~QfhNY7UYD3Uz1ht{b41(HlU=~4bNHmwAHVl|gP#f+pB&ZGfmk`v3 zxyuM@!_O52wV}=`g4(cS4MA;)wVt3h^w>yH8?J69s14Zz2x`OB?F6;q<4%IwP-PE6 zZP>Vvpf*H0NKhL(944p@XO9xphV&;0YQxx51hwJS8G_nS<~%`dSb344HiWuDP#aoY zBd85WZxGamP}1oipoL9hp?4PAo~)P_qT z2x>!?&;+$%Qdol8@IE|2ZKxQDpf;?FLQosRM<=KaZDSJDhEuT#YD1cM1hrvQ0)pD` zJP|={D4CR?HY`t0P#c1$BB%|`(h$^!L+J==Lz0XHwP8?Zg4%FDD?x22n1i4;%+Ezo z8-C{@s15b<6V!%X1qo_HoFW9Zp;s}2+Hk!DL2bxcnxHmJFH2AxK9?t`4b>_U)P~Jf z2x>!=>IAi+Q%!=}aK1J{ZOB-Upf-$eKu{arG$N=C<(d-IhSkjpYD1Wo1ht`6Yl7Nv zye&a(NZEm)HVp4XP#d0fA*c<-x)aofB|QmhLy$fMwV`o8g4(cu06}d?IGCU|^dCx4 z8}1Azs15l>5!8k`V+d-)k8uRGq4q?A+OT~xL2ZaRji5GkpFvO?uFN8+4cX=r)P^bZ z32MWC3khmNS9+cM;TvfA$d6h9mn3YD2Pv1hrwvVS?K5@F+oTD13sTHY_|vQ2&LkXR#}N zzQK9y0cyjZiv+bH-W7t{(B~RKZMb=Zpf=>bO;8(V-X*9FU+)vth8m9uYQxqi1hpaB zbAsB?LAzy)P|A42x`N#5CpZML}-HAuq-S=Z3q^Dpf)s(L{J+JMj@yTiK7$LhJi5& zYQw$Q1ht_+Jc8OVF9AVq_?3vDHq=c@P#bn8C#VgvQxVjLo@oeb!?kn-wIN4Fg4!@G zGeK?ml$D@1RLwz98#d)4s11?x64Zu{`3Y*nxq<|>Awv;@+AyvdL2YZ zYQw(f1hpYSOM=?auQfq!xZReZHstLeLokma_ zM$aIq4KHR9)P_=X32MWN`2@8g#3F*)(0mC&Z8*G)pf)7^m!LKbUPVwF9;_j#4TaVd z)P@Bc32MWi%>=cfegHvj*u9;gHpJaUP#b#hA*c;E_7T*ETn7ni!;HfOwc*QAg4$61 z1VL@sa*CifL_JGT8#1%@8Q2ZT1ZCLt&pf&{kL{J-=d?Ba}2fh*1hD1LJ zYQuov1odCoayK|W5xpDS=ko`_9-ubN4MtEKeuf~Z4Rt~j)P@~l32H;E2n4mEMs;rRf9+E8*ZL2Xz*l%O^QA3;zXnvEi;4Tr`M)P^ME32MWj zi3GLb{$zsMP;eSSZJ0lUpf>!TMNk{+%_XP}yXF(rhB%7|YD2Fj1hwJ%GJ@KW^IwA6 zFntw4ZTP%~pf*%nPf!~+ZzQMwu>Au;ZHW1a zpf+^>LQos7d?Tn0*?tn#hAF=Z>c6n%Km3v+rO#Imf;~WO*bt1MHbe|bP#fBZCa4W( z!V=VmbP)(@!GKUTVh>Oo_GBig4e_!O)P_De2x`O4Tm-ctcV2?p zFf%_vZTMP{pf=PfLQosF79*$)(Ml53hAyQEYQx2{1hpY^1%lczu@XUTcvpp>HdLri zP#f0PB&ZGH>JZe1HuVTus13o|5!8mJ z9SCZ}!A=CVA#qoN+Ay#?L2bC#lb|*f=tEE&=Jg|}4Zj8u)P}l)32MX6p#-%d_6UO7 z&~p?)ZMZgupf=WHVg|Os11*|6V!&H zy9jE-;ynblA@F{J+R*4AL2cM~n4mT!I7Uz#`kf%C4YyAb)P}rg32MXa^8~fw`$dA< zQ0odoZP<2=pf<#~Nl+WQ-6p6Fm+unPhO7?=YQyA51hwJA6N1`M={Z4dSpSlsHbi(s zP#fC4Bd86hKM>T0w4VrS!{{#rwc*7#g4$5(CqZpk@tdGFgb1YnTKoTh<7R-`&^!o1 zZ8#i^pf)58Nl+UGhbE{E55f}EhC&etYQus^1hwH$6oT4NKRQ8e*d3FgHpGoXP#b#3 zBd85G5)jmeT!{&4!;GW^wc$&0g4$3$6+vy-l7^r*L`_dn8#-qss0|k~6V!%G*$8UG zgd7C5;cYI0+E6|(L2X!*pP)8`EksZoS{EUx4JV2b)P__g32MWL(gd~PX<35WP`m;` zZCF}~pf&`pN>Ce`R41qn2Wk@3hD3D;YQunf1hwIA1A^L+zcE2=nA?<~HvDW(P#fyB zB&ZELS`*ZUSnUXELyrywwc%_eC$b38>;jns0|zY5!8lA0|{zF zhrtB3;p|X?+K_$(L2Vd2il8>U8beSU%8Vzd4J#)S)P_(~2x>!%X#}<5=nR6|kbE{l zZ5TS2pf)_3Pf#0*EF!24i$ zLQorK1rXGRZ`%oKL(N?TwIN^+L2Zb>pP)8$JxEX+E*&PQ4Oxy6)P_kX2x`OoQv|i4 z;#q>)uJnKhEcZ(YQyup1ht{$1A^MH{1HKI2>z6y zHZ*%qP#X@tB&ZEZ-VoG=LGK7^!~G8gwV~iAg4!_u3qfu8{f(eD)cZ+L8+QFBs10!f z;a9W=s13b>5Y&e2!3b(Y&X5GPVR~qS+VD9nL2alOfuJ^Qjzmx!qC_RA4V|JB)Q0mh z32H;eI0Us}d_02M@FoF4Z77$Rpf;>dN>CfZq#&pbtx^%xhT~}nYD3EO1hrv!MuOV# zBr`#6D3*<&HY~|OP#c2eCa4XK^AgmC{rL%ML&8D?wV{6zf?Du6WWb$bp&I?~4_Ip7 zC{&U+)P@D632MWivIMoEeg%Tsu)7jLZHQZypf>cbPEZ?e)Fh}4x#|$qh8gt;YQvWX z1ht`hV}jbSr71yei24sfZRp&Rpf+4+O;8&$wIiqv6FLyohPRyvYD4+11hrvJcY@jw zwiiKdXx)dPHk{~3P#aPWB&ZD|1{2hVr$Y&9L-7#=wPEQfg4z&tEJ1B(GM=C|9GFN@ z8xl<+s0{JJYD4<{1hrx8L4w-w z>M%iVD07UUHmp2BP#Z#>Ca4W9&Jxsyqvr`~L-I=mwPENLg4*!t8bNI+a+9DoEV@ll z8v@-Us0|Gt5Y&dfj|gf*{HFx9q3?5o+HmV7L2bzMhM+dgdPh(jzI`C54K+Uz)P{gB z1hpahcY@l`^(R4Xxb&N#He?AD8lQ`*4U>Wp)Q0!L2x>#ckOZ}1U1);Z5I!71ZD<>T zpf;R}L{J;jL?x&VqoNbkhUYN}YD3951hrv#Jc8N~JRw1CXqK3uHXKSyP#cn@AgB$4 zQW4aK`)LSjL&5X}wPAing4*yqGeK>rmyMt{?8-q<8{*_9s13dH64Zw4`3Y)6&O!vW zVR{jQ+VHs;L2am3lAtzhE=^DyqLd@34V@|w)Q0nw2x>#dssy!Re074_@TMj~Z75fV zpf;?oM^GEWG$g1Etr`>5hT}~MYD3C@2x`OdmISroNo#`IP^=w6ZCKKQpf&{QOi&vd zcO|F|`@0j=hJ?KcYD51%1hwH#KZ4qjZy-T!m@}B5HvAY$P#bEGAgB%7M-kM9m}3cQ zL-+9nwc*M{g4&R63PEj{GL4`%{5ON3HdLNXP#ZSPC8!M%7ZB8j_KOH=!sD7}`THvGGupf-fuL{J<4*+Nhojsy_YhGaVkYQvCS1hwJe9)j9X zct1gHSa^`2{tH`=U|0HlgJakO)P_AL2x>#T(*(7l&sl=naPvGtZODCzpf=3BLQosN zUL&XtHEt5rhOM^=YD2Vp1ht{d1A^Lc@ex67$o!O`HcWg@P#fO8B&ZD)-VoG=weJXO zL%9D4YD1e(1hwJh7lPW5`a3~w82OW+Haz=HP#a1F3WJxZ+ORALL2U>YoS-%|4M|WN z4u&SE4T-}M)P{i(2x`N_jAHdIYdP#ZR7B&ZFMvk=sVj@bxm!?_#;wIM@pg4!@H zFF|d1ou8mKlr2P18&(w|s12cu6V!&5B?)T7vC;&!Aw@ZY+AypFL2Yz4S{PB)P_cN2x`N=dIYs0K|_Mt(62E;ZMfZ(pf=?FhoCmhZb?uZzPBc*4Yk@4 z)P`*x2x>!&&IGlgTUUbGaJf4{ZOGb-pf*hILr@z&^dqPZl?D>jhV_F9YD0u!1ht{v z2!h&hdK5uzNIRCGHjExmP#a!MB&ZFgrV!MI71Ic6Lx`CKwW0ZJg4%F+ES~8y+kns11dd6V!$U{}R-OKdT68L;bY`wPE*qg4z&w6G3h0y@jAQ+z2434Y_s@ z)P@n#UiK;9pVtwhO_Yq zYD4;j1hrvoVuIT6Dk(v2D3gMqHmpoVP#Z#}C8!N8(i7B%qZtWmL-H&HwP9#Bg4*yX z2SIHplAEA5EXqqz8v+#|s0|GZ5!8mgMF?s`{Ne<)p>Iio+Hk8hL2bxWj-WQosz6X1 zzEvWq4K=G0)P{iS1hpZ0ErQz6wGKgTxKxjzHe_i?P#Y#SCa4YXn-bK9ivJMQhIK6o zYD4%o1ht`UJA&G9ssll7NYk01HjL^@P#d0iC#Vf2dlA%z<$VZhL-76twV~NSg4%Fs zFhOldGK`=$3>raD8}5%Hs0{_j64ZwI;|XfR?}-Gpq23gN+OTUHL2ZaLlb|;AnoUp} zuFoZ?4LKJO)Q0Jc2x`OUB?Psh+H!*0u=!tt+7M+mL2c-?mY_DAUr$gQGHxQM4db^E z)P^?!1ht{u4uaaSdKW=$2(y=WG`>Vo8}?rzs0|6P6V!(OHwkLPo!bPpA>TcM+A!w@TVHvAibpf-ezOi&yCiAqo#jzlM@4as5= z)P^B(2x`N_cm%bfa6*FGurM(}{TH?-!>;uC1}U%ys118k5!8lwX$fjWpY#N^;bumH z+K@X7L2a0sji5Gs%|TEbYUC!U4O{aP)P`sU2x>!@LIkzpViAJckhwTPZJ1b+pfL(_in1hpY?8-m&}upL2dxYvQ8HWcVgP#flTC8!O*x)aofy1fW$!_Gbg zwIOzYg4)n?AVF=oHkhC`WpQs12V+5!8mNV+m@*rtt)|A@U@G+R$+dL2WoU zji5GUm`P9@#?2#%Z3MNU(GG&zux}SZZAh?}pf>c|Pf#0fA0(&^d5;j(hS|pm zYQy&v1ht{oX@c6Y?JPlUh;f0SHgvm0P#Z2^A*c;muM^aU$u|jV!-v}hwV~2Ig4(eD z0YPnu@R*=Bw0lZW8%{qbs10df5!8m!ZwP9`i+2RIq11l_wPD34g4z(`D?x2&{+*yU z9R5jA8bge0g9e?k+~hWgIn&I!TL2WpZm!LMJDnL*hMie5b4Nr>@)P~~4 z32MXAk_5FOXc>aq(4-teZ8%VYpf)6`Oi&vJR3)elcdHZBhWxb%YQx+*1hwI3J%ZX$ zry)UY*wL7vHpFU1P#b#uLr@#8wj`(x+1n7*hN%Qe!>hprwV})~g4(ch1VL>GHJYF{v=~cJ8;*`As13;{ z5!8mEQwVCqqiF=Sp~y^v+OTLgL2U>$kDxX*TtHA8_AVl*4e^%})P}yx32MWwe+gn1hpZ{UV_>%X+J@2cz=+f zHdH)9P#e}ABd87GPZHFIwxO|bwIR&~g4!_Z54g0eZ)P{sP32Hy{LQorO7bmC<+e;GEhL~jtYD4#O1hwHx1%ld;tujGvm{OIXHvCtepf*&lMNk_y z)FG%15$hAwhV~5!YQvev1hpYuGlJSM<{yIE@UkUAZ7AJ_pf>#5j-WP#>_|`>{^?9m z8;*1(s13<_5Y&bty$EWThK+OTjSLH!rD4#BSU`3A$V2dE8uMiA77c%unw zL!Yq(wc+M?g4&RK55K+K_oE zL2a10oS-(m`^BzHMxb}dcHsp9rP#dN_C8!Obo)grDs;>xY!=^U`wIT9* zg4)pWKZ4qD?h`?6$nce*HjMjDP#a$VB&ZE#{}9xMRe>VnC8{=r4oXlPS_UVm4aY(f z)P@vc2x`Nya0IpCaRh?eP&6_@ZCD(Ypf&`KK~NhS#UiK;`{EGPh6M2mYD2$-1hwII zVuIR`HyJ@~n4N;4HhfP-P#bEcC8!PC(i7B%7?}uaL$@phwc&C$g4&QZCqZqPoSUFF ze8@{s8!8nbs15525!8kVMG0y{yW#}3;dDuY+K{#kL2Vdaj-WQYs6bE~N>wJP4J)b= z)P@i>2x>#~S_HM>a2{K~NiJ^dhJYU-}T#hU)zZYQvU+1hpaR5Q5s!c^E-$ zxG;jCHe?!2P#Y$UC8!N=#}m|s@{A&pf~ zs0~No5Y&d`?+I$d(EkW(!=q0GwV}vYg4(d?J3(y-^oyW2H2gzQ8}Awg~U+?b#?RBJ|18#ez#P#dDO zBB%|W+7Q%+^X&*~L&lB-wPAc`g4*z=D?x22*Mp!otnNin8^ZJ@s12?96V!&|0|{zF z${_@`VfZkD+VErqL2W2DnxHl;8B0(bf=nQ&4UH!e)Q0_22x>#Z=>)Z*|4f3~aA!6_ zZOAu|pf=1|Ku{ZgEF!24wU-jqhV9DP#gZ+ zLQoqjZzHG;8+H)XhKRcfYD4?I1hwJJeuCPN?hrw37;}W6HoQDWP#a30B&ZGlo+hXb zA#Js|2-S$aR9+@bD%;Y=S zo~H!0A>Ipu+R*0}L2bDChM+d&eos&vX8uP|8@_%bs0}r~64ZvR-wA3%v|j|Zq01kF z+Hf&YWV}SxhRi_;YQx0f1hwH^NP^l>Aq+unSR0O@HiU~vP#fArCa4W3qY~7H)G-KZ z!^l_!wc%MDg4$3bK0$3*mXM$}1WQ6t8=58~s0{~G5Y&dmsR?Ssz_bLl;a+-z+E5@9 zL2a0qg`hV4%0^Hd>gFV<4Lfra)P~sk2x>#m0tB_;S|NhkkfSI;ZJ1V^pf-FeNl+WA zmLaGOo5~T?hR78OYD34$1hwH@Rf5`(p$0*17*~s+HoUGwP#enDC#Vgp8WPlo&`k(x zL(66awc*%51hpYWD}vfEtPMeJc-)SlHWckhP#YF^Ca4X8yAjleMm-2>!@gbwwIM-Y zg4)opKS6D{J&>R_nJL$65$ zwc+{{g4&RCIzeriK9is}e4b5E8>-DCs12JJ5Y&b!iwSB&r=A$3K9+Ay**L2YkYeP^Qezha04Rt#b)P|j% z32H;^ZUnWVXAgqfaIF_XZOGA=pf*hFPf!~^4J4=yRfiDNhE2l=YD46a1ht{#XoA{s zZY)7<$S{GRHjJA@P#a!PA*c;yrxVnMRWk`{L+CjKwV~xag4%Fw0YPm@v6!GX3|mT2 z8y+tws0~F|64Zvps|jjD;B^GGq0t6{+OTgEL2XE|m7q5C+eT0uZtozd4S9DH)P~u6 z32MXl{RFk4)**u0u@g4*yWP*l7`)rR^(32MXc-~_cHZYYA< z&^ru4ZMYGRpf==+NKhMQL?);WU!oG!hUzg0YQvUT1hpY*T!PxrIX*#cxR8*bHe^ad zP#Y#BBd85;QxMdK@~H`G!cE8%E?Ls0~kZ6V!&{ z`3P#m(gFmvA!uQO+R&sZL2WotoS-%&Dn(Em29zPF4R^~C)Q0>O32MXK$^^CHXH|mQ zP^Sh#ZP-zZpf<#+OHdnn)F-G7R~r)4hU`rUYQxlK1hwJgKLoX*N-Kieu(1t6ZHUyK zpf+^qNKhNjb|$C|>AMlshOs>eYQw8u1ht_|UxM1OvOhs>2sMbHHnbQ*P#ca8Bd86@ zM-tSAp`!_E!=teTwV}uag4(cX5G@MRQ8}`m5s15Pw5Y&dg^9X9gtpxF@COKLL)$|Hwc*qeg4&SgI6-X~b&{YqJU>lP8%mxds13_65Y&d? zmkDY^v#SKP;m~!0+K}WHL2VdxhoCmxzei9T3O*#L4f7up)P~{7g_Arhg@<4WGXg)P`!m2x`OTKLoWQO5kXCi>eKsf)dn* z^T7#fL&i`9wPAc1g4*yV96@a;7m=Vgtd2}j8^S~*s12=R5Y&d_u?T8I%D4ozVR(Fk z+VCVHL2W3OgrGJoNk&i`f}|v<4UJP1)Q0_O32H;a32vZOE6Mpf=3O zNl+Vp#J_5`(INJoO&@USyMZ7AH0pf)V*K~VpNt-Y};eZE0o>;Y=Sp8f>2A>JT@ z+R$eRL2bA>jG#8;9!XFeW{xJP4PVC+)P@=p2x`ODNd&ba+Ejwt&}BM7ZMZm-pf+Tl zLr@zg&LgM|?-mf$h6;-bYQx&41hpaD3WD0uW+g#wIJugjHl$uhP#Z>WAgB$`HWAc@ z5?cvs!?JAzwISF}g4)n@H$iPUxR;;RPQ1u}}ZP@gfpf*H) zMo=3%z96U#=Ux%ih74~BYQwnq1hwJye+0Fm>}P`7u<9#8Z3z8?pfX%P#e+~Ca4XgixSj^7sUx`L#a{(wP8gW zg4z(GJV9+}UXh?S9Ii}I8#F_5`(IMn{6$@TD_BZK&Rjpf+sjK~Ni__9mzeo%<5h zh70`(YD1<$1hrwp5Q5t9b{IizC_j>*Hmn&)P^0~2x>#DodmU^$8Lh!aCI+1ZODFrpf*fBL{J+(9wDd=RgM$X zhK(l)YD1(m1ht{VIfB}7_5wj|NPn52HjKSWP#a!dC#Vf&ZV}Xmm3IhgL#X=%wV}mB zg4%HOF+pue{*0hD41GaR8y>wPs0~Hl64Zu8?+I!{ppOK#q2XtO+OYR4L2ZctgP=C_ z{Y6k4Zv7#s4S52`z*|&pm=%1ht`Ac7ob)C?`Q}NRo%3HVn!~P#f+SAgB!m3lr3a`9%q8!|&n* zwV_@qg4(dF3_)#(Q=XtU^r}cu8?IL-s0}%*5!8n1H3(|M=UN1{p;}#n+OWAkL2ZcA zh@dufYC=#O&Nm~d4H;Vy)Q0h`2x`NdHUzbyTzi7ru(~5bZ3xqapf8typEtYY}i0h8zOEds15D664Zt>+X!kyx}5~IVa#rV+VFBOL2W2~fS@+~dx)Sm zggi=68~!;?P#cb%B&ZF^&JfgwA?FBc!@~;%wW083g4(d~Dnb1hw%)+5^!Wz2um`9O zd+rd_hIsc0YD1rg1hwJjV}ja{`x!xPnE8UBHhg_WP#bEzC8!Ns-xJh^Xdek`LzmA4 zwc+Adg4&Sz2SII^_=})6y!%5?8!7~jiI=F_ur??`Z3q{Fpf9om6o73)XhLp8+K+Qs132R64ZvC*$HaHwVVXCAx9p9+Au92L2dX{fS@*1 zElf}wHWekP4UtO_)P|0w2x`N*G6c0DLwSPQFs>p&ZFpUopf;4PMo=48)gY)1p=%S= zhL&{+YQwSm1hpYWBZAs6tO-GFc-)MjHWY0^P#YGvBB%|4+Y;1)YQ!YqQ?&~6SvZ8$xTpf;pkNKhL_FD9rBFP0M2 zhEgjCYQu_^1hpZ=8iLx;d>uh;IJ|+NHYD9lP#XqsC8!M#wh`2ZLOTg+!-Cxewc*cR zg4$6306}foeTbko#63z-8+sons0}wx64ZuVX9#M;jB^CF;mZYr+ED#6L2cM_m7q36 zy+KeLI^QCw4HxbZ)P_v=32MWHhXl3Z?PG%4Q2rS~ZCLYypf-ekO;8(Jza^**C*Bj( zhEyL3YQu=n1hwJmSAyD5{0Bj8So({g{tH`z#`@nEr_$$}1jZhqHXPuE0JR}e2;NW| z281H04R^y3)Q0@w32MXKhy=CaXJmrfP$wEeZP*cmpf<#cO;8(p#3iT=SK|}ZhU|$5 zYQxkd1hwH~GJ@JrB_%;^*qEB2HbhECP#ZdAAgB#zGZEB=^jQgN!`SQuwc%Axg4$3f z4?%5MnUA10gepi-8(I`5s0~Mp64Zv|B?xN6&{71o;ZYfa+EAoCL2X!6k)SpNszOj3 z8df8y4SQ=4)Q0%A32H;%x&*c1R(*onkf#wrZJ5=Bpf-GKMo=4Swjiht0j&sXL-e); zwV`W!g4%GYBSCG*(uJTlOzK8Z8{YRIs0|f+6V!%veF#{$pp2b*;InsaA-O~ZAdbUpf(JeLr@#;&m*V} z1s4+3hWU#LYQyiP1ht{w3WD0OYb8N#h_i;EHuPFYP#dmqAgB#FHxtx`>01eE!{==T zwV~Qhg4(coH$iQPvX7uPbUHv#8_pjhs0|s964ZwA#|dh~o09~!q1+jQ+OYZ@L2U?g zk)SrTx=c_Tj$b9H4JmIB)P~`=2x`NVI|Q|%*nNW9u;d{@Z3yy&pf)sqMo=5}zaXd$ z311V`hW>8}YQvrP1hpaGM}pcg=QBZV`0P#d=YBB=kumYA{e5{((#=eq~S z9-uZ{2})2KvV|b14O2o9)Q11U5Y&ds;R$NPhKK~UAz~DQ+R#24L2Wn_gP=B~i%n1) z#>6G44KL#p)P~ZD2x`N>NeF5~$m9gI;h&TQwc$u=g4&QQ9YJjvl7XN$Jj_H;8wzJ7 zs0|CV6V!iUYcA|cpKp){dw|-oCm%s=h*yxHHuNb>P#bO*C8!O#OAyqCnWYG7!`Ctd zwV_6Ng4(dPB0+74R)wH8bg4#A8!px$s12EG6V!%@bqQ+2yZQvRp+X~q+OW0>L2U@v zoS-(eX+cmMPPQVb4XN7_)P|Am32MW$js&%#L>GeEu&f(FZ3xzrpf)t^O;8&S_9dtd zi3bqWhJk|!YQw!D1ht{SaDv(}ZzMr&_%)iKHq;$QP#bnmAgB$oCll0$o>K{G!?o!I zwIRnWg4!@`4nb}BG>@P*R9#3=8#XN_s11>q5!8l`D+p@Cxs?R9A;TJi+AwY%L2Y=w zfuJ^&-Aqs$R&6Dy4WYLa)P|Nj32MW!-2}BE#Xf@CFzf(9ZFqc$pf(geN>CdXA19~{ zflm?ChDK)yYQw&B1hpZ-MS|MU?=nGcxP6tNHsrlQP#b37BB%}D?-106TK5TR!?uS6 zwIRk6g4)pS89{Bh{DPo1WPMFg8z#Rcs0|<96V!%E9|>y1`p*QlA;LF;+R*L?L2Wqw zi=h4sThhkCJ2Y(^pC264UBHmnFmP#Z#oC8!O}!xPko!x0H;L((V& zwPA2Hg4*yP20?8o6q}$nEQm``8~(&6s15ZK5!8m=NeF5~+~fqcp?6Ax+HfN^L2byD zj-WQo$UsmVzGNb(4b`&})P^nD32H;sTm-eDa~^`)a3LQ-ZOBxRpf*e>Oi&x%7A2?+ zLGx9DHSi+Bb4s;@aZZ+ZK!&K zpf+r}MNk_e-zBIG9q$v=hI0=IYD0!61hrw@GlJUi`UOF4DEpeAHmrI}P#Z#jAgB#3 zKN8f2W1k6XLyB(%wPDx~g4*!-7eW0OwiJzvmuS(rKEF6H_5igZa4>?}&?p2!ZP*uz zpf)53OHdp7g(s*Dw<8kNhP+V-YQyYk1hwIN41(HFD>gxG*cO+dHpECkP#d}>BB%|Q zlMvK~tjP&#!{n3%wc$f*g4$3i9YJkapMjt@M954~8`@{*=sX0q z;YB`z+EA(>L2X!3n4mU!eK~Nj&*Cwb9yXz9vhPVv~YD4cv1hwHt6N1{1t2se!n9+iuHhgJCP#dbZC8!Ns z+7r})`~o z;lxOS+K_4tL2Vc@j-WO?oj_0!D=z#M|wkZ3+ZZ5XhS zpf=oHOi&y0FC(Z8b5{`5hMy}5YD1kh1hrwuI)d5|Ya>Bz=&_lgHeB6GP#dyuC#Vfm zcM{ZwkGlzKLzR65wPE7{g4z)2FhOnTaFn1noIOrZ8`7U5s10M!5Y&cO=Ll*;nTrIq zVdZ6l+7Rj*L2YPpgP=AXy+u$PlHVn$4MXn})P_e732H-;Cj_-&(KCYD5a=aAZD{zK zpf>D%OHdo)e;}w0eLoV^hFhNrYD1oH1hrw-4}#k8?H57)7q--lhnHy0cs?Hx7<+)) z5Iq<{ZRi?;pf+3zMNk{Ege9mAlfo0!hW8N(YD2{+1hrvZG=ka?J|;nJXd9cLHk^t} zP#e-DAgB$a5)ssf=Sc`^L&@X>wPATmg4z%~4MA;amX4q{9LhjY8#lvIMnZdU=A{ z@VO#EZKzg-pf+r-Mo=4~@Xuy|+R&*sZ>SCD>k`z4j135C!}vx7wc$+@g4$57IYDh$ z-GZPtglSDs8(Os`s13*46V!&3od{~f@Gb!NKu{ZMPbR1h+ouxLhL|%5YD4!~ z1hwJH9D>@AZ9YM5n6i+dHvG4kpf*%qMo=3ztRScj5myn^hW2X+YQvdz1hpaEMuOTf zW-~!;c)69JHk95@P#gZ;Nl+U??jfiR|Lh~E4Mz?T)P`h-32MWTqXf0#;c#Lmjtz;%WHz#aPcicZOHtApf*hWNKhNzeI}^?uc|u>7kd8MFn%>i zk(5%1=1D2dniV1?B~u~|q?DA%RG|!!5-FJ@krEYZhe#wMGGs^tAw(imD)Qd1=j4AM z-s`iz*FM?T-s|ia=(fv12cFqupaTc&HPHXTqDw024!xvO_TMS2c>x`$yN`hm+_tZQ z4t!t2KnG4LX`lm7lrqqPeaaZ`Wfgz;R_9Ppx;FXI`HZs10AS5#6SnG z8)~2f8;2R_K${T;I`F_120F0&N&_7@=NbbYSTf2$2P#}=paWOlV4wpZk2BDLrZ*et zz}@2wbl}(940PbMi3U2b;0^;FIPfk59k}#v108sGnt=`+b+3UA+Qw_B`1~~k9ccN6fezgJrhyLZTxFmGXRS8Sfkp2b=s>v- z40Pb~j|_C+!;cMgpwVXrI&kOb20HNb1_K>9^$PKnJcaYoG(49&Dfk%?~lq zfoX>s=)muX8|c94l?`;@*{TLQP^N}~4h*klpaW~_80bKQdImZ$slI^@Y&+UO2f8#i z(1E#44RoNyF$Ov?sHK4pyxH172Wqu5(1DxV8|c6{#~J9r@f{6xVCG2%I#8&yfe!RN z#Xtv^oob*1l}^jdt2YU7~(1C(}20BpwLIWKb zd69t*tQ};a15Jh)=)jbr20E}~n1K#-A7P*a^RF<_fl^l)=)llx40K@iC<7g+cb$O_ zOzUSCFz__~&bYSx|10868 zuYnHCxZgkr_C9E!1HES$=)lrP4RoO5ECU_5_6Y+WSofrX4zzg6KnJEjZJ+~x&NtA3 zGoLlkf#;t$(1EfA20Ad}1p^)U;3WecX!weO4orU4KnJ$JW}pLI-!RaDd2br%!2WL= z=)mCB20F0nJp&!6^MQd5jQ_|$2fqE-KnFU0W}pMJJ~z;TA{z~Kp#K*JIW8;Js1?I#9oifeuV8 zYoG%^9&Dfkoewe4fjNg6=s@u!40K>%Wdj{pS=B%XYSu8&ftzX>=)l)?40PbQdImc1 zXnh0yA1rRDIhp-FjWsWz1FtkS(19b4G0=h0Ee&*FeQN_9Xw}X@2kvWcpaXv$XP^UT zcQnv}#U~l)z`>mjbl{3p40Pb5Qw?;W@o5G+aM$SuI`GSx20GBKr-2SU)5|~y4(M&5 z1DEtM(1CaQ8R$UW3k`JOwu=mO;QK)aI&jhu108r`sDTdbGu%K2E*xQ?1Fv6Upaa#e zGSGps*BI!)m!k}H;MnU7bl~9|40Pb1aRxeY-pvL&@X~k#9XM=)feu_V(Le`2yTd>S zj=9S~2kyDsKnMPqW}pLS+-sl%&)sjJ0|z~1paYl9FwlYbA2rZ{qh}fDz#UH*=)g}; z8tA|&PZ{XIQ%@V{zoRI?(0=108taBLf}S{jq@#ob#E14lMcH zKnE&pG|+)7zcA2&k2f3WK+|swbl~o94Rqkw?+tX|v>y$0V8KrYI&k1G20C!*uLe5s z?(YUVaMVr%9k_j$fe!qz$3O>8-fN)$gGEnP)gAg|)$H$EMDqeVaM3;nI`GE620Bn< zKLZ`Ov7~_xd{xRo2Rf87(1AzF8tA~k2OH?X`G*+jz{`gj=)mDe80f&L$_6^{c~t`) zXj#KR2kxz9paVPW80f%R^$c`iQGEj)DA&+H2QF`HpaUN^HPC@Z#~A3qoh=P?;OEu` zI&f+`108s}y@3vtJl;SDhIBO0fwxaG(19a68|c8Trx@tKcc&WYz=@|B=)mKr8|XmM zvkY|Lf}RFC@LDee9jMydKnHHJ)2=blf!{|N=)mdM8R)>XHyG$ZnHvpsVED}jIHwHQ|`&$DYD7Mu=2L}9TpaUy@ zGSGqQzZmGixL*x)VDs+=I?#Tnfey^rWuOCl_Za9v@4W{4KUlQ1nl90$)v{l)h~@=! z;M#o*bYR`S20GAUKLZ_@UeZ7Z{w!sn180^o(1GX68t6dT@&-CE;t&HJ_~0-D9cXxj zfeuWrY@h?%s~YG)*BS;oFt3(@4(xxVfes9=XP^VC>Ko`lorVTFFut*Y4t(3xKnFS= zW1s`GS{mp;kv0Z8(7&C54lHkPpaWHoH_(CWI~wS~rjrbGplxRZ9eD5*10C3Ns(}vl zI?X@_UO3%A2M#&QKnJesX`ln2^fJ(aX1xt`U}_%&9r&%Efe!Sz&_D+kUSyyHr7t$n zfnh@obl|Sb2ki4%EES zKnHHR*+2)r9&exn$4xNMfk!7A=>K5xWX;L!_qj{+0y^-@-3B^v#61Q&F#28t9aw+A zfey5K$Uq0~n_-{>e?4lT182`N(1FEI80f&ka}0Fgil+>8;G?GvbfED910A^QSpyyT z<#_`g=vH8$1JAr*paTc^e|7;Kxa1YTpabu`YM=vkUpLT!+uktHf$!fm(1DZQHqe15 zRvYNRK5Gng;KC0Kbl~-m40NE{Ck8q&_A>(=`0{fD9XNKQfet+Ug@F$Iv)Mog&ilqd z2VVNtKnD)nYM=wx{Ai#9pZ#Q@1IPSgpab{(YM=vu{BEEFXY4f4f#-G^=)ggL8|c7g zdkyq|u;~5jxVg+B7uKfd?8J=)mr#20C!gF$OxYq@{rlRA^(M16Q^)(1DNJ8|XmO;|+A+?v4gJ z@astiI&fNN107g!ih&Ls*v&u(EU@kWxg`df#Kg6=)jt94RoNvRs$WF^rL|eZ2QST2fF-XpaXM%HPC?)e;DY% zpq&Of@a8T99jNuUfezff*FgUVi@vF$OZ1x>*+0IB<^^4(zCJpab0-8tB0M#s)f2s+oZf3_Zp`2UfQ<(1Chw40K>ZI|Ciq z+TK71IvsDI1G76C=s>Yf20AdHvw;q*IK@B*s&_NcfpMo9=)mUF4RoOWSq3^Vqo;um z?CoWs1HF42=)lrG20Bo&zkv>1d!d02th>lS2U=Wgpaau~80f&CLk)D`%;5$)@cak^ z9Vk1}KnF%#WuOBeTw|aE4M!X3z~t);bYS}p20GC7Mgtv~ce8;G?0>6)4h)`PpaZKW z8t6cs$p$(w{w@O@`1WoC9q4$Efey^N*FXn~JYb*${U0*Wf#ov{bfC&i10A@2mVpjz zdcr^l+Ric1fd`*5(1ATq8|Xl<1qM3s!m|cCaL6J99k{B%KnFf~!9WL^Ej7@AsjnF5 zz;CY_=s=Ix4Rm1P8wNU1`Yi(;81}Y-4!pP8KnLotG0=gD9~kJsj~^N6K<7^kbYRYB z20BoDy@3u4+-RT!E59(%ftp_#=)g@ruL|hE*WdaD9XM{Qfet+Sqk;Yp7H`*_%zmF= zG%uh7ul#DD14sN}paY|K8tB0KT?RVP>Td%bxNon4{tp)YRa1B9Up2FTb`i}B=)mHA z40Pb&;s!c!#eN1l@KH$v9cX-@fezeN#y|&tDQlnsKGM*wd`*3%fzFF(5Ah2+P^O}R z4h%oSKnK=THqe0v)eLlCQVjzg*jCFx2f7?-paXO38R$TX1_nAXsG)%lyxG`52WmAl z(1DweG0=f;S{mrU@ofxrU}if59VpbnKnMCBZ=eIqIvVIerA`JqFs8GC4s1BZKnGfP zGthziPczVgU8fu9K+m%bbfBQ8few^E*FXnG_BPOgwS5e9phVfe!4r$Uq0W zUu>WQ^M@GdK&eX&bYSRk107gB!axV=jWp1K30E2Dz}9OFbfD8{109%soq-M%8*88g z18y|XffY9!=s@*b4Rm1K1Opw|JkdZ0+D|snff;uh=)m5)4RoOQJq9|k^j-rUsQ7?^ z4qW??fex&jVW0yoW*X?g^jQWv@aGc-I&kJ3108t&DFYoS`;37Oj96fx10OtVpaTsT z8R)>|0s|e`{(^xHbX{to1M^-n(1HDz8|c8`*9~-F)f)ynQ0FZJ9T@+%few7T+CT?7 zt})PoSsxhaK#{cuI?(?U107iYnSl;eS#O{N*Kah?flXf+=s?@A40PbZZwz!`&$k9T z&}*xK4!rQAfesw9-9QJf`o%y8KKa!^2b%q1paWBP8tA}py9{)o$KM7zuyC(|4wNob z>wizt0y;3Ph=C5gw~v7i)GuzJ0~7Z%(19OI8t6dh0}XUwP8kCoC|=G$2L_fm(1DeQ z80bLFiUvAx(-8(b@O5Pa9XPI|I|Cg!xPyTXTyeaC4t&(nKnEIkGSGp$ zIveP~FQ*vjK(}rNI`GVC20C!S83sCV$yo+E@J>$y9jJS*fezf(+dv1t?_;0?C-pbb zfhR6B(1Cph8tA}<7aQon>q885pxUJdIxu#)few5*!axU(9ciEg4_{@V1OHrOpabWP zHqe2Wt~1bq!^Rruz%@4-=)h+;8|c6>w;JfcJrfLc;E#z0I&j8h108toE(0AnXsUq@ zTy~Fv4!nP_fesw~fPoI&@sNQI{4~Qr2Tqx3paW0MGSGqjW*g|h#d8dF;H{?&bfES# z20C!d0s|e`@~nXloUq712OcXh(1F4)8t6d3r3O0i>MI61P%l1G`rn=)gH^40K@02L?J&VXc7U%xQW zfz!S+(18Wt80f%(-x=t@rCSYj;N2e$bl|A%20C#2F9tgB!>++*rgw2fo_JKnFS$H_(Ac_A}6de@hzZ!1)In=)lWm z40Pb|at1mus=R>?e13?54z#Rjpab_FVW0y$D;wy*S=9`5U{MVN9Vl1ZKnE^A(m)43 ztY@GDjT#u}z?}^Zbl~U420CzRGXouX`WOQpDA~$D2ZppU(1Ewx8R)=~9Sn5f*5eIy z;Jc0nI&fkq108t0vw;p2?P{O{7j!ewf!9tm(1EIF80f$aXBp_g7d;JhpxwC!I`B|$ z10DFgkAV)H+uuM3UcAsi2M!%*paWN5Y@h?54l&Sy=9e1iz_j58I`I1l106Vhq=61R zdzFC>l)2VG2ZoO}(1A7A8R$TRu?9LY=|%$`*mkpl4s^NIKnLbdFwlV#lMHlV&}0K0 zc=Ij;9jG-G0=g&GYxcL*(?Jcs5IL^2gb}X z(18t48R$UkXAE@U{sjg)u9Vqp#fes8^W1s`8KQPdNdTR}IV8SN`IVqY5Qz<{p|bYR6d20BpvI|CgUx79!gHved#1MRmP=)jC$40K@cuLe5M`ws&h zSh~|d2P*D1(1C0JHqe1}dku7;MWH&nMd`rwA_h9}=RO8HaAt7>9e92}105)PfPoH- zIM6@`J}6_L0}aa==)mOi20F0)5Ca|PTG2oU<{e?61N&Do(1F3#40K>s4FeshQ`tLjxTs(!@Xq`ZqJsf#t^-=s=ZL20Czk8v`BK)XqQ$+IBF| zfd`K_(1AT24RoMaCj%XLp|gPw9MaW52d?U7paY+rW}pMj&M?q{sb?AJz;8VbbfCw% z20E~?w}B3n?rWd}!}=TOz^d^0|z{3paYjIGSGo{3Ji3h?u!OGaNAM?9r*qg z106VNxq%Km@w$Ny?6cB92QGZeKnGrb+dv1Zy=$NYW7inyz?UBw=)kdS4Rqk)PYiV6 zpU(_*;Joz)I`Gm)106W*O9LIa<|_jo`0N`49XRGY10A?$tAP&u@uPtboUz?N2cG-I zKnD)`%|Hh(`@=v7-rs4U14r*R(1APtHqe2e_8REGDTR*IB}xaLDq^4m`xP_Lfs2b9 z=)hb18R$Um0}OQFmIDoRU`rVT9XO$!fet)Y-arQmA8Mcj{VE#hz^g|X=s@Kv20CzE zH3J>kSi?XE+SE4Cfd`H>(1G3c40Pa}1_nB?q@jThRA^$L16MXP(1DMSG0=ggtqgSF z?luNG@M}8*9XPFnfetJ<-arQqJkdZ0F70HX1MhY=(1D}68tB07-3)Z#htmvn;N&w5 zbl}Oe40K@Ma}0FgqH_&&;Emn}I#8ppfezf*-#`bxy3jxeIt(<>fk!Sj(1Cx480f(H zmm286%fk(H;PA^0bYRp-10DGMDgzy8d98sC+&kJp2XfesX%XP^TYJY%2(uPrdpfvV3L=)et&40Pa&0s|dr z_o9IgJhaq62mXG=KnKoUZlD7%zHXochpsfxfvev#(1B0iHqe3Q?;7a9v^54g@cRb_ zI&k`0108tw69XM6v(7*VhOal!fi)WqbfCeP20Ae5D+3+a_KkrKbotIe2j*@y(18-$ z40K@7b^{%F^A`ghsP&tH4&3~Qfew7L(?AD~-)*1+GygWwfkOWp=s@2>b#;r}Q|@tq(BJf%^|M(1BfL40NDpIRhOiC~u$x1<2o7Wz~;^dI?%qWfey^*W}pLm zPczVg-e(x-z|yk}bfDrn20C!wCHP~1JnB(=)j*B8tA~80}XWG`HKy7 zpzI|EIxyl=10DEaxPcBdyxc$sCXY1Gf$dir=s?$N4Rm1MXagPC|9S%*7(CWM2Ugu^ zpaXSoG0=hWw;Jfcw-XF>pyMP19hf!QKnIFUG0=hjQw?-r`8@_YP~|=Y9k~7h10C4( zkbw@geZ)Wq9-L{Q1AAr}=s>U820HM<90MIVWS)TzT=k5B4t%n}KnI#VXP^U97a8cl zZv_TA(Bnk|9ay;3KnF@MGthxy%MEnkz1IzNp#Dk&9hmr*fe!rmwt)_Ge%C+;=BzQ$ zf#M$;=)l0W20F0v69XNnxz0cbZdz}k17B}6(1GK=G|+)ZzcSGO!Qw5NliBa{o#q8} z;FYZgI&j1`105K>-9QJ{|6-s6t$s7mf&2b2(1E{p8tA~;yA5<;@!tkIaPYqdI&ejy zdb&jEz(++4bf9rD10A@lxPcD*vY&wtbUVO62c9|5KnD&u$Up}!DQBPq@02&tfx3qp z=)i3i4Rql9BMfxlq$&nF@I*BO9oVO)feu_)+dv0iKhi)4svTvZ17jN)=)ji^4Rqkx zCI&k2a5DoP_~#e{9XPL*feyUX#y|%SJJvu4uIXT)1D_plpaaL8XrKf4bTZI^KRO%e zz!_Z)bl|ye20Cz14+9;z>gQ|9XR?N10A^ITmv2Wskea+oYL1o2cGJ0pac62 zFwlXE2O8+WTNfMXK=)lcq80f$^XBp_g@#h%mz|3u;a~l?E8-z?gvsIf2n~E>>6&M13fP{(1C)H20BpwY6Be@ zd98sCtQ~Ej15K_s(19sq4Rm0~jRrc<{T2fqn18E*4wSmxKnI3SGSGq5lMQsB-V_5J zm@w5q2e#g0paY%mGthzA4;bh`v4;(GV89~=IB|jt;Lq0$bl}XD z20HNkTLwB%_8kKq81b%w4t%i2KnEIrXrKd=*Ba=+_D>9SpzAsV9hkS?KnM2UWS|3s zzckQ+RbLtCK%FfHIxzk_10DEwtAP%5+-9Hyv$h-PK#?5=I?(?&107iYhk*`M`O82D zuHS8-1DpOf(1Eu98tA}-h3e}Tr2~7480bK+Vg@?!LU98fIAnhV9k}WM10DF}Km#3U zc94M%Of6@i1HY9w(19L@8tA~niUvARx{`qo469kCI%Y#x_H6LX7&3NE-`p)(ftbXnZqLg-+58HgbgGXw$<$2Oc=X zKnHf8WuOD+oMWH^OU^aWfePmv=)jeI4Rqk+{subGbbx^l+&$1h2Y$WSKnG5{#6SlY zTxy^L2VQ2N1D9TIpabuYG|+*gt~Stt+pjgyfgeU2=)lR>8|c83V-0j*-9RnS>^<4uU_->7X4xIR* zfet*r)<6e}erlit7pybTf!Ed>=s?v?20C!Vmj*iU#a9M8&~A%?4m|Xofe!q=)j$W% z-DaQzFK#!`fkSr~=)l##8R)>Le;DXM^S=yqVA^g29r*ok106X1UjrR@won7zqI954 zQ3D+qUd%uT))Y6;fd=~<=)j}{40K@Ifd)FzBkLo)*% zXx+j<2kviWpaZ+w80bLHV-0kmpo4)9ls~~h2S%P~paW|=8R$ThE(SU*#Fz#{#9oRh5KnL1iZJ+})t~Jnsy`v3up!f9#I z$v_9Ly~RKW*4=8L11)Yh(1Gcb40Pbn$p$)b<`e@Rcz&vZ4wRj4paUcBGthw#9x%{> zh7TL)z~n~^bYS~T10Cr4xPcDLn{A*2`_DDdfx+_(bYRsp20Bn@p@9yJf6hP$zFlOX z109zb=)kNO4RoN$%LY2of0=;}EMIP*165WS=)mfjPSkbfEY@20AeCUjrRjS?Flp zqI95UQ3D;gshEKdd|li?2aem{KnET@z(D^8i%V-xX1~utnitT4SIQaaz!4P;bYS$M z20F05qJa*ys$`%8_f;{_fxoI5=)l=E4Rl~}Z37)RxUPW?Tyd0v4t&(WKnEH(GSGp$ zni%N7FU<^epj!(A9eAddfeswd)<6d?Io3c2-sxbV19eX@(1F`dG|++XI~nM}NnH$d z;EApVIpaV}$GSGqj?ljPWi>Daqz*|!dbfETh z10A^KJ_8-t@_>O3oba%L4m|dVfesXY%s>bFJ#L@_ug*5mfy#3Ybl|#q20F0u83P?? zv(P{X9(c|`2X-$q(1CN780f%~7Y%fv!pjCaaOE-s9r$>;fetiXVW0zduQbqsU*9s& zfz#eG(18W-8tA}*?;GgAr5_sTz`JV=bl|8@4Rql4bp|@{!+HZ9IC+zS4m|m#fe!5Z zwSf*?w8cON-uTWy2WtFapaVBZr7B|p=v-UU8fkg)x=s>yB20C#0K?XYT zVL1aGXjH*K2kt!7KnH%VXrKe9Rx;3mr>hv~K*{O`IxwWBfeyS~+dv17tZSeHw;pAn z1K%|;(18;h8R)>{O$>CPXmbM{xS)lB4!qXNKnJR}HPC?@jy2GMFFF|LK)VwRbl{;A z4Rqk|P6j$~ZWjX`c(JR24jkIuKnJewVW0z_o?)N^&CfQ_fobO$=)mvi8tB03=Nst2 zvwaP8pv(mZIxu{Ifex%0XrKcP1{>(Wq)QBRVB4hzI?&}Z109%qxq%LpxY9re23>8S z18-hypaZqW80f&w*Bj`-H)9QS;P{&ibYSK!20BpaHUk~#d%J-SESqGY1C{PH(19^i z40K?_R0ADoJ>5VD?!V7K2X;MRpaVT0Hqe2BM+|hJ{9^_>F!FH&9auZtKnI%4HPC@6 z^9*!g$1?^x(0!qS4$ObfKnF@KHqe2gOAK^i^@|2NQ14{}9hk7pKnJ!iH_(AjD-3jC z_DTaCD7MN#2L`-jpaU!3HPC_T?;GgAxDO3k$^RPY!1h9obc@n~u0;)WU|ul;9oWBwfesAb-#`ae9bljXbxIrP z!1#jm0|OoC)yO~xUT9*V1BWy>(1EL380f$!tqgRaSz7}gn0l;%4*b@^KnHr9 zV4wpFPc+bh(kC0}z_2a`I`Cds10AT}-9QH>_At~9haFl@#9C);W4qV#EKnLD!VxR*@H8;?K+gljuzz?kqbl~K+ z20HNMu?9M@?{Nk?aM1|{I`GDc20BpVWCIM^9^+1^S%Z;(DDKU9k_RZfe!2(XrKdU4K~n$MVA=pK)GQC zI&k@A20HNJeef$t_6=)j408tA~|Qw(&V=rjWzxL~@04!m}sfeuuC&_D-nc-TM(zIeny z2iiSmpaTy*ZlD8y&oD(?bl}kW20C!{LIWN6^f?0^XujA$2c|7C(1G7y zG|++5UpCNzXO|i1K$+JJbYS=j107hi(m)3qtTNDnN$(iwz_xb{bfC-o20AeJLjxTs z@v(sp4EoeS2i{y~paZow80f&wn+$Z|n=cJ?;P|f%bYSKd105*zy@3w&{lP#7mTfc8 zfl5Cc=)jmA20F0eHv=7L{ilHr-2az>4(!@(paVVsG0=g6e+_h?eBma#Md`rEq6Rv! zwwQqqG$~=A15@@l(19HX80bLv(gr#({~!Y$D0Q%b4h*eepaZK9HPC^2ha2d?gh~cF zu(gVT4s@z+paZjO8t6c=ItDs0pss-qtT@U*2dW=!pabI?8R)>~CI&jtzPW)8%xGbt z1AAK;=s@qb20F0xSOXoXc$|R_Tzi6n4y-%TKnGf!Y@h?vyBO%epIr@f;LPp@I`DiC z105)PrhyKOINLx6J~+of2O6GdpaYZ7H_(CYeGPP=>jefnFmHf?4(vb3KnDg7Hqe1p zml)_konZz#F#a+F9r*Tg10CpirGXC2y4pYoii|SQf&OC*bYS`Q20Bn>oPiEpf0Ka@ zY`Voj2io3dpaT!yZlD8uCK>2JuR9HN;Dsp$I&jD|10A?(x`7USa-V??G<(oM2c|x3 zpaZ`>VxR*(9y8E^g^wHPKm)v=s@Si20Acj ziGdCjf5|`x2EJ^d11pyq=s?Za40Pb86$U!+^-2RBIBu1J4m|pff&LE`zo$8w{XXw& zUO)$4`OrWIj`-L>2S$HtpabjI8R$T(4F)=J-zEbc`0Gmp9XR`I107hr#XtuR{@y?b zuK2+~2R_{H4>2QDmapaZWTWS|4p4mQw%u@ww-;LAe| zbl}*-4Rqk)N(MUcPZa|lIIp^a4!l&;KnD)1W1s`q)HTq7&yF(Cfn$y~(1Cjz8R)D4jOGS9@LUT69XP19feu{O)<6f|Kh{78jy}#n2ktn*KnH$0(Le`IIoUu5p6X(t z1N)t7paU0oH_(B%dKl3V+?fQ zRYabl|Ib20GATzJU%r zvd};W{(a6s2hLw?paU;2G0=g-Uoy~vQ7;?lz~{>hbfD#H20C!>3IiS3xza!f&RS)l z1B>1<(1CLA8R)>}?;GgAhaVc~K%IMTHczTn84wT$%paVm` zHqe2$w;1Tak>4BWz^y+R=)iZ|40PbcpAB^2@f`*_Q1o{L9k}36108tnF9RK@y2n5V zZurMQ2fp~%KnL0tZl+t54m?!UKnMOVW}pM-mN3wP7xy>NfkR6f=)l#b4RqksgA8<_ z`N0M{Fs*`t4*Y(ofexI0xPcBlTggBN%2YMbf#KB+bYM+Q1085k$3O=r)iuz8ZATgC zK$oKpbYN~H105*Q)IbLYH8;?KH(MC!K&{pWI&gDa10DG0SOXn6{x}02n0bPM4iq}c zKnMDsY@h?nx)|s{rBe-bU`%%d9oW#rKnGf%X`lo5pKYK6yUsDtfu83X=s>~w20Bo_ zpMegHyud&Q)($YxfhL0tbYRM010C3LiGdDuA7-Ef^Di^dfl^l(=)lk`4Rm1j)do6H zZ z{CJRo4s<@)KnLbjFwlYGhZ*R=z{3r6U}Yr(9jIB=KnHHBZlD8S*EG<9?Fs`O z7<;9G4t#mFfd;k|FF1Bo^M3#P;RZS{W{&X-I#B2a10Co)&Ois2-DIExmBt(Bz?j<% zbYR2n20GCC4g(#y|4suP*fqsK2YOC3(1C*K20BpweghpC`JjOgtbN!(2bw%;paWAL zGthw@j~nPf_a_Z>VE$YK9Vqp*fes9vZ=eIK7aHh5z2^;dV8UVp9oV|WKnFU#WS|4H zUpCNzVy_zLz<}2bbYR5_10AUTrhyKOTVNy-2S)sC zpaUQ5FwlX9zZ>YlUO)#{6*bU- zI{O;v!1xjdI`FN3b^#seSjsQxz^u{+I#8snfe!RP*gyxCS1{0lDu)^9!1ae4=)k5* z20GBTs(}tXSlvJe_S7`cfnIeCbl`=$20Cy^eFGi1>SzNU_@t464m4|OpaWBz8|c7q zEev#^M{5HeSlHG;2THd$(1Bsc8R)=!Cm85J{gVuIVB*OJI`Cr`10Cpms(}v7>29C{ z#ZNcTfq`cl=)lUe4RoMpF9RL8={y4+`1*VU9XPI^fet)+fr0)H7GI<}nf*S4G%uh7 zuM9TOfg^?*=)mY<20F0*G6NlGb%lWr+;^pc4*YesfexHK%0LGek1^1JgKsd%7d~mA1Fz3D(1B`C8|c8;`35@hl(1AbRG0=fC z-ZRjF=iWEafrCCW(1FW7Hqe3hKQ+*Sqdzy$fjc%B=)g~#40Pa>%?3K~)Yk?&u-~@^ zI&ks#20HN84+c6=`zHe(xaDU99oVwNKnG6v-9QH(`_n)N3hy$|fqr`obl}y04D^4n zsB#P4p_N-?|GL7O7tn!?MGbVI&AtXY@IVOz9oW6UfexHg%0LH}ls3?T3S|v+;L3vy zbl~F(20GC6FasU9`)~st__dOO4xCoiKnE67H_(9tYZ>UkrF9H+;N7|gI&f5d10A^i zXagPip^18ZJ3(18Z88tA~J*9>%E+X@36 z=<=q44$NI;paUgV8|c8G_Y8F4&G!v-pw>qQI&kyH20HM~rv^H3{O1NbFmr=}4ix&r zKnMD6Hqe1(UmNH^rEd*%V9fUhI-)20Ad|U;`c4TERdEIvr-91G5h|(1Bu=4Rl~YRRbMZQQbfXs@F2mfpK*V zbYOE`1085z-#`au9BrTjdm9<(K<}moIg#b!`oFphbHF9hiQc zfe!q6f`Ja4d6Iz+Jb$u*4wOB`KnF&gYM=ujbT`m}hNm0oz~nOxbYT1020GBSmw^t< zJI_D|_U~h$1B3e+=)kHA40NE*MFu)Bevp9AHe}#b# zEWgq~2dZ3Spaa*BGSGodV+?el?F|Mx@ZdND9oTb|fe!QSZ$yKqu(>of%Wej=s>HF40PbWj}3I-uTKqh z;Ox&0bYSrY106W{3j-avVzYq`eDt+}4mAGOKnL#n-arR_`N2R3y8UFJ1JC?ypaTc| zYM=v`{BEEF@BC??19f*9=)i4z40Pc8e+=}0u;`>#x~9BqrQO-Ja@E#4jk0jKnE^sYM=w}H#g9Mqgxv2 zz#Xj(bl|7920Cy`djlPK>No=(*sr634qWVC_5wQa*2#WB2Wp>UpaZv@YM=vKx*O=g z38x$Az+-0`=s@9~20GBMmw^tvdY*v}RPJM-1K0I4(1DE?80bKoiwtz&fk6g3uzRq9 z4xBU8KnIo#GthwwBMfxl$}0?X;NvR|bfD=q20C!}C<7h%b&P=yoOXkO4lEdFpaTcq zY@h>|jyKSOcW*P$fuklG=)moF80f$ccN*xx$#)y*z?0JqbYS0m4Rqk5`wev9jRy^M zpvDXX9k}sP10DG4F#{dw@PvU5Jo2Q04*WaUKnKo$+CT?ho^PN7hd*ne1EZcd(1Fhv z8|XmG7YuaZ-j@t?VCTyQI&jvj20F0lH3Jhqk4t%)EKnEJFHqe1P-!ssG zpWipofm1&+(1E8vHqe2RpBd=Dkk1Wt;Oz|tI&kC{20C!-W&<7g?rQ@bIPqHp9eDhE z105*(qk#@w@RNZKy!Nw!4pjZsKnHI4-9QJv_|rfK+U+vXfrs`O=)m9q80i0C(YdX4 ziJsd!`!5#OynqfIx{rYlT)nS>4t!d|KnI$aG|+)*r3`f7_tFMBaC%t-9eDO&105)H zh=C3aKg>V})*No20}U!0=)k0^20E~}YuK<~Q^bYST;10AS% KuYulE=>Gu!iSUE~ delta 77818 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 diff --git a/demos/ExpertFood.demo b/demos/ExpertFood.demo index ac396fa61521689e3876b05f73a25e90b7e5ccb8..c9604baccca5d7dc682858cf1dc764466d0bf33a 100644 GIT binary patch delta 70161 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 delta 29578 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 diff --git a/demos/ExpertGrid.demo b/demos/ExpertGrid.demo index 1e587c8372cf3a5389a02462b30d1d636aa848ed..1f869816edc08812b01ceb8980ab5250aa815c54 100644 GIT binary patch delta 10013 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 T_*#@g(ZYT)GSb~WJ*x7*{5T1h delta 7522 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 diff --git a/demos/ExpertHallway.demo b/demos/ExpertHallway.demo index 329314a7bc8510f24ad9daa2830d05ffb29b2eec..b755862850e653e1f2db284fd251ea15bb2af552 100644 GIT binary patch delta 174844 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 delta 104015 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ⅇ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 V_h=w!Jie0|yQrYTAb!68{{e|$0YU%( delta 47893 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 B_J05X diff --git a/demos/ExpertPyramid.demo b/demos/ExpertPyramid.demo index f0bdf40d72a234a4c07c67216539768cf4ffba8b..7d2301144592f6b4e98b538c6e06591f3a08c96c 100644 GIT binary patch delta 66351 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 delta 33852 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%0D|U1cqL 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 Ly0G@|VjcW{1hZ_5 delta 40943 zcmXurcU(>X9|!P9T3QliR2m|?L81_8A)}0_NZFK9#r{6!n`@HYh=bT=jdr!9`zQ2@xPG2r|*y^m1k`UZ1Nc2-M6z4@L#TK`1 zlA<84R7g=s5&aYe(N3|QGW4=vQ5TB}W9HYu{UQ<5Qs_~(_hIDWImXB9ZB6<3ZgvA?dQWIaJ#q9^HDD?vQb zN>b}Kg7~R*`zC1$Vse`_3^wTt;#7Spx?v!QdkiEgwiCosLrD%sf~adGX_>Jgjxv^X z%0v)jOeB3V6~wEilDe7++sq_P?;wc%I!M~rQ4kk*l=ReG5VOoBwdyR0A3I6%>>`Mr zx=7mCRS>6im2|zEAnxwQZl2wxZUZa?v89C+EwvQHk(QE9S_xvbm88$sf_TMRQkPzW z*w9nbG#f#*w~@5Bw;(R+E$NA^AZFT1((5aTRedCR*a@P!oum!+f*4>g=~_QQ+|^H# z!T>>h)L&A62SIG%AZf`!K^!rVg*(l{{~B%>WsJBS<)UCL0sq} zsnk^vGh8L<4iUr;Zjwd~6~vB1CB+OAME_xuuDT22PIqYA2m#lTiui1}A;$ei3Zl+P zX~E)Af;fDXq%03XT<;<2qo*ML=P9Yv7(x6yn*FlINd0z?6T}7Mr0B7iARhOU)N%r@ zsPU3UdJAF)Z%NTUf;ibn(iLAp+~F&!VWM2&=|ri5y`La9_mk#}CJUnbWJ#I+g1F9K zQdNMw_IiM{)_kh`tjSdAS->ym=1966D2PdclKuq=Vo8uByI?`o4wkeqL=cCCNXnQeh*9$-eFzoAyiiFU z7YJhgd`bQb1<`h)q@9ZdF?5lnhl>UA=weAaO9k=m5=q0C31a(YlGZO5#7WCpPG^Nw z?(a&ud+AE4d*3kmnQoZ$Y{6L+a&qL38GD$q@;L342hRik|2ob36iw8 z3u0xWq+vFLhg2qSrywTml;-uj1hIIRB-=fLsJTZ{=w5m4h`rLzt#g9-`m7WU$rePTY)O&l1=0Jwq}&`qjLVT!cR>*E zUXWyyD~Rg3l0q&CqRS;o>3M<}o+qg?Ul4QhC7E0n#M=KP`Cbu3>noBHt_q1?Up7$@ z=Ur}N%F1`M9T_Eag~BNr&7}0H-dQZjU@GVf>`!elFNHRGC5W+Al4?H+;_Z);tUn8)>SswoUj%XR7fFY{3gW7-EN5LUm23B15Wjzu zq6t3)(c*_Bu|^PQ*GMX?6~vTUNov0Y@#RlR&UJ#QUngnxZ$TXQThjS@LEKs|spgL$ z7W|Q9^-mC0{z(dK5JblYC_Ys|h+nAyC6+5F2#IGEXhTK#TN8S`65K;cL8_QouB3pD ziFZ^mJD|e6X;b)xD($2Ow^gIV)Zww}bhZY(MT7pK3E$GBEt|p0&FDGW@E~paU~_my zbGl3iKBGe$w1lf$&|bQ5cU?MG51y$<-);r(Z$+!NfuFaQyT`U+_f`6sjnQX*&H&zQ zKz}!cZyM4TMzE3*J=+)_XiTS=z{^eOm!|M(Q(E5){@R`%*8%RQ7r1p7dSzF5bXWRpH+WMwxw~U`cJE<rS(dPaC4ImOUS>tVu!c`r z(`|dfUwYDGZQ!mp^p@W6^xpI>TX>%>oRZKNeA-7ry5UQV>8l{!@g?Tj$&a=6@?-b@ z(tTxOGY17hx=Bdmvo-yd$_PcI38M+C@kt-=((wV$S9c6loE&eP$4)99%)V7nRgo|*8%nRMwaIAa#A zI|u$Sn;sPicMPOsf?)q3`s&=q*Ee~t0zMuSLK>ew3znWH_M6xEy!AXjUmS`w;3+kOxta3T&K5{>lVf$ z8y3qfV;dZ`js76Qc_Q609-yeW49iTfLgny^dlT+c| zsq~IR@VrCxgTwHV!*ug>_)Qw^egrl>La#dtPdrNJAA=K*(SMG^_m0zjGGVPuxqE&l zyB|A&S>y@k?@q$GCuy_OaNQ}|?+k2nhE6&Qhn%HL&cW&DXzlZGWi~x52R6x}qb|U{ z7wEi;aKc5pJ{K;|rET+I%{)3ZA9l;9kNyX*`Hy~k8NPT~?jCxD-6vhctk*T>+pojH z*XjE=;Itcbvs-Y*O?qenY+OLEy$$=^rZ3%rr8}|2op*Rq{4T_xsE}drB3Pq{o>vUJ z7Sl)W!4dc9H}~NS_i57y@Xr!@;zPLSLpt#hJok~j0n^9afYuYtUY9Z-@)S0DN=H6} zy`Ry!&*8E>CDp{8&lT`zs>He%7~Flq(54JlFQY@sVV80`{S_SkimrSOb9ec#xjU1} z{}29DaNzp}1M4?jo$wY8dP^6-gAcuFyRslRBA-*9;y z?OG2T*3%Jx;PHRx3xDBlf9aq9;5+~1?hy^_K3AcMkm#h)M7k?G+yoA5LcdmovlVG0 zW%!2@?X3b^s?c$&@Ele8Zd3SRQ(9deE>ojjG++Y_I$RU>(xh{=;8-oXwi$f88ExGh zR&7oP>A-_^=tC{wRV|wE&d|Cg?hn%v+v#EUU6=WUR5SQd&di&3g>luz9`p|j_?882X$31= z(Q~ZfLDuxap74sEbXhO>OfTA?cN6(m>ZeT;>1VN*Ewb*m%wqe%GyBlD`@;MC(yI3G zb33_ztUdd$>W|r&{>;w}fHx1IzdOJ;9cYU|u+kuUwj(^ykxm&5FCR?5bb?Pi(fTg% zS7&;hYhzDqSN7cMhHQo#vw|Uw*`XoKRE9M^e>IfP9o-wBw{z$7mBVrD=;1u}>oBH$l%m5raAVA(n zbpZGAd}`yG?5SMSW;)h*EFHfM4%|i;iEye&YsACl zakOg!Y?wetB*Nnp=?mN8ZQJReN${N{xqrkC_Mf{8GpAk55ATM=r|%ws4<4Y^55i?Bv`Z>%kV=Oig1rvWIfvoc!*p#Ld^?S{J_4&A zp@WXXgOAdOj=`&r$=$7wvwOQt%)VzZpO6JxWYOXYc=idp@Fbjal2$tnzdS`dpMmwy z(5uhF+?)uhZE#;4L@kA2;D!H)+cPSh;|na~mFX zn?864UU7#mD}>J!(gsCv^RxBh1D; zVt(#1y!kQxy%fG#N?SaIm7dbGpTPs4(J9a2<O$@P#M925sN{=c8 zid8&n)<@XkBYof#yzCSG;xl~eGu`$p{N)Qhwi@nQO>g-IPya^W`VQ~=PAk{IPk+#Z zYT;J3^opOb=TG{~FL>iGy1EX&UPpJYhnv*XGylK?{>X1b^&fVB{tvU0|D-&=jUqnX z8@P0g0^CJGQF;+KH-V=$p>Ha}dlhLVW%!8_Jx~SKQ=ylu!XB#h>89|8ru0`e_?jBs zO#@cYpl4{p{Wa-iEqI9*{j3>$q8Z(~Is8dmk#}p!%@w7)wM{KBo7#f;jh679mb9WC zT&hbuw1Rb8(aT!HqgvCaq`k(pp}(|+uePPT8Yl`02IO=@jQbhV``W>a+tE*r;4CA$ zl?nXOnD#VP0K`h9B9` z{cYhEw)B!d@Q6NgcZI&}{>cur%XZ8=_k;i0(^LDycKzu+1K@=N=u!tb!-3Wv1b-Mv zk8*@NI?^$NVgJGORVR3-ljH;!@S!uu{aj%kS9-Ag+u4k4}%+D;}gMrjdkWBdmF-RcqrUHlwLo-aoyDUiu|zDS-?H~ zUD!A;UC876F2*s<7W0?|OB%CLOPC#B+W0(XDWAVz*7*GDGCuFH0>}Pd&SNL9gnO@~ zcdUZvt)d@Qbf0yw);jt9$Y003 z91}2$6qvt@hI6B7vkh=v4DGkEv9tX~c23%aEMyb2lFf}-=4NKvTai_6VKyulHi@O9 zwl%H`*v55vBC-ULS$!N_97o$Gz?unkXd>*ENFUt}uh~w&O@c2b$@>W1p_nG!-yYqm zDBa&~-i>VbZbj+-_U0aV?;akbv=4r=mmZi5>m}36_ro6h>C*?`4F~A2De$!vx?3u& zkV?-u1ouBgCm)8F9HyV8!6(w_)<@t^>2km1BYd4V9m8zuG3Gap!+Va?ikWa}2JMgq z>t@l*PQas1(5FtqF(>ISr{Jrn=&on*Nq>f%eiq|?XX$W)V>I;}BNPZ!mAfXJ;AHHPPuN>AXrx(A1hrgn;Uc>8O(;q8f9)F{P z1v0f=zo%PP!S6rNBR|3&KGM;j;K`rpE1%&VpXr7# z@PjY3eKp*?nqKq`cK=3aeuvk6r>lOz`9Em$TKG>59q<$G^ON573!eXrepCk^tCPD2 z{ATwNe=sxq!(8|a`~9Ua|AUkM(f=CYk_OsNK?xuF3QE$g+rlRBuqJedA{?bie^7$+ zl<1BsaJ@3^uL|3$(mR{Np-t(BYVc7tT1NwZt4$TuXT1vb{(`lw8-J<=~ z#_YZ}^S(N8GaY(C3wUS?`glutZA<#SE__Ls?$8SUtw&F84fk$M?`Q+hYePS13m<7q zH#dOa=+o|ou&E)vt{ptF9i49kCmPXzjNyC6bRSb#%T(^3Z_4h+%rJ{IWB#rKoZEpm zGl%Os(te#_n@)66XE>xYUD5?k??P*LgDbnz!@9#J-RYI!a8@YREZ+4&52eV#%m~Zb32lu7#+bPL6NEvoY(hX9x ze#k29nGNj^8~3Nz4uE|I(3c$GcnA9TK)7fi-P^J8Tsn?C*Sx{VTn95d;si%H(QlmL z3(mBuEBw=ip6CYmbfXi8z;lPldoUf!J!rW%p8x$Yo`1-2tT7tS^^qeQv&kcv<&H!a zH;$bXDn^v1=o(FeaAN*(`P)7Ntl2v zXacihZ}^Zmt?3KD@}b=(!tEwvFZjV)JW+{%53TAaKMt6zB>kW@4#1k<{!0A2>a+kk zdpU(!{@;kym<>7pYK}8=k<%Q zws;ZO+Ae`Lm(Zb0VYj99(Pi+OW%S$S@Wthg*X;`Vx?P1?uT{*qhrz*N^!?Rv+G@I4 z1Y8kL4_yNruc6mQ!akAorL}PUTKabsTogt3UJq-mr{@Wc{f7(eeBwYx>Wc4IMny_NZpZLrZcI#PtaMLIVQj*Fw~ z;^DjTv`r$co=Asmhh4VQ=}B;S5?#3i&e=hm?1F1|(!RT4>)mw19yn+ZUAz}Qw3pUQ zhF|TY-S)%n_RHOi_p|%O6wJgF=D!ZYg$L9p}t zxaJ7$a}2gRM#mqA1CP^18E|R_t&s(nXVR`GVE#~Ve}XS~#7PXspJaI96uj*e{qr<@ z=d`?mh%?;4+;jgwc<4DEd^j6}uxuXi`aGO{o;JDw|Hz@eFT$1=>9|~&UwvLKPjL4V z1_v)ORL_U;SBTP&SC{|(ztHqQE)2hnf!Ae*IamH4CSGA!dliG*R~cGg|9_};ong=o z3EGJ3PnQ-_O`&@(Z~43wp;(c-~9;K^c6cjBfr4ep61nzlKd;)9WhW zi4}ByC7f7E|9J!7dqekm2W!2P-}L-*0&_a`(_b>^|uqW_%;;{_$uHXuuaVXj3itrzSnI8QilO zov01Z)mG+Bo@sMs=_XIB1!k{xm=9?Q8?~e(bzyH^I#&;l)1&KJ!FOBHHf><_Hgrf^ z*rhF0X^-wa#>K7udNAoz@jz-IcEB2A}Un8~1=~y3;-uu$2WJZwUul z(nVHqsuiu#6E3%=U3XY3DJp{up}oSa{r6`usR}>o~f`3oh`YttP-K6X-y1*wLF#^?_IV(B;1HSzp?4 z68voC!Q;U{-5_ha`v{+J!`XWn!Q{33vMnhLj_N{3B@$4;ZOr^8#O(?4dww`S0m zvtZ>}^qkr7pxN}nIq-@(bXg#LCXhCm3s(oxUcqqpU^+Ggo*6>lo(J!rN2|_swFvKacs2Kdwly6qp5j1;T$Z2^uF`(;`8*=95^e7ZgmmHQH{68-?$Xza;9W(u!abPp)AM4!PyO#> z(BeMBB_;5P68Q@&Jm44p^boVl51Ds<4F7vXPc4P*O6fgM;Dt}<(x-67Q(E^q{NWir z>IK~K1s(Ge_J2uVErWNKNlthLJ}l?B-)mUsHNCh39$rCbRl@5l>5p&V|K8A@-obz0 z%GI;pvHI>0m@W9g{Bae0yozr534Z^P9{CyW@R^SO0#E)zU-=5}_)0fa!w;%y`|oh` z@ARS{u=@`>vj$#QLs!+p`L(q9FZj<-I-m~jQ%CRm4bT5gKdOh1)yv%j{;>Oqf0&v5 zV=gqnehrf2FRKXgNh;Fa*gpjo{K`#%wo`<)73qaa@GvDhLm7@zra!2_c`9_rrf|I~ z?XL#&is-MVB7NuXRL3Axo#8_b_^1Z0qXoa!q=z?y+c%@vYr{OjRBaXcZ(5qG@Rx5o z2=41}QQwwuvzGJ%U3jQ2eOwP-t4F_Y1z&1KcW49uZcR^a3-@kI@6dC+Dk;3Ecf z^LFqXL)zU4HZ`Kx8N(Be>3kD7(S-hE3g0uO`E$=ujKj&4xbO8(!0!erpR~w3WMu_F?x)c9`|DW4_%U4z{Q7_k+{=(ai?H75(X< z4zRHUy>=k%GmySC2#y~_|8|6n9O>Rpu!a*o&lz@grjNM55iax_SNMV}Z8`-0=|)c+ z3iljJCk}(>4wJi^y0g312+Up&XFg;kY&4RN90hxiqH{gqI1jqc6Ta(7+l+zL$Iu~T zVVALV`ZyRDsPtV^=>_L_(Iyk%+VQlnH*D=qC-}fYK6J4!e8`v9oCLp`NW1yL?fm5K z#eVF5(H}F>pZTu53Wf`5CnFEVyPS?K2y;noY;g zfdl8zMS*Z?AgwVME)SwzgJHv9IwAxfA3|T42XC84{|trigv#9`=Ck|Ug_t=lWPW%N z%x~zmi};D~dNBssiy0a%g?}uey_dn3%jme}@SNrJ-4*b`6}0*)xNIfu5(XQD(c!CM zuhn!;I2;>J*G9m%BWUYLST&LkS_=u;u4Z-K{cq0euHw{E3tV&Q^V+De2~L^?1Ic8sG_;mnW3%AatS6+fgU!u?E!JG2r z4LIg=13fNdrg)k8tShj?75czcc-d9@#WncUHM;E$_{(*A>`l1qO?t~Mc=|2+Rsp=P zfL6W(KfO&4Dui1V(kt%5o_FapMexQVy1E#?UQBnt4>!3_&n$rll*rwyOW6JSL(EP- zWZvd6{P__*rWEc{N^gDwPkTb&d!(92)K9xv(BW$=bF`fE9S zt(@-m8di8s&!~X=SJ26o@RCaU*&F!88@ly7_|sdtd-6MW-}C{qsUMi%sDk%Y(Tbno z(vP&mXIS?$z3dA->I;49D;)Ec{!$HJt){zvR}m7vlhc1--0ugyuLfRRLqDyBvuf#9 zzu=EQY0o;iQysnWH$3GxeZ3yuT`yPn{KM)4{$bYgAM>RR@W=+q@h4S<_-Iw>$INF1 zRou=i&|MVah9>khCD>kx-m45RQl_7%z?mwvUQ@VAmG)4B&DH1)>TrNMeN6-2r9mrb z!H+cQ{>|VP&FCfC@Ca>H-qt8ISCwwbKIvd~S%-P&mhit8^i*BgPM6-J2QSp4OIyJi zt!Ujg@Q2p)sJ3v&wsed>?5|H>HGp>-NKR-6J~ZUGpAoEML@zdmha1ybCh&R_`lBiQ zpDEqR4F20*uAXJa>bpB)wxA>P$L8>HbGl_`_}tFPun@b+79%>f$*?_bjBb!Y7qUw5zcd@J37Jj zgK2+f*w&fe=>mtk&<|bVqpq~h5csVdJ$xwKeki?u7(8j1++D|=-Tw~9?EY}(eMiF0 zM$!vL!9z#U$35V+9`t)pm_G!rda6o)p6D` zW-uKZ0=tFKN9Vz7=Fx9M;ftYi_t5$5K4~Fly%sXxz6cIpMBiTwr!A(NErlzV&_kEO z#>?on%VD48^raPW{0jQ_O1Nkx-8&4{2&3n%hFw?FN5bKVaQaOId?A81jf8)$p(n0| zd#c1d#g;v{yz zxDzvRC-Yys;KE&WuRXBZ9y)k0?7Wvw+Xt`SM^_}n=aXsU18~iL+9w6JN}=Nq!hr|r zqEt9FmDV^6mmi{C(_q6iIwBn&pH5#m0&hD)|2zucIVyLLIL7XCGca??V176g4$Gup zXTjN7w9!fU#|hf|6l{5ljyny{IZfX^10Os?tDl3*&eAT~ut7E*ejfHZPv_*ou{m_@ z1^D&_+Bz3j&834b!GkZ+hw|W6d2)B_e0Fbl8ME*IF`sY+wzxuzSK--L>B4Jp$~9W; z2K@3m?R*o~ze%sY1&_N$pD%#77SJ`f;ey+=RUxcWNC)199q-bqMexcZy1W=ZTTC0? zhrivU$Cto8O62b4CG39ZA!Y|2GH?1Ae({KQDuvsY(qT{Fu}|pir|_1i^p9uot!K35 z3t0IDJ?AAn=p}uy3|>)2mzBe3%4vhwaP=$Ns{-y`LC03YGb`!aZ{YoJXw`S{^S5&M z*mvx{>H}tDK46Bwrd6%t|EE>rfRC#Dw<4dB{r;pX|67sIa`y5Iv;1mgyQ<~P{Tnj; zR|yf{x*6WUq{R#l>dl;Oe3^dS{^l}c0IC0VOB zmF|+-sbTiLDf0>Hu!TA;YQVEK=t506MUz%*2EWvzowZ?oZF+TccwBS(ybioohpuS> z7qpc#A2VlK7=Pe5-v^zSGOh_12fzmh(CP!>G6&ja5Nt4r4tIpT9O<0FaO_~Z)(O7tL|ePSsxEYpD?HehKI8_k za%;SYdl|Fp<;ZR?m$MZst-{ylE`_Vk_;m4Q{)Q4in+ABAp!vZ;7LS#KX7ZY0E@dIgy^T9UiouKA6<_ z{S=YJ@29dI$j$&4eRBWUWcFWm0JAX% zn4e35H>c3w55hMO(iVprJE$LGhuMdb4Lr;&B@JGlM!!slPp8xRN8ztW=yAv3ZpY}Y z$Ke^r>4FS6IfGWof}ds5jwj&OC+L+Y;n64Qv!~!qr{w;Qr`f;9S)oT5--kW!)2B<|4JGu~2k^BAbhk&a!XtXdW4Qlg zI=K{HQc6F20-tz7w|)kHdMbBMe#Y*bUSKx$1@jv(;XN;D#d5f`jCObh>%O9wy@p4< zrcYJCF%|TeO89Ce-SsVBKk2q&`a6vKz2kV_dwB7C`soKa>jT~DBmA+7_WT5Q`b2O1 z3{Uw?U;hH{{vucR{L1PBzG2q#8}p^#;gR3zlRx0-AN1!M_(~1k>~2P9c7WG)psPB<`5kHVPVgUdI-oP$r!&2)3p~FI{irK^tgGBT zpc}i7=z*D859Wde>}Nq=wuF-`>3>#mi4|?v6V~oYFYE;m>qTeSz)?2zhu&~rZ@Ob2 zxZalb?+e@ZrFYuFp?35`d-$k5th_1->&rJA#m>@^p2tMyrJ}iVepY*bo1ejm*Piv zUW)D`keQBPwr(UmaU`8T3QinF|M7tDdC+}E!&;-|{`sTX|JYc}BF8d+HxAAnN1Kg@ z>%3^c39!usI>{Rj@uo|B;B+5adtzg^DqnURHVK)@BxX^5u&*DTHyKWtOxOFv#s0MI z6j*Z#9Xb_un@S&@)_7iF8qfQ7dgJrU)7AJl^`SGkk4dv|Os`oyX8UY7cs6~14xBcJ zZWaVr1kyw2!p3vywZX7YFnuWmjt`-K&x4ER(Y@!x8uRIS3t-m;^pS;d#6tSbBKX20 z+H?v0b1^+}Dco}@owy91yG(u$Oqa8})=JD?uV6l86>PMMjtqmn!|2@AaNKITE*!oa zPTQ=3)z{D=k+4f7oxT0aAlwQY2;2s?{(S{%GOj;@G@&&Sio ziEvEAEcVZWe8G5>`J+hn#|4PSNS7 z;qcRR$J~J*y<)7e+v%0MHdyo zsRgvg9k~29?OF&M7Sa)S;qiCr3q|m@BKl`Be5Y9M9&wM|=ayjRRKoo5132sf{rVxy zH~Z24e;0o$?@6h zLi`qW>Hh48f;#@>ra)UN!pe&D93^;=5`9n^UZG5vslaDcXoIG3wJPnU26tDZW7T24 zUUSverJK6j8W`-?V5q7EKi5>}O<=5+x^xq`N*l8=+RV>2hc`E;zw5v^b!dy0uu@BU zwk|wSmrl`xm+R3lTfwJW(fV!RudV5EZQ*Wh>8<+k41K!50A|rc1}v)54ufZg3>}T& z)<*P7V|cVNebxltWFl|C(UcqLVTPHa8S_~kV22L$fsXL9j`Rz2_>?)_wln;t6Fs&I z+_ek6r7JwWD}AdQyssOr+yj2vogQQXx3ZvDSi+u`^cgF7qZM6k4PUpWyZ3^d^rC0l zzyoaL?$tKz{@fO`leWy;^o2k7p~u+4UF_)1_V6@&`er|PZ$DaT0Q{ssJ82>i)S?w&k^-8T)x zZ0a!PH{9Vp?zG|vxO6z}FcQ`sNiQ1(j~Ydv@_=JJ=r5k|RZqI>78T50yM^?gMexE! zbm?L^V==9}6#lS;9<>baxQvcj4*M^sudaZ1u8^Ft3VgVd<9=bVP8hv-H9UMZofQtR z52rsy!2dl}vP9-@b*!R^!N_37}Wbh*3E5qAH36tnwB znfE;oH#<%*$bg4t(8n|3wVCw$Ecj9u-Qgts`vg7t6x{n1z2h`I?==1341DAa-TWN< z<}B@=4Vz}u>(0Xy&(rxiaAFSq=K_510^KJU*2Fm0;GZg!%RdaPR~A{zEwJA>HgTT=9q=S_&JN z(rcfoF7Sng99&7yhAp{e#v1(ZLO{bA#mgGz}qswT5&@R-vGQTY3fBSP`yiLi;GeR!Vfd zG90K(7pcIhDzrvZxLlQXRf7%H=m>RqygGeB1Ky@V|I~!bF<{hQmrspX~nSI8a``H8}|DD!e2ePaJ&r$J#6GRq}+yExnqmj0b3r> zwD129sOZB3oa``YYsWCm9v*8?XZM4*^rL_Dhi~<#EgfKG2YSvx7&WDjKYop>Mmw`(0_(AuzZ8+D(2#Vux@StA-&MGmMMQxx<^? z>F>kgo5N{~k+9N8diE%I;3zu9177Yyzx0Gpd(!%2;IE_Uabw|bW9hBq;2GoS0xvk( zi&mKcKO0Xwdc&=~>6Je4Xdn8lFTBZDeg_;UvU?9d%oP2Y&zcN7Or{U`!^`~X7Xk38 z0J`l|_{$V}>@>LRG{B$NgXg1txHoamF>^X-%69{h%q^pDA z>p^t)V7N&zJu?Iz5F&T44q^A_p_rWvW!`21{CPe-W+B{VA-#DKJZ%wub1}SkF|D)| zezJrfxD3`?MlW9udn~6BbLcq{!h7S4*LTZ!<;ZM0_`+$oOU7!Oa0r>`f#yA$N+nef6)x-<*U$f9*m!XHl1qfWscPth@_VgJ+g)idzUGm;a|fe+7e+%Fr} z$)*>dhlii1vvT0|IrPU1@P8NRPPy>ki*og>Tvp$mhuMNW=8yB?ttMKHj^p$Hce;csx8b4bbu4C}vIz#)LaPyn=qFeu8=y{6^GYc?SSHQ69Hk^N( zHZO$#+@S;R!hP=2yNclXMf9U$_*k*Li-3FF#fTEj%u1LG4`9Cs^yP+Be>)d zZC46wm(mNLz{8%<8BgJ;r}T$saNaYz;|sX{Iqm-vwtY$OEQ3SK=!fMnUyT#x+@#KH z4BozCIJ^RGUqP?0geO(X8_;>f4g7tJ+5NZ7`@V;py{8v^fQNpdk5|EKtLXP1VScfz zANj>Pe8%ASCx(;1z`eiFJHEp6zS0k>;Um>_^Y8GRZ?yXl*z^azt_Gf1L+97R{35$+ z`9=Qx{QuzbPY(LjVW3qfZzaEuTRB#bS!6xW@a_+s`-e9B2iN_j{Tg7N*}g$KQGAl7 z5Fer`{ah_k(8T?}0YOFF>{4zi+)t>Ht~v}P~(RZrT@25x5~Z=l$Q z8@OnTnP|)WS0A{r58cZSR1y^{REB(_AzT+l$j~K%4bBAH(G>rLScR0+Q zemxw{9!?vLgnx{ny+^^8qv$vfc#a2s*AqVINvn^6%SO{KV_}1_boe;fYaE^91;={P zwd3L2<7sPeSk;>j@_`5Y(1(2CRlag}>xt~%&JVNilbBDK3|ma5MSpmo!`uq%d>kPVPCR{L+wwevA%%%h9z>ah1)IfM;AYC2=pADi7 zgW+#;>G2_O4}4Ha|M0augx&9iVs;>udD8{(i}|$ELb&ZhI&2XqU zwS=}@1}iV4=PZW@EvFBzfLE-b%T~f?R?-GxaP=zMYcuHN zubb#`Ti|Y6=&f7f8C&UsSU5SBRuSQ6+i1r)xOE)8G9DfsPoGVIHzmm39TVBTM-pa= zNz7;MfE{+w2X?~CcG53)!KZf7ZTG-mcGF|`!d>^$TlT@z_tCeK;eE-p@&WkietJ*} z+$x1$aS--ANS{fCH>T3nhv4gn=PQp)4&;w7wdZ*~+r(uuN^yxG3hBNfnv+%XEbhm6+A)B6Y z9`1jhPR@as~ced-zq?i?2X8G=U#9q3xC6 z=1TM;W!PPr&QyWdsnAubaK0*St_J^UN(ZRJebnh)8t{A#`jIAlOjC;=@Bvy{(jD0d zZOqKHnG4NfzvlF19XLsc{?`KLwx6`nlJ0iwbTQD@Ww=le9;QcUw1T5r(H~mFd9CS= zZQ=Shw7))Vt55GVfI|)FhlcP`Lt4iOe%p>7ZVb0Krq`RmlT73d=$LW?f7@erzdiH5 z9pGji=mj0&p&jYt=I~l``h6$(QYX4Y7x;H)dU98|cUO8xH+Wt*`ayU2NO!uq1^lK5 z?QRL1TGH#R;E7grzBQa^P5X z3>OckZJl9FXFAjcc5|VRy25K*>9=n1MK}3v2pz%=Od5t+uVKu$yTifm^!?#*+Hktr zNVsAIJ#-XoJc?fH0sDB+mptKkPx|+0xM(!pdn~LmmYz2bb{$6_@q#0~=r`lx3*%{1 zZ}{f~dZG`^7p1QcUz9{&4CeaE8!(;74QTmc_IeTz7%~|)lD|PC{b6r^&T|9cxB$9t z3e1x}n8K6VOv6BZ8pDw3u*-BheFhvp<9{{Xby!qe8wKzOMKNav!2nDo3`D&KVfQDg z*SZD*7K%y96~#blK~P~N1;jwwKoogxWqQ z=0BX_o6htwSGcV!z0M7u>_#VTggF84jhw(scNEUKGwihq{`xPyzyluQL5FRIS8t|o zZ-I|&q1$hTD?RC{+u-io=pEbPdE4ppJK()L=G(fd$2d+!l}+UEnz|A~YRBk6rn@Tw^KW;C1_ zO}CAOpT*FV55k%U>1}cFoH+ViJRA~Fe@%d|C(uI@;ns=t>cjAa!}O6O@RlQVIc@xahs|ID5a5g4&@J=55m8r>XR$bXX&u-kJf=&Y;g`!h165FDKw@ zC+NYa;8v$-$J6lm)AZpicykv0{0y9RhSoX@f6S)mo`Vg}(V;o8Lk?YX9!@w~d5@g;QYoA8qx^n_b**IV?K+wkAF=`(lWpgW@X33u81p!=w` zyw7}PDLl56K2!#8Dx;s4!>7t=jfe322lVVm@PJ43p2zU=$Mm%)aNHBR)l>L!1wH;5 z+~pa)`8hoEIh|Dr@2;djzJM>kpbcKaEndG*H3`#1W@clgA2y6aE4?uY0-{wI46`ir%SQNN13k70R&P=` zY?DO%tS4-aMDg%*N(p}sP?9K~-rl!>i(1eFlqG)Q%H;A^D35AI$F+txwx%Dez?mv^ zm$q;yFI+5J$<0-U#ogiP z?zB=*xV#5Fx)4D&i-RYqUJJ^`2!<3&4^Yrfvb#ZD^pm83Go=@{B{94s40yN!p<$I}@TU^cgV0-LLuh(g{(hI*6X`bo6?6xe7A9X%Cxo=TTb zgSmr~(NomMSD;nEU@I?Lc+OKIEX@QCGf z&)ok0b4~8eX)T&RYY^*T9Nzp5wbbYbAP$Z=MINlkf}X zx$DLD+Xk^UaF!^(kuGt?*eVwZzhHjARb)5am}R&l%Qcg!$oINSx+r#L`mY$UVUyS% z@etc5oAH7qd4VTh5aG#w8n?n9f~EMs$#+PU^-3w-J90E&1XqQlUdMKT?7v8m(uG$A*+DGez!N2y?w&C!Ia5_>BZ;;ca z2jJubv@8;S9YLE%!F{4=pJ;edG@Ta%%VX&JSom%%Z4?K0j1#@*#j*F)1k`pWFn@ap zzIcf4dl>$iNH0DD4?jXj9EH~(rSBhuj~}C@$Kh8=v{^FTJDK)QffuIGxv6k?D*ZbR zzLQ3e%z!&&&`z1~v`jkX1nhN!esdDOa8mT{bc(&(WT7@Ji}`^w@VYbfy=*us8)I?d z*_`DSIW7k^%^Y#HUd<5~U(PorTN_Nl>#`nfNog? zKP;rj7Q^br^rp+O^<_9wo_+-mxFYsza#b92{WTtQW(hKb5|KSF5t-^uv7L5HY&~yt ztnFQlHN7jwR^1g@ulvlD%8)%N6(lZt^WpYcr8v><{K_$ zOciP_Rm>k$!)evDS}j~vLtE9sI(4-FJJ|LeUHBf3d`~xhfJ;Bnrk`NhC)({ZZ2pN-AsNIt>H|_*W zI?*m_@N_jgO)PFHn?FLkDMy28J@(6-&+5#8uW4S0hFU8)HuYtpjr@M|sFya(K; z2kp}nUeuG$>jleu(e=IIyS-^6ZMdVh=si!Hy{GD+wo`}sTV42~F5Ooj{;5YV?gtO= zM@RIB*Y~II4}gykprr=ztAVuHAh`D++S?FbXh`P{hQkNbzlXqghR`Gbf;;?0I}L-U z4Wm1q%nIABL*O}1wOyML`S~41bIf|Y>2Ifbf?iguz z+(NdEMPb2MDL-V}j*}|h#vjI`Ry>|B7&sADnn^U)7WItbkvqkM-8{ju4Ynx=v$iOSc&q%mdM&!N)^8q(9sIU`$chaAGQ{5E#F~{ zMw8^vXP}TZgQ3>n@W+|-+*z=}EIM>H>@b@ynFA-xp;hL=6>~*Xq4U_3=X}&=&1asy z01jS2e_jalO?zu04{T_Ig0hY1KHElg|86n6zio#s*-ot90(+5#ED_t{rD9vZjANg! zXx{Oq6;l2KyOj=NKgBaV*Nn}>e z%!arkYws$ubFL!$;3l?u?qa*>UydE?fw3AMV(b+Uku`2+_S_R$jwerz);9R#R<6+8 z?XbaiI&=r@u!An~f)l)Gm0fVf&Oa-@ORTsLYO{QpXZymzzVv55_^Kam7yv5=(5nLB zae;K=ZrEct{VWLPHJlT~Go-mk6cpFZoDg_m2nU9Q!Ye}Q>wDq&y>#pS@RNP?gfO^k z7`-JN{yUsLBZq_J;;c_NAQr|wLTpnbxj=iOF~%`kES^S;$gE?T4UI$AA&!f;CLW#` z&;1@vfISn$!VEpch3Rn^wa91+<^)z}&2F%6lkio@Uor%JPOom5JG>2X%7*?J{;mk>f-A}`xPSNwS zngDIr!;WdQuLokwb4i56?bNpS=L{-4=F%NBnZJxp4a; z3xji;3+;1RaLiK_^7!(@`S9j^`gsAIRX}SM!5<6hxy7(SF&%mtcDPKJT!9m=&??v9 zimQJv*K1P#-qMomJdbkS2d>Z!uv&%v^1ERU*$ zRV(R@FJOxobmo7s?|*ddOE~`}t^XQscqOKs`I=`h<}GS2Z<#-+g43#KwHmmpnzpKi zb!ut+O(~q$1BklGHHvdFte1?5K(=}h5eR#SL^pBOK94H#Widn`jdy8J?b$WQv=H zYYW({1)bg!_HId6E5o_Uv~FwocPrXX1s}M2imtIY|~LD9-$;MK0--RyC-FCtO`q1X_rp$^iFh|8q5O(sPO<*>L^@NXQcAIu=)QXJPhEPkK0I8Xj_3z-GH(4infv`wINqP3bYOE> zGeFi|@!$|KP{s#`TLv=4gF~hv2JAMJDIOeZ2gCV;`9l4naKjMMS>{l77BdVrmto8w z42OBgIW?R|RU3&y)d+@GM$O>>BZmIQDA*b^EHr^5P3R_5xYU$39SzGy({5v6^D%VB zSlDMQT{8~O8%OI+fa}N8_7h>FiFEWN*m)9NJ{eA(j9Fmj_EW^n#x$-#`gDv5 zm@ea^n~9mo)|(?slFzk7W?;#Eg<8Q5R&%!Dguh?NSR$(8b)h1#rH%(G|1 z!L#YlbKt9UXv2B1@;rLgKk&GJ=*0Q3$9($P0{HX-T5}QnVIiC-pJ4+JwBcC`TnyVU z=9pqzINFw0vWLs<=+R5yPD^O_rLg5v(XY}n_FK0cwSwi$`#HdkE9j*wVUv|~>?+uG z75&f=PIsi$*TB`QY3sGH?piuv9c;IbE?N&qtyehQ2`t;d@+fCm)tTPt0$aGynXa&} zD_!db=eyDR?r_7#KNqFDxF|QF=CX-oaYWL!p8z;b$1lr{gJpB-zmI&`kq^l0Ymk!f9N8w*bXxn4(h+}kQ61*XaE zAE#w0@atsSJQePfO8cb2i_+-4bXcBF*Jr?YGte(?1wNVLZGQd)ZvnBVkZn38ZUOyH zi)?Wgv+>!;w6aBZEt|K6%yX#up5uONbKv|OTK@vvaQ@Hrc|lyCmr!%L#QZ@noR&+g z<-=8Zv{eDDQ$YI{!o0CAFXW;Z7NHPX#IUItE-j`_ufVb^wA)qK{3@Ms4feT4*IbA5 cuG4xq;QA8U{w8d6la9UxJKvINhbn3PANrppKL7v# diff --git a/demos/ExpertTennis.demo b/demos/ExpertTennis.demo index 3e193f14f1e1a1dc2a022759fe74655e1b0810d1..b9354b2d821339df6df70a0bb99867d571ce366b 100644 GIT binary patch delta 31912 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 V))`l?if{<*I#+?a=et-J{6G264s`$k delta 10182 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 gPV`(>I0=W|iG^PNYdE;59r)PMgRZ+ diff --git a/demos/ExpertWalker.demo b/demos/ExpertWalker.demo index 881fc535e2a99a47d3f0d8a6dda152c6e0d59992..c71b5a80d6f1bea6e059c650b6ae3a393695812e 100644 GIT binary patch delta 108918 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 delta 42919 zcmXxsbyybm`p5ALl@cW82$fU`6$t~d2m?@%m{(4D~ze=g`*8na4`bdwz>d)b?i3|8^-(vpiw1U5utywktxagXE zx~c9iu+Ms-qc;j%{j<;={sQaz3vC?Czn2=uUx)Vc*R==u>&+wlb6Ku-xR&n@9) zhjOZvGOmIus=<3)@^w_MkGOmqaiF>d&}|0}b^-5t0NVlJ%6DL#=qP^TAZeg}JYYBp zNS+J~&m1LKUN&=-@EtwpQf1HKs#r)RzK~0EDV5(6t}tsHXtoDToq<#Cz?Y4HTL5r- z8=$%yh};LX9Rw_rfvhw@<~Lei^D8e0U#2R)#MN+(O6eMx(M_s|8(gt>aG>i?z~&)v z@i8#=IpF^ac=#5W*$*TP0lg!Dqxfik;zAifZQ^Lb@}>!+h3^=pNmZr6)vimWqswJ! zNEL6ul`|FVOe}FcTXi zSUw;+M)-~yC0D~4FsSW7w1U&wshC#>@$~!i0G=(Cw)bQFB~Hwh}0T! zt|lo_enyk=K-xs$vnH@^8gR=HP%#Denggv?fVn-8xdsq%2ZH=)xd?wB^}$q%!Tk4O z7)}))#+4jN)v}kXGX@8&4+6PKfMgo5B?EYn4d~?oM~i@-+knHLK*0k*{xJ~QO3U|N z@^af7D(yF179XkNK5%9IN7el=*T5hSxQqa$Vq*NV6J&s03czy}VBu8Y+zeoN7T`G_ zsIUYymjel_#RSVwR*4Be&t5kwV>d3xpQ%zea20N$8rsYy7K8)7JAj%!z_k6qp~JxY zV}RXh;A$2ia}fwG02)dFqjDhqJ}tkg<>iq^Dyv2=ucuTwEnJoDR1)o6ihtuk_b%eg?Fg}7k(lexI?9c68(oUOS+9H>g{ zxf-3Rl%2V>*Wo~%H_+_|EDr%Lg#%JiKtL?;=qR9n5=cA?^!*ArT?WdEX<4+Gm(|Ot zeC}{X-=nJjldIz)mF`0>;|3f^Z3c!~fwi5$&5yvOPr#mUz{}AR{13006p--)qj(~| z;jIbO=}8EN74#&8&uB1*Dr`1a(gLdH`CR>rsZ1AhSy|yg&PqUH4X}AVaQ|muhCgs* zEAVkAU>^hI#{+UnKxit^dY+cG&hxVQC92qqT$zPbT?JesH>hk%xtwp~K*=9~@&jP! zU%<1cz=96oY&Y<|7w{Ma%7+0BF-d;mm~lXlvZP>nuCk=?9UU~NQq;K$bf^Zkx#SI~ zT=ltpX5m2fJV4hHIA{aBa{z2zfGZxrI3FM=5UAe{814a*e*uOQXn9!zFMFm?WuN4# zI7cOZj!W|bmEUh%VYxWaoDZ0m0H?};FZTeqN5Jj>0je*6$k#yIJHX-}AnP+ABRW>F zyk^W;;X4LPQx!{bHH@cH8qZ}ki7H|uSFGAt{zSU80GpY>#W}#(g@FGO;Nc2j=1)Mv zTAkjpZeDn5xTgVCGB92Yh%rBZ#UqP*}xb6xKWV zN8Wp>a`$i*N8|UE;(>@n;AsjlKOH!80r++WaK8?e-2&AA0HW^$9gTqfOIkkpf|v9E zrW$z7CHH~K>5n%W@;CTk9I1gxE0uqX7`N?%&?!8TAe4ESh zPpZ^ExC$Ro4c+GwtH%M~CZOgeFzpR+=mYTnU%>7waCMXnKe5bMAXpw~PzH=NfbB)Bz_0_#_)e3S>hxOlqtyymPM6hh3}}YPUWM<6|GHGt;N+blS+3cm$4BJ zq?!Ul=D=EO;HEt=$r;$=4!qn5m<0eC+Ze^W@eS{NK;2OqRyfMT1}CY)PH-iirD{II z)&DD%>91T?IXIA$2S^kHo9_Vk{{&_{1dcogK0X8NUjg}V0l9u4bO>l2Ehkvk8Z9S$ zMsq2u*s)xhKTvhabBRo(vYEi;tSZO<%$H0Bl=Xm}vw>&xfdz|!v&(_+j(~?NQ0@t6 z_yRFOK+jHEp1YHm9b%|bqPYsCR>^Vr4J-}5lOeH?dr70#aC_hno;fse!%JVxm%K@g! zz$ta$i#Fh<58R#$s4fB`mjZ3JfW;~xYaJltL(6M6@p5n=RdE1U!*(jA?OaBCs3LZA z#YW*kS1e$Y09-r?j6DbV{{}p~49xr;NVo~~RsxQ-Kw$%*_JWo-J?G`9*Hl%nxZ2-Q z>Ad5z{D&&OpDX1P4h((+T*v&tFMC4@m^dETJrQ`J2`rihq#FVwCV-bYP-z9||MY`k zd56;v!cQ=9Eme~%SDzP^i5HiXA61$!SGGS6h;IY@b^*09!1RN_;UwTgDzGvG$jb&~ z^MH^dpz$_fRzu4Ns(Cr1o~pA>SjEj0)=m5)?^deZmt4gi_i%a7VD&M2*;Wa_Tn@-o0z}k-py@vfmW!tS zD166yBPvBBF2i|L;ig>47E~?fT%AjBz}gnb{Rxm<2W;^M9{2%zA;8gapeGV=hy@Cc z0`ez;$V^(km%+#Z=uzTmv_7z@-u>tpO%90K1xj=dHlPPT<@} zVE8}4^BYhxT7jQfQwm5>R1hpbQBV-RW3MWeu_~9N7FFt0u0lPkp&49ahB)AB0@RoR z)2x6)D}nc`0lW3U)t>wRGTU%;KGfLaF-)eW@w0+xe7-Y7-E@+T2R;XBHXrE-?! z3X!KOk>hGqrczes(pKSr*<2Dg1?Zj*ET08jng>W(0s%I_BL_g=1xWM&`ZfVhfk0UV zEsI9*vU)U?PZU>l994BJS4RSsZUUF_F&s!e1q@{ZYjc5{`M{(SU{4wF@*ZIJ2*~&! zqxc2B;r$w@>!D$V9v(IrpbGoMmGqse`5RaN7$rfOj!_amxRrzw|AU<)3rHvdo7I5( zTEL8%z>zt?#|41>5+HvCAomjxx)x~NNXuFqdD%RGD%PJXa~oCHRxXj9;}xP1P@f$Fb-?r3Fx*@I(&ck+Pk1mKDWFisZ;G63q00Yft&c^NS5s4Q4s=BOC}6r1I28?ii38jcf!is7YB~^k0cg7dSX>9P zZUHjYw7jN@mxJr5iXU+`JfTv0!e#W5D&hrKY&#BgbpbZLz{LSz>@eUjI)R_~p)@e_ zM<8Jm&^sA$oDLKk0cwjT2$nZ3oFIJ1sHId@OSsx?sdQ|)ELTy*|HPHzj01!2fa@mU zMgTBzJFt5<@M0gZ=n#;e42+}!UYS5;4xs-#E$_I-%ZWFsnr?9QRZ^K$ayivfrPXj{ zKg0p?{{eo_f!bHV^moAFe&E9pqiE$se%L&5KvotAQ3M)Q0kdfn1;Yn)Ckmf2!;q@e zKv>156xJsEBX4u6Tr;lX#rS=t6+na&@YEHU?**Lk1-=CV?qNXLUO@c-5PbybI1bon z(DKQ2Ue3>^8o0nEmq+Dtl`FJ}s`NTnRVfbWQ~>eSz}q@tMH6uOB_RC<2>bxl{REuhy39Bl!5+5m?xpr8kk9{?gnR0RKu|DKBQ8QUZTk*Y1hWg$lu zC(D(kMAfaxH84?yKMf129`L>hu)70X{S%OR2n0VS#7dMj zJW~;)Kgw5P*-3-(Z+I}}E&js6KEQPdxG@4u6j$Yk+bsjUPyiOG0_jtMkr{y3Y@l*J zpl_urSl+QrRrtXruB2+R^RBRpA5d7|=O20hMU~sgRs00Muk;d#_#1fo z9+>|xaOMl}O@#j#Wr@2aP$mbcD+AH$K!-M9KTA!pe9}lw_>B4Us0K{ATw1=6!^`FQRATvD z8YNV|#auCER5f?FnksR?q!vhP06sSZ>)L=@oq$RYu=f+t`VBB2qt5^AW=a7f$Rv9wYUstQibbrCC{O1na$N{f&% z0f${cK@1>&5QscM%lD4+a@!dy?K4~!zf#4W=gPW7)qRm`;3^Kd6al5TfeC*CyB+|~ z{{j|11I~2-!`*;qA5bv}XpR60V>JZJPb4*j@7OC(Wh~F-IDslvnX6EPYDk?+Y^nx- zG`=%{npwcK`M@Dd;JpoC=LlSN0c1RZU>~3%5HQ*Sq({^8n@bz{ zcdigoO+l56(G<<80s#wwM@s;GTOjc#pl>bU z3f7gxtVD&2it#<4h%dK4Hs0jxa>-24@obQ#!l4S0D2 zFslSIY8b^0_=a~gQ1^<46<+bM!8@w3w_Hj6RLy-{{XX$oAao_r>N;7ltmQgc_;H$hQN?<4W%^Qe`EZE@Q`rP@ zId8>*lAVBZ46rjEc$Nq(NCnQO1K%$I9#?_#>wv~>Am$ICr;e8A*734K6IIF+u7a0T zgD<$`-%z>!&E?aL1J%8N?jUe*7?ru7+AFrCKhdMyiMguGs(KK-Y7?<~4Bf9WeGE!2dI& z=;2g;*qIVQf-KOh2so+%g<61`(Nw|kCc~-1XN)qXsxskfH>c7u=d!e>inroQS%CwC zPJruL;D#44(GS=i47>;f7DWQ-2Y`_yfY%A2@(iG#L(4m|c{wqUs_80MUlEl_5tq{) zs6-d8|&v=%>c$XK9J9xzkY5-cB3(GtF6 z##E}#DZ(n&qp+UAKk}YUl{<^8*ciXBWClbm1D@Ie^H&3B+<r9_|x)} zExg>jmCAT4m*Xy~)SX;~F;qj*Tw(`s!1oAHa~zm<1~_yccz+SFD+I2V0x}gqa5d0S z2N*R0=^eEErk$5Zx~Z(XxxD(Qa(cNc2dN|mxfH+RK=>$Ke$W<4V4gg1S{eAN4y@M! z?&t$*#z52}pnWM|X$R!F=n9rUIqM2PPgzeYXAiCrAF7f~T#bQL%7I+kp*Rp10dz+J z%j1Ac34l}z5O5B7^c$dm1xWlI=(`Cx-37`X(X!|xURHlXaC6Kwe&R{ez@G8I%ZY&5WFTW2qu2=F@HPeNmP`{2D=e8Nd`1IX zs<0JYNk36FJ8|`|r7~U1W#x_oIU50q0ATYr;QlUP#y;T4LEvK&V4nu$X8>|JKxiJ& zdV`j=Zt${sB~@$%S7r@WS2dSN1C>oZm-AyBD0v1bzXEo?1)lW*3xHNYT zGC;WkprH!HOa*!jrVEzm8cY|yqk{=miZNG#8P(t-E_o{|*JWHj%Ws*?*sr+tng_Yw# za}{7(2b_8We0c%5{SDlH52*eNM1BF5~B8<3V=i)%uLcnGzaM2bRy9)4M2R!r!W^M)&LV(_Iz%dFaj0Mz=(ekEb zUXD6NRh7ooo=K&X$z_>K6`#YEav28(uK}(%fg6>;#9Cl?1Ms35SkwljcLF0H0k2O$ zUj&@F4Sf3paDM=l{ROB$1EM>Cj&8vIKUzNdFE8hRr5gCcB{zDepj<}H6h3k2 zSgKMhU8&uc)%4M4LJNO(xgPag1c?_(fjRV!~x%r zK+S)^v~R$n(FXj)@5cgmKLA%J05Y0DurAPG02rA7>5B~n%Wo_Vgzq@AoXToBmzNV& zjw4s4E0u&Rm*RRH2>%&q*#gYl3Y^{ve2oUy#{+i~0ku>hDjjIQ09alH@=9s>QwcB2 zR!}*YbA?n>l~i#x)=??facTdB194A*?si~#H*l#JkQxL6hJi<-hWy0(Rs>a&;`F(p}1BY=Z--4#1Ezu+{^(xe1sQ2<+Jo zyxa|#{Q_hhViX_4H@r^)b-&TD!f!lmaD^)DGFQ^?RL$48`fpO1-sG|>!-1T8fW#wU z^Z$VR&w&}Qfg|sLkNtrCXGT%J5x=XP1Q03}0(j;GELaPi^#Z>80v^FYc^IG(3B()#dXi{)ZW1p$q*0}$ zausAy4W@I+=TNz3bNO7tf$Bm)_XcpV0(e&q*wzDAnt*YwK+qeY{sUn6ACUYN7#5o) zSY9SJOZbkSGE~{)xGEH=#1*(SRjK?`xWY7M@ki6F1DF~Br;LFwivYJ}z->D~bu|#_ z2DEJeEVckyp@7U@T3)k$$UpM_M3ws=SMd=4ev#4~e$EJS;HeBSUlBN?3VfRixa$FBvjO!5K=fju zV>w{IW{zO^oKI z0|cH2>MjBXg+Nj%&|eOCJfP(Z_j$SeFDkLWxHO(o`99@}>7c4<=W6;J2TVQyY5xMB zzX0n-&E+S)B?+j=1ACQ$R&~H!2guY1M2vwT%ejK(B8$1gcdWOeQncYRbfgM*;7WF( zYH{Z3T!#bJ8-U!+fMh7JB?5R51?a^AM-zaalYqlHpx`$^{t6ITLd*AxdAY5OO1q59 zqKYc+9#_^Qs_ute0}VLf(gKvW0Ta4_T|L0_Pr$}=}1kP3h z-)jJm2B5qd&}aikTAtg_%MPEZQig<8R4`8vgCqPSc?l|4@p-}r_mP^%&shBf zpgR#bs0qB&1#At0D<;4=b0EkHs9y;ft^tzQ1H-A;6QUcV44J+N(H{818&*C?W+XAp8!-Xn#X?vFrk93J}Kv`z1394)m)DCRH=1b zg-ujLPq@UM;iPW|P}2=e>jMrA0`G?bJF)rvvRB6eG73Pj3eYeGFq#3R8_yRkznME< z`00!+qOw}V<+Y3|XDL^u9hHO~m!cyMgu4JO9>6>w;B+AHbvv+r4{+xfKd&Jx z&EvAVh66b_0EtRqa}9969+=S#9BBnUz5(n%0{Q;|a^HZ^(F^&7TV)msmbGLS3ZKzj zkt$Y!D^r!KONC2Bi^^sym$NPolo$ZYCcsWJ;Mp=@!AjulYT&yY;PEq1z6H?O3dHOL zdiK-u-2J@laD*!5Fjv8Gs=;Gi@@J@APjmUC<3RNVK=&$e@H+7B7GV1aaOFNQ?k^zd zDNx@I7&RxBH^o6NK%PQa%sv_`N?sG{kVufh~`Ov=@j79 zbl{5-;5HAqZ2_p-0Fe$rn=@eH0c33gWI}0qO$aXsM^F`qb2UU!DMfJ^#Zg7Xa>X9P zfv#l0<`i%-6BwHd_~!!;i-DPCK*Bws_aWf;KcMhApw>mpn>u+ps)wrTBUk$;DxFVU zmfxx3zX_`-#f+bEP#kcT1#Tz;6V-s-TEGiEV9^{PeE~4C81PyFR5}6r?q-7F9qY}6 zA8z7Cs-~a0`uwR({JEUAQKfC=$_~Q;@kqe$08o1bn0^8{d?u2$onl-ZZ}u)2mHR$e?Y`n;OQuHe&P9Jfiv>J zH)X(G11Qr0)D3`WW1wRZV87g4uzb?ST=ZkCTvZ!zKxYdO z9}2vU09Hf;m*W8GL?AE)s5=K3TmX`;0R6uM9_6%rp^TTytEj}PxHRghd>?VeJfW)j zA6HWg4w$q9X2gR@|i&7 zWm>*>iI>~1QE6Y}vbaeVcY`adlB&CcYv4~DaCr!nJ_aT{2X?&zp1%ba_5*12xNmX->c) zSKz%TVCM^54FY7sfZ)AA!+yZ%2#}si%WqP6c_f|6DxJ$Kn=0o5SLIbIiK|?Sg*Xsi z3bd31^QwWpr!1|ZKoxcIK4?xtvK>HWKa@1me*}QR!1(Ur*LWO;6R){&^;Gez6iLq6p*q50#*T!)&cq(fW*x}UkKn70hIkh%c8&V zvie~vpF>>H$Ed24xjIf!>7L>;K8FLTzX3y+fwjK_H*W%y?gD#iftL+{SqqTS#whN> zH@tg*y3aJM@R^4VM3xBtmtkQ`gm0Q8Aqc_$B_vnBES0G&m(}s)|a9)OAuus0BB-42-V0WyC9L=FQ%DYRU4l9%hxQ7N9|GQ2<){u@{F6{?oYT%Gwi zU|j;_mI0Dgz?MhAgZ}|~FMy-3fu47O!#_a5XFy)WhF>;P+D5Q^Ps&F4j&0+qw8wK< zOrnaL$dxsjs#}w5Knn+4W&)*ifC&qMT}y!HD}aSR0q52N!(M==A5aktXodp``)K(| z3@`T{q%uCp<(N#Bn#5I@Mm3bmC3Y4Ee18RME&K*-KTjhpTZvmGXWr?RXrBO9Z-8 zfaU4Hr3--6RUqIx@aPtx{|AtGALwfYoSp(@f77z)-@L5;fy(DSSMej6g3@fZ#A^bQE zHc*9mb0ux2YWCym51}#*;j-F}139|^iC=)thk*OZz>HJCkxbxY4q%@TIX?lgs%X4wUo*%AXlUJ8k)0pNRttWP!7az;{)^ zLklR^12pCUF$;hmD_gq%YmB~ylr@2&VbGWiiaX{Px@UsSL?Sbjez+rdb z!$x3b0Fbv0klhW0>;oDP0%j*^`M?QY&Nxfec}7^pzfoBK%0KeHOqF|yt2ht8uT%^~ z+yS2c3Cw>8oOujit0U5YRCK*h|?9mQRkg7d~VD4^#v4TyhhsTqbaZ zYEqSIa8*sU=TAmQ4~U-)yqyoMSPWcV4oEuzfv!NECt%T+~7M#>wNTTBNx;P zdTarQRY1WyKz;)d8A!|b0(iM?JC*i!E{i=>al5&)exd5#$2Aa(11p&>4@?>OK) z#*rViMhciV9yl}+c&`cAO#`kP0y3sRusP6R1sK@_>1!PY%WqsAg`ek$7nPM4mzN(^ zjxSebFqK3wm*O@Y2;T*?!~pXS0;iLJuc^TL4B$>Spq2+j6#?zH0n0yuyn0&xRL9G* z%~Z}!Tp_JgB`>)e-%u&P;nIGK195#o_aLx*1h^#T#7`_G0|Y1lk5mBtsX*ckpl=r7 zG#@Bi<|J4aUFIZwNA;CdK6YHutEsA2ado&+>AGAWBsA5gIGA*dO%(+Bt zsBEmcoNaNSdbLEnJ-(X0504W)qOAAn)i zRf6SZs;h+W=&41OJ(a6Mk4jvROLGpD-)ych6C7wZ15B-eQ!9Zls{yz5!0n#_RevCI zE6}zRu!sS&;sKcxw7ljxF9)BYDn8BCaGpx(JeScWs)&nRu~%`R>pEa_8@TufF!ll9 z{}=G^DKN7GNazN7djZEmpl}#a8@pPtyh(Dk@ExP%sjB3-+Lftvl({T5sN&VRQl_lt zk7jT>;5rMqF%Ot%3GB83UN``YT!3^BU}O{E6$n&r2lS(9c}Em4C&p1V#d7r}P?;of zIi*mgo#e_sg#+SQfL|_9n-5Gc0S=b|AMODw9|3v)17u$SA+LePcYxUdEg$&A%NgIP zI=>04SagjbtjDYoKC!nnRjw3QvFsXtMkOU6LJfGT1OTR| zYk>|gz&?PMPx|w6{x+(Ctz2@usa$q(h3=y&jp3>~fCD;5f%p@^+cUt5UxCY)0O@N$ z;0>Uz0x+lnlInr}CcxtrEnn#1wVsE)L`l)>TxMGH=Y6iKQzT$w%XlH)Vw6VZv zd0^cH;FboUq6_Rb09uU!b2A`w86dI}2y%56EEl;r3qQ|#Pbx)EE<<0ca38MZAgY!? zuFg;#u-*yeMgx-Z1i_yO+>+?be+q=~LiTJMg6oaO(wb4*;seK%}S(KXIEhVDTf6H3^W>aS<%9(RLBO zQLsK$@l39Uxl~GXxr`Q3MJ(iswZMTcYrw_w*NEpz#7ce_W%Ln3lIU|XxGf`N@X%yC}{3GuS zs@!z0;`8`@rAt6WA@H;mm|p>$sRq8)0q#ve*-JqE4G{eS==c|~AED)w!@Qg?wpLIB zqHBeZDknqbGL9=$fvWUJt}5lV{DJ6b0P#A&TYX@KF>rYiAiWF-v;*o^0S0bB(gvV^ zGvKjfX}}H>#hK|eg{-;0ekNP zt+jx8Baqnwh_nMi?`gT{9WU4aL#6l+m*E$x@XuVyBI^YI+P`I;@QFLetm9|2mIiXi z1Co<~Et7!<(*Qjq;HW9kV-7f20|oYgyfYB#Ef`L{=f%ryepK3iToxfzalu?!;Z)sW zTm!psz-1p$dJve94D3n+o@W3HbAWSsz;F@Zc?YQY6VQAJBsA0VlO|s7ZKX19<#Oz# zN`1ps_>pSp1D9Ao4)_iMH6y?@aW{VALo&d71;9=fxH=V((F1~K0}b;5qs2h_N;kps z8#_1QCpfa2%4#*2*LtcPH?GQ`sU&{pQuM`v@F1XN2QY6haC$%R^)RshIB@4QpmrXJ zx(Kuv0G6dd-XFC5=`JtJKA>{G&lU0)RY@aP<5Mc-r(D`EaUkw*p!+?r{9oYG7eH#% zdVbjeN#Kzjpsx%hssnx6fRjE@HgCOPS#;id;XA5ZQu$bLMcYtSTXS_dQ0Y2w8Lz^D z)OEm+H?Vdya5Ds$6anms0$#=fW(h#XNk;KGe8c-Upe~<=74mu5poA){m@BD_s`(CA z|2-z>FT?$S2_AH^6?3JHK$g6d*Sq2%QMDYPk!RwY1!Y z&uBiADprpxa}HJ4Y%Y<7R5lB^oXv5d#0pTh2X?Ljo~;KKYy{5w1K+m-9=m|@7(nA7 z5R(M-oT25pXL#A+SE`irTm_e?1}}2SU!!s@CjM}TB84}Ridc@M$zGIs`&9-DN3IFK@6$^uG+wjnZU%k!0v^>izUD!TOj=>U}P=eP-X_GTLIB4fsWOHy%#N?^z;&bw)wtP13p}G!Bj3mT%lo9r8~H)cH)3e z3=kg=yiEjFqym@I0qJZY@G4Mu9Wb~JB>e&O-v>OJX!*huUM_!0CH9g_;|-PX-&`>t zsA}GGHTB|v$smw6415;#<|ke^4!HFrprQioodUE@2h3*ynezYn(i8 z`c+hltGEo^sKVEAC2yc=@#gB>gag)rK<;)xau2ZO7vRAmK<^lE^c2vO2{_~e1^Iw{ z2@rXgmhV;aa$7Bxb}g4hBUM}jS5^yEcQe<(a~yDa4V1nECj0~J`phVLzJVWhp#*SF z78q6pJk@{-EkJW7kYKt&F#N=1gYX%9&8dvdxg4#jQmwcO?Wu-Va*6$f1HNm48ZTg) zA8;rbcpnDXMFLk305V5`;1fW@8NldQAU%(k-(2P8ks>OqA}+5xR5`b~D*vRC_>)Vq z1_#3HftDsL>b&R0Nf^w0dnQDcF2dBAc4kT>;b!SbgmKMUVcR*%Yg z23N>zs*+h;jq|CL=W}VB;XvFnpxX{uz8bjX21xx31Z)8wg#!9Jfy8K_FAi`@1jmpf#43wPJbMJb^0qC|Bl5s;(1UBIl@V&T=_t;y_6b zpqvlvEC!z40T$c?&OQXbKL$LW1Ldy(jdwsyKhX1ymgj!sWrs1F1eG#+lkimwq^JhR za>5Y?)Ht`=}m4|q2luw4LLSqzL@0R%Y#^{#-S7m(}=3~#07Wm|dK za~DEW6I$N!KVD9JLDlq}tM4_H$!jjB_f%=`xUze2 zKzso3`wrBO@#QC;E)5(W4}6#itegzwO#@_&fDlul(Ht@@C;XwoRwfp3Y@4iz?2D zD{CHAw<*`aLL6{e3Y6Lc6IKDc)&bAGfrXoab0NTRIN%utRKxxm2k+T!r~mLwQ_czvF=KO`xU{m{toMY5?9h19ok|)lNXB2MGQIG<*Y$#%$py zPM6&xSbih3Mfi>*id0sLTwZEaIjUThT2vBRT#D0hAlwjWF#+b81E;NkuPcG|Yk)iJ z0kw@llt0kE6|md|2- z8<6@F2zUTI`U}v11|)U>ecgalA5iv{mPNnvvifL$LHUgG7rturSgLACt`2!BU3o5J z1%Lh^QdNMVDZttpz|C2}r1`)eOW>sqVCD#9xG;)6@eOYupe~e#6+(H~U?){r1Xoft zRdWXX94$fff)tBkrLoz8DL)p*aHUdm;m5I^yvaX|Wyz{n)PYYI>~9nd!p z5-jhS8zg+k#6?t13%UB1Qkg8}a z183d=-}(Xf&y1q7V18G12_RY)=uiagCkG3LPih7WUon3g)qpOSoDr3aAy=p=RjCPA z)dC#QSpvkb0Ny$QE7k&+y#Q%HATSuH3j+)yfusXK{}I3=jg~K@@^X0wl~@LsMh=y4 zHdjm@Rn1kdra~MrxdEhA0H3RYb@jllCP1YX*!u=({Q#K%2V{N)L`H}369>tJ2$qY+ zg$UoVUV%zcfy+>pDqMvtc`8-Q6s}Gk9I!S3a*Y8=GhoXy;DH^Ww;DL=2J~zI9JT-j zp@95OAaXw~-}{A^+YVD{ALg<+P8D~IE9*2>_bIM{b2#8~0Vur!Ot=p0x&=JH3oN`3 zoNEMzTL8~?prQ-V>;)3O(DIYdyxc1iDkx)-P~odON>Zgta23i?4aste{TRw0gzqGv zW->5sI&jDccy9{WSpZk90T~A%*coVW2aGlW=^?cICYYB;!l|snxxAvNaw54ZW2q!! zxfBoKKzK6Hk_ODn1WxAwU-N+V#lW3AfZ9DE>LJkn7_fW}AroScBN^;-qQ zqU*N`KV0>VR6aj*Mf+1#Z{h0LN~OD%%Qy@NQuhKw`+>DbfSbpGNoRmP=Yf|O0kc9N zqm)rxfp2(M19gAVu)<$FZ19XK>?v1L2UT-BSARE^X*ZYE2OP-x7m)Z0Y#z0ZU--Tx zFhd?Vq6~ag2kdo#e0@O97zkYiwAySFENj_p6F#H4BUP*eSEdV9mot}$CzXu{m-7ZX zAo$~eC7ZYL9|u$k#mT)9|9?9QFpmQ=69ADEASjEj7G?6)`dli-TrR@`s_=ZS6NE zN?VP~LYpd1iz{m;Rkt43fFTaJm;$Bdzyxbxmp$-&4Y1H1IJXfP_6Iz-0TsId&3!<^ zQCfa-gqM3yP#K@#ay(0wdWNg;SE`}&Tw*ym;F|~36amxj0Ehkr-ai2B9s^gO0WztVqSbj5VhwvRo#!^|0{A@Nitaa@gwRLY55+Q)Gq z?ljPy1uVY^Tq*#hN`ZiK;87KzUk4;U0s3A5PJaVsy|gUa%ggG6R6YY-(Zf{L-?=(O z!vv)(8YX;kW63an$5c6BNC{Z04&2lRCg}rv<^nGl0%l8r3|mI=DtyCx9ZZPLOm}lxMd3hBEFh5pY(5FxKMTzG4LEWc_;?MlzX{}50&=xL zXamstoR+no^RoGCs@PXtneV8&-g1fjLuJ#?<@^Z;O1=TgW5W4icS-@zegGCs1kP## z-*o{GL!jIQ&@cyLtbiV;aKZ9ir*Pp1=&+V5#g(hTi)zr5OWu#l)tAf19|x+p0=m0^ zgE7Fnc)&IZxRMHt%K(D1f%>a}VG)pg8yK#p~p>{(BhUB^|?L?zzDrP)g5_mV5D z0|%PB0n7;qDd;3vL44p3D9B2|F4DS*WcAZr#NV-_J;Ub84d_>RHLsEU_z zHP}%p*>M@Irixg_73+cnT^@jq4{$LM7`p@T-vd1S1(MBV8+f)v5^=tV`pb4F?7I;ourEuXqkTyvhvL;zWOo#564(Vh_ zGLR-o6S5>(LT)5CNW!Vh38$3nBz4G~WDdEITp%%*?!;WusgP746Osw!NOFWk-MSNX zOQ%Fqf(%K9kR8bm5;S!uXi6tfl81CiI*<*?24Y#dV_DM4l4Kz*k``n|vVz=6?vSKM zmy;eTH%Jo`aimS!>z+I2cKCSk5k5k|ZQca*!m4&2wCm zgCrvdNs{&tXdEO-qa;Zpa&MBV8+f)v5^=tV`pb4F?7I;ourEuXqkTyvhvL;zWOo#564(Vh_ zGLR-o6S5>(LT)5CNW!Vh38$3nBz4G~WDdEITp%%*?!;WusgP746Osw!NOFWk-MSNX zOQ%Fqf(%K9kR8bm5;S!uXi6tfl81CiI*<*?24Y#dV_DM4l4Kz*k``n|vVz=6?vSKM zmy;eTH%Jo`aimS!>z+I2cKCSk5k5k|ZQca*!m4&2wCm zgCrvdNs{&tXdEO-qa;Zpa&MBV8+f)v5^=tV`pb4F?7I;ourEuXqkTyvhvL;zWOo#564(Vh_ zGLR-o6S5>(LT)5CNW!Vh38$3nBz4G~WDdEITp%%*?!;WusgP746Osw!NOFWk-MSNX zOQ%Fqf(%K9kR8bm5;S!uXi6tfl81CiI*<*?24Y#dV_DM4l4Kz*k``n|vVz=6?vSKM zmy;eTH%Jo`aimS!>z+I2cKCSk5k5k|ZQca*!m4&2wCm zgCrvdNs{&tXdEO-qa;Zpa&MBV8+f)v5^=tV`pb4F?7I;ourEuXqkTyvhvL;zWOo#564(Vh_ zGLR-o6S5>(LT)5CNW!Vh38$3nBz4G~WDdEITp%%*?!;WusgP746Osw!NOFWk-MSNX zOQ%Fqf(%K9kR8bm5;S!uXi6tfl81CiI*<*?24Y#dV_DM4l4Kz*k``n|vVz=6?vSKM zmy;eTH%Jo`aimS!>z+I2cKCSk5k5k|ZQca*!m4&2wCm zgCrvdNs{&tXdEO-qa;Zpa&6*JdG|Lv&WwbcLN4#l=D_`7a8t&o9E|v=%bWTALf9DbQQJ4yr(3Ww;-hYCZk!y+ z#)yx)x;bHU7#kxVis=O3WP#Umo9{l>Vkec&czrYf>j(~1ikE{?h&3s>EVEcbO@R>r Dee`g5 From 441a6fcf581e1ce3c96815da6d94669c83de60a3 Mon Sep 17 00:00:00 2001 From: Chris Elion Date: Wed, 6 Nov 2019 13:45:59 -0800 Subject: [PATCH 08/19] remove usage of AgentInfo.stacked_vector_observation --- ml-agents-envs/mlagents/envs/brain.py | 7 ++---- .../mlagents/envs/mock_communicator.py | 15 ++++++----- .../mlagents/envs/tests/test_brain.py | 25 ++++++++++++++----- .../mlagents/trainers/tests/test_simple_rl.py | 25 ++++++++++++++----- 4 files changed, 47 insertions(+), 25 deletions(-) diff --git a/ml-agents-envs/mlagents/envs/brain.py b/ml-agents-envs/mlagents/envs/brain.py index 1dfc45221e..65e25a1936 100644 --- a/ml-agents-envs/mlagents/envs/brain.py +++ b/ml-agents-envs/mlagents/envs/brain.py @@ -273,11 +273,8 @@ def _process_vector_observations( for vo in vec_obs: # TODO consider itertools.chain here proto_vector_obs.extend(vo.float_data.data) - if proto_vector_obs: - # assert proto_vector_obs == x.stacked_vector_observation - np_obs = np.array(proto_vector_obs) - else: - np_obs = np.array(x.stacked_vector_observation) + 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 diff --git a/ml-agents-envs/mlagents/envs/mock_communicator.py b/ml-agents-envs/mlagents/envs/mock_communicator.py index ec539e397c..f6ae48318f 100755 --- a/ml-agents-envs/mlagents/envs/mock_communicator.py +++ b/ml-agents-envs/mlagents/envs/mock_communicator.py @@ -65,9 +65,9 @@ def _get_agent_infos(self): else: vector_action = [1, 2] list_agent_info = [] - observation = [1, 2, 3] + vector_obs = [1, 2, 3] - compressed_obs = [ + observations = [ ObservationProto( compressed_data=None, shape=[30, 40, 3], @@ -75,23 +75,22 @@ def _get_agent_infos(self): ) for _ in range(self.visual_inputs) ] - vector_obs = ObservationProto( - float_data=ObservationProto.FloatData(data=observation), - shape=[len(observation)], + vector_obs_proto = ObservationProto( + float_data=ObservationProto.FloatData(data=vector_obs), + shape=[len(vector_obs)], compression_type=CompressionTypeProto.NONE, ) - compressed_obs.append(vector_obs) + observations.append(vector_obs_proto) for i in range(self.num_agents): list_agent_info.append( AgentInfoProto( - stacked_vector_observation=observation, reward=1, stored_vector_actions=vector_action, done=(i == 2), max_step_reached=False, id=i, - observations=compressed_obs, + observations=observations, ) ) dict_agent_info["RealFakeBrain"] = UnityRLOutputProto.ListAgentInfoProto( diff --git a/ml-agents-envs/mlagents/envs/tests/test_brain.py b/ml-agents-envs/mlagents/envs/tests/test_brain.py index 73b7b23954..598fdf6f5c 100644 --- a/ml-agents-envs/mlagents/envs/tests/test_brain.py +++ b/ml-agents-envs/mlagents/envs/tests/test_brain.py @@ -1,9 +1,14 @@ +from typing import List import logging import numpy as np import sys from unittest import mock from mlagents.envs.communicator_objects.agent_info_pb2 import AgentInfoProto +from mlagents.envs.communicator_objects.compressed_observation_pb2 import ( + ObservationProto, + CompressionTypeProto, +) from mlagents.envs.brain import BrainInfo, BrainParameters test_brain = BrainParameters( @@ -17,11 +22,21 @@ ) +def _make_agent_info_proto(vector_obs: List[float]) -> AgentInfoProto: + agent_info_proto = AgentInfoProto() + obs = ObservationProto( + float_data=ObservationProto.FloatData(data=vector_obs), + shape=[len(vector_obs)], + compression_type=CompressionTypeProto.NONE, + ) + agent_info_proto.observations.append(obs) + return agent_info_proto + + @mock.patch.object(np, "nan_to_num", wraps=np.nan_to_num) @mock.patch.object(logging.Logger, "warning") def test_from_agent_proto_nan(mock_warning, mock_nan_to_num): - 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 @@ -34,8 +49,7 @@ def test_from_agent_proto_nan(mock_warning, mock_nan_to_num): @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 @@ -52,8 +66,7 @@ def test_from_agent_proto_fast_path(mock_warning, mock_nan_to_num): """ 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] diff --git a/ml-agents/mlagents/trainers/tests/test_simple_rl.py b/ml-agents/mlagents/trainers/tests/test_simple_rl.py index 86a9ebcd15..af74c5b326 100644 --- a/ml-agents/mlagents/trainers/tests/test_simple_rl.py +++ b/ml-agents/mlagents/trainers/tests/test_simple_rl.py @@ -11,6 +11,10 @@ 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.compressed_observation_pb2 import ( + ObservationProto, + CompressionTypeProto, +) from mlagents.envs.simple_env_manager import SimpleEnvManager from mlagents.envs.sampler_class import SamplerManager @@ -78,9 +82,14 @@ def step( else: reward = -TIME_PENALTY - agent_info = AgentInfoProto( - stacked_vector_observation=[self.goal] * OBS_SIZE, reward=reward, done=done + vector_obs = [self.goal] * OBS_SIZE + vector_obs_proto = ObservationProto( + float_data=ObservationProto.FloatData(data=vector_obs), + shape=[len(vector_obs)], + compression_type=CompressionTypeProto.NONE, ) + agent_info = AgentInfoProto(reward=reward, done=done) + agent_info.observations.append(vector_obs_proto) if done: self._reset_agent() @@ -104,11 +113,15 @@ def reset( ) -> AllBrainInfo: # type: ignore self._reset_agent() - agent_info = AgentInfoProto( - stacked_vector_observation=[self.goal] * OBS_SIZE, - done=False, - max_step_reached=False, + vector_obs = [self.goal] * OBS_SIZE + vector_obs_proto = ObservationProto( + float_data=ObservationProto.FloatData(data=vector_obs), + shape=[len(vector_obs)], + compression_type=CompressionTypeProto.NONE, ) + agent_info = AgentInfoProto(done=False, max_step_reached=False) + agent_info.observations.append(vector_obs_proto) + return { BRAIN_NAME: BrainInfo.from_agent_proto( 0, [agent_info], self._brains[BRAIN_NAME] From 0d11d7bf8acc1dfae02145165479a8534ae23f9a Mon Sep 17 00:00:00 2001 From: Chris Elion Date: Wed, 6 Nov 2019 14:08:51 -0800 Subject: [PATCH 09/19] remove BrainParameters.num_stacked_vector_observations --- gym-unity/gym_unity/envs/__init__.py | 6 ------ gym-unity/gym_unity/tests/test_gym.py | 5 +---- ml-agents-envs/mlagents/envs/brain.py | 21 ++++--------------- .../mlagents/envs/mock_communicator.py | 2 -- .../mlagents/envs/tests/test_brain.py | 1 - .../mlagents/envs/tests/test_envs.py | 4 ++-- ml-agents/mlagents/trainers/models.py | 4 +--- .../mlagents/trainers/tests/mock_brain.py | 6 +----- ml-agents/mlagents/trainers/tests/test_ppo.py | 2 -- .../mlagents/trainers/tests/test_simple_rl.py | 1 - 10 files changed, 9 insertions(+), 43 deletions(-) diff --git a/gym-unity/gym_unity/envs/__init__.py b/gym-unity/gym_unity/envs/__init__.py index af8a71de30..bbb1a9c0f0 100644 --- a/gym-unity/gym_unity/envs/__init__.py +++ b/gym-unity/gym_unity/envs/__init__.py @@ -103,12 +103,6 @@ def __init__( "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)) diff --git a/gym-unity/gym_unity/tests/test_gym.py b/gym-unity/gym_unity/tests/test_gym.py index de69abcd9f..e77a8bee49 100644 --- a/gym-unity/gym_unity/tests/test_gym.py +++ b/gym-unity/gym_unity/tests/test_gym.py @@ -89,7 +89,6 @@ def test_gym_wrapper_visual(mock_env, use_uint8): 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, @@ -107,9 +106,7 @@ def create_mock_brainparams( 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 diff --git a/ml-agents-envs/mlagents/envs/brain.py b/ml-agents-envs/mlagents/envs/brain.py index 65e25a1936..e8f53c4ce0 100644 --- a/ml-agents-envs/mlagents/envs/brain.py +++ b/ml-agents-envs/mlagents/envs/brain.py @@ -32,7 +32,6 @@ def __init__( self, brain_name: str, vector_observation_space_size: int, - num_stacked_vector_observations: int, camera_resolutions: List[CameraResolution], vector_action_space_size: List[int], vector_action_descriptions: List[str], @@ -43,7 +42,6 @@ def __init__( """ 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 @@ -57,7 +55,6 @@ def __str__(self): Number of Visual Observations (per agent): {} Camera Resolutions: {} Vector Observation space size (per agent): {} - Number of stacked Vector Observation: {} Vector Action space type: {} Vector Action space size (per agent): {} Vector Action descriptions: {}""".format( @@ -65,7 +62,6 @@ def __str__(self): str(self.number_visual_observations), str([str(cr) for cr in self.camera_resolutions]), str(self.vector_observation_space_size), - str(self.num_stacked_vector_observations), self.vector_action_space_type, str(self.vector_action_space_size), ", ".join(self.vector_action_descriptions), @@ -91,15 +87,12 @@ def from_proto( ) assert ( - total_vector_obs - == brain_param_proto.vector_observation_size - * brain_param_proto.num_stacked_vector_observations - ), f"total_vector_obs = {total_vector_obs}. brain_param_proto.vector_observation_size={brain_param_proto.vector_observation_size} brain_param_proto.num_stacked_vector_observations={brain_param_proto.num_stacked_vector_observations}" # noqa + total_vector_obs == brain_param_proto.vector_observation_size + ), f"total_vector_obs = {total_vector_obs}. brain_param_proto.vector_observation_size={brain_param_proto.vector_observation_size}" # noqa brain_params = BrainParameters( brain_name=brain_param_proto.brain_name, - vector_observation_space_size=brain_param_proto.vector_observation_size, - num_stacked_vector_observations=brain_param_proto.num_stacked_vector_observations, + 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( @@ -256,13 +249,7 @@ def _process_vector_observations( vector_observations: List[List[ObservationProto]], ) -> np.ndarray: 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 = np.zeros((0, brain_params.vector_observation_space_size)) else: stacked_obs = [] has_nan = False diff --git a/ml-agents-envs/mlagents/envs/mock_communicator.py b/ml-agents-envs/mlagents/envs/mock_communicator.py index f6ae48318f..05bae6943d 100755 --- a/ml-agents-envs/mlagents/envs/mock_communicator.py +++ b/ml-agents-envs/mlagents/envs/mock_communicator.py @@ -19,7 +19,6 @@ def __init__( self, discrete_action=False, visual_inputs=0, - # stack=True, num_agents=3, brain_name="RealFakeBrain", vec_obs_size=3, @@ -42,7 +41,6 @@ def __init__( def initialize(self, inputs: UnityInputProto) -> UnityOutputProto: bp = BrainParametersProto( vector_observation_size=self.vec_obs_size, - num_stacked_vector_observations=1, # TODO REMOVE vector_action_size=[2], vector_action_descriptions=["", ""], vector_action_space_type=int(not self.is_discrete), diff --git a/ml-agents-envs/mlagents/envs/tests/test_brain.py b/ml-agents-envs/mlagents/envs/tests/test_brain.py index 598fdf6f5c..62f4744e21 100644 --- a/ml-agents-envs/mlagents/envs/tests/test_brain.py +++ b/ml-agents-envs/mlagents/envs/tests/test_brain.py @@ -14,7 +14,6 @@ test_brain = BrainParameters( brain_name="test_brain", vector_observation_space_size=3, - num_stacked_vector_observations=1, camera_resolutions=[], vector_action_space_size=[], vector_action_descriptions=[], diff --git a/ml-agents-envs/mlagents/envs/tests/test_envs.py b/ml-agents-envs/mlagents/envs/tests/test_envs.py index 1827937862..7b6c518727 100755 --- a/ml-agents-envs/mlagents/envs/tests/test_envs.py +++ b/ml-agents-envs/mlagents/envs/tests/test_envs.py @@ -49,7 +49,7 @@ def test_reset(mock_communicator, mock_launcher): ) assert ( len(brain_info["RealFakeBrain"].vector_observations[0]) - == brain.vector_observation_space_size * brain.num_stacked_vector_observations + == brain.vector_observation_space_size ) @@ -88,7 +88,7 @@ def test_step(mock_communicator, mock_launcher): ) 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)) diff --git a/ml-agents/mlagents/trainers/models.py b/ml-agents/mlagents/trainers/models.py index 70d779bb10..08ebed4682 100644 --- a/ml-agents/mlagents/trainers/models.py +++ b/ml-agents/mlagents/trainers/models.py @@ -54,9 +54,7 @@ def __init__( 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"), diff --git a/ml-agents/mlagents/trainers/tests/mock_brain.py b/ml-agents/mlagents/trainers/tests/mock_brain.py index f4bff9a17c..5246621702 100644 --- a/ml-agents/mlagents/trainers/tests/mock_brain.py +++ b/ml-agents/mlagents/trainers/tests/mock_brain.py @@ -7,7 +7,6 @@ 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, @@ -20,9 +19,6 @@ def create_mock_brainparams( 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 @@ -247,9 +243,9 @@ def make_brain_parameters( for _ in range(visual_inputs) ] + vec_obs_size = vec_obs_size * 2 if stack else vec_obs_size # todo cleanup 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=["", ""], diff --git a/ml-agents/mlagents/trainers/tests/test_ppo.py b/ml-agents/mlagents/trainers/tests/test_ppo.py index 5d32107e2c..2fe29b5f8c 100644 --- a/ml-agents/mlagents/trainers/tests/test_ppo.py +++ b/ml-agents/mlagents/trainers/tests/test_ppo.py @@ -301,7 +301,6 @@ def test_trainer_increment_step(dummy_config): brain_params = BrainParameters( brain_name="test_brain", vector_observation_space_size=1, - num_stacked_vector_observations=1, camera_resolutions=[], vector_action_space_size=[2], vector_action_descriptions=[], @@ -366,7 +365,6 @@ def test_add_rewards_output(dummy_config): brain_params = BrainParameters( brain_name="test_brain", vector_observation_space_size=1, - num_stacked_vector_observations=1, camera_resolutions=[], vector_action_space_size=[2], vector_action_descriptions=[], diff --git a/ml-agents/mlagents/trainers/tests/test_simple_rl.py b/ml-agents/mlagents/trainers/tests/test_simple_rl.py index af74c5b326..c1fd13d82e 100644 --- a/ml-agents/mlagents/trainers/tests/test_simple_rl.py +++ b/ml-agents/mlagents/trainers/tests/test_simple_rl.py @@ -45,7 +45,6 @@ def __init__(self, use_discrete): 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"], From eb5e88b31e5491b05047edd88483e779c63d8b2c Mon Sep 17 00:00:00 2001 From: Chris Elion Date: Wed, 6 Nov 2019 14:19:20 -0800 Subject: [PATCH 10/19] remove vec size and stack size from BrainParameters.proto --- .../CommunicatorObjects/BrainParameters.cs | 72 ++----------------- .../ML-Agents/Scripts/Grpc/GrpcExtensions.cs | 13 +--- ml-agents-envs/mlagents/envs/brain.py | 4 -- .../brain_parameters_pb2.py | 28 ++------ .../brain_parameters_pb2.pyi | 8 +-- .../mlagents/envs/mock_communicator.py | 1 - .../brain_parameters.proto | 4 +- 7 files changed, 20 insertions(+), 110 deletions(-) diff --git a/UnitySDK/Assets/ML-Agents/Scripts/Grpc/CommunicatorObjects/BrainParameters.cs b/UnitySDK/Assets/ML-Agents/Scripts/Grpc/CommunicatorObjects/BrainParameters.cs index 4d92bcb92c..5948d577e1 100644 --- a/UnitySDK/Assets/ML-Agents/Scripts/Grpc/CommunicatorObjects/BrainParameters.cs +++ b/UnitySDK/Assets/ML-Agents/Scripts/Grpc/CommunicatorObjects/BrainParameters.cs @@ -27,18 +27,16 @@ static BrainParametersReflection() { "CjltbGFnZW50cy9lbnZzL2NvbW11bmljYXRvcl9vYmplY3RzL2JyYWluX3Bh", "cmFtZXRlcnMucHJvdG8SFGNvbW11bmljYXRvcl9vYmplY3RzGjNtbGFnZW50", "cy9lbnZzL2NvbW11bmljYXRvcl9vYmplY3RzL3NwYWNlX3R5cGUucHJvdG8i", - "lwIKFEJyYWluUGFyYW1ldGVyc1Byb3RvEh8KF3ZlY3Rvcl9vYnNlcnZhdGlv", - "bl9zaXplGAEgASgFEicKH251bV9zdGFja2VkX3ZlY3Rvcl9vYnNlcnZhdGlv", - "bnMYAiABKAUSGgoSdmVjdG9yX2FjdGlvbl9zaXplGAMgAygFEiIKGnZlY3Rv", - "cl9hY3Rpb25fZGVzY3JpcHRpb25zGAUgAygJEkYKGHZlY3Rvcl9hY3Rpb25f", - "c3BhY2VfdHlwZRgGIAEoDjIkLmNvbW11bmljYXRvcl9vYmplY3RzLlNwYWNl", - "VHlwZVByb3RvEhIKCmJyYWluX25hbWUYByABKAkSEwoLaXNfdHJhaW5pbmcY", - "CCABKAhKBAgEEAVCH6oCHE1MQWdlbnRzLkNvbW11bmljYXRvck9iamVjdHNi", - "BnByb3RvMw==")); + "2QEKFEJyYWluUGFyYW1ldGVyc1Byb3RvEhoKEnZlY3Rvcl9hY3Rpb25fc2l6", + "ZRgDIAMoBRIiChp2ZWN0b3JfYWN0aW9uX2Rlc2NyaXB0aW9ucxgFIAMoCRJG", + "Chh2ZWN0b3JfYWN0aW9uX3NwYWNlX3R5cGUYBiABKA4yJC5jb21tdW5pY2F0", + "b3Jfb2JqZWN0cy5TcGFjZVR5cGVQcm90bxISCgpicmFpbl9uYW1lGAcgASgJ", + "EhMKC2lzX3RyYWluaW5nGAggASgISgQIARACSgQIAhADSgQIBBAFQh+qAhxN", + "TEFnZW50cy5Db21tdW5pY2F0b3JPYmplY3RzYgZwcm90bzM=")); descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData, new pbr::FileDescriptor[] { global::MLAgents.CommunicatorObjects.SpaceTypeReflection.Descriptor, }, new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] { - 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 @@ -70,8 +68,6 @@ public BrainParametersProto() { [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_; @@ -85,28 +81,6 @@ public BrainParametersProto Clone() { return new BrainParametersProto(this); } - /// Field number for the "vector_observation_size" field. - public const int VectorObservationSizeFieldNumber = 1; - private int vectorObservationSize_; - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public int VectorObservationSize { - get { return vectorObservationSize_; } - set { - vectorObservationSize_ = value; - } - } - - /// Field number for the "num_stacked_vector_observations" field. - public const int NumStackedVectorObservationsFieldNumber = 2; - private int numStackedVectorObservations_; - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public int NumStackedVectorObservations { - get { return numStackedVectorObservations_; } - set { - numStackedVectorObservations_ = value; - } - } - /// Field number for the "vector_action_size" field. public const int VectorActionSizeFieldNumber = 3; private static readonly pb::FieldCodec _repeated_vectorActionSize_codec @@ -173,8 +147,6 @@ public bool Equals(BrainParametersProto other) { 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; @@ -186,8 +158,6 @@ public bool Equals(BrainParametersProto other) { [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(); @@ -206,14 +176,6 @@ public override string ToString() { [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) { @@ -236,12 +198,6 @@ public void WriteTo(pb::CodedOutputStream output) { [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) { @@ -264,12 +220,6 @@ public void MergeFrom(BrainParametersProto other) { 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) { @@ -292,14 +242,6 @@ public void MergeFrom(pb::CodedInputStream input) { 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); diff --git a/UnitySDK/Assets/ML-Agents/Scripts/Grpc/GrpcExtensions.cs b/UnitySDK/Assets/ML-Agents/Scripts/Grpc/GrpcExtensions.cs index 7aab7fd762..9511ef5e55 100644 --- a/UnitySDK/Assets/ML-Agents/Scripts/Grpc/GrpcExtensions.cs +++ b/UnitySDK/Assets/ML-Agents/Scripts/Grpc/GrpcExtensions.cs @@ -54,8 +54,6 @@ public static BrainParametersProto ToProto(this BrainParameters bp, string name, { var brainParametersProto = new BrainParametersProto { - VectorObservationSize = bp.vectorObservationSize, - NumStackedVectorObservations = bp.numStackedVectorObservations, VectorActionSize = { bp.vectorActionSize }, VectorActionSpaceType = (SpaceTypeProto)bp.vectorActionSpaceType, @@ -110,8 +108,6 @@ public static BrainParameters ToBrainParameters(this BrainParametersProto bpp) { var bp = new BrainParameters { - vectorObservationSize = bpp.VectorObservationSize, - numStackedVectorObservations = bpp.NumStackedVectorObservations, vectorActionSize = bpp.VectorActionSize.ToArray(), vectorActionDescriptions = bpp.VectorActionDescriptions.ToArray(), vectorActionSpaceType = (SpaceType)bpp.VectorActionSpaceType @@ -172,16 +168,11 @@ public static List ToAgentActionList(this UnityRLInputProto.Types.L public static ObservationProto ToProto(this Observation obs) { - if (obs.CompressedData != null && obs.FloatData != null) - { - // TODO XOR - - } - ObservationProto obsProto = null; - ; + if (obs.CompressedData != null) { + // TODO check obs.FloatData.Empty() obsProto = new ObservationProto { CompressedData = ByteString.CopyFrom(obs.CompressedData), diff --git a/ml-agents-envs/mlagents/envs/brain.py b/ml-agents-envs/mlagents/envs/brain.py index e8f53c4ce0..d616e66716 100644 --- a/ml-agents-envs/mlagents/envs/brain.py +++ b/ml-agents-envs/mlagents/envs/brain.py @@ -86,10 +86,6 @@ def from_proto( obs.shape[0] for obs in agent_info.observations if len(obs.shape) == 1 ) - assert ( - total_vector_obs == brain_param_proto.vector_observation_size - ), f"total_vector_obs = {total_vector_obs}. brain_param_proto.vector_observation_size={brain_param_proto.vector_observation_size}" # noqa - brain_params = BrainParameters( brain_name=brain_param_proto.brain_name, vector_observation_space_size=total_vector_obs, diff --git a/ml-agents-envs/mlagents/envs/communicator_objects/brain_parameters_pb2.py b/ml-agents-envs/mlagents/envs/communicator_objects/brain_parameters_pb2.py index 31007b6869..97b4a08645 100644 --- a/ml-agents-envs/mlagents/envs/communicator_objects/brain_parameters_pb2.py +++ b/ml-agents-envs/mlagents/envs/communicator_objects/brain_parameters_pb2.py @@ -20,7 +20,7 @@ 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,]) @@ -35,49 +35,35 @@ 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, is_extension=False, extension_scope=None, options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - 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, is_extension=False, extension_scope=None, options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - 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, is_extension=False, extension_scope=None, options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - 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, is_extension=False, extension_scope=None, options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - 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, @@ -96,7 +82,7 @@ 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 diff --git a/ml-agents-envs/mlagents/envs/communicator_objects/brain_parameters_pb2.pyi b/ml-agents-envs/mlagents/envs/communicator_objects/brain_parameters_pb2.pyi index f3d1c30597..0ac7699a0a 100644 --- a/ml-agents-envs/mlagents/envs/communicator_objects/brain_parameters_pb2.pyi +++ b/ml-agents-envs/mlagents/envs/communicator_objects/brain_parameters_pb2.pyi @@ -35,8 +35,6 @@ builtin___int = int 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 @@ -45,8 +43,6 @@ class BrainParametersProto(google___protobuf___message___Message): 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, @@ -58,6 +54,6 @@ class BrainParametersProto(google___protobuf___message___Message): 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: ... else: - 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: ... diff --git a/ml-agents-envs/mlagents/envs/mock_communicator.py b/ml-agents-envs/mlagents/envs/mock_communicator.py index 05bae6943d..0e9c7dd15d 100755 --- a/ml-agents-envs/mlagents/envs/mock_communicator.py +++ b/ml-agents-envs/mlagents/envs/mock_communicator.py @@ -40,7 +40,6 @@ def __init__( def initialize(self, inputs: UnityInputProto) -> UnityOutputProto: bp = BrainParametersProto( - vector_observation_size=self.vec_obs_size, vector_action_size=[2], vector_action_descriptions=["", ""], vector_action_space_type=int(not self.is_discrete), diff --git a/protobuf-definitions/proto/mlagents/envs/communicator_objects/brain_parameters.proto b/protobuf-definitions/proto/mlagents/envs/communicator_objects/brain_parameters.proto index 1b97bba002..002e2122ce 100644 --- a/protobuf-definitions/proto/mlagents/envs/communicator_objects/brain_parameters.proto +++ b/protobuf-definitions/proto/mlagents/envs/communicator_objects/brain_parameters.proto @@ -6,8 +6,8 @@ option csharp_namespace = "MLAgents.CommunicatorObjects"; 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; From 1a7d33a3202a11f7ead1e2c24e5b95ea45074a14 Mon Sep 17 00:00:00 2001 From: Chris Elion Date: Wed, 6 Nov 2019 14:23:12 -0800 Subject: [PATCH 11/19] cleanup debug logs --- UnitySDK/Assets/ML-Agents/Scripts/Agent.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/UnitySDK/Assets/ML-Agents/Scripts/Agent.cs b/UnitySDK/Assets/ML-Agents/Scripts/Agent.cs index 0361af9b89..440bd9b12e 100644 --- a/UnitySDK/Assets/ML-Agents/Scripts/Agent.cs +++ b/UnitySDK/Assets/ML-Agents/Scripts/Agent.cs @@ -522,14 +522,12 @@ public void InitializeSensors() int numFloatObservations = 0; for (var i = 0; i < sensors.Count; i++) { - Debug.Log($"compression = {sensors[i].GetCompressionType()}"); if (sensors[i].GetCompressionType() == SensorCompressionType.None) { numFloatObservations += sensors[i].ObservationSize(); } } - Debug.Log($"numFloatObservations={numFloatObservations} sensors.Count={sensors.Count}"); m_VectorSensorBuffer = new float[numFloatObservations]; } From 66d94cd3c88ae8c15dae48edff274f685cd5b553 Mon Sep 17 00:00:00 2001 From: Chris Elion Date: Wed, 6 Nov 2019 14:35:13 -0800 Subject: [PATCH 12/19] rename compressed_observation.proto --- UnitySDK/Assets/ML-Agents/Scripts/Agent.cs | 2 +- .../Grpc/CommunicatorObjects/AgentInfo.cs | 20 +- ...ompressedObservation.cs => Observation.cs} | 217 ++---------------- ...bservation.cs.meta => Observation.cs.meta} | 2 +- ...ompressedObservation.cs => Observation.cs} | 0 ...bservation.cs.meta => Observation.cs.meta} | 0 ml-agents-envs/mlagents/envs/brain.py | 4 +- .../communicator_objects/agent_info_pb2.py | 12 +- .../communicator_objects/agent_info_pb2.pyi | 8 +- ..._observation_pb2.py => observation_pb2.py} | 76 +----- ...bservation_pb2.pyi => observation_pb2.pyi} | 21 -- .../mlagents/envs/mock_communicator.py | 2 +- .../mlagents/envs/tests/test_brain.py | 2 +- .../mlagents/trainers/tests/test_simple_rl.py | 2 +- .../communicator_objects/agent_info.proto | 2 +- ...ed_observation.proto => observation.proto} | 7 - 16 files changed, 54 insertions(+), 323 deletions(-) rename UnitySDK/Assets/ML-Agents/Scripts/Grpc/CommunicatorObjects/{CompressedObservation.cs => Observation.cs} (66%) rename UnitySDK/Assets/ML-Agents/Scripts/Grpc/CommunicatorObjects/{CompressedObservation.cs.meta => Observation.cs.meta} (83%) rename UnitySDK/Assets/ML-Agents/Scripts/Sensor/{CompressedObservation.cs => Observation.cs} (100%) rename UnitySDK/Assets/ML-Agents/Scripts/Sensor/{CompressedObservation.cs.meta => Observation.cs.meta} (100%) rename ml-agents-envs/mlagents/envs/communicator_objects/{compressed_observation_pb2.py => observation_pb2.py} (62%) rename ml-agents-envs/mlagents/envs/communicator_objects/{compressed_observation_pb2.pyi => observation_pb2.pyi} (79%) rename protobuf-definitions/proto/mlagents/envs/communicator_objects/{compressed_observation.proto => observation.proto} (73%) diff --git a/UnitySDK/Assets/ML-Agents/Scripts/Agent.cs b/UnitySDK/Assets/ML-Agents/Scripts/Agent.cs index 7576a1f1b4..0e73d568f9 100644 --- a/UnitySDK/Assets/ML-Agents/Scripts/Agent.cs +++ b/UnitySDK/Assets/ML-Agents/Scripts/Agent.cs @@ -562,7 +562,7 @@ void SendInfoToBrain() 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 // But we need these to be generated for the recorder. So generate them here. if (m_Info.observations.Count == 0) { diff --git a/UnitySDK/Assets/ML-Agents/Scripts/Grpc/CommunicatorObjects/AgentInfo.cs b/UnitySDK/Assets/ML-Agents/Scripts/Grpc/CommunicatorObjects/AgentInfo.cs index 7d437408e0..88ea8f7037 100644 --- a/UnitySDK/Assets/ML-Agents/Scripts/Grpc/CommunicatorObjects/AgentInfo.cs +++ b/UnitySDK/Assets/ML-Agents/Scripts/Grpc/CommunicatorObjects/AgentInfo.cs @@ -25,17 +25,17 @@ static AgentInfoReflection() { byte[] descriptorData = global::System.Convert.FromBase64String( string.Concat( "CjNtbGFnZW50cy9lbnZzL2NvbW11bmljYXRvcl9vYmplY3RzL2FnZW50X2lu", - "Zm8ucHJvdG8SFGNvbW11bmljYXRvcl9vYmplY3RzGj9tbGFnZW50cy9lbnZz", - "L2NvbW11bmljYXRvcl9vYmplY3RzL2NvbXByZXNzZWRfb2JzZXJ2YXRpb24u", - "cHJvdG8iiAIKDkFnZW50SW5mb1Byb3RvEiIKGnN0YWNrZWRfdmVjdG9yX29i", - "c2VydmF0aW9uGAEgAygCEh0KFXN0b3JlZF92ZWN0b3JfYWN0aW9ucxgEIAMo", - "AhIOCgZyZXdhcmQYByABKAISDAoEZG9uZRgIIAEoCBIYChBtYXhfc3RlcF9y", - "ZWFjaGVkGAkgASgIEgoKAmlkGAogASgFEhMKC2FjdGlvbl9tYXNrGAsgAygI", - "EjwKDG9ic2VydmF0aW9ucxgNIAMoCzImLmNvbW11bmljYXRvcl9vYmplY3Rz", - "Lk9ic2VydmF0aW9uUHJvdG9KBAgCEANKBAgDEARKBAgFEAZKBAgGEAdKBAgM", - "EA1CH6oCHE1MQWdlbnRzLkNvbW11bmljYXRvck9iamVjdHNiBnByb3RvMw==")); + "Zm8ucHJvdG8SFGNvbW11bmljYXRvcl9vYmplY3RzGjRtbGFnZW50cy9lbnZz", + "L2NvbW11bmljYXRvcl9vYmplY3RzL29ic2VydmF0aW9uLnByb3RvIogCCg5B", + "Z2VudEluZm9Qcm90bxIiChpzdGFja2VkX3ZlY3Rvcl9vYnNlcnZhdGlvbhgB", + "IAMoAhIdChVzdG9yZWRfdmVjdG9yX2FjdGlvbnMYBCADKAISDgoGcmV3YXJk", + "GAcgASgCEgwKBGRvbmUYCCABKAgSGAoQbWF4X3N0ZXBfcmVhY2hlZBgJIAEo", + "CBIKCgJpZBgKIAEoBRITCgthY3Rpb25fbWFzaxgLIAMoCBI8CgxvYnNlcnZh", + "dGlvbnMYDSADKAsyJi5jb21tdW5pY2F0b3Jfb2JqZWN0cy5PYnNlcnZhdGlv", + "blByb3RvSgQIAhADSgQIAxAESgQIBRAGSgQIBhAHSgQIDBANQh+qAhxNTEFn", + "ZW50cy5Db21tdW5pY2F0b3JPYmplY3RzYgZwcm90bzM=")); descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData, - new pbr::FileDescriptor[] { global::MLAgents.CommunicatorObjects.CompressedObservationReflection.Descriptor, }, + new pbr::FileDescriptor[] { global::MLAgents.CommunicatorObjects.ObservationReflection.Descriptor, }, new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] { new pbr::GeneratedClrTypeInfo(typeof(global::MLAgents.CommunicatorObjects.AgentInfoProto), global::MLAgents.CommunicatorObjects.AgentInfoProto.Parser, new[]{ "StackedVectorObservation", "StoredVectorActions", "Reward", "Done", "MaxStepReached", "Id", "ActionMask", "Observations" }, null, null, null) })); diff --git a/UnitySDK/Assets/ML-Agents/Scripts/Grpc/CommunicatorObjects/CompressedObservation.cs b/UnitySDK/Assets/ML-Agents/Scripts/Grpc/CommunicatorObjects/Observation.cs similarity index 66% rename from UnitySDK/Assets/ML-Agents/Scripts/Grpc/CommunicatorObjects/CompressedObservation.cs rename to UnitySDK/Assets/ML-Agents/Scripts/Grpc/CommunicatorObjects/Observation.cs index 9a1e495b25..97ad351400 100644 --- a/UnitySDK/Assets/ML-Agents/Scripts/Grpc/CommunicatorObjects/CompressedObservation.cs +++ b/UnitySDK/Assets/ML-Agents/Scripts/Grpc/CommunicatorObjects/Observation.cs @@ -1,6 +1,6 @@ // // Generated by the protocol buffer compiler. DO NOT EDIT! -// source: mlagents/envs/communicator_objects/compressed_observation.proto +// source: mlagents/envs/communicator_objects/observation.proto // #pragma warning disable 1591, 0612, 3021 #region Designer generated code @@ -11,36 +11,32 @@ using scg = global::System.Collections.Generic; namespace MLAgents.CommunicatorObjects { - /// Holder for reflection information generated from mlagents/envs/communicator_objects/compressed_observation.proto - public static partial class CompressedObservationReflection { + /// Holder for reflection information generated from mlagents/envs/communicator_objects/observation.proto + public static partial class ObservationReflection { #region Descriptor - /// File descriptor for mlagents/envs/communicator_objects/compressed_observation.proto + /// File descriptor for mlagents/envs/communicator_objects/observation.proto public static pbr::FileDescriptor Descriptor { get { return descriptor; } } private static pbr::FileDescriptor descriptor; - static CompressedObservationReflection() { + static ObservationReflection() { byte[] descriptorData = global::System.Convert.FromBase64String( string.Concat( - "Cj9tbGFnZW50cy9lbnZzL2NvbW11bmljYXRvcl9vYmplY3RzL2NvbXByZXNz", - "ZWRfb2JzZXJ2YXRpb24ucHJvdG8SFGNvbW11bmljYXRvcl9vYmplY3RzIn8K", - "GkNvbXByZXNzZWRPYnNlcnZhdGlvblByb3RvEg0KBXNoYXBlGAEgAygFEkQK", - "EGNvbXByZXNzaW9uX3R5cGUYAiABKA4yKi5jb21tdW5pY2F0b3Jfb2JqZWN0", - "cy5Db21wcmVzc2lvblR5cGVQcm90bxIMCgRkYXRhGAMgASgMIvkBChBPYnNl", - "cnZhdGlvblByb3RvEg0KBXNoYXBlGAEgAygFEkQKEGNvbXByZXNzaW9uX3R5", - "cGUYAiABKA4yKi5jb21tdW5pY2F0b3Jfb2JqZWN0cy5Db21wcmVzc2lvblR5", - "cGVQcm90bxIZCg9jb21wcmVzc2VkX2RhdGEYAyABKAxIABJGCgpmbG9hdF9k", - "YXRhGAQgASgLMjAuY29tbXVuaWNhdG9yX29iamVjdHMuT2JzZXJ2YXRpb25Q", - "cm90by5GbG9hdERhdGFIABoZCglGbG9hdERhdGESDAoEZGF0YRgBIAMoAkIS", - "ChBvYnNlcnZhdGlvbl9kYXRhKikKFENvbXByZXNzaW9uVHlwZVByb3RvEggK", - "BE5PTkUQABIHCgNQTkcQAUIfqgIcTUxBZ2VudHMuQ29tbXVuaWNhdG9yT2Jq", - "ZWN0c2IGcHJvdG8z")); + "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.CompressedObservationProto), global::MLAgents.CommunicatorObjects.CompressedObservationProto.Parser, new[]{ "Shape", "CompressionType", "Data" }, null, null, null), 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)}) })); } @@ -56,187 +52,6 @@ public enum CompressionTypeProto { #endregion #region Messages - public sealed partial class CompressedObservationProto : pb::IMessage { - private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new CompressedObservationProto()); - private pb::UnknownFieldSet _unknownFields; - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pb::MessageParser 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); - } - - /// Field number for the "shape" field. - public const int ShapeFieldNumber = 1; - private static readonly pb::FieldCodec _repeated_shape_codec - = pb::FieldCodec.ForInt32(10); - private readonly pbc::RepeatedField shape_ = new pbc::RepeatedField(); - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public pbc::RepeatedField Shape { - get { return shape_; } - } - - /// Field number for the "compression_type" field. - 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; - } - } - - /// Field number for the "data" field. - 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; - } - } - } - } - - } - - /// - /// TODO remove compressed - /// public sealed partial class ObservationProto : pb::IMessage { private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new ObservationProto()); private pb::UnknownFieldSet _unknownFields; @@ -245,7 +60,7 @@ public sealed partial class ObservationProto : pb::IMessage { [global::System.Diagnostics.DebuggerNonUserCodeAttribute] public static pbr::MessageDescriptor Descriptor { - get { return global::MLAgents.CommunicatorObjects.CompressedObservationReflection.Descriptor.MessageTypes[1]; } + get { return global::MLAgents.CommunicatorObjects.ObservationReflection.Descriptor.MessageTypes[0]; } } [global::System.Diagnostics.DebuggerNonUserCodeAttribute] diff --git a/UnitySDK/Assets/ML-Agents/Scripts/Grpc/CommunicatorObjects/CompressedObservation.cs.meta b/UnitySDK/Assets/ML-Agents/Scripts/Grpc/CommunicatorObjects/Observation.cs.meta similarity index 83% rename from UnitySDK/Assets/ML-Agents/Scripts/Grpc/CommunicatorObjects/CompressedObservation.cs.meta rename to UnitySDK/Assets/ML-Agents/Scripts/Grpc/CommunicatorObjects/Observation.cs.meta index 8bb01e7651..971fead69c 100644 --- a/UnitySDK/Assets/ML-Agents/Scripts/Grpc/CommunicatorObjects/CompressedObservation.cs.meta +++ b/UnitySDK/Assets/ML-Agents/Scripts/Grpc/CommunicatorObjects/Observation.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 55ac40ee8d5b74b9e80d3def9d4ef6e0 +guid: 9fbba5f80821d4f02b4239a8e16eebfa MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/UnitySDK/Assets/ML-Agents/Scripts/Sensor/CompressedObservation.cs b/UnitySDK/Assets/ML-Agents/Scripts/Sensor/Observation.cs similarity index 100% rename from UnitySDK/Assets/ML-Agents/Scripts/Sensor/CompressedObservation.cs rename to UnitySDK/Assets/ML-Agents/Scripts/Sensor/Observation.cs diff --git a/UnitySDK/Assets/ML-Agents/Scripts/Sensor/CompressedObservation.cs.meta b/UnitySDK/Assets/ML-Agents/Scripts/Sensor/Observation.cs.meta similarity index 100% rename from UnitySDK/Assets/ML-Agents/Scripts/Sensor/CompressedObservation.cs.meta rename to UnitySDK/Assets/ML-Agents/Scripts/Sensor/Observation.cs.meta diff --git a/ml-agents-envs/mlagents/envs/brain.py b/ml-agents-envs/mlagents/envs/brain.py index d616e66716..c28647e3df 100644 --- a/ml-agents-envs/mlagents/envs/brain.py +++ b/ml-agents-envs/mlagents/envs/brain.py @@ -4,9 +4,7 @@ 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.compressed_observation_pb2 import ( - ObservationProto, -) +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 diff --git a/ml-agents-envs/mlagents/envs/communicator_objects/agent_info_pb2.py b/ml-agents-envs/mlagents/envs/communicator_objects/agent_info_pb2.py index 744b886eec..396b5c1c78 100644 --- a/ml-agents-envs/mlagents/envs/communicator_objects/agent_info_pb2.py +++ b/ml-agents-envs/mlagents/envs/communicator_objects/agent_info_pb2.py @@ -13,16 +13,16 @@ _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( name='mlagents/envs/communicator_objects/agent_info.proto', package='communicator_objects', syntax='proto3', - serialized_pb=_b('\n3mlagents/envs/communicator_objects/agent_info.proto\x12\x14\x63ommunicator_objects\x1a?mlagents/envs/communicator_objects/compressed_observation.proto\"\x88\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\x12<\n\x0cobservations\x18\r \x03(\x0b\x32&.communicator_objects.ObservationProtoJ\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\"\x88\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\x12<\n\x0cobservations\x18\r \x03(\x0b\x32&.communicator_objects.ObservationProtoJ\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,]) @@ -102,11 +102,11 @@ extension_ranges=[], oneofs=[ ], - serialized_start=143, - serialized_end=407, + serialized_start=132, + serialized_end=396, ) -_AGENTINFOPROTO.fields_by_name['observations'].message_type = mlagents_dot_envs_dot_communicator__objects_dot_compressed__observation__pb2._OBSERVATIONPROTO +_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) diff --git a/ml-agents-envs/mlagents/envs/communicator_objects/agent_info_pb2.pyi b/ml-agents-envs/mlagents/envs/communicator_objects/agent_info_pb2.pyi index d7971a38c5..396b92502b 100644 --- a/ml-agents-envs/mlagents/envs/communicator_objects/agent_info_pb2.pyi +++ b/ml-agents-envs/mlagents/envs/communicator_objects/agent_info_pb2.pyi @@ -13,8 +13,8 @@ from google.protobuf.message import ( Message as google___protobuf___message___Message, ) -from mlagents.envs.communicator_objects.compressed_observation_pb2 import ( - ObservationProto as mlagents___envs___communicator_objects___compressed_observation_pb2___ObservationProto, +from mlagents.envs.communicator_objects.observation_pb2 import ( + ObservationProto as mlagents___envs___communicator_objects___observation_pb2___ObservationProto, ) from typing import ( @@ -44,7 +44,7 @@ class AgentInfoProto(google___protobuf___message___Message): action_mask = ... # type: google___protobuf___internal___containers___RepeatedScalarFieldContainer[builtin___bool] @property - def observations(self) -> google___protobuf___internal___containers___RepeatedCompositeFieldContainer[mlagents___envs___communicator_objects___compressed_observation_pb2___ObservationProto]: ... + def observations(self) -> google___protobuf___internal___containers___RepeatedCompositeFieldContainer[mlagents___envs___communicator_objects___observation_pb2___ObservationProto]: ... def __init__(self, *, @@ -55,7 +55,7 @@ class AgentInfoProto(google___protobuf___message___Message): max_step_reached : typing___Optional[builtin___bool] = None, id : typing___Optional[builtin___int] = None, action_mask : typing___Optional[typing___Iterable[builtin___bool]] = None, - observations : typing___Optional[typing___Iterable[mlagents___envs___communicator_objects___compressed_observation_pb2___ObservationProto]] = None, + observations : typing___Optional[typing___Iterable[mlagents___envs___communicator_objects___observation_pb2___ObservationProto]] = None, ) -> None: ... @classmethod def FromString(cls, s: builtin___bytes) -> AgentInfoProto: ... diff --git a/ml-agents-envs/mlagents/envs/communicator_objects/compressed_observation_pb2.py b/ml-agents-envs/mlagents/envs/communicator_objects/observation_pb2.py similarity index 62% rename from ml-agents-envs/mlagents/envs/communicator_objects/compressed_observation_pb2.py rename to ml-agents-envs/mlagents/envs/communicator_objects/observation_pb2.py index f7053220ff..9f4e9491f6 100644 --- a/ml-agents-envs/mlagents/envs/communicator_objects/compressed_observation_pb2.py +++ b/ml-agents-envs/mlagents/envs/communicator_objects/observation_pb2.py @@ -1,5 +1,5 @@ # Generated by the protocol buffer compiler. DO NOT EDIT! -# source: mlagents/envs/communicator_objects/compressed_observation.proto +# 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')) @@ -17,10 +17,10 @@ DESCRIPTOR = _descriptor.FileDescriptor( - name='mlagents/envs/communicator_objects/compressed_observation.proto', + name='mlagents/envs/communicator_objects/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\"\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') + 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( @@ -40,8 +40,8 @@ ], containing_type=None, options=None, - serialized_start=470, - serialized_end=511, + serialized_start=330, + serialized_end=371, ) _sym_db.RegisterEnumDescriptor(_COMPRESSIONTYPEPROTO) @@ -51,51 +51,6 @@ -_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, -) - - _OBSERVATIONPROTO_FLOATDATA = _descriptor.Descriptor( name='FloatData', full_name='communicator_objects.ObservationProto.FloatData', @@ -122,8 +77,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=423, - serialized_end=448, + serialized_start=283, + serialized_end=308, ) _OBSERVATIONPROTO = _descriptor.Descriptor( @@ -176,11 +131,10 @@ name='observation_data', full_name='communicator_objects.ObservationProto.observation_data', index=0, containing_type=None, fields=[]), ], - serialized_start=219, - serialized_end=468, + serialized_start=79, + serialized_end=328, ) -_COMPRESSEDOBSERVATIONPROTO.fields_by_name['compression_type'].enum_type = _COMPRESSIONTYPEPROTO _OBSERVATIONPROTO_FLOATDATA.containing_type = _OBSERVATIONPROTO _OBSERVATIONPROTO.fields_by_name['compression_type'].enum_type = _COMPRESSIONTYPEPROTO _OBSERVATIONPROTO.fields_by_name['float_data'].message_type = _OBSERVATIONPROTO_FLOATDATA @@ -190,28 +144,20 @@ _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['CompressedObservationProto'] = _COMPRESSEDOBSERVATIONPROTO DESCRIPTOR.message_types_by_name['ObservationProto'] = _OBSERVATIONPROTO 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) - ObservationProto = _reflection.GeneratedProtocolMessageType('ObservationProto', (_message.Message,), dict( FloatData = _reflection.GeneratedProtocolMessageType('FloatData', (_message.Message,), dict( DESCRIPTOR = _OBSERVATIONPROTO_FLOATDATA, - __module__ = 'mlagents.envs.communicator_objects.compressed_observation_pb2' + __module__ = 'mlagents.envs.communicator_objects.observation_pb2' # @@protoc_insertion_point(class_scope:communicator_objects.ObservationProto.FloatData) )) , DESCRIPTOR = _OBSERVATIONPROTO, - __module__ = 'mlagents.envs.communicator_objects.compressed_observation_pb2' + __module__ = 'mlagents.envs.communicator_objects.observation_pb2' # @@protoc_insertion_point(class_scope:communicator_objects.ObservationProto) )) _sym_db.RegisterMessage(ObservationProto) diff --git a/ml-agents-envs/mlagents/envs/communicator_objects/compressed_observation_pb2.pyi b/ml-agents-envs/mlagents/envs/communicator_objects/observation_pb2.pyi similarity index 79% rename from ml-agents-envs/mlagents/envs/communicator_objects/compressed_observation_pb2.pyi rename to ml-agents-envs/mlagents/envs/communicator_objects/observation_pb2.pyi index 140458436c..79681430fb 100644 --- a/ml-agents-envs/mlagents/envs/communicator_objects/compressed_observation_pb2.pyi +++ b/ml-agents-envs/mlagents/envs/communicator_objects/observation_pb2.pyi @@ -50,27 +50,6 @@ class CompressionTypeProto(builtin___int): 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: ... - class ObservationProto(google___protobuf___message___Message): DESCRIPTOR: google___protobuf___descriptor___Descriptor = ... class FloatData(google___protobuf___message___Message): diff --git a/ml-agents-envs/mlagents/envs/mock_communicator.py b/ml-agents-envs/mlagents/envs/mock_communicator.py index 0e9c7dd15d..5d0b472e48 100755 --- a/ml-agents-envs/mlagents/envs/mock_communicator.py +++ b/ml-agents-envs/mlagents/envs/mock_communicator.py @@ -8,7 +8,7 @@ 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 ( +from mlagents.envs.communicator_objects.observation_pb2 import ( ObservationProto, CompressionTypeProto, ) diff --git a/ml-agents-envs/mlagents/envs/tests/test_brain.py b/ml-agents-envs/mlagents/envs/tests/test_brain.py index 62f4744e21..5ad16707c9 100644 --- a/ml-agents-envs/mlagents/envs/tests/test_brain.py +++ b/ml-agents-envs/mlagents/envs/tests/test_brain.py @@ -5,7 +5,7 @@ from unittest import mock from mlagents.envs.communicator_objects.agent_info_pb2 import AgentInfoProto -from mlagents.envs.communicator_objects.compressed_observation_pb2 import ( +from mlagents.envs.communicator_objects.observation_pb2 import ( ObservationProto, CompressionTypeProto, ) diff --git a/ml-agents/mlagents/trainers/tests/test_simple_rl.py b/ml-agents/mlagents/trainers/tests/test_simple_rl.py index c1fd13d82e..37f21786c4 100644 --- a/ml-agents/mlagents/trainers/tests/test_simple_rl.py +++ b/ml-agents/mlagents/trainers/tests/test_simple_rl.py @@ -11,7 +11,7 @@ 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.compressed_observation_pb2 import ( +from mlagents.envs.communicator_objects.observation_pb2 import ( ObservationProto, CompressionTypeProto, ) diff --git a/protobuf-definitions/proto/mlagents/envs/communicator_objects/agent_info.proto b/protobuf-definitions/proto/mlagents/envs/communicator_objects/agent_info.proto index 15197c40ec..4ba98dccdf 100644 --- a/protobuf-definitions/proto/mlagents/envs/communicator_objects/agent_info.proto +++ b/protobuf-definitions/proto/mlagents/envs/communicator_objects/agent_info.proto @@ -1,6 +1,6 @@ syntax = "proto3"; -import "mlagents/envs/communicator_objects/compressed_observation.proto"; +import "mlagents/envs/communicator_objects/observation.proto"; option csharp_namespace = "MLAgents.CommunicatorObjects"; package communicator_objects; diff --git a/protobuf-definitions/proto/mlagents/envs/communicator_objects/compressed_observation.proto b/protobuf-definitions/proto/mlagents/envs/communicator_objects/observation.proto similarity index 73% rename from protobuf-definitions/proto/mlagents/envs/communicator_objects/compressed_observation.proto rename to protobuf-definitions/proto/mlagents/envs/communicator_objects/observation.proto index 68b62cc562..07d2e8df1c 100644 --- a/protobuf-definitions/proto/mlagents/envs/communicator_objects/compressed_observation.proto +++ b/protobuf-definitions/proto/mlagents/envs/communicator_objects/observation.proto @@ -8,13 +8,6 @@ enum CompressionTypeProto { PNG = 1; } -message CompressedObservationProto { - repeated int32 shape = 1; - CompressionTypeProto compression_type = 2; - bytes data = 3; -} - -// TODO remove compressed message ObservationProto { message FloatData { repeated float data = 1; From 026ec673257c383c64ec52e5d319340af3288f43 Mon Sep 17 00:00:00 2001 From: Chris Elion Date: Wed, 6 Nov 2019 14:44:05 -0800 Subject: [PATCH 13/19] remove vec obs from agent_info.proto --- .../Editor/Tests/DemonstrationTests.cs | 1 - .../Grpc/CommunicatorObjects/AgentInfo.cs | 39 +++++-------------- .../ML-Agents/Scripts/Grpc/GrpcExtensions.cs | 1 - .../communicator_objects/agent_info_pb2.py | 25 +++++------- .../communicator_objects/agent_info_pb2.pyi | 6 +-- .../communicator_objects/agent_info.proto | 2 +- 6 files changed, 21 insertions(+), 53 deletions(-) diff --git a/UnitySDK/Assets/ML-Agents/Editor/Tests/DemonstrationTests.cs b/UnitySDK/Assets/ML-Agents/Editor/Tests/DemonstrationTests.cs index dee94e8fed..0b8ab067a3 100644 --- a/UnitySDK/Assets/ML-Agents/Editor/Tests/DemonstrationTests.cs +++ b/UnitySDK/Assets/ML-Agents/Editor/Tests/DemonstrationTests.cs @@ -53,7 +53,6 @@ public void TestStoreInitalize() done = true, id = 5, maxStepReached = true, - //floatObservations = new List() { 1f, 1f, 1f }, storedVectorActions = new[] { 0f, 1f }, }; diff --git a/UnitySDK/Assets/ML-Agents/Scripts/Grpc/CommunicatorObjects/AgentInfo.cs b/UnitySDK/Assets/ML-Agents/Scripts/Grpc/CommunicatorObjects/AgentInfo.cs index 88ea8f7037..486d8e009b 100644 --- a/UnitySDK/Assets/ML-Agents/Scripts/Grpc/CommunicatorObjects/AgentInfo.cs +++ b/UnitySDK/Assets/ML-Agents/Scripts/Grpc/CommunicatorObjects/AgentInfo.cs @@ -26,18 +26,18 @@ static AgentInfoReflection() { string.Concat( "CjNtbGFnZW50cy9lbnZzL2NvbW11bmljYXRvcl9vYmplY3RzL2FnZW50X2lu", "Zm8ucHJvdG8SFGNvbW11bmljYXRvcl9vYmplY3RzGjRtbGFnZW50cy9lbnZz", - "L2NvbW11bmljYXRvcl9vYmplY3RzL29ic2VydmF0aW9uLnByb3RvIogCCg5B", - "Z2VudEluZm9Qcm90bxIiChpzdGFja2VkX3ZlY3Rvcl9vYnNlcnZhdGlvbhgB", - "IAMoAhIdChVzdG9yZWRfdmVjdG9yX2FjdGlvbnMYBCADKAISDgoGcmV3YXJk", - "GAcgASgCEgwKBGRvbmUYCCABKAgSGAoQbWF4X3N0ZXBfcmVhY2hlZBgJIAEo", - "CBIKCgJpZBgKIAEoBRITCgthY3Rpb25fbWFzaxgLIAMoCBI8CgxvYnNlcnZh", - "dGlvbnMYDSADKAsyJi5jb21tdW5pY2F0b3Jfb2JqZWN0cy5PYnNlcnZhdGlv", - "blByb3RvSgQIAhADSgQIAxAESgQIBRAGSgQIBhAHSgQIDBANQh+qAhxNTEFn", - "ZW50cy5Db21tdW5pY2F0b3JPYmplY3RzYgZwcm90bzM=")); + "L2NvbW11bmljYXRvcl9vYmplY3RzL29ic2VydmF0aW9uLnByb3RvIuoBCg5B", + "Z2VudEluZm9Qcm90bxIdChVzdG9yZWRfdmVjdG9yX2FjdGlvbnMYBCADKAIS", + "DgoGcmV3YXJkGAcgASgCEgwKBGRvbmUYCCABKAgSGAoQbWF4X3N0ZXBfcmVh", + "Y2hlZBgJIAEoCBIKCgJpZBgKIAEoBRITCgthY3Rpb25fbWFzaxgLIAMoCBI8", + "CgxvYnNlcnZhdGlvbnMYDSADKAsyJi5jb21tdW5pY2F0b3Jfb2JqZWN0cy5P", + "YnNlcnZhdGlvblByb3RvSgQIARACSgQIAhADSgQIAxAESgQIBRAGSgQIBhAH", + "SgQIDBANQh+qAhxNTEFnZW50cy5Db21tdW5pY2F0b3JPYmplY3RzYgZwcm90", + "bzM=")); descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData, new pbr::FileDescriptor[] { global::MLAgents.CommunicatorObjects.ObservationReflection.Descriptor, }, new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] { - new pbr::GeneratedClrTypeInfo(typeof(global::MLAgents.CommunicatorObjects.AgentInfoProto), global::MLAgents.CommunicatorObjects.AgentInfoProto.Parser, new[]{ "StackedVectorObservation", "StoredVectorActions", "Reward", "Done", "MaxStepReached", "Id", "ActionMask", "Observations" }, 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 @@ -69,7 +69,6 @@ public AgentInfoProto() { [global::System.Diagnostics.DebuggerNonUserCodeAttribute] public AgentInfoProto(AgentInfoProto other) : this() { - stackedVectorObservation_ = other.stackedVectorObservation_.Clone(); storedVectorActions_ = other.storedVectorActions_.Clone(); reward_ = other.reward_; done_ = other.done_; @@ -85,16 +84,6 @@ public AgentInfoProto Clone() { return new AgentInfoProto(this); } - /// Field number for the "stacked_vector_observation" field. - public const int StackedVectorObservationFieldNumber = 1; - private static readonly pb::FieldCodec _repeated_stackedVectorObservation_codec - = pb::FieldCodec.ForFloat(10); - private readonly pbc::RepeatedField stackedVectorObservation_ = new pbc::RepeatedField(); - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public pbc::RepeatedField StackedVectorObservation { - get { return stackedVectorObservation_; } - } - /// Field number for the "stored_vector_actions" field. public const int StoredVectorActionsFieldNumber = 4; private static readonly pb::FieldCodec _repeated_storedVectorActions_codec @@ -182,7 +171,6 @@ public bool Equals(AgentInfoProto other) { 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; @@ -196,7 +184,6 @@ public bool Equals(AgentInfoProto other) { [global::System.Diagnostics.DebuggerNonUserCodeAttribute] public override int GetHashCode() { int hash = 1; - hash ^= stackedVectorObservation_.GetHashCode(); hash ^= storedVectorActions_.GetHashCode(); if (Reward != 0F) hash ^= pbc::ProtobufEqualityComparers.BitwiseSingleEqualityComparer.GetHashCode(Reward); if (Done != false) hash ^= Done.GetHashCode(); @@ -217,7 +204,6 @@ public override string ToString() { [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); @@ -245,7 +231,6 @@ public void WriteTo(pb::CodedOutputStream output) { [global::System.Diagnostics.DebuggerNonUserCodeAttribute] public int CalculateSize() { int size = 0; - size += stackedVectorObservation_.CalculateSize(_repeated_stackedVectorObservation_codec); size += storedVectorActions_.CalculateSize(_repeated_storedVectorActions_codec); if (Reward != 0F) { size += 1 + 4; @@ -272,7 +257,6 @@ public void MergeFrom(AgentInfoProto other) { if (other == null) { return; } - stackedVectorObservation_.Add(other.stackedVectorObservation_); storedVectorActions_.Add(other.storedVectorActions_); if (other.Reward != 0F) { Reward = other.Reward; @@ -299,11 +283,6 @@ public void MergeFrom(pb::CodedInputStream input) { 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); diff --git a/UnitySDK/Assets/ML-Agents/Scripts/Grpc/GrpcExtensions.cs b/UnitySDK/Assets/ML-Agents/Scripts/Grpc/GrpcExtensions.cs index 9511ef5e55..ed55f93583 100644 --- a/UnitySDK/Assets/ML-Agents/Scripts/Grpc/GrpcExtensions.cs +++ b/UnitySDK/Assets/ML-Agents/Scripts/Grpc/GrpcExtensions.cs @@ -19,7 +19,6 @@ public static AgentInfoProto ToProto(this AgentInfo ai) { var agentInfoProto = new AgentInfoProto { - //StackedVectorObservation = { ai.floatObservations }, StoredVectorActions = { ai.storedVectorActions }, Reward = ai.reward, MaxStepReached = ai.maxStepReached, diff --git a/ml-agents-envs/mlagents/envs/communicator_objects/agent_info_pb2.py b/ml-agents-envs/mlagents/envs/communicator_objects/agent_info_pb2.py index 396b5c1c78..83ad2c9100 100644 --- a/ml-agents-envs/mlagents/envs/communicator_objects/agent_info_pb2.py +++ b/ml-agents-envs/mlagents/envs/communicator_objects/agent_info_pb2.py @@ -20,7 +20,7 @@ name='mlagents/envs/communicator_objects/agent_info.proto', package='communicator_objects', syntax='proto3', - serialized_pb=_b('\n3mlagents/envs/communicator_objects/agent_info.proto\x12\x14\x63ommunicator_objects\x1a\x34mlagents/envs/communicator_objects/observation.proto\"\x88\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\x12<\n\x0cobservations\x18\r \x03(\x0b\x32&.communicator_objects.ObservationProtoJ\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_observation__pb2.DESCRIPTOR,]) @@ -35,56 +35,49 @@ 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, is_extension=False, extension_scope=None, options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - 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, is_extension=False, extension_scope=None, options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - 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, is_extension=False, extension_scope=None, options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - 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, is_extension=False, extension_scope=None, options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - 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, is_extension=False, extension_scope=None, options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - 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, is_extension=False, extension_scope=None, options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='observations', full_name='communicator_objects.AgentInfoProto.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, @@ -103,7 +96,7 @@ oneofs=[ ], serialized_start=132, - serialized_end=396, + serialized_end=366, ) _AGENTINFOPROTO.fields_by_name['observations'].message_type = mlagents_dot_envs_dot_communicator__objects_dot_observation__pb2._OBSERVATIONPROTO diff --git a/ml-agents-envs/mlagents/envs/communicator_objects/agent_info_pb2.pyi b/ml-agents-envs/mlagents/envs/communicator_objects/agent_info_pb2.pyi index 396b92502b..aadece7067 100644 --- a/ml-agents-envs/mlagents/envs/communicator_objects/agent_info_pb2.pyi +++ b/ml-agents-envs/mlagents/envs/communicator_objects/agent_info_pb2.pyi @@ -35,7 +35,6 @@ builtin___int = int 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 @@ -48,7 +47,6 @@ class AgentInfoProto(google___protobuf___message___Message): def __init__(self, *, - 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, @@ -62,6 +60,6 @@ class AgentInfoProto(google___protobuf___message___Message): 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"action_mask",u"done",u"id",u"max_step_reached",u"observations",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: ... else: - 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"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: ... diff --git a/protobuf-definitions/proto/mlagents/envs/communicator_objects/agent_info.proto b/protobuf-definitions/proto/mlagents/envs/communicator_objects/agent_info.proto index 4ba98dccdf..e9c1749a20 100644 --- a/protobuf-definitions/proto/mlagents/envs/communicator_objects/agent_info.proto +++ b/protobuf-definitions/proto/mlagents/envs/communicator_objects/agent_info.proto @@ -6,7 +6,7 @@ option csharp_namespace = "MLAgents.CommunicatorObjects"; package communicator_objects; message AgentInfoProto { - 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; From 112e875e3d506a91358de5e26ccd59a4160fbde8 Mon Sep 17 00:00:00 2001 From: Chris Elion Date: Wed, 6 Nov 2019 15:16:51 -0800 Subject: [PATCH 14/19] fix unit test --- .../ML-Agents/Editor/Tests/DemonstrationTests.cs | 12 ++++++++---- UnitySDK/ProjectSettings/QualitySettings.asset | 0 UnitySDK/ProjectSettings/TimeManager.asset | 0 ml-agents/mlagents/trainers/tests/mock_brain.py | 4 +--- 4 files changed, 9 insertions(+), 7 deletions(-) mode change 100755 => 100644 UnitySDK/ProjectSettings/QualitySettings.asset mode change 100755 => 100644 UnitySDK/ProjectSettings/TimeManager.asset diff --git a/UnitySDK/Assets/ML-Agents/Editor/Tests/DemonstrationTests.cs b/UnitySDK/Assets/ML-Agents/Editor/Tests/DemonstrationTests.cs index 0b8ab067a3..565e8d3bd0 100644 --- a/UnitySDK/Assets/ML-Agents/Editor/Tests/DemonstrationTests.cs +++ b/UnitySDK/Assets/ML-Agents/Editor/Tests/DemonstrationTests.cs @@ -119,13 +119,17 @@ public void TestAgentWrite() 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]); + } } + } } } diff --git a/UnitySDK/ProjectSettings/QualitySettings.asset b/UnitySDK/ProjectSettings/QualitySettings.asset old mode 100755 new mode 100644 diff --git a/UnitySDK/ProjectSettings/TimeManager.asset b/UnitySDK/ProjectSettings/TimeManager.asset old mode 100755 new mode 100644 diff --git a/ml-agents/mlagents/trainers/tests/mock_brain.py b/ml-agents/mlagents/trainers/tests/mock_brain.py index 5246621702..7918571250 100644 --- a/ml-agents/mlagents/trainers/tests/mock_brain.py +++ b/ml-agents/mlagents/trainers/tests/mock_brain.py @@ -234,16 +234,14 @@ def create_mock_banana_brain(): def make_brain_parameters( discrete_action: bool = False, visual_inputs: int = 0, - stack: bool = True, brain_name: str = "RealFakeBrain", - vec_obs_size: int = 3, + vec_obs_size: int = 6, ) -> BrainParameters: resolutions = [ CameraResolution(width=30, height=40, num_channels=3) for _ in range(visual_inputs) ] - vec_obs_size = vec_obs_size * 2 if stack else vec_obs_size # todo cleanup return BrainParameters( vector_observation_space_size=vec_obs_size, camera_resolutions=resolutions, From 6bfd0598f8dd761db8a7b08befa961591ac91ec3 Mon Sep 17 00:00:00 2001 From: Chris Elion Date: Wed, 6 Nov 2019 15:17:31 -0800 Subject: [PATCH 15/19] undo accidental change --- UnitySDK/ProjectSettings/QualitySettings.asset | 0 UnitySDK/ProjectSettings/TimeManager.asset | 0 2 files changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 UnitySDK/ProjectSettings/QualitySettings.asset mode change 100644 => 100755 UnitySDK/ProjectSettings/TimeManager.asset diff --git a/UnitySDK/ProjectSettings/QualitySettings.asset b/UnitySDK/ProjectSettings/QualitySettings.asset old mode 100644 new mode 100755 diff --git a/UnitySDK/ProjectSettings/TimeManager.asset b/UnitySDK/ProjectSettings/TimeManager.asset old mode 100644 new mode 100755 From c0f0b890da82010fd473fdb9455ac44d18688c94 Mon Sep 17 00:00:00 2001 From: Chris Elion Date: Wed, 6 Nov 2019 15:24:46 -0800 Subject: [PATCH 16/19] docstrings and cleanup --- UnitySDK/Assets/ML-Agents/Scripts/Agent.cs | 11 +++++++++++ .../Assets/ML-Agents/Scripts/Grpc/GrpcExtensions.cs | 7 ++++++- .../Assets/ML-Agents/Scripts/Sensor/Observation.cs | 5 ++++- 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/UnitySDK/Assets/ML-Agents/Scripts/Agent.cs b/UnitySDK/Assets/ML-Agents/Scripts/Agent.cs index 0e73d568f9..f1e5f5813f 100644 --- a/UnitySDK/Assets/ML-Agents/Scripts/Agent.cs +++ b/UnitySDK/Assets/ML-Agents/Scripts/Agent.cs @@ -227,10 +227,21 @@ public AgentInfo Info /// DemonstrationRecorder m_Recorder; + /// + /// List of sensors used to generate observations. + /// Currently generated from attached SensorComponents, and a legacy VectorSensor + /// [FormerlySerializedAs("m_Sensors")] public List sensors; + /// + /// VectorSensor which is written to by AddVectorObs + /// public VectorSensor collectObservationsSensor; + + /// + /// Internal buffer used for generating float observations. + /// float[] m_VectorSensorBuffer; WriteAdapter m_WriteAdapter = new WriteAdapter(); diff --git a/UnitySDK/Assets/ML-Agents/Scripts/Grpc/GrpcExtensions.cs b/UnitySDK/Assets/ML-Agents/Scripts/Grpc/GrpcExtensions.cs index ed55f93583..073f13d8fe 100644 --- a/UnitySDK/Assets/ML-Agents/Scripts/Grpc/GrpcExtensions.cs +++ b/UnitySDK/Assets/ML-Agents/Scripts/Grpc/GrpcExtensions.cs @@ -171,7 +171,12 @@ public static ObservationProto ToProto(this Observation obs) if (obs.CompressedData != null) { - // TODO check obs.FloatData.Empty() + // 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), diff --git a/UnitySDK/Assets/ML-Agents/Scripts/Sensor/Observation.cs b/UnitySDK/Assets/ML-Agents/Scripts/Sensor/Observation.cs index 61dcc7147b..3a5f88e120 100644 --- a/UnitySDK/Assets/ML-Agents/Scripts/Sensor/Observation.cs +++ b/UnitySDK/Assets/ML-Agents/Scripts/Sensor/Observation.cs @@ -6,10 +6,13 @@ namespace MLAgents.Sensor public struct Observation { /// - /// The compressed data. + /// The compressed sensor data. Assumed to be non-null if CompressionType != CompressionType.None /// public byte[] CompressedData; + /// + /// Uncompressed sensor data. Assumed to be non-empty if CompressionType == CompressionType.None + /// public ArraySegment FloatData; /// From 173286c819cfd2f28997dca0f0bb0c9d4832d976 Mon Sep 17 00:00:00 2001 From: Chris Elion Date: Wed, 6 Nov 2019 15:39:41 -0800 Subject: [PATCH 17/19] python brain cleanup --- ml-agents-envs/mlagents/envs/brain.py | 48 ++++++++++++--------------- 1 file changed, 21 insertions(+), 27 deletions(-) diff --git a/ml-agents-envs/mlagents/envs/brain.py b/ml-agents-envs/mlagents/envs/brain.py index c28647e3df..4304b36c65 100644 --- a/ml-agents-envs/mlagents/envs/brain.py +++ b/ml-agents-envs/mlagents/envs/brain.py @@ -167,26 +167,7 @@ def from_agent_proto( """ Converts list of agent infos to BrainInfo. """ - vis_obs: List[np.ndarray] = [] - vector_observation_protos: List[List[ObservationProto]] = [] - visual_observation_protos: List[List[ObservationProto]] = [] - - # Split the observations into vector (len(shape)==1) and visual (len(shape)==3) lists - for agent in agent_info_list: - agent_vis: List[ObservationProto] = [] - agent_vec: List[ObservationProto] = [] - for proto_obs in agent.observations: - is_visual = len(proto_obs.shape) == 3 - if is_visual: - agent_vis.append(proto_obs) - else: - agent_vec.append(proto_obs) - vector_observation_protos.append(agent_vec) - visual_observation_protos.append(agent_vis) - - vis_obs = BrainInfo._process_visual_observations( - brain_params, visual_observation_protos - ) + 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)) @@ -203,7 +184,7 @@ def from_agent_proto( ) vector_obs = BrainInfo._process_vector_observations( - brain_params, agent_info_list, vector_observation_protos + brain_params, agent_info_list ) agents = [f"${worker_id}-{x.id}" for x in agent_info_list] @@ -221,8 +202,20 @@ def from_agent_proto( @staticmethod def _process_visual_observations( - brain_params: BrainParameters, visual_observations: List[List[ObservationProto]] + 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 @@ -231,16 +224,14 @@ def _process_visual_observations( agent_obs[i].compressed_data, brain_params.camera_resolutions[i].gray_scale, ) - for agent_obs in visual_observations + 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], - vector_observations: List[List[ObservationProto]], + 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)) @@ -248,7 +239,10 @@ def _process_vector_observations( stacked_obs = [] has_nan = False has_inf = False - for x, vec_obs in zip(agent_info_list, vector_observations): + 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: From 2fa4afdede4241e90ec5a6346d96944a18d93d13 Mon Sep 17 00:00:00 2001 From: Chris Elion Date: Wed, 6 Nov 2019 16:02:38 -0800 Subject: [PATCH 18/19] workaround protobuf EnumTypeWrapper bug (need proto3.8 to fix) --- ml-agents-envs/mlagents/envs/mock_communicator.py | 7 ++++--- ml-agents-envs/mlagents/envs/tests/test_brain.py | 4 ++-- ml-agents/mlagents/trainers/tests/test_simple_rl.py | 6 +++--- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/ml-agents-envs/mlagents/envs/mock_communicator.py b/ml-agents-envs/mlagents/envs/mock_communicator.py index 5d0b472e48..1c88b416c6 100755 --- a/ml-agents-envs/mlagents/envs/mock_communicator.py +++ b/ml-agents-envs/mlagents/envs/mock_communicator.py @@ -10,7 +10,8 @@ from mlagents.envs.communicator_objects.agent_info_pb2 import AgentInfoProto from mlagents.envs.communicator_objects.observation_pb2 import ( ObservationProto, - CompressionTypeProto, + NONE as COMPRESSION_TYPE_NONE, + PNG as COMPRESSION_TYPE_PNG, ) @@ -68,14 +69,14 @@ def _get_agent_infos(self): ObservationProto( compressed_data=None, shape=[30, 40, 3], - compression_type=CompressionTypeProto.PNG, + compression_type=COMPRESSION_TYPE_PNG, ) for _ in range(self.visual_inputs) ] vector_obs_proto = ObservationProto( float_data=ObservationProto.FloatData(data=vector_obs), shape=[len(vector_obs)], - compression_type=CompressionTypeProto.NONE, + compression_type=COMPRESSION_TYPE_NONE, ) observations.append(vector_obs_proto) diff --git a/ml-agents-envs/mlagents/envs/tests/test_brain.py b/ml-agents-envs/mlagents/envs/tests/test_brain.py index 5ad16707c9..278de98cc2 100644 --- a/ml-agents-envs/mlagents/envs/tests/test_brain.py +++ b/ml-agents-envs/mlagents/envs/tests/test_brain.py @@ -7,7 +7,7 @@ from mlagents.envs.communicator_objects.agent_info_pb2 import AgentInfoProto from mlagents.envs.communicator_objects.observation_pb2 import ( ObservationProto, - CompressionTypeProto, + NONE as COMPRESSION_TYPE_NONE, ) from mlagents.envs.brain import BrainInfo, BrainParameters @@ -26,7 +26,7 @@ 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=CompressionTypeProto.NONE, + compression_type=COMPRESSION_TYPE_NONE, ) agent_info_proto.observations.append(obs) return agent_info_proto diff --git a/ml-agents/mlagents/trainers/tests/test_simple_rl.py b/ml-agents/mlagents/trainers/tests/test_simple_rl.py index 37f21786c4..f8a491f208 100644 --- a/ml-agents/mlagents/trainers/tests/test_simple_rl.py +++ b/ml-agents/mlagents/trainers/tests/test_simple_rl.py @@ -13,7 +13,7 @@ from mlagents.envs.communicator_objects.agent_info_pb2 import AgentInfoProto from mlagents.envs.communicator_objects.observation_pb2 import ( ObservationProto, - CompressionTypeProto, + NONE as COMPRESSION_TYPE_NONE, ) from mlagents.envs.simple_env_manager import SimpleEnvManager from mlagents.envs.sampler_class import SamplerManager @@ -85,7 +85,7 @@ def step( vector_obs_proto = ObservationProto( float_data=ObservationProto.FloatData(data=vector_obs), shape=[len(vector_obs)], - compression_type=CompressionTypeProto.NONE, + compression_type=COMPRESSION_TYPE_NONE, ) agent_info = AgentInfoProto(reward=reward, done=done) agent_info.observations.append(vector_obs_proto) @@ -116,7 +116,7 @@ def reset( vector_obs_proto = ObservationProto( float_data=ObservationProto.FloatData(data=vector_obs), shape=[len(vector_obs)], - compression_type=CompressionTypeProto.NONE, + compression_type=COMPRESSION_TYPE_NONE, ) agent_info = AgentInfoProto(done=False, max_step_reached=False) agent_info.observations.append(vector_obs_proto) From a408c42fefa89f93a02e3ac8630899ddf69a5bc7 Mon Sep 17 00:00:00 2001 From: Chris Elion Date: Wed, 6 Nov 2019 16:18:10 -0800 Subject: [PATCH 19/19] more proto3.6 fixes (no append) --- ml-agents-envs/mlagents/envs/tests/test_brain.py | 3 +-- ml-agents/mlagents/trainers/tests/test_simple_rl.py | 10 ++++++---- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/ml-agents-envs/mlagents/envs/tests/test_brain.py b/ml-agents-envs/mlagents/envs/tests/test_brain.py index 278de98cc2..b5d4a0c254 100644 --- a/ml-agents-envs/mlagents/envs/tests/test_brain.py +++ b/ml-agents-envs/mlagents/envs/tests/test_brain.py @@ -22,13 +22,12 @@ def _make_agent_info_proto(vector_obs: List[float]) -> AgentInfoProto: - agent_info_proto = AgentInfoProto() obs = ObservationProto( float_data=ObservationProto.FloatData(data=vector_obs), shape=[len(vector_obs)], compression_type=COMPRESSION_TYPE_NONE, ) - agent_info_proto.observations.append(obs) + agent_info_proto = AgentInfoProto(observations=[obs]) return agent_info_proto diff --git a/ml-agents/mlagents/trainers/tests/test_simple_rl.py b/ml-agents/mlagents/trainers/tests/test_simple_rl.py index f8a491f208..691a992f44 100644 --- a/ml-agents/mlagents/trainers/tests/test_simple_rl.py +++ b/ml-agents/mlagents/trainers/tests/test_simple_rl.py @@ -87,8 +87,9 @@ def step( shape=[len(vector_obs)], compression_type=COMPRESSION_TYPE_NONE, ) - agent_info = AgentInfoProto(reward=reward, done=done) - agent_info.observations.append(vector_obs_proto) + agent_info = AgentInfoProto( + reward=reward, done=done, observations=[vector_obs_proto] + ) if done: self._reset_agent() @@ -118,8 +119,9 @@ def reset( shape=[len(vector_obs)], compression_type=COMPRESSION_TYPE_NONE, ) - agent_info = AgentInfoProto(done=False, max_step_reached=False) - agent_info.observations.append(vector_obs_proto) + agent_info = AgentInfoProto( + done=False, max_step_reached=False, observations=[vector_obs_proto] + ) return { BRAIN_NAME: BrainInfo.from_agent_proto(