using System;
using MLAgents.CommunicatorObjects;
using UnityEngine;
namespace MLAgents
{
///
/// Demonstration Object. Contains meta-data regarding demonstration.
/// Used for imitation learning, or other forms of learning from data.
///
[Serializable]
public class Demonstration : ScriptableObject
{
public DemonstrationMetaData metaData;
public BrainParameters brainParameters;
public void Initialize(BrainParameters brainParameters,
DemonstrationMetaData demonstrationMetaData)
{
this.brainParameters = brainParameters;
metaData = demonstrationMetaData;
}
}
///
/// Demonstration meta-data.
/// Kept in a struct for easy serialization and deserialization.
///
[Serializable]
public class DemonstrationMetaData
{
public int numberExperiences;
public int numberEpisodes;
public float meanReward;
public string demonstrationName;
public const int ApiVersion = 1;
///
/// Constructor for initializing metadata to default values.
///
public DemonstrationMetaData()
{
}
///
/// Initialize metadata values based on proto object.
///
public DemonstrationMetaData(DemonstrationMetaProto demoProto)
{
numberEpisodes = demoProto.NumberEpisodes;
numberExperiences = demoProto.NumberSteps;
meanReward = demoProto.MeanReward;
demonstrationName = demoProto.DemonstrationName;
if (demoProto.ApiVersion != ApiVersion)
{
throw new Exception("API versions of demonstration are incompatible.");
}
}
///
/// Convert metadata object to proto object.
///
public DemonstrationMetaProto ToProto()
{
var demoProto = new DemonstrationMetaProto
{
ApiVersion = ApiVersion,
MeanReward = meanReward,
NumberSteps = numberExperiences,
NumberEpisodes = numberEpisodes,
DemonstrationName = demonstrationName
};
return demoProto;
}
}
}