using System;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Experimental.Perception.Randomization.Samplers;
namespace UnityEngine.Experimental.Perception.Randomization.Parameters
{
///
/// Parameters, in conjunction with a parameter configuration, are used to create convenient interfaces for
/// randomizing simulations.
///
[Serializable]
public abstract class Parameter
{
[HideInInspector, SerializeField] internal bool collapsed;
///
/// The sample type generated by this parameter
///
public abstract Type sampleType { get; }
///
/// Returns an IEnumerable that iterates over each sampler field in this parameter
///
internal abstract IEnumerable samplers { get; }
///
/// Constructs a new parameter
///
protected Parameter()
{
InitializeSamplers();
}
///
/// Returns the display name of a parameter type
///
/// A subclass of Parameter
/// The parameter type's display name
public static string GetDisplayName(Type type)
{
return type.Name.Replace("Parameter", "");
}
///
/// Deterministically ensures that no sampler shares the same seed when a parameter is initialized
///
void InitializeSamplers()
{
var i = 0;
foreach (var sampler in samplers)
{
sampler.IterateState(i++);
sampler.ResetState();
}
}
internal void RandomizeSamplers()
{
foreach (var sampler in samplers)
{
sampler.baseSeed = SamplerUtility.GenerateRandomSeed();
sampler.ResetState();
}
}
///
/// Resets the state of each sampler employed by this parameter
///
public void ResetState()
{
foreach (var sampler in samplers)
sampler.ResetState();
}
///
/// Offsets the state of each sampler employed by this parameter
///
/// Often the current scenario iteration
public void IterateState(int offsetIndex)
{
foreach (var sampler in samplers)
sampler.IterateState(offsetIndex);
}
///
/// Generates a generic sample
///
/// The generated sample
public abstract object GenericSample();
///
/// Validates parameter settings
///
public virtual void Validate() { }
}
}