|
using System.Collections.Generic; |
|
using System.Text; |
|
using UnityEditor; |
|
using Unity.MLAgents.Demonstrations; |
|
|
|
namespace Unity.MLAgents.Editor |
|
{ |
|
|
|
|
|
|
|
[CustomEditor(typeof(DemonstrationSummary))] |
|
[CanEditMultipleObjects] |
|
internal class DemonstrationEditor : UnityEditor.Editor |
|
{ |
|
SerializedProperty m_BrainParameters; |
|
SerializedProperty m_DemoMetaData; |
|
SerializedProperty m_ObservationShapes; |
|
const string k_BrainParametersName = "brainParameters"; |
|
const string k_MetaDataName = "metaData"; |
|
const string k_ObservationSummariesName = "observationSummaries"; |
|
const string k_DemonstrationName = "demonstrationName"; |
|
const string k_NumberStepsName = "numberSteps"; |
|
const string k_NumberEpisodesName = "numberEpisodes"; |
|
const string k_MeanRewardName = "meanReward"; |
|
const string k_ActionSpecName = "m_ActionSpec"; |
|
const string k_NumContinuousActionsName = "m_NumContinuousActions"; |
|
const string k_NumDiscreteActionsName = "BranchSizes"; |
|
const string k_ShapeName = "shape"; |
|
|
|
|
|
void OnEnable() |
|
{ |
|
m_BrainParameters = serializedObject.FindProperty(k_BrainParametersName); |
|
m_DemoMetaData = serializedObject.FindProperty(k_MetaDataName); |
|
m_ObservationShapes = serializedObject.FindProperty(k_ObservationSummariesName); |
|
} |
|
|
|
|
|
|
|
|
|
void MakeMetaDataProperty(SerializedProperty property) |
|
{ |
|
var nameProp = property.FindPropertyRelative(k_DemonstrationName); |
|
var experiencesProp = property.FindPropertyRelative(k_NumberStepsName); |
|
var episodesProp = property.FindPropertyRelative(k_NumberEpisodesName); |
|
var rewardsProp = property.FindPropertyRelative(k_MeanRewardName); |
|
|
|
var nameLabel = nameProp.displayName + ": " + nameProp.stringValue; |
|
var experiencesLabel = experiencesProp.displayName + ": " + experiencesProp.intValue; |
|
var episodesLabel = episodesProp.displayName + ": " + episodesProp.intValue; |
|
var rewardsLabel = rewardsProp.displayName + ": " + rewardsProp.floatValue; |
|
|
|
EditorGUILayout.LabelField(nameLabel); |
|
EditorGUILayout.LabelField(experiencesLabel); |
|
EditorGUILayout.LabelField(episodesLabel); |
|
EditorGUILayout.LabelField(rewardsLabel); |
|
} |
|
|
|
|
|
|
|
|
|
static string BuildIntArrayLabel(SerializedProperty actionSizeProperty) |
|
{ |
|
var actionSize = actionSizeProperty.arraySize; |
|
var actionLabel = new StringBuilder("[ "); |
|
for (var i = 0; i < actionSize; i++) |
|
{ |
|
actionLabel.Append(actionSizeProperty.GetArrayElementAtIndex(i).intValue); |
|
if (i < actionSize - 1) |
|
{ |
|
actionLabel.Append(", "); |
|
} |
|
} |
|
|
|
actionLabel.Append(" ]"); |
|
return actionLabel.ToString(); |
|
} |
|
|
|
|
|
|
|
|
|
|
|
void MakeActionsProperty(SerializedProperty property) |
|
{ |
|
var actSpecProperty = property.FindPropertyRelative(k_ActionSpecName); |
|
var continuousSizeProperty = actSpecProperty.FindPropertyRelative(k_NumContinuousActionsName); |
|
var discreteSizeProperty = actSpecProperty.FindPropertyRelative(k_NumDiscreteActionsName); |
|
var continuousSizeLabel = "Continuous Actions: " + continuousSizeProperty.intValue; |
|
var discreteSizeLabel = "Discrete Action Branches: "; |
|
discreteSizeLabel += discreteSizeProperty == null ? "[]" : BuildIntArrayLabel(discreteSizeProperty); |
|
EditorGUILayout.LabelField(continuousSizeLabel); |
|
EditorGUILayout.LabelField(discreteSizeLabel); |
|
} |
|
|
|
|
|
|
|
|
|
|
|
void MakeObservationsProperty(SerializedProperty obsSummariesProperty) |
|
{ |
|
var shapesLabels = new List<string>(); |
|
var numObservations = obsSummariesProperty.arraySize; |
|
for (var i = 0; i < numObservations; i++) |
|
{ |
|
var summary = obsSummariesProperty.GetArrayElementAtIndex(i); |
|
var shapeProperty = summary.FindPropertyRelative(k_ShapeName); |
|
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); |
|
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(); |
|
} |
|
} |
|
} |
|
|