diff --git a/Project/Assets/ML-Agents/Examples/3DBall/Demos/Expert3DBall.demo.meta b/Project/Assets/ML-Agents/Examples/3DBall/Demos/Expert3DBall.demo.meta index 04e0c8ae44..abe1ab241d 100644 --- a/Project/Assets/ML-Agents/Examples/3DBall/Demos/Expert3DBall.demo.meta +++ b/Project/Assets/ML-Agents/Examples/3DBall/Demos/Expert3DBall.demo.meta @@ -4,7 +4,7 @@ ScriptedImporter: fileIDToRecycleName: 11400000: Assets/ML-Agents/Examples/3DBall/Demos/Expert3DBall.demo externalObjects: {} - userData: ' (MLAgents.Demonstrations.Demonstration)' + userData: ' (MLAgents.Demonstrations.DemonstrationSummary)' assetBundleName: assetBundleVariant: script: {fileID: 11500000, guid: 7bd65ce151aaa4a41a45312543c56be1, type: 3} diff --git a/Project/Assets/ML-Agents/Examples/3DBall/Demos/Expert3DBallHard.demo.meta b/Project/Assets/ML-Agents/Examples/3DBall/Demos/Expert3DBallHard.demo.meta index f7ef37fa9e..b9beb56b42 100644 --- a/Project/Assets/ML-Agents/Examples/3DBall/Demos/Expert3DBallHard.demo.meta +++ b/Project/Assets/ML-Agents/Examples/3DBall/Demos/Expert3DBallHard.demo.meta @@ -4,7 +4,7 @@ ScriptedImporter: fileIDToRecycleName: 11400000: Assets/ML-Agents/Examples/3DBall/Demos/Expert3DBallHard.demo externalObjects: {} - userData: ' (MLAgents.Demonstrations.Demonstration)' + userData: ' (MLAgents.Demonstrations.DemonstrationSummary)' assetBundleName: assetBundleVariant: script: {fileID: 11500000, guid: 7bd65ce151aaa4a41a45312543c56be1, type: 3} diff --git a/Project/Assets/ML-Agents/Examples/Basic/Demos/ExpertBasic.demo.meta b/Project/Assets/ML-Agents/Examples/Basic/Demos/ExpertBasic.demo.meta index a08dff9d64..5a37b13ff7 100644 --- a/Project/Assets/ML-Agents/Examples/Basic/Demos/ExpertBasic.demo.meta +++ b/Project/Assets/ML-Agents/Examples/Basic/Demos/ExpertBasic.demo.meta @@ -4,7 +4,7 @@ ScriptedImporter: fileIDToRecycleName: 11400000: Assets/ML-Agents/Examples/Basic/Demos/ExpertBasic.demo externalObjects: {} - userData: ' (MLAgents.Demonstrations.Demonstration)' + userData: ' (MLAgents.Demonstrations.DemonstrationSummary)' assetBundleName: assetBundleVariant: script: {fileID: 11500000, guid: 7bd65ce151aaa4a41a45312543c56be1, type: 3} diff --git a/Project/Assets/ML-Agents/Examples/Bouncer/Demos/ExpertBouncer.demo.meta b/Project/Assets/ML-Agents/Examples/Bouncer/Demos/ExpertBouncer.demo.meta index 5a35e67b69..ea852b696f 100644 --- a/Project/Assets/ML-Agents/Examples/Bouncer/Demos/ExpertBouncer.demo.meta +++ b/Project/Assets/ML-Agents/Examples/Bouncer/Demos/ExpertBouncer.demo.meta @@ -4,7 +4,7 @@ ScriptedImporter: fileIDToRecycleName: 11400000: Assets/ML-Agents/Examples/Bouncer/Demos/ExpertBouncer.demo externalObjects: {} - userData: ' (MLAgents.Demonstrations.Demonstration)' + userData: ' (MLAgents.Demonstrations.DemonstrationSummary)' assetBundleName: assetBundleVariant: script: {fileID: 11500000, guid: 7bd65ce151aaa4a41a45312543c56be1, type: 3} diff --git a/Project/Assets/ML-Agents/Examples/Crawler/Demos/ExpertCrawlerDyn.demo.meta b/Project/Assets/ML-Agents/Examples/Crawler/Demos/ExpertCrawlerDyn.demo.meta index a14f0c4475..9c608b13f1 100644 --- a/Project/Assets/ML-Agents/Examples/Crawler/Demos/ExpertCrawlerDyn.demo.meta +++ b/Project/Assets/ML-Agents/Examples/Crawler/Demos/ExpertCrawlerDyn.demo.meta @@ -4,7 +4,7 @@ ScriptedImporter: fileIDToRecycleName: 11400000: Assets/ML-Agents/Examples/Crawler/Demos/ExpertCrawlerDyn.demo externalObjects: {} - userData: ' (MLAgents.Demonstrations.Demonstration)' + userData: ' (MLAgents.Demonstrations.DemonstrationSummary)' assetBundleName: assetBundleVariant: script: {fileID: 11500000, guid: 7bd65ce151aaa4a41a45312543c56be1, type: 3} diff --git a/Project/Assets/ML-Agents/Examples/Crawler/Demos/ExpertCrawlerSta.demo.meta b/Project/Assets/ML-Agents/Examples/Crawler/Demos/ExpertCrawlerSta.demo.meta index 623b8a4fe6..e29755c4c8 100644 --- a/Project/Assets/ML-Agents/Examples/Crawler/Demos/ExpertCrawlerSta.demo.meta +++ b/Project/Assets/ML-Agents/Examples/Crawler/Demos/ExpertCrawlerSta.demo.meta @@ -4,7 +4,7 @@ ScriptedImporter: fileIDToRecycleName: 11400000: Assets/ML-Agents/Examples/Crawler/Demos/ExpertCrawlerSta.demo externalObjects: {} - userData: ' (MLAgents.Demonstrations.Demonstration)' + userData: ' (MLAgents.Demonstrations.DemonstrationSummary)' assetBundleName: assetBundleVariant: script: {fileID: 11500000, guid: 7bd65ce151aaa4a41a45312543c56be1, type: 3} diff --git a/Project/Assets/ML-Agents/Examples/FoodCollector/Demos/ExpertFood.demo.meta b/Project/Assets/ML-Agents/Examples/FoodCollector/Demos/ExpertFood.demo.meta index 7e1320816b..90a6191606 100644 --- a/Project/Assets/ML-Agents/Examples/FoodCollector/Demos/ExpertFood.demo.meta +++ b/Project/Assets/ML-Agents/Examples/FoodCollector/Demos/ExpertFood.demo.meta @@ -4,7 +4,7 @@ ScriptedImporter: fileIDToRecycleName: 11400000: Assets/ML-Agents/Examples/FoodCollector/Demos/ExpertFood.demo externalObjects: {} - userData: ' (MLAgents.Demonstrations.Demonstration)' + userData: ' (MLAgents.Demonstrations.DemonstrationSummary)' assetBundleName: assetBundleVariant: script: {fileID: 11500000, guid: 7bd65ce151aaa4a41a45312543c56be1, type: 3} diff --git a/Project/Assets/ML-Agents/Examples/GridWorld/Demos/ExpertGrid.demo.meta b/Project/Assets/ML-Agents/Examples/GridWorld/Demos/ExpertGrid.demo.meta index 562b7ba23d..43d024e70f 100644 --- a/Project/Assets/ML-Agents/Examples/GridWorld/Demos/ExpertGrid.demo.meta +++ b/Project/Assets/ML-Agents/Examples/GridWorld/Demos/ExpertGrid.demo.meta @@ -4,7 +4,7 @@ ScriptedImporter: fileIDToRecycleName: 11400000: Assets/ML-Agents/Examples/GridWorld/Demos/ExpertGrid.demo externalObjects: {} - userData: ' (MLAgents.Demonstrations.Demonstration)' + userData: ' (MLAgents.Demonstrations.DemonstrationSummary)' assetBundleName: assetBundleVariant: script: {fileID: 11500000, guid: 7bd65ce151aaa4a41a45312543c56be1, type: 3} diff --git a/Project/Assets/ML-Agents/Examples/Hallway/Demos/ExpertHallway.demo.meta b/Project/Assets/ML-Agents/Examples/Hallway/Demos/ExpertHallway.demo.meta index 257d6726f5..fecd234d0f 100644 --- a/Project/Assets/ML-Agents/Examples/Hallway/Demos/ExpertHallway.demo.meta +++ b/Project/Assets/ML-Agents/Examples/Hallway/Demos/ExpertHallway.demo.meta @@ -4,7 +4,7 @@ ScriptedImporter: fileIDToRecycleName: 11400000: Assets/ML-Agents/Examples/Hallway/Demos/ExpertHallway.demo externalObjects: {} - userData: ' (MLAgents.Demonstrations.Demonstration)' + userData: ' (MLAgents.Demonstrations.DemonstrationSummary)' assetBundleName: assetBundleVariant: script: {fileID: 11500000, guid: 7bd65ce151aaa4a41a45312543c56be1, type: 3} diff --git a/Project/Assets/ML-Agents/Examples/PushBlock/Demos/ExpertPush.demo.meta b/Project/Assets/ML-Agents/Examples/PushBlock/Demos/ExpertPush.demo.meta index b0403ebbc3..c860cfd6e5 100644 --- a/Project/Assets/ML-Agents/Examples/PushBlock/Demos/ExpertPush.demo.meta +++ b/Project/Assets/ML-Agents/Examples/PushBlock/Demos/ExpertPush.demo.meta @@ -4,7 +4,7 @@ ScriptedImporter: fileIDToRecycleName: 11400000: Assets/ML-Agents/Examples/PushBlock/Demos/ExpertPush.demo externalObjects: {} - userData: ' (MLAgents.Demonstrations.Demonstration)' + userData: ' (MLAgents.Demonstrations.DemonstrationSummary)' assetBundleName: assetBundleVariant: script: {fileID: 11500000, guid: 7bd65ce151aaa4a41a45312543c56be1, type: 3} diff --git a/Project/Assets/ML-Agents/Examples/Pyramids/Demos/ExpertPyramid.demo.meta b/Project/Assets/ML-Agents/Examples/Pyramids/Demos/ExpertPyramid.demo.meta index 8cedb1b302..9eede9c2b8 100644 --- a/Project/Assets/ML-Agents/Examples/Pyramids/Demos/ExpertPyramid.demo.meta +++ b/Project/Assets/ML-Agents/Examples/Pyramids/Demos/ExpertPyramid.demo.meta @@ -4,7 +4,7 @@ ScriptedImporter: fileIDToRecycleName: 11400000: Assets/ML-Agents/Examples/Pyramids/Demos/ExpertPyramid.demo externalObjects: {} - userData: ' (MLAgents.Demonstrations.Demonstration)' + userData: ' (MLAgents.Demonstrations.DemonstrationSummary)' assetBundleName: assetBundleVariant: script: {fileID: 11500000, guid: 7bd65ce151aaa4a41a45312543c56be1, type: 3} diff --git a/Project/Assets/ML-Agents/Examples/Reacher/Demos/ExpertReacher.demo.meta b/Project/Assets/ML-Agents/Examples/Reacher/Demos/ExpertReacher.demo.meta index 5b84bc89a6..9e5b388ddf 100644 --- a/Project/Assets/ML-Agents/Examples/Reacher/Demos/ExpertReacher.demo.meta +++ b/Project/Assets/ML-Agents/Examples/Reacher/Demos/ExpertReacher.demo.meta @@ -4,7 +4,7 @@ ScriptedImporter: fileIDToRecycleName: 11400000: Assets/ML-Agents/Examples/Reacher/Demos/ExpertReacher.demo externalObjects: {} - userData: ' (MLAgents.Demonstrations.Demonstration)' + userData: ' (MLAgents.Demonstrations.DemonstrationSummary)' assetBundleName: assetBundleVariant: script: {fileID: 11500000, guid: 7bd65ce151aaa4a41a45312543c56be1, type: 3} diff --git a/Project/Assets/ML-Agents/Examples/Tennis/Demos/ExpertTennis.demo.meta b/Project/Assets/ML-Agents/Examples/Tennis/Demos/ExpertTennis.demo.meta index 5519347c6b..b6ffd01178 100644 --- a/Project/Assets/ML-Agents/Examples/Tennis/Demos/ExpertTennis.demo.meta +++ b/Project/Assets/ML-Agents/Examples/Tennis/Demos/ExpertTennis.demo.meta @@ -4,7 +4,7 @@ ScriptedImporter: fileIDToRecycleName: 11400000: Assets/ML-Agents/Examples/Tennis/Demos/ExpertTennis.demo externalObjects: {} - userData: ' (MLAgents.Demonstrations.Demonstration)' + userData: ' (MLAgents.Demonstrations.DemonstrationSummary)' assetBundleName: assetBundleVariant: script: {fileID: 11500000, guid: 7bd65ce151aaa4a41a45312543c56be1, type: 3} diff --git a/Project/Assets/ML-Agents/Examples/Walker/Demos/ExpertWalker.demo.meta b/Project/Assets/ML-Agents/Examples/Walker/Demos/ExpertWalker.demo.meta index 21a36ec8b2..9841625eea 100644 --- a/Project/Assets/ML-Agents/Examples/Walker/Demos/ExpertWalker.demo.meta +++ b/Project/Assets/ML-Agents/Examples/Walker/Demos/ExpertWalker.demo.meta @@ -4,7 +4,7 @@ ScriptedImporter: fileIDToRecycleName: 11400000: Assets/ML-Agents/Examples/Walker/Demos/ExpertWalker.demo externalObjects: {} - userData: ' (MLAgents.Demonstrations.Demonstration)' + userData: ' (MLAgents.Demonstrations.DemonstrationSummary)' assetBundleName: assetBundleVariant: script: {fileID: 11500000, guid: 7bd65ce151aaa4a41a45312543c56be1, type: 3} diff --git a/Project/ProjectSettings/ProjectVersion.txt b/Project/ProjectSettings/ProjectVersion.txt index 9bebbca979..aac939d2ad 100644 --- a/Project/ProjectSettings/ProjectVersion.txt +++ b/Project/ProjectSettings/ProjectVersion.txt @@ -1 +1 @@ -m_EditorVersion: 2018.4.18f1 +m_EditorVersion: 2018.4.17f1 diff --git a/com.unity.ml-agents/CHANGELOG.md b/com.unity.ml-agents/CHANGELOG.md index ed328e4f7c..63d14b95e1 100755 --- a/com.unity.ml-agents/CHANGELOG.md +++ b/com.unity.ml-agents/CHANGELOG.md @@ -31,6 +31,9 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. - `StackingSensor` was changed from `internal` visibility to `public` - Updated Barracuda to 0.6.3-preview. + ### Bug Fixes + - Fixed a display bug when viewing Demonstration files in the inspector. The shapes of the observations in the file now display correctly. (#3771) + ## [0.15.1-preview] - 2020-03-30 ### Bug Fixes - Raise the wall in CrawlerStatic scene to prevent Agent from falling off. (#3650) diff --git a/com.unity.ml-agents/Editor/DemonstrationDrawer.cs b/com.unity.ml-agents/Editor/DemonstrationDrawer.cs index 3d3f88a0b7..0479ab07fb 100644 --- a/com.unity.ml-agents/Editor/DemonstrationDrawer.cs +++ b/com.unity.ml-agents/Editor/DemonstrationDrawer.cs @@ -1,3 +1,4 @@ +using System.Collections.Generic; using System.Text; using UnityEditor; using MLAgents.Demonstrations; @@ -7,19 +8,21 @@ namespace MLAgents.Editor { /// - /// Renders a custom UI for Demonstration Scriptable Object. + /// Renders a custom UI for DemonstrationSummary ScriptableObject. /// - [CustomEditor(typeof(Demonstration))] + [CustomEditor(typeof(DemonstrationSummary))] [CanEditMultipleObjects] internal class DemonstrationEditor : UnityEditor.Editor { SerializedProperty m_BrainParameters; SerializedProperty m_DemoMetaData; + SerializedProperty m_ObservationShapes; void OnEnable() { m_BrainParameters = serializedObject.FindProperty("brainParameters"); m_DemoMetaData = serializedObject.FindProperty("metaData"); + m_ObservationShapes = serializedObject.FindProperty("observationSummaries"); } /// @@ -28,25 +31,25 @@ void OnEnable() void MakeMetaDataProperty(SerializedProperty property) { var nameProp = property.FindPropertyRelative("demonstrationName"); - var expProp = property.FindPropertyRelative("numberExperiences"); - var epiProp = property.FindPropertyRelative("numberEpisodes"); - var rewProp = property.FindPropertyRelative("meanReward"); + var experiencesProp = property.FindPropertyRelative("numberSteps"); + var episodesProp = property.FindPropertyRelative("numberEpisodes"); + var rewardsProp = property.FindPropertyRelative("meanReward"); var nameLabel = nameProp.displayName + ": " + nameProp.stringValue; - var expLabel = expProp.displayName + ": " + expProp.intValue; - var epiLabel = epiProp.displayName + ": " + epiProp.intValue; - var rewLabel = rewProp.displayName + ": " + rewProp.floatValue; + var experiencesLabel = experiencesProp.displayName + ": " + experiencesProp.intValue; + var episodesLabel = episodesProp.displayName + ": " + episodesProp.intValue; + var rewardsLabel = rewardsProp.displayName + ": " + rewardsProp.floatValue; EditorGUILayout.LabelField(nameLabel); - EditorGUILayout.LabelField(expLabel); - EditorGUILayout.LabelField(epiLabel); - EditorGUILayout.LabelField(rewLabel); + EditorGUILayout.LabelField(experiencesLabel); + EditorGUILayout.LabelField(episodesLabel); + EditorGUILayout.LabelField(rewardsLabel); } /// - /// Constructs label for action size array. + /// Constructs label for a serialized integer array. /// - static string BuildActionArrayLabel(SerializedProperty actionSizeProperty) + static string BuildIntArrayLabel(SerializedProperty actionSizeProperty) { var actionSize = actionSizeProperty.arraySize; var actionLabel = new StringBuilder("[ "); @@ -64,35 +67,62 @@ static string BuildActionArrayLabel(SerializedProperty actionSizeProperty) } /// - /// Renders Inspector UI for Brain Parameters of Demonstration. + /// Renders Inspector UI for BrainParameters of a DemonstrationSummary. + /// Only the Action size and type are used from the BrainParameters. /// - void MakeBrainParametersProperty(SerializedProperty property) + void MakeActionsProperty(SerializedProperty property) { - var vecObsSizeProp = property.FindPropertyRelative("vectorObservationSize"); - var numStackedProp = property.FindPropertyRelative("numStackedVectorObservations"); var actSizeProperty = property.FindPropertyRelative("vectorActionSize"); var actSpaceTypeProp = property.FindPropertyRelative("vectorActionSpaceType"); - var vecObsSizeLabel = vecObsSizeProp.displayName + ": " + vecObsSizeProp.intValue; - var numStackedLabel = numStackedProp.displayName + ": " + numStackedProp.intValue; var vecActSizeLabel = - actSizeProperty.displayName + ": " + BuildActionArrayLabel(actSizeProperty); + actSizeProperty.displayName + ": " + BuildIntArrayLabel(actSizeProperty); var actSpaceTypeLabel = actSpaceTypeProp.displayName + ": " + (SpaceType)actSpaceTypeProp.enumValueIndex; - EditorGUILayout.LabelField(vecObsSizeLabel); - EditorGUILayout.LabelField(numStackedLabel); EditorGUILayout.LabelField(vecActSizeLabel); EditorGUILayout.LabelField(actSpaceTypeLabel); } + /// + /// Render the observation shapes of a DemonstrationSummary. + /// + /// + void MakeObservationsProperty(SerializedProperty obsSummariesProperty) + { + var shapesLabels = new List(); + var numObservations = obsSummariesProperty.arraySize; + for (var i = 0; i < numObservations; i++) + { + var summary = obsSummariesProperty.GetArrayElementAtIndex(i); + var shapeProperty = summary.FindPropertyRelative("shape"); + shapesLabels.Add(BuildIntArrayLabel(shapeProperty)); + } + + var shapeLabel = $"Shapes: {string.Join(", ", shapesLabels)}"; + EditorGUILayout.LabelField(shapeLabel); + + } + public override void OnInspectorGUI() { serializedObject.Update(); + EditorGUILayout.LabelField("Meta Data", EditorStyles.boldLabel); + EditorGUI.indentLevel++; MakeMetaDataProperty(m_DemoMetaData); - EditorGUILayout.LabelField("Brain Parameters", EditorStyles.boldLabel); - MakeBrainParametersProperty(m_BrainParameters); + EditorGUI.indentLevel--; + + EditorGUILayout.LabelField("Observations", EditorStyles.boldLabel); + EditorGUI.indentLevel++; + MakeObservationsProperty(m_ObservationShapes); + EditorGUI.indentLevel--; + + EditorGUILayout.LabelField("Actions", EditorStyles.boldLabel); + EditorGUI.indentLevel++; + MakeActionsProperty(m_BrainParameters); + EditorGUI.indentLevel--; + serializedObject.ApplyModifiedProperties(); } } diff --git a/com.unity.ml-agents/Editor/DemonstrationImporter.cs b/com.unity.ml-agents/Editor/DemonstrationImporter.cs index b338cc9540..6489d5022b 100644 --- a/com.unity.ml-agents/Editor/DemonstrationImporter.cs +++ b/com.unity.ml-agents/Editor/DemonstrationImporter.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.IO; using MLAgents.CommunicatorObjects; using UnityEditor; @@ -26,7 +27,7 @@ public override void OnImportAsset(AssetImportContext ctx) try { - // Read first two proto objects containing metadata and brain parameters. + // Read first three proto objects containing metadata, brain parameters, and observations. Stream reader = File.OpenRead(ctx.assetPath); var metaDataProto = DemonstrationMetaProto.Parser.ParseDelimitedFrom(reader); @@ -36,17 +37,30 @@ public override void OnImportAsset(AssetImportContext ctx) var brainParamsProto = BrainParametersProto.Parser.ParseDelimitedFrom(reader); var brainParameters = brainParamsProto.ToBrainParameters(); + // Read the first AgentInfoActionPair so that we can get the observation sizes. + List observationSummaries; + try + { + var agentInfoActionPairProto = AgentInfoActionPairProto.Parser.ParseDelimitedFrom(reader); + observationSummaries = agentInfoActionPairProto.GetObservationSummaries(); + } + catch + { + // Just in case there weren't any AgentInfoActionPair or they couldn't be read. + observationSummaries = new List(); + } + reader.Close(); - var demonstration = ScriptableObject.CreateInstance(); - demonstration.Initialize(brainParameters, metaData); - userData = demonstration.ToString(); + var demonstrationSummary = ScriptableObject.CreateInstance(); + demonstrationSummary.Initialize(brainParameters, metaData, observationSummaries); + userData = demonstrationSummary.ToString(); var texture = (Texture2D) AssetDatabase.LoadAssetAtPath(k_IconPath, typeof(Texture2D)); - ctx.AddObjectToAsset(ctx.assetPath, demonstration, texture); - ctx.SetMainObject(demonstration); + ctx.AddObjectToAsset(ctx.assetPath, demonstrationSummary, texture); + ctx.SetMainObject(demonstrationSummary); } catch { diff --git a/com.unity.ml-agents/Runtime/Communicator/GrpcExtensions.cs b/com.unity.ml-agents/Runtime/Communicator/GrpcExtensions.cs index 0ac9f1050d..77c8775828 100644 --- a/com.unity.ml-agents/Runtime/Communicator/GrpcExtensions.cs +++ b/com.unity.ml-agents/Runtime/Communicator/GrpcExtensions.cs @@ -17,6 +17,7 @@ namespace MLAgents { internal static class GrpcExtensions { + #region AgentInfo /// /// Converts a AgentInfo to a protobuf generated AgentInfoActionPairProto /// @@ -59,6 +60,29 @@ public static AgentInfoProto ToAgentInfoProto(this AgentInfo ai) return agentInfoProto; } + /// + /// Get summaries for the observations in the AgentInfo part of the AgentInfoActionPairProto. + /// + /// + /// + public static List GetObservationSummaries(this AgentInfoActionPairProto infoActionPair) + { + List summariesOut = new List(); + var agentInfo = infoActionPair.AgentInfo; + foreach (var obs in agentInfo.Observations) + { + var summary = new ObservationSummary(); + summary.shape = obs.Shape.ToArray(); + summariesOut.Add(summary); + } + + return summariesOut; + } + + + #endregion + + #region BrainParameters /// /// Converts a Brain into to a Protobuf BrainInfoProto so it can be sent /// @@ -80,6 +104,25 @@ public static BrainParametersProto ToProto(this BrainParameters bp, string name, return brainParametersProto; } + /// + /// Convert a BrainParametersProto to a BrainParameters struct. + /// + /// An instance of a brain parameters protobuf object. + /// A BrainParameters struct. + public static BrainParameters ToBrainParameters(this BrainParametersProto bpp) + { + var bp = new BrainParameters + { + vectorActionSize = bpp.VectorActionSize.ToArray(), + vectorActionDescriptions = bpp.VectorActionDescriptions.ToArray(), + vectorActionSpaceType = (SpaceType)bpp.VectorActionSpaceType + }; + return bp; + } + + #endregion + + #region DemonstrationMetaData /// /// Convert metadata object to proto object. /// @@ -89,7 +132,7 @@ public static DemonstrationMetaProto ToProto(this DemonstrationMetaData dm) { ApiVersion = DemonstrationMetaData.ApiVersion, MeanReward = dm.meanReward, - NumberSteps = dm.numberExperiences, + NumberSteps = dm.numberSteps, NumberEpisodes = dm.numberEpisodes, DemonstrationName = dm.demonstrationName }; @@ -104,7 +147,7 @@ public static DemonstrationMetaData ToDemonstrationMetaData(this DemonstrationMe var dm = new DemonstrationMetaData { numberEpisodes = demoProto.NumberEpisodes, - numberExperiences = demoProto.NumberSteps, + numberSteps = demoProto.NumberSteps, meanReward = demoProto.MeanReward, demonstrationName = demoProto.DemonstrationName }; @@ -114,22 +157,7 @@ public static DemonstrationMetaData ToDemonstrationMetaData(this DemonstrationMe } return dm; } - - /// - /// Convert a BrainParametersProto to a BrainParameters struct. - /// - /// An instance of a brain parameters protobuf object. - /// A BrainParameters struct. - public static BrainParameters ToBrainParameters(this BrainParametersProto bpp) - { - var bp = new BrainParameters - { - vectorActionSize = bpp.VectorActionSize.ToArray(), - vectorActionDescriptions = bpp.VectorActionDescriptions.ToArray(), - vectorActionSpaceType = (SpaceType)bpp.VectorActionSpaceType - }; - return bp; - } + #endregion public static UnityRLInitParameters ToUnityRLInitParameters(this UnityRLInitializationInputProto inputProto) { @@ -141,6 +169,7 @@ public static UnityRLInitParameters ToUnityRLInitParameters(this UnityRLInitiali }; } + #region AgentAction public static AgentAction ToAgentAction(this AgentActionProto aap) { return new AgentAction @@ -158,7 +187,9 @@ public static List ToAgentActionList(this UnityRLInputProto.Types.L } return agentActions; } + #endregion + #region Observations public static ObservationProto ToProto(this Observation obs) { ObservationProto obsProto = null; @@ -248,5 +279,6 @@ public static ObservationProto GetObservationProto(this ISensor sensor, WriteAda observationProto.Shape.AddRange(shape); return observationProto; } + #endregion } } diff --git a/com.unity.ml-agents/Runtime/Demonstrations/Demonstration.cs b/com.unity.ml-agents/Runtime/Demonstrations/Demonstration.cs deleted file mode 100644 index a09ea6ebf7..0000000000 --- a/com.unity.ml-agents/Runtime/Demonstrations/Demonstration.cs +++ /dev/null @@ -1,38 +0,0 @@ -using System; -using UnityEngine; -using MLAgents.Policies; - -namespace MLAgents.Demonstrations -{ - /// - /// Demonstration Object. Contains meta-data regarding demonstration. - /// Used for imitation learning, or other forms of learning from data. - /// - [Serializable] - internal class Demonstration : ScriptableObject - { - public DemonstrationMetaData metaData; - public BrainParameters brainParameters; - - public void Initialize(BrainParameters brainParams, - DemonstrationMetaData demonstrationMetaData) - { - brainParameters = brainParams; - metaData = demonstrationMetaData; - } - } - - /// - /// Demonstration meta-data. - /// Kept in a struct for easy serialization and deserialization. - /// - [Serializable] - internal class DemonstrationMetaData - { - public int numberExperiences; - public int numberEpisodes; - public float meanReward; - public string demonstrationName; - public const int ApiVersion = 1; - } -} diff --git a/com.unity.ml-agents/Runtime/Demonstrations/DemonstrationMetaData.cs b/com.unity.ml-agents/Runtime/Demonstrations/DemonstrationMetaData.cs new file mode 100644 index 0000000000..a5e07374bd --- /dev/null +++ b/com.unity.ml-agents/Runtime/Demonstrations/DemonstrationMetaData.cs @@ -0,0 +1,22 @@ +using System; +using UnityEngine; +using MLAgents.Policies; +using UnityEngine.Serialization; + +namespace MLAgents.Demonstrations +{ + /// + /// Demonstration meta-data. + /// Kept in a struct for easy serialization and deserialization. + /// + [Serializable] + internal class DemonstrationMetaData + { + [FormerlySerializedAs("numberExperiences")] + public int numberSteps; + public int numberEpisodes; + public float meanReward; + public string demonstrationName; + public const int ApiVersion = 1; + } +} diff --git a/com.unity.ml-agents/Runtime/Demonstrations/DemonstrationMetaData.cs.meta b/com.unity.ml-agents/Runtime/Demonstrations/DemonstrationMetaData.cs.meta new file mode 100644 index 0000000000..8e6ff39275 --- /dev/null +++ b/com.unity.ml-agents/Runtime/Demonstrations/DemonstrationMetaData.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: af5f3b4258a2d4ead90e733f30cfaa7a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.ml-agents/Runtime/Demonstrations/DemonstrationSummary.cs b/com.unity.ml-agents/Runtime/Demonstrations/DemonstrationSummary.cs new file mode 100644 index 0000000000..1beb53b87d --- /dev/null +++ b/com.unity.ml-agents/Runtime/Demonstrations/DemonstrationSummary.cs @@ -0,0 +1,37 @@ +using System; +using System.Collections.Generic; +using UnityEngine; +using MLAgents.Policies; + +namespace MLAgents.Demonstrations +{ + /// + /// Summary of a loaded Demonstration file. Only used for display in the Inspector. + /// + [Serializable] + internal class DemonstrationSummary : ScriptableObject + { + public DemonstrationMetaData metaData; + public BrainParameters brainParameters; + public List observationSummaries; + + public void Initialize(BrainParameters brainParams, + DemonstrationMetaData demonstrationMetaData, List obsSummaries) + { + brainParameters = brainParams; + metaData = demonstrationMetaData; + observationSummaries = obsSummaries; + } + } + + + /// + /// Summary of a loaded Observation. Currently only contains the shape of the Observation. + /// + /// This is necessary because serialization doesn't support nested containers or arrays. + [Serializable] + internal struct ObservationSummary + { + public int[] shape; + } +} diff --git a/com.unity.ml-agents/Runtime/Demonstrations/Demonstration.cs.meta b/com.unity.ml-agents/Runtime/Demonstrations/DemonstrationSummary.cs.meta similarity index 100% rename from com.unity.ml-agents/Runtime/Demonstrations/Demonstration.cs.meta rename to com.unity.ml-agents/Runtime/Demonstrations/DemonstrationSummary.cs.meta diff --git a/com.unity.ml-agents/Runtime/Demonstrations/DemonstrationWriter.cs b/com.unity.ml-agents/Runtime/Demonstrations/DemonstrationWriter.cs index e4fb4a4954..577663d25e 100644 --- a/com.unity.ml-agents/Runtime/Demonstrations/DemonstrationWriter.cs +++ b/com.unity.ml-agents/Runtime/Demonstrations/DemonstrationWriter.cs @@ -105,7 +105,7 @@ internal void Record(AgentInfo info, List sensors) } // Increment meta-data counters. - m_MetaData.numberExperiences++; + m_MetaData.numberSteps++; m_CumulativeReward += info.reward; if (info.done) { diff --git a/docs/Training-Imitation-Learning.md b/docs/Training-Imitation-Learning.md index a71d7ed166..ba3cba51e2 100644 --- a/docs/Training-Imitation-Learning.md +++ b/docs/Training-Imitation-Learning.md @@ -68,7 +68,7 @@ from the agent.

BC Teacher Helper

@@ -83,7 +83,7 @@ inspector.

BC Teacher Helper

@@ -101,4 +101,4 @@ And for GAIL: gail: demo_path: ... -``` \ No newline at end of file +``` diff --git a/docs/images/demo_inspector.png b/docs/images/demo_inspector.png index 9cb7a60980..d1d62bba84 100644 Binary files a/docs/images/demo_inspector.png and b/docs/images/demo_inspector.png differ