blob: d7f38034f5237bd1213a62378c3cad5e5cb471cf [file] [log] [blame]
//
// Copyright © 2017 Arm Ltd. All rights reserved.
// SPDX-License-Identifier: MIT
//
#include "SerializeLayerParameters.hpp"
#include <armnn/TypesUtils.hpp>
#include <string>
#include <iostream>
#include <sstream>
namespace armnn
{
void StringifyLayerParameters<ActivationDescriptor>::Serialize(ParameterStringifyFunction& fn,
const ActivationDescriptor& desc)
{
fn("Function", GetActivationFunctionAsCString(desc.m_Function));
fn("A", std::to_string(desc.m_A));
fn("B", std::to_string(desc.m_B));
}
void StringifyLayerParameters<BatchNormalizationDescriptor>::Serialize(ParameterStringifyFunction& fn,
const BatchNormalizationDescriptor& desc)
{
fn("Eps", std::to_string(desc.m_Eps));
fn("DataLayout", GetDataLayoutName(desc.m_DataLayout));
}
void StringifyLayerParameters<BatchToSpaceNdDescriptor>::Serialize(ParameterStringifyFunction& fn,
const BatchToSpaceNdDescriptor& desc)
{
{
std::stringstream ss;
int count = 0;
for (auto&& var : desc.m_BlockShape)
{
if (count > 0)
{
ss << ",";
}
ss << var;
++count;
}
fn("BlockShape", ss.str());
}
{
std::stringstream ss;
int count = 0;
for (auto&& var : desc.m_Crops)
{
if (count > 0)
{
ss << ",";
}
ss << "[" << var.first << "," << var.second << "]";
++count;
}
fn("Crops", ss.str());
}
fn("DataLayout", GetDataLayoutName(desc.m_DataLayout));
}
void StringifyLayerParameters<ChannelShuffleDescriptor>::Serialize(ParameterStringifyFunction& fn,
const ChannelShuffleDescriptor& desc)
{
fn("Axis", std::to_string(desc.m_Axis));
fn("NumGroups", std::to_string(desc.m_NumGroups));
}
void StringifyLayerParameters<ComparisonDescriptor>::Serialize(ParameterStringifyFunction& fn,
const ComparisonDescriptor& desc)
{
fn("Operation", GetComparisonOperationAsCString(desc.m_Operation));
}
void StringifyLayerParameters<Convolution2dDescriptor>::Serialize(ParameterStringifyFunction& fn,
const Convolution2dDescriptor& desc)
{
{
std::stringstream ss;
ss << "(" << desc.m_PadTop << "," << desc.m_PadLeft
<< "," << desc.m_PadBottom << "," << desc.m_PadRight << ")";
fn("Padding(T,L,B,R)",ss.str());
}
{
std::stringstream ss;
ss << "(" << desc.m_StrideX << "," << desc.m_StrideY << ")";
fn("Stride(X,Y)", ss.str());
}
{
std::stringstream ss;
ss << "(" << desc.m_DilationX << "," << desc.m_DilationY << ")";
fn("Dilation(X,Y)", ss.str());
}
fn("BiasEnabled",(desc.m_BiasEnabled ? "true" : "false"));
fn("DataLayout", GetDataLayoutName(desc.m_DataLayout));
}
void StringifyLayerParameters<Convolution3dDescriptor>::Serialize(ParameterStringifyFunction& fn,
const Convolution3dDescriptor& desc)
{
{
std::stringstream ss;
ss << "(" << desc.m_PadTop << "," << desc.m_PadLeft
<< "," << desc.m_PadBottom << "," << desc.m_PadRight
<< "," << desc.m_PadFront << "," << desc.m_PadBack << ")";
fn("Padding(T,L,B,R,F,B)",ss.str());
}
{
std::stringstream ss;
ss << "(" << desc.m_StrideX << "," << desc.m_StrideY << "," << desc.m_StrideZ << ")";
fn("Stride(X,Y,Z)", ss.str());
}
{
std::stringstream ss;
ss << "(" << desc.m_DilationX << "," << desc.m_DilationY << "," << desc.m_DilationZ << ")";
fn("Dilation(X,Y,Z)", ss.str());
}
fn("BiasEnabled",(desc.m_BiasEnabled ? "true" : "false"));
fn("DataLayout", GetDataLayoutName(desc.m_DataLayout));
}
void StringifyLayerParameters<DetectionPostProcessDescriptor>::Serialize(ParameterStringifyFunction& fn,
const DetectionPostProcessDescriptor& desc)
{
fn("MaxDetections", std::to_string(desc.m_MaxDetections));
fn("MaxClassesPerDetection", std::to_string(desc.m_MaxClassesPerDetection));
fn("DetectionsPerClass", std::to_string(desc.m_DetectionsPerClass));
fn("NmsScoreThreshold", std::to_string(desc.m_NmsScoreThreshold));
fn("NmsIouThreshold", std::to_string(desc.m_NmsIouThreshold));
fn("NumClasses", std::to_string(desc.m_NumClasses));
fn("UseRegularNms", (desc.m_UseRegularNms ? "true" : "false"));
{
std::stringstream ss;
ss << "(" << desc.m_ScaleX << "," << desc.m_ScaleY << ")";
fn("Scale(X,Y)", ss.str());
}
{
std::stringstream ss;
ss << "(" << desc.m_ScaleW << "," << desc.m_ScaleH << ")";
fn("Scale(W,H)", ss.str());
}
}
void StringifyLayerParameters<DepthwiseConvolution2dDescriptor>::Serialize(
ParameterStringifyFunction& fn,
const DepthwiseConvolution2dDescriptor& desc)
{
{
std::stringstream ss;
ss << "(" << desc.m_PadTop << "," << desc.m_PadLeft
<< "," << desc.m_PadBottom << "," << desc.m_PadRight << ")";
fn("Padding(T,L,B,R)",ss.str());
}
{
std::stringstream ss;
ss << "(" << desc.m_StrideX << "," << desc.m_StrideY << ")";
fn("Stride(X,Y)", ss.str());
}
{
std::stringstream ss;
ss << "(" << desc.m_DilationX << "," << desc.m_DilationY << ")";
fn("Dilation(X,Y)", ss.str());
}
fn("BiasEnabled",(desc.m_BiasEnabled ? "true" : "false"));
fn("DataLayout", GetDataLayoutName(desc.m_DataLayout));
}
void StringifyLayerParameters<ElementwiseUnaryDescriptor>::Serialize(ParameterStringifyFunction& fn,
const ElementwiseUnaryDescriptor& desc)
{
fn("UnaryOperation", GetUnaryOperationAsCString(desc.m_Operation));
}
void StringifyLayerParameters<FakeQuantizationDescriptor>::Serialize(ParameterStringifyFunction& fn,
const FakeQuantizationDescriptor& desc)
{
fn("Min", std::to_string(desc.m_Min));
fn("Max", std::to_string(desc.m_Max));
}
void StringifyLayerParameters<FullyConnectedDescriptor>::Serialize(ParameterStringifyFunction& fn,
const FullyConnectedDescriptor& desc)
{
fn("BiasEnabled", (desc.m_BiasEnabled ? "true" : "false"));
fn("TransposeWeightMatrix", (desc.m_TransposeWeightMatrix ? "true" : "false"));
}
void StringifyLayerParameters<L2NormalizationDescriptor>::Serialize(ParameterStringifyFunction& fn,
const L2NormalizationDescriptor& desc)
{
fn("Eps", std::to_string(desc.m_Eps));
fn("DataLayout", GetDataLayoutName(desc.m_DataLayout));
}
void StringifyLayerParameters<LstmDescriptor>::Serialize(ParameterStringifyFunction& fn, const LstmDescriptor& desc)
{
fn("ActivationFunc", std::to_string(desc.m_ActivationFunc));
fn("ClippingThresCell", std::to_string(desc.m_ClippingThresCell));
fn("ClippingThresProj", std::to_string(desc.m_ClippingThresProj));
fn("CifgEnabled", (desc.m_CifgEnabled ? "true" : "false")) ;
fn("PeepholeEnabled", (desc.m_PeepholeEnabled ? "true" : "false")) ;
fn("ProjectionEnabled", (desc.m_ProjectionEnabled ? "true" : "false")) ;
fn("LayerNormEnabled", (desc.m_LayerNormEnabled ? "true" : "false"));
}
void StringifyLayerParameters<MeanDescriptor>::Serialize(ParameterStringifyFunction& fn, const MeanDescriptor& desc)
{
{
std::stringstream ss;
int count = 0;
for (auto&& var : desc.m_Axis)
{
if (count > 0)
{
ss << ",";
}
ss << var;
++count;
}
fn("Axis", ss.str());
}
fn("KeepDims", (desc.m_KeepDims ? "true" : "false"));
}
void StringifyLayerParameters<NormalizationDescriptor>::Serialize(ParameterStringifyFunction& fn,
const NormalizationDescriptor& desc)
{
fn("NormChannelType", GetNormalizationAlgorithmChannelAsCString(desc.m_NormChannelType));
fn("NormMethodType", GetNormalizationAlgorithmMethodAsCString(desc.m_NormMethodType));
fn("NormSize", std::to_string(desc.m_NormSize));
fn("Alpha", std::to_string(desc.m_Alpha));
fn("Beta", std::to_string(desc.m_Beta));
fn("K", std::to_string(desc.m_K));
fn("DataLayout", GetDataLayoutName(desc.m_DataLayout));
}
void StringifyLayerParameters<OriginsDescriptor>::Serialize(ParameterStringifyFunction& fn,
const OriginsDescriptor& desc)
{
fn("ConcatAxis", std::to_string(desc.GetConcatAxis()));
uint32_t numViews = desc.GetNumViews();
uint32_t numDims = desc.GetNumDimensions();
for (uint32_t view = 0; view < numViews; ++view)
{
std::stringstream key;
key << "MergeTo#" << view;
std::stringstream value;
value << "[";
auto viewData = desc.GetViewOrigin(view);
for (uint32_t dim = 0; dim < numDims; ++dim)
{
if (dim > 0)
{
value << ",";
}
value << viewData[dim];
}
value << "]";
fn(key.str(), value.str());
}
}
void StringifyLayerParameters<PadDescriptor>::Serialize(ParameterStringifyFunction& fn, const PadDescriptor& desc)
{
{
std::stringstream ss;
int count = 0;
for (auto&& var : desc.m_PadList)
{
if (count > 0)
{
ss << ",";
}
ss << "[" << var.first << "," << var.second << "]";
++count;
}
fn("PadList", ss.str());
}
fn("PadValue", std::to_string(desc.m_PadValue));
fn("PaddingMode", GetPaddingModeAsCString(desc.m_PaddingMode));
}
void StringifyLayerParameters<PreCompiledDescriptor>::Serialize(ParameterStringifyFunction& fn,
const PreCompiledDescriptor& desc)
{
fn("NumInputSlots", std::to_string(desc.m_NumInputSlots));
fn("NumOutputSlots", std::to_string(desc.m_NumOutputSlots));
}
void StringifyLayerParameters<Pooling2dDescriptor>::Serialize(ParameterStringifyFunction& fn,
const Pooling2dDescriptor& desc)
{
fn("Type", GetPoolingAlgorithmAsCString(desc.m_PoolType));
{
std::stringstream ss;
ss << "(" << desc.m_PadTop << "," << desc.m_PadLeft
<< "," << desc.m_PadBottom << "," << desc.m_PadRight << ")";
fn("Padding(T,L,B,R)", ss.str());
}
{
std::stringstream ss;
ss << "(" << desc.m_PoolWidth << "," << desc.m_PoolHeight << ")";
fn("(Width,Height)", ss.str());
}
{
std::stringstream ss;
ss << "(" << desc.m_StrideX << "," << desc.m_StrideY << ")";
fn("Stride(X,Y)", ss.str());
}
fn("OutputShapeRounding", GetOutputShapeRoundingAsCString(desc.m_OutputShapeRounding));
fn("PaddingMethod", GetPaddingMethodAsCString(desc.m_PaddingMethod));
fn("DataLayout", GetDataLayoutName(desc.m_DataLayout));
}
void StringifyLayerParameters<Pooling3dDescriptor>::Serialize(ParameterStringifyFunction& fn,
const Pooling3dDescriptor& desc)
{
fn("Type", GetPoolingAlgorithmAsCString(desc.m_PoolType));
{
std::stringstream ss;
ss << "(" << desc.m_PadTop << "," << desc.m_PadLeft
<< "," << desc.m_PadBottom << "," << desc.m_PadRight
<< "," << desc.m_PadFront << "," << desc.m_PadBack << ")";
fn("Padding(T,L,B,R,F,B)", ss.str());
}
{
std::stringstream ss;
ss << "(" << desc.m_PoolWidth << "," << desc.m_PoolHeight << "," << desc.m_PoolDepth << ")";
fn("(Width,Height,Depth)", ss.str());
}
{
std::stringstream ss;
ss << "(" << desc.m_StrideX << "," << desc.m_StrideY << "," << desc.m_StrideZ << ")";
fn("Stride(X,Y,Z)", ss.str());
}
fn("OutputShapeRounding", GetOutputShapeRoundingAsCString(desc.m_OutputShapeRounding));
fn("PaddingMethod", GetPaddingMethodAsCString(desc.m_PaddingMethod));
fn("DataLayout", GetDataLayoutName(desc.m_DataLayout));
}
void StringifyLayerParameters<PermuteDescriptor>::Serialize(ParameterStringifyFunction& fn,
const PermuteDescriptor& desc)
{
std::stringstream ss;
ss << "[";
bool addComma = false;
for (auto it : desc.m_DimMappings)
{
if (addComma)
{
ss << ",";
}
ss << it;
addComma = true;
}
ss << "]";
fn("DimMappings",ss.str());
}
void StringifyLayerParameters<ReduceDescriptor>::Serialize(ParameterStringifyFunction& fn, const ReduceDescriptor& desc)
{
{
std::stringstream ss;
int count = 0;
for (auto&& var : desc.m_vAxis)
{
if (count > 0)
{
ss << ",";
}
ss << var;
++count;
}
fn("Axis", ss.str());
}
fn("KeepDims", (desc.m_KeepDims ? "true" : "false"));
fn("ReduceOperation", GetReduceOperationAsCString(desc.m_ReduceOperation));
}
void StringifyLayerParameters<ReshapeDescriptor>::Serialize(ParameterStringifyFunction& fn,
const ReshapeDescriptor& desc)
{
std::stringstream ss;
ss << desc.m_TargetShape;
fn("TargetShape",ss.str());
}
void StringifyLayerParameters<ResizeDescriptor>::Serialize(ParameterStringifyFunction& fn,
const ResizeDescriptor& desc)
{
fn("TargetWidth", std::to_string(desc.m_TargetWidth));
fn("TargetHeight", std::to_string(desc.m_TargetHeight));
fn("ResizeMethod", GetResizeMethodAsCString(desc.m_Method));
fn("DataLayout", GetDataLayoutName(desc.m_DataLayout));
fn("AlignCorners", std::to_string(desc.m_AlignCorners));
fn("HalfPixelCenters", std::to_string(desc.m_HalfPixelCenters));
}
void StringifyLayerParameters<SoftmaxDescriptor>::Serialize(ParameterStringifyFunction& fn,
const SoftmaxDescriptor& desc)
{
fn("Beta", std::to_string(desc.m_Beta));
fn("Axis", std::to_string(desc.m_Axis));
}
void StringifyLayerParameters<SpaceToBatchNdDescriptor>::Serialize(ParameterStringifyFunction& fn,
const SpaceToBatchNdDescriptor& desc)
{
{
std::stringstream ss;
int count = 0;
for (auto&& var : desc.m_BlockShape)
{
if (count > 0)
{
ss << ",";
}
ss << var;
++count;
}
fn("BlockShape", ss.str());
}
{
std::stringstream ss;
int count = 0;
for (auto&& var : desc.m_PadList)
{
if (count > 0)
{
ss << ",";
}
ss << "[" << var.first << "," << var.second << "]";
++count;
}
fn("PadList", ss.str());
}
fn("DataLayout", GetDataLayoutName(desc.m_DataLayout));
}
void StringifyLayerParameters<SpaceToDepthDescriptor>::Serialize(ParameterStringifyFunction& fn,
const SpaceToDepthDescriptor& desc)
{
fn("BlockSize", std::to_string(desc.m_BlockSize));
fn("DataLayout", GetDataLayoutName(desc.m_DataLayout));
}
void StringifyLayerParameters<StackDescriptor>::Serialize(ParameterStringifyFunction& fn, const StackDescriptor& desc)
{
fn("Axis", std::to_string(desc.m_Axis));
fn("NumInputs", std::to_string(desc.m_NumInputs));
{
std::stringstream ss;
ss << desc.m_InputShape;
fn("InputShape",ss.str());
}
}
void StringifyLayerParameters<StridedSliceDescriptor>::Serialize(ParameterStringifyFunction& fn,
const StridedSliceDescriptor& desc)
{
{
std::stringstream ss;
int count = 0;
for (auto&& var : desc.m_Begin)
{
if (count > 0)
{
ss << ",";
}
ss << var;
++count;
}
fn("Begin", ss.str());
}
{
std::stringstream ss;
int count = 0;
for (auto&& var : desc.m_End)
{
if (count > 0)
{
ss << ",";
}
ss << var;
++count;
}
fn("End", ss.str());
}
{
std::stringstream ss;
int count = 0;
for (auto&& var : desc.m_Stride)
{
if (count > 0)
{
ss << ",";
}
ss << var;
++count;
}
fn("Stride", ss.str());
}
fn("BeginMask", std::to_string(desc.m_BeginMask));
fn("EndMask", std::to_string(desc.m_EndMask));
fn("ShrinkAxisMask", std::to_string(desc.m_ShrinkAxisMask));
fn("EllipsisMask", std::to_string(desc.m_EllipsisMask));
fn("NewAxisMask", std::to_string(desc.m_NewAxisMask));
fn("DataLayout", GetDataLayoutName(desc.m_DataLayout));
}
void StringifyLayerParameters<TransposeConvolution2dDescriptor>::Serialize(
ParameterStringifyFunction& fn,
const TransposeConvolution2dDescriptor& desc)
{
{
std::stringstream ss;
ss << "(" << desc.m_PadTop << "," << desc.m_PadLeft
<< "," << desc.m_PadBottom << "," << desc.m_PadRight << ")";
fn("Padding(T,L,B,R)",ss.str());
}
{
std::stringstream ss;
ss << "(" << desc.m_StrideX << "," << desc.m_StrideY << ")";
fn("Stride(X,Y)", ss.str());
}
fn("BiasEnabled", (desc.m_BiasEnabled ? "true" : "false"));
fn("DataLayout", GetDataLayoutName(desc.m_DataLayout));
}
void StringifyLayerParameters<TransposeDescriptor>::Serialize(ParameterStringifyFunction& fn,
const TransposeDescriptor& desc)
{
std::stringstream ss;
ss << "[";
bool addComma = false;
for (auto it : desc.m_DimMappings)
{
if (addComma)
{
ss << ",";
}
ss << it;
addComma = true;
}
ss << "]";
fn("DimMappings",ss.str());
}
void StringifyLayerParameters<ViewsDescriptor>::Serialize(ParameterStringifyFunction& fn, const ViewsDescriptor& desc)
{
uint32_t numViews = desc.GetNumViews();
uint32_t numDims = desc.GetNumDimensions();
for (uint32_t view = 0; view < numViews; ++view) {
std::stringstream key;
key << "ViewSizes#" << view;
std::stringstream value;
value << "[";
auto viewData = desc.GetViewSizes(view);
for (uint32_t dim = 0; dim < numDims; ++dim)
{
if (dim > 0)
{
value << ",";
}
value << viewData[dim];
}
value << "]";
fn(key.str(), value.str());
}
StringifyLayerParameters<OriginsDescriptor>::Serialize(fn, desc.GetOrigins());
}
} // namespace armnn