aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjimfly01 <jim.flynn@arm.com>2019-01-24 22:29:33 +0000
committerNarumol Prangnawarat <narumol.prangnawarat@arm.com>2019-01-25 14:10:53 +0000
commite9e7bfd09e3435d2bbb334e07c6a0a2514c80048 (patch)
treeae64daa5c6349ac821fb1b8534f8c9881dec0355
parent5e9d29802e2cfbb13adc49c2a0ac9ba952dc7650 (diff)
downloadarmnn-e9e7bfd09e3435d2bbb334e07c6a0a2514c80048.tar.gz
IVGCVSW-2547 Add Accept function to IConnectableLayer
* Layers which callback VisitXXXLayer with ConstTensor have been implemented with dummies to speed up implementation and unblock IVGCVSW-2531 Change-Id: I49b8035f12ec72d6bd6cee95075692f98c48e193
-rw-r--r--include/armnn/ILayerVisitor.hpp13
-rw-r--r--include/armnn/INetwork.hpp3
-rw-r--r--src/armnn/layers/ActivationLayer.cpp5
-rw-r--r--src/armnn/layers/ActivationLayer.hpp3
-rw-r--r--src/armnn/layers/AdditionLayer.cpp5
-rw-r--r--src/armnn/layers/AdditionLayer.hpp2
-rw-r--r--src/armnn/layers/BatchNormalizationLayer.cpp6
-rw-r--r--src/armnn/layers/BatchNormalizationLayer.hpp2
-rw-r--r--src/armnn/layers/BatchToSpaceNdLayer.cpp6
-rw-r--r--src/armnn/layers/BatchToSpaceNdLayer.hpp2
-rw-r--r--src/armnn/layers/ConstantLayer.cpp6
-rw-r--r--src/armnn/layers/ConstantLayer.hpp2
-rw-r--r--src/armnn/layers/ConvertFp16ToFp32Layer.cpp7
-rw-r--r--src/armnn/layers/ConvertFp16ToFp32Layer.hpp2
-rw-r--r--src/armnn/layers/ConvertFp32ToFp16Layer.cpp7
-rw-r--r--src/armnn/layers/ConvertFp32ToFp16Layer.hpp2
-rw-r--r--src/armnn/layers/Convolution2dLayer.cpp13
-rw-r--r--src/armnn/layers/Convolution2dLayer.hpp2
-rw-r--r--src/armnn/layers/DebugLayer.cpp6
-rw-r--r--src/armnn/layers/DebugLayer.hpp2
-rw-r--r--src/armnn/layers/DepthwiseConvolution2dLayer.cpp13
-rw-r--r--src/armnn/layers/DepthwiseConvolution2dLayer.hpp2
-rw-r--r--src/armnn/layers/DetectionPostProcessLayer.cpp5
-rw-r--r--src/armnn/layers/DetectionPostProcessLayer.hpp2
-rw-r--r--src/armnn/layers/DivisionLayer.cpp5
-rw-r--r--src/armnn/layers/DivisionLayer.hpp2
-rw-r--r--src/armnn/layers/EqualLayer.cpp5
-rw-r--r--src/armnn/layers/EqualLayer.hpp2
-rw-r--r--src/armnn/layers/FakeQuantizationLayer.cpp5
-rw-r--r--src/armnn/layers/FakeQuantizationLayer.hpp2
-rw-r--r--src/armnn/layers/FloorLayer.cpp5
-rw-r--r--src/armnn/layers/FloorLayer.hpp2
-rw-r--r--src/armnn/layers/FullyConnectedLayer.cpp13
-rw-r--r--src/armnn/layers/FullyConnectedLayer.hpp2
-rw-r--r--src/armnn/layers/GatherLayer.cpp5
-rw-r--r--src/armnn/layers/GatherLayer.hpp2
-rw-r--r--src/armnn/layers/GreaterLayer.cpp5
-rw-r--r--src/armnn/layers/GreaterLayer.hpp2
-rw-r--r--src/armnn/layers/InputLayer.cpp5
-rw-r--r--src/armnn/layers/InputLayer.hpp2
-rw-r--r--src/armnn/layers/L2NormalizationLayer.cpp5
-rw-r--r--src/armnn/layers/L2NormalizationLayer.hpp2
-rw-r--r--src/armnn/layers/LstmLayer.cpp6
-rw-r--r--src/armnn/layers/LstmLayer.hpp2
-rw-r--r--src/armnn/layers/MaximumLayer.cpp5
-rw-r--r--src/armnn/layers/MaximumLayer.hpp2
-rw-r--r--src/armnn/layers/MeanLayer.cpp5
-rw-r--r--src/armnn/layers/MeanLayer.hpp2
-rw-r--r--src/armnn/layers/MemCopyLayer.cpp5
-rw-r--r--src/armnn/layers/MemCopyLayer.hpp2
-rw-r--r--src/armnn/layers/MergerLayer.cpp5
-rw-r--r--src/armnn/layers/MergerLayer.hpp2
-rw-r--r--src/armnn/layers/MinimumLayer.cpp5
-rw-r--r--src/armnn/layers/MinimumLayer.hpp2
-rw-r--r--src/armnn/layers/MultiplicationLayer.cpp5
-rw-r--r--src/armnn/layers/MultiplicationLayer.hpp2
-rw-r--r--src/armnn/layers/NormalizationLayer.cpp5
-rw-r--r--src/armnn/layers/NormalizationLayer.hpp2
-rw-r--r--src/armnn/layers/OutputLayer.cpp5
-rw-r--r--src/armnn/layers/OutputLayer.hpp2
-rw-r--r--src/armnn/layers/PadLayer.cpp5
-rw-r--r--src/armnn/layers/PadLayer.hpp2
-rw-r--r--src/armnn/layers/PermuteLayer.cpp5
-rw-r--r--src/armnn/layers/PermuteLayer.hpp2
-rw-r--r--src/armnn/layers/Pooling2dLayer.cpp5
-rw-r--r--src/armnn/layers/Pooling2dLayer.hpp2
-rw-r--r--src/armnn/layers/PreCompiledLayer.cpp5
-rw-r--r--src/armnn/layers/PreCompiledLayer.hpp2
-rw-r--r--src/armnn/layers/ReshapeLayer.cpp5
-rw-r--r--src/armnn/layers/ReshapeLayer.hpp2
-rw-r--r--src/armnn/layers/ResizeBilinearLayer.cpp5
-rw-r--r--src/armnn/layers/ResizeBilinearLayer.hpp2
-rw-r--r--src/armnn/layers/RsqrtLayer.cpp5
-rw-r--r--src/armnn/layers/RsqrtLayer.hpp2
-rw-r--r--src/armnn/layers/SoftmaxLayer.cpp5
-rw-r--r--src/armnn/layers/SoftmaxLayer.hpp2
-rw-r--r--src/armnn/layers/SpaceToBatchNdLayer.cpp5
-rw-r--r--src/armnn/layers/SpaceToBatchNdLayer.hpp2
-rw-r--r--src/armnn/layers/SplitterLayer.cpp5
-rw-r--r--src/armnn/layers/SplitterLayer.hpp2
-rw-r--r--src/armnn/layers/StridedSliceLayer.cpp5
-rw-r--r--src/armnn/layers/StridedSliceLayer.hpp2
-rw-r--r--src/armnn/layers/SubtractionLayer.cpp5
-rw-r--r--src/armnn/layers/SubtractionLayer.hpp2
84 files changed, 337 insertions, 0 deletions
diff --git a/include/armnn/ILayerVisitor.hpp b/include/armnn/ILayerVisitor.hpp
index dd73a6fb44..c56be81bb2 100644
--- a/include/armnn/ILayerVisitor.hpp
+++ b/include/armnn/ILayerVisitor.hpp
@@ -13,6 +13,10 @@ namespace armnn
{
class ILayerVisitor
{
+protected:
+ ILayerVisitor() {}
+ virtual ~ILayerVisitor() {}
+
public:
/// Function that an InputLayer should call back to when its Accept(ILayerVisitor&) function is invoked.
/// @param layer - pointer to the layer which is calling back to this visit function.
@@ -58,6 +62,15 @@ public:
const ConstTensor& weights,
const char* name = nullptr) = 0;
+ /// Function that a Detection PostProcess layer should call back to when its
+ /// Accept(ILayerVisitor&) function is invoked.
+ /// @param layer - pointer to the layer which is calling back to this visit function.
+ /// @param descriptor - Description of the Detection PostProcess layer.
+ /// @param name - Optional name for the layer.
+ virtual void VisitDetectionPostProcessLayer(const IConnectableLayer* layer,
+ const DetectionPostProcessDescriptor& descriptor,
+ const char* name = nullptr) = 0;
+
/// Function that a 2D depthwise convolution layer with biases should call back to when its
/// Accept(ILayerVisitor&) function is invoked.
/// @param layer - pointer to the layer which is calling back to this visit function.
diff --git a/include/armnn/INetwork.hpp b/include/armnn/INetwork.hpp
index 1f7354dd35..2213cee555 100644
--- a/include/armnn/INetwork.hpp
+++ b/include/armnn/INetwork.hpp
@@ -8,6 +8,7 @@
#include <armnn/DescriptorsFwd.hpp>
#include <armnn/TensorFwd.hpp>
#include <armnn/Optional.hpp>
+#include <armnn/ILayerVisitor.hpp>
#include <armnn/Types.hpp>
@@ -70,6 +71,8 @@ public:
virtual std::vector<TensorShape> InferOutputShapes(const std::vector<TensorShape>& inputShapes) const = 0;
virtual LayerGuid GetGuid() const = 0;
+
+ virtual void Accept(ILayerVisitor& visitor) const = 0;
protected:
/// Objects are not deletable via the handle
~IConnectableLayer() {}
diff --git a/src/armnn/layers/ActivationLayer.cpp b/src/armnn/layers/ActivationLayer.cpp
index 401ab299c3..6f80cce968 100644
--- a/src/armnn/layers/ActivationLayer.cpp
+++ b/src/armnn/layers/ActivationLayer.cpp
@@ -42,4 +42,9 @@ void ActivationLayer::ValidateTensorShapesFromInputs()
inferredShapes[0]);
}
+void ActivationLayer::Accept(ILayerVisitor& visitor) const
+{
+ visitor.VisitActivationLayer(this, GetParameters(), GetName());
+}
+
} // namespace armnn
diff --git a/src/armnn/layers/ActivationLayer.hpp b/src/armnn/layers/ActivationLayer.hpp
index 390955a35d..aac05f3e32 100644
--- a/src/armnn/layers/ActivationLayer.hpp
+++ b/src/armnn/layers/ActivationLayer.hpp
@@ -26,6 +26,9 @@ public:
/// Check if the input tensor shape(s) will lead to a valid configuration of @ref ActivationLayer.
void ValidateTensorShapesFromInputs() override;
+ void Accept(ILayerVisitor& visitor) const override;
+
+
protected:
/// Constructor to create an ActivationLayer.
/// @param [in] param ActivationDescriptor to configure the activation operation.
diff --git a/src/armnn/layers/AdditionLayer.cpp b/src/armnn/layers/AdditionLayer.cpp
index 27622664d5..02ee306033 100644
--- a/src/armnn/layers/AdditionLayer.cpp
+++ b/src/armnn/layers/AdditionLayer.cpp
@@ -31,4 +31,9 @@ AdditionLayer* AdditionLayer::Clone(Graph& graph) const
return CloneBase<AdditionLayer>(graph, GetName());
}
+void AdditionLayer::Accept(ILayerVisitor& visitor) const
+{
+ visitor.VisitAdditionLayer(this, GetName());
+}
+
} // namespace armnn
diff --git a/src/armnn/layers/AdditionLayer.hpp b/src/armnn/layers/AdditionLayer.hpp
index 4a6b8d9f1a..1c2acabbb2 100644
--- a/src/armnn/layers/AdditionLayer.hpp
+++ b/src/armnn/layers/AdditionLayer.hpp
@@ -23,6 +23,8 @@ public:
/// Creates a dynamically-allocated copy of this layer.
/// @param [in] graph The graph into which this layer is being cloned.
AdditionLayer* Clone(Graph& graph) const override;
+
+ void Accept(ILayerVisitor& visitor) const override;
protected:
/// Constructor to create an AdditionLayer.
diff --git a/src/armnn/layers/BatchNormalizationLayer.cpp b/src/armnn/layers/BatchNormalizationLayer.cpp
index f461c8061b..dfba2d7942 100644
--- a/src/armnn/layers/BatchNormalizationLayer.cpp
+++ b/src/armnn/layers/BatchNormalizationLayer.cpp
@@ -69,4 +69,10 @@ Layer::ConstantTensors BatchNormalizationLayer::GetConstantTensorsByRef()
return {m_Mean, m_Variance, m_Beta, m_Gamma};
}
+void BatchNormalizationLayer::Accept(ILayerVisitor& visitor) const
+{
+ ConstTensor dummy;
+ visitor.VisitBatchNormalizationLayer(this, GetParameters(), dummy, dummy, dummy, dummy);
+}
+
} // namespace armnn
diff --git a/src/armnn/layers/BatchNormalizationLayer.hpp b/src/armnn/layers/BatchNormalizationLayer.hpp
index 02d8456a67..55390b7da5 100644
--- a/src/armnn/layers/BatchNormalizationLayer.hpp
+++ b/src/armnn/layers/BatchNormalizationLayer.hpp
@@ -39,6 +39,8 @@ public:
/// will lead to a valid configuration of @ref BatchNormalizationLayer.
void ValidateTensorShapesFromInputs() override;
+ void Accept(ILayerVisitor& visitor) const override;
+
protected:
/// Constructor to create a BatchNormalizationLayer.
/// @param [in] param BatchNormalizationDescriptor to configure the batch normalization operation.
diff --git a/src/armnn/layers/BatchToSpaceNdLayer.cpp b/src/armnn/layers/BatchToSpaceNdLayer.cpp
index 8ac4cb95bb..9accf28137 100644
--- a/src/armnn/layers/BatchToSpaceNdLayer.cpp
+++ b/src/armnn/layers/BatchToSpaceNdLayer.cpp
@@ -118,4 +118,10 @@ std::vector<TensorShape> BatchToSpaceNdLayer::InferOutputShapes(const std::vecto
return std::vector<TensorShape>({ TensorShape({ outputBatchSize, channelSize, outputHeight, outputWidth }) });
}
}
+
+void BatchToSpaceNdLayer::Accept(ILayerVisitor& visitor) const
+{
+ visitor.VisitBatchToSpaceNdLayer(this, GetParameters(), GetName());
+}
+
} // namespace armnn
diff --git a/src/armnn/layers/BatchToSpaceNdLayer.hpp b/src/armnn/layers/BatchToSpaceNdLayer.hpp
index fc4dd71955..21ed616a9e 100644
--- a/src/armnn/layers/BatchToSpaceNdLayer.hpp
+++ b/src/armnn/layers/BatchToSpaceNdLayer.hpp
@@ -34,6 +34,8 @@ public:
/// @return A vector to the inferred output shape.
std::vector<TensorShape> InferOutputShapes(const std::vector<TensorShape>& inputShapes) const override;
+ void Accept(ILayerVisitor& visitor) const override;
+
protected:
/// Constructor to create a BatchToSpaceNdLayer.
/// @param [in] param BatchToSpaceNdDescriptor to configure the BatchToSpaceNd operation.
diff --git a/src/armnn/layers/ConstantLayer.cpp b/src/armnn/layers/ConstantLayer.cpp
index d8f265babb..8b94fdb6e8 100644
--- a/src/armnn/layers/ConstantLayer.cpp
+++ b/src/armnn/layers/ConstantLayer.cpp
@@ -51,4 +51,10 @@ void ConstantLayer::ValidateTensorShapesFromInputs()
outShape);
}
+void ConstantLayer::Accept(ILayerVisitor& visitor) const
+{
+ ConstTensor dummy;
+ visitor.VisitConstantLayer(this, dummy, GetName());
+}
+
} // namespace armnn
diff --git a/src/armnn/layers/ConstantLayer.hpp b/src/armnn/layers/ConstantLayer.hpp
index c3316b78b1..d045952e7e 100644
--- a/src/armnn/layers/ConstantLayer.hpp
+++ b/src/armnn/layers/ConstantLayer.hpp
@@ -39,6 +39,8 @@ public:
/// Free up the constant source data stored by the layer.
void ReleaseConstantData() override {};
+ void Accept(ILayerVisitor& visitor) const override;
+
std::unique_ptr<ScopedCpuTensorHandle> m_LayerOutput;
protected:
/// Constructor to create a ConstantLayer.
diff --git a/src/armnn/layers/ConvertFp16ToFp32Layer.cpp b/src/armnn/layers/ConvertFp16ToFp32Layer.cpp
index 10c4ba4b4f..d3c2462bf1 100644
--- a/src/armnn/layers/ConvertFp16ToFp32Layer.cpp
+++ b/src/armnn/layers/ConvertFp16ToFp32Layer.cpp
@@ -45,4 +45,11 @@ void ConvertFp16ToFp32Layer::ValidateTensorShapesFromInputs()
inferredShapes[0]);
}
+void ConvertFp16ToFp32Layer::Accept(ILayerVisitor& visitor) const
+{
+ // these conversion layers are only inserted by the
+ // optimizer and so will never be in an input graph.
+ throw armnn::Exception("ConvertFp16ToFp32Layer should never appear in an input graph");
+}
+
} // namespace armnn
diff --git a/src/armnn/layers/ConvertFp16ToFp32Layer.hpp b/src/armnn/layers/ConvertFp16ToFp32Layer.hpp
index bdfc9814fd..89046fc85e 100644
--- a/src/armnn/layers/ConvertFp16ToFp32Layer.hpp
+++ b/src/armnn/layers/ConvertFp16ToFp32Layer.hpp
@@ -29,6 +29,8 @@ public:
/// will lead to a valid configuration of @ref ConvertFp16ToFp32Layer.
void ValidateTensorShapesFromInputs() override;
+ void Accept(ILayerVisitor& visitor) const override;
+
protected:
/// Constructor to create a ConvertFp16ToFp32Layer.
/// @param [in] name Optional name for the layer.
diff --git a/src/armnn/layers/ConvertFp32ToFp16Layer.cpp b/src/armnn/layers/ConvertFp32ToFp16Layer.cpp
index 2bcc4e1917..068594bf99 100644
--- a/src/armnn/layers/ConvertFp32ToFp16Layer.cpp
+++ b/src/armnn/layers/ConvertFp32ToFp16Layer.cpp
@@ -44,4 +44,11 @@ void ConvertFp32ToFp16Layer::ValidateTensorShapesFromInputs()
inferredShapes[0]);
}
+void ConvertFp32ToFp16Layer::Accept(ILayerVisitor& visitor) const
+{
+ // These conversion layers are only inserted by the
+ // optimizer and so will never be in an input graph.
+ throw armnn::Exception("ConvertFp32ToFp16Layer should never appear in an input graph");
+}
+
} // namespace armnn
diff --git a/src/armnn/layers/ConvertFp32ToFp16Layer.hpp b/src/armnn/layers/ConvertFp32ToFp16Layer.hpp
index 524f974d77..9f8b09bd5a 100644
--- a/src/armnn/layers/ConvertFp32ToFp16Layer.hpp
+++ b/src/armnn/layers/ConvertFp32ToFp16Layer.hpp
@@ -28,6 +28,8 @@ public:
/// will lead to a valid configuration of @ref ConvertFp32ToFp16Layer.
void ValidateTensorShapesFromInputs() override;
+ void Accept(ILayerVisitor& visitor) const override;
+
protected:
/// Constructor to create a ConvertFp32ToFp16Layer.
/// @param [in] name Optional name for the layer.
diff --git a/src/armnn/layers/Convolution2dLayer.cpp b/src/armnn/layers/Convolution2dLayer.cpp
index 4756e1daae..86eb71d61a 100644
--- a/src/armnn/layers/Convolution2dLayer.cpp
+++ b/src/armnn/layers/Convolution2dLayer.cpp
@@ -110,4 +110,17 @@ Layer::ConstantTensors Convolution2dLayer::GetConstantTensorsByRef()
return {m_Weight, m_Bias};
}
+void Convolution2dLayer::Accept(ILayerVisitor& visitor) const
+{
+ ConstTensor dummy;
+ if (GetParameters().m_BiasEnabled)
+ {
+ visitor.VisitConvolution2dLayer(this, GetParameters(), dummy, dummy, GetName());
+ }
+ else
+ {
+ visitor.VisitConvolution2dLayer(this, GetParameters(), dummy, GetName());
+ }
+}
+
} // namespace armnn
diff --git a/src/armnn/layers/Convolution2dLayer.hpp b/src/armnn/layers/Convolution2dLayer.hpp
index b812b1bece..05a26da82a 100644
--- a/src/armnn/layers/Convolution2dLayer.hpp
+++ b/src/armnn/layers/Convolution2dLayer.hpp
@@ -41,6 +41,8 @@ public:
/// @return A vector to the inferred output shape.
std::vector<TensorShape> InferOutputShapes(const std::vector<TensorShape>& inputShapes) const override;
+ void Accept(ILayerVisitor& visitor) const override;
+
protected:
/// Constructor to create a Convolution2dLayer.
/// @param [in] param Convolution2dDescriptor to configure the convolution2d operation.
diff --git a/src/armnn/layers/DebugLayer.cpp b/src/armnn/layers/DebugLayer.cpp
index e83b17ee64..6fccca677f 100644
--- a/src/armnn/layers/DebugLayer.cpp
+++ b/src/armnn/layers/DebugLayer.cpp
@@ -46,4 +46,10 @@ void DebugLayer::ValidateTensorShapesFromInputs()
inferredShapes[0]);
}
+void DebugLayer::Accept(ILayerVisitor& visitor) const
+{
+ // by design debug layers are never in input graphs
+ throw armnn::Exception("DebugLayer should never appear in an input graph");
+}
+
} // namespace armnn
diff --git a/src/armnn/layers/DebugLayer.hpp b/src/armnn/layers/DebugLayer.hpp
index fc777a8bad..bc64541cbe 100644
--- a/src/armnn/layers/DebugLayer.hpp
+++ b/src/armnn/layers/DebugLayer.hpp
@@ -28,6 +28,8 @@ public:
/// will lead to a valid configuration of @ref DebugLayer.
void ValidateTensorShapesFromInputs() override;
+ void Accept(ILayerVisitor& visitor) const override;
+
protected:
/// Constructor to create a DebugLayer.
/// @param [in] param DebugDescriptor to configure the debug layer.
diff --git a/src/armnn/layers/DepthwiseConvolution2dLayer.cpp b/src/armnn/layers/DepthwiseConvolution2dLayer.cpp
index c4edc2022f..b2d981445d 100644
--- a/src/armnn/layers/DepthwiseConvolution2dLayer.cpp
+++ b/src/armnn/layers/DepthwiseConvolution2dLayer.cpp
@@ -120,4 +120,17 @@ Layer::ConstantTensors DepthwiseConvolution2dLayer::GetConstantTensorsByRef()
return {m_Weight, m_Bias};
}
+void DepthwiseConvolution2dLayer::Accept(ILayerVisitor& visitor) const
+{
+ ConstTensor dummy;
+ if (GetParameters().m_BiasEnabled)
+ {
+ visitor.VisitDepthwiseConvolution2dLayer(this, GetParameters(), dummy, dummy, GetName());
+ }
+ else
+ {
+ visitor.VisitDepthwiseConvolution2dLayer(this, GetParameters(), dummy, GetName());
+ }
+}
+
} // namespace armnn
diff --git a/src/armnn/layers/DepthwiseConvolution2dLayer.hpp b/src/armnn/layers/DepthwiseConvolution2dLayer.hpp
index 9d5b658ec7..065ba6cec2 100644
--- a/src/armnn/layers/DepthwiseConvolution2dLayer.hpp
+++ b/src/armnn/layers/DepthwiseConvolution2dLayer.hpp
@@ -41,6 +41,8 @@ public:
/// @return A vector to the inferred output shape.
std::vector<TensorShape> InferOutputShapes(const std::vector<TensorShape>& inputShapes) const override;
+ void Accept(ILayerVisitor& visitor) const override;
+
protected:
/// Constructor to create a DepthwiseConvolution2dLayer.
/// @param [in] param DepthwiseConvolution2dDescriptor to configure the depthwise convolution2d.
diff --git a/src/armnn/layers/DetectionPostProcessLayer.cpp b/src/armnn/layers/DetectionPostProcessLayer.cpp
index 99aaac7b9f..78589229e6 100644
--- a/src/armnn/layers/DetectionPostProcessLayer.cpp
+++ b/src/armnn/layers/DetectionPostProcessLayer.cpp
@@ -36,4 +36,9 @@ void DetectionPostProcessLayer::ValidateTensorShapesFromInputs()
VerifyLayerConnections(2, CHECK_LOCATION());
}
+void DetectionPostProcessLayer::Accept(ILayerVisitor& visitor) const
+{
+ visitor.VisitDetectionPostProcessLayer(this, GetParameters(), GetName());
+}
+
} // namespace armnn
diff --git a/src/armnn/layers/DetectionPostProcessLayer.hpp b/src/armnn/layers/DetectionPostProcessLayer.hpp
index b5a1cf17fb..629e3864b3 100644
--- a/src/armnn/layers/DetectionPostProcessLayer.hpp
+++ b/src/armnn/layers/DetectionPostProcessLayer.hpp
@@ -29,6 +29,8 @@ public:
/// will lead to a valid configuration of @ref DetectionPostProcessLayer.
void ValidateTensorShapesFromInputs() override;
+ void Accept(ILayerVisitor& visitor) const override;
+
protected:
/// Constructor to create a DetectionPostProcessLayer.
/// @param [in] param DetectionPostProcessDescriptor to configure the detection postprocess.
diff --git a/src/armnn/layers/DivisionLayer.cpp b/src/armnn/layers/DivisionLayer.cpp
index 03164993bc..aa54ef664f 100644
--- a/src/armnn/layers/DivisionLayer.cpp
+++ b/src/armnn/layers/DivisionLayer.cpp
@@ -31,4 +31,9 @@ DivisionLayer* DivisionLayer::Clone(Graph& graph) const
return CloneBase<DivisionLayer>(graph, GetName());
}
+void DivisionLayer::Accept(ILayerVisitor& visitor) const
+{
+ visitor.VisitDivisionLayer(this, GetName());
+}
+
} // namespace armnn
diff --git a/src/armnn/layers/DivisionLayer.hpp b/src/armnn/layers/DivisionLayer.hpp
index e1dca2f9af..fdeadba78e 100644
--- a/src/armnn/layers/DivisionLayer.hpp
+++ b/src/armnn/layers/DivisionLayer.hpp
@@ -25,6 +25,8 @@ public:
/// @param [in] graph The graph into which this layer is being cloned.
DivisionLayer* Clone(Graph& graph) const override;
+ void Accept(ILayerVisitor& visitor) const override;
+
protected:
/// Constructor to create a DivisionLayer.
/// @param [in] name Optional name for the layer.
diff --git a/src/armnn/layers/EqualLayer.cpp b/src/armnn/layers/EqualLayer.cpp
index e0d2e65309..7d16668b06 100644
--- a/src/armnn/layers/EqualLayer.cpp
+++ b/src/armnn/layers/EqualLayer.cpp
@@ -31,4 +31,9 @@ EqualLayer* EqualLayer::Clone(Graph& graph) const
return CloneBase<EqualLayer>(graph, GetName());
}
+void EqualLayer::Accept(ILayerVisitor& visitor) const
+{
+ visitor.VisitEqualLayer(this, GetName());
+}
+
} // namespace armnn
diff --git a/src/armnn/layers/EqualLayer.hpp b/src/armnn/layers/EqualLayer.hpp
index 198bae7f43..b6a01eff2d 100644
--- a/src/armnn/layers/EqualLayer.hpp
+++ b/src/armnn/layers/EqualLayer.hpp
@@ -24,6 +24,8 @@ public:
/// @param [in] graph The graph into which this layer is being cloned.
EqualLayer* Clone(Graph& graph) const override;
+ void Accept(ILayerVisitor& visitor) const override;
+
protected:
/// Constructor to create a EqualLayer.
/// @param [in] name Optional name for the layer.
diff --git a/src/armnn/layers/FakeQuantizationLayer.cpp b/src/armnn/layers/FakeQuantizationLayer.cpp
index 15f862ecac..d61a80f748 100644
--- a/src/armnn/layers/FakeQuantizationLayer.cpp
+++ b/src/armnn/layers/FakeQuantizationLayer.cpp
@@ -44,4 +44,9 @@ void FakeQuantizationLayer::ValidateTensorShapesFromInputs()
inferredShapes[0]);
}
+void FakeQuantizationLayer::Accept(ILayerVisitor& visitor) const
+{
+ throw armnn::Exception("FakeQuantizationLayer should not appear in an input graph");
+}
+
} // namespace armnn
diff --git a/src/armnn/layers/FakeQuantizationLayer.hpp b/src/armnn/layers/FakeQuantizationLayer.hpp
index 5e7b5cbe7b..81e5444d88 100644
--- a/src/armnn/layers/FakeQuantizationLayer.hpp
+++ b/src/armnn/layers/FakeQuantizationLayer.hpp
@@ -28,6 +28,8 @@ public:
/// will lead to a valid configuration of @ref FakeQuantizationLayer.
void ValidateTensorShapesFromInputs() override;
+ void Accept(ILayerVisitor& visitor) const override;
+
protected:
/// Constructor to create a FakeQuantizationLayer.
/// @param [in] param FakeQuantizationDescriptor to configure the fake quantization operation.
diff --git a/src/armnn/layers/FloorLayer.cpp b/src/armnn/layers/FloorLayer.cpp
index ddf1294139..34ad7f628e 100644
--- a/src/armnn/layers/FloorLayer.cpp
+++ b/src/armnn/layers/FloorLayer.cpp
@@ -44,4 +44,9 @@ void FloorLayer::ValidateTensorShapesFromInputs()
inferredShapes[0]);
}
+void FloorLayer::Accept(ILayerVisitor& visitor) const
+{
+ visitor.VisitFloorLayer(this, GetName());
+}
+
} // namespace armnn
diff --git a/src/armnn/layers/FloorLayer.hpp b/src/armnn/layers/FloorLayer.hpp
index 546d1362f9..9bc6de7bf3 100644
--- a/src/armnn/layers/FloorLayer.hpp
+++ b/src/armnn/layers/FloorLayer.hpp
@@ -28,6 +28,8 @@ public:
/// will lead to a valid configuration of @ref FloorLayer.
void ValidateTensorShapesFromInputs() override;
+ void Accept(ILayerVisitor& visitor) const override;
+
protected:
/// Constructor to create a FloorLayer.
/// @param [in] name Optional name for the layer.
diff --git a/src/armnn/layers/FullyConnectedLayer.cpp b/src/armnn/layers/FullyConnectedLayer.cpp
index e003c7350a..977c2769df 100644
--- a/src/armnn/layers/FullyConnectedLayer.cpp
+++ b/src/armnn/layers/FullyConnectedLayer.cpp
@@ -86,4 +86,17 @@ Layer::ConstantTensors FullyConnectedLayer::GetConstantTensorsByRef()
return {m_Weight, m_Bias};
}
+void FullyConnectedLayer::Accept(ILayerVisitor& visitor) const
+{
+ ConstTensor dummy;
+ if (GetParameters().m_BiasEnabled)
+ {
+ visitor.VisitFullyConnectedLayer(this, GetParameters(), dummy, dummy, GetName());
+ }
+ else
+ {
+ visitor.VisitFullyConnectedLayer(this, GetParameters(), dummy, GetName());
+ }
+}
+
} // namespace armnn
diff --git a/src/armnn/layers/FullyConnectedLayer.hpp b/src/armnn/layers/FullyConnectedLayer.hpp
index 0a404b7e49..d756d433c1 100644
--- a/src/armnn/layers/FullyConnectedLayer.hpp
+++ b/src/armnn/layers/FullyConnectedLayer.hpp
@@ -41,6 +41,8 @@ public:
/// @return A vector to the inferred output shape.
std::vector<TensorShape> InferOutputShapes(const std::vector<TensorShape>& inputShapes) const override;
+ void Accept(ILayerVisitor& visitor) const override;
+
protected:
/// Constructor to create a FullyConnectedLayer.
/// @param [in] param FullyConnectedDescriptor to configure the fully connected operation.
diff --git a/src/armnn/layers/GatherLayer.cpp b/src/armnn/layers/GatherLayer.cpp
index d7ed4b2542..e3ce6b3dad 100644
--- a/src/armnn/layers/GatherLayer.cpp
+++ b/src/armnn/layers/GatherLayer.cpp
@@ -60,4 +60,9 @@ void GatherLayer::ValidateTensorShapesFromInputs()
inferredShape);
}
+void GatherLayer::Accept(ILayerVisitor& visitor) const
+{
+ visitor.VisitGatherLayer(this, GetName());
+}
+
} // namespace armnn
diff --git a/src/armnn/layers/GatherLayer.hpp b/src/armnn/layers/GatherLayer.hpp
index 7b3aebe77e..9acec528d8 100644
--- a/src/armnn/layers/GatherLayer.hpp
+++ b/src/armnn/layers/GatherLayer.hpp
@@ -29,6 +29,8 @@ public:
/// will lead to a valid configuration of @ref GatherLayer.
void ValidateTensorShapesFromInputs() override;
+ void Accept(ILayerVisitor& visitor) const override;
+
protected:
/// Constructor to create a GatherLayer.
/// @param [in] name Optional name for the layer.
diff --git a/src/armnn/layers/GreaterLayer.cpp b/src/armnn/layers/GreaterLayer.cpp
index d40c17c71b..a9fe5e0d8c 100644
--- a/src/armnn/layers/GreaterLayer.cpp
+++ b/src/armnn/layers/GreaterLayer.cpp
@@ -31,4 +31,9 @@ GreaterLayer* GreaterLayer::Clone(Graph& graph) const
return CloneBase<GreaterLayer>(graph, GetName());
}
+void GreaterLayer::Accept(ILayerVisitor& visitor) const
+{
+ visitor.VisitGreaterLayer(this, GetName());
+}
+
} // namespace armnn
diff --git a/src/armnn/layers/GreaterLayer.hpp b/src/armnn/layers/GreaterLayer.hpp
index 8b33f419b9..bdee948d6e 100644
--- a/src/armnn/layers/GreaterLayer.hpp
+++ b/src/armnn/layers/GreaterLayer.hpp
@@ -25,6 +25,8 @@ public:
/// @param [in] graph The graph into which this layer is being cloned.
GreaterLayer* Clone(Graph& graph) const override;
+ void Accept(ILayerVisitor& visitor) const override;
+
protected:
/// Constructor to create a GreaterLayer.
/// @param [in] name Optional name for the layer.
diff --git a/src/armnn/layers/InputLayer.cpp b/src/armnn/layers/InputLayer.cpp
index 0b6d5d2a0b..f56c5b47f0 100644
--- a/src/armnn/layers/InputLayer.cpp
+++ b/src/armnn/layers/InputLayer.cpp
@@ -34,4 +34,9 @@ void InputLayer::ValidateTensorShapesFromInputs()
"InputLayer should already have the TensorInfo set.");
}
+void InputLayer::Accept(ILayerVisitor& visitor) const
+{
+ visitor.VisitInputLayer(this, this->GetBindingId(), GetName());
+}
+
} // namespace
diff --git a/src/armnn/layers/InputLayer.hpp b/src/armnn/layers/InputLayer.hpp
index 1f6f245932..faa48fb2e9 100644
--- a/src/armnn/layers/InputLayer.hpp
+++ b/src/armnn/layers/InputLayer.hpp
@@ -28,6 +28,8 @@ public:
/// will lead to a valid configuration of @ref InputLayer.
void ValidateTensorShapesFromInputs() override;
+ void Accept(ILayerVisitor& visitor) const override;
+
protected:
/// Constructor to create an InputLayer.
/// @param id The layer binding id number.
diff --git a/src/armnn/layers/L2NormalizationLayer.cpp b/src/armnn/layers/L2NormalizationLayer.cpp
index 2a9fde91ee..88c3992d42 100644
--- a/src/armnn/layers/L2NormalizationLayer.cpp
+++ b/src/armnn/layers/L2NormalizationLayer.cpp
@@ -44,4 +44,9 @@ void L2NormalizationLayer::ValidateTensorShapesFromInputs()
inferredShapes[0]);
}
+void L2NormalizationLayer::Accept(ILayerVisitor& visitor) const
+{
+ visitor.VisitL2NormalizationLayer(this, GetParameters(), GetName());
+}
+
} // namespace armnn
diff --git a/src/armnn/layers/L2NormalizationLayer.hpp b/src/armnn/layers/L2NormalizationLayer.hpp
index bae3d820ba..0c4b24394d 100644
--- a/src/armnn/layers/L2NormalizationLayer.hpp
+++ b/src/armnn/layers/L2NormalizationLayer.hpp
@@ -28,6 +28,8 @@ public:
/// will lead to a valid configuration of @ref L2NormalizationLayer.
void ValidateTensorShapesFromInputs() override;
+ void Accept(ILayerVisitor& visitor) const override;
+
protected:
/// Constructor to create a L2NormalizationLayer.
/// @param [in] param L2NormalizationDescriptor to configure the L2 normalization operation.
diff --git a/src/armnn/layers/LstmLayer.cpp b/src/armnn/layers/LstmLayer.cpp
index bd104d49fe..942038a315 100644
--- a/src/armnn/layers/LstmLayer.cpp
+++ b/src/armnn/layers/LstmLayer.cpp
@@ -249,4 +249,10 @@ Layer::ConstantTensors LstmLayer::GetConstantTensorsByRef()
m_PeepholeParameters.m_CellToOutputWeights};
}
+void LstmLayer::Accept(ILayerVisitor& visitor) const
+{
+ LstmInputParams dummy;
+ visitor.VisitLstmLayer(this, GetParameters(), dummy, GetName());
+}
+
} // namespace armnn
diff --git a/src/armnn/layers/LstmLayer.hpp b/src/armnn/layers/LstmLayer.hpp
index 6004d9666b..bfea5d8232 100644
--- a/src/armnn/layers/LstmLayer.hpp
+++ b/src/armnn/layers/LstmLayer.hpp
@@ -92,6 +92,8 @@ public:
/// @return A vector to the inferred output shape.
std::vector<TensorShape> InferOutputShapes(const std::vector<TensorShape>& inputShapes) const override;
+ void Accept(ILayerVisitor& visitor) const override;
+
protected:
/// Constructor to create a LstmLayer.
/// @param [in] param LstmDescriptor to configure the lstm operation.
diff --git a/src/armnn/layers/MaximumLayer.cpp b/src/armnn/layers/MaximumLayer.cpp
index c0da8d6ef8..5f69a470be 100644
--- a/src/armnn/layers/MaximumLayer.cpp
+++ b/src/armnn/layers/MaximumLayer.cpp
@@ -30,4 +30,9 @@ MaximumLayer* MaximumLayer::Clone(Graph& graph) const
return CloneBase<MaximumLayer>(graph, GetName());
}
+void MaximumLayer::Accept(ILayerVisitor& visitor) const
+{
+ visitor.VisitMaximumLayer(this, GetName());
+}
+
} // namespace armnn
diff --git a/src/armnn/layers/MaximumLayer.hpp b/src/armnn/layers/MaximumLayer.hpp
index 82ee6e8f55..9534b07071 100644
--- a/src/armnn/layers/MaximumLayer.hpp
+++ b/src/armnn/layers/MaximumLayer.hpp
@@ -25,6 +25,8 @@ public:
/// @param [in] graph The graph into which this layer is being cloned.
MaximumLayer* Clone(Graph& graph) const override;
+ void Accept(ILayerVisitor& visitor) const override;
+
protected:
/// Constructor to create a MaximumLayer.
/// @param [in] name Optional name for the layer.
diff --git a/src/armnn/layers/MeanLayer.cpp b/src/armnn/layers/MeanLayer.cpp
index e45f1a8d2d..c72d79bab9 100644
--- a/src/armnn/layers/MeanLayer.cpp
+++ b/src/armnn/layers/MeanLayer.cpp
@@ -100,4 +100,9 @@ void MeanLayer::ValidateTensorShapesFromInputs()
inferredShape);
}
+void MeanLayer::Accept(ILayerVisitor& visitor) const
+{
+ visitor.VisitMeanLayer(this, GetParameters(), GetName());
+}
+
} // namespace armnn
diff --git a/src/armnn/layers/MeanLayer.hpp b/src/armnn/layers/MeanLayer.hpp
index 3896569aa8..d70302fa44 100644
--- a/src/armnn/layers/MeanLayer.hpp
+++ b/src/armnn/layers/MeanLayer.hpp
@@ -29,6 +29,8 @@ public:
/// will lead to a valid configuration of @ref MeanLayer.
void ValidateTensorShapesFromInputs() override;
+ void Accept(ILayerVisitor& visitor) const override;
+
protected:
/// Constructor to create a MeanLayer.
/// @param [in] param MeanDescriptor to configure the mean operation.
diff --git a/src/armnn/layers/MemCopyLayer.cpp b/src/armnn/layers/MemCopyLayer.cpp
index e3138d2dee..6f3f55955e 100644
--- a/src/armnn/layers/MemCopyLayer.cpp
+++ b/src/armnn/layers/MemCopyLayer.cpp
@@ -46,4 +46,9 @@ void MemCopyLayer::ValidateTensorShapesFromInputs()
inferredShapes[0]);
}
+void MemCopyLayer::Accept(ILayerVisitor& visitor) const
+{
+ throw armnn::Exception("MemCopyLayer should not appear in an input graph");
+}
+
} // namespace armnn
diff --git a/src/armnn/layers/MemCopyLayer.hpp b/src/armnn/layers/MemCopyLayer.hpp
index 051b18f1fe..2c696a433c 100644
--- a/src/armnn/layers/MemCopyLayer.hpp
+++ b/src/armnn/layers/MemCopyLayer.hpp
@@ -28,6 +28,8 @@ public:
/// will lead to a valid configuration of @ref MemCopyLayer.
void ValidateTensorShapesFromInputs() override;
+ void Accept(ILayerVisitor& visitor) const override;
+
protected:
/// Constructor to create a MemCopyLayer.
/// @param [in] name Optional name for the layer.
diff --git a/src/armnn/layers/MergerLayer.cpp b/src/armnn/layers/MergerLayer.cpp
index b4b5d3c2ef..f87f34925f 100644
--- a/src/armnn/layers/MergerLayer.cpp
+++ b/src/armnn/layers/MergerLayer.cpp
@@ -195,4 +195,9 @@ void MergerLayer::ValidateTensorShapesFromInputs()
inferredShapes[0]);
}
+void MergerLayer::Accept(ILayerVisitor& visitor) const
+{
+ visitor.VisitMergerLayer(this, GetParameters(), GetName());
+}
+
} // namespace armnn armnn
diff --git a/src/armnn/layers/MergerLayer.hpp b/src/armnn/layers/MergerLayer.hpp
index f0bf62bd2f..6f0c1489d4 100644
--- a/src/armnn/layers/MergerLayer.hpp
+++ b/src/armnn/layers/MergerLayer.hpp
@@ -40,6 +40,8 @@ public:
/// @return A vector to the inferred output shape.
std::vector<TensorShape> InferOutputShapes(const std::vector<TensorShape>& inputShapes) const override;
+ void Accept(ILayerVisitor& visitor) const override;
+
protected:
/// Constructor to create a MergerLayer.
/// @param [in] param OriginsDescriptor to configure the merger operation.
diff --git a/src/armnn/layers/MinimumLayer.cpp b/src/armnn/layers/MinimumLayer.cpp
index 8e76041813..810ee182a1 100644
--- a/src/armnn/layers/MinimumLayer.cpp
+++ b/src/armnn/layers/MinimumLayer.cpp
@@ -31,4 +31,9 @@ MinimumLayer* MinimumLayer::Clone(Graph& graph) const
return CloneBase<MinimumLayer>(graph, GetName());
}
+void MinimumLayer::Accept(ILayerVisitor& visitor) const
+{
+ visitor.VisitMinimumLayer(this, GetName());
+}
+
} // namespace armnn
diff --git a/src/armnn/layers/MinimumLayer.hpp b/src/armnn/layers/MinimumLayer.hpp
index 3801c62622..4a7bc177be 100644
--- a/src/armnn/layers/MinimumLayer.hpp
+++ b/src/armnn/layers/MinimumLayer.hpp
@@ -25,6 +25,8 @@ public:
/// @param [in] graph The graph into which this layer is being cloned.
MinimumLayer* Clone(Graph& graph) const override;
+ void Accept(ILayerVisitor& visitor) const override;
+
protected:
/// Constructor to create a MinimumLayer.
/// @param [in] name Optional name for the layer.
diff --git a/src/armnn/layers/MultiplicationLayer.cpp b/src/armnn/layers/MultiplicationLayer.cpp
index 9448935660..4556a874d4 100644
--- a/src/armnn/layers/MultiplicationLayer.cpp
+++ b/src/armnn/layers/MultiplicationLayer.cpp
@@ -31,4 +31,9 @@ MultiplicationLayer* MultiplicationLayer::Clone(Graph& graph) const
return CloneBase<MultiplicationLayer>(graph, GetName());
}
+void MultiplicationLayer::Accept(ILayerVisitor& visitor) const
+{
+ visitor.VisitMultiplicationLayer(this, GetName());
+}
+
} // namespace armnn
diff --git a/src/armnn/layers/MultiplicationLayer.hpp b/src/armnn/layers/MultiplicationLayer.hpp
index 9f15e3a4c6..b9fd35a0e2 100644
--- a/src/armnn/layers/MultiplicationLayer.hpp
+++ b/src/armnn/layers/MultiplicationLayer.hpp
@@ -25,6 +25,8 @@ public:
/// @param [in] graph The graph into which this layer is being cloned.
MultiplicationLayer* Clone(Graph& graph) const override;
+ void Accept(ILayerVisitor& visitor) const override;
+
protected:
/// Constructor to create a MultiplicationLayer.
/// @param [in] name Optional name for the layer
diff --git a/src/armnn/layers/NormalizationLayer.cpp b/src/armnn/layers/NormalizationLayer.cpp
index 140d628452..f5b9284f31 100644
--- a/src/armnn/layers/NormalizationLayer.cpp
+++ b/src/armnn/layers/NormalizationLayer.cpp
@@ -43,4 +43,9 @@ void NormalizationLayer::ValidateTensorShapesFromInputs()
inferredShapes[0]);
}
+void NormalizationLayer::Accept(ILayerVisitor& visitor) const
+{
+ visitor.VisitNormalizationLayer(this, GetParameters(), GetName());
+}
+
} // namespace armnn
diff --git a/src/armnn/layers/NormalizationLayer.hpp b/src/armnn/layers/NormalizationLayer.hpp
index 9fd78751f7..0027acc2e5 100644
--- a/src/armnn/layers/NormalizationLayer.hpp
+++ b/src/armnn/layers/NormalizationLayer.hpp
@@ -28,6 +28,8 @@ public:
/// will lead to a valid configuration of @ref NormalizationLayer.
void ValidateTensorShapesFromInputs() override;
+ void Accept(ILayerVisitor& visitor) const override;
+
protected:
/// Constructor to create a NormalizationLayer.
/// @param [in] param NormalizationDescriptor to configure the normalization operation.
diff --git a/src/armnn/layers/OutputLayer.cpp b/src/armnn/layers/OutputLayer.cpp
index db11a3d005..9b4cb70032 100644
--- a/src/armnn/layers/OutputLayer.cpp
+++ b/src/armnn/layers/OutputLayer.cpp
@@ -34,4 +34,9 @@ void OutputLayer::ValidateTensorShapesFromInputs()
"OutputLayer: Input slot must be connected.");
}
+void OutputLayer::Accept(ILayerVisitor& visitor) const
+{
+ visitor.VisitOutputLayer(this, GetBindingId(), GetName());
+}
+
} // namespace armnn
diff --git a/src/armnn/layers/OutputLayer.hpp b/src/armnn/layers/OutputLayer.hpp
index 080b30183b..b86f8e2dfe 100644
--- a/src/armnn/layers/OutputLayer.hpp
+++ b/src/armnn/layers/OutputLayer.hpp
@@ -37,6 +37,8 @@ public:
/// will lead to a valid configuration of @ref OutputLayer.
void ValidateTensorShapesFromInputs() override;
+ void Accept(ILayerVisitor& visitor) const override;
+
protected:
/// Constructor to create an OutputLayer.
/// @param id The layer binding id number.
diff --git a/src/armnn/layers/PadLayer.cpp b/src/armnn/layers/PadLayer.cpp
index 5e5f8ca106..9e08da49c0 100644
--- a/src/armnn/layers/PadLayer.cpp
+++ b/src/armnn/layers/PadLayer.cpp
@@ -42,4 +42,9 @@ void PadLayer::ValidateTensorShapesFromInputs()
return;
}
+void PadLayer::Accept(ILayerVisitor& visitor) const
+{
+ visitor.VisitPadLayer(this, GetParameters(), GetName());
+}
+
} // namespace armnn \ No newline at end of file
diff --git a/src/armnn/layers/PadLayer.hpp b/src/armnn/layers/PadLayer.hpp
index 569365a118..8174fa884f 100644
--- a/src/armnn/layers/PadLayer.hpp
+++ b/src/armnn/layers/PadLayer.hpp
@@ -29,6 +29,8 @@ public:
/// will lead to a valid configuration of @ref PadLayer.
void ValidateTensorShapesFromInputs() override;
+ void Accept(ILayerVisitor& visitor) const override;
+
protected:
/// Constructor to create a PadLayer.
/// @param [in] param PadDescriptor to configure the pad operation.
diff --git a/src/armnn/layers/PermuteLayer.cpp b/src/armnn/layers/PermuteLayer.cpp
index 6d0d7e011f..e6a7a38685 100644
--- a/src/armnn/layers/PermuteLayer.cpp
+++ b/src/armnn/layers/PermuteLayer.cpp
@@ -52,4 +52,9 @@ void PermuteLayer::ValidateTensorShapesFromInputs()
inferredShapes[0]);
}
+void PermuteLayer::Accept(ILayerVisitor& visitor) const
+{
+ visitor.VisitPermuteLayer(this, GetParameters(), GetName());
+}
+
} // namespace armnn
diff --git a/src/armnn/layers/PermuteLayer.hpp b/src/armnn/layers/PermuteLayer.hpp
index e1f391a2ff..8413322373 100644
--- a/src/armnn/layers/PermuteLayer.hpp
+++ b/src/armnn/layers/PermuteLayer.hpp
@@ -58,6 +58,8 @@ public:
GetPermutation().IsEqual(boost::polymorphic_downcast<const PermuteLayer*>(&other)->GetPermutation());
}
+ void Accept(ILayerVisitor& visitor) const override;
+
protected:
/// Constructor to create a PermuteLayer.
/// @param [in] param PermuteDescriptor to configure the permute operation.
diff --git a/src/armnn/layers/Pooling2dLayer.cpp b/src/armnn/layers/Pooling2dLayer.cpp
index d4af056217..7c5be01c35 100644
--- a/src/armnn/layers/Pooling2dLayer.cpp
+++ b/src/armnn/layers/Pooling2dLayer.cpp
@@ -114,4 +114,9 @@ void Pooling2dLayer::ValidateTensorShapesFromInputs()
inferredShapes[0]);
}
+void Pooling2dLayer::Accept(ILayerVisitor& visitor) const
+{
+ visitor.VisitPooling2dLayer(this, GetParameters(), GetName());
+}
+
} // namespace armnn
diff --git a/src/armnn/layers/Pooling2dLayer.hpp b/src/armnn/layers/Pooling2dLayer.hpp
index ee6a6acee5..f70ae78aa9 100644
--- a/src/armnn/layers/Pooling2dLayer.hpp
+++ b/src/armnn/layers/Pooling2dLayer.hpp
@@ -34,6 +34,8 @@ public:
/// @return A vector to the inferred output shape.
std::vector<TensorShape> InferOutputShapes(const std::vector<TensorShape>& inputShapes) const override;
+ void Accept(ILayerVisitor& visitor) const override;
+
protected:
/// Constructor to create a Pooling2dLayer.
/// @param [in] param Pooling2dDescriptor to configure the pooling2d operation.
diff --git a/src/armnn/layers/PreCompiledLayer.cpp b/src/armnn/layers/PreCompiledLayer.cpp
index c443f9ae79..11064216ee 100644
--- a/src/armnn/layers/PreCompiledLayer.cpp
+++ b/src/armnn/layers/PreCompiledLayer.cpp
@@ -53,4 +53,9 @@ void PreCompiledLayer::SetPreCompiledObject(const std::shared_ptr<void>& preComp
m_PreCompiledObject = preCompiledObject;
}
+void PreCompiledLayer::Accept(ILayerVisitor& visitor) const
+{
+ throw armnn::Exception("PreCompiledLayer should not appear in an input graph");
+}
+
} // namespace armnn
diff --git a/src/armnn/layers/PreCompiledLayer.hpp b/src/armnn/layers/PreCompiledLayer.hpp
index fd28d0e7a8..854a78c29a 100644
--- a/src/armnn/layers/PreCompiledLayer.hpp
+++ b/src/armnn/layers/PreCompiledLayer.hpp
@@ -32,6 +32,8 @@ public:
void SetPreCompiledObject(const std::shared_ptr<void>& preCompiledObject);
+ void Accept(ILayerVisitor& visitor) const override;
+
private:
PreCompiledLayer(const PreCompiledLayer& other) = delete;
PreCompiledLayer& operator=(const PreCompiledLayer& other) = delete;
diff --git a/src/armnn/layers/ReshapeLayer.cpp b/src/armnn/layers/ReshapeLayer.cpp
index 2a069808f1..cfce712151 100644
--- a/src/armnn/layers/ReshapeLayer.cpp
+++ b/src/armnn/layers/ReshapeLayer.cpp
@@ -49,4 +49,9 @@ void ReshapeLayer::ValidateTensorShapesFromInputs()
inferredShapes[0]);
}
+void ReshapeLayer::Accept(ILayerVisitor& visitor) const
+{
+ visitor.VisitReshapeLayer(this, GetParameters(), GetName());
+}
+
} // namespace armnn
diff --git a/src/armnn/layers/ReshapeLayer.hpp b/src/armnn/layers/ReshapeLayer.hpp
index 13e73be4e4..c4743d17df 100644
--- a/src/armnn/layers/ReshapeLayer.hpp
+++ b/src/armnn/layers/ReshapeLayer.hpp
@@ -43,6 +43,8 @@ public:
m_Param.m_TargetShape == boost::polymorphic_downcast<const ReshapeLayer*>(&other)->m_Param.m_TargetShape;
}
+ void Accept(ILayerVisitor& visitor) const override;
+
protected:
/// Constructor to create a ReshapeLayer.
/// @param [in] param ReshapeDescriptor to configure the reshape operation.
diff --git a/src/armnn/layers/ResizeBilinearLayer.cpp b/src/armnn/layers/ResizeBilinearLayer.cpp
index c7c92d7394..03fe317e79 100644
--- a/src/armnn/layers/ResizeBilinearLayer.cpp
+++ b/src/armnn/layers/ResizeBilinearLayer.cpp
@@ -66,4 +66,9 @@ void ResizeBilinearLayer::ValidateTensorShapesFromInputs()
inferredShapes[0]);
}
+void ResizeBilinearLayer::Accept(ILayerVisitor& visitor) const
+{
+ visitor.VisitResizeBilinearLayer(this, GetParameters(), GetName());
+}
+
} // namespace armnn
diff --git a/src/armnn/layers/ResizeBilinearLayer.hpp b/src/armnn/layers/ResizeBilinearLayer.hpp
index 185d8a59e1..4bf264cb45 100644
--- a/src/armnn/layers/ResizeBilinearLayer.hpp
+++ b/src/armnn/layers/ResizeBilinearLayer.hpp
@@ -34,6 +34,8 @@ public:
/// @return A vector to the inferred output shape.
std::vector<TensorShape> InferOutputShapes(const std::vector<TensorShape>& inputShapes) const override;
+ void Accept(ILayerVisitor& visitor) const override;
+
protected:
/// Constructor to create a ResizeBilinearLayerLayer.
/// @param [in] param ResizeBilinearDescriptor to configure the resize bilinear operation.
diff --git a/src/armnn/layers/RsqrtLayer.cpp b/src/armnn/layers/RsqrtLayer.cpp
index d516810c68..a21564ed7f 100644
--- a/src/armnn/layers/RsqrtLayer.cpp
+++ b/src/armnn/layers/RsqrtLayer.cpp
@@ -45,4 +45,9 @@ void RsqrtLayer::ValidateTensorShapesFromInputs()
inferredShapes[0]);
}
+void RsqrtLayer::Accept(ILayerVisitor& visitor) const
+{
+ visitor.VisitRsqrtLayer(this, GetName());
+}
+
} // namespace armnn \ No newline at end of file
diff --git a/src/armnn/layers/RsqrtLayer.hpp b/src/armnn/layers/RsqrtLayer.hpp
index 47a4ccedd6..526a6642ca 100644
--- a/src/armnn/layers/RsqrtLayer.hpp
+++ b/src/armnn/layers/RsqrtLayer.hpp
@@ -28,6 +28,8 @@ public:
/// will lead to a valid configuration of @ref RsqrtLayer.
void ValidateTensorShapesFromInputs() override;
+ void Accept(ILayerVisitor& visitor) const override;
+
protected:
/// Constructor to create an RsqrtLayer.
/// @param [in] name Optional name for the layer.
diff --git a/src/armnn/layers/SoftmaxLayer.cpp b/src/armnn/layers/SoftmaxLayer.cpp
index 4c2456d49c..90891b417a 100644
--- a/src/armnn/layers/SoftmaxLayer.cpp
+++ b/src/armnn/layers/SoftmaxLayer.cpp
@@ -43,4 +43,9 @@ void SoftmaxLayer::ValidateTensorShapesFromInputs()
inferredShapes[0]);
}
+void SoftmaxLayer::Accept(ILayerVisitor& visitor) const
+{
+ visitor.VisitSoftmaxLayer(this, GetParameters(), GetName());
+}
+
} // namespace armnn
diff --git a/src/armnn/layers/SoftmaxLayer.hpp b/src/armnn/layers/SoftmaxLayer.hpp
index f6bc8941d9..82c2099ea3 100644
--- a/src/armnn/layers/SoftmaxLayer.hpp
+++ b/src/armnn/layers/SoftmaxLayer.hpp
@@ -28,6 +28,8 @@ public:
/// will lead to a valid configuration of @ref SoftmaxLayer.
void ValidateTensorShapesFromInputs() override;
+ void Accept(ILayerVisitor& visitor) const override;
+
protected:
/// Constructor to create a SoftmaxLayer.
/// @param [in] param SoftmaxDescriptor to configure the softmax operation.
diff --git a/src/armnn/layers/SpaceToBatchNdLayer.cpp b/src/armnn/layers/SpaceToBatchNdLayer.cpp
index 38540d522d..6d5827e771 100644
--- a/src/armnn/layers/SpaceToBatchNdLayer.cpp
+++ b/src/armnn/layers/SpaceToBatchNdLayer.cpp
@@ -82,4 +82,9 @@ void SpaceToBatchNdLayer::ValidateTensorShapesFromInputs()
inferredShapes[0]);
}
+void SpaceToBatchNdLayer::Accept(ILayerVisitor& visitor) const
+{
+ visitor.VisitSpaceToBatchNdLayer(this, GetParameters(), GetName());
+}
+
} // namespace
diff --git a/src/armnn/layers/SpaceToBatchNdLayer.hpp b/src/armnn/layers/SpaceToBatchNdLayer.hpp
index 3e91bbd88c..f6616bcd21 100644
--- a/src/armnn/layers/SpaceToBatchNdLayer.hpp
+++ b/src/armnn/layers/SpaceToBatchNdLayer.hpp
@@ -35,6 +35,8 @@ public:
/// will lead to a valid configuration of @ref SpaceToBatchNdLayer.
void ValidateTensorShapesFromInputs() override;
+ void Accept(ILayerVisitor& visitor) const override;
+
protected:
/// Constructor to create a SpaceToBatchNdLayer.
/// @param [in] param SpaceToBatchNdDescriptor to configure the SpaceToBatchNdLayer operation.
diff --git a/src/armnn/layers/SplitterLayer.cpp b/src/armnn/layers/SplitterLayer.cpp
index 5cf1f6b3b1..b3a1094118 100644
--- a/src/armnn/layers/SplitterLayer.cpp
+++ b/src/armnn/layers/SplitterLayer.cpp
@@ -98,4 +98,9 @@ void SplitterLayer::ValidateTensorShapesFromInputs()
}
}
+void SplitterLayer::Accept(ILayerVisitor& visitor) const
+{
+ visitor.VisitSplitterLayer(this, GetParameters(), GetName());
+}
+
} // namespace armnn
diff --git a/src/armnn/layers/SplitterLayer.hpp b/src/armnn/layers/SplitterLayer.hpp
index 6a73510f33..19b05562e8 100644
--- a/src/armnn/layers/SplitterLayer.hpp
+++ b/src/armnn/layers/SplitterLayer.hpp
@@ -40,6 +40,8 @@ public:
/// @return A vector to the inferred output shape.
std::vector<TensorShape> InferOutputShapes(const std::vector<TensorShape>& inputShapes) const override;
+ void Accept(ILayerVisitor& visitor) const override;
+
protected:
/// Constructor to create a SplitterLayer.
/// @param [in] param ViewsDescriptor to configure the splitter operation.
diff --git a/src/armnn/layers/StridedSliceLayer.cpp b/src/armnn/layers/StridedSliceLayer.cpp
index 4ad9b89dd1..03d451c69a 100644
--- a/src/armnn/layers/StridedSliceLayer.cpp
+++ b/src/armnn/layers/StridedSliceLayer.cpp
@@ -88,4 +88,9 @@ void StridedSliceLayer::ValidateTensorShapesFromInputs()
inferredShapes[0]);
}
+void StridedSliceLayer::Accept(ILayerVisitor& visitor) const
+{
+ visitor.VisitStridedSliceLayer(this, GetParameters(), GetName());
+}
+
} // namespace armnn
diff --git a/src/armnn/layers/StridedSliceLayer.hpp b/src/armnn/layers/StridedSliceLayer.hpp
index 761dc5e600..97b8ee2a07 100644
--- a/src/armnn/layers/StridedSliceLayer.hpp
+++ b/src/armnn/layers/StridedSliceLayer.hpp
@@ -34,6 +34,8 @@ public:
/// will lead to a valid configuration of @ref StridedSliceLayer.
void ValidateTensorShapesFromInputs() override;
+ void Accept(ILayerVisitor& visitor) const override;
+
protected:
/// Constructor to create a StridedSliceLayer.
/// @param [in] param StridedSliceDescriptor to configure the strided slice layer.
diff --git a/src/armnn/layers/SubtractionLayer.cpp b/src/armnn/layers/SubtractionLayer.cpp
index 18d8661dd6..6becfdcd5d 100644
--- a/src/armnn/layers/SubtractionLayer.cpp
+++ b/src/armnn/layers/SubtractionLayer.cpp
@@ -31,4 +31,9 @@ SubtractionLayer* SubtractionLayer::Clone(Graph& graph) const
return CloneBase<SubtractionLayer>(graph, GetName());
}
+void SubtractionLayer::Accept(ILayerVisitor& visitor) const
+{
+ visitor.VisitSubtractionLayer(this, GetName());
+}
+
} // namespace armnn
diff --git a/src/armnn/layers/SubtractionLayer.hpp b/src/armnn/layers/SubtractionLayer.hpp
index 15d5684cdc..557da65db4 100644
--- a/src/armnn/layers/SubtractionLayer.hpp
+++ b/src/armnn/layers/SubtractionLayer.hpp
@@ -25,6 +25,8 @@ public:
/// @param [in] graph The graph into which this layer is being cloned.
SubtractionLayer* Clone(Graph& graph) const override;
+ void Accept(ILayerVisitor& visitor) const override;
+
protected:
/// Constructor to create a SubtractionLayer.
/// @param [in] name Optional name for the layer.