From 2b50f60f4a4065c5cee902f03feb834a979eca3b Mon Sep 17 00:00:00 2001 From: "Miguel Alonso Jr." <76960110+miguelalonsojr@users.noreply.github.com> Date: Sun, 25 Aug 2024 20:07:16 -0400 Subject: [PATCH] Develop upgrade Sentis 2.0.0 (#6137) * Upgraded to Sentis v1.4.0-pre.3 * Disabling sonar qube yamato job. Will add gha sonar scanner at a later date. * Addressing PR comments. * Addressing feedback. * Upgraded to sentis 2.0.0. * Fixed failing tests. * Fixed soccertwos policy. * Fixed pytorch deprecation message during training startup. Updated Installation.md * Updated installation docs. * Fixed failing torch utils test. --- .yamato/sonar-python-package.yml | 42 +- .../Examples/3DBall/Prefabs/3DBall.prefab | 74 ++- .../Examples/3DBall/Scenes/3DBall.unity | 129 ++++- .../Examples/3DBall/Scenes/Visual3DBall.unity | 91 +++- .../Examples/3DBall/TFModels/3DBall.onnx | Bin 74869 -> 77016 bytes .../Examples/3DBall/TFModels/3DBall.onnx.meta | 1 - .../Examples/3DBall/TFModels/3DBallHard.onnx | Bin 93825 -> 97163 bytes .../3DBall/TFModels/3DBallHard.onnx.meta | 1 - .../3DBall/TFModels/Visual3DBall.onnx.meta | 1 - .../Examples/Basic/Scripts/BasicController.cs | 3 +- .../Examples/Crawler/TFModels/Crawler.onnx | Bin 2471987 -> 2472183 bytes .../Prefabs/DungeonEscapePlatform.prefab | 179 ++++--- .../DungeonEscape/Scenes/DungeonEscape.unity | 123 +++-- .../DungeonEscape/TFModels/DungeonEscape.onnx | Bin 653744 -> 653763 bytes .../TFModels/DungeonEscape.onnx.meta | 3 +- .../TFModels/GridFoodCollector.onnx | Bin 621416 -> 621656 bytes .../TFModels/VisualFoodCollector.onnx | Bin 1512131 -> 1512307 bytes .../Prefabs/agentRenderTexture.renderTexture | 6 +- .../GridWorld/TFModels/GridWorld.onnx | Bin 4906293 -> 4906489 bytes .../GridWorld/TFModels/GridWorld.onnx.meta | 1 - .../GridWorld/TFModels/GridWorldColab.onnx | Bin 920626 -> 920804 bytes .../Examples/Hallway/TFModels/Hallway.onnx | Bin 324696 -> 324880 bytes .../Match3/Prefabs/Match3VectorObs.prefab | 19 +- .../Match3/Prefabs/Match3VisualObs.prefab | 19 +- .../Examples/Match3/Scenes/Match3.unity | 187 +++++-- .../Match3/Scenes/Match3Settings.lighting | 62 +++ .../Scenes/Match3Settings.lighting.meta | 8 + .../Match3/TFModels/Match3VectorObs.onnx | Bin 1593073 -> 1593257 bytes .../Match3/TFModels/Match3VisualObs.onnx | Bin 7726904 -> 7727088 bytes .../Prefabs/PushBlockCollabAreaGrid.prefab | 394 +++++++++++--- .../Examples/PushBlock/Scenes/PushBlock.unity | 230 ++++++++- .../PushBlock/Scenes/PushBlockCollab.unity | 161 +++++- .../PushBlock/TFModels/PushBlockCollab.onnx | Bin 638530 -> 638714 bytes .../Scripts/PushBlockActions.cs | 2 +- .../TFModels/PushBlock.onnx | Bin 486378 -> 486618 bytes .../SharedAssets/Scripts/ModelOverrider.cs | 4 +- .../Soccer/Prefabs/SoccerFieldTwos.prefab | 196 ++++--- .../Examples/Soccer/Scenes/SoccerTwos.unity | 47 +- .../Examples/Soccer/TFModels/SoccerTwos.onnx | Bin 1763292 -> 1763443 bytes .../Soccer/TFModels/SoccerTwos.onnx.meta | 3 +- .../Examples/Walker/TFModels/Walker.onnx | Bin 820986 -> 821170 bytes Project/Packages/manifest.json | 14 +- Project/Packages/packages-lock.json | 55 +- Project/ProjectSettings/MemorySettings.asset | 35 ++ .../ProjectSettings/MultiplayerManager.asset | 7 + .../PackageManagerSettings.asset | 37 ++ Project/ProjectSettings/ProjectVersion.txt | 4 +- .../SceneTemplateSettings.json | 121 +++++ Project/ProjectSettings/TimeManager.asset | 6 +- .../VersionControlSettings.asset | 9 + .../Runtime/Analytics/InferenceAnalytics.cs | 15 +- .../Runtime/Inference/ApplierImpl.cs | 53 +- ...ons.cs => DynamicTensorShapeExtensions.cs} | 12 +- ...a => DynamicTensorShapeExtensions.cs.meta} | 0 .../Runtime/Inference/GeneratorImpl.cs | 100 ++-- .../Runtime/Inference/ModelRunner.cs | 34 +- .../Inference/SentisModelExtensions.cs | 438 ---------------- .../Runtime/Inference/SentisModelInfo.cs | 481 ++++++++++++++++++ ...nsions.cs.meta => SentisModelInfo.cs.meta} | 0 .../Inference/SentisModelParamLoader.cs | 51 +- .../Runtime/Inference/TensorApplier.cs | 14 +- .../Runtime/Inference/TensorGenerator.cs | 38 +- .../Runtime/Inference/TensorProxy.cs | 53 +- .../Runtime/Sensors/ObservationWriter.cs | 65 +-- .../DiscreteActionOutputApplierTest.cs | 10 +- .../EditModeTestInternalBrainTensorApplier.cs | 48 +- ...ditModeTestInternalBrainTensorGenerator.cs | 58 +-- .../Editor/Inference/ParameterLoaderTest.cs | 36 +- .../Tests/Editor/Inference/TensorUtilsTest.cs | 13 +- .../continuous2vis8vec2action_v1_0.onnx | Bin 332019 -> 332098 bytes .../deterContinuous2vis8vec2action_v2_0.onnx | Bin 73999 -> 74136 bytes .../deterDiscrete1obs3action_v2_0.onnx | Bin 3715 -> 3718 bytes ...is0vec_2_3action_obsolete_recurr_v1_0.onnx | Bin 399488 -> 399647 bytes .../discrete_rank2_vector_v2_0.onnx | Bin 506738 -> 506978 bytes .../hybrid0vis53vec_3c_2daction_v1_0.onnx | Bin 99118 -> 99363 bytes .../hybrid0vis8vec_2c_2_3d_v2_0.onnx | Bin 276089 -> 276437 bytes .../Runtime/Sensor/ObservationWriterTests.cs | 32 +- com.unity.ml-agents/package.json | 2 +- docs/Installation.md | 12 +- ml-agents/mlagents/torch_utils/torch.py | 5 +- .../trainers/tests/test_torch_utils.py | 6 +- 81 files changed, 2591 insertions(+), 1259 deletions(-) create mode 100644 Project/Assets/ML-Agents/Examples/Match3/Scenes/Match3Settings.lighting create mode 100644 Project/Assets/ML-Agents/Examples/Match3/Scenes/Match3Settings.lighting.meta create mode 100644 Project/ProjectSettings/MemorySettings.asset create mode 100644 Project/ProjectSettings/MultiplayerManager.asset create mode 100644 Project/ProjectSettings/PackageManagerSettings.asset create mode 100644 Project/ProjectSettings/SceneTemplateSettings.json create mode 100644 Project/ProjectSettings/VersionControlSettings.asset rename com.unity.ml-agents/Runtime/Inference/{SymbolicTensorShapeExtensions.cs => DynamicTensorShapeExtensions.cs} (67%) rename com.unity.ml-agents/Runtime/Inference/{SymbolicTensorShapeExtensions.cs.meta => DynamicTensorShapeExtensions.cs.meta} (100%) delete mode 100644 com.unity.ml-agents/Runtime/Inference/SentisModelExtensions.cs create mode 100644 com.unity.ml-agents/Runtime/Inference/SentisModelInfo.cs rename com.unity.ml-agents/Runtime/Inference/{SentisModelExtensions.cs.meta => SentisModelInfo.cs.meta} (100%) diff --git a/.yamato/sonar-python-package.yml b/.yamato/sonar-python-package.yml index a087afe56a..293f22c8e6 100644 --- a/.yamato/sonar-python-package.yml +++ b/.yamato/sonar-python-package.yml @@ -1,21 +1,21 @@ -csharp: - name: Sonarqube Scan for ml-agents python repo - agent: - type: Unity::metal::macmini - image: package-ci/mac:v1.8.1-822785 - flavor: m1.mac - variables: - SONARQUBE_PROJECT_KEY: ai-ml-agents-toolkit - TARGET_BRANCH: develop - commands: - - npm install shellcheck --save-dev - - npm install upm-ci-utils@1.27.0 -g --registry https://artifactory.prd.it.unity3d.com/artifactory/api/npm/upm-npm - - curl https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-4.7.0.2747-macosx.zip -o sonar-scanner-cli-macosx.zip -L - - unzip sonar-scanner-cli-macosx.zip -d ~/sonar-scanner-cli - - ~/sonar-scanner-cli/sonar-scanner-4.7.0.2747-macosx/bin/sonar-scanner -Dsonar.projectKey=$SONARQUBE_PROJECT_KEY -Dsonar.sources=ml-agents-env -Dsonar.sources=ml-agents -Dsonar.sources=ml-agents-plugin-examples -Dsonar.sources=ml-agents-trainer-plugin -Dsonar.sources=utils -Dsonar.host.url=$SONARQUBE_URL -Dsonar.login=$SONARQUBE_TOKEN -Dsonar.branch.name=$TARGET_BRANCH -Dsonar.scm.provider=git - triggers: - cancel_old_ci: true - expression: | - ((pull_request.target eq "main" OR pull_request.target eq "develop" OR pull_request.target match "release.+") - AND NOT pull_request.push.changes.all match "**/*.md") OR - (push.branch eq "main" OR push.branch eq "develop") +#csharp: +# name: Sonarqube Scan for ml-agents python repo +# agent: +# type: Unity::metal::macmini +# image: package-ci/mac:v1.8.1-822785 +# flavor: m1.mac +# variables: +# SONARQUBE_PROJECT_KEY: ai-ml-agents-toolkit +# TARGET_BRANCH: develop +# commands: +# - npm install shellcheck --save-dev +# - npm install upm-ci-utils@1.27.0 -g --registry https://artifactory.prd.it.unity3d.com/artifactory/api/npm/upm-npm +# - curl https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-4.7.0.2747-macosx.zip -o sonar-scanner-cli-macosx.zip -L +# - unzip sonar-scanner-cli-macosx.zip -d ~/sonar-scanner-cli +# - ~/sonar-scanner-cli/sonar-scanner-4.7.0.2747-macosx/bin/sonar-scanner -Dsonar.projectKey=$SONARQUBE_PROJECT_KEY -Dsonar.sources=ml-agents-env -Dsonar.sources=ml-agents -Dsonar.sources=ml-agents-plugin-examples -Dsonar.sources=ml-agents-trainer-plugin -Dsonar.sources=utils -Dsonar.host.url=$SONARQUBE_URL -Dsonar.login=$SONARQUBE_TOKEN -Dsonar.branch.name=$TARGET_BRANCH -Dsonar.scm.provider=git +# triggers: +# cancel_old_ci: true +# expression: | +# ((pull_request.target eq "main" OR pull_request.target eq "develop" OR pull_request.target match "release.+") +# AND NOT pull_request.push.changes.all match "**/*.md") OR +# (push.branch eq "main" OR push.branch eq "develop") diff --git a/Project/Assets/ML-Agents/Examples/3DBall/Prefabs/3DBall.prefab b/Project/Assets/ML-Agents/Examples/3DBall/Prefabs/3DBall.prefab index 63f15a3853..367f866a5f 100644 --- a/Project/Assets/ML-Agents/Examples/3DBall/Prefabs/3DBall.prefab +++ b/Project/Assets/ML-Agents/Examples/3DBall/Prefabs/3DBall.prefab @@ -27,13 +27,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1036225416237908} + serializedVersion: 2 m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 4.31, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 4679453577574622} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!33 &33399516572863624 MeshFilter: @@ -51,9 +51,17 @@ SphereCollider: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1036225416237908} m_Material: {fileID: 13400000, guid: 56162663048874fd4b10e065f9cf78b7, type: 2} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 m_IsTrigger: 0 + m_ProvidesContacts: 0 m_Enabled: 1 - serializedVersion: 2 + serializedVersion: 3 m_Radius: 0.5 m_Center: {x: 0, y: 0, z: 0} --- !u!23 &23610325484096200 @@ -73,6 +81,8 @@ MeshRenderer: m_ReflectionProbeUsage: 1 m_RayTracingMode: 2 m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: @@ -105,10 +115,21 @@ Rigidbody: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1036225416237908} - serializedVersion: 2 + serializedVersion: 4 m_Mass: 1 m_Drag: 0 m_AngularDrag: 0.01 + m_CenterOfMass: {x: 0, y: 0, z: 0} + m_InertiaTensor: {x: 1, y: 1, z: 1} + m_InertiaRotation: {x: 0, y: 0, z: 0, w: 1} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ImplicitCom: 1 + m_ImplicitTensor: 1 m_UseGravity: 1 m_IsKinematic: 0 m_Interpolate: 0 @@ -139,13 +160,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1218265376493012} + serializedVersion: 2 m_LocalRotation: {x: -0, y: 1, z: -0, w: 0} m_LocalPosition: {x: 0.29999995, y: 0.07399994, z: 0.50040054} m_LocalScale: {x: 0.29457998, y: 0.29457998, z: 0.29457998} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 4294419716796784} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 180, z: 0} --- !u!33 &33986757750372936 MeshFilter: @@ -172,6 +193,8 @@ MeshRenderer: m_ReflectionProbeUsage: 1 m_RayTracingMode: 2 m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: @@ -220,6 +243,7 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1321468028730240} + serializedVersion: 2 m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 5} m_LocalScale: {x: 1, y: 1, z: 1} @@ -228,7 +252,6 @@ Transform: - {fileID: 4259352808153402} - {fileID: 4780098186595842} m_Father: {fileID: 0} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1424713891854676 GameObject: @@ -258,6 +281,7 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1424713891854676} + serializedVersion: 2 m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 5, y: 5, z: 5} @@ -265,7 +289,6 @@ Transform: m_Children: - {fileID: 4294419716796784} m_Father: {fileID: 4679453577574622} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!65 &65010516625723872 BoxCollider: @@ -275,9 +298,17 @@ BoxCollider: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1424713891854676} m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 m_IsTrigger: 0 + m_ProvidesContacts: 0 m_Enabled: 1 - serializedVersion: 2 + serializedVersion: 3 m_Size: {x: 1, y: 1, z: 1} m_Center: {x: 0, y: 0, z: 0} --- !u!114 &114368073295828880 @@ -342,6 +373,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: DecisionPeriod: 5 + DecisionStep: 0 TakeActionsBetweenDecisions: 1 --- !u!114 &1758424554059689351 MonoBehaviour: @@ -380,13 +412,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1533320402322554} + serializedVersion: 2 m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0.15} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 4294419716796784} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!20 &20793118999710892 Camera: @@ -402,9 +434,17 @@ Camera: m_projectionMatrixMode: 1 m_GateFitMode: 2 m_FOVAxisMode: 0 + m_Iso: 200 + m_ShutterSpeed: 0.005 + m_Aperture: 16 + m_FocusDistance: 10 + m_FocalLength: 50 + m_BladeCount: 5 + m_Curvature: {x: 2, y: 11} + m_BarrelClipping: 0.25 + m_Anamorphism: 0 m_SensorSize: {x: 36, y: 24} m_LensShift: {x: 0, y: 0} - m_FocalLength: 50 m_NormalizedViewPortRect: serializedVersion: 2 x: 0 @@ -456,13 +496,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1619100162539582} + serializedVersion: 2 m_LocalRotation: {x: -0, y: 1, z: -0, w: 0} m_LocalPosition: {x: 0, y: -0.18299997, z: 0.50040054} m_LocalScale: {x: 0.27602, y: 0.042489994, z: 0.13891} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 4294419716796784} - m_RootOrder: 3 m_LocalEulerAnglesHint: {x: 0, y: 180, z: 0} --- !u!33 &33259119028337980 MeshFilter: @@ -489,6 +529,8 @@ MeshRenderer: m_ReflectionProbeUsage: 1 m_RayTracingMode: 2 m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: @@ -539,13 +581,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1854695166504686} + serializedVersion: 2 m_LocalRotation: {x: -0, y: -0, z: 0.016506119, w: 0.9998638} m_LocalPosition: {x: 0, y: 0.341, z: 0} m_LocalScale: {x: 1.0441425, y: 0.19278127, z: 1.0441422} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 4294419716796784} - m_RootOrder: 4 m_LocalEulerAnglesHint: {x: 0, y: -179.99998, z: 1.8920001} --- !u!33 &33165976320323760 MeshFilter: @@ -572,6 +614,8 @@ MeshRenderer: m_ReflectionProbeUsage: 1 m_RayTracingMode: 2 m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: @@ -622,6 +666,7 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1859240399150782} + serializedVersion: 2 m_LocalRotation: {x: 0, y: 1, z: 0, w: 0} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} @@ -633,7 +678,6 @@ Transform: - {fileID: 4425897039098228} - {fileID: 4300192163442926} m_Father: {fileID: 4780098186595842} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 180, z: 0} --- !u!33 &33973749152356522 MeshFilter: @@ -660,6 +704,8 @@ MeshRenderer: m_ReflectionProbeUsage: 1 m_RayTracingMode: 2 m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: @@ -710,13 +756,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1999020414315134} + serializedVersion: 2 m_LocalRotation: {x: -0, y: 1, z: -0, w: 0} m_LocalPosition: {x: -0.29999995, y: 0.07399994, z: 0.50040054} m_LocalScale: {x: 0.29457998, y: 0.29457998, z: 0.29457998} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 4294419716796784} - m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 180, z: 0} --- !u!33 &33069174244444078 MeshFilter: @@ -743,6 +789,8 @@ MeshRenderer: m_ReflectionProbeUsage: 1 m_RayTracingMode: 2 m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: diff --git a/Project/Assets/ML-Agents/Examples/3DBall/Scenes/3DBall.unity b/Project/Assets/ML-Agents/Examples/3DBall/Scenes/3DBall.unity index 698e2134bd..9d631d27d9 100644 --- a/Project/Assets/ML-Agents/Examples/3DBall/Scenes/3DBall.unity +++ b/Project/Assets/ML-Agents/Examples/3DBall/Scenes/3DBall.unity @@ -13,7 +13,7 @@ OcclusionCullingSettings: --- !u!104 &2 RenderSettings: m_ObjectHideFlags: 0 - serializedVersion: 9 + serializedVersion: 10 m_Fog: 0 m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} m_FogMode: 3 @@ -38,13 +38,12 @@ RenderSettings: m_ReflectionIntensity: 1 m_CustomReflection: {fileID: 0} m_Sun: {fileID: 0} - m_IndirectSpecularColor: {r: 0.44971168, g: 0.4997775, b: 0.57563686, a: 1} + m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1} m_UseRadianceAmbientProbe: 0 --- !u!157 &3 LightmapSettings: m_ObjectHideFlags: 0 serializedVersion: 12 - m_GIWorkflowMode: 0 m_GISettings: serializedVersion: 2 m_BounceScale: 1 @@ -67,9 +66,6 @@ LightmapSettings: m_LightmapParameters: {fileID: 0} m_LightmapsBakeMode: 1 m_TextureCompression: 1 - m_FinalGather: 0 - m_FinalGatherFiltering: 1 - m_FinalGatherRayCount: 256 m_ReflectionCompression: 2 m_MixedBakeMode: 2 m_BakeBackend: 0 @@ -104,7 +100,7 @@ NavMeshSettings: serializedVersion: 2 m_ObjectHideFlags: 0 m_BuildSettings: - serializedVersion: 2 + serializedVersion: 3 agentTypeID: 0 agentRadius: 0.5 agentHeight: 2 @@ -117,7 +113,7 @@ NavMeshSettings: cellSize: 0.16666667 manualTileSize: 0 tileSize: 256 - accuratePlacement: 0 + buildHeightMesh: 0 maxJobWorkers: 0 preserveTilesOutsideBounds: 0 debug: @@ -128,6 +124,7 @@ PrefabInstance: m_ObjectHideFlags: 0 serializedVersion: 2 m_Modification: + serializedVersion: 3 m_TransformParent: {fileID: 0} m_Modifications: - target: {fileID: 1321468028730240, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} @@ -171,12 +168,16 @@ PrefabInstance: value: 0 objectReference: {fileID: 0} m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} --- !u!1001 &255414642 PrefabInstance: m_ObjectHideFlags: 0 serializedVersion: 2 m_Modification: + serializedVersion: 3 m_TransformParent: {fileID: 0} m_Modifications: - target: {fileID: 1537641056927260, guid: 3ce107b4a79bc4eef83afde434932a68, type: 3} @@ -274,12 +275,16 @@ PrefabInstance: value: 0 objectReference: {fileID: 0} m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: 3ce107b4a79bc4eef83afde434932a68, type: 3} --- !u!1001 &502565578 PrefabInstance: m_ObjectHideFlags: 0 serializedVersion: 2 m_Modification: + serializedVersion: 3 m_TransformParent: {fileID: 0} m_Modifications: - target: {fileID: 1321468028730240, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} @@ -323,12 +328,16 @@ PrefabInstance: value: 0 objectReference: {fileID: 0} m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} --- !u!1001 &544070511 PrefabInstance: m_ObjectHideFlags: 0 serializedVersion: 2 m_Modification: + serializedVersion: 3 m_TransformParent: {fileID: 0} m_Modifications: - target: {fileID: 1321468028730240, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} @@ -372,12 +381,16 @@ PrefabInstance: value: 0 objectReference: {fileID: 0} m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} --- !u!1001 &667695845 PrefabInstance: m_ObjectHideFlags: 0 serializedVersion: 2 m_Modification: + serializedVersion: 3 m_TransformParent: {fileID: 0} m_Modifications: - target: {fileID: 1321468028730240, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} @@ -421,12 +434,16 @@ PrefabInstance: value: 0 objectReference: {fileID: 0} m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} --- !u!1001 &717322969 PrefabInstance: m_ObjectHideFlags: 0 serializedVersion: 2 m_Modification: + serializedVersion: 3 m_TransformParent: {fileID: 0} m_Modifications: - target: {fileID: 1321468028730240, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} @@ -478,6 +495,9 @@ PrefabInstance: value: 0 objectReference: {fileID: 0} m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} --- !u!1 &807556622 GameObject: @@ -519,9 +539,17 @@ Camera: m_projectionMatrixMode: 1 m_GateFitMode: 2 m_FOVAxisMode: 0 + m_Iso: 200 + m_ShutterSpeed: 0.005 + m_Aperture: 16 + m_FocusDistance: 10 + m_FocalLength: 50 + m_BladeCount: 5 + m_Curvature: {x: 2, y: 11} + m_BarrelClipping: 0.25 + m_Anamorphism: 0 m_SensorSize: {x: 36, y: 24} m_LensShift: {x: 0, y: 0} - m_FocalLength: 50 m_NormalizedViewPortRect: serializedVersion: 2 x: 0 @@ -555,19 +583,20 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 807556622} + serializedVersion: 2 m_LocalRotation: {x: 0.13052616, y: 0, z: 0, w: 0.9914449} m_LocalPosition: {x: 4.5, y: 15, z: -43.83} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 0} - m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 15, y: 0, z: 0} --- !u!1001 &949996849 PrefabInstance: m_ObjectHideFlags: 0 serializedVersion: 2 m_Modification: + serializedVersion: 3 m_TransformParent: {fileID: 0} m_Modifications: - target: {fileID: 1321468028730240, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} @@ -611,12 +640,16 @@ PrefabInstance: value: 0 objectReference: {fileID: 0} m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} --- !u!1001 &1223600457 PrefabInstance: m_ObjectHideFlags: 0 serializedVersion: 2 m_Modification: + serializedVersion: 3 m_TransformParent: {fileID: 0} m_Modifications: - target: {fileID: 1321468028730240, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} @@ -660,12 +693,16 @@ PrefabInstance: value: 0 objectReference: {fileID: 0} m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} --- !u!1001 &1334647069 PrefabInstance: m_ObjectHideFlags: 0 serializedVersion: 2 m_Modification: + serializedVersion: 3 m_TransformParent: {fileID: 0} m_Modifications: - target: {fileID: 1321468028730240, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} @@ -709,12 +746,16 @@ PrefabInstance: value: 0 objectReference: {fileID: 0} m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} --- !u!1001 &1345277686 PrefabInstance: m_ObjectHideFlags: 0 serializedVersion: 2 m_Modification: + serializedVersion: 3 m_TransformParent: {fileID: 0} m_Modifications: - target: {fileID: 1321468028730240, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} @@ -758,6 +799,9 @@ PrefabInstance: value: 0 objectReference: {fileID: 0} m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} --- !u!850595691 &1354181355 LightingSettings: @@ -766,8 +810,7 @@ LightingSettings: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_Name: Settings.lighting - serializedVersion: 4 - m_GIWorkflowMode: 0 + serializedVersion: 8 m_EnableBakedLightmaps: 1 m_EnableRealtimeLightmaps: 1 m_RealtimeEnvironmentLighting: 1 @@ -775,8 +818,10 @@ LightingSettings: m_AlbedoBoost: 1 m_IndirectOutputScale: 1 m_UsingShadowmask: 1 - m_BakeBackend: 0 + m_BakeBackend: 1 m_LightmapMaxSize: 1024 + m_LightmapSizeFixed: 0 + m_UseMipmapLimits: 1 m_BakeResolution: 40 m_Padding: 2 m_LightmapCompression: 3 @@ -794,19 +839,16 @@ LightingSettings: m_RealtimeResolution: 2 m_ForceWhiteAlbedo: 0 m_ForceUpdates: 0 - m_FinalGather: 0 - m_FinalGatherRayCount: 256 - m_FinalGatherFiltering: 1 m_PVRCulling: 1 m_PVRSampling: 1 m_PVRDirectSampleCount: 32 - m_PVRSampleCount: 500 - m_PVREnvironmentSampleCount: 500 + m_PVRSampleCount: 512 + m_PVREnvironmentSampleCount: 512 m_PVREnvironmentReferencePointCount: 2048 m_LightProbeSampleCountMultiplier: 4 m_PVRBounces: 2 m_PVRMinBounces: 2 - m_PVREnvironmentMIS: 0 + m_PVREnvironmentImportanceSampling: 0 m_PVRFilteringMode: 2 m_PVRDenoiserTypeDirect: 0 m_PVRDenoiserTypeIndirect: 0 @@ -820,12 +862,13 @@ LightingSettings: m_PVRFilteringAtrousPositionSigmaDirect: 0.5 m_PVRFilteringAtrousPositionSigmaIndirect: 2 m_PVRFilteringAtrousPositionSigmaAO: 1 - m_PVRTiledBaking: 0 + m_RespectSceneVisibilityWhenBakingGI: 0 --- !u!1001 &1442662986 PrefabInstance: m_ObjectHideFlags: 0 serializedVersion: 2 m_Modification: + serializedVersion: 3 m_TransformParent: {fileID: 0} m_Modifications: - target: {fileID: 1321468028730240, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} @@ -869,12 +912,16 @@ PrefabInstance: value: 0 objectReference: {fileID: 0} m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} --- !u!1001 &1531193856 PrefabInstance: m_ObjectHideFlags: 0 serializedVersion: 2 m_Modification: + serializedVersion: 3 m_TransformParent: {fileID: 0} m_Modifications: - target: {fileID: 1321468028730240, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} @@ -918,12 +965,14 @@ PrefabInstance: value: 0 objectReference: {fileID: 0} m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} --- !u!1 &1583402087 GameObject: m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 1408885610532680, guid: 00a1ebe742cf2394d8c21484e3a02412, - type: 2} + m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} serializedVersion: 6 @@ -940,18 +989,17 @@ GameObject: --- !u!4 &1583402088 Transform: m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 4673284961943764, guid: 00a1ebe742cf2394d8c21484e3a02412, - type: 2} + m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1583402087} + serializedVersion: 2 m_LocalRotation: {x: -0.069583125, y: 0.0049145464, z: 0.0702813, w: 0.99508524} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 5, y: 0.19999993, z: 5} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 0} - m_RootOrder: 4 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!114 &1583402090 MonoBehaviour: @@ -1031,19 +1079,20 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1746325439} + serializedVersion: 2 m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 0} - m_RootOrder: 3 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1001 &1773419472 PrefabInstance: m_ObjectHideFlags: 0 serializedVersion: 2 m_Modification: + serializedVersion: 3 m_TransformParent: {fileID: 0} m_Modifications: - target: {fileID: 1321468028730240, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} @@ -1087,12 +1136,16 @@ PrefabInstance: value: 0 objectReference: {fileID: 0} m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} --- !u!1001 &1916479629 PrefabInstance: m_ObjectHideFlags: 0 serializedVersion: 2 m_Modification: + serializedVersion: 3 m_TransformParent: {fileID: 0} m_Modifications: - target: {fileID: 4943719350691982, guid: 5889392e3f05b448a8a06c5def6c2dec, type: 3} @@ -1132,4 +1185,28 @@ PrefabInstance: value: -45 objectReference: {fileID: 0} m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: 5889392e3f05b448a8a06c5def6c2dec, type: 3} +--- !u!1660057539 &9223372036854775807 +SceneRoots: + m_ObjectHideFlags: 0 + m_Roots: + - {fileID: 255414642} + - {fileID: 1916479629} + - {fileID: 807556627} + - {fileID: 1746325442} + - {fileID: 1583402088} + - {fileID: 717322969} + - {fileID: 1345277686} + - {fileID: 1773419472} + - {fileID: 667695845} + - {fileID: 1531193856} + - {fileID: 502565578} + - {fileID: 544070511} + - {fileID: 126840690} + - {fileID: 949996849} + - {fileID: 1223600457} + - {fileID: 1334647069} + - {fileID: 1442662986} diff --git a/Project/Assets/ML-Agents/Examples/3DBall/Scenes/Visual3DBall.unity b/Project/Assets/ML-Agents/Examples/3DBall/Scenes/Visual3DBall.unity index f27da43fd1..dcd2688004 100644 --- a/Project/Assets/ML-Agents/Examples/3DBall/Scenes/Visual3DBall.unity +++ b/Project/Assets/ML-Agents/Examples/3DBall/Scenes/Visual3DBall.unity @@ -13,7 +13,7 @@ OcclusionCullingSettings: --- !u!104 &2 RenderSettings: m_ObjectHideFlags: 0 - serializedVersion: 9 + serializedVersion: 10 m_Fog: 0 m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} m_FogMode: 3 @@ -38,13 +38,12 @@ RenderSettings: m_ReflectionIntensity: 1 m_CustomReflection: {fileID: 0} m_Sun: {fileID: 0} - m_IndirectSpecularColor: {r: 0.44971168, g: 0.4997775, b: 0.57563686, a: 1} + m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1} m_UseRadianceAmbientProbe: 0 --- !u!157 &3 LightmapSettings: m_ObjectHideFlags: 0 serializedVersion: 12 - m_GIWorkflowMode: 0 m_GISettings: serializedVersion: 2 m_BounceScale: 1 @@ -67,9 +66,6 @@ LightmapSettings: m_LightmapParameters: {fileID: 0} m_LightmapsBakeMode: 1 m_TextureCompression: 1 - m_FinalGather: 0 - m_FinalGatherFiltering: 1 - m_FinalGatherRayCount: 256 m_ReflectionCompression: 2 m_MixedBakeMode: 2 m_BakeBackend: 0 @@ -105,7 +101,7 @@ NavMeshSettings: serializedVersion: 2 m_ObjectHideFlags: 0 m_BuildSettings: - serializedVersion: 2 + serializedVersion: 3 agentTypeID: 0 agentRadius: 0.5 agentHeight: 2 @@ -118,7 +114,7 @@ NavMeshSettings: cellSize: 0.16666667 manualTileSize: 0 tileSize: 256 - accuratePlacement: 0 + buildHeightMesh: 0 maxJobWorkers: 0 preserveTilesOutsideBounds: 0 debug: @@ -129,6 +125,7 @@ PrefabInstance: m_ObjectHideFlags: 0 serializedVersion: 2 m_Modification: + serializedVersion: 3 m_TransformParent: {fileID: 0} m_Modifications: - target: {fileID: 1537641056927260, guid: 3ce107b4a79bc4eef83afde434932a68, type: 3} @@ -226,12 +223,16 @@ PrefabInstance: value: 0 objectReference: {fileID: 0} m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: 3ce107b4a79bc4eef83afde434932a68, type: 3} --- !u!1001 &306910672 PrefabInstance: m_ObjectHideFlags: 0 serializedVersion: 2 m_Modification: + serializedVersion: 3 m_TransformParent: {fileID: 0} m_Modifications: - target: {fileID: 1321468028730240, guid: ec49a7b8b70a24ab48d7ca0bf5a063a6, type: 3} @@ -287,12 +288,16 @@ PrefabInstance: value: 0 objectReference: {fileID: 0} m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: ec49a7b8b70a24ab48d7ca0bf5a063a6, type: 3} --- !u!1001 &556696704 PrefabInstance: m_ObjectHideFlags: 0 serializedVersion: 2 m_Modification: + serializedVersion: 3 m_TransformParent: {fileID: 0} m_Modifications: - target: {fileID: 1321468028730240, guid: ec49a7b8b70a24ab48d7ca0bf5a063a6, type: 3} @@ -348,12 +353,16 @@ PrefabInstance: value: 0 objectReference: {fileID: 0} m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: ec49a7b8b70a24ab48d7ca0bf5a063a6, type: 3} --- !u!1001 &996691359 PrefabInstance: m_ObjectHideFlags: 0 serializedVersion: 2 m_Modification: + serializedVersion: 3 m_TransformParent: {fileID: 0} m_Modifications: - target: {fileID: 1321468028730240, guid: ec49a7b8b70a24ab48d7ca0bf5a063a6, type: 3} @@ -409,12 +418,16 @@ PrefabInstance: value: 0 objectReference: {fileID: 0} m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: ec49a7b8b70a24ab48d7ca0bf5a063a6, type: 3} --- !u!1001 &1119003996 PrefabInstance: m_ObjectHideFlags: 0 serializedVersion: 2 m_Modification: + serializedVersion: 3 m_TransformParent: {fileID: 0} m_Modifications: - target: {fileID: 1321468028730240, guid: ec49a7b8b70a24ab48d7ca0bf5a063a6, type: 3} @@ -470,12 +483,16 @@ PrefabInstance: value: 0 objectReference: {fileID: 0} m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: ec49a7b8b70a24ab48d7ca0bf5a063a6, type: 3} --- !u!1001 &1393635142 PrefabInstance: m_ObjectHideFlags: 0 serializedVersion: 2 m_Modification: + serializedVersion: 3 m_TransformParent: {fileID: 0} m_Modifications: - target: {fileID: 1321468028730240, guid: ec49a7b8b70a24ab48d7ca0bf5a063a6, type: 3} @@ -531,12 +548,14 @@ PrefabInstance: value: 0 objectReference: {fileID: 0} m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: ec49a7b8b70a24ab48d7ca0bf5a063a6, type: 3} --- !u!1 &1583402087 GameObject: m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 1408885610532680, guid: 00a1ebe742cf2394d8c21484e3a02412, - type: 2} + m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} serializedVersion: 6 @@ -553,18 +572,17 @@ GameObject: --- !u!4 &1583402088 Transform: m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 4673284961943764, guid: 00a1ebe742cf2394d8c21484e3a02412, - type: 2} + m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1583402087} + serializedVersion: 2 m_LocalRotation: {x: -0.069583125, y: 0.0049145464, z: 0.0702813, w: 0.99508524} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 5, y: 0.19999993, z: 5} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 0} - m_RootOrder: 4 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!114 &1583402090 MonoBehaviour: @@ -644,19 +662,20 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1746325439} + serializedVersion: 2 m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 0} - m_RootOrder: 3 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1001 &1797623013 PrefabInstance: m_ObjectHideFlags: 0 serializedVersion: 2 m_Modification: + serializedVersion: 3 m_TransformParent: {fileID: 0} m_Modifications: - target: {fileID: 1321468028730240, guid: ec49a7b8b70a24ab48d7ca0bf5a063a6, type: 3} @@ -712,12 +731,16 @@ PrefabInstance: value: 0 objectReference: {fileID: 0} m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: ec49a7b8b70a24ab48d7ca0bf5a063a6, type: 3} --- !u!1001 &1916479629 PrefabInstance: m_ObjectHideFlags: 0 serializedVersion: 2 m_Modification: + serializedVersion: 3 m_TransformParent: {fileID: 0} m_Modifications: - target: {fileID: 4943719350691982, guid: 5889392e3f05b448a8a06c5def6c2dec, type: 3} @@ -757,12 +780,16 @@ PrefabInstance: value: -45 objectReference: {fileID: 0} m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: 5889392e3f05b448a8a06c5def6c2dec, type: 3} --- !u!1001 &2055232544 PrefabInstance: m_ObjectHideFlags: 0 serializedVersion: 2 m_Modification: + serializedVersion: 3 m_TransformParent: {fileID: 0} m_Modifications: - target: {fileID: 53549307, guid: ec49a7b8b70a24ab48d7ca0bf5a063a6, type: 3} @@ -830,6 +857,9 @@ PrefabInstance: value: 0 objectReference: {fileID: 0} m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: ec49a7b8b70a24ab48d7ca0bf5a063a6, type: 3} --- !u!1 &2060751695 GameObject: @@ -862,9 +892,17 @@ Camera: m_projectionMatrixMode: 1 m_GateFitMode: 2 m_FOVAxisMode: 0 + m_Iso: 200 + m_ShutterSpeed: 0.005 + m_Aperture: 16 + m_FocusDistance: 10 + m_FocalLength: 50 + m_BladeCount: 5 + m_Curvature: {x: 2, y: 11} + m_BarrelClipping: 0.25 + m_Anamorphism: 0 m_SensorSize: {x: 36, y: 24} m_LensShift: {x: 0, y: 0} - m_FocalLength: 50 m_NormalizedViewPortRect: serializedVersion: 2 x: 0 @@ -898,19 +936,20 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 2060751695} + serializedVersion: 2 m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 28.99, y: 14.09, z: -40.6} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 0} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1001 &2133304610 PrefabInstance: m_ObjectHideFlags: 0 serializedVersion: 2 m_Modification: + serializedVersion: 3 m_TransformParent: {fileID: 0} m_Modifications: - target: {fileID: 1321468028730240, guid: ec49a7b8b70a24ab48d7ca0bf5a063a6, type: 3} @@ -962,4 +1001,24 @@ PrefabInstance: value: 0 objectReference: {fileID: 0} m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: ec49a7b8b70a24ab48d7ca0bf5a063a6, type: 3} +--- !u!1660057539 &9223372036854775807 +SceneRoots: + m_ObjectHideFlags: 0 + m_Roots: + - {fileID: 2060751697} + - {fileID: 255414642} + - {fileID: 1916479629} + - {fileID: 1746325442} + - {fileID: 1583402088} + - {fileID: 2133304610} + - {fileID: 996691359} + - {fileID: 306910672} + - {fileID: 2055232544} + - {fileID: 1393635142} + - {fileID: 1119003996} + - {fileID: 1797623013} + - {fileID: 556696704} diff --git a/Project/Assets/ML-Agents/Examples/3DBall/TFModels/3DBall.onnx b/Project/Assets/ML-Agents/Examples/3DBall/TFModels/3DBall.onnx index 469ca0ad20619d1c5dc3be2a2d21b2add8785cc1..befdc6daf0cab90d6efdd1ae8054172e51f12b00 100644 GIT binary patch literal 77016 zcmce-2UJwawmwdd5+x`>$s#HUqJ%!Xnj}h6!~jMF1qB6^B&ef+y%!dLnFhb@ma71RZUNBczvg@yVCgf0tP z9uRK2COm9eKtx1Xc!cRh)6lT+5Wm$y>jm}UQK6whp(}ht0{lXioz4D;WA?w`nEesQ z>~A<`v!ncd!=fVBL`C{e)PR2rM^97$Ci6g8=07Bk%&@S~&=^}=r=V!x$>#r#lD{JS zCzKT6=!ptGWIp~|O8!wC~m?~iB^557Q5wO;GwO?$&Z|qzb5VT@tq|Eq#w7q|jUxc##pH=!3 zyxHI2|M1mxqS>^7kdVKPiuJz=p(pk$kconfxZmnEEByqs9LN22(&c5u`~xEYR+f{I zhz$1&jd1vV7`udJ{(Y&Ho&I^L&CO;9tq2JVTK+fPIsXQVp5%YQ$)t(=2Q-rTk7%T9 z_pfN=5w-enV`B9$BIt<nA{=gjXA|G#qPze)YC zaAwkfgfo9d`FA<<-!%GHIP+Io{<`A-70ygD`*%6>8^Z6Lsrr{V^Jfuc%>0)9=J|yP zEX!(B-(_K;kwKwRVNnsj%Yz~!!-M>zetm2j67?6-O!$X8{Kgs+v;P;SSxD4>qlfPQ z+4f)L!CK{U|8Ho4&5nrl3;lz^*ZaR4>q-5kn~92yc(mW@r~nfwMPXMlA;Djnu$as~ zVVQqIb(w!gK4qi-w|swEUfO@R-S3M?Am={__m3`>)nO}qBLo)H@9)WJzx)s8^zXhVGdt&|(?eD#HYRn%z*T3^tK|4KB!H3L-e`XSuHO##H1TI?0jNbw#_n=h) zf88uJl>WyvJ;ndt+GLoF`0~iuH37eSJWFK$4&dJ#jz6lYEcfRvN9@<)?^8ebpHWWc z&o~0uKMuNv*ssOkXUbL3^pDS!<<0&aGKl|H{_mc@-Jd;wyWc#2uClV(Ux@a%v6TL6 z-QS_%uXtiIjxzu4?K1xhptABGw!PoCw+Mkoe~r6V{WAlltoXaS=6{n{^1o{SA(b7K zRsO1;?;k*9|4{pXs_iZFKctZPUtyJXmIp)zgogx$3U>RTWq;hO|1uB~zYc`2`R^g9 zjf`TnAny1zR}dN%;x9-Em@CWwxkf|QWqE+WibTfxT3G2x{iPsdEu$O~5E2$1E7%>@ z2lz$@EEA+Clx6==_s5>rf9N?|M&r*D^e2Q-e}49>X#W*;N38T)6Yxh+o4-D0g;tePm!Zk5?cwoR%6~GJbdA%& z_-e9kYAIn%82W82;W~>>;Es#=Nou#+k>E43V52#Q7?b0)=Q9^lc3%X8;_2km$_-@y z^yOgOl}$z;vmx1s_mBz2KtwBYq26vdeehnDyM5g$_FnQ${H}YJo~#eYS zS^>JsE+%*VqsgVrDf}p{K)T^eA^E^9q+5%mxC_*866FdDTAY~)63&7}>4fK;MncAUEa)(f3c{xi6llPCRhDBBEp_u?9HmOjN~ z-UnuUvMAgeDkfKNxe%WmF6ExmAneH!eCDJzfqQUp&=uNj2dgQJd zx!5}bgZGxgaCpu5*x8e@o4>Pxf^~Cx<1P^5Rgjmq;^bv&D~TOQA%(Yo&<*otxekHp z@NBgrf50h%?p8iY61gjB=fYWBf1 z@r{>{pu0DnAQ!4t>87ro%!H;wrYG+t?H{4SueLMCH6zUk%M0V4ewRWo{Ago*4k>U) zd@025R_#>pb3Ga~$5A(Fq*r1IiO^G|$A2_2?$H(Wm(+1I^~VEfRqmo0!r~;|OPDK0 z7gPV6JLq=TDfE_9I|SrPgP{(WoDTIS(U&)XZmB2V^X@vj{@?=|qSC`s%|;@jZ^tbP zbtGwzXOOWL_OvG%ZEPkDXM;)fyK#Kl zGmI|!CeB9OnoOr2+yZj>Yl;4h7^>tIPv(W$@WaD{NY?atGUD3=qA1|d&C=_z#}Vm@ zGfLd}h-7+xngn-+LL~R|?4870&X~J#$q^E}$&8QP{h+410o%uCLg&jP^g&M{O?~7+ zwFL7!nX{E>e=(znI99YzID*YRDoyvFNF$3r521~B5N%AD&MPfBfNKxFCs%(FrVGZU z5RIZO^jY&T^72qWsPLMJql6@P_3$V3V5%j5_v|`qak`kUd*a14yEccmE$bsZ(;B+8 zy@ZZe*h5K?1v#-=fhdN1lcJ}hB#ymLU8j|hx*Hut@3KGfaJvJ`W*gzBiXP$O7hn?&vF=`hTQ8mBuh|nkmJ7c;j4CGnYpsjB^RE{StjOxQ2KZuOkauU5NG^HNJ|?Dk4c{Atip`YCbWkt0b8>y=h}a z8@)|MXwoq|meG?WiJ#SI%f8iAVp|&PX4%17?^PrhFCV9ojulLbMH+F9ROYVnDrXxe zp2jEJm(q9gN<{aKGo7MhL^rV-#A0(7Y}`>xR-fO=oY1N!yB^&kg^6M0$gVW{$uxxEMRfAA zDT%YA?m-JlaeFD6ZyClfZTFyZ(Pc#U#C?=`zlY=~XOUuF3H?-?Ny@SShJq{M;>&d~ z@Mat-+!aDqytTl2s~Uetx+y*BEW~9dpMdsoF$^dy51aJ~pvqVFQ!+_sYL??@mU9h`~SvNg>0sf*!ySt$R3QXy;5J(lDwN~L}+ zWe^e`MU6}J_}6}ZAz#zo=%P#gV1Ilh*Q#MX#8wRBPxZ7WqPIeczjp%D>#9a}f0rRC zeGACYJ!wjJoWRLFE#&J?b2#v&0wUJTrYF=)XvL~%s-G83U%a|c_VoM!`f0J zKDLRq9#cY6{IAgY-+t1GI?7xJVI-e>hF~B!i;%5^l%=K+&E!=2;Y1}F2umQ&7PI*# zbPL3YAbB6A#w}c+NTatD(#3`AxP9wo$)e^gS`_MvT{f9)m%w&+zu!!5xE!H}?+I~j z45Pq6whdij1ZgWcO2e0BlSXMJuKunyWNEq=Zo52z9tmzh7YPye$HyI@Ce=mruLSd# z-3sD84dsxUlv(7CV>W-uvlEbVM2wU+ej=it>#3K_8B*Cfm*xy9@;@3@5!s?Vm>j#9 zx;rl<*XO*aAF|Hj)!Ex!#Lh_I{6}H))gYw-(Y{TYzuzb0>*$dq8GH zHq(N~6=d|9EcWx-F^pktdou^yTqNu2hW9flKi zZu-D$GSg-Z-T%6f<`ueu&(~{o(Jx!*S8g|)eUe2)=W@Y#P9!t4Q;h6u5T^+>9`tFX z2Pqtk$E`UGKg$0zi614-Ppj;qie9DEL6Fto1Wc9^oqZ&RCOD}Ri8FPusA(=)njl2WL!|lU-$(L`d+bR=`(pA*G#i3% zw2^Z@SMll2UG!;p2GvMa@YD7v@)rblva2T9 zlJc?nWU;#qH%z4qC${lO^MPITUFQ?HeN2~I^{$g>Zn*`Y+TG}rd4zwE{YEPFr|}=V z?xPbgmgBD0v-HgV`HX)Zl4VkRn8(r;WSNEpUv1J(Cbydt)5flFU_^wx|bgBFyb5fUZOYKlWAyrCFG7?%&l&kNrMKI`FYEFF!7^4 zZ6+nuZ~q2J&*~r-2a@Oow=z6Xl}b1n*Wk5f8R=z z`3E;|qi@11N#VviGHNoPIUZO>ZG+3H-E#@<;i&l}YKIuNHgO);$8kAnIG{-#U0ZRg zktTn=R}!r@JWF*vPta1;a?&~P7_E->pbO;($WHtLHI>b%*1w*9ms`%N-@S@$)11hK zz1Cby5f$>>F^>dShLFi)AJg-bE@Ex44C&)7CEA8fG+cE$Z5P@~f`g9H^z;z^rk{uD zcuRf$^jBTPK!i_E>WEW1y_3y~I|>O$mlF2WRg|mgg=e-MAY&uM-5RCOmmfBV%J<)+ zdA<#xGI0syDJIe46{RFxqll`q2XXXFPwKKh2Dh`XIVNvJ_>bbmxVF0t$%OavSnHnz zqV9fJb!P@{iftq_68Wt1oayw`Q+;NU5sw@=G?Dx4;%SlslKgqydR*U6r6gqE1L{^L z#b2!B!sSMa(hr7NL@{?A+4!cI`n8_Kn@jDu)x&NvHQDZTY*8HX?Q^Fy@}|I`bS|+C ztb&k(`t;*DZ5sUY4sA|M=iJg*2d`%AB{th#nfqCye9=rFZrRWddP7Hut0cRORb$5y z{7`}8tj2PO-BBQ?Mv2pPad(KtQZ4Rh8FO-s9)Q8{403huH!3n$lF#Hu^1iP)0eurv zSuAcOM`dNX_G%eq_R36h^VnHXz4nQI*`m!2Oi3Wu*Co(yLka%9Vd%h*C)lOLi=%Sdwa zZ7~@wBZ`k6b&zpa>}cIK5gN8ZhM!oX1-bX^`O{tv=QfyXkz=7R=qAf;+-Xfd7`Rvi z#_1z5ABBP#CyxfFf1ql&6iKYaEdrV;&@_!DPgWfu>(Z^6ZQ%*@l>04|Tx!67J|>eW zLlSo}y^iF}e79>pm|2{2HTS)CmHd)XHbSNB|==Zze!)PIxEV+<5(yhpK^E9PrR4ut0SLL}1!Z=C2d0{DAY1WI9V@%WiS0?1v+db%^k&n$gn%S5Ow!g`Nb_P~;K6d5dHmL6He z9*V3)*%y|~J$@EPc=>8(1!pVcx%v&`KA{9hElkn9 z5$x^VeD>q0yG+ayRkSGz!sairsC1x`)ws)HBfdH_$5Sceo18&CmFyChCy zYZ^|_ImSF)D+|-6FTii1ktlW9k9GA}#Qrj&fVGudh2<%anM6A+X0(qFL0y zZ|0Fe-1W5+H3MasQ1$PanN`m_T3Nt8DcgX{4WfD90@9fq1sYWJ_BO1^TE_T(QHRW9 zBSFRFBwn$-W*a%*5+1l@@D5$`Wqzy`$5vAo0|%{Pw?U1qeP%lIY~3Bs9NkHb;S?@! z?(%(TKQ03+yCT@=yX%>~st0W0m<~kdb)sWt0XyS#KckRv3X4tG;^HVdw3}*$yT5cZ z{PvUVMWGJH_wGB^vOyK+AHQ$AKh%_YS-TyLr{Csr_ch{v(P*BY^CQ+g^ggHjVkx_8 zTso7nvWchl*%t@=KC+4%BbY}!axt|It=2X^d%el%g@eqA}gFP?ue@AQ}RSl75X zF?#zg^3)<48yeRlMVk`(xEks~i3T;<$rJ=8>M_oMsP=jgL_ z6wUFwg8uDSc&GI@VC7>my40qbonEMgy*UqYwTL=6INpV?HD@8H!VF_x#lW}jR6KfN zFM8)rV0*?WL#g9T#(3)VY_l3@Cr)Ko?q5wo*@8~&ABkD}ZE z;-V#m*tpw>j;~!r7rt7KZjvgbWRnyLiVK5t z{im^^Uztr%^?{Y+?P;;rCAiW%$gZ>2U?iuHAlmlYsC?lCu5YjxWDWK3Cw~O36%A%` zw$=gjX*XKD@4)nSVYJ{(yb_7fTMTGS2aVAMxV}e{SXP!}^_;PcZ0IOTx0vDEixs$WwJ1#9lLYQ~ zma*HwGP!Fwcvid{eQgv_Kl>csUzz|WPp{+FjvgkgO_lC+i%8Sx| zg}ZiaWrcP+AV-{`G2eEgSJ4jGtkjHagRH>rO%xm1{07aXx}mB&4(vnaNcQ;yth4WG zlG#=ZJGZ3aA(Fv9%NW6~yzr8l@uD5M`NeQu_96S^`%0!ecrzR^-`&&`H4{CTNmI#N z6feKMjU&qU!Ddu}Csn;nKb_3mBC-$b6uR*Bv>QyQz7m`sSi)-cHsY7lsrczxK6~rB z7OE^W&fH!H(%I`k|6l=fcRXg=tc$QnISd#@bvEyA4(xc$ zXD>cifb!#!P?59{%ntK$u9rH*jnJo@kBzYTZaBvF_Hf>n$WotW5zOm^qwq-YCOj10 zkGb!&VCF+pI2YPtTj`$w*Ub`&X<8X#@lFRvb*N#tn9wqsj~!GJ=_m$J950#NAE2)k8A) zOSTiaD)o?c(6z_tzUvr^>5#T|GM;9|*%ViIbUJ?k@=v6(5ARn&)}|s@q)~wVr^|s3 zKgR^`UWm6g>d|9Xxo}L{f%9U#8`&JIMyporXOh%K=yOX2lK=83?0j>ZdGquk6ISL0 zNq(;x$@yQ{)Er%ACN~5YCx_E_Nq+2FF=-~6vmKrV&Ez~hx*6qL=b)*DJEGBIjELU{ zApu;PbiEfYEJ(vOmo&&zcNH{NHzTCvC+mDmgbqtP1;sw`OxgK8IIFE4t-ChT(an?L z*&AU9yYUIlez^!U3>VW~*0br|_-?#=w+-EMj^m`NNXV*v#1TFB49>=;!<2h%_$E*f zmIQrgjlGY-o%0qrW6yf{9Ks<%ML8Hex)!fHCSYmCC>maN0&W|RK(1jr!|`+lWh+yh z&g}vnQpo7GG_XxmU06-YkyLi|SaMov0F@UMF^Z0|H0Zn{EPJFuGY^$Oda=O%#%t2O z6$ij*tJwGhW?O~;Yqnk0Qj z3C1>!V$>B5!!P5NaJs z`t}AFb1v>d|73S;o#;fDIF81vyJoU&;afSvWi6mF<`g@8c^PWBt;3j5L%PDV1X3{? zTaRk8a)M-EOqwbF$nrrap)^LzivyGTCy~$Y0zW8PlGv}%=A6BIgJUARiJf}pH0S4L ze{5aT$d+3>pmd)T{P-}AY||=4J;ja8*V#JoAh8|ITJN*BokeMJ*jt$Qd=!z~eF{Gd zokWNHh3uu$v+(iiEL?S0n92sY(8B)V#Om@P^zT&QJQ3K}wy~S=dY}@Xzn{#e$4;V$ z7LFjL4lA*#Fc^Os>5dKUiCA?cABBQ%vo8nCU}?m5lt`YA+XI`xIX#W@!c&sY8TJUq zg^i}}iOYEo+^e|Dg^#=D2-B(O{6UqM#2MN89uo7iFsES)o{`;&F0t`VrLQ|-+2jR` zq4PyvlaCIqa9)OM@3!%}FV{1vDFkcaw5rz z-1M=<7cXRqOMn6MT;v!ouD^vRRNB#LP8D9@^Vo~G@36DOR)It602@0u8#}I?WtQ}s z^0GPSF;_Sd#U|>Jme0T7%U{+qXGU$If!ur;U)_Z_dq&{r=85#t>9cIou1&aGq#pfF zyVE$U0Y-Ga3b7Lk#lYhgcq5bn1*1#2E#oy>_HoeJS(5Wes~1&zt?0ajG`wBB5aeD9 zQ3szNc+m6`R!_EJzHhb0D<{67^1WDG>^*{--hafKvf?W9XNPyHc{&N4$})3gWJPs)^%kT8b`ID#^}qotepXBZk~ri+v>0@u#tT=c>%HV zRv;s7Olg2b8oN>YIjCQdp*H3Nto9BI_;JXC9tjTzm3(AR@9kg${k!n|#vVp#m@8Qk z6v=itq9)*2hK@nclzjwTt>xzq#_XgZIcoy?w|0Su2# z2HCzMSdkEi4x&ah@RBH1%DM?;xD?j+X<};IINF>a1M^hU@zodtLSK@=WL7GaTK)og z%qe&n=T7HIZetz}DUt(clhJtc3_5?l35d&7L(-!0aKUdip2nAG6Lw2Dy7~jpu zZA%;B-RP4zT&NS)xNG5(^;_Yak~~$SqiD@%Ni=De?6Ypnzco|G1dljFcqbO4a*gm2Gp z|VoeZQoF-PLY_Vr90} z_=h}oz9vn^W!=Ee0tsp>ufYyHQ2{+nWo}Ey0a0TbsPNvbqZ zun*5|nZmB$zlnN29gkl(O@ogQ#=(e5_n4RknN1HWcG)(x?}RrUsf>p@4>Ozh;#mVD zD2&+*X?8kn-itOc>U@qSyJg8J`%hj!~x0iEZPF)v7KHLdXoR6?>-f}2atcHeI4!Q*7!cv`U@ZBI7#%K>?-1e*i zkxc_QI82^yEB9gynNXT9UBG%wOvYB;4W4OMT z(ev;zth+x0MOQX7zO86ti*Lr`>eBPrwarpsYqhBTR7+?tLT2uw0!*cnbj#j6=$3ej z6`m`=+42HLYoFweRSD!2Tbq&;6AdzM7K<&p>b%N>KiC%mV@Z4Q3#eM`#9rBU1dRf& zpzf{=2-599sY9ut=`TcHzTE+nyv&GGejc61(mi8f(J2G^dDuJ5QY^xCs(n}~_ZDY8`pmxc+Jzb!CeXSl zkNxVaPa~HUf!H@w@^pz6dGXSPE%(Bw-Vi+aizz^p1p7Ly z2TRu9fDiYkP;ZX`{IJZG-Tb2n++OOjL(L`ZnEeKLJiHrvUQm_=7bhmrD=~YdF3E--JU9&?uNTtbm_py z`Mf1h8N9G1A37iMF<{UJc^6VhX;l*3skG({*G%KdMaaVQ2p$t4najhq>oFncIh0-x z=UBw1!JgZKcymK1Q>j=C18*>YDz9 zJ-;!Pnfg|U2!H>?&Rp{l-1=*n6TBIm!xAZU!A%MH`uG()!QnKRL{zeGgj=vNw439a zCriz~HRDVf6Er+o#_k>Z$##wEM0&THleEB)88-So`z2is*j_Q55ZB6Cli!d1C8{)X z<^V9~EE%E2d$HrO2oyTWV}GtFc#gFtp84e{KUB*O{8&O{gb4oV>B5UQ6lq&)2D2eQ z3A<$^sn97W9K2=9_&aIf@q=odk!9yO^F>eM1d{>ghT$ljGw&rt_#MYHqwVPFVRt|~ z(+&>2KLm0mT6DovLQjQU$HoD9W`xFM9CmF1Gw5eUD^`BwoK1WT`>v0tRI3?h$#0;| zHp9uSDZ2FJ;1#TY(1$P8+ECSJD)4^#fL%x&RwriTwuoZ1O@703YRJUCZ~~p}(zvqm zB3oW)jitL)==#gE(LcVN`2zZAv0yJF*Ion<-fGiD*X>B6)N9O)ZbbjO(YVpV2%kHS zp!3X&;qu5-R1E*b*4ZCsW-ASY#g*fkO7SJ2Wi1U2Bp$ZJ27}+Yc;<+ZF>bwa5mOB; zX^$R>6Te%~)R@G_pcw|hIYY3u^b3i^njZOmxnPGL9@*n*t78_CPDJ}~7?D09vw6-LTF z#^OL3y2)Y+rrEq_hf24hVn70J+MvsZyB&rHV~3;cB2U(@>K=C3-e;Q=tH5{oG{z@E zm9iqI;hty(Y8h$JBF~M;zo$oDKahhL>BgLj!a(qzs|$s~64a_b2O>MBK|hY6CN8-= z+jnzlfteVphpOV{;|VY<-IsP860G0J+hDHqHaIiGoH8ja!8aTucYqfeDo1m_odelr#_)5?Tl`>K#yOn40mnS&!<^ge zsfzx3bXoiqHBThLjkIB8$i5uLxy=CUjuXrvs6uw09A{Tk9AwYv#6WX;3(lXj$ zkqVn$lye%B)M@YbWcc*?4t(+73yH*%eOMI?qr9tuynF}A_HnfC++rNccYxLzdF-o8 zFR-~+m!6n2n^kL@Kuv~X@z;Fe*KwJQ!|*`b(%OP=qNdV|hR1P7-5c28Do&pji{SQ; z(m*~~(uuDW;roqoc%{4@O3E+uE~u`<=8eNy?IC4);nq5AS*=Sasi(2idtWl-_z1>u z8jn>?KZ~O#ThSkDM?-(53l;PDhIu-#Kxt?Xgv(rq>eZrXW9>mQrfZR;BA`xXv*?$l zQ>e0>Jmp^2z?!x`bc=ll24c%FWs)v!%{L$+!O~P@MhPT;Gr&T{7S_R3n;u>j4?%i; zO!rUmA$3diB>^QmOD!F(!v_7bX0$b{x4uX%l@lWEeO>G*8f0cQR> z4_x@T2YYgR@%TPNx_|lvy!Yxo!%e%2#FYArLc&RBUHz*1l8&aS_vm0VEr@*!hQ?hh? zID6AbcpBcRgcC5qu6x`n(M^0aBL(?C6obP~zvq3qqKilF6_oKO2Re*7AG?<*9=p z2X60^f%@CuAvbI}?z#RRGry|Ry@sYVP{;_qJ+I+6WpNaaQ^SY(+hHKG6TgRU1vXfT zS{@B)dQv(S$9Yu2qiN1)BlHT}?9Q;wZRr$kU-RC&j3Y8jbO>8qgHl^&1Br~sFM9W} zOJgNeK@Nw$@?LC+ymI#y1ZrhT=bzufu8nt##-r`vCV zm9N907$53yeu(`LB}{Cy4zQMu#?(QkhDTMa=+U)>jDMdt&&Sx3GG&v%lPy3~>rVES zxhtB!*oCFTHE?;pHSKoq!=hjY!v-jLi`--0mlA?0wgx7(8en_(0s^amMV-RIHiH2@Dh*K3*afjhjELc4pB!xLJ z`_4vqfhMqR+&;lU=QlQJWG~v?lBQ8>x3EDPagg`?J92L*QJHcEt3>DGz9nPmj{$i$ z{p(#+4tj|bN2!zAmCexn*bkyIM>7k`qnU!E_wi|&0hwRD8rSWtWg~ua08o@R_58s3 z7Db@Estg`Q*1|W#aH=re9SiO+#V_lJlh;+6R9g@STpN*yeU%27_QTb1_+&pB zYO^+@)fpF{ucxt_>)SE=>rL#wJdD}fG62(7$3mN~Kk}E zjutQlL5*9O zM3q4OtDjitvk}D&=fYL-66RI$US{2<_poT>8F1#-z={JlkkVUE1Oi3$@a^p~s24F|crw1s1ig_orr{kP zvb%+KtE^zbR&nrreUEkcq(gmjo0+s5S%Up&G@Y|`6GU--fK5gd4BM8=-WZ%nGu#tk zXv{XodgvlPJvtmC%9EMoM~39Xn>?_$ImI^BePOppy~74?6S%(e5cH;M5N*Y7=;*hk zhYHqH=Sq1_xkn`<;dO^m88pRdpXcEHciB|>bqh8(nc`W#INsgk1s*S*u(R+MEK)7T zW!Bw{ILT&AC9LQ@4}Gk%GlwMI2xcs^lX=Gi8PV;@*ht>SIQAgCYktnFeCL6~bd8v= zU3<{(gaq+^_=vTBmPp8VH%7A50OpATG=4pRhr)~4XEqaPc11J$BazS$%{@%}n9oeW zp>N13*aiVNS3!}QD)T;9AHUXTb2dcP!w&xx*lom+qReb&v%*<4sB&T>-Rr^D%Aa|p zbPC?fQ+yY66lYF547YDj!4s<+FyQ@5khp&jw?r1g5sgFev}7TS`8)$sU!O**U(xd8(`ajfID5!BtymFllJD!9OW6O^SUqy3R9oU9}@+E(v{ zdj;pZqs@jha!PmDHizYCyj&Dh*6Whc*CnvK#{i z4sYGDAx)v_Fr%=GRdhtmQQIlVDNVzqm{Yuwo*&>x%V8S#MT&kux0HA7;TJTo)1asB zZbCLkn55i#h;JPB;r9k{=37srt!UFoc6yv8{U~x5diq*<$s0$qU-g#Lt+~FC5ceH? z;-&G+!K)luXG1)Dc@e1%)}eLHRh-f7Z765Cm6;K@lQ|xt!~`falp34TY0f>o_4-%v zhyFQi_>{)-(_i5ro6D1|ddY(Y(qy3T2TJHm;_Dfc@viD5TH{v&(Hj)$Jcl{-V4Wo0 zV4TT*SgJ-|3@pTnr_S&aGDa~HiegwC?T0$+EXd$pTgp19F;|WiGT)glo?J}>Ui#6? ziVYfKL;WL^ZN6)>CQXi>4B5|KSRVxC?=slNYMjxhuFvRMR--blfC85B}ZbDG2+%Wj@GDZ z7_v7L#Jn3Jx6+cn3TsD4n`)FhP>Mch#IROEhz{3IqD8(+(5u^oL(fatJ62XiXPFjS zp34KtX*Nvia}5}LduinveAzyXRYmFppF z%MaMJD-X{%-@{{V+3dM_B^>a}NApE%@T=hk@Qz&1jK7u*p9^^G?jzdtfw&euz8#o4 zhp%kx=|av&ll7>_MxeHECkFAu2M{L9u z8#f8g(Qm6!Oznm>CGFaUSSJx`ktd$r8$$P;7sqoY(eW^X5rHLFCe0KI6&qTMtsPCENMQ2 z{3kJx?IXCUZ!6A7_zq#lAVZqwJ^?rVK4xmZ6e+y>2IBi&*&k4X<`#W0CMFBTpLeh~ zRz$+A59&b0Q&^j4TJUM|aJEEiF0^Xt@)1KST}wyvKD=)=zI}#V#YB{`R>M}rA|28%LE@zLwF#o z$kXyagF8KS@#JV*79%>Lovs(;kgHk6_!36;GQsj4yV!Rb^HISv1e3PhVMp=pP`mCn zw%Q(M4b#==Obc;U^W(-krGk=V2y#P9du$aS7kPQo#>zX42L6 z0aWsy4!P%33bk#6c&t8E;3G@Z9k+8K!%hxrUg*N?1CC@>ssZL0D?`q#9`yB*Bp#;% zPLj-GXt-*<1@oZ&xIEkI@#QH z6WG(U4+7T9vC~bm*{z4}LI0QI)Oh7Re1WBO&69%+DGrA`nJ+l&{6t*$x((^xt0-wy zgZi_#VE=RjvcM&cF-B`@BOwdD?MV=AXU3Zmx`R#&w5Lzx#qoB*Cr(kVAg(V9gLx(o za9Z0Qn04(A6egE}xO_9mt)__`|K>DnWl}A;V<)(;V7~#KJjJQ{YIkUObJa#;mLOkP zD@~>Z#le^%c{<{VKK?XM0agB4M(O=JyxIAQ^P!%D-;Ksl#YAri(NV!AclP6$)C=s! zS6}dQg$8eCn^;rCX(h-PAPzSaj{HW)+bQ*jvCy`9;y_zAN;dO9QCHx*0*2feW82c{KJhH?;=G-J37Jkk|wS1H(}~TWvE?N z4|_l5Co^G!B9w7YUx8|7bsx=8L=h8{g;oSfi`DS*- z+$#3*?K2FOdI;O^4P&l#AagL}7i2%{5ra)qxUSFz1`;!A?0i|cvdxura!O(5DQmnG zq)EG-W7vr+!f?lnE|~VA2P$?gM%}Kby!^BlxNH)SA7vKPIY(2_B}s-5^V4`^`Ayur z)fwYUUc&fF1`od2fsXMRFjXNGFFNSbS&}lCRND)2bG?!q|Inf4?6uX}tg?19AF75T6f?&4kQXhSZ?2 z0GlP(!p=}zx~ZTXRyt3>L-$qiTgqNGImDT{eOYkV>**F;&vnAm%STas=4Hr}3Wdk| zk?gy=4vvk>8Fnq}K=T(pW~Fa@hA#ofP-2lPT3s5=O!+y9OcA}0*I#UBjrFC7SNbDR z>sgP@a~82{TMS8EMKBu%HK>?u$E*IThCf>;QGN~N5Upk_U=uy<3a1BjjI&hxge%u1ycj$<+ zW&IO%7%lJJ%&mw%82>1qF}&~!#@*Qh=aRFj#Vlh^Z<#zftX#&~^2>0zVcmjv6sHsU z4`bO?DGKz7Ts_Vz{fHtL6qsR3FTmTUmE$$%Hb$w4@Xi@F!@Lp+lD*W7`eazMqjKY! zk9TYE`CN6{C*&!}m)}OM^asqy`m;>x>qhp;U1tWf<>aFjUrt*Ol1bIL*VNs`dAgf z*Xkks*Io)6whIy@Q( zj3X}`F39NO6Xna88Y)BwMyFzh-fOf!Gm#D|g|Lt1Mv=>M6zpRh=>lJWuf&(* z=C3uNWw1} zIV{PXlzs=;u?~0b)yKnIbg_@&vR{vmhHdJuoLhYo;9PnX+`Pr0z)*|oblcNNZCm>P zQFPwnTz+pHw`FD%LQ=AlhV?o36QMmk7ExBfW7;-=t8j3rlmLcpzfm`}D=*V6b;B@p_+9^yP!*=OWDz(*hah?V+x>P6il zZR9RYG>Jw_p8=v#X9uGW<>RXJh8$fY!ba|khsV#wm}>NTJg9RLey#dQR`X}G4u5vq z{)wXZLIiZ&^$+;It^#b8Ph+ruD=gmk8D$H$GNbA}ptjAB+i`~B^2SQ6z0*uwyYq$Z z8vUTWUXlAZD+_+Up9+~f_rr~|9HhU_!$g(Q=%{%Gmk*BTg1tYXl!q<6d2a=8tWLpO zh{L#CDiH7BXFdOkus};!*!#x>1UKsi^)vWdr>cjHcd&;Wdp=^J_8&4gI}&|XXJGed zMQ-AZ2)Lj4ly>|whIQ{t(TLxlPdnxZDSwqoIw2V~)@MRGdRxN5M>e}j)7h_DEcR!Ffy2vc z!8X@EIy?Fx{!S@_GfQIFQD-U8dAOYGwfq6!Rc$aWuoq90q{@Puc_7``0Dh*UP_uId z2>vvIr}BJzmzzr5!tv?E>OwUv*EizoLo@Jo#9d)QQVckq_)e7bt`X`h&HeZ+4>b~w zoK!;>`BH4d9pU@*g73+2V2c+noHm~tm42k(3@pLU>I&^$aFR5R6l1x`M_{Pbk>^&I z;o%EfaC5FT&(8Uyi{K5)s@uYi&mVBeQI+}as)L939%K29rzmpmGHAB6Kt|g(y#7On z9hs?1uYZ>2Bu<>iH=`4<|Hl&cO3|GaT@r(PlZNTWd4brN3*ghipH1Q~sIgol?KnP& z8O3_sqU^gA6N0h*x{+PUCW5s~O~JX`hMBSh5UORuJZ|2GDgR~Q*h&SiTQLPqt9QZj zJ|FIxcQlQO$-;o0J$y*^IjWqV2_s!cfXC|jocXaZ_NBRxEIlB>OhpdE?=c*@xnx0@ z_em@;NFvnv2|U&}W4fvGaLL*QH5>0j$o)##r1BOWH<-X8uVlJB!URqRF0TmPau$mO zwstdyu42&%Tau}y1W#x&r)Cky-jqdWHVg9=TBQx zU*qLJchGpC30ov(xQT76VDX7&-1Xl^>=l^-v)`wKhogaD$r%T_E#eJyPM3sdbELU{ z1?F&bR2jatJV$pQN=C&E8t~M20oWFLW5Wf0&r|QkdHDZ>MURA}cwQ9gSgD6Q-Q-w| zO1)i4a{*CW`XBt*;ek8LV31r?gX1%&5xYa~~1UNCCPpvf6c|o?$euth- z@8GWS2)2bTr4Qv|pdfSy%r%gv*Z+m#LVjPI(Ivwr+ns@(wF`k6j39Cq=G@7;M09#< zN(^J$;HShl{JP*5?R3;&m-B0R9@8BsCSSuA9XW2Z*fOU1PLliZXCZ1#GXe3(hw;mo zQA{zv4tFlS0JzB+ZF^l-ia4rPLnNJ9;66+j*etqA7_)$ArqXV zISPexTQRc(VbKC!j1iYjuOH5U(M|6Jfp0Rf`Jppcbi5t8QYO$kSd6hQ&(S2N9QU18 z02lFY``!tk$mZO18l1GAORY3!_G261&?-^(uKgTYQ&|l|qyCXnLjjn%M8e7VD*ALs z1?jh&L8KrU&-@bM`rHMuIb|Wd`_fG=%g^KY8n4mT_!Q5I&*%RA(PoA9ifr2&o>>({ zRQeWc!b|ftn5z08?3F8k4wG5vdG$DGZFZ;8esS>8bR1p3a2$?R<FKZOJ1=1r{4N zffLb46^cnu;KX)p$4U5@s0{5Vt}X32s=@>8WFO)_lTxCuSuULNd=EBTkAiFNIWS*s zm|n?|M?Cldo_k%#fYLLd`0KIP5?(mjO+q+F@x8f{`oxO?~?>mfJ)_c*S%S!Ba z>nOn-HAhxwSBjB?5%}Hw1_YLd;mcARn5R%qwu+Y1r~l2w{Q4BQuhNFA_`PKDZY@l% zmVw(Rtg*66j~&uZhnZR;?7_*Cpl$yV*BvbcZh1ePOO)gWE0RgN)^yO>5GkC$Bpk=8 zUcu|%4Dsi|37q4TR{GdLj1{+ku*;Qf$2(`1W8H{&>=7>k2McQ$*q9H8b)L{%En`M2 zH^YVyG17P52DC2irdh4UG`pc4BL1X+?d%nJpAYZbN=UP<_e|lW%_q3ZrgEi;HpJoP zS-i4GibXZF;zSQAHtVOLGBf!;XiOF2z^fZDxrsr02>%Z8%7b0I2gvEs3?9WfqszKQ zSW@hUf=dfgtlFLIZZAeB?@36?8mU#k4qjUF1sZH^Fw?3ECqD_pk|$cIw`LM)*>Huj zZa-K*GY{O~O`yYT)$pw+!Yrm~D{az4{|(#&pY1!iNoT^K^P)b&PvEv+JqOR;HY4@a z<{bH8VmIOQ72W5d%iA8N#Aw2rd&W3^QUYj)t>mutoCgt`2E1?Af-8GQGKu$>&~S?r zlX|}wd^YZb(QzN>-!D~o=-(wUy^s7Htcz*8BA0*0*C)zV3u(! z{rB7)gP*LU*^(w;`cMNBlTXt}?k4zXb{`D6AEOC|MKDXf4hQ0r@WT^s{6dHE=cM z9*xYwb$1lFu=ay^U`IRMHt`K#1I{9%P8(qA-8a~=ONssZDFqwHU87$!u3??xad_~c zm+o9+g%cHP(dkneVZ=vz5B zzxO3wyDI?-l%{Z|GnBDYr`2|&j~^Knp8~Ul4xIlp8Pt)o!E2_0px8MR?0h!zGqY$e zX>Ku08+O3O8!nM&VfWxgWCk95IDtCaWDyfhW0tq;DiI$2i#F${k+HMfxFL5__E_aJ zBrBGZ2gRb?)i4qK@#+wMU9lbgpB^Btz0JZYo$_#{MTs4Aegg}x=b_kVGhzG;QMN%w z6&`%PgfCynGm+W^oL_xRxMJ2`_OY;qe$1YM*H=gojlgkC=-myy#~Vmo?jvIKsgqnA z9|>dh%y4aS5Y&H)#SQa$j!eM;TljA}(A(4TOPc{>iQzc#bqVZUm5jH4z9LVf?~_KccKeV$ zk@h_oo`B)X&w|y3;v9IM!|F9>;fsq89Q$U6DO=;IVAm1aUhRU5J44t5GD!d2Uck(+ zji**${?f9=pXrSoMc5Yb9s}l_#7BdH@NRROK7gD4`ACXNxw9qGN~{lJ*XGxR!yhM=gH;C&Kx9zrg|N zY~lPGSC|@hl-r{4RJg@&6U@_!#=)Osu_|;V4t@BB`}bP2D6c*+x4D8Bql&Si>Mv&Q z(`GVbw}DLc4ImcQXl5zLcJN;Tn;DsWa~E}(st6mesIU^TbMQgZOE9Un4C23bRyOK& zKy#=z?EY~Lo8>oyV)$12(^!;~{c{bkD88nz-cNuxsjFer-AY>Z#E6-hsS<&K0So=M z635S*fKPX+ad+hnsNvl~_`ECv>?YmCobP+6?a4Gy4l&>?+f7*S_-BHz#iq0%?h@+G zY=A{e?1le4CAb+@ie$;b6l_)s#_KUHXc{KKpZCi#slSizUpNO0`n+MJ$73SY`+@4N zfv|gA163U12al~1X~C)W=x=_5*w?5*WASRVrWWj##CIxHm?mgxpU$(9c3i~6FIZ{Z zjw8~|>2vdZqOk7(JJ6j6Z#DnXeV2>Lh=fF{DkF#K-{heGQ8jW0j}y-eS~T<7FF2fZ z4*q>DB3ti`r029_Ve?E1+dgTa^xk2+K>eL~FSmw&*0$V|7bZ}fZNe14EoLVgAKK06 z-3DH|4m9|;B%57UAuzo;0w!%Oq-(!qBiF6Kse~z^vu`~eHt7NCX-urT?Vv!Fqi4Mp z*sj+9sIPJq39$S_v=lw5cKk?aG=4@ydEwKgV!oCiUdn}^8$n;rTF)8h$5EeQM^KIv z6d5L#Ski1!}#wU?Tr=K;mr$eL8IpRb607 zswTwI*TaY+l|?k*Odc$5PKUOxSfXPek8=*If_H)>4Dma^jpH2AUs;VSeLjJ#DKXvV84oE4Y>Tl0#9b6H@7W0<{58**Iu zHJdIMT&)oc>6)p;<%JmaBNf6u;m5)9x)t|g=LIm#YA4?gFCn^0UBu$JHPs=Kcqudv zq$Q5y^Pk3Qaa?tjs>NOSp2CBAGY69ju@FLs8EftoZl|A9oSt_NMT)$z8amF#${`U!@*V5%iDoY3%U$ zO+DX?Wm(I`plazU^q(09_e;g0yfGT(eXO|F>lL_lq$=K9S&TbY9mH^(lPDdZjiYQF z$l;r#x%r}FP{JS(#Pr4RY@q~R$~g;1blht$W8n9MR*-Gn1}+X~G557J z>LowJ?P0f3;YS7zFR1}V#~JMS`b4_v^(55WIgY!x!*qFmcH>|v zwS7GgqJAF0g`6boj;}w`_;e(I3MD!4i!G*hIS$J~~G+gKw22`XY=K`EqWewdt zPl*L|3bAg^D%^7_4QfVTMwg&>R7Yk8PI73ZqwibNkcI)Q4>5oTeQo5(n?oQzQ;s`- zBw1MAw2(bTilcKR*e^|UZa7sL8sFZ;;mEyY^pD3lElPr|+Zctq6C>Gq7kifP+fFvv ziLfPWG`Upo05sN0Coxs!xK%n5t-ctt)oX8~ZsaLw&JiUiMjm3aO`F(mdnZ&L-B)pB ze*uWSo5cB^XuvDO4~XK}2x#7+$0ZLnL6G`FxZ7p~<6|f`d-TBmGY@E>std~cox_t8 zM=>YePI_Cgj+o9Y!aL#(^pMF7IOPADELuDklAaAvGd@rdS0+l*QfJ`arp4^Zmy7t< ztP@>aRhfzJA4N3=Mzf+L3&^n< zIra}k{t^*!2j;uJ8m`KCfJTlgd@hOyC%bH{i28w7UZq3+IDXEMP>mh7Vw{3%GWMu1 zha}01FgipFE?+zhpYsOE^zWjq`5B+(nzt734v#0}i!YKDp%nsG#Wot(T}ONRN8_Zd zO5vL1PMCe>g5dOa4|cUpnU(g9Cx5!ea<426Fh6Ms=lmw5;c_@jI~I=e+lL5QFpXWy z@q+^ca)Rxm2s6T>@xJR@y36S>E>IJrizYrsvs4AP%;K8xrfdMr(yJvqxU)2l-15;NR zaMQvp(KzuEOqn^G_1+Rihds|}*r&5_m~&v?5_o3*dJH``LZ0o24u=H>qM&l5oSaRJ zq@|J4&{iY?3;NWZjAAW3IB1H#QS0pk``gII;XmNsV*&YZ zzfjeJ$2c4>!CiE^jPibUs1mXrpS|Ls&Bc)O4(P-hH!qM8&!js({3Vf&;w)FJ7*uw> zf>qU8L|(0y!m2NL=-@XtD!v{)aLRI0)CwJ250 zY6S6<(P*?~0hi-nO%C^(3X9iX21m1#M9S?sed;I4{bkqaj#IVZa!drxz2%tabZPE@ zhO_-2TUBl@Y{ck`{jk_ggvT~XMv{ek@vh@q7!rNAuH@Ti1 z*|!XhpD1CxTn;!&^W=Im8c}pLmHPb z^yhW_3sztr^oFFG-lYYjyioJhK0M#$1DlG(Fk`tdKJ9L!0)so$>p=`G|2K|X5iE(} zyixLHFB0FL2u_St2{!kX!TFRIB#mhEfym`{V%Fl&L_{z5h^|N12avKA_I+nyu_1dl2M&a0Y*bW@WweC_V)0hc|NGq0=-i0OFW0~Anac;^PNBFU*kxb@g zu5bTS2D^1*;6un$df)vvy|!QrJ07IKCH2-sKrpf zXd%R{NC0)4JQ#F(4cEpP;W@95LZ3};LUVh9J_2VJ>N}28OL$FMW$vJ5t`M8n@*MKc zQ?zF`&lo)GhC!YMGMy2QYkdmwm1`gs%ugYEx(6Qex36_B6kSxD<&BWtI5= zvYwg*dng@`pEmu%*zztY*5h-MV;wQ^@FVio;xn{;$iR#dzschFnJAN~2!|Gx3v=## zBt35Z0@~I_MoO3oO2hMU)SZLG?!j-GzbFLNwhz+@!A9(QyaL=wJd19wf9)MSWUzMr z8gSR<=Q|+**!Jcrxa@uoy30<2ej<=~vs65#a9hygwt?&Nt$~_}pI}|>ZnXV*1kaDJ z$4TRwX-~v*DBqEZH+ybl>|!$%o1@0%u30Gb+m`|$+D+dt=ttRrJ%T$gZVUV4Z({g! zJ3Pc(@ypZCD0SF`8#~h+vKHP(waTf)z&`*2i$l3xAAZB5iwS~v$3n=`1#f6}Nfopl zSWb7Xa6)(6OF|vfeRfYvHc=Px!7EB`Zh49{?UTBfSvoYRR;B%6<;L^CKw99QXEo{<6=V5E8buhzi8vo$C;w8M& zIT3#^Hsz+QNrKh^b!KqqB}|uiO4j zBDI&oT#=njUv)mW^wKI136^IxMNTn+=ct~-op#g+holaX>2>y zPopr4lWkJr)F;LBHDU~opKAhit~j?$>NHTzT@;X;z-Iakw*#4hU}jcF2L!*UhqbAA+I zR-bU8;b-1+a}M@Sm*vDV08G`x>En-maOCJ2xMD92gDX_nm3{emY@8?_Rce4uI#J+Z z5JzKpw@72-j0qfZI>zV9irf8Nlsp%1EE$AGl@ zb<)`71eb!f?V95@VQ5nVxfxK3N86oP%j;O2$@_eky$Hm$O$yL8KAsGB?Z&KSGTfWv zGT3fVNEPNMgXFa@;5H{3c2@>beM*wVqMGmJcxN zv;&6BvfTCwrIEkYL;Acg$sZ5lQT`~OvIF* z_w8zhz-7r~nus#9SfmZ3^8P~j3Mss?OA9rR$AhE%W$6Eagas`k0WrF4N611}K6wXe zGfia9@~z`Fptcqa?Y!~oT2VN^UKE>-+o6-$F$`Ng1LyOQV(zzm3|pUQUw2mq zW*Kqho7H;~zSN6&)mq@Doo;w^K_~`iT}8QDZCH_a4eyVZ#_iSqDBE^j==`mn{4pzn z;o*C1=fFiM!5$dh_l$ZvhY4(I9}&sU30!l#KU;XW2ttC!z@g=8RJK(IqO|US#qc3+ z&ip*oSvZaOH}(_1=FPM@pM~|7xgHE3|S*7@cL=^0W6>4dq zKQM-MXy3v#5lOIGor~4{Gf3mJ_0_-bqV1ncIAo;GAbc|vOC5s4TFFqEGn>AsS_60A zoWq}KBe`AOe_^@76s{pF1CJ`i3k}MOSyhZXv=rWlZDC=crg9sS|JBgZj#cOtJRffL z?;`K^g@W&ND^hPe2G$7~&SGx3Wor`gF_h;(uyb)JOJxAkj zYp~~uxv)6-4=Jv2Bi{A@NQ#XiN{&#W4INJ8+)PPKFTG56+!}$xgd4atX9l-lLz&au z(8G)4bK%B9J*>N6$ILfnfSc_h;ifIk;F4|wJ$ox))Z$aZeI93oJsI&}Z9jrNfB2cW zXCA?l2`}iBkJ3E1sll25JPx`uMYt96)o|HpJETbE3bp!MX!Rmrs7kHGV-5?@s$m+4 zZ7>GEvk%Camm|R;Bpbfh@Sj&z6XG&|G7&ka1Gh5xjLGb;5V~hC1kc(GI*NHH@iR;y zb8R<0pHTzZVruNk0aY$A!REBuE_y)Ix5xIv+q>XM;cB{W>|J53fd=R9{F}Uea*As_H67E$qv5lEDlC|7 z%Y8b+@2}D~Qjx$Hf}5F3Kqo(w^bfdz{;}Oyuey>+v|Pb4il!K1`c?ShOB_DlAj=I+ z??p+EX_(iSOn9j+oM_g@eA^?~U|WYbekfz7xQN*kb3yY-JviSO%a;88 zO-}SQU{>@wGUuu{4E-00?*9zAY?C6iI5rk+-NK2+%r3a|ECKW#7L$#;ev)#&ul8Fo z4fYC0aZpMYGO#MNu;fg*Pu z`vH*@3~e;z??iu$vB73=Nb3eHD{CgU`$9=2bMSm|B>Cs_0OY=x z@;jw@Fys_Ziw+F%cg*k^8I?Pv{gXaMl;6N){|ofal&LUs%~SY0`V5qh^TNf4Clb`+ z^KsE9E6tTt$&{aW!1bXE=s7a<@H&A{zJ|cGIjQ*DCyU;b@nDV}ws_D`k*qkcj++1R zncy{vun~8V77yq?RN7^u3xqIu(na ziHE7HwI|jc+Xg{5|DyrFZa}fZ6eeBcfn(|`a8c4okQ$}NE?(YB(;nOxF28;RYMqQ= zQHCev?segA-<4-6+q+=iu!dlvaXMu98Q`Mw1=KOS3v`ry*dj22Uu}nAnxz)Ayk83s zsxwhOH$#RT?D)Kp2yT*1Jq`%5sMKKl6{vH;a}`dP|1qLwQ91=m-vEF^k3n2 z<8XMP7{jP*B<->`;Pk%8(cT}sL3i2-vRZxwH)t)&7KZ3@x2~=L)ontU7POSa=Xaug z)nsC+?T7N6Hn`|*Dl{$ljps~qFmNKzpRdwpMWarm6NXo&GJ~g{P84INea*z2{s{w|+ke$*U~z#GpRBJid|KQMp1_+)5x( z{CS0=E~BYTHPtw;&5pE9BVTF;(On~$q)TVAaRM)PWTXRk{N6>V>rp}Vjn{Duzi-x_ zrA_{hz6#R5=SaVImvF}ZnK;xQ1HWxT!+`el|v4&?^_=|Gk6Tnep^8;1~uu@#j$uT;WPa1-G)ni;^FpeV{W9( z7Zj5g!ynI0;c-AC`md4TWQNM|_4_Q+t2_}tuUU^JkL=mdnKmf%035NG;`aaAL32Cr zU5!&GBjNQZWiHF&C|W6M(jS$*sB-uK>J}&A)TS={ z$?t8HMsDHW^6#$rMBbkk+e)}=&A8ELG+aoXE@%ip3N}Zw=!W5s2!T(r>9zyYo{$Bp z{p<1Ptu*|Vc7TjC9sCpYUC6qCnlK2@T$EMMGu`^_Qm7DUDO{hfOTDbf{W#fN{A;qc)&q2`S9Lg^dZ!C`|sJd3yEl2>-%mhcv|wzy4d zl1jjGnHEkNDn(2C1Tt4{6lbS$gvQF7@y@67V8dP-Yfb70p&`r_B723;DyhxOt&g&Ft7K(C9O;wo4U0rr(iK4(} z#srwrA&qe_9U$a=AdV1^Mi*4%*8A$>opEuvBQ47Z8)~joZa?hbXI5#8r$5ZViTJMI}=7R2ra~QmqWRWB^QzAOY)xR>3C(I z8KlqNOC|i=!MOAjsU)E*2Z-#&GFDfA~x$&x7qR#|ykK z^!3Xl_+tAoWEH-p1!1emn@>kU^|>U@D^7-#?{3i9)CRVBJipv=iwM|X68EzX@<$^) zahiv_+#f>Lx*K4g`G6+%e?cXm(Y!C^2*~P~;rC7BxjL&xcsr(;9O&R30}+zUcVInM zdK`xLr}NQhb}>dBIZPeECtz;i##d0*Q(eAGCSt-0F?UY|`_S}I4!wKbB6 z(i7J$&bHWpaNL2%-j4ujaX%3KY>6Yv!-bBUG}r>|m$)|B3EEC&3rBucVN1{m`b92b zzE&nk?~E2KOicuV>|hHsc=UbBhGmP7)z;vfixaV-!2ttjdX*TEVGB7M!nfzCdoe59g5i5FH=YSDvt& z!DJ;Q*?zrrdevzzta3ezl21K&zdORXY2HxjCc-po<<0YYj;R8A^fJxnJ&3C>Ov9oueix_L1{!DXQ->R; zxU#fQ`0BhF8!lQ$OnAZ&AZv z23(S8tYF=$1Nh&pQ?#sd7+-VZ@bZTb_U^b#6LdDi-ujvBp2ign-m{o(m_CKpj}vDj zG*7a!{s>l8c8hZ3da<=3*WT7bQV=91$*ukxi#6*nqwz~U_P6XSwSBU!(n?|ndi3Pr zme(Py=k+SKCwv6<^(k@ZY;My6B@-r@sfTY}qbfl%oa|q|47=7J6sr7-pj&FhVEqv} z=34R=k?N7P*oMMC!MM1Z_ZQ73uzbB4_hUF2iX{y>+1G11lk*FhXU01mdn_4OSU#lY z-qS(N>>%41_#A$vC}Nt18}qy+#y%WgNhj0w^k=IhnJ&E$bKB(USh11t<e8c`h~D=M>E`b)k}xhje^dAArQ`prnj4=xu2^)lQY)2WMEV}1cqBcV5T@c zEv?2?fe|=4;vxoCR-%_{65em;FY3$iCi~_b$9aYiQIz+uX*bkBmuM^;3Vlp{7Kw4@ zKT^mwc`tb5oeb%(p2C)>3$TfI%NkEG;cUN)FsD)1g}Z((Lsf_8@ZLb3?_KW0GVa>7(2({X_9@oT z73`EDfaywpm+O}I_k7rus4ZW--r?YBm8GZD(43C$brUM%@ zgtx~GgM<2PoND7OT%bE1O6Q)!FGF#702+m@x<q(@rgba6NVBBSE78;j<3I&^mCpz=MVX-uKbp~I{ zAJm6?V&!y^fi4%M)d%ZNeH6OPZ^9a>5-ci0pgOG>meefJocj&RK4wv|Uv{KSUyC(Z zORzh(TcLkI4Bt&xz}?FpK;GPV+^s2%9a5i!`>H;Z(81kE$rntlnk)#KdmoqjUZL}( zWtejDG&UISz%(`pFzr+|NJpn&qj(~``(2KZnoIs%Rb=r3GiD}f1}k%OF;MFpP5o~r zc3e42w|1&QLbo$lrxFI)J|oy3Gfncjt?#;9aS&Y{szaWj};g5KQ{iTyWs?Do9*i zi6@ThW6A!rnEs-dHWzxbgDr_r^V1o_H{Ykn{}HMjuZ@BK%<+_UEQ#(qBru zp+UO|%%wz#GN%M~x2kYs-g=BYbsw!g`bgk}^Yp>%RTw^YK6`XEQlRAQ3F&bsaPGJ= ztVlmeze(t`l0M!CH^-j^?q3Hp^7OgcHoAhr8T_3em!m*-S2L0=FCq9{7DV@^W91KL zm~dsb{g7$~Mrt5V`F<6@3Vk5J;2W%6eMzur-c_(~(PvYR8AHr1{&LrX6yB$~6;>}x zqt%5X?69C8Rd&w>^Hr%J5nA>F;J1Ep(P$hh`wSRpOX<~<6;^-`};a$f{0{WwDQSiBdE&MSsf zY01>do!{X)C$NyPi8RqDj&pw`#boq{1g4p}@P1?ic-&tE9d<8mlU&4M%jI?)uwM-e zqii9oQk$;z`G}H*GgwE%4I=8l72lRmhwS}IaGB5fWp?_L@gf#nWetIj_7O0C#U8X? z;>OD5uYibHB1{x9L%9hC*gPCYullXBe|pm%)62$SuWkVfetA*NghJS?kp=gICPVE` zQ5JI9oc)X;tSoFksR*uuZ6eYT>1T(3ADt80)u^&Pj@4k|BgzT4DU!qvd3^ae3%eq( z;F*6~%xu*4X)eKho)&M=r4#Sg|rKI-WR;Y{~ z&&?I>A<{W>nO$5d-J~vo|E+yU2lNe?&wj>KCE~C)Ap3FM|TnH*18Fzz+p-wA@) z8RwDaE}>H&oWT=fli0htaxmMp3cpqB>iKl}x)cugK)*zMaTlZIJT74Pb z)p}YLpF0kjONEG&Zu8uJd#I_CV3)X-?_#$cS@z;{95(`c*RKB>~fu*#|l0fkKO%S5V$Q zk8a|1cASbEn=l~?%4dAU!xs(6w|)*LXAjdeM-GxPtIQyOcPRT4EW;H1=b?0G4r(MH zNA(qIL|s-6Z?!11e+qo=C{L2bt8T<>!};uj()D39>y5UsbhW z$?yf5(St|T zEOCC^MwWlX8D{*ehQyG!Sfbqz71$@NF#ANw4L;M^qyvs~;<3Lx0ym!4XH8xMfX{Ej z7iDP>&8nt2PKsNk`va{-KY-!a7Kl#;aMxZBW+9_FpIiK0YR6@qVOEGYByQu$pf!LC z*YXX?aFpDZkEP4_9c~K;UT$Y#^=+Qh<0Z{}>LsB(Zx&Tu?oNLDe}i)}Tfw#E6cI{j z!;7olAn!IT&TX!$^C%oyDB_&u~c7xGN<`#k@?2|eT*;V5yy z2ilG}*H9BO-^9^HOBt4ojK*7s9GG2`7v|}lL%WeW=&5i9V}~S|RZTsJS^W@}XIRlZ zo?AO&Ssv-NJ_{#=cI?-;Qk>8(iT2Y(&`3j^3*UF1-YW9IVznYdZU^8c|Gl{B@OZSC zeFRs0nF;c3qVQRABhHo7=k{r+vc8aXGN)6KB-o4dy}LeYT6`Av6v@HCG;!{w#xm~s z&@lbv7zT#Zrh?x)9adR4mU~dPm@1gvfCpa;IJivFKv|7D{5XU-DegtB{|s?i%x)Zi z#SSjMQsZ{ji*P%xxUucOMOkVt&wNxiVjm`Jl6_}O1yBFXXRzx9y~4Ax_Cy2?AT6BhBZJ(qDY|pT@wR;u7HThBFs)}1+S$~!J@bwhqe@=yP`A6 zN-76YZ*Tm)ArEKuOS36srC>^}2j^|BO<0Q>UiH;s&Swvx%4P;psv1O>tb?KmTR5@* z4d&^!fsL{S9-B3pdmObI;6e%AqY{Yw4#q*L=U==(CLV{sH3F+2i+7f6#sJ?p!r=Qa zpt>ATR>hH)imF(-m^{FT%}p@7Z7XD&E73!zzLDxHTUf!&L88*V7i^_R;ElP>*m6gL z?2J(4!k!jk=i@VY{f`uc>|4OJDxz_SstRwGcyg^XZ7gRk>7kbEUJLe!*YbScO1e~1 zfqS2|5X|Cl3QDIO6G$j*!qusX&}KLr21`fawmcEs_e6_}z+#9R=>l7pZo-vI9YOzc z42*Kh!rg4X^{vP~*HSy03X7xbdrq zj2oR!4CkE|*gu%bdgWK5*3UTn-1vle2aLqjqC}W06@;i0D3l(hg*AR9u=H~SoVMY= zWm`4TxzdCin>vM6*JfeO$DJU#HUOWl4xoz%7m_S$42ABL->GSVpWh?Y+tmPpHHYzA zus53_zY<0)RRz7Q6gpM^JbVpa0@q_tvCSzz!P31D+d3D+Z;cu@|my=zv zbWb77kbg+Kr~Dy5=Olq1zwhmpnE(T#3qk%Yf2X`O1JA_j;)AFsD1N63+-H@d>A5?2 z;Nf39xGfnv)p_Q?M-Q}GmH{R|`vr}kH{dUiNNAa4!?nsI7XN(@qOWJt-!JRQa4FCF zlbcNM9siF@$~Z}dBmcw2(W;!eq8rG)cZ9*j3Vgd!tqYU4XowD>H#$`+||1)8*eIIRpJCUnM3WnP+`HaJk-!S==F@C({Sm@fg8&ytjBW9vU zasB*k*!1g^;E8fDyxb(ty1U14e|pQvK@%S~bV!7g*D-|oYeR{yU#!*ZDGqGrN*U&x zco6SDI3=)Os>^ky&c{mmCf>8?34QMqu&r8#CC6%_Y40;MlgR_K2Z40z?<92a3@6i7 zr{XPpMUV<{!n#+s&soq3k%czIg^I$)QURZ-0Rb4PN|1@>GHie0D znJiuT2sC)7?ZKrB$(fglMUiJ~=!|A#=GU@~|9|~NOFeZsaoJu7JNmci-cNllylEvQeQ4&gV#ag$y&7@l|J%02E0>{neOITFY5pPDOoDa=BU zHph&+8yrR-4{yZGk^@+?D$7#$^bI)NuoJJyJK!?sYoMweL`+Kf-P5{}EH=4}PH)=| zFH-gjvL1dRa~!vTKrtJaIgDe6r-$HngL)co!}Fwjl(`w5_u-Iy5>_Ucqr(zaSaPBU zYYz*-EzpZ)Es^5%Is$2KX&8v;=rWE8VM5w;bTsP6qyaIkX>Sv%zZPeOw2}OHmP$^W z{e}8d`S@?jWX|&FGBBv&*}YrLts;vnKuarz-_wrAFCj|cl`#u6CXWZzu91u;i}CE~ zcKEL|lh(ieL07F2!-xz6bT8`x_tUAESXPHE$F1-@Sd2Z-+tBbz1~Ip= zVaxwKq+^w@zywWII?)1vXaUmX}a*U_1OVyM5w4DNtq zBKagW5w-3=0k6ya?}XiW>c5!pIn}zt7ENuMP{_M_YHoqnXBAeqA`f4Vjr;!$O2$3x z!JNh?G@x@g+>_l656moJUQ88e8FgY@q$6iiw+C-;zX0P5_w&9@RrupQ3uM=10(a&W z%-S~zzdvciukWwZ#E(&E>3I(2_&(6%;^#2NeHDb<3Iyw}Y^vCAj=JZhi&hveqUN7N z!6IN1=X53xhBrpRmbdpIzF+{)t>yV*Of$+C<4yJ!Mw)JrQ2^ z1%sr?Wn9~ec+@2XLaxf;JFAn7tc*bi|2y=-*?l;gYsQmfBfxaxX^8kE0R2Lq`S{}p z$c}tP!@eFv+r3@zuUiDy4gUvEM3!M#qz!-no6D+Fhsp0H*T81eJIkf#m4ps~r}5Y+ zfOGmI*p>?5D*n#EFTI+iROS{j<#RYWR}yi_4ih|L{v9Lzr{WGv2@KoPf;X3@;J(5R z;-arbx}0}&;k)Jw^}0Cn%yt4>@3BrWy|qfDIDgrOtYBj)2VFSTy+{NdXbJ&`wUw)T4JHx zFg-5q3gNDDV~d<_Kc()Z{^a7xoB@4nDyLh8|qiB_%fWGg@$N{cKn@k@tYD zuwf>_#w;W}6L)GEaVsVdL&fedq|e(FPS6w7&Al8__USNQFmrIQWqGF;*8 z-7vi^nB})Wf=h#UNcO@>;JD{0KKXW&y4gl!Xt6gNv<@Z-eNQkdFBUz|2-u0j?NIY^ z6||0(=CtM%39g*X5=exkLgBeA&{)2P{Mj!GTItvE51(tBwC5Hnd5-vH63_85E)=M{ z^1OM^0N8J_oc%kg0<8)I=$&v=sHGyx#8zL&?XTq_SMU*1uD_xsvuj{*XC1_e^0eIL zx*)dlIN2Yr4tKZuy9QJ0WTo(Uluk6ar9P&4>^D5BBVW=$ZG2;oq;JC|(zZ%O#JI z=(P`omNrkZzB~q^jMu?KA>YT=4u;9=d4}+$UpV@b1Ks`TAQ9(#EtQXaiI1;1w|Z+N z-}|nl(hqC#>ee`5jTPS&To&2_z61a5WJQKuLV5Sz7xWc2p_E+{lr)*+fk`#wihexA z{xoE64dr-GFNj5z#uQboxkuuco<^7PH6Yd8M_;H8;<%4KZ0^7uc6(nuYtej(Cwx}o zMxFz^Pv)i2UEGU>$>rhtDZ9}9O$8o%as$kM)x$*6392Wf*h=n2LgxC<2|5Bvm;G3N#P zTwf!9FMFCuZeOZ`yACczPOXaUQ(OSHpWhAU?e?@|mNl4$F2aq$r{Tfflc?M?g4t@7 zQ2#w=u~s&gENF~|xs$Ewtj+;U4~u}0N&j$Je+pRl2cym`OKxEKAE;K40MRS$_&l#1 zd$K9InH>dR-#}dPI2R4p4$|t)Vfg!n6TY@m;}-f^z!8ZfY@AOrwmQgiwe36%kIOvB{|jz`Q zB3CiLJzFu_$`AF|OOWB;18`PWiY@*+nM&7&kn>InG$mvO++DU8(gTg~Zg>Yy*gKxy zk>oipe2S!O$7ZP6%KNyYQz7-+HX(al14_=*xa7H$x#q1=w0kelL0R)cpjl7Ar}_!T zZfHQsq!3J?*4&E0b})F_$}?5J(7D&nLrzOIz5i&uKvqYLrS6kthSRnQ`<55O?t{GZ zp!F)g^NpopyX4sni*e9qpAW;br|Fw?U07H$Qjl9@!*&&Z7KXE9yIt&(K!le$1gR1uV0MxyK89Ng4@1lKFMp-?>l&eygI z);_V}_QyB~bbl}4i0KWSD*KNfT&c?DShoiQu8-5Nw-lOuovm zAf2NkFxl-IF6^#@!M!8!mQxlLzoNp<1cp)T*e~S!s6e=%vkWx22V~lV^|02m1Qg1n z;hNuc7~vp*Kdro5{M0BeoqsmX%M&rsJsvJro&kf`ayaPqfK1x^j4TRS2S*e|VQW|u z`u(jE)UJL3E%)-EM>mSrsc2J`pOf%XO&ru5>8367a-rYo8u>Tdjt=o$#p?z^km%YA ziet4o>z90nba5o__DaR=$)|8-Xb4xi(i6Sqa$)P=R$})i1f;J$gH6w8vPFl_3M}kP zAkrxZOwFocltUa2%ykDdaYL+ZYJgoECUH{>lIaG&X2>2lj`c5U0Jo%0I8=B58Y>(j zfzP6vjST?37zN0C6@+J$U zwgS})9`c>tHuCM}Rh+!RM5w!ppPfoousUueiXMFoC0kXY-Tx6u9T|_1{Uf7S zkKq1Z^JjaVWw@xXZ=gTyHqQXd#$kH}45<7A7%GHZBNq}T!n2E&87Vv`!JbH6Co8(T zNJsii@NM^lzpE=D&Ql$@=AR(DSCRFM41}uinM_e87gs4f!;YZ{s~D3JL?^EZ0y=mG z^Uu4qaYhcY`*8tYiX4JBgBd{GLyIJm-cq@7GB{Ar&npKka8q?WDf^TP^}#8ansgc4 zJ0j?hEMxXoJ_R2Si-4v{7|i>427yxG+5Q!AedpniiV0;lDy-HmYC_jnh_Rn<@(7WY!jXC!-t7 zmU1*xXA@dn&L?q8G?>=fD!O}jHdH)#jblDWf@zfk-rJN*bd-jmB36Z6KRB9kzS<}$ zKb4<59#X%J*?3<%gvv!FgZhR2u&AY&q_od~_P@`u*5SMGbH-jASt*ju zHn{iEKZ`is7wE+;V@jqI1#7}mAktQkgHf8?50~Zi(XS}{q}PXh43TCyKEV?wM=+;v zk?j1`O#E)2ODZPYvc#|?jG5m-wtX5wcBj09)teuga+Y*tTa>WMw(PT>SOORQ( ziSN%(gr>?kycT|jI{506n1)dJony24l!z5j?a| z;I6Bl<(>+&h)v}}cERi#Or5R7zW;tme_!@Tm8Jo@^prkMi@8Nk`c6gFJHG`l6gdLr zk5MN&A2076!+9NTqMFC{vp9Z7`|()_yE{RHYmA>wgO%=~&&39qqq>i-(!P(|Y_Fho zlsGpwcPpGMH)eIwd)T2>NGJ+jPBk_ZC4OXQMSrMl%1WfqT!9cn^v{8eNt#n|c@>MYYc1Di-G?J=6cq6G3Rez79>IJVJqrzNm${ax5G ze>0?orVz{WDx81j9q=J_<}o%4kNf@N_nm2Qd+Tx3Yv-8pmLHJjF<+4QDG*i=G0bw4 zW*QSB*{5Z1Aa_(1JYJ#Cbv+DV!;iHvsaluGx;4QECvi@qR2`515a;qAt>*ZWAg!)h z3+Bsp*w0Uy__sa?VzVyLY)M6?o0JceJ_pjK@@mLjApySpZmIFuNR(4Mgw4YykdMb< zMi}pLSf>eYr#FND3IonVvj()?Rp3ITG-ugy7K74{L{k6xlD3-p=fqe@(ryaOkd`7!sZo4CSBm#a*7plv6-(L<^QwKF@3;@dYE z(dfZUCDdTV2_c>iwIR=Y)$q_-M$*^i2)bp}ak9Xf=OjO-3GZZJk7Ky$Y?yUB<*f8(4X6Bv|~H4nD;@&`;Ba^^VUF zp0<@|De^VsnyfmTR1}T9JI+uKB{`p!T`7T>M-Jh!9ZGonT^mmC zSp($5Lu@LshrRoqg`=D#my?# zxgVAvXa$d*212`H3t@A-8xfOkC8LZ7$d1$>ATiA!1^Ve!JmM7AJDajwhf83zi8$y+ zg|J4G-}s1KBnh_nAnk!N_im*&TDXqId;=|R=%x&s-M)=GuWGS~pg=UX=)o7p8Tj<3 z2xn_?nCY*I!3v90F#l@<={dg|Qa`G*1)Iv?i&qCMJ)3~$BClylu{VDH`hxEnN^#zn z39!y373K3IV5`!7Vij^5Hj6BwUo@_f7=wExc-wVcFy=9idzy<=<(g3IvnvUAPRDlF zcxq5kP6qx+QSqDxSP>$@eVp)-e-6{pMs^1_M&y#UKhLAioI3A*iOK8>%A?S)iYi=DPj-alC2|(-+C}&YB9E1MdQ4$HasJs z2cN7qWz%K-=!QE6MW5e8)%oMBis#5xI0fUvZAz@vEgmPH zxl%NC03avq9UV|s#KwFBrtGqHks>XG1xGTv1D24x3%|<6K6tx32n37|QmBz)DAhAM;6aRjk`}KGtdpz?o#@n6Y zrXJ|Vz`j=yzBv_FCh{GL+ucN_ED5V3+AvH1F`TwiMhTmbFgkQD`1mSv@_~LZJ@tmb zpjVu=9y~_(HS#_>xkCDt_fT1O+X}`lJBNN>+)yCHXF|u8;Fl9mFwky@NakeGn*7^D zk-r?R6({FBHEiyMNw0b#T-dl#BVMhMr4&16psvdGgNN$_GZFwW?MV3S5J zSU!F&?C&vSm-1t2dH+dp&b$W4zqDc7GzaMD8wcO(M2MiF3P1l7;R+w7L1u9q`ubEN zW*njC+ZHpm)N`2KdkWu%>0*zZ3OjJcPWYlo0ZYy=0W`oT7y6IN0DI!aWwx zK--~hc)`;NS3QWtt;q^JSN$+flRFQcUyO*W{A9X9QJEO5n+7fm7t_YAWq3TQ8Ksv> zv-1HZ@ZaZn@_oTe`lV2TG%PQs2g4<~?A{I3yrj#j{Mt!qH<4hD=CSZi;{g0D2qr5t z%|TUm4c>maS}>emMbtlg;NLC2sNC=iOI7m0+U6$M+J@t|4|*8$WE^+!+&FlWdIrB$ zUB?fi{pk696gPO^7As|ng`T&T;iRo`pnM<*&L&xK)`zY@rrj;n^hw}n#Ix`!Z55hK z8v$M2r?Hi1fLEW(z{s~>@!P?l;3d@Ovlb>~XX|m0y_kezt0Xwl)~|R%{RB#?&4IF4 zouD{|_fG6{WS8U`NqCDf8)4c{N=nth?^z)3G3bTyZKLr1WL0=0xtsJZZiQEMS)fp@ z4ZG6*Z!|u_NoPqf^p7CIc`WCwQ{A2($<^G+`y@ckiT*&IH^c5ML%^kyCaV8y^86&I!etmEwSoxurSWz zBEI}HB%C!W7`Mxvpg%f(@Oy_Ly76v+ph#*w+?{lh?-nkk&bLzV7@rky9up#bcxxA{ zeo)CX$a6uW=OQ$GE(Mn*k}_rcP`5rTrQeELIEgB@xf0S6Oa;q%IJv~$Cju6_!R zi9zt^Z!f(08N%e90x5)l9I9@gX7=<67G zJ_!3fjkw@D;>_B66B&Cs9}AXU!aDQ+koKI0W3J}7H!T5NR{&exCknk%5qM311&F(I zxY_jtv?l6solnN&wgDejkpkS0#=B&de!5_B*k*dta5Q}Lz6>5Mm4YP>fWA+D3B=NJ zXpLVD|2Lh3=ci{QdH4cz`@UoI`oDsjCNJ*yK_i+P9D^%skHL)q1Foj@Bu*G5&z<`) z75C12j}9L*G478tv)HtNd-`q(?-rlRwtkNitZLkdYn!!TXL23xv^Wel#u8kvlpRj{ zor_7IlOeQ67FNoRhM&>XG2tY_g}b)MIh(_*2aeo#o5yfsV*hb5FEsSv)O_W!y}xu##Jn< z`b`CC#<^O95dY{d zaoKiS*ildq>R~5vl)@5rkiNh%F1n!pNDHKU6j`850ltY~cjsLaihna^Vg>%Nr>X|ZUPv>e6V~vFp9gbW zwYal&O<18m9fR}^gPW-}hJ2J@39aL}xA7rhdny4`ewEY5V~sFY{~zglWP{EAC$URg znJGRRrpzAU)8Ic;vT{df$&(~tI>#Ng&%>NkPAphz9M^X+4Gb1#;S2K!(5Suy7TbbQ z_K}b9Ox+2VCsRt#E(|9Nw@QWS>ABTo(i{de6eO@shaV-Fj>joyqLVed)M<88&yZ0ruOiWeR_t=ydn5 zU@1L;h-Xv5hPE%lCF3QT$TZ#~;j6}Ej@RMv5)E$AKM%;UTSG6<*H|ba1-JbcLil12 z40PFpza=e@tWl#zJKoa!7Rq3ClxN#J&w}AWLuNKKopYZg1D~E|K~1^_8~vi5p4JqF z5oJag#XpbED@0hK*9&M!GXl-wL+JDVId(Wrg+=>Y1v5%RVagUA4AFm2ywh^&(wn*X zJ}Ml<)OHFt>;0l;Sx<>YS1<88`bThk|2NQVJpr%B&cxU;e1@f90?z-N0n1tz)6jbr z;FS{z3xbcsswq3L{;?{zM*271a(+7IuNj3G6DP9P_d_sI{3EKpV$?+G4$euR3e%f> z*ss59v44l5P}o0=yN^8uEul6i-)0Pg-fQ6gAK&$JawI?g_E?U5@PvN%*^5qQMx1!B z0FOGXhiG>%eD$UgX8k?_T?-@e?4GZXt#=(0#tq?8quH#3E`#Rm8!$yv4*n`X!u&lA zn7mk%zI3Z5icZhT<1|DJqg}vouv7hrvSqEEN=QtcCq{siH`mz z7|}n8m42U&FH*K)+F@0u>NHbe;jPbTWgJ(t>k4FBEydquCOGk(j3CxGiJXg)5Nf_o zhUL2^pu*W*!s|}g>2uo&-1@*koIiCOxj3N6iM%QUpYGB4a=rl=pNnPtguzf{Wr9z& za&gE|oEApzfvf2}&*rEB#*dkZzH>LR-p3CFu@lE|{c{x9oSM_vw_laJHA{@WQ&@xs zmm`EHr#GR5YzRFf_7ii?%_Ms+WZ{kMQu@s1CtY%(9FN@FgyfeT=O^EWCMu!#nvBvQ zw00xh&{Kq?Cb`1-l?8M|j4pg!f0o}N@+q7tHn>?|hWv@q{^EA1L@rMpo*!Dl z26lGyY>q|j?_XUU4tr1k*0__*Ie)O(6HZ+}4AZ`5Nsy1?GY~VRVMDo& z)tb41AmQ;=Fe@dB=sA9a+$m3~0@`!z#T05~a1Db_kAU@sWx}~`Cxj<5WQFCI3X3#; z+=3=&ZxGC`2Y2~y{4;wN#<6Z3blJ$2E-3`JsajMFJ<;q@C%@|y;=D0oaOglMl}#7N z(>CKcHRW=$*-i@`On#HYX%}&h_f+o2oHr0_rO(LWn^4xDi?`@PoX}Z}fp>2RwX3GH zla0qP`-?c~-|0?rCOMMlo*m?w-Fe80{eoGewK-E6{`R~12WAVO;)VL0Ge5MHY z*zv5n-{UYnA_5Z*za!0|`gDfV8+aF+hVirQp@V={tPu~XSGyvd?r*oOe_+l2 zEK7#`1Hb6AqSM6IHXs*s^9du66K-oo}XaszZv*w}9{QEU<%3(&zcTZ7}iB ze@vb|73G#TKgIkOBV2nSO)&a-0NW&+&Tj`Mu;VpBFz~m8&$-?KO;ICs**p?mR-|Em zmKE;a@=|#3QXi>Ny9^sXz5=ntah&b@gW&0OgNm!KMllsNRy9%$1gj(2G`X!brF%2f zR*Q4#E33g{Z4(SU(S(JU9GQsOH0}eHhd)ocNY@JkF71dhDLZk74Bu=ZGcI1IG4_*4 zb>}zuG7i|V(s%slKLbnE;;7T-BH}#py0H9wuds9bFg+!sgL<*eq|;{;)9&t~YZc^> zy>^G4{}mx!_5_tLS!3&N0UbDyPjXT}3FXSPiRs&TJiYjuAaKENSoCE)n>6hwU3B~z zdG8V@IG}3_8WSea`VnvGx;c_8!le@|CH2_9zm|BfaTDxFS&KhTWl|s66rwb5CHLZ` z0lTT9$_}c}!>WN!s2}G_FP{E{7bLp?vmO=oyQ(oY*80Zg&j z4yieh;Ks5m{BB%}Za7y;-dM#z=YD?Pd!)df`1=E+e4nFBoEoQbPyzSuea`!w_F-aM zHJ*4pAERYb;pKuK5Tx~-%JVmY8Q{mPjly^?egTwAYmxZ_22AeBdHg=52tQk#u&RnZ z53WtamU^Cz;Qv(y##{6L$VbQ6UUyq={jW=KdmsarXfI`}-^~Y4)rGA1=L3APz=ZEr zzs68AZ#dxV$@}Dtxn#ayFsWRHIw+O%;OqeO9h?V-Z_L=1^hvl;%^gLH_!-iw7cM1z z=KI=WoD8Q#7wzAMpI%Gg3h7+jeETY0`(r;%sg6OvtgZN4;W1seWfu3t{-V%)i!E6B zU84HFQcN!0je8|-4?JX;&ivK{tB(pv8PCgbj{HWgq6k(w{lfBDH$%r@OV14)m!wF`e=cCzm2Y8Rf&~MI zn=sHcj*tjfI`7{m*x4{d1r0M<#ok1;<5{O({bRXjSqqrG`&6v?G)}1VxX|+M20gr9 z=LSg{9Wb2b47X>`2h-I~;JNrWB)rgMBR4F>MOrV3e}txBv*t6jztK%^Y1=^bSPm}8 z3*q{bi*V6?0$y_shJq1P_~McZ*VQh{bq+cT?2|)qK}Ed4*dP%fZO9-$jUEac{*33A z_pB$DoAkIX(edO^$WG8WG!@@AA0SINYIC*I4-(tbN94`hBK&W5D;nx6vj2Fdyd6`6 zYCcgd{;n5HD<~!i??c)94@BmUJe-*-gYOsl;=@mKSon-c@I59;YH|u`?6Dx|+hV}} z8+#hYyspHFJo}}0gCZ*|xG(tg`U+YFmB3Nk&CqPF&ofsRfp5_#5_5PqtiIMLZ1Jn2 zlW#zu; z?5BJ@*4~9*#*6|Rw>>yKGMR2O@c^B&a1`|zMArwFIBQe8@QqO*bv~0%jl><%Jy-|d z9D9lx_FM4bB~PeRvj!c-T_}5@nAaIg3syqa9VQ#etRnm48A;OUM?q`n80})iuDwfSY*0QG>;;Qe)AlcwYg}gi{*19PNJdj-I%SkREGF z|CprXn)-WGufr6JM^z~b1_#0CSHS_P#FW2_ry%}GK+XzLjMw9=x_{RIqI_qEXYx7-?kU|7 z*o4)?^`c6_7r31)W1k{xG~ zp*e~);7fYYoW2V6=cS?Cn+Q1gF@glxPGqL*RtvukJg0AU%OTuMmYY=G5AShtzcuw2F&zvM#;?!Esh!W!)bXWoxHua1H^k6+a9nL+= z$G1zapht`ZH_z3M#^=sqL$~c<@K7c$eRiGt2gQ@-rfKBTbcRcKhwXBV!f*cB2nzgd z&+9Du+wUih1zzY{dRypwCmhGGR>8tr8*(qN2uJ?*6)w3?(M59+JnUDX@)mrLgbGoc zi@{o7zMofp1COxzybotH%FKKSuP3~~5BGg>>97NQocja&7V=*3@FB2}h(_y^2HX%) zBss-G9JU<8?eW*eq$?}Q*)1EebD#|)9gSIdNfQk6cWWb`X2>7UvAyBmXi@Z))?X3| z=fBXR$${Tc>47V$rivgPGZ$yneo5q^m&l*D&sw zE{kT3pQz6EnOuvGKsZ&*iS#_#iD#oP(Ro`GvDe@>1n4*7??y+`T)&j&^BL1zn^^3A z>j&kZuG0TvHP{r7e&O%MzL-@Yjpwfw(Su|zrz*J>)mt9Zc^8Xe=s_O%Z@x+Yh?|1f zIS8k5`wK36Huc;F7R zy0y{dqzESn%q8a|!s*Dx8K~ELQMl7M8Vw3`*@YvkK*-++=9hH9Q+IdJo|8(p%v8ne z1Hb9175mVB|7v=#N)7MwJ%F`)LUCHbQ+($=03wg2(ZV?i{Z30=#PNOR3P{fgVLKyIiAYBA(dWM?A~TGbdsFPiOt(fww%y{ zoTu_=?e{>SzIY63#*1;~LBaSa;VoId_;%6xlNN0GY7s6vQi5?~37hn53LJeFiNDBW zvQ6GX7%!d=A65BG%ZL)Fiu?wz8u+<4J`1L_X|jLurJ&B;2A@@KP&Uv(SA3cVx8ib8 z=6EdiyjhRq{8I72>;~}d8jlYAeDdf1G>$x|$47>eto=hY@${?3<`eSpkI&MEmwYAO z*A7C>=mu5KGMz za)@6-Eg5G&0)`f!!D8EY=G>FUa`@t=6#EbpV<<{XFNAFXkObsm=f=UwPp8jh(i zN3o8B?GPh#nn>wNaw`l}uw{W7JEkv%<~0iByXpbV*cmQdJxY#ArzkPIqCOJ;YXzIt-Hku5n<)UDCG)A4f zMiM;5*~PIU-1sS*@oj|;JJ3~v4YGPTFEtjIf832p)6|%EX$4N-UIj81Z$ zD5&tu2diuHP}oySFXWsO{)wN!EbdpMev}7vzZt`1hL=%;s6e07F4G& z^7jIqpwy4=>VD!sy?ON5w_=o&31pk9zo4Zk&nSO&n9R<-K!b&u zXTBUa_`0gl>ADrJyc-JdmPLZm#s%p0YzT*!IrFYGc_^;^M~@hu%x|3f0=NC~CZFEV zhU3S5u=k51PT8W$gm((*%@K2oGRr=aIS@k^B|6&7Q^Pz54A z?bsV@BS`x`i7rf&X8NZ>(BRJ$?xMjMZt>78CaGVBTZ#kV@16jm#IF(PRn~=}RT;!9 zT#2ZuiZRn&VK}dZl3j^6;K+m?7#BJp{EjRIAO0J>WnLLk`*1<1xM(S)&5sef+w+WO zj|(t5MVpkHyFw}7D-<*SOw7Wjvu#crto+(K1Z%%Z(|0o8abrvijBH$s2baxYr#6k` z9=02@`^)bW2R>(;c=WX(YMC}DO2t4$^hiD*Gf16{_F_e@A~t)M&^Cv5vUGMTnSX96 zmv(+Ecc_|?MPUPAd)Ev0-E=|a-=C?pS1884(_oRc3t^iTgN5EPQ03?hvpnt#FRuTM zu97a${2&MN>NX(PDx2Cih+l3vXGFaw+YE>OQG8DRh05Z!{r+3_?jHZq6d zn3M)Ieih8!cs!CMtiOfgp5AD6LyArGjb!(GOIv8Bd@ z$qtGZj?oz}n1A9d86G)A4kbx*C0rgn4mppP14nU9^)0wRd_Igiq)t+&EklV~7cP%% zz!OI5{7tM8i(l{JXOFGWb>#(#d{P1b?RkOMLjR!q&}N`( z0vPYlqmi{q!cPMpY(H6o8XH{Lrwyl3)>4MOeN;*Bq>p8@Qzx;?TtkqQv*De%)nE}X z!z{0qpeubxM$AZpf7#js)txu6^oJYn8mr5Fs6CE5YV?E}K4*!FR|t^3fpGp{8?oYo zag^;yX7=D78bo$k+4A0nRJStBPW~T7=N*sb_r`JALX_-L`C17nWj*J*B`PJFlqf}M zP};jhDk`&xWP~Ci**xbuDv3%(NM$s%qk%*kzx(%Z|Mhx#?sLv{eLnBECd^#&s#4=t zBl@{}!|A@uRNdSSs{=N3%ag)@3zBD5VrFo7;SIc+V1UoW=V0)U&2Z^H?}pS7;GVxJ z*in0!lpQePs&9qiw+n7?e#KkT&v$`7Rq+0mC5@0Ta#=V5GEVAAdiK11<{wvU^D8*MJ3x7!(D4J)Z}EYHN=vjEj3-;?O8b1-MlJDky3j2pUl zLeJ&z`19W`$lBmTn{tbxsp>bJbw4X~a5iO{o!hZQ%}zGs%tqcu08`L2g?+agI}EuwniG z-8>$&diyyHkF3Z3!Z@MMV^uD+cpEo#%nqvd$gqeA%$!3 z;BNkWAH5svLvn>&g&)}%$nQ2R?qI7)0oG|{(&**|c)KOPVhZ0^TsCnp5e!&!&bJfr ztBxA)q2_(U23@FIvI~R0tQKAgbr$H1W7KD=Ib^*ON7ARmCJwJfxt$ZZ3I!c*>zk?2 zQyUA@v+Gdf`UZ$R)kw5_iXi!cAJE6&Ky|)0TX!OpZeD53jheIr9W}->l}RyRS00Mb z51aw#J{9hw<3{heu0 zQxlI@4qgG1s%0#}vkuq10fCPGi=H>%Ncog{jU1V^W%!ZM#FIGNoAoo~}6({a*K>=krn=+}A+g=237DJ&1+0n2#(1;V~vyDF=AA>Y=6a3^`LoDr$Y%k`i zuw7-NSg!>CZ6>~)(VSPpIH{>jIb2AEG1ti?gEBbaBZ`;*m~km_{y1ZHG~8S#k4v1N z*)*8$hOqfazdSgGat;e&d{`6Q{&p5+zOUwv75u?gxm2{O7U$$?2uUz4$6ww1;q&q{ zOPM9=dlKcoy3So+*aKAxCWB$L_o}!Qp{-TrL9j_U|<{XT0Hd?&NY}J z8*?4k&wh$MI|b0I?S~2KYWTTTgnMhS9pt@Mv8_2_m>Tj9oqql%F;|D^%w647GGQlY z;w;I#h2zN@c@bQ9M7MrL)3q^8oqqGfTTsWVOH;Fj84@>+mKRN?syI_ ziKgM}v+3Angt+|6O6+w$0$amQ;NcQ!IR5PuouPWirgqO=@Z6h@i+oRDwd7CGc)1HC zv@E&lj`G}-*z>UG;sh`l_eFTR`Um{|v6Vlc9uie+9VTloE9}pB2*JtIxKERKKccv{ zU|0Vu6!E+bB`u<`qc|6%{>2I3PZ~jjvtGkbOKphf=lN3iUczu4vll9}?lCX%uhniC_g;_fndy(ySIvcBTmEbiabjkw+U$F}D9hP4j!C{g z3+3I5dCqn)s0=;4;AuufEL=QH19M{p58nt|$BVT{)~I{al7 zip3{`soFT^IqwZFKYWVV&TGc=vu4A(=l5Xyr3z}guMQ2ikETX91E9HdsqpE0bu8NF zND9=YxV&(F=VVfbKkm4p&){xiys?q|Q8i^7Guy%Yr#3Y{qym0!JrHhU#l+tzaB|)X zY|K|Blr!AT!s^Gc)UT$HzpfST&Nk{8`aYr@QLHkrAWmy*1Ya&M$P> zZX*Hr%PRzgg+Unm6*kS}4!j|wzLr7v^z-;#N)`88-6c-ZR;Xs92nmZK`P}S5Ot8==flU)3_+%;i zWe9n8ayf=yJO%H6zd-fMJlrpp2p?pR;q`@xom(bChS@Bx?*IpfY68)H%^{Y3zZpDl z^Al}}1o(6A9JFm81FODf!1=OV(z<;BjQpm-<%W|)K`>0SCE7{wn`?Me_KNV!TSYcn zXB-zf@fBUiBDe$vfEHMzTQBIL~Urn3UXxh4H8xxa#JLJW363;$-?aLkH}V6AAs zY%F{KRF7yl^8BBae z<8`6Bd{-I=Duf71``3mN!no-WUaTMt3Ph zn%ZHMeiXQ7+LK#iLd-On0q1%~aT8+Zvc3Pb(OYUGPRbhzRk6*);>b^->FG>zviJv8 zJKYYYR}WCb7a!@XgYEdYiJzM`ALmxymjj64ydZq6Vf8SinwoesMe-k%$rb|QU(;?11v|fYJ{(o^F{{|GycmQW)m%yU(KRkPV zH0S@@04H*@8;0EOO>8!u|~7Z=QK607pMEHW7?;b+}>F5p-SCh(E5Xp~A-@vPS6?=>0oKPFY_7 ze`|BJ?%2V5SP9&}IY7>D-h!{=3HN&FB>d4SgDV?+fV_Hy(-kh#A_Ym%IP?%zluv_h z^GNRd-V~wbJaN|By^0)J=!vs5U0Cm*zbGm&WhS4W;M(p(XtwC0pfqPMbVX-j0pF|H z@7@OsEo1QZhP$N6`60I1kHHNe&*FOjX~g-n2Xpq-6k6XG$42!9GeiIx36#c-zE?L5?c)g&yQ=r%n+r zHapAn0;XfD;?vR>7mQF`EFGrA29dl^>LfUaKVNHQN&D7Cg5pc@Bvfh~z7Le(IlH*^<`10{@{jJhOe`u=>k^pY95)Adk|TC10AHb;D$Hxr?efj^GU$Sg{DlY{T%r) zvH}$@hQO~rKmJ?u7!{^cTy6T8ymnQj*(LJaQ1$`HE%=SO8mFLObtH+}z6M9#S6~kB zbh+ix{!lm09W`(HLeHZiGOP1EY^XSf%6}QQY+eVCUqz$g9AL-z^o?urF_5*rLdAZE zLYmkKTv&a9lub6llRc7{v`>rejyy=O+_PuttqDy1i7}l2Fc+-v+(Adl=eD0OWFow_ zV~?kvr+qtIux!B}RB&I1shk6N9zF~c-)u*lVRP~{_5x+Oc@Xqr1iL#XfLq3&*XDIK zD6qGH86!>Mc6JP==-RWsxh^Eap64gv0W`F=V+s?;a)0_5jd6Gesn^>{=#hP}J}VVk z#SgO=x{BQBJ2rT(Mpz-Z6OBXS)0wGV7^KaLf_;w^x%Eb=Fmu5R_&&lOY<34@O2c+x zTTByH7~ch{uc|1*f3s#h1bo&o9#($Nq?0!VKw*jtjL}|+ZxzNf^S+-T^-mc`UWj8G zSCt7(&nw}CfPa{{G7}0PP32b3`3t{~q``qBQE*Q!0v5fWLX$2#5Br2xLq#yN^fUzR zI0h~&<;kPThe6vzNqB3*cUUhO!m6bvaW9KTv75=0(ae7lv^QRXKEZk6qK*@Eg}NN` zJU^Xo3RPesLlU;-55J&dUknxh84ex+d32p>7oBx7g$%q74Z>&fE4}5>|f--TR<_Y7UaCG6{2;6x@3ga{$gUcH|Qj_h77eCB~nY!0_NAWj^ zTdvNv@8+Ef4@_Cfwo&wWz7D%x)JIlYpI|0R1K8A%h)FI__*~*Gdi(love9T18DXDH zO#DJ%?I?mRT5~ziL>V~8da)uSgFH`l;C|OmU~ev|;<5M*a8L0xOmEV|kFGYn8>*6~ zN?j$Mrxt*=k15E#drlT@YQxRShAj4aJ$U-}(1NHIJoK-NtlQEEC)y`rZBsJ_WS+$> zcBklJB^`Fo%ZkabsiTYI-=k*LGaRE!$fa5Ka4(skh3-<|>`P~|nE&SE-yf~`PE8!9 z&;CTUBlB>ry%^cF;0Ag2Bn|{~{=vv51!mNeLmf(-u>1TAX#5%oc}3%4`RIvco%J!I zXJf}IYxY6d>Vx>uw;qk2slY`UN&en+3O}`8;&Z%N@Smw1T==NPM78fzz217%6s{r< z@(j4G(@ddcyCQd?NgLb#0X{t>B~ZPm1uk|S5E$-_E^{QX^!s%7utftOyYalSDm{=+ z;r&e`M^e#05uoqDbKfT<;rs(Xh?GMq_2c*a*Z0QI!n^#pYkwYErbP(+_bJf6mlc?l zmxPMz{lR~c8msIWkCqf^sjwAa%~`^oo5QmdE~F8yA#2pzeGi^dSMYds90l8|U~yq0 zc$wRQWN#eNjgb8oz|p>Y$!xZ8pY=fog-9?x#g662CgkJ76z4#JINTk)D+K5?_<&x*JbIPk0j z@9-Y%P!R`KLr1X<>(1cbIt8v@Mw=yX>l9qOazJR)?1B#OUgN#BB3zos3nHG?Ni2{3 zAp_c`P`c;{x;)W=jK=ZY+8fJ>S$S%uWNR7TYiSkCdk}`^N=@XCEoGLW zmTc`@2Ts_o!5yn=qRR`+IfY6MFnSVzy?u>>?F*)}*N0Ez!X43QHugX2o_G$Am9GQ4 zo9f*BK_8;josLUS_<-lbdGK+=R=A&e33rIqgK6nFwm57MeUv)Tc9ke>9WP2^ey_#u z)Dv)wECKd9lhDk1RO*d{hQLU=vZV#$4~@W=Mh#Fjliy#CKTJa_LfMP#S#U};5r5>R z(4}Ly67^4C1m7mlC%WH*aGpGW{=Zk|xz61@_wOZ^H(jKQH-D$+THXsBi&VjRP9%2U z1h%G0n)|bS5_`5(flTmQ3H64C;Bx8>akNpRvtN85Cr>R$FaEn`xXB8iB>u&V(yDaZ zv{L9=Q%B5w2ZbwYAMf7!M zWz&y=w0|c)2)&N+w&U2cTwnBAdZcp8he+ZPJb(j1M{umqSu|cSl^gcl4av7A&>NY$ zI4n^}Ww+|HcYZvXL(CH{olIvlXc%7nJ4~z(Ph%c_akT2)1^DKEmmGS*zl~)gz<>A; ztoIqi+5?Y6T!9<3=IjHJZ3EDyqruM(_QKqNRGvp>N8*_!(+PDW`Ku&2-$8FyR@n`P zZFgW_Y9BVN8iV-{Cc%A`UV=}WVcfM(2%+hye=1zHgC)lJy5fxmLE zKZg!ap2EDlB207d1$xo_0d$q*5RVlnxb1xAe$Se0)S9s!-|2Ni=%6U0yDhjO`xi)9qJhos4T9?HeaP}f*uuJ2RGlKi#fi&s zlODyB8(FbfG~ms)&y(U>B+XdW=tb-+CrNky6vG$mr68zLjB_#h3kyZ6VUyZ>dO>6d zZky}}!Jqfz3zKr9R#QUu1TKW|g`Ut-W{5f7qllb@5m<^m1A~+NZ=$c9?)sgEQWZ{| zW&1Q#^KnLvN$=2Ay%CmAy+xN68L`;Amtp(PIpATQL4R1Uz^GD9JW}%qKY7}*8QP*~ zapXCwy?Oyb3#N0w7k|O5b$jU7I1z>p2iep@S(ZAlkSxD44aGOv;IZ88=%ixIEkCgX z&+?t7>dc+w@7)ocRcDvY9iEq@s2c%4NF26TWy8fR9if)dMl}4oj*8Sf;E;AIe$VS6 zlf}pLoW;9XZ*+pb?V82Cof3PPSSP`YKjvDSieAYQ!OJpa|E`zf4yRC*bFq^`Jep4bPLQO+vW6Y|1MkaM)8Tg)%h z(N(FSFwjln`eOt)k3Pp5ZzXP<-*w36xnk$Hsk7lc4ofs;c_(TP3Ceb0#~)juna?N? zdwm~Xc2(2LoY~Ab{yeF+Q|GolIR#bg+*nUk7&urRgEH-WSk`|MyC+uR+V4WVRlEh4 ze|5(ryQAUzz!bbPL5{tud52z6_4J94Au%Vmhf?7ohH?%8qzRh#NKK&}rP84VQ zsx!F?6)8MbU;^70Ul+W2#An+kyro+=Mq!tsI*&X#3u9llK(x>hE$UBVjVgm_p~@`b zZ!Feup}a>?SfO~Q3OD9T><{<^&sK7 z1LPjOg>>ajG?eci7G3ZG(SlI?R`imdyTvO1N?(Ju7p3XtuEQ*Ay%IU;%(FOu@lFiF z;n%S-_}VuNJD#3|Co1+h%efdXya{9xx5lt(2C^ivJQ=Dtg^~{yC1m%CRNgB#kF%Eu zCG9z9!01jhrM&|v@!knhm)JfGHa9F^fE1m zZ3`M9WWETu=g}t236Ww6){#6XP8OwlEn&9S71}0KO8@iUiVCVLIJ!R&FFCyutXDaX zHBJ!%&)rtICOTA*G~JBtugD`FLz7{`+})5iw2DOWei)lZ0q0>G$+Bnpam)TpX9HzC zmP(==b*CNU-hDU^f8Trufm$kX+CiAJ>KE93{zr2xLcs9lLrm=dK;`bKb0O(^SbX;= zR;O)aKOabPW9kre^CRG3eSlD9i!TOUjew~W{Ok#ctWUt_|GrVBZUbDIEkGUF^DKXXDZ74S z5?tNWhLwk>vgZv_r21q86h&@^A3s*&ru2)%aq%>+O!BqB{vtrU(li*b{FvUvBj4jOz+zbpH+F#iU z617sSG^3NG4vC_zvVP^`qLU=y`8yiYC%{}43GQlPCtUNA6JD`P1&vP?d}eJ2sUP@* z#g&dAvTFyL6kCAvYB|=NS%q0?5`0EtoUnbq0{gBK4i!sML3#0fem0}XlEvfTU%eVG zU+Ks-x@zIrk4_jgbOjZ@wonKSL5tgKKu*mBw&v#B_|Gz7i@P0gwU#(};4m6RY(zQh zoaaPu&3wA~NCr&2D9(kpE8x8N{bY=fGhCS;3VJu2Q2xLX2&_HJ-dGkBtBqlhmwE|5 zJsiONHGKs6S?tZU>(u(LqA+bTpXGO$OYUZv2#Zb`!(6ixc-l0M8~3%5=T3#w=|q{0 z=VxmsTY_nvWi(s9Tp6Ps!m*@IOki{{oSuG}L)teggr}T_;YMOI#t;V zZtQX9c3jRQ1&Kq#s-gL8mBdzT`ENW|dGV5MsErE`~F?fiahza%?UrGgT>n#i3E zLnzx2OImy9;ONH@_*!xazI#T=C*DU$-)0J5)$%N>#{IbT#{hkDSc}g&g<{K-DneeV zaU(iSq0o)M<7yFnqW=#HcdJ5_@>$&U^ds*PBe*ronLE!jh#y=}!7qK8sKNWS4l6vv z#$I#g^Z6mhPgKK4jXSU=-UeT86`^E!F6MonDYO^xJH1F17E@P5MrZhCu!Zl)7cd&%-ld(SIRu zeqI}fhVCMo_xY~*#Ru@E{l&sC?rkcxOuTO7iB&P{8EzHf+y+1 z$otQsF6}mz4JaW2V42Uhf4;=Fl)CIl<9hXeOp%!CqmkKuDay@{~X%Z!WJ zYJ+8QU*LZIZmvk8fbREbL{Z5*_~Pd=$TqnuNH|ym^K-MoXKfeQdo6-*V`t*1*crUf zMV5;@rNuzthv9>`D5rJmA>5xNh6gq~Go^Vmm_ny9*LE--CkK>4vq~{;vPN`KoK8H)>ae{$ zE5`ewGR(j8m%Q6r2+mXal%GhA}>zc1TdZG8MF{ z&LMM~$(`q&-+GNdAzA$V%I&AU03m5y zPQ;sMthh}^t+q7KRl5N{_UCajiN~>I;EHgDk2$NIXUa`!H)M-PFC^w37Svs0DmxpL zgK-c9HejD?6s*2>g?5Zw#(Q3?an1ZB{5bO%y;`8p zDSsOTy$_=>BsHIRs>@@5>ls+BYR@wf)QM@VBvB_t0xjNY=fvc3f>l18U#-g6@dMn) zrpGuU+!iesD$(#=m*J6d39bVjrdhfcJ(NV@Ph~Sij86jJ6%)XE?P?5sauNG3MM9~X z51Rh;$3@xx%<8xnYR*cw8FfU!{X7!~CaeQL_H>c^31{)km(4;+{WPKNQBxN4!WTMr z{Nl4r$5Fjt6zjNK2N$0O+ipB`rLtmM5{iZKb|ODG{xxK{#eCIaO{?;V9{3%b^D&s|NfeS*uZgIS;f0hf*4Uqnm`{+sD*+# z5qN2p4)Z_4yIERdz`4nd+w?sJt%Z|dm8dMNuW-ffo+7Y*^GEPqSwtUoY^%7Lx{SFV zJW2*Wc46azc%FHHSTrjI{r2pDR=N~x7B!L)pKHm*Mq^OoS^e1yGcbJhRk&naN+yk! zh9^e4Wc-{*ut)i`P;Q1KcWX=%-Z<+lbZong!El z&xaf>efnTw96p*V#=UlFCJl}ubbs%BvRd2$&zV1lkx@&bc*g?1(QzD}HK*Xkk!dt7 zcqco-^TiW-Gw@^VZ+gEV8Vm9zF?p*yDx@@#Df~TZXz~S&e=ES0u3G5#8p-|p{FvS~ zc#D-!Ww;anMqpgh3oy1@4^?kcxhF+Zkm{(8ANj{W&WZ zaPS#)Bx!N?$GPD3Ml)76=`qm_-7Ju`;n^Pw643wG0_qLEpufKp_xed5@1ikhCF75h z@vYBkzHkRlt9t_0;|_zeLNuxBv*SGxH(_Lj9+QV?;#KjS3i$k3N#-be@4XuLpN0|N z=N!hMe>VtoSw!6=#$gQK4GeXAPVWcA+L~n8kWtO?h=Ey<8%e=ro>jSJ_0XTGRCd?3+*+l(X;6#>V4V< zEy`jnJza!J_>W?~S^easzY>q3E5`Fu-PGu#9cm@K1gU)&=|{Pdyjw_v4UglQiQzAZ zM#Xn{dt)b#FnJ5^d?&iuMH5~gZh*Bze5ZK50hU;w02zM9Z4fwyqi08RV-&o>^rZp2 zwcC_iHE$Q38Q719UOgn9Y9~>#OdQ5ay#m{TYnVLQos^Z0#w|YeuoUhPFRyJN<61@n zoD(4aNhluG@&g}(Wi)J%;^W^gaN_Hr@I#S^tyG{7o`|}SDiL+47%PAy-5eKOd4!~m zaAJNFv~U(vK*gPZq5h8{dBd|1qrErKl-Aj}=t(zD&OV0Sw{)?^$($+fZlfEAj^k0A zDA*(s3>wZdoa#(XmQvG<^QZVxr;OW}zb%0p`kaNn7s-MY6AkX3&3Urz@OOghW3b|W z2bH+>iRbR$qAvcY@WHr4uzyny*}$_{dbcU#vO`07?g8>Wkr}9=5sZ~`%H-bdGejdg zUHI~lI-b;3<7z`RIjecvoW+<-v?-baH{M<$KkxOCi1M>ow?`9ygq?v|Qznzf%&~00 z-aS0spNw9v?lAI1GIW_Yqw)1)Fe0#nwmuun&(oJ-Z)Pw%Yh=pa5=AQRa12JpOoFzK zRl>H>N_gXrH61g16lPiF6YIz6g6ZF`fIzeuf>n>eA=3gJJkU%@kvKaXIiC9=lLU?5 zbXdau<+xGcjopRL5S|+e3cB_9VEhOcXrKyRp^h{oO~HT>TWz*>xnB?3;x3sWl|@a|G^_4`9-_Rk7jB6PZZaF6I_;R&;1z|EP^tx`jr7ktAhvm8Nr`82NM2k%r=?jj*$CjsLbH%gns z5XUcsdz(u!Xv;ZNkV(KdAyc{CN<-j3vx=M>uSOr+jDRlQlMv>i$*7As({Uezz8xB@ zW%)R&<;wFH%l5;we*t*uya}v7rp+`g%CIYKfUe6ghN1ULn3Xlq9k$1r#Bi(R`>`5H|O#~x`UQiZ>}@Wee+E@43>eS1p|pUvAr>=R>g zQ{P_Jb375BDymj~3o{VNXRg70tWCJ&WF#tXmS^L7)Y%u;dqnz+I(L7@PT18jkKw4WeFE4q>k+6sj0mN~E{kBg9)6vefj9!57co---^6mDAUz{Z^un8wFE{CHgqzRyu- zbFbrgQdN#%z zN7?7#T0IeXy3USMSLQRhN?|a;Uy3WRdw>Bnl52^Ktc*Kn58qw;Vd~&W-WwT;HEz?` z*YK-&+Nl~(NakbQq_wbaV+LvCp2OCGxjdVAH1lyXhU}=9bnBi(9P{E1QI1`Og0JmD zM-vP1Hf!S@s7a`+=>w6{GH95R0j_yV=(oU;a3U{@ZtJ-NX~VpmY~~5}S#m72Kbpft zk0ucf2~Q>!_7)OU>Vzxc3M}=mpb;%9T>qF!`0d~km|`^+6mKkp#s!lV$MBN%;~uD!Mp&;Qe4<2Uwz;V&6n7e9tv zQ>!IU%PQ&7S30b|PMy#DR#0KA4l`*q0!56)JNR zYR7V$dEQThBJU1N>p*LtKHMu}!85ErgSYA^=5DGy)aR`x3X-Z5$$(}o-Ev%%bXgd~3=6&oiB)*5!;qOb zZpIG{VrbsP^UbZIz~XKc1_#YyS_6uB&$$7jMO;xZp%mr99@Eph-gL^7r+7$fW97cq z7Bcd5BjzNzv#xEwdH1LR*Pc6pO_(^AoUZi+*##<~|4@pB%>98Cg@^er({e%Vsu-HR zpp#rVkw+$76Jw9<`0Tj(N;n<97Y-%tpf1MtWb6i>IaZZ|V;6GJ zy)OxS)I&&UK0jmldJki552Ht?9eBiD7M#%Z<`(9M()Z0eFvB+h{y9oB_m#?cSVt8` zbwxwE!ylB?7{fE$CbN_OMZ&&@RCwf@Scwg$l#|i`Z(9eLd6e&Sru*Pgx8wA&Vj-xW ziUJSQd^puCPMojj34IRhGE(bG-GBSj#{Pa>bM+39315Qsv=0&kkCOiiLt#pWk>K;- zZdlQw%=P;4J;>1_?0(1*X0uchRkP(;waFINs67G!79GaLKP^$AN0}?@n8Dpx z(qTIeHQACowJ_MYl3F!5L&4tbxbkQ#N-gkaPL0Lv7k`%y$)RBIwT|Ydx5KIfeD3b% zH)5D1#Xby5qQkmuaH$jJe#{l(=$vDaM^y#JM@OQg=PKOKJ>c^O5p>^KX|^SX-+>uR z)1I4EV0oe&s`)p{d^z61nP9+sgj+G{)G!8=M)Ny0H&!hzMGwxM!Uk6*V~6W%HtldX z^_xAJtePnxT`Y{Ihi@dof9&Z;*Nd2Jehax1#D2N_agyrSOXov4v!KYR^;ci7r z({F5neZ@QJng3Q`{!;$8XrP8$ZbVT>nMAx)qKEUN-_e%gemwYJKiXb&f(Z?tAnEfK zH*eQtgEN%buENof`$ZRi56y*53RfZY+gCDQx`f{ajN_~t+wgbGRn)J3jIw`f;N~ka z$U3eCy^`vzVZs~qoDq(CuZ$11rR0WT^(UAReB$2%s0lBr6!rhCGl3>RmtX&?D3JY>cm*6)sm~)BV zu)IN@JTYR6)OOK=14}{6P8UV=f8j(PVyc>R1*5}nP|t&IuyxE9L63F{nI7p*UpN#| zqo(T08TH3#?lWCB*WVky{*0%#5;k;K%VJcHH~?7w+tT1(!bY?#{Xz zs&UnvY|5OC4K{&T_BE5d8>uF++Ib6p**22dTm7N;c$gqRz6F{d#-WnqdvYSgR9G8_ zsP3+h`weE}E2mmg*Ea^Y?bHAhttHsxLZNwzB|jI+wn<)l7vuNVf!ngp@Ia}Kib@~G z!F#f(B3cE{4fP;JSn*Tf7 z{RL~-;PmmF$Mi4we2F{C6^06x|J%g6jf0rd!!!8Pcr@Acisz#~AHyyAwHTfLEyK}@ zb}VQyu(4mSqFUWV&Ns{qu8eqLyG^_uRSZHg*t(i7+Wm&6t$%=j51nF~8!Iv2uaumr z3Bbg4d9=#Lm6fQ7vYnoU4$S56AYM;#RpVX=m^c-eY9)~B);jvzY%87VFa`yGSJTgN zS-8G=zA!mkiq6hm4-XGL6dJFb%4&xy;B3)J)@3V7_a(j|SCUnj+9h?=!xAhca_q#X zA@I~bjGZ4{=_c2;*e9pPlt;WGKRUJO`-;^VEBz5p_NqevHb*G;x`S$u%^@wqnE75# zAUA}W&^|&Pij`CFYsNUzG37lzKJSH5CKFiQ+d`P#+<|sRU*N7OaN>0`{0+E3+KMRhj`H_$nE$^3M}}X z(~K|hetRdb4^Ac{D~oZC{bBHExrrmcZ(*PBd=S(;6vsI&Pq9M4zby-cpl4>3V46)P z_RcM!6<33Cbkah6l{X4@8Q5|XAxFtlK9}9ZjOc~Iw;DZj0CLb@7d0sJK4?D0unzZ2)Y!NS%7N^QY&L5d=C3=oI0$O&4B0*9oF*6 z5;qr}!S`3^*}nOE6x!N;2wLMu;nbBqbjC+#`oqf@|E<;&n(X(%_WU4HeIN#`_D2t4oa-dihM%=nZZsn%nGv&8% zN~IGDwA%22q7k?A1UE}%0xHWL1@2}MYQCO^ zYZ^w_e!Ubymu3w^_EIzMKUo>h!(=opJ$xM7T`8V=E{o%T`FxS#O7Si%MRW4;$X&4O{e)w?!_nne6u3Ej z1V7(&OiVt_`L8O&&-07%VV({;cL_2l4=;qM4_vS(r*X>^*5V-^L%HJ5bWS1k**2_s?78d>gv{0Fcb4ug|A zG1wDcjCCV_K%Dzun<8J!%Fg|Utn*n7{Uk<0=d;fvncN@<5 zXA_^1mLYN_mgp~+Po%Bh!_Nh~=%j#bqAj#U-{r9odiN<*<|M(putLZ*O2qG0LHK9% z97xrghqOEi4;HNDWGo-k;J7sq((DQP8Pe!+#vWEW5Ksu_cLm=$9J+W2yZ+kPwx7-6 z9etIUHoJy=E4l^4@_*2)Gk`u&w&cD)Q{Yy4)?w7*PZ&FV4ZFhg(R}z8{+ZoQY%`+J zu~!9@ugoBiuG;}mIwCn)XXx@UeXOrs0#?c{EcqA*NBKM5)m=u!d+asA5&p0pyGD-P z({&bZTDpNdoa&B;ZVK^+Y&Z>FXb0~X%|xsF^K29~ZVEICC-SpvHC(u}n2taH4sYwU z(6Ntx(x?CSLferw_*uaRbvi>qE+05shgj%4y9`n`+@lKfEx3l=9`wfZ7xdA^QE1w! z&Gs+kIYX=ek-+g=$-$GdEbxvCC$(OiCD!{wcg}yT-OE6@$sz?c7u`nT2wj+r|1oFY zcfaxr&k$Ye31X)A=tll;$~gZFo>|lf|M74CJz8sVf;!K-ej>xvC!c^@BX>~^TL*4_ z{unl5bOBwGe-+$6^<(u#P3AoN3(R#9L&F{qe10K}dc11`ja`SJxw_RRUQQL(TLO1P z(g!0)jA5Vae&Kp&QKr@=${F;X0gLQxcyMePCqCsIax)CL_2s? zPb86ooyl}3*FrkIMTo8YFB+)RPny*mX~Vk`FwDOV7iwnWkfc6rX(>nfm7cIEYzm|t zDaYrZrwMkrXmYI)SIOo(0ub5Hzc1vALB-LE7T;H8(P{x$d*u=x!#lD@td4|R(w3Zy z?+KyCxa*+XQ48FC0sMaC2A}zNwD|BExH>W!oZ~Ozex3ag6yGGAW@W>~#9~2Z-eG*w zVS+P$J*7|61<=E@eDv>ps;qrfj)(1}*pC%jaGmLa-(qJ7i0UF)Hy?moDbJhu?m{;H zki%G&ogh(`0+9yE^uahq&MWwQrM|)&Sarcm$UB#5gM2Nn{yd4@+8QrR5;YY5xV)G} zeR)PqCmm!9rPHAlo}m_PC0Cyo<7PS=gXw#eI`05e>{D>p@;H()P6noax&ht_LDmC9m3kfO$g*v}&gNjK4I?&Zons?Qc~`$p-IBNrnr!b+XaW1h1fyBo{* z3KYK(!R8bApJ^7#8f=8Tm;Hj1Qd2no$jb(g@Nf3&0#LAePAZqjlkcN+ zQ2Z0ps~MBgv0j=hN-nouvSKO=&1eHLo*^=4-3;!a_W|ga=%Wfj2HcF7(%e&x6>$FK zbbN61D!5Ko66_1ihTqc#pf;V)l{Q@?7gRoy($7iQ=4QriEON&w{lyp@8$}v|qlM(G z6FLkYp|`Gu;J%Vps4sYpaN{LS4@`x3$3Mf2LMiN0Rsp@$W4X|GzTCTM@?5upKIio5 zI_b_|0rtIOl_4opbD0uN8l-NLG#D}@rQzD^+=*0*Qpw#&rb@bR zl;+gCpXd4VJjeSU@9})OzN~%heO$+}_PN$x=l}ov)8|pDe9J@&oS@=?nMY1BrgpJ7 zZlV#J9dFEc3CzTVDSBl2A8X;+E@ZZ78t|Vy`fyG~0-ElT<aJ6^eq}iZ;IvE^|QhRt!gX25B^)ocO1+6O^icTw;3d6{V?)%NC9s8IFHzul#y{u zK9LX1QZREJ2M+P(e7{jCK5cO1XZW8XW;O*>ea1sj%kscKN)y3he+bMjji-L|l5k;~ z4z%4F#xG>_`R_+;AwM)87WfYkiTtUo+hi9SC_aL^#k#CTr6u;i`Al6@Skx2t%qHHK zV0mjI7&!{8k!U-Ad3+<7b>Lx=V{_8+L6I@f)aIjvttncS zj^?)?G~&mYrjd@PEVktx1O53ic=GS*SRtv+n@B$A8nXm0dr=sz$WFkIFIsVX#5ne) zTQ%-3(uBn4a&#Nc<;8Ux?0~>5dfVJbpESOOro{kVB1N=u-Q`rU_$nR`n@7SQexj*k z1U>6!U;aUA2d!>(g33TkD2)ML_ue;X(n`mmtXzoRlLEebp8~V(2CX@w$QH~|U`q!L z`7bw|_~)@97(Bj^YOSJV2UkY-rV3uxr|MvEjtK0A-Ar}EJR%e1jH>cyz_8Peub*Va zt173GL*K@+_IJaO4L*zMcDr$3zi;0_#(2!9rpY8TMqG z)6cR9xKVbNPVE$WVFvN|`i&=vnB)OVTuVS%PXU_z4?)IfO=vE^NoUu!2>gmxl-ZMp zS1K3-igsd_&NW8bu18|K;Q+aT8O54{|0)Q-ut# z9;}wqV(YR`;-lyQs**O0|HJVVYN__2QP*Zj^DM!+0xS4)t_g1;aPKCUPlXGEB8+Vr zNvNJa+i=($_FVDB$py!W*!w()$Z>M3@D&LzF=dmc>avR}?+9l#39zGC1(aWn<&U;F zp=59&&AMERhSv!g?sA0rRXozYZrEJXg})LyvF(pp+^)KI+UKIcTFITl0`Vcg`FQRo>Kam|;2{OLseCC+5nAz)1{TM^g`B;ccoEkvgund~VEr%^K zd-#$tS<>`52rg;Q;mpr0hRw%B;QxL!yLMOtn|f{oJ}mwXHMiyxjUSWv--?=a+Ym|$ zRKl3gzAE71sUxfhE7|k{DS-izg)d@mi!V3Tsf**S7iPU8tHe64oA9MHP;SZ`Px^M?hD$Ae>CgD;mcRcY-feq-3hnLkR z=N{!SO(mB|#*@E*JEku21Ez!jE`b z?bg$Bg%RBIXPd99f^WfDo;vuJz5|!5HMDBncbWHOTJfu2ogD&uwHy_0_ z`(25P;oqc1?UdMhyELoO9|pBnF9lZ4Vl4PEm%IyVgu}vqZ+xQ{dATSTCfk0te`#Ea z2}RYoWkdkR^A`M-r9bJ+@)G80jXLkVV?Q2G8NxUI?njp-H@b1vZA2y-y>hf+t)(`< zxBVv3S@{qRo071|dLs_zO%g}zbVHV_Dlsza#?z*_BJg*qdHWmPoSl-_i4vMJE3Q;hf62@MIOg@;HX45^nZJu znza-&@xSCa6^F}kC?W+1%|C*)Ya7Pd%%F*e@~okWyiiy5sG$Mklf_l!&gyl1h_({O zt_y>Usn20`)k2y(`V>hDjezS{cJj6Bt#PgG2<$o#$X{=`i(AW6LA%z2Rd^w2oE+lm z1&>Cj{R4H_eqkY-+CLnn*S^Kg**oErD1|n(2svWuqp|C}3zt!B>iEU!5;+pP0M_a& zK}x|r5E*>I>|2Lnrh5y?N)O;Zs02BE7W&icGA?m-uos_vXu|D};>p>LTjI=bNf253 znno>BBTGAH;MdrRLWXq(hL@*6L82yIr`~`)n{E)}z(J^mPsk2ZqWLxnQ#=h|U8XFZ z^eG$Kql|IH!UIAdB8zlwuZD5QEm@6}D6EuRMb62(^2>foqTw(lT2^q0{s_*ci=WNH z-iocLHnRrBq3Q zpHmN&$v8hu&TaQttcc#e4Nw zWR#4eJ_crn%)~WM_krqbZ!~Eh%P$>JhEY@fV0vo;Xb;ZkYehz>8g2*d4eThcEHlf*uWG$`paO&wuw}C zrY671_zn(8DDveg(yW*2pS1td4fqk=j$e9euzyJizqK?KA6RR!n>LnFAL&l?u89;p z_2ne+LI*M3-3s+IjM&Gm#=^WDvh~lsc(v*gjj20~aL*^*rFb z9NRGW##l609iXMt6G=tB6aTQlf$ig_u#b{A;~as3m{yt#+kNaX+QA)KD@FYL;X3?x zGYLGf>TUwuA8f+)H=i@M+#KF*_Z@m;^G`fE zPm7%(WS1ZD(8Q5v{CMkQ4`D^J18z$~qVdEAZb>=wofTI};m#A}e8Xe3_&t^Dsy+_m z{bLzp*|hu<@q#DJpt~Bs(PAsQo<4+H zbN2{2M*Z~e2wn1^ejNL2D~CUH7Vk9oB$!!)P`y`4D6$6v4f8Uo0&4B>w&T=oQ)BhTJB>ch`#t0J2Y`m+4CDtJD9E6qE3fys=K;M--JQ9fGm z5;7SW{{A?1mAl1wZrCk+GuxnxQ9Y(VEF$MltR;%MW>oXt6Iwb~kq;d+hCjAn6T@Zz zSy?upZZf|Puczo?!}d4mxQzq9%wqIk6+}lenNGI^);Yh@o{YHlh)lK(W6ks5k*Lvy zcyzT4`j0t-?GEa^=_MJ3cu5t>sb*_LG3z6v!UKXLS8TNS=Wl>$&5Fnsq9}`K(Yk=u zfg43p(H7PgL7{=s?(s71ibpv^>oYV)^*-$$v5PiI)sZjzRf*k%TG}Hwl%DsK1r|;c zCbJl5gg2>gR|5H5F}*NRFs(M0GcKR~$WBvhDjz=_T78F;IZ4+^(mpNFu++pW-}~wL zhByomFT*BFS-dvw4z2X7q4^s$sMoQJbkf87WN>dUV-~xPB&aIks#UVsq3=#xY^~|5 zS|^(MzKNPRXOoH#3|;i?lUVI_J~dn52l7K)NZVvx^S&&JH<7!bo=TMsvvus<{pzF4p)a` z>s)<|inD>^tKX5Fxnt4$(g-r%N*@Y44Ct%n(}9{MGsOHdb^T$C-7O!SoRjy^iOU=y z=h!=%Qag)#FKffOsZT-sM+^+PE<;VHC`c+u2@_{hU~o)m_3JrR!6Q1hz?y95$LYa@JOC_-mAl#ataDk|C)XOz}#jpXYy=(@A z|5*rICe0BKG~A`-!P=zgj5O-Vcyl&c6r5u((!{m|>NV%zKA^*fAEDPgdraU@N+$3Jojw)$Jn)^j}bxFaVg=5iTu|K3rE0fBp679P)uUd-Ln97e%PMSV7GI{8`K|Yg7cIZ8(^?sZ{ zVL!?gjTnVp2@~m#^GhK2sXaI8Y#3*(q7Lz6meS#eWw;69lJwN9n^aro2JuQ(fj9S> zps6kol&AQTr>5%Us!-+?&$awfC?W<1$5=!oAGti{V3m8i&hC=S@4 zC(d1gD2{q2zHRuHDQHfnM};q>KJPO$r$UKbz7kG3>kuKqZjz%!T#$p(4ok|K1mNtV z<6OGU4tmJuAWe4(6W3q3kF!E7#qYO_#N-J#2>GT&k}M{1a~h|?ZEg)rYEY!M+-Y&| zg5z*~)g_4jYR)oHgXR2D`^*RFQJTugF2N`*JZ>vo-&8N3(D{`Lvo+BhT@w?s9jeE(_T|gT6?#N zi+_zKGPw*h?VKf(_w_7AyK^|C{V`V*Th1+u*hN-q=Fp;|^*E!kh|4ZW6Np_&q$hSV zNmDYx&`?dLQ;SpJ>;B2C{#3MW-)*#o35f3Y||0 zqH$+8;-f4Q{M{B4f4!o{>jXN_Lj|g$y3;A``4S-kN?o8%>_m+mCHzrwlh(V8X40I! z8T)2WNBNFqvh$QFk=b(*~yxmN^pX`wxVogP;`K$+6YBe1xdA`it=i*L4h&BA&OE83PIY6!{UTh@*m}JO>9JvC`wIH zQ9-y&Mi`Y08l|WdA&Q8M+9(vlO``u8nxLrmZ-w(;e<}L^dWKYxnWFChx-=j%HfC*X oOh9x<;M)JZvAv?+3Q>$GDk5}^P>n-_|Ghr{e~+0er84Ay0DQ<)<^TWy literal 74869 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 diff --git a/Project/Assets/ML-Agents/Examples/3DBall/TFModels/3DBall.onnx.meta b/Project/Assets/ML-Agents/Examples/3DBall/TFModels/3DBall.onnx.meta index a0e2fa478c..bb39caabbd 100644 --- a/Project/Assets/ML-Agents/Examples/3DBall/TFModels/3DBall.onnx.meta +++ b/Project/Assets/ML-Agents/Examples/3DBall/TFModels/3DBall.onnx.meta @@ -8,4 +8,3 @@ ScriptedImporter: assetBundleName: assetBundleVariant: script: {fileID: 11500000, guid: 683b6cb6d0a474744822c888b46772c9, type: 3} - optimizeModel: 1 diff --git a/Project/Assets/ML-Agents/Examples/3DBall/TFModels/3DBallHard.onnx b/Project/Assets/ML-Agents/Examples/3DBall/TFModels/3DBallHard.onnx index 03b73eef700fa81e100f9eaa95453b0a505ae825..43eb587156f7cda07115a504eb9a052e44a3aba8 100644 GIT binary patch literal 97163 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 literal 93825 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
(); - asset.modelAssetData = ScriptableObject.CreateInstance(); - asset.modelAssetData.value = rawModel; + // asset.modelAssetData = ScriptableObject.CreateInstance(); + // asset.modelAssetData.value = rawModel; return asset; } diff --git a/Project/Assets/ML-Agents/Examples/Soccer/Prefabs/SoccerFieldTwos.prefab b/Project/Assets/ML-Agents/Examples/Soccer/Prefabs/SoccerFieldTwos.prefab index 460cf720a0..aad5182d9c 100644 --- a/Project/Assets/ML-Agents/Examples/Soccer/Prefabs/SoccerFieldTwos.prefab +++ b/Project/Assets/ML-Agents/Examples/Soccer/Prefabs/SoccerFieldTwos.prefab @@ -23,6 +23,7 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 3521400} + serializedVersion: 2 m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} @@ -31,7 +32,6 @@ Transform: - {fileID: 1730970187} - {fileID: 1013497680} m_Father: {fileID: 257899726} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &25743880 GameObject: @@ -57,13 +57,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 25743880} + serializedVersion: 2 m_LocalRotation: {x: 0, y: -0.5, z: 0, w: 0.8660254} m_LocalPosition: {x: -1446, y: 176, z: 641} m_LocalScale: {x: 100, y: 100, z: 100} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 1013497680} - m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: -60, z: 0} --- !u!65 &25743882 BoxCollider: @@ -110,13 +110,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 129409745} + serializedVersion: 2 m_LocalRotation: {x: 0, y: -0.5, z: 0, w: 0.8660254} m_LocalPosition: {x: -1446, y: 176, z: 641} m_LocalScale: {x: 100, y: 100, z: 100} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 1730970187} - m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: -60, z: 0} --- !u!65 &129409747 BoxCollider: @@ -165,13 +165,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 159982127} + serializedVersion: 2 m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: -1400, y: 0, z: 0} m_LocalScale: {x: 300, y: 10, z: 1200} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 257899726} - m_RootOrder: 13 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!33 &159982131 MeshFilter: @@ -219,6 +219,8 @@ MeshRenderer: m_ReflectionProbeUsage: 1 m_RayTracingMode: 2 m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: @@ -269,13 +271,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 166240760} + serializedVersion: 2 m_LocalRotation: {x: 0, y: -0, z: -0, w: 1} m_LocalPosition: {x: -0.000061035156, y: 1, z: 0.000061035156} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 257899726} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!33 &166240763 MeshFilter: @@ -302,6 +304,8 @@ MeshRenderer: m_ReflectionProbeUsage: 1 m_RayTracingMode: 2 m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: @@ -354,6 +358,7 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 257899725} + serializedVersion: 2 m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 0.01, y: 0.01, z: 0.01} @@ -375,7 +380,6 @@ Transform: - {fileID: 159982128} - {fileID: 784958407} m_Father: {fileID: 4558743310993102} - m_RootOrder: 6 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!33 &257899730 MeshFilter: @@ -402,6 +406,8 @@ MeshRenderer: m_ReflectionProbeUsage: 1 m_RayTracingMode: 2 m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: @@ -505,13 +511,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 309062024} + serializedVersion: 2 m_LocalRotation: {x: -0, y: 0.49999917, z: -0, w: 0.86602587} m_LocalPosition: {x: 1446, y: 176, z: 641} m_LocalScale: {x: 100, y: 100, z: 100} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 1013497680} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 60.000004, z: 0} --- !u!65 &309062026 BoxCollider: @@ -558,13 +564,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 459835897} + serializedVersion: 2 m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 176, z: 775} m_LocalScale: {x: 100, y: 100, z: 100} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 1730970187} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!65 &459835899 BoxCollider: @@ -613,13 +619,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 601292579} + serializedVersion: 2 m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 1400, y: 0, z: 0} m_LocalScale: {x: 300, y: 10, z: 1200} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 257899726} - m_RootOrder: 12 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!33 &601292583 MeshFilter: @@ -667,6 +673,8 @@ MeshRenderer: m_ReflectionProbeUsage: 1 m_RayTracingMode: 2 m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: @@ -716,13 +724,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 695073581} + serializedVersion: 2 m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 176, z: 775} m_LocalScale: {x: 100, y: 100, z: 100} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 1013497680} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!65 &695073583 BoxCollider: @@ -770,13 +778,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 740089992} + serializedVersion: 2 m_LocalRotation: {x: 0, y: -0, z: -0, w: 1} m_LocalPosition: {x: -1643.9795, y: 186.06555, z: 0.49998474} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 257899726} - m_RootOrder: 7 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!33 &740089995 MeshFilter: @@ -803,6 +811,8 @@ MeshRenderer: m_ReflectionProbeUsage: 1 m_RayTracingMode: 2 m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: @@ -852,13 +862,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 784958406} + serializedVersion: 2 m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 425, z: 0} m_LocalScale: {x: 100, y: 100, z: 100} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 257899726} - m_RootOrder: 14 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!65 &784958408 BoxCollider: @@ -907,13 +917,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 809268601} + serializedVersion: 2 m_LocalRotation: {x: 0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 1650, y: -25, z: -0.000015258789} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 257899726} - m_RootOrder: 5 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!33 &809268605 MeshFilter: @@ -940,6 +950,8 @@ MeshRenderer: m_ReflectionProbeUsage: 1 m_RayTracingMode: 2 m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: @@ -1011,13 +1023,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 868835399} + serializedVersion: 2 m_LocalRotation: {x: 0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 1640.98, y: 186.06555, z: -0.50001526} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 257899726} - m_RootOrder: 9 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!33 &868835402 MeshFilter: @@ -1044,6 +1056,8 @@ MeshRenderer: m_ReflectionProbeUsage: 1 m_RayTracingMode: 2 m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: @@ -1094,13 +1108,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 901290776} + serializedVersion: 2 m_LocalRotation: {x: 0, y: -0, z: -0, w: 1} m_LocalPosition: {x: -774.99994, y: 175, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 257899726} - m_RootOrder: 10 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!33 &901290780 MeshFilter: @@ -1127,6 +1141,8 @@ MeshRenderer: m_ReflectionProbeUsage: 1 m_RayTracingMode: 2 m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: @@ -1176,13 +1192,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 905539299} + serializedVersion: 2 m_LocalRotation: {x: -0, y: 0.49999917, z: -0, w: 0.86602587} m_LocalPosition: {x: 1446, y: 176, z: 641} m_LocalScale: {x: 100, y: 100, z: 100} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 1730970187} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 60.000004, z: 0} --- !u!65 &905539301 BoxCollider: @@ -1231,13 +1247,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 971710691} + serializedVersion: 2 m_LocalRotation: {x: 0, y: -0, z: -0, w: 1} m_LocalPosition: {x: -1650, y: -25, z: -0.000015258789} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 257899726} - m_RootOrder: 4 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!33 &971710695 MeshFilter: @@ -1264,6 +1280,8 @@ MeshRenderer: m_ReflectionProbeUsage: 1 m_RayTracingMode: 2 m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: @@ -1333,6 +1351,7 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1013497679} + serializedVersion: 2 m_LocalRotation: {x: -0, y: -1, z: -0, w: 0.0000021010635} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} @@ -1342,7 +1361,6 @@ Transform: - {fileID: 309062025} - {fileID: 25743881} m_Father: {fileID: 3521401} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: -180.00002, z: 0} --- !u!1 &1420281427 GameObject: @@ -1373,13 +1391,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1420281427} + serializedVersion: 2 m_LocalRotation: {x: 0, y: -0, z: -0, w: 1} m_LocalPosition: {x: -1650, y: 192.0061, z: -0.000015258789} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 257899726} - m_RootOrder: 6 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!33 &1420281434 MeshFilter: @@ -1406,6 +1424,8 @@ MeshRenderer: m_ReflectionProbeUsage: 1 m_RayTracingMode: 2 m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: @@ -1539,6 +1559,7 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1730970186} + serializedVersion: 2 m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} @@ -1548,7 +1569,6 @@ Transform: - {fileID: 905539300} - {fileID: 129409746} m_Father: {fileID: 3521401} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1867830918 GameObject: @@ -1575,13 +1595,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1867830918} + serializedVersion: 2 m_LocalRotation: {x: 0, y: -0, z: -0, w: 1} m_LocalPosition: {x: -0, y: 272.05, z: -607.00037} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 257899726} - m_RootOrder: 3 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!33 &1867830922 MeshFilter: @@ -1608,6 +1628,8 @@ MeshRenderer: m_ReflectionProbeUsage: 1 m_RayTracingMode: 2 m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: @@ -1662,13 +1684,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 2036291519} + serializedVersion: 2 m_LocalRotation: {x: 0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 1647, y: 192.0061, z: -0.000015258789} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 257899726} - m_RootOrder: 8 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!33 &2036291526 MeshFilter: @@ -1695,6 +1717,8 @@ MeshRenderer: m_ReflectionProbeUsage: 1 m_RayTracingMode: 2 m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: @@ -1830,13 +1854,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 2075395421} + serializedVersion: 2 m_LocalRotation: {x: 0, y: -0, z: -0, w: 1} m_LocalPosition: {x: -0, y: 272.05, z: 607.00037} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 257899726} - m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!33 &2075395425 MeshFilter: @@ -1863,6 +1887,8 @@ MeshRenderer: m_ReflectionProbeUsage: 1 m_RayTracingMode: 2 m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: @@ -1913,13 +1939,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 2091312081} + serializedVersion: 2 m_LocalRotation: {x: 0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 775, y: 175, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 257899726} - m_RootOrder: 11 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!33 &2091312085 MeshFilter: @@ -1946,6 +1972,8 @@ MeshRenderer: m_ReflectionProbeUsage: 1 m_RayTracingMode: 2 m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: @@ -1995,13 +2023,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1032056389038868} + serializedVersion: 2 m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0.15} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 4991109413118678} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!20 &20622362340627540 Camera: @@ -2079,6 +2107,7 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1083582452036196} + serializedVersion: 2 m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} @@ -2090,7 +2119,6 @@ Transform: - {fileID: 4222051823283070} - {fileID: 4671048899227928} m_Father: {fileID: 4444285537983296} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!33 &33298283473714412 MeshFilter: @@ -2117,6 +2145,8 @@ MeshRenderer: m_ReflectionProbeUsage: 1 m_RayTracingMode: 2 m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: @@ -2172,6 +2202,7 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1095606497496374} + serializedVersion: 2 m_LocalRotation: {x: 0, y: -0.7071068, z: 0, w: 0.7071068} m_LocalPosition: {x: 3.19, y: 0.5, z: 1.2} m_LocalScale: {x: 1, y: 1, z: 1} @@ -2180,7 +2211,6 @@ Transform: - {fileID: 4540034559941056} - {fileID: 2148914632064875291} m_Father: {fileID: 4558743310993102} - m_RootOrder: 3 m_LocalEulerAnglesHint: {x: 0, y: -90, z: 0} --- !u!54 &54348679551516588 Rigidbody: @@ -2252,7 +2282,7 @@ MonoBehaviour: VectorActionDescriptions: [] VectorActionSpaceType: 0 hasUpgradedBrainParametersWithActionSpec: 1 - m_Model: {fileID: 5022602860645237092, guid: 8cd4584c2f2cb4c5fb51675d364e10ec, type: 3} + m_Model: {fileID: 5022602860645237092, guid: 4a201d889faed439cbb658435bd68b98, type: 3} m_InferenceDevice: 2 m_BehaviorType: 0 m_BehaviorName: SoccerTwos @@ -2368,13 +2398,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1101518129530804} + serializedVersion: 2 m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0.15} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 4540034559941056} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!20 &20243662707170704 Camera: @@ -2457,6 +2487,7 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1131626411948014} + serializedVersion: 2 m_LocalRotation: {x: 0, y: 0.7071068, z: 0, w: 0.7071068} m_LocalPosition: {x: -3.19, y: 0.5, z: 1.2} m_LocalScale: {x: 1, y: 1, z: 1} @@ -2465,7 +2496,6 @@ Transform: - {fileID: 4991109413118678} - {fileID: 4942358209803819540} m_Father: {fileID: 4558743310993102} - m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 90, z: 0} --- !u!54 &54609996481602788 Rigidbody: @@ -2537,7 +2567,7 @@ MonoBehaviour: VectorActionDescriptions: [] VectorActionSpaceType: 0 hasUpgradedBrainParametersWithActionSpec: 1 - m_Model: {fileID: 5022602860645237092, guid: 8cd4584c2f2cb4c5fb51675d364e10ec, type: 3} + m_Model: {fileID: 5022602860645237092, guid: 4a201d889faed439cbb658435bd68b98, type: 3} m_InferenceDevice: 2 m_BehaviorType: 0 m_BehaviorName: SoccerTwos @@ -2653,6 +2683,7 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1141134673700168} + serializedVersion: 2 m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} @@ -2666,7 +2697,6 @@ Transform: - {fileID: 5643284048999299831} - {fileID: 257899726} m_Father: {fileID: 0} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!114 &8122248192225965164 MonoBehaviour: @@ -2725,13 +2755,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1366507812774098} + serializedVersion: 2 m_LocalRotation: {x: -0, y: -0, z: -0.036135223, w: 0.999347} m_LocalPosition: {x: 0, y: 0.341, z: 0} m_LocalScale: {x: 1.0441425, y: 0.19278127, z: 1.0441422} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 4540034559941056} - m_RootOrder: 4 m_LocalEulerAnglesHint: {x: 0, y: 0, z: -4.142} --- !u!33 &33201643863918062 MeshFilter: @@ -2758,6 +2788,8 @@ MeshRenderer: m_ReflectionProbeUsage: 1 m_RayTracingMode: 2 m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: @@ -2806,13 +2838,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1383518430785328} + serializedVersion: 2 m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 4558743310993102} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1557392375314408 GameObject: @@ -2839,13 +2871,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1557392375314408} + serializedVersion: 2 m_LocalRotation: {x: -0, y: 1, z: -0, w: 0} m_LocalPosition: {x: 0.29999995, y: 0.07399994, z: 0.50040054} m_LocalScale: {x: 0.29457998, y: 0.29457998, z: 0.29457998} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 4991109413118678} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 180, z: 0} --- !u!33 &33462524524189736 MeshFilter: @@ -2872,6 +2904,8 @@ MeshRenderer: m_ReflectionProbeUsage: 1 m_RayTracingMode: 2 m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: @@ -2922,13 +2956,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1623838202568698} + serializedVersion: 2 m_LocalRotation: {x: -0, y: 1, z: -0, w: 0} m_LocalPosition: {x: 0, y: -0.18299997, z: 0.50040054} m_LocalScale: {x: 0.27602, y: 0.042489994, z: 0.13891} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 4991109413118678} - m_RootOrder: 3 m_LocalEulerAnglesHint: {x: 0, y: 180, z: 0} --- !u!33 &33079734303900652 MeshFilter: @@ -2955,6 +2989,8 @@ MeshRenderer: m_ReflectionProbeUsage: 1 m_RayTracingMode: 2 m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: @@ -3008,13 +3044,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1682753582128710} + serializedVersion: 2 m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0.5, z: 0} m_LocalScale: {x: 0.015, y: 0.015, z: 0.015} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 4558743310993102} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!33 &33063578823143084 MeshFilter: @@ -3041,6 +3077,8 @@ MeshRenderer: m_ReflectionProbeUsage: 1 m_RayTracingMode: 2 m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: @@ -3155,13 +3193,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1817598442362300} + serializedVersion: 2 m_LocalRotation: {x: -0, y: -0, z: 0.016506119, w: 0.9998638} m_LocalPosition: {x: 0, y: 0.341, z: 0} m_LocalScale: {x: 1.0441425, y: 0.19278127, z: 1.0441422} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 4991109413118678} - m_RootOrder: 4 m_LocalEulerAnglesHint: {x: 0, y: -179.99998, z: 1.8920001} --- !u!33 &33400024424252764 MeshFilter: @@ -3188,6 +3226,8 @@ MeshRenderer: m_ReflectionProbeUsage: 1 m_RayTracingMode: 2 m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: @@ -3238,6 +3278,7 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1836679221278734} + serializedVersion: 2 m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} @@ -3249,7 +3290,6 @@ Transform: - {fileID: 4874120150569100} - {fileID: 4266272446237730} m_Father: {fileID: 4277721046484044} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!33 &33174308205182346 MeshFilter: @@ -3276,6 +3316,8 @@ MeshRenderer: m_ReflectionProbeUsage: 1 m_RayTracingMode: 2 m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: @@ -3326,13 +3368,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1841872787705274} + serializedVersion: 2 m_LocalRotation: {x: -0, y: 1, z: -0, w: 0} m_LocalPosition: {x: 0.29999995, y: 0.07399994, z: 0.50040054} m_LocalScale: {x: 0.29457998, y: 0.29457998, z: 0.29457998} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 4540034559941056} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 180, z: 0} --- !u!33 &33223661134341430 MeshFilter: @@ -3359,6 +3401,8 @@ MeshRenderer: m_ReflectionProbeUsage: 1 m_RayTracingMode: 2 m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: @@ -3409,13 +3453,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1931023723143276} + serializedVersion: 2 m_LocalRotation: {x: -0, y: 1, z: -0, w: 0} m_LocalPosition: {x: 0, y: -0.18299997, z: 0.50040054} m_LocalScale: {x: 0.27602, y: 0.042489994, z: 0.13891} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 4540034559941056} - m_RootOrder: 3 m_LocalEulerAnglesHint: {x: 0, y: 180, z: 0} --- !u!33 &33486671041495046 MeshFilter: @@ -3442,6 +3486,8 @@ MeshRenderer: m_ReflectionProbeUsage: 1 m_RayTracingMode: 2 m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: @@ -3492,13 +3538,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1933336248964008} + serializedVersion: 2 m_LocalRotation: {x: -0, y: 1, z: -0, w: 0} m_LocalPosition: {x: -0.29999995, y: 0.07399994, z: 0.50040054} m_LocalScale: {x: 0.29457998, y: 0.29457998, z: 0.29457998} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 4540034559941056} - m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 180, z: 0} --- !u!33 &33689349573892708 MeshFilter: @@ -3525,6 +3571,8 @@ MeshRenderer: m_ReflectionProbeUsage: 1 m_RayTracingMode: 2 m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: @@ -3575,13 +3623,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1988976889579366} + serializedVersion: 2 m_LocalRotation: {x: -0, y: 1, z: -0, w: 0} m_LocalPosition: {x: -0.29999995, y: 0.07399994, z: 0.50040054} m_LocalScale: {x: 0.29457998, y: 0.29457998, z: 0.29457998} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 4991109413118678} - m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 180, z: 0} --- !u!33 &33422890814875164 MeshFilter: @@ -3608,6 +3656,8 @@ MeshRenderer: m_ReflectionProbeUsage: 1 m_RayTracingMode: 2 m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: @@ -3657,13 +3707,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 736576636681813138} + serializedVersion: 2 m_LocalRotation: {x: 0, y: 1, z: 0, w: 0} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 5643284048999299831} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 180, z: 0} --- !u!114 &7548069788310921501 MonoBehaviour: @@ -3723,13 +3773,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 742736642297762088} + serializedVersion: 2 m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0.15} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 4355548278584398525} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!20 &5360408467290783020 Camera: @@ -3806,13 +3856,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1897170901855235213} + serializedVersion: 2 m_LocalRotation: {x: 0, y: 1, z: 0, w: 0} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 4444285537983296} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 180, z: 0} --- !u!114 &796105769966339250 MonoBehaviour: @@ -3872,13 +3922,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 2016057044266316337} + serializedVersion: 2 m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0.15} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 3493354028456101517} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!20 &7679702203014927471 Camera: @@ -3956,13 +4006,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 2329918556726399591} + serializedVersion: 2 m_LocalRotation: {x: -0, y: 1, z: -0, w: 0} m_LocalPosition: {x: -0.29999995, y: 0.07399994, z: 0.50040054} m_LocalScale: {x: 0.29457998, y: 0.29457998, z: 0.29457998} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 3493354028456101517} - m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 180, z: 0} --- !u!33 &3272648336714276914 MeshFilter: @@ -3989,6 +4039,8 @@ MeshRenderer: m_ReflectionProbeUsage: 1 m_RayTracingMode: 2 m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: @@ -4039,13 +4091,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 2909838886639257826} + serializedVersion: 2 m_LocalRotation: {x: -0, y: -0, z: 0.016506119, w: 0.9998638} m_LocalPosition: {x: 0, y: 0.341, z: 0} m_LocalScale: {x: 1.0441425, y: 0.19278127, z: 1.0441422} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 3493354028456101517} - m_RootOrder: 4 m_LocalEulerAnglesHint: {x: 0, y: -179.99998, z: 1.8920001} --- !u!33 &5705175531533507764 MeshFilter: @@ -4072,6 +4124,8 @@ MeshRenderer: m_ReflectionProbeUsage: 1 m_RayTracingMode: 2 m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: @@ -4121,13 +4175,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 4407673136905670519} + serializedVersion: 2 m_LocalRotation: {x: -0, y: 1, z: -0, w: 0} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 7843730402782877929} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 180, z: 0} --- !u!114 &217286280874173272 MonoBehaviour: @@ -4188,13 +4242,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 4599713170205044794} + serializedVersion: 2 m_LocalRotation: {x: -0, y: 1, z: -0, w: 0} m_LocalPosition: {x: 0, y: -0.18299997, z: 0.50040054} m_LocalScale: {x: 0.27602, y: 0.042489994, z: 0.13891} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 3493354028456101517} - m_RootOrder: 3 m_LocalEulerAnglesHint: {x: 0, y: 180, z: 0} --- !u!33 &4119411769362767890 MeshFilter: @@ -4221,6 +4275,8 @@ MeshRenderer: m_ReflectionProbeUsage: 1 m_RayTracingMode: 2 m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: @@ -4271,6 +4327,7 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 6007240757639156798} + serializedVersion: 2 m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} @@ -4282,7 +4339,6 @@ Transform: - {fileID: 6439063416007821090} - {fileID: 3567543467983998314} m_Father: {fileID: 7843730402782877929} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!33 &6322537730689507644 MeshFilter: @@ -4309,6 +4365,8 @@ MeshRenderer: m_ReflectionProbeUsage: 1 m_RayTracingMode: 2 m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: @@ -4364,6 +4422,7 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 6257467487437560250} + serializedVersion: 2 m_LocalRotation: {x: 0, y: -0.7071068, z: 0, w: 0.7071068} m_LocalPosition: {x: 3.19, y: 0.5, z: -1.2} m_LocalScale: {x: 1, y: 1, z: 1} @@ -4372,7 +4431,6 @@ Transform: - {fileID: 4355548278584398525} - {fileID: 1271329604630503873} m_Father: {fileID: 4558743310993102} - m_RootOrder: 5 m_LocalEulerAnglesHint: {x: 0, y: -90, z: 0} --- !u!54 &1324273637967659108 Rigidbody: @@ -4444,7 +4502,7 @@ MonoBehaviour: VectorActionDescriptions: [] VectorActionSpaceType: 0 hasUpgradedBrainParametersWithActionSpec: 1 - m_Model: {fileID: 5022602860645237092, guid: 8cd4584c2f2cb4c5fb51675d364e10ec, type: 3} + m_Model: {fileID: 5022602860645237092, guid: 4a201d889faed439cbb658435bd68b98, type: 3} m_InferenceDevice: 2 m_BehaviorType: 0 m_BehaviorName: SoccerTwos @@ -4561,6 +4619,7 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 6442519122303792292} + serializedVersion: 2 m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} @@ -4572,7 +4631,6 @@ Transform: - {fileID: 8802067563818986573} - {fileID: 7605150222862474933} m_Father: {fileID: 5643284048999299831} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!33 &3534255588188033322 MeshFilter: @@ -4599,6 +4657,8 @@ MeshRenderer: m_ReflectionProbeUsage: 1 m_RayTracingMode: 2 m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: @@ -4649,13 +4709,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 7925489420550093475} + serializedVersion: 2 m_LocalRotation: {x: -0, y: 1, z: -0, w: 0} m_LocalPosition: {x: 0.29999995, y: 0.07399994, z: 0.50040054} m_LocalScale: {x: 0.29457998, y: 0.29457998, z: 0.29457998} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 3493354028456101517} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 180, z: 0} --- !u!33 &7272623948078999278 MeshFilter: @@ -4682,6 +4742,8 @@ MeshRenderer: m_ReflectionProbeUsage: 1 m_RayTracingMode: 2 m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: @@ -4732,13 +4794,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 8225820398989514451} + serializedVersion: 2 m_LocalRotation: {x: -0, y: 1, z: -0, w: 0} m_LocalPosition: {x: 0.29999995, y: 0.07399994, z: 0.50040054} m_LocalScale: {x: 0.29457998, y: 0.29457998, z: 0.29457998} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 4355548278584398525} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 180, z: 0} --- !u!33 &4888431171612470503 MeshFilter: @@ -4765,6 +4827,8 @@ MeshRenderer: m_ReflectionProbeUsage: 1 m_RayTracingMode: 2 m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: @@ -4815,13 +4879,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 8351168634331197049} + serializedVersion: 2 m_LocalRotation: {x: -0, y: 1, z: -0, w: 0} m_LocalPosition: {x: 0, y: -0.18299997, z: 0.50040054} m_LocalScale: {x: 0.27602, y: 0.042489994, z: 0.13891} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 4355548278584398525} - m_RootOrder: 3 m_LocalEulerAnglesHint: {x: 0, y: 180, z: 0} --- !u!33 &552518267806356677 MeshFilter: @@ -4848,6 +4912,8 @@ MeshRenderer: m_ReflectionProbeUsage: 1 m_RayTracingMode: 2 m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: @@ -4903,6 +4969,7 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 8360301818957399454} + serializedVersion: 2 m_LocalRotation: {x: 0, y: 0.7071068, z: 0, w: 0.7071068} m_LocalPosition: {x: -3.19, y: 0.5, z: -1.2} m_LocalScale: {x: 1, y: 1, z: 1} @@ -4911,7 +4978,6 @@ Transform: - {fileID: 3493354028456101517} - {fileID: 8224668928246715092} m_Father: {fileID: 4558743310993102} - m_RootOrder: 4 m_LocalEulerAnglesHint: {x: 0, y: 90, z: 0} --- !u!54 &648637983722350212 Rigidbody: @@ -4983,7 +5049,7 @@ MonoBehaviour: VectorActionDescriptions: [] VectorActionSpaceType: 0 hasUpgradedBrainParametersWithActionSpec: 1 - m_Model: {fileID: 5022602860645237092, guid: 8cd4584c2f2cb4c5fb51675d364e10ec, type: 3} + m_Model: {fileID: 5022602860645237092, guid: 4a201d889faed439cbb658435bd68b98, type: 3} m_InferenceDevice: 2 m_BehaviorType: 0 m_BehaviorName: SoccerTwos @@ -5100,13 +5166,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 8673569163220857793} + serializedVersion: 2 m_LocalRotation: {x: -0, y: -0, z: -0.036135223, w: 0.999347} m_LocalPosition: {x: 0, y: 0.341, z: 0} m_LocalScale: {x: 1.0441425, y: 0.19278127, z: 1.0441422} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 4355548278584398525} - m_RootOrder: 4 m_LocalEulerAnglesHint: {x: 0, y: 0, z: -4.142} --- !u!33 &8415410816520105838 MeshFilter: @@ -5133,6 +5199,8 @@ MeshRenderer: m_ReflectionProbeUsage: 1 m_RayTracingMode: 2 m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: @@ -5183,13 +5251,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 8902619455849538040} + serializedVersion: 2 m_LocalRotation: {x: -0, y: 1, z: -0, w: 0} m_LocalPosition: {x: -0.29999995, y: 0.07399994, z: 0.50040054} m_LocalScale: {x: 0.29457998, y: 0.29457998, z: 0.29457998} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 4355548278584398525} - m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 180, z: 0} --- !u!33 &2536558714243097673 MeshFilter: @@ -5216,6 +5284,8 @@ MeshRenderer: m_ReflectionProbeUsage: 1 m_RayTracingMode: 2 m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: @@ -5265,13 +5335,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 9136065168043485173} + serializedVersion: 2 m_LocalRotation: {x: 0, y: 1, z: 0, w: 0} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 4277721046484044} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 180, z: 0} --- !u!114 &4662000663245579659 MonoBehaviour: diff --git a/Project/Assets/ML-Agents/Examples/Soccer/Scenes/SoccerTwos.unity b/Project/Assets/ML-Agents/Examples/Soccer/Scenes/SoccerTwos.unity index 121c15111a..c2ece4f395 100644 --- a/Project/Assets/ML-Agents/Examples/Soccer/Scenes/SoccerTwos.unity +++ b/Project/Assets/ML-Agents/Examples/Soccer/Scenes/SoccerTwos.unity @@ -13,7 +13,7 @@ OcclusionCullingSettings: --- !u!104 &2 RenderSettings: m_ObjectHideFlags: 0 - serializedVersion: 9 + serializedVersion: 10 m_Fog: 0 m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} m_FogMode: 3 @@ -38,13 +38,12 @@ RenderSettings: m_ReflectionIntensity: 1 m_CustomReflection: {fileID: 0} m_Sun: {fileID: 0} - m_IndirectSpecularColor: {r: 0.44971454, g: 0.49977928, b: 0.5756385, a: 1} + m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1} m_UseRadianceAmbientProbe: 0 --- !u!157 &3 LightmapSettings: m_ObjectHideFlags: 0 serializedVersion: 12 - m_GIWorkflowMode: 1 m_GISettings: serializedVersion: 2 m_BounceScale: 1 @@ -67,9 +66,6 @@ LightmapSettings: m_LightmapParameters: {fileID: 0} m_LightmapsBakeMode: 1 m_TextureCompression: 1 - m_FinalGather: 0 - m_FinalGatherFiltering: 1 - m_FinalGatherRayCount: 256 m_ReflectionCompression: 2 m_MixedBakeMode: 2 m_BakeBackend: 0 @@ -184,13 +180,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 255077123} + serializedVersion: 2 m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 0} - m_RootOrder: 3 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1001 &296100289 PrefabInstance: @@ -360,10 +356,6 @@ PrefabInstance: propertyPath: m_Name value: SoccerFieldTwos objectReference: {fileID: 0} - - target: {fileID: 4558743310993102, guid: 54f3340298537426e96a6cc530e2d5d8, type: 3} - propertyPath: m_RootOrder - value: 4 - objectReference: {fileID: 0} - target: {fileID: 4558743310993102, guid: 54f3340298537426e96a6cc530e2d5d8, type: 3} propertyPath: m_LocalPosition.x value: 0 @@ -433,13 +425,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1009000883} + serializedVersion: 2 m_LocalRotation: {x: -0.25081208, y: 0.2871387, z: -0.07810445, w: -0.92116475} m_LocalPosition: {x: 25.6, y: 24.6, z: -34.5} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 0} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 90, y: 0, z: 0} --- !u!20 &1009000887 Camera: @@ -725,13 +717,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1574236047} + serializedVersion: 2 m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 0} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!114 &1574236050 MonoBehaviour: @@ -880,8 +872,7 @@ LightingSettings: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_Name: Settings.lighting - serializedVersion: 6 - m_GIWorkflowMode: 1 + serializedVersion: 8 m_EnableBakedLightmaps: 1 m_EnableRealtimeLightmaps: 1 m_RealtimeEnvironmentLighting: 1 @@ -889,8 +880,10 @@ LightingSettings: m_AlbedoBoost: 1 m_IndirectOutputScale: 1 m_UsingShadowmask: 1 - m_BakeBackend: 0 + m_BakeBackend: 1 m_LightmapMaxSize: 1024 + m_LightmapSizeFixed: 0 + m_UseMipmapLimits: 1 m_BakeResolution: 40 m_Padding: 2 m_LightmapCompression: 3 @@ -908,9 +901,6 @@ LightingSettings: m_RealtimeResolution: 2 m_ForceWhiteAlbedo: 0 m_ForceUpdates: 0 - m_FinalGather: 0 - m_FinalGatherRayCount: 256 - m_FinalGatherFiltering: 1 m_PVRCulling: 1 m_PVRSampling: 1 m_PVRDirectSampleCount: 32 @@ -934,8 +924,6 @@ LightingSettings: m_PVRFilteringAtrousPositionSigmaDirect: 0.5 m_PVRFilteringAtrousPositionSigmaIndirect: 2 m_PVRFilteringAtrousPositionSigmaAO: 1 - m_PVRTiledBaking: 0 - m_NumRaysToShootPerTexel: -1 m_RespectSceneVisibilityWhenBakingGI: 0 --- !u!1001 &2043067438 PrefabInstance: @@ -990,3 +978,20 @@ PrefabInstance: m_AddedGameObjects: [] m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: 54f3340298537426e96a6cc530e2d5d8, type: 3} +--- !u!1660057539 &9223372036854775807 +SceneRoots: + m_ObjectHideFlags: 0 + m_Roots: + - {fileID: 1009000884} + - {fileID: 1574236049} + - {fileID: 1348885204} + - {fileID: 255077126} + - {fileID: 774084574} + - {fileID: 1177695920} + - {fileID: 2043067438} + - {fileID: 1325062279} + - {fileID: 478056696} + - {fileID: 1606160104} + - {fileID: 1748755984} + - {fileID: 1031665005} + - {fileID: 296100289} diff --git a/Project/Assets/ML-Agents/Examples/Soccer/TFModels/SoccerTwos.onnx b/Project/Assets/ML-Agents/Examples/Soccer/TFModels/SoccerTwos.onnx index 97c69f64a95b90f937982c1f49c473bf96155ca9..62ee731191fb3f12d926bcbaa2747c4c01e6af9a 100644 GIT binary patch delta 817 zcmaLV&ubGw6bJBRH`(1xYmIBI=_aX~V`*#B*-ia{(8eFAwM8ir^fDybwFxoVl58sR z5`qV>hIgnG(R;y*ir)MOq_n6vJy$B;1TS9vn*OljkHd#I%$t2Pk9{B4%3s&Z{hFey z3r)|h6^e$O8k;!vVZBV#0h5*koa7*#V&k?zTC)|c7>c!l`Zb3ShjmM1e`HOd&Gr8+tamKDs z+4;(^5}p1PdMa&pUXM~M5T&*fH3pf)lT5P4b;;s}GSj#%xS5a4c0(57|*2J*3g;6?a~k=oFD=S>*W(cH#29cJ_Wd z>jw#B2tW`NP(gzbFzA6^*av;EAHr||bT|n8a0mwAFhpSRRXb~Zd(et${;)q0@cDd` ynLnm%cxX54%lu_}hPmd~WPIO?&nI_e{y!l%hnc=Le8SByJ=rkcEpjf-*U zD)|j;4sM$0Vxp5Sx;WL*!33SEqdGX47{5F^eDZtmm-qR-@9+1g_LqZpQrC<~Z|Hmd zTGLdE=hiQMIB3%y^*Q|voh2{)j9OZrK5KtT5B;FaQJZxA;V8u^AI^@hbING>G%qrx zbiq)#V`|&Mu3KDRRZ&NK7VSg6!7?;vXN3F?@=Hz^A%ElMGE*!LEJLwuQ`@N5-IBAa zqS698PDz>5Qw*qMza1#?LdwE*Xl=XJ2wld`UyuqMKTlPO~h%fc_Te2P{v& z*eUvodp4F`N-@QO>OkG{?zt9JR6>R#0@;}CAdqtu$eIOWQ_DshI|>UsPOYnoMYm!r zub#xpn`vobLFGf3DHWm25!yk z`mJu@1+!z{+nqjpyIYyu1Ja diff --git a/Project/Assets/ML-Agents/Examples/Soccer/TFModels/SoccerTwos.onnx.meta b/Project/Assets/ML-Agents/Examples/Soccer/TFModels/SoccerTwos.onnx.meta index d126cba15f..1b06509be8 100644 --- a/Project/Assets/ML-Agents/Examples/Soccer/TFModels/SoccerTwos.onnx.meta +++ b/Project/Assets/ML-Agents/Examples/Soccer/TFModels/SoccerTwos.onnx.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 8cd4584c2f2cb4c5fb51675d364e10ec +guid: 4a201d889faed439cbb658435bd68b98 ScriptedImporter: internalIDToNameTable: [] externalObjects: {} @@ -8,4 +8,3 @@ ScriptedImporter: assetBundleName: assetBundleVariant: script: {fileID: 11500000, guid: 683b6cb6d0a474744822c888b46772c9, type: 3} - optimizeModel: 1 diff --git a/Project/Assets/ML-Agents/Examples/Walker/TFModels/Walker.onnx b/Project/Assets/ML-Agents/Examples/Walker/TFModels/Walker.onnx index 8428be75ebba229ca15360d79444b7feb9b24c14..110585ce892fb362a80bca4c89964f9b4e50bfbd 100644 GIT binary patch delta 425 zcmey>YqY7~NQ8q;h`pe)B)=#*LyFl@&%$a}ztLoK7L$4xE`hStqTjK34p^uH!HJ5H?^W5zo?{n9$Wi7Hbx+30%B$$W&vVWAO?xE12G2>a{@6J z5OZ&z$HtRa@2e%l!6?9}#KOSf;NXN2f?5(VSq26tl#tO9hRMh{Il+8Bou`fG9RT7i BgG~Sc delta 254 zcmdngZ}h9zNQ8q;h`pe)B)=#*LyFl@&%)|auhC{pFDxpVzL06 zg{hDL*m&Kn%o5$yih}&25-lkXMgc}AzOvM!;>`TK_`K5Gq|_oW76t|f2Q4kI+;p#Y z9(j3?kc^X-I9P}~H#IlEs4~7dvnmxN!NAbW$==S%&IrUzK+FupEI`Z(#B4welH&kk WP9Ww2V(#sn>^yn((~q?AyaNC-r#-R& diff --git a/Project/Packages/manifest.json b/Project/Packages/manifest.json index 63213996d4..41b77433fa 100644 --- a/Project/Packages/manifest.json +++ b/Project/Packages/manifest.json @@ -1,16 +1,16 @@ { "dependencies": { - "com.unity.ai.navigation": "1.1.4", - "com.unity.formats.fbx": "4.2.1", - "com.unity.ide.rider": "3.0.24", - "com.unity.inputsystem": "1.6.1", + "com.unity.ai.navigation": "2.0.0", + "com.unity.formats.fbx": "5.1.0", + "com.unity.ide.rider": "3.0.27", + "com.unity.inputsystem": "1.7.0", "com.unity.ml-agents": "file:../../com.unity.ml-agents", "com.unity.ml-agents.extensions": "file:../../com.unity.ml-agents.extensions", "com.unity.nuget.newtonsoft-json": "3.2.1", - "com.unity.recorder": "4.0.1", - "com.unity.test-framework": "1.1.33", + "com.unity.recorder": "5.0.0", + "com.unity.test-framework": "1.3.9", "com.unity.toolchain.macos-x86_64-linux-x86_64": "2.0.4", - "com.unity.ugui": "1.0.0", + "com.unity.ugui": "2.0.0", "com.unity.modules.imageconversion": "1.0.0", "com.unity.modules.jsonserialize": "1.0.0", "com.unity.modules.physics": "1.0.0", diff --git a/Project/Packages/packages-lock.json b/Project/Packages/packages-lock.json index 5a1ada8b79..0b3f6a0b62 100644 --- a/Project/Packages/packages-lock.json +++ b/Project/Packages/packages-lock.json @@ -8,7 +8,7 @@ "url": "https://packages.unity.com" }, "com.unity.ai.navigation": { - "version": "1.1.4", + "version": "2.0.0", "depth": 0, "source": "registry", "dependencies": { @@ -26,6 +26,18 @@ }, "url": "https://packages.unity.com" }, + "com.unity.collections": { + "version": "2.2.1", + "depth": 2, + "source": "registry", + "dependencies": { + "com.unity.burst": "1.8.8", + "com.unity.modules.unityanalytics": "1.0.0", + "com.unity.nuget.mono-cecil": "1.11.4", + "com.unity.test-framework.performance": "3.0.2" + }, + "url": "https://packages.unity.com" + }, "com.unity.ext.nunit": { "version": "2.0.5", "depth": 1, @@ -34,17 +46,17 @@ "url": "https://packages.unity.com" }, "com.unity.formats.fbx": { - "version": "4.2.1", + "version": "5.1.0", "depth": 0, "source": "registry", "dependencies": { "com.unity.timeline": "1.7.1", - "com.autodesk.fbx": "4.2.1" + "com.autodesk.fbx": "5.1.0" }, "url": "https://packages.unity.com" }, "com.unity.ide.rider": { - "version": "3.0.24", + "version": "3.0.27", "depth": 0, "source": "registry", "dependencies": { @@ -53,7 +65,7 @@ "url": "https://packages.unity.com" }, "com.unity.inputsystem": { - "version": "1.6.1", + "version": "1.7.0", "depth": 0, "source": "registry", "dependencies": { @@ -73,7 +85,7 @@ "depth": 0, "source": "local", "dependencies": { - "com.unity.sentis": "1.3.0-pre.3", + "com.unity.sentis": "2.0.0", "com.unity.modules.imageconversion": "1.0.0", "com.unity.modules.jsonserialize": "1.0.0", "com.unity.modules.physics": "1.0.0" @@ -88,6 +100,13 @@ "com.unity.modules.physics": "1.0.0" } }, + "com.unity.nuget.mono-cecil": { + "version": "1.11.4", + "depth": 3, + "source": "registry", + "dependencies": {}, + "url": "https://packages.unity.com" + }, "com.unity.nuget.newtonsoft-json": { "version": "3.2.1", "depth": 0, @@ -96,7 +115,7 @@ "url": "https://packages.unity.com" }, "com.unity.recorder": { - "version": "4.0.1", + "version": "5.0.0", "depth": 0, "source": "registry", "dependencies": { @@ -105,12 +124,12 @@ "url": "https://packages.unity.com" }, "com.unity.sentis": { - "version": "1.3.0-pre.3", + "version": "2.0.0", "depth": 1, "source": "registry", "dependencies": { - "com.unity.burst": "1.8.10", - "com.unity.modules.jsonserialize": "1.0.0", + "com.unity.burst": "1.8.12", + "com.unity.collections": "2.2.1", "com.unity.modules.imageconversion": "1.0.0" }, "url": "https://packages.unity.com" @@ -132,16 +151,26 @@ "url": "https://packages.unity.com" }, "com.unity.test-framework": { - "version": "1.1.33", + "version": "1.3.9", "depth": 0, "source": "registry", "dependencies": { - "com.unity.ext.nunit": "1.0.6", + "com.unity.ext.nunit": "2.0.3", "com.unity.modules.imgui": "1.0.0", "com.unity.modules.jsonserialize": "1.0.0" }, "url": "https://packages.unity.com" }, + "com.unity.test-framework.performance": { + "version": "3.0.2", + "depth": 3, + "source": "registry", + "dependencies": { + "com.unity.test-framework": "1.1.31", + "com.unity.modules.jsonserialize": "1.0.0" + }, + "url": "https://packages.unity.com" + }, "com.unity.timeline": { "version": "1.8.6", "depth": 1, @@ -165,7 +194,7 @@ "url": "https://packages.unity.com" }, "com.unity.ugui": { - "version": "1.0.0", + "version": "2.0.0", "depth": 0, "source": "builtin", "dependencies": { diff --git a/Project/ProjectSettings/MemorySettings.asset b/Project/ProjectSettings/MemorySettings.asset new file mode 100644 index 0000000000..5b5facecac --- /dev/null +++ b/Project/ProjectSettings/MemorySettings.asset @@ -0,0 +1,35 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!387306366 &1 +MemorySettings: + m_ObjectHideFlags: 0 + m_EditorMemorySettings: + m_MainAllocatorBlockSize: -1 + m_ThreadAllocatorBlockSize: -1 + m_MainGfxBlockSize: -1 + m_ThreadGfxBlockSize: -1 + m_CacheBlockSize: -1 + m_TypetreeBlockSize: -1 + m_ProfilerBlockSize: -1 + m_ProfilerEditorBlockSize: -1 + m_BucketAllocatorGranularity: -1 + m_BucketAllocatorBucketsCount: -1 + m_BucketAllocatorBlockSize: -1 + m_BucketAllocatorBlockCount: -1 + m_ProfilerBucketAllocatorGranularity: -1 + m_ProfilerBucketAllocatorBucketsCount: -1 + m_ProfilerBucketAllocatorBlockSize: -1 + m_ProfilerBucketAllocatorBlockCount: -1 + m_TempAllocatorSizeMain: -1 + m_JobTempAllocatorBlockSize: -1 + m_BackgroundJobTempAllocatorBlockSize: -1 + m_JobTempAllocatorReducedBlockSize: -1 + m_TempAllocatorSizeGIBakingWorker: -1 + m_TempAllocatorSizeNavMeshWorker: -1 + m_TempAllocatorSizeAudioWorker: -1 + m_TempAllocatorSizeCloudWorker: -1 + m_TempAllocatorSizeGfx: -1 + m_TempAllocatorSizeJobWorker: -1 + m_TempAllocatorSizeBackgroundWorker: -1 + m_TempAllocatorSizePreloadManager: -1 + m_PlatformMemorySettings: {} diff --git a/Project/ProjectSettings/MultiplayerManager.asset b/Project/ProjectSettings/MultiplayerManager.asset new file mode 100644 index 0000000000..8073753a09 --- /dev/null +++ b/Project/ProjectSettings/MultiplayerManager.asset @@ -0,0 +1,7 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!655991488 &1 +MultiplayerManager: + m_ObjectHideFlags: 0 + m_EnableMultiplayerRoles: 0 + m_ActiveMultiplayerRole: 0 diff --git a/Project/ProjectSettings/PackageManagerSettings.asset b/Project/ProjectSettings/PackageManagerSettings.asset new file mode 100644 index 0000000000..7b36544442 --- /dev/null +++ b/Project/ProjectSettings/PackageManagerSettings.asset @@ -0,0 +1,37 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &1 +MonoBehaviour: + m_ObjectHideFlags: 53 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 13964, guid: 0000000000000000e000000000000000, type: 0} + m_Name: + m_EditorClassIdentifier: + m_EnablePreReleasePackages: 0 + m_AdvancedSettingsExpanded: 1 + m_ScopedRegistriesSettingsExpanded: 1 + m_SeeAllPackageVersions: 0 + m_DismissPreviewPackagesInUse: 0 + oneTimeWarningShown: 0 + oneTimeDeprecatedPopUpShown: 0 + m_Registries: + - m_Id: main + m_Name: + m_Url: https://packages.unity.com + m_Scopes: [] + m_IsDefault: 1 + m_Capabilities: 7 + m_ConfigSource: 0 + m_UserSelectedRegistryName: + m_UserAddingNewScopedRegistry: 0 + m_RegistryInfoDraft: + m_Modified: 0 + m_ErrorMessage: + m_UserModificationsInstanceId: -874 + m_OriginalInstanceId: -876 + m_LoadAssets: 0 diff --git a/Project/ProjectSettings/ProjectVersion.txt b/Project/ProjectSettings/ProjectVersion.txt index 2d4bcb4f1c..88b6f04b97 100644 --- a/Project/ProjectSettings/ProjectVersion.txt +++ b/Project/ProjectSettings/ProjectVersion.txt @@ -1,2 +1,2 @@ -m_EditorVersion: 2023.2.12f1 -m_EditorVersionWithRevision: 2023.2.12f1 (19eeb3b320af) +m_EditorVersion: 2023.2.13f1 +m_EditorVersionWithRevision: 2023.2.13f1 (70197a359f36) diff --git a/Project/ProjectSettings/SceneTemplateSettings.json b/Project/ProjectSettings/SceneTemplateSettings.json new file mode 100644 index 0000000000..5e97f8393e --- /dev/null +++ b/Project/ProjectSettings/SceneTemplateSettings.json @@ -0,0 +1,121 @@ +{ + "templatePinStates": [], + "dependencyTypeInfos": [ + { + "userAdded": false, + "type": "UnityEngine.AnimationClip", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEditor.Animations.AnimatorController", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEngine.AnimatorOverrideController", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEditor.Audio.AudioMixerController", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEngine.ComputeShader", + "defaultInstantiationMode": 1 + }, + { + "userAdded": false, + "type": "UnityEngine.Cubemap", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEngine.GameObject", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEditor.LightingDataAsset", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEngine.LightingSettings", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEngine.Material", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEditor.MonoScript", + "defaultInstantiationMode": 1 + }, + { + "userAdded": false, + "type": "UnityEngine.PhysicMaterial", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEngine.PhysicsMaterial2D", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEngine.Rendering.PostProcessing.PostProcessProfile", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEngine.Rendering.PostProcessing.PostProcessResources", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEngine.Rendering.VolumeProfile", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEditor.SceneAsset", + "defaultInstantiationMode": 1 + }, + { + "userAdded": false, + "type": "UnityEngine.Shader", + "defaultInstantiationMode": 1 + }, + { + "userAdded": false, + "type": "UnityEngine.ShaderVariantCollection", + "defaultInstantiationMode": 1 + }, + { + "userAdded": false, + "type": "UnityEngine.Texture", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEngine.Texture2D", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEngine.Timeline.TimelineAsset", + "defaultInstantiationMode": 0 + } + ], + "defaultDependencyTypeInfo": { + "userAdded": false, + "type": "", + "defaultInstantiationMode": 1 + }, + "newSceneOverride": 0 +} \ No newline at end of file diff --git a/Project/ProjectSettings/TimeManager.asset b/Project/ProjectSettings/TimeManager.asset index 558a017e1f..8f68da289f 100644 --- a/Project/ProjectSettings/TimeManager.asset +++ b/Project/ProjectSettings/TimeManager.asset @@ -3,7 +3,11 @@ --- !u!5 &1 TimeManager: m_ObjectHideFlags: 0 - Fixed Timestep: 0.02 + Fixed Timestep: + m_Count: 2822399 + m_Rate: + m_Denominator: 1 + m_Numerator: 141120000 Maximum Allowed Timestep: 0.33333334 m_TimeScale: 1 Maximum Particle Timestep: 0.03 diff --git a/Project/ProjectSettings/VersionControlSettings.asset b/Project/ProjectSettings/VersionControlSettings.asset new file mode 100644 index 0000000000..246bcd47a2 --- /dev/null +++ b/Project/ProjectSettings/VersionControlSettings.asset @@ -0,0 +1,9 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!890905787 &1 +VersionControlSettings: + m_ObjectHideFlags: 0 + m_Mode: Visible Meta Files + m_CollabEditorSettings: + inProgressEnabled: 1 + m_TrackPackagesOutsideProject: 0 diff --git a/com.unity.ml-agents/Runtime/Analytics/InferenceAnalytics.cs b/com.unity.ml-agents/Runtime/Analytics/InferenceAnalytics.cs index a1ef23c3f9..76d0cdd53b 100644 --- a/com.unity.ml-agents/Runtime/Analytics/InferenceAnalytics.cs +++ b/com.unity.ml-agents/Runtime/Analytics/InferenceAnalytics.cs @@ -153,15 +153,15 @@ IList actuators ) { var sentisModel = ModelLoader.Load(nnModel); + using var sentisModelInfo = new SentisModelInfo(sentisModel); var inferenceEvent = new InferenceEvent(); // Hash the behavior name so that there's no concern about PII or "secret" data being leaked. inferenceEvent.BehaviorName = AnalyticsUtils.Hash(k_VendorKey, behaviorName); - inferenceEvent.SentisModelSource = sentisModel.IrSource; - inferenceEvent.SentisModelVersion = sentisModel.IrVersion; + inferenceEvent.SentisModelVersion = sentisModelInfo.Version; inferenceEvent.SentisModelProducer = sentisModel.ProducerName; - inferenceEvent.MemorySize = (int)((TensorFloat)sentisModel.GetTensorByName(TensorNames.MemorySize))[0]; + inferenceEvent.MemorySize = sentisModelInfo.MemorySize; inferenceEvent.InferenceDevice = (int)inferenceDevice; // TODO deprecate tensorflow conversion @@ -209,7 +209,7 @@ static long GetModelWeightSize(Model sentisModel) long totalWeightsSizeInBytes = 0; for (var c = 0; c < sentisModel.constants.Count; c++) { - totalWeightsSizeInBytes += sentisModel.constants[c].length; + totalWeightsSizeInBytes += sentisModel.constants[c].lengthBytes; } return totalWeightsSizeInBytes; } @@ -265,14 +265,9 @@ static string GetModelHash(Model sentisModel) { var hash = new MLAgentsHash128(); - // Limit the max number of float bytes that we hash for performance. - const int kMaxFloats = 256; - foreach (var constant in sentisModel.constants) { - hash.Append(constant.name); - var numFloatsToHash = Mathf.Min(constant.weights.Length, kMaxFloats); - hash.Append(constant.weights.ToString()); + hash.Append(constant.ToString()); } return hash.ToString(); diff --git a/com.unity.ml-agents/Runtime/Inference/ApplierImpl.cs b/com.unity.ml-agents/Runtime/Inference/ApplierImpl.cs index 065d0a2aec..f39f271635 100644 --- a/com.unity.ml-agents/Runtime/Inference/ApplierImpl.cs +++ b/com.unity.ml-agents/Runtime/Inference/ApplierImpl.cs @@ -4,7 +4,6 @@ using Unity.MLAgents.Actuators; using Unity.Sentis; using UnityEngine; -using DeviceType = Unity.Sentis.DeviceType; namespace Unity.MLAgents.Inference { @@ -23,8 +22,12 @@ public ContinuousActionOutputApplier(ActionSpec actionSpec) public void Apply(TensorProxy tensorProxy, IList actionIds, Dictionary lastActions) { - var actionSize = tensorProxy.shape[tensorProxy.shape.Length - 1]; + var actionSize = tensorProxy.shape[^1]; + + tensorProxy.data.CompleteAllPendingOperations(); + var agentIndex = 0; + for (var i = 0; i < actionIds.Count; i++) { var agentId = actionIds[i]; @@ -38,14 +41,10 @@ public void Apply(TensorProxy tensorProxy, IList actionIds, Dictionary)tensorProxy.data)[agentIndex, j]; } } @@ -61,7 +60,7 @@ internal class DiscreteActionOutputApplier : TensorApplier.IApplier { readonly ActionSpec m_ActionSpec; - public DiscreteActionOutputApplier(ActionSpec actionSpec, int seed, ITensorAllocator allocator) + public DiscreteActionOutputApplier(ActionSpec actionSpec, int seed) { m_ActionSpec = actionSpec; } @@ -69,7 +68,11 @@ public DiscreteActionOutputApplier(ActionSpec actionSpec, int seed, ITensorAlloc public void Apply(TensorProxy tensorProxy, IList actionIds, Dictionary lastActions) { var agentIndex = 0; + + tensorProxy.data.CompleteAllPendingOperations(); + var actionSize = tensorProxy.shape[tensorProxy.shape.Length - 1]; + for (var i = 0; i < actionIds.Count; i++) { var agentId = actionIds[i]; @@ -84,14 +87,9 @@ public void Apply(TensorProxy tensorProxy, IList actionIds, Dictionary)tensorProxy.data)[agentIndex, j]; } } @@ -112,7 +110,7 @@ internal class LegacyDiscreteActionOutputApplier : TensorApplier.IApplier readonly int[] m_StartActionIndices; readonly float[] m_CdfBuffer; - public LegacyDiscreteActionOutputApplier(ActionSpec actionSpec, int seed, ITensorAllocator allocator) + public LegacyDiscreteActionOutputApplier(ActionSpec actionSpec, int seed) { m_ActionSize = actionSpec.BranchSizes; m_Multinomial = new Multinomial(seed); @@ -165,26 +163,20 @@ internal void ComputeCdf(TensorProxy logProbs, int batch, int channelOffset, int { // Find the class maximum var maxProb = float.NegativeInfinity; - if (logProbs.Device == DeviceType.GPU) - { - logProbs.data.MakeReadable(); - } + + logProbs.data.CompleteAllPendingOperations(); for (var cls = 0; cls < branchSize; ++cls) { - maxProb = Mathf.Max(((TensorFloat)logProbs.data)[batch, cls + channelOffset], maxProb); + maxProb = Mathf.Max(((Tensor)logProbs.data)[batch, cls + channelOffset], maxProb); } // Sum the log probabilities and compute CDF var sumProb = 0.0f; - if (logProbs.Device == DeviceType.GPU) - { - logProbs.data.MakeReadable(); - } for (var cls = 0; cls < branchSize; ++cls) { - sumProb += Mathf.Exp(((TensorFloat)logProbs.data)[batch, cls + channelOffset] - maxProb); + sumProb += Mathf.Exp(((Tensor)logProbs.data)[batch, cls + channelOffset] - maxProb); m_CdfBuffer[cls] = sumProb; } } @@ -207,7 +199,11 @@ public MemoryOutputApplier( public void Apply(TensorProxy tensorProxy, IList actionIds, Dictionary lastActions) { var agentIndex = 0; + + tensorProxy.data.CompleteAllPendingOperations(); + var memorySize = tensorProxy.data.Width(); + for (var i = 0; i < actionIds.Count; i++) { var agentId = actionIds[i]; @@ -219,14 +215,9 @@ public void Apply(TensorProxy tensorProxy, IList actionIds, Dictionary)tensorProxy.data)[agentIndex, 0, j]; } m_Memories[agentId] = memory; diff --git a/com.unity.ml-agents/Runtime/Inference/SymbolicTensorShapeExtensions.cs b/com.unity.ml-agents/Runtime/Inference/DynamicTensorShapeExtensions.cs similarity index 67% rename from com.unity.ml-agents/Runtime/Inference/SymbolicTensorShapeExtensions.cs rename to com.unity.ml-agents/Runtime/Inference/DynamicTensorShapeExtensions.cs index 9dbcf967d8..c3f6fec9ef 100644 --- a/com.unity.ml-agents/Runtime/Inference/SymbolicTensorShapeExtensions.cs +++ b/com.unity.ml-agents/Runtime/Inference/DynamicTensorShapeExtensions.cs @@ -3,25 +3,27 @@ namespace Unity.MLAgents.Inference { - internal static class SymbolicTensorShapeExtensions + static class DynamicTensorShapeExtensions { - public static long[] ToArray(this SymbolicTensorShape shape) + public static int[] ToArray(this DynamicTensorShape shape) { - var shapeOut = new long[shape.rank]; + var shapeOut = new int[shape.rank]; // TODO investigate how critical this is and if we can just remove this assert. the alternative is to expose this again in Sentis. // Assert.IsTrue(shape.hasRank, "ValueError: Cannot convert tensor of unknown rank to TensorShape"); + var shapeArray = shape.ToIntArray(); + for (var i = 0; i < shape.rank; i++) { - if (shape[i].isParam) + if (shapeArray[i] == -1) { shapeOut[i] = 1; } else { - shapeOut[i] = shape[i].value; + shapeOut[i] = shapeArray[i]; } } diff --git a/com.unity.ml-agents/Runtime/Inference/SymbolicTensorShapeExtensions.cs.meta b/com.unity.ml-agents/Runtime/Inference/DynamicTensorShapeExtensions.cs.meta similarity index 100% rename from com.unity.ml-agents/Runtime/Inference/SymbolicTensorShapeExtensions.cs.meta rename to com.unity.ml-agents/Runtime/Inference/DynamicTensorShapeExtensions.cs.meta diff --git a/com.unity.ml-agents/Runtime/Inference/GeneratorImpl.cs b/com.unity.ml-agents/Runtime/Inference/GeneratorImpl.cs index 6033172078..2cc50f0f9c 100644 --- a/com.unity.ml-agents/Runtime/Inference/GeneratorImpl.cs +++ b/com.unity.ml-agents/Runtime/Inference/GeneratorImpl.cs @@ -14,16 +14,11 @@ namespace Unity.MLAgents.Inference /// internal class BiDimensionalOutputGenerator : TensorGenerator.IGenerator { - readonly ITensorAllocator m_Allocator; - - public BiDimensionalOutputGenerator(ITensorAllocator allocator) - { - m_Allocator = allocator; - } + public BiDimensionalOutputGenerator() { } public void Generate(TensorProxy tensorProxy, int batchSize, IList infos) { - TensorUtils.ResizeTensor(tensorProxy, batchSize, m_Allocator); + TensorUtils.ResizeTensor(tensorProxy, batchSize); } } @@ -33,24 +28,16 @@ public void Generate(TensorProxy tensorProxy, int batchSize, IList internal class BatchSizeGenerator : TensorGenerator.IGenerator { - readonly ITensorAllocator m_Allocator; - - public BatchSizeGenerator(ITensorAllocator allocator) - { - m_Allocator = allocator; - } + public BatchSizeGenerator() { } public void Generate(TensorProxy tensorProxy, int batchSize, IList infos) { tensorProxy.data?.Dispose(); var newTensorShape = new TensorShape(1, 1); tensorProxy.data = TensorUtils.CreateEmptyTensor(newTensorShape, tensorProxy.DType); - if (tensorProxy.Device == DeviceType.GPU) - { - tensorProxy.data.MakeReadable(); - } + tensorProxy.data.CompleteAllPendingOperations(); - ((TensorInt)tensorProxy.data)[0] = batchSize; + ((Tensor)tensorProxy.data)[0] = batchSize; } } @@ -62,20 +49,17 @@ public void Generate(TensorProxy tensorProxy, int batchSize, IList internal class SequenceLengthGenerator : TensorGenerator.IGenerator { - readonly ITensorAllocator m_Allocator; - - public SequenceLengthGenerator(ITensorAllocator allocator) - { - m_Allocator = allocator; - } + public SequenceLengthGenerator() { } public void Generate(TensorProxy tensorProxy, int batchSize, IList infos) { - tensorProxy.shape = new long[0]; + tensorProxy.shape = Array.Empty(); tensorProxy.data?.Dispose(); var newTensorShape = new TensorShape(1, 1); tensorProxy.data = TensorUtils.CreateEmptyTensor(newTensorShape, tensorProxy.DType); - ((TensorInt)tensorProxy.data)[0] = 1; + tensorProxy.data.CompleteAllPendingOperations(); + + ((Tensor)tensorProxy.data)[0] = 1; } } @@ -87,25 +71,25 @@ public void Generate(TensorProxy tensorProxy, int batchSize, IList internal class RecurrentInputGenerator : TensorGenerator.IGenerator { - readonly ITensorAllocator m_Allocator; Dictionary> m_Memories; public RecurrentInputGenerator( - ITensorAllocator allocator, Dictionary> memories) { - m_Allocator = allocator; m_Memories = memories; } public void Generate( TensorProxy tensorProxy, int batchSize, IList infos) { - TensorUtils.ResizeTensor(tensorProxy, batchSize, m_Allocator); + TensorUtils.ResizeTensor(tensorProxy, batchSize); var memorySize = tensorProxy.data.Width(); + tensorProxy.data.CompleteAllPendingOperations(); + var agentIndex = 0; + for (var infoIndex = 0; infoIndex < infos.Count; infoIndex++) { var infoSensorPair = infos[infoIndex]; @@ -119,14 +103,10 @@ public void Generate( if (!m_Memories.TryGetValue(info.episodeId, out memory)) { - if (tensorProxy.Device == DeviceType.GPU) - { - tensorProxy.data.MakeReadable(); - } for (var j = 0; j < memorySize; j++) { - ((TensorFloat)tensorProxy.data)[agentIndex, 0, j] = 0; + ((Tensor)tensorProxy.data)[agentIndex, 0, j] = 0; } agentIndex++; @@ -140,12 +120,7 @@ public void Generate( break; } - if (tensorProxy.Device == DeviceType.GPU) - { - tensorProxy.data.MakeReadable(); - } - - ((TensorFloat)tensorProxy.data)[agentIndex, 0, j] = memory[j]; + ((Tensor)tensorProxy.data)[agentIndex, 0, j] = memory[j]; } agentIndex++; @@ -161,16 +136,12 @@ public void Generate( /// internal class PreviousActionInputGenerator : TensorGenerator.IGenerator { - readonly ITensorAllocator m_Allocator; - - public PreviousActionInputGenerator(ITensorAllocator allocator) - { - m_Allocator = allocator; - } + public PreviousActionInputGenerator() { } public void Generate(TensorProxy tensorProxy, int batchSize, IList infos) { - TensorUtils.ResizeTensor(tensorProxy, batchSize, m_Allocator); + TensorUtils.ResizeTensor(tensorProxy, batchSize); + tensorProxy.data.CompleteAllPendingOperations(); var actionSize = tensorProxy.shape[tensorProxy.shape.Length - 1]; var agentIndex = 0; @@ -183,7 +154,7 @@ public void Generate(TensorProxy tensorProxy, int batchSize, IList)tensorProxy.data)[agentIndex, j] = pastAction[j]; } } @@ -200,16 +171,13 @@ public void Generate(TensorProxy tensorProxy, int batchSize, IList internal class ActionMaskInputGenerator : TensorGenerator.IGenerator { - readonly ITensorAllocator m_Allocator; - - public ActionMaskInputGenerator(ITensorAllocator allocator) - { - m_Allocator = allocator; - } + public ActionMaskInputGenerator() { } public void Generate(TensorProxy tensorProxy, int batchSize, IList infos) { - TensorUtils.ResizeTensor(tensorProxy, batchSize, m_Allocator); + TensorUtils.ResizeTensor(tensorProxy, batchSize); + + tensorProxy.data.CompleteAllPendingOperations(); var maskSize = tensorProxy.shape[tensorProxy.shape.Length - 1]; var agentIndex = 0; @@ -218,15 +186,11 @@ public void Generate(TensorProxy tensorProxy, int batchSize, IList)tensorProxy.data)[agentIndex, j] = isUnmasked; } agentIndex++; @@ -242,17 +206,15 @@ public void Generate(TensorProxy tensorProxy, int batchSize, IList infos) { - TensorUtils.ResizeTensor(tensorProxy, batchSize, m_Allocator); + TensorUtils.ResizeTensor(tensorProxy, batchSize); TensorUtils.FillTensorWithRandomNormal(tensorProxy, m_RandomNormal); } } @@ -265,14 +227,10 @@ public void Generate(TensorProxy tensorProxy, int batchSize, IList internal class ObservationGenerator : TensorGenerator.IGenerator { - readonly ITensorAllocator m_Allocator; List m_SensorIndices = new List(); ObservationWriter m_ObservationWriter = new ObservationWriter(); - public ObservationGenerator(ITensorAllocator allocator) - { - m_Allocator = allocator; - } + public ObservationGenerator() { } public void AddSensorIndex(int sensorIndex) { @@ -281,7 +239,7 @@ public void AddSensorIndex(int sensorIndex) public void Generate(TensorProxy tensorProxy, int batchSize, IList infos) { - TensorUtils.ResizeTensor(tensorProxy, batchSize, m_Allocator); + TensorUtils.ResizeTensor(tensorProxy, batchSize); var agentIndex = 0; for (var infoIndex = 0; infoIndex < infos.Count; infoIndex++) { diff --git a/com.unity.ml-agents/Runtime/Inference/ModelRunner.cs b/com.unity.ml-agents/Runtime/Inference/ModelRunner.cs index aaa6f85c13..03451600b5 100644 --- a/com.unity.ml-agents/Runtime/Inference/ModelRunner.cs +++ b/com.unity.ml-agents/Runtime/Inference/ModelRunner.cs @@ -19,15 +19,13 @@ internal class ModelRunner Dictionary m_LastActionsReceived = new Dictionary(); List m_OrderedAgentsRequestingDecisions = new List(); - ITensorAllocator m_TensorAllocator; TensorGenerator m_TensorGenerator; TensorApplier m_TensorApplier; ModelAsset m_Model; string m_ModelName; InferenceDevice m_InferenceDevice; - IWorker m_Engine; - bool m_Verbose = false; + Worker m_Engine; bool m_DeterministicInference; string[] m_OutputNames; IReadOnlyList m_InferenceInputs; @@ -61,11 +59,11 @@ public ModelRunner( bool deterministicInference = false) { Model sentisModel; + SentisModelInfo sentisModelInfo; m_Model = model; m_ModelName = model?.name; m_InferenceDevice = inferenceDevice; m_DeterministicInference = deterministicInference; - m_TensorAllocator = new TensorCachingAllocator(); if (model != null) { #if SENTIS_VERBOSE @@ -76,9 +74,10 @@ public ModelRunner( // D.logEnabled = m_Verbose; sentisModel = ModelLoader.Load(model); + sentisModelInfo = new SentisModelInfo(sentisModel, deterministicInference); var failedCheck = SentisModelParamLoader.CheckModelVersion( - sentisModel + sentisModelInfo ); if (failedCheck != null) { @@ -106,23 +105,28 @@ public ModelRunner( executionDevice = BackendType.CPU; break; } - m_Engine = WorkerFactory.CreateWorker(executionDevice, sentisModel, m_Verbose); + m_Engine = new Worker(sentisModel, executionDevice); } else { sentisModel = null; + sentisModelInfo = null; m_Engine = null; } - m_InferenceInputs = sentisModel.GetInputTensors(); - m_OutputNames = sentisModel.GetOutputNames(m_DeterministicInference); + if (sentisModelInfo != null) + { + m_InferenceInputs = sentisModelInfo.GetInputTensors(); + m_OutputNames = sentisModelInfo.OutputNames; + } m_TensorGenerator = new TensorGenerator( - seed, m_TensorAllocator, m_Memories, sentisModel, m_DeterministicInference); + seed, m_Memories, sentisModel, m_DeterministicInference); m_TensorApplier = new TensorApplier( - actionSpec, seed, m_TensorAllocator, m_Memories, sentisModel, m_DeterministicInference); + actionSpec, seed, m_Memories, sentisModel, m_DeterministicInference); m_InputsByName = new Dictionary(); m_InferenceOutputs = new List(); + sentisModelInfo?.Dispose(); } public InferenceDevice InferenceDevice @@ -149,7 +153,6 @@ public void Dispose() { if (m_Engine != null) m_Engine.Dispose(); - m_TensorAllocator?.Reset(false); foreach (var (name, tensor) in m_InputsByName) { tensor.Dispose(); @@ -159,6 +162,7 @@ public void Dispose() void FetchSentisOutputs(string[] names) { m_InferenceOutputs.Clear(); + foreach (var n in names) { var output = m_Engine.PeekOutput(n); @@ -204,7 +208,7 @@ public void DecideBatch() // Just grab the first agent in the collection (any will suffice, really). // We check for an empty Collection above, so this will always return successfully. var firstInfo = m_Infos[0]; - m_TensorGenerator.InitializeObservations(firstInfo.sensors, m_TensorAllocator); + m_TensorGenerator.InitializeObservations(firstInfo.sensors); m_ObservationsInitialized = true; } @@ -222,7 +226,11 @@ public void DecideBatch() // Execute the Model Profiler.BeginSample($"ExecuteGraph"); - m_Engine.Execute(m_InputsByName); + foreach (var kv in m_InputsByName) + { + m_Engine.SetInput(kv.Key, kv.Value); + } + m_Engine.Schedule(); Profiler.EndSample(); Profiler.BeginSample($"FetchSentisOutputs"); diff --git a/com.unity.ml-agents/Runtime/Inference/SentisModelExtensions.cs b/com.unity.ml-agents/Runtime/Inference/SentisModelExtensions.cs deleted file mode 100644 index 6f224e0bc7..0000000000 --- a/com.unity.ml-agents/Runtime/Inference/SentisModelExtensions.cs +++ /dev/null @@ -1,438 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using Unity.Sentis; -using FailedCheck = Unity.MLAgents.Inference.SentisModelParamLoader.FailedCheck; - -namespace Unity.MLAgents.Inference -{ - /// - /// Sentis Model extension methods. - /// - internal static class SentisModelExtensions - { - /// - /// Get array of the input tensor names of the model. - /// - /// - /// The Sentis engine model for loading static parameters. - /// - /// Array of the input tensor names of the model - public static string[] GetInputNames(this Model model) - { - var names = new List(); - - if (model == null) - return names.ToArray(); - - foreach (var input in model.inputs) - { - names.Add(input.name); - } - - names.Sort(StringComparer.InvariantCulture); - - return names.ToArray(); - } - - /// - /// Get model tensor by name - /// - /// Model - /// Tensor name - /// Tensor - public static Tensor GetTensorByName(this Model model, string name) - { - foreach (var constant in model.constants) - if (constant.name == name) - return constant.DataSetToTensor(); - return null; - } - - /// - /// Get the version of the model. - /// - /// - /// The Sentis engine model for loading static parameters. - /// - /// The api version of the model - public static int GetVersion(this Model model) - { - return (int)((TensorFloat)model.GetTensorByName(TensorNames.VersionNumber))[0]; - } - - /// - /// Generates the Tensor inputs that are expected to be present in the Model. - /// - /// - /// The Sentis engine model for loading static parameters. - /// - /// TensorProxy IEnumerable with the expected Tensor inputs. - public static IReadOnlyList GetInputTensors(this Model model) - { - var tensors = new List(); - - if (model == null) - return tensors; - - foreach (var input in model.inputs) - { - tensors.Add(new TensorProxy - { - name = input.name, - valueType = TensorProxy.TensorType.FloatingPoint, - data = null, - shape = input.shape.ToArray() - }); - } - - tensors.Sort((el1, el2) => string.Compare(el1.name, el2.name, StringComparison.InvariantCulture)); - - return tensors; - } - - /// - /// Get number of visual observation inputs to the model. - /// - /// - /// The Sentis engine model for loading static parameters. - /// - /// Number of visual observation inputs to the model - public static int GetNumVisualInputs(this Model model) - { - var count = 0; - if (model == null) - return count; - - foreach (var input in model.inputs) - { - if (input.name.StartsWith(TensorNames.VisualObservationPlaceholderPrefix)) - { - count++; - } - } - - return count; - } - - /// - /// Get array of the output tensor names of the model. - /// - /// - /// The Sentis engine model for loading static parameters. - /// - /// Inference only: set to true if the action selection from model should be - /// deterministic. - /// Array of the output tensor names of the model - public static string[] GetOutputNames(this Model model, bool deterministicInference = false) - { - var names = new List(); - - if (model == null) - { - return names.ToArray(); - } - - if (model.HasContinuousOutputs(deterministicInference)) - { - names.Add(model.ContinuousOutputName(deterministicInference)); - } - if (model.HasDiscreteOutputs(deterministicInference)) - { - names.Add(model.DiscreteOutputName(deterministicInference)); - } - - var modelVersion = model.GetVersion(); - var memory = (int)((TensorFloat)model.GetTensorByName(TensorNames.MemorySize))[0]; - if (memory > 0) - { - names.Add(TensorNames.RecurrentOutput); - } - - names.Sort(StringComparer.InvariantCulture); - - return names.ToArray(); - } - - /// - /// Check if the model has continuous action outputs. - /// - /// - /// The Sentis engine model for loading static parameters. - /// - /// Inference only: set to true if the action selection from model should be - /// deterministic. - /// True if the model has continuous action outputs. - public static bool HasContinuousOutputs(this Model model, bool deterministicInference = false) - { - if (model == null) - return false; - if (!model.SupportsContinuousAndDiscrete()) - { - return ((TensorInt)model.GetTensorByName(TensorNames.IsContinuousControlDeprecated))[0] > 0; - } - bool hasStochasticOutput = !deterministicInference && - model.outputs.Contains(TensorNames.ContinuousActionOutput); - bool hasDeterministicOutput = deterministicInference && - model.outputs.Contains(TensorNames.DeterministicContinuousActionOutput); - - return (hasStochasticOutput || hasDeterministicOutput) && - (int)((TensorFloat)model.GetTensorByName(TensorNames.ContinuousActionOutputShape))[0] > 0; - } - - /// - /// Continuous action output size of the model. - /// - /// - /// The Sentis engine model for loading static parameters. - /// - /// Size of continuous action output. - public static int ContinuousOutputSize(this Model model) - { - if (model == null) - return 0; - if (!model.SupportsContinuousAndDiscrete()) - { - return ((TensorInt)model.GetTensorByName(TensorNames.IsContinuousControlDeprecated))[0] > 0 ? ((TensorInt)model.GetTensorByName(TensorNames.ActionOutputShapeDeprecated))[0] : 0; - } - else - { - var continuousOutputShape = model.GetTensorByName(TensorNames.ContinuousActionOutputShape); - return continuousOutputShape == null ? 0 : (int)((TensorFloat)continuousOutputShape)[0]; - } - } - - /// - /// Continuous action output tensor name of the model. - /// - /// - /// The Sentis engine model for loading static parameters. - /// - /// Inference only: set to true if the action selection from model should be - /// deterministic. - /// Tensor name of continuous action output. - public static string ContinuousOutputName(this Model model, bool deterministicInference = false) - { - if (model == null) - return null; - if (!model.SupportsContinuousAndDiscrete()) - { - return TensorNames.ActionOutputDeprecated; - } - return deterministicInference ? TensorNames.DeterministicContinuousActionOutput : TensorNames.ContinuousActionOutput; - } - - /// - /// Check if the model has discrete action outputs. - /// - /// - /// The Sentis engine model for loading static parameters. - /// - /// Inference only: set to true if the action selection from model should be - /// deterministic. - /// True if the model has discrete action outputs. - public static bool HasDiscreteOutputs(this Model model, bool deterministicInference = false) - { - if (model == null) - return false; - if (!model.SupportsContinuousAndDiscrete()) - { - return ((TensorInt)model.GetTensorByName(TensorNames.IsContinuousControlDeprecated))[0] == 0; - } - else - { - bool hasStochasticOutput = !deterministicInference && - model.outputs.Contains(TensorNames.DiscreteActionOutput); - bool hasDeterministicOutput = deterministicInference && - model.outputs.Contains(TensorNames.DeterministicDiscreteActionOutput); - return (hasStochasticOutput || hasDeterministicOutput) && - model.DiscreteOutputSize() > 0; - } - } - - /// - /// Discrete action output size of the model. This is equal to the sum of the branch sizes. - /// This method gets the tensor representing the list of branch size and returns the - /// sum of all the elements in the Tensor. - /// - In version 1.X this tensor contains a single number, the sum of all branch - /// size values. - /// - In version 2.X this tensor contains a 1D Tensor with each element corresponding - /// to a branch size. - /// Since this method does the sum of all elements in the tensor, the output - /// will be the same on both 1.X and 2.X. - /// - /// - /// The Sentis engine model for loading static parameters. - /// - /// Size of discrete action output. - public static int DiscreteOutputSize(this Model model) - { - if (model == null) - return 0; - if (!model.SupportsContinuousAndDiscrete()) - { - return ((TensorInt)model.GetTensorByName(TensorNames.IsContinuousControlDeprecated))[0] > 0 ? 0 : ((TensorInt)model.GetTensorByName(TensorNames.ActionOutputShapeDeprecated))[0]; - } - var discreteOutputShape = model.GetTensorByName(TensorNames.DiscreteActionOutputShape); - if (discreteOutputShape == null) - { - return 0; - } - int result = 0; - for (int i = 0; i < discreteOutputShape.Length(); i++) - { - result += (int)((TensorFloat)discreteOutputShape)[i]; - } - return result; - } - - /// - /// Discrete action output tensor name of the model. - /// - /// - /// The Sentis engine model for loading static parameters. - /// - /// Inference only: set to true if the action selection from model should be - /// deterministic. - /// Tensor name of discrete action output. - public static string DiscreteOutputName(this Model model, bool deterministicInference = false) - { - if (model == null) - return null; - if (!model.SupportsContinuousAndDiscrete()) - { - return TensorNames.ActionOutputDeprecated; - } - else - { - return deterministicInference ? TensorNames.DeterministicDiscreteActionOutput : TensorNames.DiscreteActionOutput; - } - } - - /// - /// Check if the model supports both continuous and discrete actions. - /// If not, the model should be handled differently and use the deprecated fields. - /// - /// - /// The Sentis engine model for loading static parameters. - /// - /// True if the model supports both continuous and discrete actions. - public static bool SupportsContinuousAndDiscrete(this Model model) - { - return model == null || - model.outputs.Contains(TensorNames.ContinuousActionOutput) || - model.outputs.Contains(TensorNames.DiscreteActionOutput); - } - - /// - /// Check if the model contains all the expected input/output tensors. - /// - /// - /// The Sentis engine model for loading static parameters. - /// - /// Output list of failure messages - /// Inference only: set to true if the action selection from model should be - /// deterministic. - /// True if the model contains all the expected tensors. - /// TODO: add checks for deterministic actions - public static bool CheckExpectedTensors(this Model model, List failedModelChecks, bool deterministicInference = false) - { - // Check the presence of model version - var modelApiVersionTensor = model.GetTensorByName(TensorNames.VersionNumber); - if (modelApiVersionTensor == null) - { - failedModelChecks.Add( - FailedCheck.Warning($"Required constant \"{TensorNames.VersionNumber}\" was not found in the model file.") - ); - return false; - } - - // Check the presence of memory size - var memorySizeTensor = model.GetTensorByName(TensorNames.MemorySize); - if (memorySizeTensor == null) - { - failedModelChecks.Add( - FailedCheck.Warning($"Required constant \"{TensorNames.MemorySize}\" was not found in the model file.") - ); - return false; - } - - // Check the presence of action output tensor - if (!model.outputs.Contains(TensorNames.ActionOutputDeprecated) && - !model.outputs.Contains(TensorNames.ContinuousActionOutput) && - !model.outputs.Contains(TensorNames.DiscreteActionOutput) && - !model.outputs.Contains(TensorNames.DeterministicContinuousActionOutput) && - !model.outputs.Contains(TensorNames.DeterministicDiscreteActionOutput)) - { - failedModelChecks.Add( - FailedCheck.Warning("The model does not contain any Action Output Node.") - ); - return false; - } - - // Check the presence of action output shape tensor - if (!model.SupportsContinuousAndDiscrete()) - { - if (model.GetTensorByName(TensorNames.ActionOutputShapeDeprecated) == null) - { - failedModelChecks.Add( - FailedCheck.Warning("The model does not contain any Action Output Shape Node.") - ); - return false; - } - if (model.GetTensorByName(TensorNames.IsContinuousControlDeprecated) == null) - { - failedModelChecks.Add( - FailedCheck.Warning($"Required constant \"{TensorNames.IsContinuousControlDeprecated}\" was " + - "not found in the model file. " + - "This is only required for model that uses a deprecated model format.") - ); - return false; - } - } - else - { - if (model.outputs.Contains(TensorNames.ContinuousActionOutput)) - { - if (model.GetTensorByName(TensorNames.ContinuousActionOutputShape) == null) - { - failedModelChecks.Add( - FailedCheck.Warning("The model uses continuous action but does not contain Continuous Action Output Shape Node.") - ); - return false; - } - else if (!model.HasContinuousOutputs(deterministicInference)) - { - var actionType = deterministicInference ? "deterministic" : "stochastic"; - var actionName = deterministicInference ? "Deterministic" : ""; - failedModelChecks.Add( - FailedCheck.Warning($"The model uses {actionType} inference but does not contain {actionName} Continuous Action Output Tensor. Uncheck `Deterministic inference` flag..") - ); - return false; - } - } - - if (model.outputs.Contains(TensorNames.DiscreteActionOutput)) - { - if (model.GetTensorByName(TensorNames.DiscreteActionOutputShape) == null) - { - failedModelChecks.Add( - FailedCheck.Warning("The model uses discrete action but does not contain Discrete Action Output Shape Node.") - ); - return false; - } - else if (!model.HasDiscreteOutputs(deterministicInference)) - { - var actionType = deterministicInference ? "deterministic" : "stochastic"; - var actionName = deterministicInference ? "Deterministic" : ""; - failedModelChecks.Add( - FailedCheck.Warning($"The model uses {actionType} inference but does not contain {actionName} Discrete Action Output Tensor. Uncheck `Deterministic inference` flag.") - ); - return false; - } - } - } - return true; - } - } -} diff --git a/com.unity.ml-agents/Runtime/Inference/SentisModelInfo.cs b/com.unity.ml-agents/Runtime/Inference/SentisModelInfo.cs new file mode 100644 index 0000000000..791c1319d2 --- /dev/null +++ b/com.unity.ml-agents/Runtime/Inference/SentisModelInfo.cs @@ -0,0 +1,481 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Unity.Sentis; +using FailedCheck = Unity.MLAgents.Inference.SentisModelParamLoader.FailedCheck; + +namespace Unity.MLAgents.Inference +{ + /// + /// Sentis Model utility methods. + /// + internal class SentisModelInfo : IDisposable + { + public string[] InputNames; + public string[] OutputNames; + public int Version; + public int NumVisualInputs; + public int MemorySize; + public bool HasContinuousOutputs; + public bool HasDiscreteOutputs; + public string ContinuousOutputName; + public string DiscreteOutputName; + public bool SupportsContinuousAndDiscrete; + public int ContinuousOutputSize; + public int DiscreteOutputSize; + Worker m_Worker; + Model m_Model; + bool m_DeterministicInference; + Dictionary m_ModelInputTensors; + Dictionary m_ModelOutputTensors; + + /// + /// Initializes a Sentis Model Info Object. This can be used to get information about the Sentis Model. + /// + /// The Sentis Model + /// Whether to use deterministic inference. + public SentisModelInfo(Model model, bool deterministicInference = false) + { + m_ModelOutputTensors = new Dictionary(); + m_Model = model; + m_DeterministicInference = deterministicInference; + m_Worker = new Worker(m_Model, DeviceType.CPU); + var inputTensors = GetInputTensors(); + m_ModelInputTensors = PrepareInputs(inputTensors); + foreach (var kv in m_ModelInputTensors) + { + m_Worker.SetInput(kv.Key, kv.Value); + } + m_Worker.Schedule(); + CacheModelInfo(); + } + + static Dictionary PrepareInputs(IReadOnlyList infInputs) + { + Dictionary inputs = new Dictionary(); + inputs.Clear(); + for (var i = 0; i < infInputs.Count; i++) + { + var inp = infInputs[i]; + var newTensorShape = new TensorShape(inp.shape.Select(i => (int)i).ToArray()); + inp.data = TensorUtils.CreateEmptyTensor(newTensorShape, inp.DType); + TensorUtils.FillTensorBatch(inp, 0, 0f); + inputs[inp.name] = inp.data; + } + + return inputs; + } + + + /// + /// Generates the Tensor inputs that are expected to be present in the Model. + /// + /// TensorProxy IEnumerable with the expected Tensor inputs. + public IReadOnlyList GetInputTensors() + { + var tensors = new List(); + + if (m_Model == null) + return tensors; + + foreach (var input in m_Model.inputs) + { + tensors.Add(new TensorProxy + { + name = input.name, + valueType = TensorProxy.TensorType.FloatingPoint, + data = null, + shape = input.shape.ToArray() + }); + } + + tensors.Sort((el1, el2) => string.Compare(el1.name, el2.name, StringComparison.InvariantCulture)); + + return tensors; + } + + /// + /// Gets the Discrete Action Output Shape as a Tensor. + /// + /// + public Tensor GetDiscreteActionOutputShape() + { + return (Tensor)GetTensorByName(TensorNames.DiscreteActionOutputShape); + } + + void CacheModelInfo() + { + CacheOutputTensors(); + InputNames = GetInputNames(); + Version = GetVersion(); + NumVisualInputs = GetNumVisualInputs(); + OutputNames = GetOutputNames(); + MemorySize = GetMemorySize(); + HasContinuousOutputs = CheckContinuousOutputs(); + HasDiscreteOutputs = CheckDiscreteOutputs(); + ContinuousOutputName = GetContinuousOutputName(); + DiscreteOutputName = GetDiscreteOutputName(); + SupportsContinuousAndDiscrete = CheckSupportsContinuousAndDiscrete(); + ContinuousOutputSize = CheckContinuousOutputSize(); + DiscreteOutputSize = CheckDiscreteOutputSize(); + } + + void CacheOutputTensors() + { + foreach (var output in m_Model.outputs) + { + var outputName = output.name; + Tensor outputTensor = null; + m_Worker.CopyOutput(outputName, ref outputTensor); + outputTensor.CompleteAllPendingOperations(); + m_ModelOutputTensors.Add(outputName, outputTensor); + } + } + + Tensor GetTensorByName(string name) + { + try + { + return m_ModelOutputTensors[name]; + } + catch (KeyNotFoundException) + { + return null; + } + + } + + string[] GetInputNames() + { + var names = new List(); + + if (m_Model == null) + return names.ToArray(); + + foreach (var input in m_Model.inputs) + { + names.Add(input.name); + } + + names.Sort(StringComparer.InvariantCulture); + + return names.ToArray(); + } + + int GetVersion() + { + var version = GetTensorByNameAsInt(TensorNames.VersionNumber); + return version > 0 ? version : -1; + } + + int GetMemorySize() + { + return GetTensorByNameAsInt(TensorNames.MemorySize); + } + + int GetTensorByNameAsInt(string name) + { + var tensor = GetTensorByName(name); + var tensorAsInt = 0; + if (tensor != null) + tensorAsInt = (int)((Tensor)tensor)[0]; + return tensorAsInt; + } + + int GetNumVisualInputs() + { + var count = 0; + if (m_Model == null) + return count; + + foreach (var input in m_Model.inputs) + { + if (input.name.StartsWith(TensorNames.VisualObservationPlaceholderPrefix)) + { + count++; + } + } + + return count; + } + + string[] GetOutputNames() + { + var names = new List(); + + if (m_Model == null) + { + return names.ToArray(); + } + + if (CheckContinuousOutputs()) + { + names.Add(GetContinuousOutputName()); + } + if (CheckDiscreteOutputs()) + { + names.Add(GetDiscreteOutputName()); + } + + var modelVersion = GetVersion(); + + var memory = GetMemorySize(); + + if (memory > 0) + { + names.Add(TensorNames.RecurrentOutput); + } + + names.Sort(StringComparer.InvariantCulture); + + return names.ToArray(); + } + + bool CheckContinuousOutputs() + { + if (m_Model == null) + return false; + if (!CheckSupportsContinuousAndDiscrete()) + { + return ((Tensor)GetTensorByName(TensorNames.IsContinuousControlDeprecated))[0] > 0; + } + bool hasStochasticOutput = !m_DeterministicInference && + OutputsContainName(m_Model.outputs, TensorNames.ContinuousActionOutput); + bool hasDeterministicOutput = m_DeterministicInference && + OutputsContainName(m_Model.outputs, TensorNames.DeterministicContinuousActionOutput); + + return (hasStochasticOutput || hasDeterministicOutput) && + GetTensorByNameAsInt(TensorNames.ContinuousActionOutputShape) > 0; + } + + static bool OutputsContainName(List outputs, string name) + { + foreach (var output in outputs) + { + if (output.name.Contains(name)) + { + return true; + } + } + + return false; + } + + int CheckContinuousOutputSize() + { + if (m_Model == null) + return 0; + if (!CheckSupportsContinuousAndDiscrete()) + { + return ((Tensor)GetTensorByName(TensorNames.IsContinuousControlDeprecated))[0] > 0 ? ((Tensor)GetTensorByName(TensorNames.ActionOutputShapeDeprecated))[0] : 0; + } + else + { + var continuousOutputShape = GetTensorByName(TensorNames.ContinuousActionOutputShape); + return continuousOutputShape == null ? 0 : (int)((Tensor)continuousOutputShape)[0]; + } + } + + string GetContinuousOutputName() + { + if (m_Model == null) + return null; + if (!CheckSupportsContinuousAndDiscrete()) + { + return TensorNames.ActionOutputDeprecated; + } + return m_DeterministicInference ? TensorNames.DeterministicContinuousActionOutput : TensorNames.ContinuousActionOutput; + } + + bool CheckDiscreteOutputs() + { + if (m_Model == null) + return false; + if (!CheckSupportsContinuousAndDiscrete()) + { + return ((Tensor)GetTensorByName(TensorNames.IsContinuousControlDeprecated))[0] == 0; + } + else + { + bool hasStochasticOutput = !m_DeterministicInference && + OutputsContainName(m_Model.outputs, TensorNames.DiscreteActionOutput); + bool hasDeterministicOutput = m_DeterministicInference && + OutputsContainName(m_Model.outputs, TensorNames.DeterministicDiscreteActionOutput); + return (hasStochasticOutput || hasDeterministicOutput) && + CheckDiscreteOutputSize() > 0; + } + } + + int CheckDiscreteOutputSize() + { + if (m_Model == null) + return 0; + if (!CheckSupportsContinuousAndDiscrete()) + { + return ((Tensor)GetTensorByName(TensorNames.IsContinuousControlDeprecated))[0] > 0 ? 0 : ((Tensor)GetTensorByName(TensorNames.ActionOutputShapeDeprecated))[0]; + } + var discreteOutputShape = GetTensorByName(TensorNames.DiscreteActionOutputShape); + if (discreteOutputShape == null) + { + return 0; + } + int result = 0; + for (int i = 0; i < discreteOutputShape.Length(); i++) + { + result += (int)((Tensor)discreteOutputShape)[i]; + } + return result; + } + + string GetDiscreteOutputName() + { + if (m_Model == null) + return null; + if (!CheckSupportsContinuousAndDiscrete()) + { + return TensorNames.ActionOutputDeprecated; + } + else + { + return m_DeterministicInference ? TensorNames.DeterministicDiscreteActionOutput : TensorNames.DiscreteActionOutput; + } + } + + bool CheckSupportsContinuousAndDiscrete() + { + return m_Model == null || + OutputsContainName(m_Model.outputs, TensorNames.ContinuousActionOutput) || + OutputsContainName(m_Model.outputs, TensorNames.DiscreteActionOutput); + } + + + /// + /// Check if the model contains all the expected input/output tensors. + /// + /// Output list of failure messages + /// True if the model contains all the expected tensors. + /// TODO: add checks for deterministic actions + /// TODO: add checks for deterministic actions + public bool CheckExpectedTensors(List failedModelChecks) + { + // Check the presence of model version + var modelApiVersionTensor = GetTensorByName(TensorNames.VersionNumber); + if (modelApiVersionTensor == null) + { + failedModelChecks.Add( + FailedCheck.Warning($"Required constant \"{TensorNames.VersionNumber}\" was not found in the model file.") + ); + return false; + } + + // Check the presence of memory size + var memorySizeTensor = GetTensorByName(TensorNames.MemorySize); + if (memorySizeTensor == null) + { + failedModelChecks.Add( + FailedCheck.Warning($"Required constant \"{TensorNames.MemorySize}\" was not found in the model file.") + ); + return false; + } + + // Check the presence of action output tensor + if (!OutputsContainName(m_Model.outputs, TensorNames.ActionOutputDeprecated) && + !OutputsContainName(m_Model.outputs, TensorNames.ContinuousActionOutput) && + !OutputsContainName(m_Model.outputs, TensorNames.DiscreteActionOutput) && + !OutputsContainName(m_Model.outputs, TensorNames.DeterministicContinuousActionOutput) && + !OutputsContainName(m_Model.outputs, TensorNames.DeterministicDiscreteActionOutput)) + { + failedModelChecks.Add( + FailedCheck.Warning("The model does not contain any Action Output Node.") + ); + return false; + } + + // Check the presence of action output shape tensor + if (!CheckSupportsContinuousAndDiscrete()) + { + if (GetTensorByName(TensorNames.ActionOutputShapeDeprecated) == null) + { + failedModelChecks.Add( + FailedCheck.Warning("The model does not contain any Action Output Shape Node.") + ); + return false; + } + if (GetTensorByName(TensorNames.IsContinuousControlDeprecated) == null) + { + failedModelChecks.Add( + FailedCheck.Warning($"Required constant \"{TensorNames.IsContinuousControlDeprecated}\" was " + + "not found in the model file. " + + "This is only required for model that uses a deprecated model format.") + ); + return false; + } + } + else + { + if (OutputsContainName(m_Model.outputs, TensorNames.ContinuousActionOutput)) + { + if (GetTensorByName(TensorNames.ContinuousActionOutputShape) == null) + { + failedModelChecks.Add( + FailedCheck.Warning("The model uses continuous action but does not contain Continuous Action Output Shape Node.") + ); + return false; + } + else if (!CheckContinuousOutputs()) + { + var actionType = m_DeterministicInference ? "deterministic" : "stochastic"; + var actionName = m_DeterministicInference ? "Deterministic" : ""; + failedModelChecks.Add( + FailedCheck.Warning($"The model uses {actionType} inference but does not contain {actionName} Continuous Action Output Tensor. Uncheck `Deterministic inference` flag..") + ); + return false; + } + } + + if (OutputsContainName(m_Model.outputs, TensorNames.DiscreteActionOutput)) + { + if (GetTensorByName(TensorNames.DiscreteActionOutputShape) == null) + { + failedModelChecks.Add( + FailedCheck.Warning("The model uses discrete action but does not contain Discrete Action Output Shape Node.") + ); + return false; + } + else if (!CheckDiscreteOutputs()) + { + var actionType = m_DeterministicInference ? "deterministic" : "stochastic"; + var actionName = m_DeterministicInference ? "Deterministic" : ""; + failedModelChecks.Add( + FailedCheck.Warning($"The model uses {actionType} inference but does not contain {actionName} Discrete Action Output Tensor. Uncheck `Deterministic inference` flag.") + ); + return false; + } + } + } + return true; + } + + /// + /// Disposes of the Sentis Model Info owned Tensors. + /// + public void Dispose() + { + m_Worker?.Dispose(); + + foreach (var key in m_ModelInputTensors.Keys) + { + m_ModelInputTensors[key].Dispose(); + } + + m_ModelInputTensors.Clear(); + + foreach (var key in m_ModelOutputTensors.Keys) + { + m_ModelOutputTensors[key].Dispose(); + } + + m_ModelOutputTensors.Clear(); + } + } +} diff --git a/com.unity.ml-agents/Runtime/Inference/SentisModelExtensions.cs.meta b/com.unity.ml-agents/Runtime/Inference/SentisModelInfo.cs.meta similarity index 100% rename from com.unity.ml-agents/Runtime/Inference/SentisModelExtensions.cs.meta rename to com.unity.ml-agents/Runtime/Inference/SentisModelInfo.cs.meta diff --git a/com.unity.ml-agents/Runtime/Inference/SentisModelParamLoader.cs b/com.unity.ml-agents/Runtime/Inference/SentisModelParamLoader.cs index a3c3a08ad4..17fe7b6f22 100644 --- a/com.unity.ml-agents/Runtime/Inference/SentisModelParamLoader.cs +++ b/com.unity.ml-agents/Runtime/Inference/SentisModelParamLoader.cs @@ -69,9 +69,9 @@ public static FailedCheck Error(string message) /// The Sentis engine model for loading static parameters /// /// A FailedCheck containing the error message if the version of the model does not mach, else null - public static FailedCheck CheckModelVersion(Model model) + public static FailedCheck CheckModelVersion(SentisModelInfo modelInfo) { - var modelApiVersion = model.GetVersion(); + var modelApiVersion = modelInfo.Version; if (modelApiVersion < (int)ModelApiVersion.MinSupportedVersion) { return FailedCheck.Error( @@ -90,7 +90,7 @@ public static FailedCheck CheckModelVersion(Model model) ); } - var memorySize = (int)((TensorFloat)model.GetTensorByName(TensorNames.MemorySize))[0]; + var memorySize = modelInfo.MemorySize; if (modelApiVersion == (int)ModelApiVersion.MLAgents1_0 && memorySize > 0) { @@ -148,21 +148,21 @@ public static IEnumerable CheckModel( failedModelChecks.Add(FailedCheck.Info(errorMsg)); return failedModelChecks; } - - var hasExpectedTensors = model.CheckExpectedTensors(failedModelChecks, deterministicInference); + using var modelInfo = new SentisModelInfo(model, deterministicInference); + var hasExpectedTensors = modelInfo.CheckExpectedTensors(failedModelChecks); if (!hasExpectedTensors) { return failedModelChecks; } - var modelApiVersion = model.GetVersion(); - var versionCheck = CheckModelVersion(model); + var modelApiVersion = modelInfo.Version; + var versionCheck = CheckModelVersion(modelInfo); if (versionCheck != null) { failedModelChecks.Add(versionCheck); } - var memorySize = (int)((TensorFloat)model.GetTensorByName(TensorNames.MemorySize))[0]; + var memorySize = modelInfo.MemorySize; if (memorySize == -1) { failedModelChecks.Add(FailedCheck.Warning($"Missing node in the model provided : {TensorNames.MemorySize}" @@ -224,8 +224,9 @@ static IEnumerable CheckInputTensorPresenceLegacy( ISensor[] sensors ) { + using var modelInfo = new SentisModelInfo(model); var failedModelChecks = new List(); - var tensorsNames = model.GetInputNames(); + var tensorsNames = modelInfo.InputNames; // If there is no Vector Observation Input but the Brain Parameters expect one. if ((brainParameters.VectorObservationSize != 0) && @@ -268,7 +269,7 @@ ISensor[] sensors } } - var expectedVisualObs = model.GetNumVisualInputs(); + var expectedVisualObs = modelInfo.NumVisualInputs; // Check if there's not enough visual sensors (too many would be handled above) if (expectedVisualObs > visObsIndex) { @@ -291,7 +292,7 @@ ISensor[] sensors } // If the model uses discrete control but does not have an input for action masks - if (model.HasDiscreteOutputs()) + if (modelInfo.HasDiscreteOutputs) { if (!tensorsNames.Contains(TensorNames.ActionMaskPlaceholder)) { @@ -330,8 +331,9 @@ static IEnumerable CheckInputTensorPresence( bool deterministicInference = false ) { + using var modelInfo = new SentisModelInfo(model); var failedModelChecks = new List(); - var tensorsNames = model.GetInputNames(); + var tensorsNames = modelInfo.InputNames; for (var sensorIndex = 0; sensorIndex < sensors.Length; sensorIndex++) { if (!tensorsNames.Contains( @@ -348,7 +350,7 @@ static IEnumerable CheckInputTensorPresence( // If the model has a non-negative memory size but requires a recurrent input if (memory > 0) { - var modelVersion = model.GetVersion(); + var modelVersion = modelInfo.Version; if (!tensorsNames.Any(x => x == TensorNames.RecurrentInPlaceholder)) { failedModelChecks.Add( @@ -358,7 +360,7 @@ static IEnumerable CheckInputTensorPresence( } // If the model uses discrete control but does not have an input for action masks - if (model.HasDiscreteOutputs(deterministicInference)) + if (modelInfo.HasDiscreteOutputs) { if (!tensorsNames.Contains(TensorNames.ActionMaskPlaceholder)) { @@ -385,12 +387,13 @@ static IEnumerable CheckInputTensorPresence( /// static IEnumerable CheckOutputTensorPresence(Model model, int memory, bool deterministicInference = false) { + using var modelInfo = new SentisModelInfo(model, deterministicInference); var failedModelChecks = new List(); // If there is no Recurrent Output but the model is Recurrent. if (memory > 0) { - var allOutputs = model.GetOutputNames(deterministicInference).ToList(); + var allOutputs = modelInfo.OutputNames.ToList(); if (!allOutputs.Any(x => x == TensorNames.RecurrentOutput)) { failedModelChecks.Add( @@ -516,6 +519,7 @@ static IEnumerable CheckInputTensorShapeLegacy( Model model, BrainParameters brainParameters, ISensor[] sensors, int observableAttributeTotalSize) { + using var modelInfo = new SentisModelInfo(model); var failedModelChecks = new List(); var tensorTester = new Dictionary>() @@ -551,7 +555,7 @@ static IEnumerable CheckInputTensorShapeLegacy( } // If the model expects an input but it is not in this list - foreach (var tensor in model.GetInputTensors()) + foreach (var tensor in modelInfo.GetInputTensors()) { if (!tensorTester.ContainsKey(tensor.name)) { @@ -654,6 +658,7 @@ static IEnumerable CheckInputTensorShape( Model model, BrainParameters brainParameters, ISensor[] sensors, int observableAttributeTotalSize) { + using var modelInfo = new SentisModelInfo(model); var failedModelChecks = new List(); var tensorTester = new Dictionary>() @@ -691,7 +696,7 @@ static IEnumerable CheckInputTensorShape( } // If the model expects an input but it is not in this list - foreach (var tensor in model.GetInputTensors()) + foreach (var tensor in modelInfo.GetInputTensors()) { if (!tensorTester.ContainsKey(tensor.name)) { @@ -758,25 +763,26 @@ static IEnumerable CheckOutputTensorShape( BrainParameters brainParameters, ActuatorComponent[] actuatorComponents) { + using var modelInfo = new SentisModelInfo(model); var failedModelChecks = new List(); // If the model expects an output but it is not in this list - var modelContinuousActionSize = model.ContinuousOutputSize(); + var modelContinuousActionSize = modelInfo.ContinuousOutputSize; var continuousError = CheckContinuousActionOutputShape(brainParameters, actuatorComponents, modelContinuousActionSize); if (continuousError != null) { failedModelChecks.Add(continuousError); } FailedCheck discreteError = null; - var modelApiVersion = model.GetVersion(); + var modelApiVersion = modelInfo.Version; if (modelApiVersion == (int)ModelApiVersion.MLAgents1_0) { - var modelSumDiscreteBranchSizes = model.DiscreteOutputSize(); + var modelSumDiscreteBranchSizes = modelInfo.DiscreteOutputSize; discreteError = CheckDiscreteActionOutputShapeLegacy(brainParameters, actuatorComponents, modelSumDiscreteBranchSizes); } if (modelApiVersion == (int)ModelApiVersion.MLAgents2_0) { - var modelDiscreteBranches = (TensorFloat)model.GetTensorByName(TensorNames.DiscreteActionOutputShape); + var modelDiscreteBranches = modelInfo.GetDiscreteActionOutputShape(); discreteError = CheckDiscreteActionOutputShape(brainParameters, actuatorComponents, modelDiscreteBranches); } @@ -784,6 +790,7 @@ static IEnumerable CheckOutputTensorShape( { failedModelChecks.Add(discreteError); } + return failedModelChecks; } @@ -802,7 +809,7 @@ static IEnumerable CheckOutputTensorShape( /// check failed. If the check passed, returns null. /// static FailedCheck CheckDiscreteActionOutputShape( - BrainParameters brainParameters, ActuatorComponent[] actuatorComponents, TensorFloat modelDiscreteBranches) + BrainParameters brainParameters, ActuatorComponent[] actuatorComponents, Tensor modelDiscreteBranches) { var discreteActionBranches = brainParameters.ActionSpec.BranchSizes.ToList(); foreach (var actuatorComponent in actuatorComponents) diff --git a/com.unity.ml-agents/Runtime/Inference/TensorApplier.cs b/com.unity.ml-agents/Runtime/Inference/TensorApplier.cs index 7a0d28c6c1..bfdd70b1c1 100644 --- a/com.unity.ml-agents/Runtime/Inference/TensorApplier.cs +++ b/com.unity.ml-agents/Runtime/Inference/TensorApplier.cs @@ -49,7 +49,6 @@ public interface IApplier public TensorApplier( ActionSpec actionSpec, int seed, - ITensorAllocator allocator, Dictionary> memories, object sentisModel = null, bool deterministicInference = false) @@ -61,26 +60,27 @@ public TensorApplier( } var model = (Model)sentisModel; - if (!model.SupportsContinuousAndDiscrete()) + using var modelInfo = new SentisModelInfo(model, deterministicInference); + if (!modelInfo.SupportsContinuousAndDiscrete) { actionSpec.CheckAllContinuousOrDiscrete(); } if (actionSpec.NumContinuousActions > 0) { - var tensorName = model.ContinuousOutputName(deterministicInference); + var tensorName = modelInfo.ContinuousOutputName; m_Dict[tensorName] = new ContinuousActionOutputApplier(actionSpec); } - var modelVersion = model.GetVersion(); + var modelVersion = modelInfo.Version; if (actionSpec.NumDiscreteActions > 0) { - var tensorName = model.DiscreteOutputName(deterministicInference); + var tensorName = modelInfo.DiscreteOutputName; if (modelVersion == (int)SentisModelParamLoader.ModelApiVersion.MLAgents1_0) { - m_Dict[tensorName] = new LegacyDiscreteActionOutputApplier(actionSpec, seed, allocator); + m_Dict[tensorName] = new LegacyDiscreteActionOutputApplier(actionSpec, seed); } if (modelVersion == (int)SentisModelParamLoader.ModelApiVersion.MLAgents2_0) { - m_Dict[tensorName] = new DiscreteActionOutputApplier(actionSpec, seed, allocator); + m_Dict[tensorName] = new DiscreteActionOutputApplier(actionSpec, seed); } } m_Dict[TensorNames.RecurrentOutput] = new MemoryOutputApplier(memories); diff --git a/com.unity.ml-agents/Runtime/Inference/TensorGenerator.cs b/com.unity.ml-agents/Runtime/Inference/TensorGenerator.cs index 515cbdd583..aa7b5d0159 100644 --- a/com.unity.ml-agents/Runtime/Inference/TensorGenerator.cs +++ b/com.unity.ml-agents/Runtime/Inference/TensorGenerator.cs @@ -48,7 +48,6 @@ void Generate( /// deterministic. public TensorGenerator( int seed, - ITensorAllocator allocator, Dictionary> memories, object sentisModel = null, bool deterministicInference = false) @@ -59,39 +58,40 @@ public TensorGenerator( return; } var model = (Model)sentisModel; + using var modelInfo = new SentisModelInfo(model, deterministicInference); - m_ApiVersion = model.GetVersion(); + m_ApiVersion = modelInfo.Version; // Generator for Inputs m_Dict[TensorNames.BatchSizePlaceholder] = - new BatchSizeGenerator(allocator); + new BatchSizeGenerator(); m_Dict[TensorNames.SequenceLengthPlaceholder] = - new SequenceLengthGenerator(allocator); + new SequenceLengthGenerator(); m_Dict[TensorNames.RecurrentInPlaceholder] = - new RecurrentInputGenerator(allocator, memories); + new RecurrentInputGenerator(memories); m_Dict[TensorNames.PreviousActionPlaceholder] = - new PreviousActionInputGenerator(allocator); + new PreviousActionInputGenerator(); m_Dict[TensorNames.ActionMaskPlaceholder] = - new ActionMaskInputGenerator(allocator); + new ActionMaskInputGenerator(); m_Dict[TensorNames.RandomNormalEpsilonPlaceholder] = - new RandomNormalInputGenerator(seed, allocator); + new RandomNormalInputGenerator(seed); // Generators for Outputs - if (model.HasContinuousOutputs(deterministicInference)) + if (modelInfo.HasContinuousOutputs) { - m_Dict[model.ContinuousOutputName(deterministicInference)] = new BiDimensionalOutputGenerator(allocator); + m_Dict[modelInfo.ContinuousOutputName] = new BiDimensionalOutputGenerator(); } - if (model.HasDiscreteOutputs(deterministicInference)) + if (modelInfo.HasDiscreteOutputs) { - m_Dict[model.DiscreteOutputName(deterministicInference)] = new BiDimensionalOutputGenerator(allocator); + m_Dict[modelInfo.DiscreteOutputName] = new BiDimensionalOutputGenerator(); } - m_Dict[TensorNames.RecurrentOutput] = new BiDimensionalOutputGenerator(allocator); - m_Dict[TensorNames.ValueEstimateOutput] = new BiDimensionalOutputGenerator(allocator); + m_Dict[TensorNames.RecurrentOutput] = new BiDimensionalOutputGenerator(); + m_Dict[TensorNames.ValueEstimateOutput] = new BiDimensionalOutputGenerator(); } - public void InitializeObservations(List sensors, ITensorAllocator allocator) + public void InitializeObservations(List sensors) { if (m_ApiVersion == (int)SentisModelParamLoader.ModelApiVersion.MLAgents1_0) { @@ -111,7 +111,7 @@ public void InitializeObservations(List sensors, ITensorAllocator alloc case 1: if (vecObsGen == null) { - vecObsGen = new ObservationGenerator(allocator); + vecObsGen = new ObservationGenerator(); } obsGen = vecObsGen; obsGenName = TensorNames.VectorObservationPlaceholder; @@ -119,13 +119,13 @@ public void InitializeObservations(List sensors, ITensorAllocator alloc case 2: // If the tensor is of rank 2, we use the index of the sensor // to create the name - obsGen = new ObservationGenerator(allocator); + obsGen = new ObservationGenerator(); obsGenName = TensorNames.GetObservationName(sensorIndex); break; case 3: // If the tensor is of rank 3, we use the "visual observation // index", which only counts the rank 3 sensors - obsGen = new ObservationGenerator(allocator); + obsGen = new ObservationGenerator(); obsGenName = TensorNames.GetVisualObservationName(visIndex); visIndex++; break; @@ -142,7 +142,7 @@ public void InitializeObservations(List sensors, ITensorAllocator alloc { for (var sensorIndex = 0; sensorIndex < sensors.Count; sensorIndex++) { - var obsGen = new ObservationGenerator(allocator); + var obsGen = new ObservationGenerator(); var obsGenName = TensorNames.GetObservationName(sensorIndex); obsGen.AddSensorIndex(sensorIndex); m_Dict[obsGenName] = obsGen; diff --git a/com.unity.ml-agents/Runtime/Inference/TensorProxy.cs b/com.unity.ml-agents/Runtime/Inference/TensorProxy.cs index 5510a40996..1332499c48 100644 --- a/com.unity.ml-agents/Runtime/Inference/TensorProxy.cs +++ b/com.unity.ml-agents/Runtime/Inference/TensorProxy.cs @@ -25,17 +25,17 @@ public enum TensorType static readonly Dictionary k_TypeMap = new Dictionary() - { - { TensorType.FloatingPoint, typeof(float) }, - { TensorType.Integer, typeof(int) } - }; + { + { TensorType.FloatingPoint, typeof(float) }, + { TensorType.Integer, typeof(int) } + }; static readonly Dictionary k_DTypeMap = new Dictionary() - { - { TensorType.FloatingPoint, Sentis.DataType.Float }, - { TensorType.Integer, Sentis.DataType.Int } - }; + { + { TensorType.FloatingPoint, Sentis.DataType.Float }, + { TensorType.Integer, Sentis.DataType.Int } + }; public string name; public TensorType valueType; @@ -43,9 +43,9 @@ public enum TensorType // Since Type is not serializable, we use the DisplayType for the Inspector public Type DataType => k_TypeMap[valueType]; public DataType DType => k_DTypeMap[valueType]; - public long[] shape; + public int[] shape; public Tensor data; - public DeviceType Device => data.tensorOnDevice.deviceType; + public BackendType Device => data.dataOnBackend.backendType; public long Height { @@ -69,13 +69,21 @@ public long Channels ~TensorProxy() { - data?.Dispose(); + Dispose(); + } + + void Dispose() + { + if (data.dataOnBackend.backendType != BackendType.CPU) + { + data?.Dispose(); + } } } internal static class TensorUtils { - public static void ResizeTensor(TensorProxy tensor, int batch, ITensorAllocator allocator) + public static void ResizeTensor(TensorProxy tensor, int batch) { if (tensor.shape[0] == batch && tensor.data != null && tensor.data.Batch() == batch) @@ -95,29 +103,29 @@ public static Tensor CreateEmptyTensor(TensorShape shape, DataType dataType) switch (dataType) { case DataType.Float: - tensor = TensorFloat.Zeros(shape); + tensor = new Tensor(shape); break; case DataType.Int: - tensor = TensorInt.Zeros(shape); + tensor = new Tensor(shape); break; } return tensor; } - internal static long[] TensorShapeFromSentis(TensorShape src) + internal static int[] TensorShapeFromSentis(TensorShape src) { if (src.rank == 2) { - return new long[] { src.Batch(), src.Channels() }; + return new int[] { src.Batch(), src.Channels() }; } if (src.Height() == 1 && src.Width() == 1) { - return new long[] { src.Batch(), src.Channels() }; + return new int[] { src.Batch(), src.Channels() }; } - return new long[] { src.Batch(), src.Channels(), src.Height(), src.Width() }; + return new int[] { src.Batch(), src.Channels(), src.Height(), src.Width() }; } public static TensorProxy TensorProxyFromSentis(Tensor src, string nameOverride = null) @@ -146,13 +154,16 @@ public static void FillTensorBatch(TensorProxy tensorProxy, int batch, float fil var height = tensorProxy.data.Height(); var width = tensorProxy.data.Width(); var channels = tensorProxy.data.Channels(); + + tensorProxy.data.CompleteAllPendingOperations(); + for (var h = 0; h < height; h++) { for (var w = 0; w < width; w++) { for (var c = 0; c < channels; c++) { - ((TensorFloat)tensorProxy.data)[batch, c, h, w] = fillValue; + ((Tensor)tensorProxy.data)[batch, c, h, w] = fillValue; } } } @@ -182,9 +193,11 @@ public static void FillTensorWithRandomNormal( throw new ArgumentNullException(); } + tensorProxy.data.CompleteAllPendingOperations(); + for (var i = 0; i < tensorProxy.data.Length(); i++) { - ((TensorFloat)tensorProxy.data)[i] = (float)randomNormal.NextDouble(); + ((Tensor)tensorProxy.data)[i] = (float)randomNormal.NextDouble(); } } } diff --git a/com.unity.ml-agents/Runtime/Sensors/ObservationWriter.cs b/com.unity.ml-agents/Runtime/Sensors/ObservationWriter.cs index 24ed9fa5ba..3a34834b1f 100644 --- a/com.unity.ml-agents/Runtime/Sensors/ObservationWriter.cs +++ b/com.unity.ml-agents/Runtime/Sensors/ObservationWriter.cs @@ -89,12 +89,9 @@ public float this[int index] } else { - if (m_Proxy.Device == DeviceType.GPU) - { - m_Proxy.data.MakeReadable(); - } + m_Proxy.data.CompleteAllPendingOperations(); - ((TensorFloat)m_Proxy.data)[m_Batch, index + m_Offset] = value; + ((Tensor)m_Proxy.data)[m_Batch, index + m_Offset] = value; } } } @@ -109,12 +106,9 @@ public float this[int index] } else { - if (m_Proxy.Device == DeviceType.GPU) - { - m_Proxy.data.MakeReadable(); - } + m_Proxy.data.CompleteAllPendingOperations(); - ((TensorFloat)m_Proxy.data)[m_Batch, ch, w] = value; + ((Tensor)m_Proxy.data)[m_Batch, ch, w] = value; } } } @@ -151,12 +145,9 @@ public float this[int index] } else { - if (m_Proxy.Device == DeviceType.GPU) - { - m_Proxy.data.MakeReadable(); - } + m_Proxy.data.CompleteAllPendingOperations(); - ((TensorFloat)m_Proxy.data)[m_Batch, ch + m_Offset, h, w] = value; + ((Tensor)m_Proxy.data)[m_Batch, ch + m_Offset, h, w] = value; } } } @@ -178,15 +169,12 @@ public void AddList(IList data, int writeOffset = 0) } else { - if (m_Proxy.Device == DeviceType.GPU) - { - m_Proxy.data.MakeReadable(); - } + m_Proxy.data.CompleteAllPendingOperations(); for (var index = 0; index < data.Count; index++) { var val = data[index]; - ((TensorFloat)m_Proxy.data)[m_Batch, index + m_Offset + writeOffset] = val; + ((Tensor)m_Proxy.data)[m_Batch, index + m_Offset + writeOffset] = val; } } } @@ -206,14 +194,11 @@ public void Add(Vector3 vec, int writeOffset = 0) } else { - if (m_Proxy.Device == DeviceType.GPU) - { - m_Proxy.data.MakeReadable(); - } + m_Proxy.data.CompleteAllPendingOperations(); - ((TensorFloat)m_Proxy.data)[m_Batch, m_Offset + writeOffset + 0] = vec.x; - ((TensorFloat)m_Proxy.data)[m_Batch, m_Offset + writeOffset + 1] = vec.y; - ((TensorFloat)m_Proxy.data)[m_Batch, m_Offset + writeOffset + 2] = vec.z; + ((Tensor)m_Proxy.data)[m_Batch, m_Offset + writeOffset + 0] = vec.x; + ((Tensor)m_Proxy.data)[m_Batch, m_Offset + writeOffset + 1] = vec.y; + ((Tensor)m_Proxy.data)[m_Batch, m_Offset + writeOffset + 2] = vec.z; } } @@ -233,15 +218,12 @@ public void Add(Vector4 vec, int writeOffset = 0) } else { - if (m_Proxy.Device == DeviceType.GPU) - { - m_Proxy.data.MakeReadable(); - } + m_Proxy.data.CompleteAllPendingOperations(); - ((TensorFloat)m_Proxy.data)[m_Batch, m_Offset + writeOffset + 0] = vec.x; - ((TensorFloat)m_Proxy.data)[m_Batch, m_Offset + writeOffset + 1] = vec.y; - ((TensorFloat)m_Proxy.data)[m_Batch, m_Offset + writeOffset + 2] = vec.z; - ((TensorFloat)m_Proxy.data)[m_Batch, m_Offset + writeOffset + 3] = vec.w; + ((Tensor)m_Proxy.data)[m_Batch, m_Offset + writeOffset + 0] = vec.x; + ((Tensor)m_Proxy.data)[m_Batch, m_Offset + writeOffset + 1] = vec.y; + ((Tensor)m_Proxy.data)[m_Batch, m_Offset + writeOffset + 2] = vec.z; + ((Tensor)m_Proxy.data)[m_Batch, m_Offset + writeOffset + 3] = vec.w; } } @@ -261,15 +243,12 @@ public void Add(Quaternion quat, int writeOffset = 0) } else { - if (m_Proxy.Device == DeviceType.GPU) - { - m_Proxy.data.MakeReadable(); - } + m_Proxy.data.CompleteAllPendingOperations(); - ((TensorFloat)m_Proxy.data)[m_Batch, m_Offset + writeOffset + 0] = quat.x; - ((TensorFloat)m_Proxy.data)[m_Batch, m_Offset + writeOffset + 1] = quat.y; - ((TensorFloat)m_Proxy.data)[m_Batch, m_Offset + writeOffset + 2] = quat.z; - ((TensorFloat)m_Proxy.data)[m_Batch, m_Offset + writeOffset + 3] = quat.w; + ((Tensor)m_Proxy.data)[m_Batch, m_Offset + writeOffset + 0] = quat.x; + ((Tensor)m_Proxy.data)[m_Batch, m_Offset + writeOffset + 1] = quat.y; + ((Tensor)m_Proxy.data)[m_Batch, m_Offset + writeOffset + 2] = quat.z; + ((Tensor)m_Proxy.data)[m_Batch, m_Offset + writeOffset + 3] = quat.w; } } } diff --git a/com.unity.ml-agents/Tests/Editor/Inference/DiscreteActionOutputApplierTest.cs b/com.unity.ml-agents/Tests/Editor/Inference/DiscreteActionOutputApplierTest.cs index 9bd9882e94..6413be4479 100644 --- a/com.unity.ml-agents/Tests/Editor/Inference/DiscreteActionOutputApplierTest.cs +++ b/com.unity.ml-agents/Tests/Editor/Inference/DiscreteActionOutputApplierTest.cs @@ -13,7 +13,7 @@ public void TestDiscreteApply() { var actionSpec = ActionSpec.MakeDiscrete(3, 2); - var applier = new DiscreteActionOutputApplier(actionSpec, 2020, null); + var applier = new DiscreteActionOutputApplier(actionSpec, 2020); var agentIds = new List { 42, 1337 }; var actionBuffers = new Dictionary(); actionBuffers[42] = new ActionBuffers(actionSpec); @@ -21,7 +21,7 @@ public void TestDiscreteApply() var actionTensor = new TensorProxy { - data = new TensorInt( + data = new Tensor( new TensorShape(2, 2), new[] { @@ -30,7 +30,7 @@ public void TestDiscreteApply() 0, // Agent 1, branch 0 0 // Agent 1, branch 1 }), - shape = new long[] { 2, 2 }, + shape = new int[] { 2, 2 }, valueType = TensorProxy.TensorType.Integer }; @@ -54,7 +54,7 @@ public void TestDiscreteApply() var logProbs = new TensorProxy { - data = new TensorFloat( + data = new Tensor( new TensorShape(2, 5), new[] { @@ -66,7 +66,7 @@ public void TestDiscreteApply() valueType = TensorProxy.TensorType.FloatingPoint }; - var applier = new LegacyDiscreteActionOutputApplier(actionSpec, 2020, null); + var applier = new LegacyDiscreteActionOutputApplier(actionSpec, 2020); var agentIds = new List { 42, 1337 }; var actionBuffers = new Dictionary(); actionBuffers[42] = new ActionBuffers(actionSpec); diff --git a/com.unity.ml-agents/Tests/Editor/Inference/EditModeTestInternalBrainTensorApplier.cs b/com.unity.ml-agents/Tests/Editor/Inference/EditModeTestInternalBrainTensorApplier.cs index 334cd05b67..d9cb034e60 100644 --- a/com.unity.ml-agents/Tests/Editor/Inference/EditModeTestInternalBrainTensorApplier.cs +++ b/com.unity.ml-agents/Tests/Editor/Inference/EditModeTestInternalBrainTensorApplier.cs @@ -14,11 +14,9 @@ class TestAgent : Agent { } public void Construction() { var actionSpec = new ActionSpec(); - var alloc = new TensorCachingAllocator(); var mem = new Dictionary>(); - var tensorGenerator = new TensorApplier(actionSpec, 0, alloc, mem); + var tensorGenerator = new TensorApplier(actionSpec, 0, mem); Assert.IsNotNull(tensorGenerator); - alloc.Dispose(); } [Test] @@ -27,8 +25,8 @@ public void ApplyContinuousActionOutput() var actionSpec = ActionSpec.MakeContinuous(3); var inputTensor = new TensorProxy() { - shape = new long[] { 2, 3 }, - data = new TensorFloat(new TensorShape(2, 3), new float[] { 1, 2, 3, 4, 5, 6 }) + shape = new int[] { 2, 3 }, + data = new Tensor(new TensorShape(2, 3), new float[] { 1, 2, 3, 4, 5, 6 }) }; var applier = new ContinuousActionOutputApplier(actionSpec); @@ -56,13 +54,12 @@ public void ApplyDiscreteActionOutputLegacy() var actionSpec = ActionSpec.MakeDiscrete(2, 3); var inputTensor = new TensorProxy() { - shape = new long[] { 2, 5 }, - data = new TensorFloat( + shape = new int[] { 2, 5 }, + data = new Tensor( new TensorShape(2, 5), new[] { 0.5f, 22.5f, 0.1f, 5f, 1f, 4f, 5f, 6f, 7f, 8f }) }; - var alloc = new TensorCachingAllocator(); - var applier = new LegacyDiscreteActionOutputApplier(actionSpec, 0, alloc); + var applier = new LegacyDiscreteActionOutputApplier(actionSpec, 0); var agentIds = new List() { 0, 1 }; @@ -77,7 +74,6 @@ public void ApplyDiscreteActionOutputLegacy() Assert.AreEqual(actionDict[1].DiscreteActions[0], 1); Assert.AreEqual(actionDict[1].DiscreteActions[1], 2); - alloc.Dispose(); } [Test] @@ -86,14 +82,13 @@ public void ApplyDiscreteActionOutput() var actionSpec = ActionSpec.MakeDiscrete(2, 3); var inputTensor = new TensorProxy() { - shape = new long[] { 2, 2 }, - data = new TensorInt( + shape = new int[] { 2, 2 }, + data = new Tensor( new TensorShape(2, 2), new[] { 1, 1, 1, 2 }), valueType = TensorProxy.TensorType.Integer }; - var alloc = new TensorCachingAllocator(); - var applier = new DiscreteActionOutputApplier(actionSpec, 0, alloc); + var applier = new DiscreteActionOutputApplier(actionSpec, 0); var agentIds = new List() { 0, 1 }; @@ -108,7 +103,6 @@ public void ApplyDiscreteActionOutput() Assert.AreEqual(actionDict[1].DiscreteActions[0], 1); Assert.AreEqual(actionDict[1].DiscreteActions[1], 2); - alloc.Dispose(); } [Test] @@ -117,19 +111,18 @@ public void ApplyHybridActionOutputLegacy() var actionSpec = new ActionSpec(3, new[] { 2, 3 }); var continuousInputTensor = new TensorProxy() { - shape = new long[] { 2, 3 }, - data = new TensorFloat(new TensorShape(2, 3), new float[] { 1, 2, 3, 4, 5, 6 }) + shape = new int[] { 2, 3 }, + data = new Tensor(new TensorShape(2, 3), new float[] { 1, 2, 3, 4, 5, 6 }) }; var discreteInputTensor = new TensorProxy() { - shape = new long[] { 2, 8 }, - data = new TensorFloat( + shape = new int[] { 2, 8 }, + data = new Tensor( new TensorShape(2, 5), new[] { 0.5f, 22.5f, 0.1f, 5f, 1f, 4f, 5f, 6f, 7f, 8f }) }; var continuousApplier = new ContinuousActionOutputApplier(actionSpec); - var alloc = new TensorCachingAllocator(); - var discreteApplier = new LegacyDiscreteActionOutputApplier(actionSpec, 0, alloc); + var discreteApplier = new LegacyDiscreteActionOutputApplier(actionSpec, 0); var agentIds = new List() { 0, 1 }; @@ -151,7 +144,6 @@ public void ApplyHybridActionOutputLegacy() Assert.AreEqual(actionDict[1].ContinuousActions[2], 6); Assert.AreEqual(actionDict[1].DiscreteActions[0], 1); Assert.AreEqual(actionDict[1].DiscreteActions[1], 2); - alloc.Dispose(); } [Test] @@ -160,21 +152,20 @@ public void ApplyHybridActionOutput() var actionSpec = new ActionSpec(3, new[] { 2, 3 }); var continuousInputTensor = new TensorProxy() { - shape = new long[] { 2, 3 }, - data = new TensorFloat(new TensorShape(2, 3), new float[] { 1, 2, 3, 4, 5, 6 }), + shape = new int[] { 2, 3 }, + data = new Tensor(new TensorShape(2, 3), new float[] { 1, 2, 3, 4, 5, 6 }), valueType = TensorProxy.TensorType.FloatingPoint }; var discreteInputTensor = new TensorProxy() { - shape = new long[] { 2, 2 }, - data = new TensorInt( + shape = new int[] { 2, 2 }, + data = new Tensor( new TensorShape(2, 2), new[] { 1, 1, 1, 2 }), valueType = TensorProxy.TensorType.Integer }; var continuousApplier = new ContinuousActionOutputApplier(actionSpec); - var alloc = new TensorCachingAllocator(); - var discreteApplier = new DiscreteActionOutputApplier(actionSpec, 0, alloc); + var discreteApplier = new DiscreteActionOutputApplier(actionSpec, 0); var agentIds = new List() { 0, 1 }; @@ -196,7 +187,6 @@ public void ApplyHybridActionOutput() Assert.AreEqual(actionDict[1].ContinuousActions[2], 6); Assert.AreEqual(actionDict[1].DiscreteActions[0], 1); Assert.AreEqual(actionDict[1].DiscreteActions[1], 2); - alloc.Dispose(); } } } diff --git a/com.unity.ml-agents/Tests/Editor/Inference/EditModeTestInternalBrainTensorGenerator.cs b/com.unity.ml-agents/Tests/Editor/Inference/EditModeTestInternalBrainTensorGenerator.cs index bb424df6be..d09e0884af 100644 --- a/com.unity.ml-agents/Tests/Editor/Inference/EditModeTestInternalBrainTensorGenerator.cs +++ b/com.unity.ml-agents/Tests/Editor/Inference/EditModeTestInternalBrainTensorGenerator.cs @@ -66,37 +66,31 @@ static List GetFakeAgents(ObservableAttributeOptions observableAttrib [Test] public void Construction() { - var alloc = new TensorCachingAllocator(); var mem = new Dictionary>(); - var tensorGenerator = new TensorGenerator(0, alloc, mem); + var tensorGenerator = new TensorGenerator(0, mem); Assert.IsNotNull(tensorGenerator); - alloc.Dispose(); } [Test] public void GenerateBatchSize() { var inputTensor = new TensorProxy(); - var alloc = new TensorCachingAllocator(); const int batchSize = 4; - var generator = new BatchSizeGenerator(alloc); + var generator = new BatchSizeGenerator(); generator.Generate(inputTensor, batchSize, null); Assert.IsNotNull(inputTensor.data); - Assert.AreEqual(((TensorInt)inputTensor.data)[0], batchSize); - alloc.Dispose(); + Assert.AreEqual(((Tensor)inputTensor.data)[0], batchSize); } [Test] public void GenerateSequenceLength() { var inputTensor = new TensorProxy(); - var alloc = new TensorCachingAllocator(); const int batchSize = 4; - var generator = new SequenceLengthGenerator(alloc); + var generator = new SequenceLengthGenerator(); generator.Generate(inputTensor, batchSize, null); Assert.IsNotNull(inputTensor.data); - Assert.AreEqual(((TensorInt)inputTensor.data)[0], 1); - alloc.Dispose(); + Assert.AreEqual(((Tensor)inputTensor.data)[0], 1); } [Test] @@ -105,12 +99,11 @@ public void GenerateVectorObservation() var inputTensor = new TensorProxy { valueType = TensorProxy.TensorType.FloatingPoint, - shape = new long[] { 2, 4 } + shape = new int[] { 2, 4 } }; const int batchSize = 4; var agentInfos = GetFakeAgents(ObservableAttributeOptions.ExamineAll); - var alloc = new TensorCachingAllocator(); - var generator = new ObservationGenerator(alloc); + var generator = new ObservationGenerator(); generator.AddSensorIndex(0); // ObservableAttribute (size 1) generator.AddSensorIndex(1); // TestSensor (size 0) generator.AddSensorIndex(2); // TestSensor (size 0) @@ -124,11 +117,10 @@ public void GenerateVectorObservation() }; generator.Generate(inputTensor, batchSize, inputs); Assert.IsNotNull(inputTensor.data); - Assert.AreEqual((int)((TensorFloat)inputTensor.data)[0, 1], 1); - Assert.AreEqual((int)((TensorFloat)inputTensor.data)[0, 3], 3); - Assert.AreEqual((int)((TensorFloat)inputTensor.data)[1, 1], 4); - Assert.AreEqual((int)((TensorFloat)inputTensor.data)[1, 3], 6); - alloc.Dispose(); + Assert.AreEqual((int)((Tensor)inputTensor.data)[0, 1], 1); + Assert.AreEqual((int)((Tensor)inputTensor.data)[0, 3], 3); + Assert.AreEqual((int)((Tensor)inputTensor.data)[1, 1], 4); + Assert.AreEqual((int)((Tensor)inputTensor.data)[1, 3], 6); } [Test] @@ -136,13 +128,12 @@ public void GeneratePreviousActionInput() { var inputTensor = new TensorProxy { - shape = new long[] { 2, 2 }, + shape = new int[] { 2, 2 }, valueType = TensorProxy.TensorType.Integer }; const int batchSize = 4; var agentInfos = GetFakeAgents(); - var alloc = new TensorCachingAllocator(); - var generator = new PreviousActionInputGenerator(alloc); + var generator = new PreviousActionInputGenerator(); var agent0 = agentInfos[0]; var agent1 = agentInfos[1]; var inputs = new List @@ -152,11 +143,10 @@ public void GeneratePreviousActionInput() }; generator.Generate(inputTensor, batchSize, inputs); Assert.IsNotNull(inputTensor.data); - Assert.AreEqual(((TensorInt)inputTensor.data)[0, 0], 1); - Assert.AreEqual(((TensorInt)inputTensor.data)[0, 1], 2); - Assert.AreEqual(((TensorInt)inputTensor.data)[1, 0], 3); - Assert.AreEqual(((TensorInt)inputTensor.data)[1, 1], 4); - alloc.Dispose(); + Assert.AreEqual(((Tensor)inputTensor.data)[0, 0], 1); + Assert.AreEqual(((Tensor)inputTensor.data)[0, 1], 2); + Assert.AreEqual(((Tensor)inputTensor.data)[1, 0], 3); + Assert.AreEqual(((Tensor)inputTensor.data)[1, 1], 4); } [Test] @@ -164,13 +154,12 @@ public void GenerateActionMaskInput() { var inputTensor = new TensorProxy { - shape = new long[] { 2, 5 }, + shape = new int[] { 2, 5 }, valueType = TensorProxy.TensorType.FloatingPoint }; const int batchSize = 4; var agentInfos = GetFakeAgents(); - var alloc = new TensorCachingAllocator(); - var generator = new ActionMaskInputGenerator(alloc); + var generator = new ActionMaskInputGenerator(); var agent0 = agentInfos[0]; var agent1 = agentInfos[1]; @@ -182,11 +171,10 @@ public void GenerateActionMaskInput() generator.Generate(inputTensor, batchSize, inputs); Assert.IsNotNull(inputTensor.data); - Assert.AreEqual((int)((TensorFloat)inputTensor.data)[0, 0], 1); - Assert.AreEqual((int)((TensorFloat)inputTensor.data)[0, 4], 1); - Assert.AreEqual((int)((TensorFloat)inputTensor.data)[1, 0], 0); - Assert.AreEqual((int)((TensorFloat)inputTensor.data)[1, 4], 1); - alloc.Dispose(); + Assert.AreEqual((int)((Tensor)inputTensor.data)[0, 0], 1); + Assert.AreEqual((int)((Tensor)inputTensor.data)[0, 4], 1); + Assert.AreEqual((int)((Tensor)inputTensor.data)[1, 0], 0); + Assert.AreEqual((int)((Tensor)inputTensor.data)[1, 4], 1); } } } diff --git a/com.unity.ml-agents/Tests/Editor/Inference/ParameterLoaderTest.cs b/com.unity.ml-agents/Tests/Editor/Inference/ParameterLoaderTest.cs index 66313d4043..72a9104b2d 100644 --- a/com.unity.ml-agents/Tests/Editor/Inference/ParameterLoaderTest.cs +++ b/com.unity.ml-agents/Tests/Editor/Inference/ParameterLoaderTest.cs @@ -173,77 +173,81 @@ public void TestModelExist() Assert.IsNotNull(hybridRecurrV2Model); } + [Test] public void TestGetInputTensorsContinuous() { var model = ModelLoader.Load(continuousONNXModel); - var inputNames = model.GetInputNames(); + var modelInfo = new SentisModelInfo(model); + var inputNames = modelInfo.InputNames; // Model should contain 3 inputs : vector, visual 1 and visual 2 Assert.AreEqual(3, inputNames.Count()); Assert.Contains(TensorNames.VectorObservationPlaceholder, inputNames); Assert.Contains(TensorNames.VisualObservationPlaceholderPrefix + "0", inputNames); Assert.Contains(TensorNames.VisualObservationPlaceholderPrefix + "1", inputNames); - Assert.AreEqual(2, model.GetNumVisualInputs()); + Assert.AreEqual(2, modelInfo.NumVisualInputs); - // Test if the model is null - model = null; - Assert.AreEqual(0, model.GetInputTensors().Count); - Assert.AreEqual(0, model.GetNumVisualInputs()); + modelInfo.Dispose(); } public void TestGetInputTensorsDiscrete() { var model = ModelLoader.Load(discreteONNXModel); - var inputNames = model.GetInputNames(); + var modelInfo = new SentisModelInfo(model); + var inputNames = modelInfo.InputNames; // Model should contain 2 inputs : recurrent and visual 1 Assert.Contains(TensorNames.VisualObservationPlaceholderPrefix + "0", inputNames); // TODO :There are some memory tensors as well + modelInfo.Dispose(); } [Test] public void TestGetInputTensorsHybrid() { var model = ModelLoader.Load(hybridONNXModel); - var inputNames = model.GetInputNames(); + var modelInfo = new SentisModelInfo(model); + var inputNames = modelInfo.InputNames; Assert.Contains(TensorNames.VectorObservationPlaceholder, inputNames); + modelInfo.Dispose(); } [Test] public void TestGetOutputTensorsContinuous() { var model = ModelLoader.Load(continuousONNXModel); - var outputNames = model.GetOutputNames(); + var modelInfo = new SentisModelInfo(model); + var outputNames = modelInfo.OutputNames; var actionOutputName = TensorNames.ContinuousActionOutput; Assert.Contains(actionOutputName, outputNames); Assert.AreEqual(1, outputNames.Count()); - - model = null; - Assert.AreEqual(0, model.GetOutputNames().Count()); + modelInfo.Dispose(); } [Test] public void TestGetOutputTensorsDiscrete() { var model = ModelLoader.Load(discreteONNXModel); - var outputNames = model.GetOutputNames(); + var modelInfo = new SentisModelInfo(model); + var outputNames = modelInfo.OutputNames; var actionOutputName = TensorNames.DiscreteActionOutput; Assert.Contains(actionOutputName, outputNames); // TODO : There are some memory tensors as well + modelInfo.Dispose(); } [Test] public void TestGetOutputTensorsHybrid() { var model = ModelLoader.Load(hybridONNXModel); - var outputNames = model.GetOutputNames(); + var modelInfo = new SentisModelInfo(model); + var outputNames = modelInfo.OutputNames; Assert.AreEqual(2, outputNames.Count()); Assert.Contains(TensorNames.ContinuousActionOutput, outputNames); Assert.Contains(TensorNames.DiscreteActionOutput, outputNames); - model = null; - Assert.AreEqual(0, model.GetOutputNames().Count()); + modelInfo.Dispose(); } [Test] diff --git a/com.unity.ml-agents/Tests/Editor/Inference/TensorUtilsTest.cs b/com.unity.ml-agents/Tests/Editor/Inference/TensorUtilsTest.cs index 555ad5e53f..d213819cb7 100644 --- a/com.unity.ml-agents/Tests/Editor/Inference/TensorUtilsTest.cs +++ b/com.unity.ml-agents/Tests/Editor/Inference/TensorUtilsTest.cs @@ -12,14 +12,13 @@ public class TensorUtilsTest [TestCase(8, TestName = "TestResizeTensor_8D")] public void TestResizeTensor(int dimension) { - var alloc = new TensorCachingAllocator(); var height = 64; var width = 84; var channels = 3; // Set shape to {1, ..., channels, height, width} // For 8D, the ... are all 1's - var shape = new long[dimension]; + var shape = new int[dimension]; for (var i = 0; i < dimension; i++) { shape[i] = 1; @@ -37,7 +36,7 @@ public void TestResizeTensor(int dimension) var tensorProxy = new TensorProxy { valueType = TensorProxy.TensorType.Integer, - data = TensorFloat.Zeros(new TensorShape(intShape)), + data = new Tensor(new TensorShape(intShape)), shape = shape, }; @@ -47,7 +46,7 @@ public void TestResizeTensor(int dimension) Assert.AreEqual(channels, tensorProxy.data.shape.Channels()); // TODO this resize is changing the tensor dimensions.need fix. - TensorUtils.ResizeTensor(tensorProxy, 42, alloc); + TensorUtils.ResizeTensor(tensorProxy, 42); Assert.AreEqual(height, tensorProxy.shape[dimension - 2]); Assert.AreEqual(width, tensorProxy.shape[dimension - 1]); @@ -56,8 +55,6 @@ public void TestResizeTensor(int dimension) Assert.AreEqual(height, tensorProxy.data.shape.Height()); Assert.AreEqual(width, tensorProxy.data.shape.Width()); Assert.AreEqual(channels, tensorProxy.data.shape.Channels()); - - alloc.Dispose(); } [Test] @@ -93,7 +90,7 @@ public void RandomNormalTestTensor() var t = new TensorProxy { valueType = TensorProxy.TensorType.FloatingPoint, - data = TensorFloat.Zeros(new TensorShape(1, 3, 4, 2)) + data = new Tensor(new TensorShape(1, 3, 4, 2)) }; TensorUtils.FillTensorWithRandomNormal(t, rn); @@ -128,7 +125,7 @@ public void RandomNormalTestTensor() for (var i = 0; i < t.data.Length(); i++) { - Assert.AreEqual(((TensorFloat)t.data)[i], reference[i], 0.0001); + Assert.AreEqual(((Tensor)t.data)[i], reference[i], 0.0001); } } } diff --git a/com.unity.ml-agents/Tests/Editor/TestModels/continuous2vis8vec2action_v1_0.onnx b/com.unity.ml-agents/Tests/Editor/TestModels/continuous2vis8vec2action_v1_0.onnx index 74581eb059c2e4e628a62a079f7b0d0c26de17de..45d991d4e15bd1077a8f3a8e1551bbc940e427f6 100644 GIT binary patch delta 530 zcmeyoP~^}e5fKhHA@+jGlKi6N3@K(qJ#(v7i$o?fF*{CfVRNh(XT$;5uM$!{4SPtIX|GWi0N@#FwDlgZA^ zN|TSWDNjyiUdgeXk&DUPh)aL6BD>~fN%oq_f-HucC$V2-nq0+YKlwkG^W?o;;*;&T zr6*tE(w-d2?Xmej_aT<)@i&;ork_z}l4{NtY|j>C1Y#y2X5OAH$g<^cq6`P40HYEM h0|SGD6Gq5uDIv+?2vIFLxEcm0EMc|Xil22SBLLN1t9$?e delta 455 zcmX@KNaXWE5fKhHA@+jGlKi6N3@K(qJ#(wu3q>aPGA2q&a50%0b1_+(3Ne|QOR>6S zmc<(?F$1Z|ku2tu-!Xoj{F&K!@&uO0lf&7JCyF{u-p8ginVEg%4i6#<)@$ZW)YaYigoSeE;f^ip^lRuuqjVo!@hQNFUL71 zF;Sq6Wq$mF4nTdoYGV+ zE)GTkMlTiyAXvc2vbl-p5R1AzNX$t%F}Wl&KQBJNw4|W4B)&K!u^<(!&_PQJtY9)P zqr5p(L<1}$lag7ST$Eap8jnjagO(y#<@EUitYT~+%?=bex~UZf w`9&qodsw&cVP#B{^3amuU=(0fVqsu#aB#x#qLv0smchXZuhXY1DKNeT0DXjKEC2ui delta 167 zcmbPnn5F*^iwFms5PLyoNq$jsh7_}*o`u!-gDe|gIx$ZaHJ+@^B0YHzi^pVJR`JPh zEcTN_Sf@{JVX>IZ!fIhEBmmZnG`3dF^Nx>W%QjqgK6tT z5u?e1Oi~lwj3gzvn2Zd7*ieYc$ViISF(oD5Qi&NzP4;1ynOI>wxt2+Kat3qUWJVUx z$rD)2Cm&_Dne4^lI{7$@u!3LgO(NtBUpB_ n9G|Q_R7@N!!kwF%n_pBJUz}N$3X))8*nE?vo?~+vuK*(eOF1*t diff --git a/com.unity.ml-agents/Tests/Editor/TestModels/discrete1vis0vec_2_3action_obsolete_recurr_v1_0.onnx b/com.unity.ml-agents/Tests/Editor/TestModels/discrete1vis0vec_2_3action_obsolete_recurr_v1_0.onnx index e7e6c0cce442e3b110f59b3a22b59a6cb7a36a6b..590906bc674794f452da209d4eb36a35c88d64fa 100644 GIT binary patch delta 686 zcmaKpJ!lhQ7{~7;xsNxw7>*FmG>MohV$qQJUfR19ti8AtaS()}9gZ}2rhz6G?;{YG zRs;iL2YH5!4mt})G>S`HbaZr3C^(DQNp$kHO+)=0{ygyfcz!(a-+ZjxA1DcdllgYn zcih@qiY?}6%e{dDx0ywF8(sodScDfM1|DH(le~;z5Th7e5?;dKNb1H}6z|xs*Kk^9 zD`>9TZoVkTe%++vMzylMYWtV!l?zvvgY|1UVac*ve#7sg3X+?4({a0|*SKMu9lJ)J zks}9osbnqie5YwvEz7pd{ma6xa5$)m+=R&1%gzoxnG}wQ74J?7vI1ndARZ z6%YJ#m+5aOx#YdmUtykm2u}qWy22eeMq~ISPQmBMl<=KK%o!aSu*2kGi+%%Tl!b+; z0+$(FI*b?%laypen@w>SgLM;^ax9sMAe|tcAbpI~J@n)?BeI}y)3D7wf>*o&Tf7SA zg=q*!N}!21$$VBI_j5YQ98s%dHJ+%opGYI>F;X!+M@L~4&B6zC65dBoL0L+}11Se9 zQsUM~>Ww6tgc*(`_DifkI1(!K>KT?KG^}UBE8jNK0v)GwA&R2T8Gp1qlbz6t@s|!~ i<^@^^llufkZ7%#C+3 delta 471 zcmbQgNupt+ga`+l5PLyoNq$jsh7_}*o|)B)4HBDUnFSapuVppn_{GS@WMs+ZH2uLf zR=vp+*!U(#vF)7f$!aVbyEWmz)$F4wxrXSq!#cXK;UoaZ>1 zkwZ^D&RY9Ou04y1XdC*Ok@ zWogXCWN9kIWN9YF=3AN*Z(^#%45TMN;FX`O&8In8kjYp~3TT@JP?@C=v!Q_j#7Yy( z$?bgdlUq>e@#F+%vFV$|*?x1% TaNo9OW zsT3R%KQLId@~K|Jsdcf{Po|WSBMHQrMoh8^baM%m98ok19k@y% zNoN#KoEl`8hHdkj}dRGR47_mBbiQ{X=8T0VUAN=l(J^l z$`2Za%%NZ7&N;Pzn5c71RMBpA7mS~wQDUP}BE+qc6+3aCZNkRN1rRDJP_D-bHvorQ=juVrp=M z3t@zb;2C!XNqa5wwlLN?BluhqgyISEJtC{?Vmp2J!iz^v@%4CTlV<#zn*oD*X z`WsLO5yB>MpW3t%m^;q>u|$v#|wK0Y8@dg zIeM||3_{GSN3o+Et$96olh=>Ayj-Ut^Btq9q?QPAq$p)#FkBb#-PM5mu8_4}VhtU? zT;)jR7vq(yj7e-p4=6g!v|}khjCs;8r0b-Ddj<_`6tCS1CP=@!GkD0hqtg+_Uy93} z3QiO#P`Q{-k=R6n8jeKVw5c***E^QfBO#6yom_kqFeehxOdu-rt)u6Yx)$O{ku7M& zEw_Qyf|Iz-H7!&Xh8awH`mxU=q1)raXD)^{&ruXvVwiUL(QIi#%2|el_Y7`Y%YeYN%thxXk~~aXUglJ_WBtzmW(5_EPDOcPqm^ZG9u?7Ff`3<& zJtwE8=D(E}i43J|16>2@%y@FRccQDwl0$2D=o+ss?!PWb>~th$CF2((DdFBRMc%A% cj&)^*d((r-!O?+KSH>)=sab4%DwHt)0I|jA!TT0w?uMM{=aK9ajqxs)e62+453Tr{1r znNd~=hg%F08YhZ4Pd>rq%dw1+i^<5COMh}9qx!}+9VU+DAOTCDfFhI3E4djrSJfDwu@_RnE$){N6PkzoS zJ=ucIYw`&;?}^&RlZDyiCTFtRPiA71p4`NyJ-Luwb@B>Ur^yOz5|h^g#ip@)*m2ni zap$Jy<`-4Q7iU(bN^v{q=M|SE=9R=7St@bBI9g&{tYwKgrKwt69E<{tUMvhiuz-RT^bXU?lkJg(+Y@Dzvd zEeqw6SxC>yMC%Wq*{*xx88-^U&a*JV>o6|p@ED7@bht!y*urv(I!w8PYa`UVXcUTB zGtcr?ZpJ9|YtoV5f8_SGRVy@}+F498iV*mJU)WXXMO6nH94u23s`J z7)KHh{mI^|$;903NN#C*dh~ogH+i{f?`@*!HL9ddZ1a|B6Vy0DM#o5%t0jzpd zA<9X_+$bb1V>vOgWXxGB^W{S+4BAs2Qb?z;AD}v@kS_Hf`L$opN^1%_$Pj$vx8x4W z4MZr>w6MhKn(Q3OE;3CeD3Bx-SQC7(L4B3`Vb~SA;VnH;dEMJEMI%@-iHikfe!`k( zdPF6t5D~jx)L+@*GuHzj$a8q(h`>Wf@PTs})}6cX$Q6Q}mJQUGu+ICMBppeb#6_cf zq|i^&N7@Nb#W+0SFTkYBr~4=ui(=A1K*C3p`77283r1CfO4}$G!8B1!b8dNo4PY8n zxaI1D+hRYw7rO%O=pSfUV=_N(-ejS$N>J(X2D35Hkl7p{6BWLT-LT^xgVUZd=y1ni z#WM)^+Xk#9x`=ob5$X=RmE|=ZLL$Vd+n;jW{bxYe;k^>dw*)PCH`_i o{!<6@c;bHt;tvUSfx~5j4YxHH_GGHV3h}kR*Wr_ zjo4B7hbFh}^Vk?KPdW=^*wL&eKxtBsgihBHD;_mA^i02Zmdtc!3s{ z;8=bO?vcG|O^o3*FP&zl(_Ro0cCr;vqzZf`23+N<@I{&jtfKqj=$Cp*2?)(T|~ygA#~?VtAm~f@j4uBd)Z`l?aNP zawU3gKVKJ!OwPk^?y$VVGMS8DZwN%-(5p@~n^hNAgxJOB*UL#Z-wnG_e<`wW^iajUVm4|I0&VixW;4^C%|h}Y DzT%5d diff --git a/com.unity.ml-agents/Tests/Runtime/Sensor/ObservationWriterTests.cs b/com.unity.ml-agents/Tests/Runtime/Sensor/ObservationWriterTests.cs index b45177037a..e22194b75f 100644 --- a/com.unity.ml-agents/Tests/Runtime/Sensor/ObservationWriterTests.cs +++ b/com.unity.ml-agents/Tests/Runtime/Sensor/ObservationWriterTests.cs @@ -44,37 +44,37 @@ public void TestWritesToTensor() var t = new TensorProxy { valueType = TensorProxy.TensorType.FloatingPoint, - data = TensorFloat.Zeros(new TensorShape(2, 3)) + data = new Tensor(new TensorShape(2, 3)) }; writer.SetTarget(t, 0, 0); - Assert.AreEqual(0f, ((TensorFloat)t.data)[0, 0]); + Assert.AreEqual(0f, ((Tensor)t.data)[0, 0]); writer[0] = 1f; - Assert.AreEqual(1f, ((TensorFloat)t.data)[0, 0]); + Assert.AreEqual(1f, ((Tensor)t.data)[0, 0]); writer.SetTarget(t, 1, 1); writer[0] = 2f; writer[1] = 3f; // [0, 0] shouldn't change - Assert.AreEqual(1f, ((TensorFloat)t.data)[0, 0]); - Assert.AreEqual(2f, ((TensorFloat)t.data)[1, 1]); - Assert.AreEqual(3f, ((TensorFloat)t.data)[1, 2]); + Assert.AreEqual(1f, ((Tensor)t.data)[0, 0]); + Assert.AreEqual(2f, ((Tensor)t.data)[1, 1]); + Assert.AreEqual(3f, ((Tensor)t.data)[1, 2]); // AddList t = new TensorProxy { valueType = TensorProxy.TensorType.FloatingPoint, - data = TensorFloat.Zeros(new TensorShape(2, 3)) + data = new Tensor(new TensorShape(2, 3)) }; writer.SetTarget(t, 1, 1); writer.AddList(new[] { -1f, -2f }); - Assert.AreEqual(0f, ((TensorFloat)t.data)[0, 0]); - Assert.AreEqual(0f, ((TensorFloat)t.data)[0, 1]); - Assert.AreEqual(0f, ((TensorFloat)t.data)[0, 2]); - Assert.AreEqual(0f, ((TensorFloat)t.data)[1, 0]); - Assert.AreEqual(-1f, ((TensorFloat)t.data)[1, 1]); - Assert.AreEqual(-2f, ((TensorFloat)t.data)[1, 2]); + Assert.AreEqual(0f, ((Tensor)t.data)[0, 0]); + Assert.AreEqual(0f, ((Tensor)t.data)[0, 1]); + Assert.AreEqual(0f, ((Tensor)t.data)[0, 2]); + Assert.AreEqual(0f, ((Tensor)t.data)[1, 0]); + Assert.AreEqual(-1f, ((Tensor)t.data)[1, 1]); + Assert.AreEqual(-2f, ((Tensor)t.data)[1, 2]); } [Test] @@ -84,16 +84,16 @@ public void TestWritesToTensor3D() var t = new TensorProxy { valueType = TensorProxy.TensorType.FloatingPoint, - data = TensorFloat.Zeros(new TensorShape(2, 3, 2, 2)) + data = new Tensor(new TensorShape(2, 3, 2, 2)) }; writer.SetTarget(t, 0, 0); writer[1, 1, 0] = 1f; - Assert.AreEqual(1f, ((TensorFloat)t.data)[0, 1, 1, 0]); + Assert.AreEqual(1f, ((Tensor)t.data)[0, 1, 1, 0]); writer.SetTarget(t, 0, 1); writer[0, 1, 0] = 2f; - Assert.AreEqual(2f, ((TensorFloat)t.data)[0, 1, 1, 0]); + Assert.AreEqual(2f, ((Tensor)t.data)[0, 1, 1, 0]); } } } diff --git a/com.unity.ml-agents/package.json b/com.unity.ml-agents/package.json index 69e2b3ba53..84c20f8ef9 100755 --- a/com.unity.ml-agents/package.json +++ b/com.unity.ml-agents/package.json @@ -5,7 +5,7 @@ "unity": "2023.2", "description": "Use state-of-the-art machine learning to create intelligent character behaviors in any Unity environment (games, robotics, film, etc.).", "dependencies": { - "com.unity.sentis": "1.3.0-pre.3", + "com.unity.sentis": "2.0.0", "com.unity.modules.imageconversion": "1.0.0", "com.unity.modules.jsonserialize": "1.0.0", "com.unity.modules.physics": "1.0.0" diff --git a/docs/Installation.md b/docs/Installation.md index 3cbd976b21..b88d8610bd 100644 --- a/docs/Installation.md +++ b/docs/Installation.md @@ -25,7 +25,7 @@ The ML-Agents Toolkit contains several components: Consequently, to install and use the ML-Agents Toolkit you will need to: - Install Unity (2023.2 or later) -- Install Python (3.10.12 or higher) +- Install Python (>= 3.10.1, <=3.10.12) - we recommend using 3.10.12 - Clone this repository (Recommended for the latest version and bug fixes) - __Note:__ If you do not clone the repository, then you will not be able to access the example environments and training configurations or the @@ -76,7 +76,15 @@ git clone --branch release_21 https://github.com/Unity-Technologies/ml-agents.gi ``` The `--branch release_21` option will switch to the tag of the latest stable -release. Omitting that will get the `main` branch which is potentially unstable. +release. Omitting that will get the `develop` branch which is potentially unstable. +However, if you find that a release branch does not work, the recommendation is to use +the `develop` branch as it may have potential fixes for bugs and dependency issues. + +(Optional to get bleeding edge) + +```sh +git clone --branch https://github.com/Unity-Technologies/ml-agents.git +``` #### Advanced: Local Installation for Development diff --git a/ml-agents/mlagents/torch_utils/torch.py b/ml-agents/mlagents/torch_utils/torch.py index 24dc45cca3..ce1fec7a57 100644 --- a/ml-agents/mlagents/torch_utils/torch.py +++ b/ml-agents/mlagents/torch_utils/torch.py @@ -52,9 +52,10 @@ def set_torch_config(torch_settings: TorchSettings) -> None: _device = torch.device(device_str) if _device.type == "cuda": - torch.set_default_tensor_type(torch.cuda.FloatTensor) + torch.set_default_device(_device.type) + torch.set_default_dtype(torch.cuda.FloatTensor) else: - torch.set_default_tensor_type(torch.FloatTensor) + torch.set_default_dtype(torch.float32) logger.debug(f"default Torch device: {_device}") diff --git a/ml-agents/mlagents/trainers/tests/test_torch_utils.py b/ml-agents/mlagents/trainers/tests/test_torch_utils.py index 7146831319..f0d69e3564 100644 --- a/ml-agents/mlagents/trainers/tests/test_torch_utils.py +++ b/ml-agents/mlagents/trainers/tests/test_torch_utils.py @@ -10,13 +10,13 @@ @pytest.mark.parametrize( "device_str, expected_type, expected_index, expected_tensor_type", [ - ("cpu", "cpu", None, torch.FloatTensor), + ("cpu", "cpu", None, torch.float32), ("cuda", "cuda", None, torch.cuda.FloatTensor), ("cuda:42", "cuda", 42, torch.cuda.FloatTensor), - ("opengl", "opengl", None, torch.FloatTensor), + ("opengl", "opengl", None, torch.float32), ], ) -@mock.patch.object(torch, "set_default_tensor_type") +@mock.patch.object(torch, "set_default_dtype") def test_set_torch_device( mock_set_default_tensor_type, device_str,

<^;T`Ko(yOET~0g))18 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%0A^%GK0{J>kHC{U76+ZgVAzENJ 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%0AQ8>q~rNi+sIkNd0n^Uid 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 delta 364 zcmW;Gze@sf00r>-eow#JX=;~0@|$IuE)L=0rPiW}Q&3|=%awAV(0OsDVByrzEC&ir z4s91v9FhM@^iR~(+SB2~gZGyA_d6l(&xFMMO!nOjZ%wP!=AyD+K6*lHb8=;W6K;oT z$-XD8cu|pPNtJ2wfO{LAfu?3egxjF+;y7O9Nr|dusK``38_~q(1&ir%ybBFgwmCmPNqO4bvKGz0RG!7zANjeTfwwM$Y5NAwWR{4|sur z5B#tK5(FR!s}O=PL|_eMScfRYAPx!GfFy9(gcNMSHl$$(b|C|Mko_Dvx$|I_FK>qi jy4CBLU9H(n51HU9x=Aa|5z`^86SnU!OvMB$otE+$%m&_sL`y zX1~dTjE0k~S)?aBF|M5438Y^$%1!PYz<^4=2qqQR%J#YW&&bnAZ7t#Rv=~rVs;?r*xstldF)EP z3D50tPq8>L32*`c<6x(L delta 410 zcmX^7S$)H2brB9WA@+jGlKi6N3@K(qJ#(uWpVcQHVEj9oo7s?k86y{yp#|4;#~-X3 zli#UxOzvYYnk>yCH#vmm_vF1yev|!Kw@nl^o@~P`J<-E>5{tByBo~vB84#NaF&P_5 zvH6zf#2cC^F$3v|RVI@yS)?Z`u(?lMXFNHbEmM+9hl|PBLWnIfxg;|`Pm0qyKQB44 zB;Lq$^KQ1IGVJmki~@{K!jmU53iEogFfcrD(9!@4O>SqDb%Kg0f<;6#i{q2?^GY)F zO7lx0%%c1pkP-$4Epf0C?%dSe{G!VE;>@a4h(vR}a(lfpBM>tIF*6Xe05K~NvjH(X z5OZv=SLXbFMOq4M0$*8bQ8Cb=@p+}WNvTC(LmZ|*_`!LfD@m3M>Wk@hKRLxTl)13G dNQjGzgM(3sg^P)UF-egN>^A{qK_?~wP5{W0aNqy{ diff --git a/Project/Assets/ML-Agents/Examples/DungeonEscape/TFModels/DungeonEscape.onnx.meta b/Project/Assets/ML-Agents/Examples/DungeonEscape/TFModels/DungeonEscape.onnx.meta index 338259ddcc..09f3590ee6 100644 --- a/Project/Assets/ML-Agents/Examples/DungeonEscape/TFModels/DungeonEscape.onnx.meta +++ b/Project/Assets/ML-Agents/Examples/DungeonEscape/TFModels/DungeonEscape.onnx.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: b56a13a0e996e4f719001b218cb87d5a +guid: 0247e0149942b4282becdb342cf1b6e2 ScriptedImporter: internalIDToNameTable: [] externalObjects: {} @@ -8,4 +8,3 @@ ScriptedImporter: assetBundleName: assetBundleVariant: script: {fileID: 11500000, guid: 683b6cb6d0a474744822c888b46772c9, type: 3} - optimizeModel: 1 diff --git a/Project/Assets/ML-Agents/Examples/FoodCollector/TFModels/GridFoodCollector.onnx b/Project/Assets/ML-Agents/Examples/FoodCollector/TFModels/GridFoodCollector.onnx index dd031af14a8b7015a20354bbd17a5730746a136e..03cddde13655c3d230980a1ba703b7788b4748fb 100644 GIT binary patch delta 659 zcmZ{i&ui0Q9LAfZN#48@DY2C;T@3_!u(H}TZL)b;TNE7r=%66D%S+n?*4ic`zp%UP zAmT}6d~f~({s9Ab_2R{YH^Dz)7Y|-!2M>NHMmJ=K4^Q6b$@9K1`R3$D_3LT1NF-I> zTf{*)-qi%N?%ersS_PZ$LPfOTvt+@lY{5(9JFyP#(n9Km(IoJhpUg*ISU1(H7ai^T zIEmt5&W5h*xopez{CE;C8V1Q8sY9>Ky*Y~}`yNZZvATq-AYA-5w8CI_I`g*UUcdiv zFr9VXbH$|xR35V-3s|IrsO$Ah4l~bnwy5l86;rPmmsFbnDu=}r_#{3){AmFvm*F<| z1^TFY-qKbm-)b%GWuBM+78~h=_#92s!q3I{k delta 399 zcmccdL-oZsRS^z0A@+jGlKi6N3@K(qJ#(uI-&7}OF};|)fZ2HRJLapC@39z96m{6F z!@7)VVyLl{Bo~v3DG-|pF`1Z4vH6zf#2cC@F$3wze>glRCvb{S4r2D3e2IPA#161( zQv)t0QzIcJQ)7r~BLlGNiMvcpfo7Q+1F;EE)>MkkF(oD5$ViD9NOOUt41w4HC}jrK zXbjQ#)?~6Et2D?Vre;8F0aRfr#THze6mMjv#0;b-mvQP&-p64-c`>KlbBb~U+H!tBT5@plkU=(08ftX{vr~>Eg hC}}CM34CR#Ma7xh)(cRJ}wOM7=TJccSf)+us@NApH3Ts>2bXji; z!tPn-;9sD(MMP9Q`!5K4SiE`lqQ@R|5Ce*M_%JZ@zK1t+b(nuR%J)%8m210RwO;yW zi1Da1`Tr;nD`ZyJ7;zkxjN67Z|Fg#9NmIlMML7W{vJD2c;kRPLFq>Lr(=7O-TyJbu zE4-(Q?fJ<3mf^GCOGM+$5 z{HbF|OU>`xikTu-_$u5!j~yI;!SRG4&AKkPEK|e^LnHx9G;#{$OoYGEIXub{IHq%Y zjFF_Jk|ZuJ*DP`i7l#$@=m6}|PoO9(aH&LKLm7i>C40Kb<~#OU+MkvtAc92HhT4&Y zWJHmI80tWss0($Y9u!0&q@rHbhqQ~9rcbpp15^kKW?LW-NTuK1X|&g$rc!DD3Zoho P{5FRCMPKAX;hOLS^g0pZ?1_h>K88tUFAJ5>{ zW=m5X9E4r;5M`kF`j}tufqe+f=H(O zE!=Mx6l&uaTg|3xm}!OypS%V(Dft`WN?6LsBu>ikNR}fzLLlHcnbp}ON|&U`B;X86 zW11R7b)vyok}iDp(pL$hh#>)qNJ2p*qY&aKjOI`TMNtgJ(L7Sn0!pCd$XC_iudYpx ZM^E>A$A_J^+wLFj?)PSIjF^(@l0S4kZj1l` diff --git a/Project/Assets/ML-Agents/Examples/GridWorld/Prefabs/agentRenderTexture.renderTexture b/Project/Assets/ML-Agents/Examples/GridWorld/Prefabs/agentRenderTexture.renderTexture index 81299c8644..2478730449 100644 --- a/Project/Assets/ML-Agents/Examples/GridWorld/Prefabs/agentRenderTexture.renderTexture +++ b/Project/Assets/ML-Agents/Examples/GridWorld/Prefabs/agentRenderTexture.renderTexture @@ -10,10 +10,8 @@ RenderTexture: m_ImageContentsHash: serializedVersion: 2 Hash: 00000000000000000000000000000000 - m_ForcedFallbackFormat: 4 - m_DownscaleFallback: 0 m_IsAlphaChannelOptional: 0 - serializedVersion: 5 + serializedVersion: 6 m_Width: 84 m_Height: 64 m_AntiAliasing: 1 @@ -24,8 +22,10 @@ RenderTexture: m_GenerateMips: 0 m_SRGB: 0 m_UseDynamicScale: 0 + m_UseDynamicScaleExplicit: 0 m_BindMS: 0 m_EnableCompatibleFormat: 1 + m_EnableRandomWrite: 0 m_TextureSettings: serializedVersion: 2 m_FilterMode: 0 diff --git a/Project/Assets/ML-Agents/Examples/GridWorld/TFModels/GridWorld.onnx b/Project/Assets/ML-Agents/Examples/GridWorld/TFModels/GridWorld.onnx index 14795e87002c782dcd05bb9e041ac94e3aa3288d..19cc201d175e7e2c2ae89230fe1aae36905ff0b6 100644 GIT binary patch delta 805 zcmZ|N&ui0Q7zgksY11@uvqsZu+iluSopr74(nU9&Yr9R&z@MnsP?JE*Xj7APS}zJ7 zy!(KHf_R@78CKMj2%_G^qk;qd3p@xOM86vp74`7peR-bueV*s=JbJp!etWjeDgrNu zTOHqV&02yh(!m6(QG#^*lw;M_x~A5 z#LTwmI}M|1S+-^9mfiI0ekY$6dRK8;lpA)#aXW@rzhWCpwu%0-^jjEy0&9%TOoN98Q{Ni^PVKbWKXq z6E;l)p)S2=U(mbI5Z&Wc`hwhBE>C^@B7NlJbVtaO&o8cI!)SO(7^XMED_V_oX^oiCt4%`4gdfE delta 644 zcmXZYzfTik7zgma@BQfAwE|vkD_3gu@MlH1>w7)gqHutUG*JiR;B*makVvU1)&w@< zVBBn;!NeHjEQ3P>L>*0xOBXg1{|E;cHAcThhfluA^E`Q;Xr}_YquS&~KT<*ybXRj|LK;y!%;3VKEp?2t z@)qqXc3Kos@=Y$rE%kb9HFOKMgrrS%kG@B9)*#v?D4X1K{*M&@jXcv*|76TKV02St!593gRGE`s!F2W_4geeGM z8fIV?F2fbL3UhD`=J&eE>X%O$>)?xhk7~{JmBw1Q)~YYmn!QH`!SkPAtAG9iqT$r< diff --git a/Project/Assets/ML-Agents/Examples/GridWorld/TFModels/GridWorld.onnx.meta b/Project/Assets/ML-Agents/Examples/GridWorld/TFModels/GridWorld.onnx.meta index 5fe5203d8f..392beed1be 100644 --- a/Project/Assets/ML-Agents/Examples/GridWorld/TFModels/GridWorld.onnx.meta +++ b/Project/Assets/ML-Agents/Examples/GridWorld/TFModels/GridWorld.onnx.meta @@ -8,4 +8,3 @@ ScriptedImporter: assetBundleName: assetBundleVariant: script: {fileID: 11500000, guid: 683b6cb6d0a474744822c888b46772c9, type: 3} - optimizeModel: 1 diff --git a/Project/Assets/ML-Agents/Examples/GridWorld/TFModels/GridWorldColab.onnx b/Project/Assets/ML-Agents/Examples/GridWorld/TFModels/GridWorldColab.onnx index 936a6179056acedd3ecdb76d063c13469395fa14..06b3e735b650edf6dcd64445e4265b03c8cb7465 100644 GIT binary patch delta 358 zcmdlq!{W(I3lR=BA@+jGlKi6N3@K(qJ#(uwGc6|9GCI1LbMfS+=EfIiR;9+5r6vn; z19|yHm0$rW0gv>sY`2sQ7gzU`Qm4SuU?mREl+?VE%#unjPcHV9_{8}9_+p{yf4KQ% zlcdCwON&eLbK?_JQc_dmVG0eA^w@C;l%*CGXXfX{=auFrr55QK3h|+eNC_n8XN3j$ zmAU45hesB=BqbsAZxqR5+`Nx*Dr55u=JpxPj6lo;#2_{c5VHa?8xXStF$WNH0x=g5 za|1CC5c6)I!OS<4-A{spQGij2g#iehP&}_C%E1VeTj1aX^PiRsOwhr>3Bv=^eYp9a F0RVo$ZyNvr delta 180 zcmaDd(_+&M3lR=BA@+jGlKi6N3@K(qJ#(vBGb}bsFlI4M6m{6##59$WLyLovgHeFd zY5F=IK3RD$76yg|4qD=1A@1DN-29@-_~Oi}RFDJ%L$er5yBG^25HkTWGZ2ILtU$~L z#Oy%K0mPg@%mu{UK+FTgyxYZC_-3(7OMy-0D@!dZ&dkq?&nwMMN-Y8z?BFo{A2;7K E08SGsS^xk5 diff --git a/Project/Assets/ML-Agents/Examples/Hallway/TFModels/Hallway.onnx b/Project/Assets/ML-Agents/Examples/Hallway/TFModels/Hallway.onnx index bde0dfbeacf816409ea3b1c37c12e4205ac43c9e..f5e6608bea74df3276a447cc1d63687ddce76c25 100644 GIT binary patch delta 453 zcmccdLU_U}VG#~CA@+jGlKi6N3@K(qJu|BxFNG(wGI>s(#Ns&l7pw7P4>se;8`+HO z?YIQWQj3Z+^Yh~KN^_G^i}VbI_)tZp1iZpsf=c|eJu4ie{4+c%9hEpdQ&RIvGD|AC zY`J)HQ*+~sGpkbL%TkktxPiR z{P<#_>5N}kWR-AeGDK*aC}J|XfXR09Hx|E%9?K`MWtuQqmrZ)&d%4NgY|@i?8Kp!e zxtPo>xR}fhgqX|?rPzE+bK;FGCMz;No$SY?G})GU^<)_q^T{umO(qAk*iXL9qCDA! zbsJch2~el85R;iDRF_%vPqy}-Y>Yt6wEZU=^KriEwI7)E+fBrnx0{Hu9J=Et!@(%P psKmm+;Nakd5tLdIFj)p?CzOEF66Iio$t`ejf(62M!Otx2i~vJSji&$r delta 283 zcmbR6O8CYLVG#~CA@+jGlKi6N3@K(qJu|BVFN7yCnM~f#w0yE4i`--{7OBbgEcYjh zdQ6UERhn$VWIH*HdBWrd*42}f*i0sCvzbqx#%4b;)^YMxHs#5MOn&T}8M&CujJT!; z2r`>ZHf67zIL}y05-4O0#HK<_W@b`szNIWr7obz9uiy!{aLq9L_itwSIM4iSv zjWtTn^WmXSO}_h zJy>1xKE}1>*U_!u8_Y%ZnCLitvaG%w26FDEV_bEfrf=8P8JcHg`i%2D6(iHe$aWND z=^D4v>=C2LLcuVxOpF{ICieBDd_9@LsA2$1L6x$`*ShbCX%<P-()H=&VpUK4SJ*`iVQCzxl$qs<2xXnA56&e&y1Gg}lDIBO}0qEZ_hS z1R#POz+eoFg9$JR9smi*KmiXy9!!C0@aS|$RzJ^sk3~jeirGwNanZeZ;JGQ0xtzPB kqpic@Uw2L&g)$lU&TY~^HT7%y-BVwseNQc9T_olH0o(YhPXGV_ delta 353 zcmW;F&r8B!90u_1`|5n1WxD*a-Vuejgrd205*)#c#81e&^eoC?l(`#T3sy5gU%$x_;bo|C zJ@V$K4gL!(`&;~;Xm>ydK*b4A7)5EGid0O9 zRsU~!Yc4)Af2*yU};1gCGpXNk9aJP#8%lf+&h28O6{Xnn!W8fD$N) z6tsv^D2*~GI~ga{@s7r3xACsywHt2BYIT}tjyHX-RDw}Wy$v4fDhu?wdK{`kBKi;b CQDXT3 diff --git a/Project/Assets/ML-Agents/Examples/Match3/TFModels/Match3VisualObs.onnx b/Project/Assets/ML-Agents/Examples/Match3/TFModels/Match3VisualObs.onnx index c20ba1c999f2e42fa00e78204343c84d02659410..3264e33910ee4b2f9db6f68587996bab5fcbf732 100644 GIT binary patch delta 1009 zcmZ|O%TE(g6vuI92HHBMSSwT*URr#jRLYd1AXtjLL=Y7p_+SKPlvi8m1Hp|kE?gKB z%}wl%g~q?YL^Q69dkq^gam5C=#HGf^w9y4O;=!li@2RsE^6U`k< z^$c5`lgY7($+oVEIn(FpHmz7{JTTz<5C+61!%{!V-rs7d! z*fcHE*yyR<)b8w7?WQqo#EqmUWB-;eulY|?U{ljCNzIFoB#l}%vr_486BW7sOl_sN z@afB$7fXsH`kj5kE9qh>SND~uawq`ZBZq>Ttv5Yo=yg7Ys{W8vS=ZNRG>J#jJNr+9 zU|>C{$+)!+w|FcCvxh?QBrl<5M+H&OsE}rBHBCbg`V^{YmxDsK1x1UiRJ@ga;*PCK ze3d`g-e)J)ixt`bY_-cRDwS+ih1cFC78L!}ko~(N7M!oeT7Kz+LD%A-OG^C7+}Av{ z55q1Q3UZML8|-jk8&o)v4;Kos9d7J^2Rl)SB6zV2#VCP>Qk0<_6{y5+?12we*o%GG zj{`V}L#W1K96=5IIEw7w1E_IZi z56++$eK?DLoWprszyL1d5-#Hk25}YFa2+==1OqoQj1i2&goRtUjWLX40+X0R6fwjx zjTt16L~1eYN`L;+SLTr1k}o$WCmfFavvbwO8?QMzku4ilUF489-hM|S8{4uNSWVld Ezn$+R$N&HU delta 799 zcmXZZJ8V*67{+l9hn{nwLJ@^p5UbQH3Q7-`wrUI1ORW~QYU`a|K#LZrP>j{FgERRC zMh6o|ml|<%&@K)d7whJxaWihBss14jzr4x&cY}uu{1m9 zmP5hVz!SDBza&W#BPLyKNEV~6TWTNUu3=$Ug0=Oy%PvxiA|~64;)|kJU2!q3`ouH! zjR=_arwyYd9#Q;FF&t_Y17c9I*K7%w!V52iLk(9a5@K2H5jpMc%9Q!1EE;l3j9Xt; zYr1%D@>JjHkuHld8b-unj7Hr`B9lq$VV}&jG^1XGh+=MKtTLb0BR-i~{S$UJ(n@t&;dI(!hucL3@2RZ#1?eH4G*@$i*4w}cI0iirE;!VNEa&knQWL+#k)ELtAF7CySaNA`Nq%m8VoFMCO1x)EYFCS69XVN6k;+ll45gANr^Wy zP+|tslUrF9%m&2lK+LgyzA9(ubUzsmMgc}876t|f2PcdW)RKV7GB7xygp8Ib T2O~`GfrAsw@6(<4a{dPZ55GM(JVsXzG-d;P>v!mq44E!1 g1vZMWEVZaOGe0jruQWF)wFqRIgTwUSdpZ9D0M^<`?*IS* diff --git a/Project/Assets/ML-Agents/Examples/PushBlockWithInput/Scripts/PushBlockActions.cs b/Project/Assets/ML-Agents/Examples/PushBlockWithInput/Scripts/PushBlockActions.cs index c05997bbb9..48c078f721 100644 --- a/Project/Assets/ML-Agents/Examples/PushBlockWithInput/Scripts/PushBlockActions.cs +++ b/Project/Assets/ML-Agents/Examples/PushBlockWithInput/Scripts/PushBlockActions.cs @@ -1,7 +1,7 @@ //------------------------------------------------------------------------------ // // This code was auto-generated by com.unity.inputsystem:InputActionCodeGenerator -// version 1.6.1 +// version 1.7.0 // from Assets/ML-Agents/Examples/PushBlockWithInput/PushBlockActions.inputactions // // Changes to this file may cause incorrect behavior and will be lost if diff --git a/Project/Assets/ML-Agents/Examples/PushBlockWithInput/TFModels/PushBlock.onnx b/Project/Assets/ML-Agents/Examples/PushBlockWithInput/TFModels/PushBlock.onnx index d74fca1aabcc5ae6d0da4c49f8ce09a18b431b2f..e6212b5dbc5d60c2dd7180922863a85c24b2e183 100644 GIT binary patch delta 623 zcmaELUG~;ZSrHC4A@+jGlKi6N3@K(qJ#(u=H)SUWGn-6iWi_5048(hYScBcT-i}M4 zEVZaOGe0jruQWF)wMfrUh!0gnN+8+IJv_0{zqr`HGQh9E$4807GbJ^zB(tQF%a)5L zH#IlDII}7>zAQCah#SbuFRBC!NQotv7MJAb#wVtvq^88f^cWy%=l14ePmWKF&yOz_ znx2-;F0Y3}lOd8OPcHTpsGi9QlCml|v=||237ozmi(Pc0_Qc7IEPfOB=qgHbF&SHM zF_{<$F_{=jvH6zf#2cC`F#~C?WsF=*MrM;QFltVgV62h?sx&bKVk4kRV<|Srl$3Zw zOC@F?J$WLd{N(qn(wjFhE@7PP&$11q*4P+`O@x??O`)b5f=!*gfK_I4Ae;T3BM>tIF*6Xe05K~Nvu&R%$^I=MS%!mAfKiEsfq}un2_t^B mB;c|PPAIXbB@CBwaDv5)mM8}!O!xs%7#j53*JZKWFaiL{5Vnv2 delta 359 zcmcb0Q})$$SuqYaA@+jGlKi6N3@K(qJ#(u|*JZf^r!UB67oF_LG;y*5vo6OnMlL2J zGcNtf3z;=1&t$HctivL=IhADz<3v&8$@|%)C!4T)h>3DB8Jh_)8JkP7xmFa!8yYJy z1L?^ZnfxbnvTd8_VLaKFS$bl%@nk_3>B+a)q$jR3p6mr=*04)YUdOI8`74|KJ+zi5W;wuHdlPe48UnkWGt&QGn5D@;pX)UN05~1_lQ$4Y0`cwK?pv@=zghun>1{ zYHof}WqfgFRVrA5Vfy|wX2a%EsrFJSMj&PaVrC#_0b*7lX4_sW#eOV6S_-V4uPn8w XI5R&lKCd)4DYXb<^!9n#>^6)5Jl