aboutsummaryrefslogtreecommitdiff
path: root/src/backends/WorkloadData.cpp
diff options
context:
space:
mode:
authorNattapat Chaimanowong <nattapat.chaimanowong@arm.com>2018-11-02 10:57:25 +0000
committernattapat.chaimanowong <nattapat.chaimanowong@arm.com>2018-11-02 12:35:59 +0000
commit207ef9a6b8b3ea0afe9a095639f67b5dedd095d7 (patch)
treefb6251cfbc28cc2bfdeb5f8f85cc994672e706eb /src/backends/WorkloadData.cpp
parent6b9658239d377372523fe49c71fde31701d986e3 (diff)
downloadarmnn-207ef9a6b8b3ea0afe9a095639f67b5dedd095d7.tar.gz
IVGCVSW-2093 Add SpaceToBatchNd layer and corresponding no-op factory implementations
Change-Id: Ibd457f3a2d4342c4d6335bd3c471282a14ab6b14
Diffstat (limited to 'src/backends/WorkloadData.cpp')
-rw-r--r--src/backends/WorkloadData.cpp40
1 files changed, 40 insertions, 0 deletions
diff --git a/src/backends/WorkloadData.cpp b/src/backends/WorkloadData.cpp
index ef31fbd1fb..495d4ecde9 100644
--- a/src/backends/WorkloadData.cpp
+++ b/src/backends/WorkloadData.cpp
@@ -741,6 +741,46 @@ void ReshapeQueueDescriptor::Validate(const WorkloadInfo& workloadInfo) const
}
}
+void SpaceToBatchNdQueueDescriptor::Validate(const WorkloadInfo& workloadInfo) const
+{
+ ValidateSingleInput(workloadInfo, "SpaceToBatchNdQueueDescriptor");
+ ValidateSingleOutput(workloadInfo, "SpaceToBatchNdQueueDescriptor");
+
+ ValidateTensorNumDimensions(workloadInfo.m_InputTensorInfos[0], "SpaceToBatchNdQueueDescriptor", 4, "input");
+ ValidateTensorNumDimensions(workloadInfo.m_OutputTensorInfos[0], "SpaceToBatchNdQueueDescriptor", 4, "output");
+
+ if (workloadInfo.m_InputTensorInfos[0].GetNumElements() != workloadInfo.m_OutputTensorInfos[0].GetNumElements())
+ {
+ throw InvalidArgumentException("SpaceToBatchNdQueueDescriptor: Input tensor has " +
+ to_string(workloadInfo.m_InputTensorInfos[0].GetNumElements()) + " but output tensor has " +
+ to_string(workloadInfo.m_OutputTensorInfos[0].GetNumElements()) + " elements.");
+ }
+
+ if (m_Parameters.m_BlockShape.size() != 2)
+ {
+ throw InvalidArgumentException("Block Shape must contains 2 spatial dimensions");
+ }
+
+ if (m_Parameters.m_BlockShape.size() != m_Parameters.m_PadList.size())
+ {
+ throw InvalidArgumentException("Pad List must contains the same number of dimensions as Block Shape.");
+ }
+
+ const TensorShape inputShape = workloadInfo.m_InputTensorInfos[0].GetShape();
+
+ std::pair<unsigned int, unsigned int> heightPad = m_Parameters.m_PadList[0];
+ std::pair<unsigned int, unsigned int> widthPad = m_Parameters.m_PadList[1];
+
+ if ((inputShape[m_Parameters.m_DataLayout.GetHeightIndex()] + heightPad.first + heightPad.second)
+ % m_Parameters.m_BlockShape[0] != 0 ||
+ (inputShape[m_Parameters.m_DataLayout.GetWidthIndex()] + widthPad.first + widthPad.second)
+ % m_Parameters.m_BlockShape[1] != 0)
+ {
+ throw InvalidArgumentException(
+ "Input shape after padding must be divisible by Block Shape in all spatial dimensions");
+ }
+}
+
void FloorQueueDescriptor::Validate(const WorkloadInfo& workloadInfo) const
{
ValidateSingleInput(workloadInfo, "FloorQueueDescriptor");