blob: 2d34cfc3e22f70c89a752029ce2fb7d7e8ef775d [file] [log] [blame]
Laurent Carlier749294b2020-06-01 09:03:17 +01001//
Teresa Charlin52664732020-06-29 16:27:03 +01002// Copyright © 2017 Arm Ltd and Contributors. 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>
Francis Murtagha49ff082022-01-17 17:08:01 +00008#include <armnn/INetwork.hpp>
telsoa01c577f2c2018-08-31 09:22:23 +01009#include <armnn/LstmParams.hpp>
James Conroyee18dc82019-07-17 11:27:46 +010010#include <armnn/QuantizedLstmParams.hpp>
telsoa014fcda012018-03-09 14:13:49 +000011#include <armnn/TensorFwd.hpp>
12#include <armnn/Types.hpp>
13
Francis Murtagha49ff082022-01-17 17:08:01 +000014#include <Graph.hpp>
15#include <Layer.hpp>
16#include <OptimizedNetworkImpl.hpp>
17#include <armnn/backends/SubgraphView.hpp>
telsoa014fcda012018-03-09 14:13:49 +000018
19#include <string>
20#include <vector>
Derek Lamberti84da38b2019-06-13 11:40:08 +010021#include <map>
telsoa014fcda012018-03-09 14:13:49 +000022#include <memory>
23
telsoa014fcda012018-03-09 14:13:49 +000024namespace armnn
25{
26class Graph;
27
Keith Davise4f39fd2021-06-10 16:27:30 +010028using NetworkImplPtr = std::unique_ptr<NetworkImpl, void (*)(NetworkImpl* network)>;
Francis Murtagh3d2b4b22021-02-15 18:23:17 +000029
telsoa01c577f2c2018-08-31 09:22:23 +010030/// Private implementation of INetwork.
Francis Murtagh3d2b4b22021-02-15 18:23:17 +000031class NetworkImpl
telsoa014fcda012018-03-09 14:13:49 +000032{
33public:
Francis Murtagh3d2b4b22021-02-15 18:23:17 +000034 NetworkImpl(NetworkOptions networkOptions = {});
35 ~NetworkImpl();
telsoa014fcda012018-03-09 14:13:49 +000036
Keith Davise4f39fd2021-06-10 16:27:30 +010037 const Graph& GetGraph() const
38 { return *m_Graph; }
telsoa014fcda012018-03-09 14:13:49 +000039
Francis Murtagh3d2b4b22021-02-15 18:23:17 +000040 Status PrintGraph();
telsoa014fcda012018-03-09 14:13:49 +000041
Keith Davise4f39fd2021-06-10 16:27:30 +010042 IConnectableLayer* AddInputLayer(LayerBindingId id, const char* name = nullptr);
43
Keith Davise4f39fd2021-06-10 16:27:30 +010044 IConnectableLayer* AddActivationLayer(const ActivationDescriptor& activationDescriptor,
45 const char* name = nullptr);
46
47 IConnectableLayer* AddAdditionLayer(const char* name = nullptr);
telsoa014fcda012018-03-09 14:13:49 +000048
Nikhil Rajee391d52019-09-05 17:50:44 +010049 IConnectableLayer* AddArgMinMaxLayer(const ArgMinMaxDescriptor& desc,
Francis Murtagh3d2b4b22021-02-15 18:23:17 +000050 const char* name = nullptr);
Nikhil Rajee391d52019-09-05 17:50:44 +010051
Keith Davise4f39fd2021-06-10 16:27:30 +010052 IConnectableLayer* AddBatchNormalizationLayer(const BatchNormalizationDescriptor& desc,
53 const ConstTensor& mean,
54 const ConstTensor& variance,
55 const ConstTensor& beta,
56 const ConstTensor& gamma,
57 const char* name = nullptr);
58
Éanna Ó Catháin4e1e1362018-11-12 11:36:34 +000059 IConnectableLayer* AddBatchToSpaceNdLayer(const BatchToSpaceNdDescriptor& batchToSpaceNdDescriptor,
Francis Murtagh3d2b4b22021-02-15 18:23:17 +000060 const char* name = nullptr);
Éanna Ó Catháin4e1e1362018-11-12 11:36:34 +000061
mathad01b392e982021-04-07 12:07:30 +010062 IConnectableLayer* AddCastLayer(const char* name = nullptr);
63
Simon Obute51f67772021-09-03 15:50:13 +010064 IConnectableLayer* AddChannelShuffleLayer(const ChannelShuffleDescriptor& channelShuffleDescriptor,
65 const char* name = nullptr);
66
Aron Virginas-Tar77bfb5e2019-10-16 17:45:38 +010067 IConnectableLayer* AddComparisonLayer(const ComparisonDescriptor& comparisonDescriptor,
Francis Murtagh3d2b4b22021-02-15 18:23:17 +000068 const char* name = nullptr);
Aron Virginas-Tar77bfb5e2019-10-16 17:45:38 +010069
Jim Flynne242f2d2019-05-22 14:24:13 +010070 IConnectableLayer* AddConcatLayer(const ConcatDescriptor& concatDescriptor,
Francis Murtagh3d2b4b22021-02-15 18:23:17 +000071 const char* name = nullptr);
Jim Flynn906f9462019-05-10 13:55:21 +010072
telsoa014fcda012018-03-09 14:13:49 +000073 IConnectableLayer* AddConvolution2dLayer(const Convolution2dDescriptor& convolution2dDescriptor,
Keith Davisb4dd5cc2022-04-07 11:32:00 +010074 const char* name = nullptr);
75
76 ARMNN_DEPRECATED_MSG_REMOVAL_DATE("This AddConvolution2dLayer overload is deprecated", "22.11")
77 IConnectableLayer* AddConvolution2dLayer(const Convolution2dDescriptor& convolution2dDescriptor,
Aron Virginas-Tarad402702019-02-22 17:03:44 +000078 const ConstTensor& weights,
79 const Optional<ConstTensor>& biases,
Francis Murtagh3d2b4b22021-02-15 18:23:17 +000080 const char* name = nullptr);
Aron Virginas-Tarad402702019-02-22 17:03:44 +000081
Francis Murtaghfaf29662022-01-24 17:45:37 +000082 ARMNN_DEPRECATED_MSG_REMOVAL_DATE("This AddConvolution2dLayer overload is deprecated", "22.11")
Aron Virginas-Tarad402702019-02-22 17:03:44 +000083 IConnectableLayer* AddConvolution2dLayer(const Convolution2dDescriptor& convolution2dDescriptor,
84 const ConstTensor& weights,
Francis Murtagh3d2b4b22021-02-15 18:23:17 +000085 const char* name = nullptr);
Aron Virginas-Tarad402702019-02-22 17:03:44 +000086
Francis Murtaghfaf29662022-01-24 17:45:37 +000087 ARMNN_DEPRECATED_MSG_REMOVAL_DATE("This AddConvolution2dLayer overload is deprecated", "22.11")
Aron Virginas-Tarad402702019-02-22 17:03:44 +000088 IConnectableLayer* AddConvolution2dLayer(const Convolution2dDescriptor& convolution2dDescriptor,
89 const ConstTensor& weights,
90 const ConstTensor& biases,
Francis Murtagh3d2b4b22021-02-15 18:23:17 +000091 const char* name = nullptr);
Aron Virginas-Tarad402702019-02-22 17:03:44 +000092
Matthew Sloyanb63a3112021-09-08 13:05:51 +010093 IConnectableLayer* AddConvolution3dLayer(const Convolution3dDescriptor& convolution3dDescriptor,
Matthew Sloyanb63a3112021-09-08 13:05:51 +010094 const char* name = nullptr);
95
Keith Davise4f39fd2021-06-10 16:27:30 +010096 IConnectableLayer* AddConstantLayer(const ConstTensor& input, const char* name = nullptr);
97
Aron Virginas-Tardd6247f2019-09-19 14:31:17 +010098 IConnectableLayer* AddDepthToSpaceLayer(const DepthToSpaceDescriptor& depthToSpaceDescriptor,
Francis Murtagh3d2b4b22021-02-15 18:23:17 +000099 const char* name = nullptr);
Aron Virginas-Tardd6247f2019-09-19 14:31:17 +0100100
Aron Virginas-Tarad402702019-02-22 17:03:44 +0000101 IConnectableLayer* AddDepthwiseConvolution2dLayer(
102 const DepthwiseConvolution2dDescriptor& convolution2dDescriptor,
Cathal Corbett06902652022-04-14 17:55:11 +0100103 const char* name = nullptr);
104
105 ARMNN_DEPRECATED_MSG("This AddDepthwiseConvolution2dLayer overload is deprecated")
106 IConnectableLayer* AddDepthwiseConvolution2dLayer(
107 const DepthwiseConvolution2dDescriptor& convolution2dDescriptor,
Aron Virginas-Tarad402702019-02-22 17:03:44 +0000108 const ConstTensor& weights,
109 const Optional<ConstTensor>& biases,
Francis Murtagh3d2b4b22021-02-15 18:23:17 +0000110 const char* name = nullptr);
Aron Virginas-Tarad402702019-02-22 17:03:44 +0000111
Francis Murtagh3d2b4b22021-02-15 18:23:17 +0000112 IConnectableLayer* AddDequantizeLayer(const char* name = nullptr);
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +0000113
Narumol Prangnawarat94dd5d82019-01-23 18:06:26 +0000114 IConnectableLayer* AddDetectionPostProcessLayer(
115 const DetectionPostProcessDescriptor& descriptor,
Narumol Prangnawarat6d302bf2019-02-04 11:46:26 +0000116 const ConstTensor& anchors,
Francis Murtagh3d2b4b22021-02-15 18:23:17 +0000117 const char* name = nullptr);
Narumol Prangnawarat94dd5d82019-01-23 18:06:26 +0000118
Keith Davise4f39fd2021-06-10 16:27:30 +0100119 IConnectableLayer* AddDivisionLayer(const char* name = nullptr);
120
josh minor4a3c6102020-01-06 16:40:46 -0600121 IConnectableLayer* AddElementwiseUnaryLayer(const ElementwiseUnaryDescriptor& elementwiseUnaryDescriptor,
Francis Murtagh3d2b4b22021-02-15 18:23:17 +0000122 const char* name = nullptr);
josh minor4a3c6102020-01-06 16:40:46 -0600123
Keith Davise4f39fd2021-06-10 16:27:30 +0100124 IConnectableLayer* AddMergeLayer(const char* name = nullptr);
125
Ryan OSheaec6c6802020-06-05 17:17:06 +0100126 IConnectableLayer* AddFillLayer(const FillDescriptor& fillDescriptor,
Francis Murtagh3d2b4b22021-02-15 18:23:17 +0000127 const char* name = nullptr);
Ryan OSheaec6c6802020-06-05 17:17:06 +0100128
Keith Davise4f39fd2021-06-10 16:27:30 +0100129 IConnectableLayer* AddFloorLayer(const char* name = nullptr);
130
telsoa014fcda012018-03-09 14:13:49 +0000131 IConnectableLayer* AddFullyConnectedLayer(const FullyConnectedDescriptor& fullyConnectedDescriptor,
Matthew Sloyan81beae32021-07-13 19:46:11 +0100132 const char* name = nullptr);
133
134 IConnectableLayer* AddFullyConnectedLayer(const FullyConnectedDescriptor& fullyConnectedDescriptor,
Sadik Armaganf0a6dec2021-03-25 07:46:55 +0000135 const Optional<ConstTensor>& weights,
136 const Optional<ConstTensor>& biases,
137 const char* name = nullptr);
138
Teresa Charlin52664732020-06-29 16:27:03 +0100139 IConnectableLayer* AddGatherLayer(const GatherDescriptor& gatherDescriptor,
Francis Murtagh3d2b4b22021-02-15 18:23:17 +0000140 const char* name = nullptr);
Teresa Charlin52664732020-06-29 16:27:03 +0100141
Teresa Charlinb2d3ec52022-04-12 22:07:09 +0100142 IConnectableLayer* AddGatherNdLayer(const char* name = nullptr);
143
Kevin Mayce5045a2019-10-02 14:07:47 +0100144 IConnectableLayer* AddInstanceNormalizationLayer(const InstanceNormalizationDescriptor& desc,
Francis Murtagh3d2b4b22021-02-15 18:23:17 +0000145 const char* name = nullptr);
Kevin Mayce5045a2019-10-02 14:07:47 +0100146
Matteo Martincighbcd3c852018-09-28 14:14:12 +0100147 IConnectableLayer* AddL2NormalizationLayer(const L2NormalizationDescriptor& desc,
Francis Murtagh3d2b4b22021-02-15 18:23:17 +0000148 const char* name = nullptr);
telsoa014fcda012018-03-09 14:13:49 +0000149
Aron Virginas-Tarf982dea2019-10-11 14:07:53 +0100150 IConnectableLayer* AddLogSoftmaxLayer(const LogSoftmaxDescriptor& logSoftmaxDescriptor,
Francis Murtagh3d2b4b22021-02-15 18:23:17 +0000151 const char* name = nullptr);
Aron Virginas-Tarf982dea2019-10-11 14:07:53 +0100152
Keith Davise4f39fd2021-06-10 16:27:30 +0100153 IConnectableLayer* AddLogicalBinaryLayer(const LogicalBinaryDescriptor& logicalBinaryDescriptor,
154 const char* name = nullptr);
155
156 IConnectableLayer* AddLstmLayer(const LstmDescriptor& descriptor,
157 const LstmInputParams& params,
158 const char* name = nullptr);
159
160 IConnectableLayer* AddMaximumLayer(const char* name = nullptr);
161
162 IConnectableLayer* AddMeanLayer(const MeanDescriptor& meanDescriptor, const char* name = nullptr);
163
164 IConnectableLayer* AddMinimumLayer(const char* name = nullptr);
165
Keith Davise4f39fd2021-06-10 16:27:30 +0100166 IConnectableLayer* AddMultiplicationLayer(const char* name = nullptr);
167
168 IConnectableLayer* AddNormalizationLayer(const NormalizationDescriptor& normalizationDescriptor,
169 const char* name = nullptr);
170
171 IConnectableLayer* AddOutputLayer(LayerBindingId id, const char* name = nullptr);
172
173 IConnectableLayer* AddPadLayer(const PadDescriptor& padDescriptor, const char* name = nullptr);
174
175 IConnectableLayer* AddPermuteLayer(const PermuteDescriptor& permuteDescriptor,
176 const char* name = nullptr);
177
178 IConnectableLayer* AddPooling2dLayer(const Pooling2dDescriptor& pooling2dDescriptor,
179 const char* name = nullptr);
180
Tamás Nyíri7b885b32021-10-26 14:47:57 +0100181 IConnectableLayer* AddPooling3dLayer(const Pooling3dDescriptor& pooling3dDescriptor,
182 const char* name = nullptr);
183
Cathal Corbett18655b82021-12-13 13:03:22 +0000184 IConnectableLayer* AddPrecompiledLayer(const PreCompiledDescriptor& preCompiledDescriptor,
Cathal Corbett3ea01072022-01-06 10:29:43 +0000185 CompiledBlobPtr compiledBlobPtr,
Cathal Corbettcbfd7182021-12-15 17:12:59 +0000186 const Optional<BackendId>& backend,
187 const char* name = nullptr);
Cathal Corbett18655b82021-12-13 13:03:22 +0000188
Keith Davise4f39fd2021-06-10 16:27:30 +0100189 IConnectableLayer* AddPreluLayer(const char* name = nullptr);
190
191 IConnectableLayer* AddQuantizeLayer(const char* name = nullptr);
192
193 IConnectableLayer* AddQLstmLayer(const QLstmDescriptor& descriptor,
194 const LstmInputParams& params,
195 const char* name = nullptr);
196
197 IConnectableLayer* AddQuantizedLstmLayer(const QuantizedLstmInputParams& params,
198 const char* name = nullptr);
199
200 IConnectableLayer* AddRankLayer(const char* name = nullptr);
201
202 IConnectableLayer* AddReduceLayer(const ReduceDescriptor& reduceDescriptor,
203 const char* name = nullptr);
204
Keith Davise4f39fd2021-06-10 16:27:30 +0100205 IConnectableLayer* AddResizeLayer(const ResizeDescriptor& resizeDescriptor,
206 const char* name = nullptr);
telsoa014fcda012018-03-09 14:13:49 +0000207
208 IConnectableLayer* AddReshapeLayer(const ReshapeDescriptor& reshapeDescriptor,
Francis Murtagh3d2b4b22021-02-15 18:23:17 +0000209 const char* name = nullptr);
telsoa014fcda012018-03-09 14:13:49 +0000210
Keith Davise4f39fd2021-06-10 16:27:30 +0100211 IConnectableLayer* AddShapeLayer(const char* name = nullptr);
212
213 IConnectableLayer* AddSliceLayer(const SliceDescriptor& sliceDescriptor, const char* name = nullptr);
214
215 IConnectableLayer* AddSoftmaxLayer(const SoftmaxDescriptor& softmaxDescriptor,
216 const char* name = nullptr);
217
218 IConnectableLayer* AddSplitterLayer(const ViewsDescriptor& splitterDescriptor,
219 const char* name = nullptr);
220
Nattapat Chaimanowong207ef9a2018-11-02 10:57:25 +0000221 IConnectableLayer* AddSpaceToBatchNdLayer(const SpaceToBatchNdDescriptor& spaceToBatchNdDescriptor,
Francis Murtagh3d2b4b22021-02-15 18:23:17 +0000222 const char* name = nullptr);
Nattapat Chaimanowong207ef9a2018-11-02 10:57:25 +0000223
Aron Virginas-Tar972af152019-06-11 14:14:03 +0100224 IConnectableLayer* AddSpaceToDepthLayer(const SpaceToDepthDescriptor& spaceToDepthDescriptor,
Francis Murtagh3d2b4b22021-02-15 18:23:17 +0000225 const char* name = nullptr);
Aron Virginas-Tar972af152019-06-11 14:14:03 +0100226
Keith Davise4f39fd2021-06-10 16:27:30 +0100227 IConnectableLayer* AddStackLayer(const StackDescriptor& stackDescriptor,
228 const char* name = nullptr);
telsoa014fcda012018-03-09 14:13:49 +0000229
Keith Davise4f39fd2021-06-10 16:27:30 +0100230 IConnectableLayer* AddStandInLayer(const StandInDescriptor& descriptor,
231 const char* name = nullptr);
Derek Lambertia9cca6a2019-03-25 15:41:58 +0000232
Conor Kennedy430b5d82018-11-14 15:28:28 +0000233 IConnectableLayer* AddStridedSliceLayer(const StridedSliceDescriptor& stridedSliceDescriptor,
Francis Murtagh3d2b4b22021-02-15 18:23:17 +0000234 const char* name = nullptr);
Conor Kennedy430b5d82018-11-14 15:28:28 +0000235
Keith Davise4f39fd2021-06-10 16:27:30 +0100236 IConnectableLayer* AddSubtractionLayer(const char* name = nullptr);
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +0100237
Francis Murtagh3d2b4b22021-02-15 18:23:17 +0000238 IConnectableLayer* AddSwitchLayer(const char* name = nullptr);
Sadik Armaganeff363d2019-04-05 15:25:46 +0100239
Aron Virginas-Tar639fb042019-06-20 14:28:19 +0100240 IConnectableLayer* AddTransposeConvolution2dLayer(const TransposeConvolution2dDescriptor& descriptor,
241 const ConstTensor& weights,
242 const Optional<ConstTensor>& biases,
Francis Murtagh3d2b4b22021-02-15 18:23:17 +0000243 const char* name = nullptr);
Aron Virginas-Tar639fb042019-06-20 14:28:19 +0100244
Mike Kellyc9ea45a2020-02-28 18:11:58 +0000245 IConnectableLayer* AddTransposeLayer(const TransposeDescriptor& transposeDescriptor,
Francis Murtagh3d2b4b22021-02-15 18:23:17 +0000246 const char* name = nullptr);
Mike Kellyc9ea45a2020-02-28 18:11:58 +0000247
Narumol Prangnawarat8ed39ae2021-07-15 16:16:25 +0100248 IConnectableLayer* AddUnidirectionalSequenceLstmLayer(const UnidirectionalSequenceLstmDescriptor& descriptor,
249 const LstmInputParams& params,
250 const char* name = nullptr);
251
Cathal Corbetta3f4fba2022-03-21 09:27:08 +0000252 IConnectableLayer* AddConvertFp16ToFp32Layer(const char* name = nullptr);
253
254 IConnectableLayer* AddConvertFp32ToFp16Layer(const char* name = nullptr);
255
Jan Eilers1b2654f2021-09-24 15:45:46 +0100256 ARMNN_NO_DEPRECATE_WARN_BEGIN
Francis Murtagh3d2b4b22021-02-15 18:23:17 +0000257 void Accept(ILayerVisitor& visitor) const;
Jan Eilers1b2654f2021-09-24 15:45:46 +0100258 ARMNN_NO_DEPRECATE_WARN_END
Mike Kelly8c1701a2019-02-11 17:01:27 +0000259
Francis Murtagh3d2b4b22021-02-15 18:23:17 +0000260 void ExecuteStrategy(IStrategy& strategy) const;
Finn Williamsb454c5c2021-02-09 15:56:23 +0000261
telsoa014fcda012018-03-09 14:13:49 +0000262private:
telsoa014fcda012018-03-09 14:13:49 +0000263
Finn Williamsf24effa2020-07-03 10:12:03 +0100264 bool GetShapeInferenceMethod();
Mike Kelly80512b02022-05-16 23:10:42 +0100265 bool GetAllowExpandedDims();
Finn Williamsf24effa2020-07-03 10:12:03 +0100266 NetworkOptions m_NetworkOptions;
267
telsoa014fcda012018-03-09 14:13:49 +0000268 std::unique_ptr<Graph> m_Graph;
Keith Davise4f39fd2021-06-10 16:27:30 +0100269 ModelOptions m_ModelOptions;
telsoa014fcda012018-03-09 14:13:49 +0000270};
271
Derek Lamberti84da38b2019-06-13 11:40:08 +0100272struct OptimizationResult
273{
274 bool m_Warning;
275 bool m_Error;
276
Derek Lamberti4a9e24b2020-01-03 16:53:38 +0000277 OptimizationResult(bool warning, bool error)
Keith Davise4f39fd2021-06-10 16:27:30 +0100278 : m_Warning(warning), m_Error(error)
Derek Lamberti84da38b2019-06-13 11:40:08 +0100279 {}
Derek Lamberti4a9e24b2020-01-03 16:53:38 +0000280
281 OptimizationResult()
282 : OptimizationResult(false, false)
283 {}
284
Keith Davise4f39fd2021-06-10 16:27:30 +0100285 bool IsOk() const
286 { return !m_Warning && !m_Error; }
287 bool IsWarningOnly() const
288 { return m_Warning && !m_Error; }
289 bool IsError() const
290 { return m_Error; }
Derek Lamberti4a9e24b2020-01-03 16:53:38 +0000291
Derek Lamberti84da38b2019-06-13 11:40:08 +0100292};
293
294using BackendsMap = std::map<BackendId, std::unique_ptr<class IBackendInternal>>;
295
296BackendsMap CreateSupportedBackends(TensorHandleFactoryRegistry& handleFactoryRegistry,
297 struct BackendSettings& backendSettings);
298
299OptimizationResult SelectTensorHandleStrategy(Graph& optGraph,
300 BackendsMap& backends,
301 TensorHandleFactoryRegistry& registry,
Narumol Prangnawarata2493a02020-08-19 14:39:07 +0100302 bool importEnabled,
Colm Donelan03bf98a2022-05-30 15:20:36 +0100303 bool exportEnabled,
Derek Lamberti84da38b2019-06-13 11:40:08 +0100304 Optional<std::vector<std::string>&> errMessages);
305
Francis Murtagh3d2b4b22021-02-15 18:23:17 +0000306OptimizationResult AssignBackends(OptimizedNetworkImpl* optNetObjPtr,
Derek Lamberti4a9e24b2020-01-03 16:53:38 +0000307 BackendSettings& backendSettings,
308 Graph::Iterator& firstLayer,
309 Graph::Iterator& lastLayer,
310 Optional<std::vector<std::string>&> errMessages);
311
Francis Murtagh56ccf682021-12-13 18:48:12 +0000312
313OptimizationResult AssignBackends(OptimizedNetworkImpl* optNetObjPtr,
314 BackendSettings& backendSettings,
315 SubgraphView::IConnectableLayerIterator& firstLayer,
316 SubgraphView::IConnectableLayerIterator& lastLayer,
317 Optional<std::vector<std::string>&> errMessages);
318
telsoa014fcda012018-03-09 14:13:49 +0000319} // namespace armnn