blob: c1d99a90106af00a9dbd6d0902cb14f15c009537 [file] [log] [blame]
telsoa014fcda012018-03-09 14:13:49 +00001//
2// Copyright © 2017 Arm Ltd. All rights reserved.
David Beckecb56cd2018-09-05 12:52:57 +01003// SPDX-License-Identifier: MIT
telsoa014fcda012018-03-09 14:13:49 +00004//
5#pragma once
6
7#include <armnn/DescriptorsFwd.hpp>
telsoa01c577f2c2018-08-31 09:22:23 +01008#include <armnn/LstmParams.hpp>
James Conroyee18dc82019-07-17 11:27:46 +01009#include <armnn/QuantizedLstmParams.hpp>
telsoa014fcda012018-03-09 14:13:49 +000010#include <armnn/TensorFwd.hpp>
11#include <armnn/Types.hpp>
12
13#include <armnn/INetwork.hpp>
14
15#include <string>
16#include <vector>
Derek Lamberti84da38b2019-06-13 11:40:08 +010017#include <map>
telsoa014fcda012018-03-09 14:13:49 +000018#include <memory>
19
20#include "Layer.hpp"
21
22namespace armnn
23{
24class Graph;
25
telsoa01c577f2c2018-08-31 09:22:23 +010026/// Private implementation of INetwork.
telsoa014fcda012018-03-09 14:13:49 +000027class Network final : public INetwork
28{
29public:
30 Network();
31 ~Network();
32
33 const Graph& GetGraph() const { return *m_Graph; }
34
35 Status PrintGraph() override;
36
37 IConnectableLayer* AddInputLayer(LayerBindingId id, const char* name=nullptr) override;
38
Nikhil Rajee391d52019-09-05 17:50:44 +010039 IConnectableLayer* AddArgMinMaxLayer(const ArgMinMaxDescriptor& desc,
40 const char* name = nullptr) override;
41
Éanna Ó Catháin4e1e1362018-11-12 11:36:34 +000042 IConnectableLayer* AddBatchToSpaceNdLayer(const BatchToSpaceNdDescriptor& batchToSpaceNdDescriptor,
43 const char* name = nullptr) override;
44
Aron Virginas-Tar77bfb5e2019-10-16 17:45:38 +010045 IConnectableLayer* AddComparisonLayer(const ComparisonDescriptor& comparisonDescriptor,
46 const char* name = nullptr) override;
47
Jim Flynne242f2d2019-05-22 14:24:13 +010048 IConnectableLayer* AddConcatLayer(const ConcatDescriptor& concatDescriptor,
Jim Flynn906f9462019-05-10 13:55:21 +010049 const char* name = nullptr) override;
50
telsoa014fcda012018-03-09 14:13:49 +000051 IConnectableLayer* AddConvolution2dLayer(const Convolution2dDescriptor& convolution2dDescriptor,
Aron Virginas-Tarad402702019-02-22 17:03:44 +000052 const ConstTensor& weights,
53 const Optional<ConstTensor>& biases,
54 const char* name = nullptr) override;
55
Matteo Martincighfc598e12019-05-14 10:36:13 +010056 ARMNN_DEPRECATED_MSG("This AddConvolution2dLayer overload is deprecated")
Aron Virginas-Tarad402702019-02-22 17:03:44 +000057 IConnectableLayer* AddConvolution2dLayer(const Convolution2dDescriptor& convolution2dDescriptor,
58 const ConstTensor& weights,
59 const char* name = nullptr) override;
60
Matteo Martincighfc598e12019-05-14 10:36:13 +010061 ARMNN_DEPRECATED_MSG("This AddConvolution2dLayer overload is deprecated")
Aron Virginas-Tarad402702019-02-22 17:03:44 +000062 IConnectableLayer* AddConvolution2dLayer(const Convolution2dDescriptor& convolution2dDescriptor,
63 const ConstTensor& weights,
64 const ConstTensor& biases,
65 const char* name = nullptr) override;
66
Aron Virginas-Tardd6247f2019-09-19 14:31:17 +010067 IConnectableLayer* AddDepthToSpaceLayer(const DepthToSpaceDescriptor& depthToSpaceDescriptor,
68 const char* name = nullptr) override;
69
Aron Virginas-Tarad402702019-02-22 17:03:44 +000070 IConnectableLayer* AddDepthwiseConvolution2dLayer(
71 const DepthwiseConvolution2dDescriptor& convolution2dDescriptor,
72 const ConstTensor& weights,
73 const Optional<ConstTensor>& biases,
74 const char* name = nullptr) override;
75
Matteo Martincighfc598e12019-05-14 10:36:13 +010076 ARMNN_DEPRECATED_MSG("This AddDepthwiseConvolution2dLayer overload is deprecated")
Aron Virginas-Tarad402702019-02-22 17:03:44 +000077 IConnectableLayer* AddDepthwiseConvolution2dLayer(
78 const DepthwiseConvolution2dDescriptor& convolution2dDescriptor,
telsoa014fcda012018-03-09 14:13:49 +000079 const ConstTensor& weights,
80 const char* name = nullptr) override;
81
Matteo Martincighfc598e12019-05-14 10:36:13 +010082 ARMNN_DEPRECATED_MSG("This AddDepthwiseConvolution2dLayer overload is deprecated")
Aron Virginas-Tarad402702019-02-22 17:03:44 +000083 IConnectableLayer* AddDepthwiseConvolution2dLayer(
84 const DepthwiseConvolution2dDescriptor& convolution2dDescriptor,
telsoa014fcda012018-03-09 14:13:49 +000085 const ConstTensor& weights,
86 const ConstTensor& biases,
87 const char* name = nullptr) override;
88
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +000089 IConnectableLayer* AddDequantizeLayer(const char* name = nullptr) override;
90
Narumol Prangnawarat94dd5d82019-01-23 18:06:26 +000091 IConnectableLayer* AddDetectionPostProcessLayer(
92 const DetectionPostProcessDescriptor& descriptor,
Narumol Prangnawarat6d302bf2019-02-04 11:46:26 +000093 const ConstTensor& anchors,
Narumol Prangnawarat94dd5d82019-01-23 18:06:26 +000094 const char* name = nullptr) override;
95
telsoa014fcda012018-03-09 14:13:49 +000096 IConnectableLayer* AddFullyConnectedLayer(const FullyConnectedDescriptor& fullyConnectedDescriptor,
Aron Virginas-Tarad402702019-02-22 17:03:44 +000097 const ConstTensor& weights,
98 const Optional<ConstTensor>& biases,
99 const char* name = nullptr) override;
telsoa014fcda012018-03-09 14:13:49 +0000100
Matteo Martincighfc598e12019-05-14 10:36:13 +0100101 ARMNN_DEPRECATED_MSG("This AddFullyConnectedLayer overload is deprecated")
telsoa014fcda012018-03-09 14:13:49 +0000102 IConnectableLayer* AddFullyConnectedLayer(const FullyConnectedDescriptor& fullyConnectedDescriptor,
Aron Virginas-Tarad402702019-02-22 17:03:44 +0000103 const ConstTensor& weights,
104 const char* name = nullptr) override;
105
Matteo Martincighfc598e12019-05-14 10:36:13 +0100106 ARMNN_DEPRECATED_MSG("This AddFullyConnectedLayer overload is deprecated")
Aron Virginas-Tarad402702019-02-22 17:03:44 +0000107 IConnectableLayer* AddFullyConnectedLayer(const FullyConnectedDescriptor& fullyConnectedDescriptor,
108 const ConstTensor& weights,
109 const ConstTensor& biases,
110 const char* name = nullptr) override;
telsoa014fcda012018-03-09 14:13:49 +0000111
narpra01b89b05f2019-01-16 09:53:09 +0000112 IConnectableLayer* AddGatherLayer(const char* name = nullptr) override;
113
telsoa014fcda012018-03-09 14:13:49 +0000114 IConnectableLayer* AddPermuteLayer(const PermuteDescriptor& permuteDescriptor,
115 const char* name = nullptr) override;
116
117 IConnectableLayer* AddPooling2dLayer(const Pooling2dDescriptor& pooling2dDescriptor,
118 const char* name = nullptr) override;
119
120 IConnectableLayer* AddActivationLayer(const ActivationDescriptor& activationDescriptor,
121 const char* name = nullptr) override;
122
123 IConnectableLayer* AddNormalizationLayer(const NormalizationDescriptor& normalizationDescriptor,
124 const char* name = nullptr) override;
125
Aron Virginas-Tar636ab402019-09-16 14:27:45 +0100126 IConnectableLayer* AddSliceLayer(const SliceDescriptor& sliceDescriptor, const char* name = nullptr) override;
127
telsoa014fcda012018-03-09 14:13:49 +0000128 IConnectableLayer* AddSoftmaxLayer(const SoftmaxDescriptor& softmaxDescriptor,
129 const char* name = nullptr) override;
130
131 IConnectableLayer* AddSplitterLayer(const ViewsDescriptor& splitterDescriptor,
132 const char* name = nullptr) override;
133
Jim Flynn906f9462019-05-10 13:55:21 +0100134 ARMNN_DEPRECATED_MSG("Use AddConcatLayer instead")
Jim Flynne242f2d2019-05-22 14:24:13 +0100135 IConnectableLayer* AddMergerLayer(const MergerDescriptor& mergerDescriptor,
Jim Flynn906f9462019-05-10 13:55:21 +0100136 const char* name = nullptr) override;
telsoa014fcda012018-03-09 14:13:49 +0000137
Kevin May868eb142019-09-04 17:29:31 +0100138 IConnectableLayer* AddAbsLayer(const char* name = nullptr) override;
139
telsoa014fcda012018-03-09 14:13:49 +0000140 IConnectableLayer* AddAdditionLayer(const char* name = nullptr) override;
141
142 IConnectableLayer* AddMultiplicationLayer(const char* name = nullptr) override;
143
144 IConnectableLayer* AddBatchNormalizationLayer(const BatchNormalizationDescriptor& desc,
145 const ConstTensor& mean,
146 const ConstTensor& variance,
147 const ConstTensor& beta,
148 const ConstTensor& gamma,
149 const char* name = nullptr) override;
150
Aron Virginas-Tar169d2f12019-07-01 19:01:44 +0100151 ARMNN_DEPRECATED_MSG("Use AddResizeLayer instead")
telsoa014fcda012018-03-09 14:13:49 +0000152 IConnectableLayer* AddResizeBilinearLayer(const ResizeBilinearDescriptor& resizeDesc,
153 const char* name = nullptr) override;
154
Teresa Charlina9075df2019-06-27 15:41:57 +0100155 IConnectableLayer* AddResizeLayer(const ResizeDescriptor& resizeDescriptor,
156 const char* name = nullptr) override;
157
Kevin Mayce5045a2019-10-02 14:07:47 +0100158 IConnectableLayer* AddInstanceNormalizationLayer(const InstanceNormalizationDescriptor& desc,
159 const char* name = nullptr) override;
160
Matteo Martincighbcd3c852018-09-28 14:14:12 +0100161 IConnectableLayer* AddL2NormalizationLayer(const L2NormalizationDescriptor& desc,
162 const char* name = nullptr) override;
telsoa014fcda012018-03-09 14:13:49 +0000163
Aron Virginas-Tarf982dea2019-10-11 14:07:53 +0100164 IConnectableLayer* AddLogSoftmaxLayer(const LogSoftmaxDescriptor& logSoftmaxDescriptor,
165 const char* name = nullptr) override;
166
telsoa014fcda012018-03-09 14:13:49 +0000167 IConnectableLayer* AddConstantLayer(const ConstTensor& input, const char* name = nullptr) override;
168
169 IConnectableLayer* AddReshapeLayer(const ReshapeDescriptor& reshapeDescriptor,
170 const char* name = nullptr) override;
171
Nattapat Chaimanowong207ef9a2018-11-02 10:57:25 +0000172 IConnectableLayer* AddSpaceToBatchNdLayer(const SpaceToBatchNdDescriptor& spaceToBatchNdDescriptor,
173 const char* name = nullptr) override;
174
Aron Virginas-Tar972af152019-06-11 14:14:03 +0100175 IConnectableLayer* AddSpaceToDepthLayer(const SpaceToDepthDescriptor& spaceToDepthDescriptor,
176 const char* name = nullptr) override;
177
telsoa014fcda012018-03-09 14:13:49 +0000178 IConnectableLayer* AddFloorLayer(const char* name = nullptr) override;
179
180 IConnectableLayer* AddOutputLayer(LayerBindingId id, const char* name = nullptr) override;
181
telsoa01c577f2c2018-08-31 09:22:23 +0100182 IConnectableLayer* AddLstmLayer(const LstmDescriptor& descriptor,
183 const LstmInputParams& params,
184 const char* name = nullptr) override;
185
Francis Murtaghe7a86a42018-08-29 12:42:10 +0100186 IConnectableLayer* AddDivisionLayer(const char* name = nullptr) override;
187
David Beck19526222018-09-12 16:00:08 +0100188 IConnectableLayer* AddSubtractionLayer(const char* name = nullptr) override;
189
Nattapat Chaimanowong5a4304a2018-11-28 10:44:37 +0000190 IConnectableLayer* AddMaximumLayer(const char* name = nullptr) override;
191
narpra0132b90462018-09-13 11:07:48 +0100192 IConnectableLayer* AddMeanLayer(const MeanDescriptor& meanDescriptor, const char* name = nullptr) override;
193
Mohamed Nour Abouelseoud5662c202018-09-24 13:30:09 +0100194 IConnectableLayer* AddPadLayer(const PadDescriptor& padDescriptor, const char* name = nullptr) override;
195
Derek Lambertia9cca6a2019-03-25 15:41:58 +0000196 IConnectableLayer* AddQuantizeLayer(const char* name = nullptr) override;
197
Conor Kennedy430b5d82018-11-14 15:28:28 +0000198 IConnectableLayer* AddStridedSliceLayer(const StridedSliceDescriptor& stridedSliceDescriptor,
199 const char* name = nullptr) override;
200
kevmay0190539692018-11-29 08:40:19 +0000201 IConnectableLayer* AddMinimumLayer(const char* name = nullptr) override;
202
Aron Virginas-Tar77bfb5e2019-10-16 17:45:38 +0100203 ARMNN_DEPRECATED_MSG("Use AddComparisonLayer instead")
Matteo Martincigh59a950c2018-12-13 12:48:25 +0000204 IConnectableLayer* AddGreaterLayer(const char* name = nullptr) override;
205
Aron Virginas-Tar77bfb5e2019-10-16 17:45:38 +0100206 ARMNN_DEPRECATED_MSG("Use AddComparisonLayer instead")
FrancisMurtagh20995952018-12-17 12:11:36 +0000207 IConnectableLayer* AddEqualLayer(const char* name = nullptr) override;
208
Mohamed Nour Abouelseouda1d3c6a2018-12-27 12:39:16 +0000209 IConnectableLayer* AddRsqrtLayer(const char* name = nullptr) override;
210
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +0100211 IConnectableLayer* AddMergeLayer(const char* name = nullptr) override;
212
Sadik Armaganeff363d2019-04-05 15:25:46 +0100213 IConnectableLayer* AddSwitchLayer(const char* name = nullptr) override;
214
Matteo Martincigh0e406ee2019-06-12 15:42:18 +0100215 IConnectableLayer* AddPreluLayer(const char* name = nullptr) override;
216
Aron Virginas-Tar639fb042019-06-20 14:28:19 +0100217 IConnectableLayer* AddTransposeConvolution2dLayer(const TransposeConvolution2dDescriptor& descriptor,
218 const ConstTensor& weights,
219 const Optional<ConstTensor>& biases,
220 const char* name = nullptr) override;
221
Matthew Jackson2b8c1da2019-07-04 14:59:16 +0100222 IConnectableLayer* AddStackLayer(const StackDescriptor& stackDescriptor,
223 const char* name = nullptr) override;
224
James Conroyee18dc82019-07-17 11:27:46 +0100225 IConnectableLayer* AddQuantizedLstmLayer(const QuantizedLstmInputParams& params,
226 const char* name = nullptr) override;
227
Mike Kelly8c1701a2019-02-11 17:01:27 +0000228 void Accept(ILayerVisitor& visitor) const override;
229
telsoa014fcda012018-03-09 14:13:49 +0000230private:
231 IConnectableLayer* AddFullyConnectedLayerImpl(const FullyConnectedDescriptor& fullyConnectedDescriptor,
Aron Virginas-Tarad402702019-02-22 17:03:44 +0000232 const ConstTensor& weights,
233 const Optional<ConstTensor>& biases,
234 const char* name);
telsoa014fcda012018-03-09 14:13:49 +0000235
236 IConnectableLayer* AddConvolution2dLayerImpl(const Convolution2dDescriptor& convolution2dDescriptor,
Aron Virginas-Tarad402702019-02-22 17:03:44 +0000237 const ConstTensor& weights,
238 const Optional<ConstTensor>& biases,
239 const char* name);
telsoa014fcda012018-03-09 14:13:49 +0000240
241 IConnectableLayer* AddDepthwiseConvolution2dLayerImpl(
242 const DepthwiseConvolution2dDescriptor& convolution2dDescriptor,
243 const ConstTensor& weights,
Aron Virginas-Tarad402702019-02-22 17:03:44 +0000244 const Optional<ConstTensor>& biases,
telsoa014fcda012018-03-09 14:13:49 +0000245 const char* name);
246
247 std::unique_ptr<Graph> m_Graph;
248};
249
250class OptimizedNetwork final : public IOptimizedNetwork
251{
252public:
253 OptimizedNetwork(std::unique_ptr<Graph> graph);
254 ~OptimizedNetwork();
255
256 Status PrintGraph() override;
surmeh01bceff2f2018-03-29 16:29:27 +0100257 Status SerializeToDot(std::ostream& stream) const override;
telsoa014fcda012018-03-09 14:13:49 +0000258
259 Graph& GetGraph() { return *m_Graph; }
260
261private:
262 std::unique_ptr<Graph> m_Graph;
263};
264
Derek Lamberti84da38b2019-06-13 11:40:08 +0100265
266
267struct OptimizationResult
268{
269 bool m_Warning;
270 bool m_Error;
271
272 OptimizationResult()
273 : m_Warning(false)
274 , m_Error(false)
275 {}
276};
277
278using BackendsMap = std::map<BackendId, std::unique_ptr<class IBackendInternal>>;
279
280BackendsMap CreateSupportedBackends(TensorHandleFactoryRegistry& handleFactoryRegistry,
281 struct BackendSettings& backendSettings);
282
283OptimizationResult SelectTensorHandleStrategy(Graph& optGraph,
284 BackendsMap& backends,
285 TensorHandleFactoryRegistry& registry,
286 Optional<std::vector<std::string>&> errMessages);
287
telsoa014fcda012018-03-09 14:13:49 +0000288} // namespace armnn