Files
UnrealEngine/Engine/Plugins/Experimental/LearningAgents/Source/Learning/Public/LearningAction.h
2025-05-18 13:04:45 +08:00

823 lines
28 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "LearningArray.h"
#include "UObject/NameTypes.h"
namespace UE::NNE::RuntimeBasic
{
class FModelBuilderElement;
class FModelBuilder;
}
namespace UE::Learning::Action
{
/**
* Action Type
*
* The core type of an action object for which different loss functions and behaviors are defined.
*/
enum class EType : uint8
{
// Empty Action
Null = 0,
// Vector of continuous float actions
Continuous = 1,
// Set of exclusive discrete actions
DiscreteExclusive = 2,
// Set of inclusive discrete actions
DiscreteInclusive = 3,
// Set of named exclusive discrete actions
NamedDiscreteExclusive = 4,
// Set of named inclusive discrete actions
NamedDiscreteInclusive = 5,
// Combination of multiple actions
And = 6,
// Exclusive choice from a set of actions
OrExclusive = 7,
// Inclusive choice from a set of actions
OrInclusive = 8,
// Fixed sized array of actions
Array = 9,
// Encoding of another action
Encoding = 10,
};
/**
* Action Schema Element
*
* A single element in the action schema representing a part of an action. Internally this consists of a index used by the schema to look up
* the associated action data and a generation id which can be used to check when this index is no longer valid.
*/
struct FSchemaElement { int32 Index = INDEX_NONE; uint32 Generation = INDEX_NONE; };
struct FSchemaContinuousParameters
{
// Number of values in the continuous action
int32 Num = 0;
// Scale factor for the continuous action
float Scale = 1.0f;
};
struct FSchemaDiscreteExclusiveParameters
{
// Number of choices in the discrete action
int32 Num = 0;
// Prior Probabilities of the discrete actions.
TArrayView<const float> PriorProbabilities;
};
struct FSchemaDiscreteInclusiveParameters
{
// Number of choices in the discrete action
int32 Num = 0;
// Prior Probabilities of the discrete actions.
TArrayView<const float> PriorProbabilities;
};
struct FSchemaNamedDiscreteExclusiveParameters
{
// Names of the discrete actions.
TArrayView<const FName> ElementNames;
// Prior Probabilities of the discrete actions.
TArrayView<const float> PriorProbabilities;
};
struct FSchemaNamedDiscreteInclusiveParameters
{
// Names of the discrete actions.
TArrayView<const FName> ElementNames;
// Prior Probabilities of the discrete actions.
TArrayView<const float> PriorProbabilities;
};
struct FSchemaAndParameters
{
// Names of the sub-actions.
TArrayView<const FName> ElementNames;
// The associated sub-elements.
TArrayView<const FSchemaElement> Elements;
};
struct FSchemaOrExclusiveParameters
{
// Names of the sub-actions.
TArrayView<const FName> ElementNames;
// The associated sub-elements.
TArrayView<const FSchemaElement> Elements;
// Prior Probabilities of the sub-actions.
TArrayView<const float> PriorProbabilities;
};
struct FSchemaOrInclusiveParameters
{
// Names of the sub-actions.
TArrayView<const FName> ElementNames;
// The associated sub-elements.
TArrayView<const FSchemaElement> Elements;
// Prior Probabilities of the sub-actions.
TArrayView<const float> PriorProbabilities;
};
struct FSchemaArrayParameters
{
// The array sub-element.
FSchemaElement Element;
// The number of elements in the array.
int32 Num = 0;
};
/** Activation Function to use for encoding */
enum class EEncodingActivationFunction : uint8
{
ELU = 0,
ReLU = 1,
TanH = 2,
GELU = 3,
};
struct FSchemaEncodingParameters
{
// The sub-element.
FSchemaElement Element;
// The size at which the sub-element should be encoded.
int32 EncodingSize = 32;
// The number of layers in the encoding
int32 LayerNum = 1;
// The activation function to use for encoding
EEncodingActivationFunction ActivationFunction = EEncodingActivationFunction::ELU;
};
/**
* Action Schema
*
* This object allows you to construct a description of the kind of actions you might want to be generated by a policy. Internally this object
* contains a pool of individual elements. This allows them to be constructed performantly and in a cache efficient way. This object is therefore
* required to access any data about the individual action elements that are created.
*/
struct LEARNING_API FSchema
{
FSchemaElement CreateNull(const FName Tag = NAME_None);
FSchemaElement CreateContinuous(const FSchemaContinuousParameters Parameters, const FName Tag = NAME_None);
FSchemaElement CreateDiscreteExclusive(const FSchemaDiscreteExclusiveParameters Parameters, const FName Tag = NAME_None);
FSchemaElement CreateDiscreteInclusive(const FSchemaDiscreteInclusiveParameters Parameters, const FName Tag = NAME_None);
FSchemaElement CreateNamedDiscreteExclusive(const FSchemaNamedDiscreteExclusiveParameters Parameters, const FName Tag = NAME_None);
FSchemaElement CreateNamedDiscreteInclusive(const FSchemaNamedDiscreteInclusiveParameters Parameters, const FName Tag = NAME_None);
FSchemaElement CreateAnd(const FSchemaAndParameters Parameters, const FName Tag = NAME_None);
FSchemaElement CreateOrExclusive(const FSchemaOrExclusiveParameters Parameters, const FName Tag = NAME_None);
FSchemaElement CreateOrInclusive(const FSchemaOrInclusiveParameters Parameters, const FName Tag = NAME_None);
FSchemaElement CreateArray(const FSchemaArrayParameters Parameters, const FName Tag = NAME_None);
FSchemaElement CreateEncoding(const FSchemaEncodingParameters Parameters, const FName Tag = NAME_None);
FSchemaContinuousParameters GetContinuous(const FSchemaElement Element) const;
FSchemaDiscreteExclusiveParameters GetDiscreteExclusive(const FSchemaElement Element) const;
FSchemaDiscreteInclusiveParameters GetDiscreteInclusive(const FSchemaElement Element) const;
FSchemaNamedDiscreteExclusiveParameters GetNamedDiscreteExclusive(const FSchemaElement Element) const;
FSchemaNamedDiscreteInclusiveParameters GetNamedDiscreteInclusive(const FSchemaElement Element) const;
FSchemaAndParameters GetAnd(const FSchemaElement Element) const;
FSchemaOrExclusiveParameters GetOrExclusive(const FSchemaElement Element) const;
FSchemaOrInclusiveParameters GetOrInclusive(const FSchemaElement Element) const;
FSchemaArrayParameters GetArray(const FSchemaElement Element) const;
FSchemaEncodingParameters GetEncoding(const FSchemaElement Element) const;
// Checks if the given element is valid
bool IsValid(const FSchemaElement Element) const;
// Gets the type of the given element
EType GetType(const FSchemaElement Element) const;
// Gets the tag of the given element
FName GetTag(const FSchemaElement Element) const;
// Get the encoded vector size of the given element
int32 GetEncodedVectorSize(const FSchemaElement Element) const;
// Get the action vector size of the given element
int32 GetActionVectorSize(const FSchemaElement Element) const;
// Get the action distribution vector size of the given element
int32 GetActionDistributionVectorSize(const FSchemaElement Element) const;
// Get the action modifier vector size of the given element
int32 GetActionModifierVectorSize(const FSchemaElement Element) const;
// Get the current generation
uint32 GetGeneration() const;
// Checks if the given schema is empty of elements.
bool IsEmpty() const;
// Empty all internal buffers of elements. This invalidates all existing elements.
void Empty();
// Reset all internal buffers (without freeing memory). This invalidates all existing elements.
void Reset();
private:
struct FContinuousData
{
int32 Num = INDEX_NONE;
float Scale = 0.0f;
};
struct FDiscreteExclusiveData
{
int32 Num = INDEX_NONE;
int32 PriorProbabilitiesOffset = INDEX_NONE;
};
struct FDiscreteInclusiveData
{
int32 Num = INDEX_NONE;
int32 PriorProbabilitiesOffset = INDEX_NONE;
};
struct FNamedDiscreteExclusiveData
{
int32 Num = INDEX_NONE;
int32 PriorProbabilitiesOffset = INDEX_NONE;
int32 ElementsOffset = INDEX_NONE;
};
struct FNamedDiscreteInclusiveData
{
int32 Num = INDEX_NONE;
int32 PriorProbabilitiesOffset = INDEX_NONE;
int32 ElementsOffset = INDEX_NONE;
};
struct FAndData
{
int32 Num = INDEX_NONE;
int32 ElementsOffset = INDEX_NONE;
};
struct FOrExclusiveData
{
int32 Num = INDEX_NONE;
int32 ElementsOffset = INDEX_NONE;
int32 PriorProbabilitiesOffset = INDEX_NONE;
};
struct FOrInclusiveData
{
int32 Num = INDEX_NONE;
int32 ElementsOffset = INDEX_NONE;
int32 PriorProbabilitiesOffset = INDEX_NONE;
};
struct FArrayData
{
int32 Num = INDEX_NONE;
int32 ElementIndex = INDEX_NONE;
};
struct FEncodingData
{
int32 EncodingSize = INDEX_NONE;
int32 ElementIndex = INDEX_NONE;
int32 LayerNum = INDEX_NONE;
EEncodingActivationFunction ActivationFunction = EEncodingActivationFunction::ELU;
};
uint32 Generation = 0;
/** These have entries for each Schema Element */
TArray<EType> Types;
TArray<FName> Tags;
TArray<int32> EncodedVectorSizes;
TArray<int32> ActionVectorSizes;
TArray<int32> ActionDistributionVectorSizes;
TArray<int32> ActionModifierVectorSizes;
TArray<int32> TypeDataIndices;
/** These are indexed based on the type and the index found in TypeDataIndices */
TArray<FContinuousData> ContinuousData;
TArray<FDiscreteExclusiveData> DiscreteExclusiveData;
TArray<FDiscreteInclusiveData> DiscreteInclusiveData;
TArray<FNamedDiscreteExclusiveData> NamedDiscreteExclusiveData;
TArray<FNamedDiscreteInclusiveData> NamedDiscreteInclusiveData;
TArray<FAndData> AndData;
TArray<FOrExclusiveData> OrExclusiveData;
TArray<FOrInclusiveData> OrInclusiveData;
TArray<FArrayData> ArrayData;
TArray<FEncodingData> EncodingData;
/** This is an array of all the SubElements and their names, referenced by other elements */
TArray<FName> SubElementNames;
TArray<FSchemaElement> SubElementObjects;
/** This is an array of all the prior probabilities, referenced by other elements. */
TArray<float> PriorProbabilities;
};
/**
* Action Object Element
*
* A single element in the action object representing part of an action. Internally this consists of a index used by the object to look up
* the associated action data and a generation id which can be used to check when this index is no longer valid.
*/
struct FObjectElement { int32 Index = INDEX_NONE; uint32 Generation = INDEX_NONE; };
struct FObjectContinuousParameters
{
// Continuous action values
TArrayView<const float> Values;
};
struct FObjectDiscreteExclusiveParameters
{
// Exclusive discrete action index
int32 DiscreteIndex = INDEX_NONE;
};
struct FObjectDiscreteInclusiveParameters
{
// Inclusive discrete action indices
TArrayView<const int32> DiscreteIndices;
};
struct FObjectNamedDiscreteExclusiveParameters
{
// Named Exclusive discrete action name
FName ElementName = NAME_None;
};
struct FObjectNamedDiscreteInclusiveParameters
{
// Named Inclusive discrete action name
TArrayView<const FName> ElementNames;
};
struct FObjectAndParameters
{
// Names of the sub-actions.
TArrayView<const FName> ElementNames;
// The associated sub-elements.
TArrayView<const FObjectElement> Elements;
};
struct FObjectOrExclusiveParameters
{
// Name of the chosen sub-action.
FName ElementName;
// The associated chosen sub-element.
FObjectElement Element;
};
struct FObjectOrInclusiveParameters
{
// Names of the chosen sub-actions.
TArrayView<const FName> ElementNames;
// The associated chosen sub-elements.
TArrayView<const FObjectElement> Elements;
};
struct FObjectArrayParameters
{
// Array of sub-elements.
TArrayView<const FObjectElement> Elements;
};
struct FObjectEncodingParameters
{
// Encoded sub-element.
FObjectElement Element;
};
/**
* Action Object
*
* This object allows you to construct or get data from an instance of an action you might have generated from a policy. Internally this object
* contains a pool of individual elements. This allows them to be constructed performantly and in a cache efficient way. This object is therefore
* required to access any data about the individual action elements that are created.
*/
struct LEARNING_API FObject
{
FObjectElement CreateNull(const FName Tag = NAME_None);
FObjectElement CreateContinuous(const FObjectContinuousParameters Parameters, const FName Tag = NAME_None);
FObjectElement CreateDiscreteExclusive(const FObjectDiscreteExclusiveParameters Parameters, const FName Tag = NAME_None);
FObjectElement CreateDiscreteInclusive(const FObjectDiscreteInclusiveParameters Parameters, const FName Tag = NAME_None);
FObjectElement CreateNamedDiscreteExclusive(const FObjectNamedDiscreteExclusiveParameters Parameters, const FName Tag = NAME_None);
FObjectElement CreateNamedDiscreteInclusive(const FObjectNamedDiscreteInclusiveParameters Parameters, const FName Tag = NAME_None);
FObjectElement CreateAnd(const FObjectAndParameters Parameters, const FName Tag = NAME_None);
FObjectElement CreateOrExclusive(const FObjectOrExclusiveParameters Parameters, const FName Tag = NAME_None);
FObjectElement CreateOrInclusive(const FObjectOrInclusiveParameters Parameters, const FName Tag = NAME_None);
FObjectElement CreateArray(const FObjectArrayParameters Parameters, const FName Tag = NAME_None);
FObjectElement CreateEncoding(const FObjectEncodingParameters Parameters, const FName Tag = NAME_None);
FObjectContinuousParameters GetContinuous(const FObjectElement Element) const;
FObjectDiscreteExclusiveParameters GetDiscreteExclusive(const FObjectElement Element) const;
FObjectDiscreteInclusiveParameters GetDiscreteInclusive(const FObjectElement Element) const;
FObjectNamedDiscreteExclusiveParameters GetNamedDiscreteExclusive(const FObjectElement Element) const;
FObjectNamedDiscreteInclusiveParameters GetNamedDiscreteInclusive(const FObjectElement Element) const;
FObjectAndParameters GetAnd(const FObjectElement Element) const;
FObjectOrExclusiveParameters GetOrExclusive(const FObjectElement Element) const;
FObjectOrInclusiveParameters GetOrInclusive(const FObjectElement Element) const;
FObjectArrayParameters GetArray(const FObjectElement Element) const;
FObjectEncodingParameters GetEncoding(const FObjectElement Element) const;
// Checks if the given element is valid
bool IsValid(const FObjectElement Element) const;
// Gets the type of the given element
EType GetType(const FObjectElement Element) const;
// Gets the tag of the given element
FName GetTag(const FObjectElement Element) const;
// Get the current generation
uint32 GetGeneration() const;
// Checks if the given object is empty of elements.
bool IsEmpty() const;
// Empty all internal buffers of elements. This invalidates all existing elements.
void Empty();
// Reset all internal buffers (without freeing memory). This invalidates all existing elements.
void Reset();
private:
uint32 Generation = 0;
TArray<EType> Types;
TArray<FName> Tags;
TArray<int32> ContinuousDataOffsets;
TArray<int32> ContinuousDataNums;
TArray<int32> DiscreteDataOffsets;
TArray<int32> DiscreteDataNums;
TArray<int32> ElementDataOffsets;
TArray<int32> ElementDataNums;
TArray<float> ContinuousValues;
TArray<int32> DiscreteValues;
TArray<FName> SubElementNames;
TArray<FObjectElement> SubElementObjects;
};
/**
* Action Modifier Element
*
* A single element representing a modification to an action performed during sampling (such as masking). Internally this consists of a index
* used by the object to look up the associated action modification data and a generation id which can be used to check when this index is no
* longer valid.
*/
struct FModifierElement { int32 Index = INDEX_NONE; uint32 Generation = INDEX_NONE; };
struct FModifierContinuousParameters
{
// Indicates which dimensions are masked
TArrayView<const bool> Masked;
// Values used to replace masked dimensions
TArrayView<const float> MaskedValues;
};
struct FModifierDiscreteExclusiveParameters
{
// Disallowed indices
TArrayView<const int32> MaskedIndices;
};
struct FModifierDiscreteInclusiveParameters
{
// Disallowed indices
TArrayView<const int32> MaskedIndices;
};
struct FModifierNamedDiscreteExclusiveParameters
{
// Disallowed actions
TArrayView<const FName> MaskedElementNames;
};
struct FModifierNamedDiscreteInclusiveParameters
{
// Disallowed actions
TArrayView<const FName> MaskedElementNames;
};
struct FModifierAndParameters
{
// Names of the modified sub-actions.
TArrayView<const FName> ElementNames;
// The modifiers of the associated sub-elements.
TArrayView<const FModifierElement> Elements;
};
struct FModifierOrExclusiveParameters
{
// Names of the modified sub-action.
TArrayView<const FName> ElementNames;
// The modifiers of the associated sub-element.
TArrayView<const FModifierElement> Elements;
// Disallowed sub-elements
TArrayView<const FName> MaskedElements;
};
struct FModifierOrInclusiveParameters
{
// Names of the modified sub-actions.
TArrayView<const FName> ElementNames;
// The modifiers of the associated sub-elements.
TArrayView<const FModifierElement> Elements;
// Disallowed sub-elements
TArrayView<const FName> MaskedElements;
};
struct FModifierArrayParameters
{
// Array of sub-element modifiers.
TArrayView<const FModifierElement> Elements;
};
struct FModifierEncodingParameters
{
// Encoded sub-element modifier.
FModifierElement Element;
};
/**
* Action Modifier
*
* This object allows you to describe modifications you want to apply to actions during the sampling stage. Internally this object contains a
* pool of individual elements. This allows them to be constructed performantly and in a cache efficient way. This object is therefore
* required to access any data about the individual action modifier elements that are created.
*/
struct LEARNING_API FModifier
{
FModifierElement CreateNull(const FName Tag = NAME_None);
FModifierElement CreateContinuous(const FModifierContinuousParameters Parameters, const FName Tag = NAME_None);
FModifierElement CreateDiscreteExclusive(const FModifierDiscreteExclusiveParameters Parameters, const FName Tag = NAME_None);
FModifierElement CreateDiscreteInclusive(const FModifierDiscreteInclusiveParameters Parameters, const FName Tag = NAME_None);
FModifierElement CreateNamedDiscreteExclusive(const FModifierNamedDiscreteExclusiveParameters Parameters, const FName Tag = NAME_None);
FModifierElement CreateNamedDiscreteInclusive(const FModifierNamedDiscreteInclusiveParameters Parameters, const FName Tag = NAME_None);
FModifierElement CreateAnd(const FModifierAndParameters Parameters, const FName Tag = NAME_None);
FModifierElement CreateOrExclusive(const FModifierOrExclusiveParameters Parameters, const FName Tag = NAME_None);
FModifierElement CreateOrInclusive(const FModifierOrInclusiveParameters Parameters, const FName Tag = NAME_None);
FModifierElement CreateArray(const FModifierArrayParameters Parameters, const FName Tag = NAME_None);
FModifierElement CreateEncoding(const FModifierEncodingParameters Parameters, const FName Tag = NAME_None);
FModifierContinuousParameters GetContinuous(const FModifierElement Element) const;
FModifierDiscreteExclusiveParameters GetDiscreteExclusive(const FModifierElement Element) const;
FModifierDiscreteInclusiveParameters GetDiscreteInclusive(const FModifierElement Element) const;
FModifierNamedDiscreteExclusiveParameters GetNamedDiscreteExclusive(const FModifierElement Element) const;
FModifierNamedDiscreteInclusiveParameters GetNamedDiscreteInclusive(const FModifierElement Element) const;
FModifierAndParameters GetAnd(const FModifierElement Element) const;
FModifierOrExclusiveParameters GetOrExclusive(const FModifierElement Element) const;
FModifierOrInclusiveParameters GetOrInclusive(const FModifierElement Element) const;
FModifierArrayParameters GetArray(const FModifierElement Element) const;
FModifierEncodingParameters GetEncoding(const FModifierElement Element) const;
// Checks if the given element is valid
bool IsValid(const FModifierElement Element) const;
// Gets the type of the given element
EType GetType(const FModifierElement Element) const;
// Gets the tag of the given element
FName GetTag(const FModifierElement Element) const;
// Get the current generation
uint32 GetGeneration() const;
// Checks if the given object is empty of elements.
bool IsEmpty() const;
// Empty all internal buffers of elements. This invalidates all existing elements.
void Empty();
// Reset all internal buffers (without freeing memory). This invalidates all existing elements.
void Reset();
private:
uint32 Generation = 0;
TArray<EType> Types;
TArray<FName> Tags;
TArray<int32> ContinuousDataOffsets;
TArray<int32> ContinuousDataNums;
TArray<int32> DiscreteDataOffsets;
TArray<int32> DiscreteDataNums;
TArray<int32> ElementDataOffsets;
TArray<int32> ElementDataNums;
TArray<int32> MaskedDataOffsets;
TArray<int32> MaskedDataNums;
TArray<bool> ContinuousMaskeds;
TArray<float> ContinuousMaskedValues;
TArray<int32> DiscreteValues;
TArray<FName> SubElementNames;
TArray<FModifierElement> SubElementModifiers;
TArray<FName> MaskedElementNames;
};
/**
* Gets a hash value representing object compatibility between schemas i.e. if objects from one schema can be used by objects expecting another
* schema. This is not a cryptographic hash, and so `AreSchemaObjectsCompatible` should still be used as the ultimate source of truth.
* This function returns an int32 so that it can be used in blueprints.
*
* @param Schema Action Schema
* @param SchemaElement Action Schema Element
* @param Salt Hash salt
*/
LEARNING_API int32 GetSchemaObjectsCompatibilityHash(
const FSchema& Schema,
const FSchemaElement SchemaElement,
const int32 Salt = 0x49710e77);
/**
* Test if two schemas are compatible i.e. if objects from one schema can be used by objects expecting another schema.
*
* @param SchemaA First Schema
* @param SchemaElementA First Schema Element
* @param SchemaB Second Schema
* @param SchemaElementB Second Schema Element
* @returns true when the schemas are compatible
*/
LEARNING_API bool AreSchemaObjectsCompatible(
const FSchema& SchemaA,
const FSchemaElement SchemaElementA,
const FSchema& SchemaB,
const FSchemaElement SchemaElementB);
/** Network weight initialization type */
enum class EWeightInitialization : uint8
{
KaimingGaussian = 0,
KaimingUniform = 1,
};
/**
* Settings for building a network from a schema.
*/
struct LEARNING_API FNetworkSettings
{
// If to use compressed linear layers. This reduces the memory usage by half at the cost of some small impact on quality and evaluation speed.
bool bUseCompressedLinearLayers = false;
// Which weight initialization to use.
EWeightInitialization WeightInitialization = EWeightInitialization::KaimingGaussian;
};
/**
* Make a NNE::RuntimeBasic::FModelBuilderElement for the given Schema. This can be used if you want to plug the Decoder generated by this
* schema as a part of a larger model you are making with a NNE::RuntimeBasic::FModelBuilder.
*
* @param OutElement Output Builder Element
* @param Builder Model Builder
* @param Schema Action Schema
* @param SchemaElement Action Schema Element
* @param NetworkSettings Network Generation Settings
*/
LEARNING_API void MakeDecoderNetworkModelBuilderElementFromSchema(
NNE::RuntimeBasic::FModelBuilderElement& OutElement,
NNE::RuntimeBasic::FModelBuilder& Builder,
const FSchema& Schema,
const FSchemaElement SchemaElement,
const FNetworkSettings& NetworkSettings = FNetworkSettings());
/**
* Generate FileData for a Neural Network that can act as a Decoder for the given schema. This network will take as input a vector of size
* EncodedActionSize and produce a vector of size ActionDistributionVectorSize.
*
* @param OutFileData Output File Data to write to
* @param OutInputSize Size of the vector this network takes as input
* @param OutOutputSize Size of the vector this network takes as output
* @param Schema Action Schema
* @param SchemaElement Action Schema Element
* @param NetworkSettings Network Generation Settings
* @param Seed The random seed used in initializing the network weights
*/
LEARNING_API void GenerateDecoderNetworkFileDataFromSchema(
TArray<uint8>& OutFileData,
uint32& OutInputSize,
uint32& OutOutputSize,
const FSchema& Schema,
const FSchemaElement SchemaElement,
const FNetworkSettings& NetworkSettings = FNetworkSettings(),
const uint32 Seed = 0x05dbd1f5);
/**
* Sample an action vector from a vector representing the action distribution.
*
* @param InOutRandomState Random State/Seed to use when sampling the action vector
* @param OutActionVector Output action vector
* @param ActionDistributionVector Input Action Distribution vector
* @param ActionModifierVector Input Action Modifier vector
* @param Schema Action Schema
* @param SchemaElement Action Schema Element
* @param ActionNoiseScale Scale factor for the noise. Set this to zero to always choose the mean (expected) action.
*/
LEARNING_API void SampleVectorFromDistributionVector(
uint32& InOutRandomState,
TLearningArrayView<1, float> OutActionVector,
const TLearningArrayView<1, const float> ActionDistributionVector,
const TLearningArrayView<1, const float> ActionModifierVector,
const FSchema& Schema,
const FSchemaElement SchemaElement,
const float ActionNoiseScale = 1.0f);
/**
* Convert an action object into an action vector.
*
* @param OutActionVector Output action vector
* @param Schema Action Schema
* @param SchemaElement Action Schema Element
* @param Object Action Object
* @param ObjectElement Action Object Element
*/
LEARNING_API void SetVectorFromObject(
TLearningArrayView<1, float> OutActionVector,
const FSchema& Schema,
const FSchemaElement SchemaElement,
const FObject& Object,
const FObjectElement ObjectElement);
/**
* Convert an action vector into an action object
*
* @param OutObject Output Action Object
* @param OutObjectElement Output Action Object Element
* @param Schema Action Schema
* @param SchemaElement Action Schema Element
* @param ActionVector Input Action vector
*/
LEARNING_API void GetObjectFromVector(
FObject& OutObject,
FObjectElement& OutObjectElement,
const FSchema& Schema,
const FSchemaElement SchemaElement,
const TLearningArrayView<1, const float> ActionVector);
/**
* Convert an action modifier into an action modifier vector.
*
* @param OutActionModifierVector Output action modifier vector
* @param Schema Action Schema
* @param SchemaElement Action Schema Element
* @param Modifier Action Modifier
* @param ModifierElement Action Modifier Element
*/
LEARNING_API void SetVectorFromModifier(
TLearningArrayView<1, float> OutActionModifierVector,
const FSchema& Schema,
const FSchemaElement SchemaElement,
const FModifier& Modifier,
const FModifierElement ModifierElement);
/**
* Convert an action modifier vector into an action modifier
*
* @param OutModifier Output Action Modifier
* @param OutModifierElement Output Action Modifier Element
* @param Schema Action Schema
* @param SchemaElement Action Schema Element
* @param ActionModifierVector Input Action Modifier vector
*/
LEARNING_API void GetModifierFromVector(
FModifier& OutModifier,
FModifierElement& OutModifierElement,
const FSchema& Schema,
const FSchemaElement SchemaElement,
const TLearningArrayView<1, const float> ActionModifierVector);
}