ArmNN
 23.05
Network.cpp
Go to the documentation of this file.
1 //
2 // Copyright © 2017-2023 Arm Ltd and Contributors. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5 
6 #include "Network.hpp"
7 #include "Graph.hpp"
8 #include "Layer.hpp"
9 #include "DeviceSpec.hpp"
10 #include "Optimizer.hpp"
11 #include "SubgraphViewSelector.hpp"
12 #include "BackendSettings.hpp"
13 #include "optimizations/All.hpp"
15 #include "armnn/utility/Timer.hpp"
16 
21 
22 #include <armnn/Exceptions.hpp>
23 #include <armnn/TypesUtils.hpp>
25 #include <armnn/Logging.hpp>
26 #include <armnn/utility/Assert.hpp>
29 
30 #include <client/include/IProfilingService.hpp>
31 
32 #include <common/include/ProfilingGuid.hpp>
33 
34 #include <fmt/format.h>
35 
36 #include <fcntl.h>
37 #include <algorithm>
38 #include <memory>
39 #include <vector>
40 
41 namespace armnn
42 {
43 
44 INetwork::INetwork(NetworkOptions networkOptions) : pNetworkImpl(new NetworkImpl(networkOptions)) {}
45 
46 INetwork::~INetwork() = default;
47 
49  : p_OptimizerOptionsImpl(std::make_unique<OptimizerOptionsOpaqueImpl>())
50 {
51 }
52 
54  : p_OptimizerOptionsImpl(std::make_unique<OptimizerOptionsOpaqueImpl>(*other.p_OptimizerOptionsImpl))
55 {
56 }
57 
59 
60 OptimizerOptionsOpaque::OptimizerOptionsOpaque(bool reduceFp32ToFp16, bool debug, bool reduceFp32ToBf16,
61  bool importEnabled, ModelOptions modelOptions, bool exportEnabled,
62  bool debugToFile)
63  : p_OptimizerOptionsImpl(std::make_unique<OptimizerOptionsOpaqueImpl>(reduceFp32ToFp16, debug, reduceFp32ToBf16,
64  importEnabled, modelOptions,
65  exportEnabled, debugToFile))
66 {
67 }
68 
69 OptimizerOptionsOpaque::OptimizerOptionsOpaque(bool reduceFp32ToFp16, bool debug, bool reduceFp32ToBf16,
70  ShapeInferenceMethod shapeInferenceMethod,
71  bool importEnabled, ModelOptions modelOptions, bool exportEnabled,
72  bool debugToFile, bool allowExpandedDims)
73  : p_OptimizerOptionsImpl(std::make_unique<OptimizerOptionsOpaqueImpl>(reduceFp32ToFp16, debug, reduceFp32ToBf16,
74  shapeInferenceMethod, importEnabled,
75  modelOptions, exportEnabled,
76  debugToFile, allowExpandedDims))
77 {
78 }
79 
81  : p_OptimizerOptionsImpl(std::make_unique<OptimizerOptionsOpaqueImpl>())
82 {
83  p_OptimizerOptionsImpl->m_ImportEnabled = OptimizerStruct.m_ImportEnabled;
84  p_OptimizerOptionsImpl->m_shapeInferenceMethod = OptimizerStruct.m_shapeInferenceMethod;
85  p_OptimizerOptionsImpl->m_ModelOptions = OptimizerStruct.m_ModelOptions;
86  p_OptimizerOptionsImpl->m_ProfilingEnabled = OptimizerStruct.m_ProfilingEnabled;
87  p_OptimizerOptionsImpl->m_DebugToFile = OptimizerStruct.m_DebugToFile;
88  p_OptimizerOptionsImpl->m_Debug = OptimizerStruct.m_Debug;
89  p_OptimizerOptionsImpl->m_ReduceFp32ToFp16 = OptimizerStruct.m_ReduceFp32ToFp16;
90  p_OptimizerOptionsImpl->m_ExportEnabled = OptimizerStruct.m_ExportEnabled;
91  p_OptimizerOptionsImpl->m_AllowExpandedDims = OptimizerStruct.m_AllowExpandedDims;
92  p_OptimizerOptionsImpl->m_ReduceFp32ToBf16 = OptimizerStruct.m_ReduceFp32ToBf16;
93 }
94 
96 {
97  p_OptimizerOptionsImpl->m_ImportEnabled = other.GetImportEnabled();
98  p_OptimizerOptionsImpl->m_shapeInferenceMethod = other.GetShapeInferenceMethod();
99  p_OptimizerOptionsImpl->m_ModelOptions = other.GetModelOptions();
100  p_OptimizerOptionsImpl->m_ProfilingEnabled = other.GetProfilingEnabled();
101  p_OptimizerOptionsImpl->m_DebugToFile = other.GetDebugToFileEnabled();
102  p_OptimizerOptionsImpl->m_Debug = other.GetDebugEnabled();
103  p_OptimizerOptionsImpl->m_ReduceFp32ToFp16 = other.GetReduceFp32ToFp16();
104  p_OptimizerOptionsImpl->m_ExportEnabled = other.GetExportEnabled();
105  p_OptimizerOptionsImpl->m_AllowExpandedDims = other.GetAllowExpandedDims();
106  p_OptimizerOptionsImpl->m_ReduceFp32ToBf16 = other.GetReduceFp32ToBf16();
107  return *this;
108 }
109 
111 {
112  p_OptimizerOptionsImpl->m_ImportEnabled = ImportState;
113 }
114 
116 {
117  p_OptimizerOptionsImpl->m_ExportEnabled = ExportState;
118 }
119 
121 {
122  p_OptimizerOptionsImpl->m_ProfilingEnabled = ProfilingState;
123 }
124 
126 {
127  p_OptimizerOptionsImpl->m_Debug = DebugState;
128 }
129 
131 {
132  p_OptimizerOptionsImpl->m_DebugToFile = DebugFileState;
133 }
134 
135 void OptimizerOptionsOpaque::SetReduceFp32ToFp16(bool ReduceFp32ToFp16State)
136 {
137  p_OptimizerOptionsImpl->m_ReduceFp32ToFp16 = ReduceFp32ToFp16State;
138 }
139 
141 {
142  p_OptimizerOptionsImpl->m_shapeInferenceMethod = ShapeInferenceMethodType;
143 }
144 
145 void OptimizerOptionsOpaque::SetAllowExpandedDims(bool ExpandedDimsAllowed)
146 {
147  p_OptimizerOptionsImpl->m_AllowExpandedDims = ExpandedDimsAllowed;
148 }
149 
151 {
152  p_OptimizerOptionsImpl->m_ModelOptions.push_back(NewModelOption);
153 }
154 
156 {
157  return p_OptimizerOptionsImpl->m_ProfilingEnabled;
158 };
159 
161 {
162  return p_OptimizerOptionsImpl->m_ImportEnabled;
163 };
164 
166 {
167  return p_OptimizerOptionsImpl->m_ExportEnabled;
168 };
169 
171 {
172  return p_OptimizerOptionsImpl->m_ReduceFp32ToFp16;
173 };
174 
176 {
177  return p_OptimizerOptionsImpl->m_ReduceFp32ToBf16;
178 }
179 
181 {
182  return p_OptimizerOptionsImpl->m_Debug;
183 }
184 
186 {
187  return p_OptimizerOptionsImpl->m_DebugToFile;
188 }
189 
191 {
192  return p_OptimizerOptionsImpl->m_AllowExpandedDims;
193 }
194 
196 {
197  return p_OptimizerOptionsImpl->m_ModelOptions;
198 }
199 
201 {
202  return p_OptimizerOptionsImpl->m_shapeInferenceMethod;
203 }
204 
205 const std::string OptimizerOptionsOpaque::ToString() const
206 {
207  std::stringstream stream;
208  stream << "OptimizerOptions: \n";
209  stream << "\tReduceFp32ToFp16: " << p_OptimizerOptionsImpl->m_ReduceFp32ToFp16 << "\n";
210  stream << "\tReduceFp32ToBf16: " << p_OptimizerOptionsImpl->m_ReduceFp32ToBf16 << "\n";
211  stream << "\tDebug: " << p_OptimizerOptionsImpl->m_Debug << "\n";
212  stream << "\tDebug to file: " << p_OptimizerOptionsImpl->m_DebugToFile << "\n";
213  stream << "\tShapeInferenceMethod: " <<
214  (p_OptimizerOptionsImpl->m_shapeInferenceMethod == ShapeInferenceMethod::ValidateOnly ?
215  "ValidateOnly" : "InferAndValidate") << "\n";
216  stream << "\tImportEnabled: " << p_OptimizerOptionsImpl->m_ImportEnabled << "\n";
217  stream << "\tExportEnabled: " << p_OptimizerOptionsImpl->m_ExportEnabled << "\n";
218  stream << "\tProfilingEnabled: " << p_OptimizerOptionsImpl->m_ProfilingEnabled << "\n";
219  stream << "\tAllowExpandedDims: " << p_OptimizerOptionsImpl->m_AllowExpandedDims << "\n";
220 
221  stream << "\tModelOptions: \n";
222  for (auto optionsGroup : p_OptimizerOptionsImpl->m_ModelOptions)
223  {
224  for (size_t i=0; i < optionsGroup.GetOptionCount(); i++)
225  {
226  const armnn::BackendOptions::BackendOption option = optionsGroup.GetOption(i);
227  stream << "\t\tBackend: " << optionsGroup.GetBackendId() << "\n"
228  << "\t\t\tOption: " << option.GetName() << "\n"
229  << "\t\t\tValue: " << std::string(option.GetValue().ToString()) << "\n";
230  }
231  }
232 
233  return stream.str();
234 }
235 
237 {
238  return pNetworkImpl->PrintGraph();
239 }
240 
242 {
243  return pNetworkImpl->AddInputLayer(id, name);
244 }
245 
247  const char* name)
248 {
249  return pNetworkImpl->AddArgMinMaxLayer(desc, name);
250 }
251 
253 {
254  return pNetworkImpl->AddCastLayer(name);
255 }
256 
258  const char* name)
259 {
260  return pNetworkImpl->AddComparisonLayer(comparisonDescriptor, name);
261 }
262 
263 
265  const char* name)
266 {
267  return pNetworkImpl->AddConcatLayer(concatDescriptor, name);
268 }
269 
270 
272  const char* name)
273 {
274  return pNetworkImpl->AddConvolution2dLayer(convolution2dDescriptor, name);
275 }
276 
278  const char* name)
279 {
280  return pNetworkImpl->AddConvolution3dLayer(convolution3dDescriptor, name);
281 }
282 
283 
285  const char* name)
286 {
287  return pNetworkImpl->AddDepthToSpaceLayer(depthToSpaceDescriptor, name);
288 }
289 
290 
292  const DepthwiseConvolution2dDescriptor& convolution2dDescriptor,
293  const char* name)
294 {
295  return pNetworkImpl->AddDepthwiseConvolution2dLayer(convolution2dDescriptor, name);
296 }
297 
298 
300 {
301  return pNetworkImpl->AddDequantizeLayer(name);
302 }
303 
304 
306  const DetectionPostProcessDescriptor& descriptor,
307  const ConstTensor& anchors,
308  const char* name)
309 {
310  return pNetworkImpl->AddDetectionPostProcessLayer(descriptor, anchors, name);
311 }
312 
314  const char* name)
315 {
316  return pNetworkImpl->AddElementwiseBinaryLayer(elementwiseBinaryDescriptor, name);
317 }
318 
320  const char* name)
321 {
322  return pNetworkImpl->AddElementwiseUnaryLayer(elementwiseUnaryDescriptor, name);
323 }
324 
326  const char* name)
327 {
328  return pNetworkImpl->AddFillLayer(fillDescriptor, name);
329 }
330 
332  const char* name)
333 {
334  return pNetworkImpl->AddFullyConnectedLayer(fullyConnectedDescriptor, name);
335 }
336 
338  const char* name)
339 {
340  return pNetworkImpl->AddPermuteLayer(permuteDescriptor, name);
341 }
342 
344  const char* name)
345 {
346  return pNetworkImpl->AddBatchToSpaceNdLayer(batchToSpaceNdDescriptor, name);
347 }
348 
350  const char* name)
351 {
352  return pNetworkImpl->AddPooling2dLayer(pooling2dDescriptor, name);
353 }
354 
356  const char* name)
357 {
358  return pNetworkImpl->AddPooling3dLayer(pooling3dDescriptor, name);
359 }
360 
362  CompiledBlobPtr compiledBlobPtr,
363  const Optional<BackendId>& backend,
364  const char* name)
365 {
366  return pNetworkImpl->AddPrecompiledLayer(preCompiledDescriptor, std::move(compiledBlobPtr), backend, name);
367 }
368 
370  const char* name)
371 {
372  return pNetworkImpl->AddActivationLayer(activationDescriptor, name);
373 }
374 
376  const char* name)
377 {
378  return pNetworkImpl->AddNormalizationLayer(normalizationDescriptor, name);
379 }
380 
381 IConnectableLayer* INetwork::AddSliceLayer(const SliceDescriptor& sliceDescriptor, const char* name)
382 {
383  return pNetworkImpl->AddSliceLayer(sliceDescriptor, name);
384 }
386  const char* name)
387 {
388  return pNetworkImpl->AddSoftmaxLayer(softmaxDescriptor, name);
389 }
390 
392  const char* name)
393 {
394  return pNetworkImpl->AddSplitterLayer(splitterDescriptor, name);
395 }
396 
398 {
399  return pNetworkImpl->AddMergeLayer(name);
400 }
401 
403 {
405  return pNetworkImpl->AddAdditionLayer(name);
407 }
408 
410 {
412  return pNetworkImpl->AddMultiplicationLayer(name);
414 }
415 
417  const ConstTensor& mean,
418  const ConstTensor& variance,
419  const ConstTensor& beta,
420  const ConstTensor& gamma,
421  const char* name)
422 {
423  return pNetworkImpl->AddBatchNormalizationLayer(desc, mean, variance, beta, gamma, name);
424 }
425 
427 {
428  return pNetworkImpl->AddRankLayer(name);
429 }
430 
432  const char* name)
433 {
434  return pNetworkImpl->AddResizeLayer(resizeDescriptor, name);
435 }
436 
438  const char* name)
439 {
440  return pNetworkImpl->AddReduceLayer(reduceDescriptor, name);
441 }
442 
444  const char* name)
445 {
446  return pNetworkImpl->AddInstanceNormalizationLayer(desc, name);
447 }
448 
450  const char* name)
451 {
452  return pNetworkImpl->AddL2NormalizationLayer(desc, name);
453 }
454 
456  const char* name)
457 {
458  return pNetworkImpl->AddLogSoftmaxLayer(logSoftmaxDescriptor, name);
459 }
460 
462  const char* name)
463 {
464  return pNetworkImpl->AddConstantLayer(input, name);
465 }
466 
468  const char* name)
469 {
470  return pNetworkImpl->AddReshapeLayer(reshapeDescriptor, name);
471 }
472 
474  const char* name)
475 {
476  return pNetworkImpl->AddSpaceToBatchNdLayer(spaceToBatchNdDescriptor, name);
477 }
478 
480  const char* name)
481 {
482  return pNetworkImpl->AddSpaceToDepthLayer(spaceToDepthDescriptor, name);
483 }
484 
486 {
487  return pNetworkImpl->AddFloorLayer(name);
488 }
490 {
491  return pNetworkImpl->AddOutputLayer(id, name);
492 }
493 
495  const LstmInputParams& params,
496  const char* name)
497 {
498  return pNetworkImpl->AddLstmLayer(descriptor, params, name);
499 }
500 
502 {
504  return pNetworkImpl->AddDivisionLayer(name);
506 }
507 
509 {
511  return pNetworkImpl->AddSubtractionLayer(name);
513 }
514 
516 {
518  return pNetworkImpl->AddMaximumLayer(name);
520 }
521 
522 IConnectableLayer* INetwork::AddMeanLayer(const MeanDescriptor& meanDescriptor, const char* name)
523 {
524  return pNetworkImpl->AddMeanLayer(meanDescriptor, name);
525 }
526 
528  const char* name)
529 {
530  return pNetworkImpl->AddPadLayer(padDescriptor, name);
531 }
532 
534 {
535  return pNetworkImpl->AddQuantizeLayer(name);
536 }
537 
539  const char* name)
540 {
541  return pNetworkImpl->AddStridedSliceLayer(stridedSliceDescriptor, name);
542 }
543 
545 {
547  return pNetworkImpl->AddMinimumLayer(name);
549 }
550 
552  const char* name)
553 {
554  return pNetworkImpl->AddGatherLayer(descriptor, name);
555 }
556 
558 {
559  return pNetworkImpl->AddGatherNdLayer(name);
560 }
561 
563 {
564  return pNetworkImpl->AddSwitchLayer(name);
565 }
566 
568 {
569  return pNetworkImpl->AddPreluLayer(name);
570 }
571 
573  const ConstTensor& weights,
574  const Optional<ConstTensor>& biases,
575  const char* name)
576 {
577  return pNetworkImpl->AddTransposeConvolution2dLayer(descriptor, weights, biases, name);
578 }
579 
581  const char* name)
582 {
583  return pNetworkImpl->AddTransposeLayer(transposeDescriptor, name);
584 }
585 
587 {
588  return pNetworkImpl->AddShapeLayer(name);
589 }
590 
592  const char* name)
593 {
594  return pNetworkImpl->AddStackLayer(descriptor, name);
595 }
596 
598  const char* name)
599 {
600  return pNetworkImpl->AddStandInLayer(descriptor, name);
601 }
602 
604  const char* name)
605 {
606  return pNetworkImpl->AddQuantizedLstmLayer(params, name);
607 }
608 
610  const LstmInputParams& params,
611  const char* name)
612 {
613  return pNetworkImpl->AddQLstmLayer(descriptor, params, name);
614 }
615 
617  const char* name)
618 {
619  return pNetworkImpl->AddLogicalBinaryLayer(descriptor, name);
620 }
621 
623  const UnidirectionalSequenceLstmDescriptor& descriptor,
624  const LstmInputParams& params,
625  const char* name)
626 {
627  return pNetworkImpl->AddUnidirectionalSequenceLstmLayer(descriptor, params, name);
628 }
629 
631  const char* name)
632 {
633  return pNetworkImpl->AddChannelShuffleLayer(descriptor, name);
634 }
635 
637  const char* name)
638 {
639  return pNetworkImpl->AddBatchMatMulLayer(descriptor, name);
640 }
641 
643 {
644  return pNetworkImpl->ExecuteStrategy(strategy);
645 }
646 
648 {
649  return new INetwork(networkOptions);
650 }
651 
653 {
654  return INetworkPtr(CreateRaw(networkOptions), &INetwork::Destroy);
655 }
656 
658 {
659  delete network;
660 }
661 
663  : pOptimizedNetworkImpl(new OptimizedNetworkImpl(*other.pOptimizedNetworkImpl.get(), modelOptions)) {}
664 
665 IOptimizedNetwork::IOptimizedNetwork(std::unique_ptr<Graph> graph)
666  : pOptimizedNetworkImpl(new OptimizedNetworkImpl(std::move(graph))) {}
667 
668 IOptimizedNetwork::IOptimizedNetwork(std::unique_ptr<OptimizedNetworkImpl> impl)
669  : pOptimizedNetworkImpl(std::move(impl)) {}
670 
671 IOptimizedNetwork::IOptimizedNetwork(std::unique_ptr<Graph> graph, const ModelOptions& modelOptions)
672  : pOptimizedNetworkImpl(new OptimizedNetworkImpl(std::move(graph), modelOptions)) {}
673 
675 
677 {
678  delete network;
679 }
680 
682 {
683  return pOptimizedNetworkImpl->PrintGraph();
684 }
685 
686 Status IOptimizedNetwork::SerializeToDot(std::ostream& stream) const
687 {
688  return pOptimizedNetworkImpl->SerializeToDot(stream);
689 }
690 
691 const std::shared_ptr<IProfiler>& IOptimizedNetwork::GetProfiler() const
692 {
693  return pOptimizedNetworkImpl->GetGraph().GetProfiler();
694 }
695 
696 arm::pipe::ProfilingGuid IOptimizedNetwork::GetGuid() const
697 {
698  return pOptimizedNetworkImpl->GetGuid();
699 }
700 
702 {
703  return pOptimizedNetworkImpl->GetNumInputs();
704 }
705 
707 {
708  return pOptimizedNetworkImpl->GetNumOutputs();
709 }
710 
712 {
713  m_Graph->Print();
714  return Status::Success;
715 }
716 
717 Status OptimizedNetworkImpl::SerializeToDot(std::ostream& stream) const
718 {
719  return m_Graph->SerializeToDot(stream);
720 }
721 
723 {
724  return m_Graph->GetNumInputs();
725 }
726 
728 {
729  return m_Graph->GetNumOutputs();
730 }
731 
732 void ReportError(const std::string& errorMessage,
733  Optional<std::vector<std::string>&> errorMessages)
734 {
735  std::stringstream fullErrorMessage;
736  fullErrorMessage << "ERROR: " << errorMessage;
737  ARMNN_LOG(warning) << fullErrorMessage.str();
738  if (errorMessages)
739  {
740  errorMessages.value().push_back(fullErrorMessage.str());
741  }
742 }
743 
744 void ReportWarning(const std::string& warningMessage,
745  Optional<std::vector<std::string>&> warningMessages)
746 {
747  std::stringstream fullWarningMessage;
748  fullWarningMessage << "WARNING: " << warningMessage;
749  ARMNN_LOG(warning) << fullWarningMessage.str();
750  if (warningMessages)
751  {
752  warningMessages.value().push_back(fullWarningMessage.str());
753  }
754 }
755 
757  const Layer* layer,
758  const BackendSettings& backendSettings,
759  Optional<std::vector<std::string>&> errMessages)
760 {
761  std::stringstream failureMsg;
762  failureMsg << "Layer of type " << GetLayerTypeAsCString(layer->GetType())
763  << " is not supported on any preferred backend " << backendSettings.m_PreferredBackends;
764  ReportError(failureMsg.str(), errMessages);
765 
766  res.m_Error = true;
767  return res;
768 }
769 
770 
771 bool CheckScaleSetOnQuantizedType(Layer* layer, Optional<std::vector<std::string>&> errMessages)
772 {
773  bool noErrors = true;
774  unsigned int numOutputs = layer->GetNumOutputSlots();
775  for (unsigned int i = 0; i < numOutputs; i++) {
776  OutputSlot& outputSlot = layer->GetOutputSlot(i);
777  TensorInfo info = outputSlot.GetTensorInfo();
778  if (DataType::QAsymmU8 == info.GetDataType())
779  {
780  if (0.f == info.GetQuantizationScale())
781  {
782  noErrors = false;
783  std::stringstream ss;
784  ss << "output " << i << " of layer " << GetLayerTypeAsCString(layer->GetType())
785  << " (" << layer->GetNameStr() << ") is of type"
786  << " Quantized 8 bit but its scale parameter has not been set";
787  ReportError(ss.str(), errMessages);
788  }
789  // Softmax under QuantisedAsymm8 must always be scale (1.0f/256.0f) and offset 0
790  if ((info.GetQuantizationScale() != (1.0f / 256.0f) ||
791  info.GetQuantizationOffset() != 0) &&
793  {
794  std::stringstream ss;
795  ss << "Quantization parameters for Softmax layer (Scale: " <<
796  info.GetQuantizationScale() << " and Offset: " << info.GetQuantizationOffset() <<
797  ") are incorrect and have been updated to Scale: 0.00390625 and Offset: 0";
798  ARMNN_LOG(warning) << ss.str();
799  info.SetQuantizationScale((1.0f /256.0f));
800  info.SetQuantizationOffset(0);
801  outputSlot.SetTensorInfo(info);
802  }
803  }
804  }
805  return noErrors;
806 }
807 
809  Graph& graph,
810  Layer* layer,
811  BackendId backend,
812  DataType dataTypeIn,
813  DataType dataTypeOut,
814  const std::vector<BackendId>& availablePreferredBackends,
815  std::string& reasonIfUnsupported,
816  Optional<std::vector<std::string>&> errMessages)
817 {
818  OptimizationResult result;
819 
820  // Helper lambda to compose meaningful error message before returning with error
821  auto ReturnError = [&](const Layer* layer)
822  {
823  return ReturnWithError(result, layer, backendSettings, errMessages);
824  };
825 
826  // need to set the compute device on the layer
827  // before we can check if it is supported
828  layer->SetBackendId(backend);
829 
830  // To run FP16 operations on CpuAcc we need at least v8.2 architecture. If the available architecture
831  // is older than v8.2, we can check if the operator is supported by changing operator inputs & outputs
832  // to be FP32 and inserting convert layers around the FP32 operator.
833  bool isLayerSupported = IWorkloadFactory::IsLayerSupported(*layer, EmptyOptional(), reasonIfUnsupported);
834  std::string checkStr = "This CPU architecture does not support F16 data type, you need v8.2 or above";
835  if (!isLayerSupported ||
836  reasonIfUnsupported.find(checkStr) != std::string::npos)
837  {
838  if (dataTypeIn == DataType::Float16 || dataTypeOut == DataType::Float16)
839  {
840  if (IWorkloadFactory::IsLayerSupported(*layer, DataType::Float32, reasonIfUnsupported)
842  && layer->GetType() != LayerType::ConvertFp16ToFp32)
843  {
844  auto ConstantLayerFromFp16ToFp32 = [](Layer& layer)
845  {
846  if (layer.GetType() == LayerType::Constant)
847  {
848  ConstantLayer* constantLayer = PolymorphicDowncast<ConstantLayer*>(&layer);
849 
850  auto& info = constantLayer->m_LayerOutput->GetTensorInfo();
851 
852  if (info.GetDataType() == DataType::Float16)
853  {
854  std::vector<float> newValues(info.GetNumElements());
855 
857  constantLayer->m_LayerOutput->GetConstTensor<Half>(),
858  info.GetNumElements(),
859  newValues.data());
860 
861  TensorInfo newInfo(info);
863  ConstTensor newInput(newInfo, newValues);
864  constantLayer->m_LayerOutput.reset(new ScopedTensorHandle(newInput));
865 
866  layer.GetOutputSlot(0).SetTensorInfo(newInfo);
867  }
868  }
869  };
870 
871  bool checkType = false;
872 
873  for (auto inputSlot : layer->GetInputSlots())
874  {
875  auto connectedOutputSlot = inputSlot.GetConnectedOutputSlot();
876  if (connectedOutputSlot->GetOwningLayer().GetType() == LayerType::Constant)
877  {
878  if (connectedOutputSlot->GetNumConnections() == 1)
879  {
880  checkType = true;
881  ConstantLayerFromFp16ToFp32(connectedOutputSlot->GetOwningLayer());
882  }
883  }
884  }
885 
886  // Insert FP16 -> FP32 conversion layer before current layer
887  std::vector<ConvertFp16ToFp32Layer*> convertFp16ToFp32Layers;
888  if (dataTypeIn == DataType::Float16)
889  {
890  convertFp16ToFp32Layers =
891  InsertConvertFp16ToFp32LayersBefore(graph, *layer, checkType);
892  }
893 
894  // Insert FP32 -> FP16 conversion layer after current layer
895  std::vector<ConvertFp32ToFp16Layer*> convertFp32ToFp16Layers;
896  if (dataTypeOut == DataType::Float16)
897  {
898  convertFp32ToFp16Layers =
899  InsertConvertFp32ToFp16LayersAfter(graph, *layer);
900  }
901 
902  // Assign a supported backend to the newly introduced conversion layers
903  auto AssignFirstSupportedBackend = [&](Layer* layer, BackendId preferredBackend)
904  {
905  bool supportedBackendFound = false;
906  std::string reasonIfUnsupported;
907 
908  // Try preferred backend first
909  layer->SetBackendId(preferredBackend);
911  EmptyOptional(),
912  reasonIfUnsupported))
913  {
914  supportedBackendFound = true;
915  }
916  else
917  {
918  for (const auto& backend : availablePreferredBackends)
919  {
920  // Skip preferred backend (we already determined that it is not supported)
921  if (backend == preferredBackend)
922  {
923  continue;
924  }
925 
926  layer->SetBackendId(backend);
928  EmptyOptional(),
929  reasonIfUnsupported))
930  {
931  supportedBackendFound = true;
932  break;
933  }
934  }
935  }
936 
937  return supportedBackendFound;
938  };
939 
940  for (ConvertFp16ToFp32Layer* convertLayer : convertFp16ToFp32Layers)
941  {
942  if (!AssignFirstSupportedBackend(convertLayer, backend))
943  {
944  return ReturnError(convertLayer);
945  }
946  }
947 
948  for (ConvertFp32ToFp16Layer* convertLayer : convertFp32ToFp16Layers)
949  {
950  if (!AssignFirstSupportedBackend(convertLayer, backend))
951  {
952  return ReturnError(convertLayer);
953  }
954  }
955 
956  return result;
957  }
958  }
959 
960  std::stringstream warningMsg;
961  warningMsg << "Layer of type " << GetLayerTypeAsCString(layer->GetType())
962  << " is not supported on requested backend " << layer->GetBackendId().Get()
963  << " for input data type " << GetDataTypeName(dataTypeIn)
964  << " and output data type " << GetDataTypeName(dataTypeOut)
965  << " (reason: " << reasonIfUnsupported
966  << "), falling back to the next backend.";
967  ReportWarning(warningMsg.str(), errMessages);
968 
969  return OptimizationResult(true, false);
970  }
971  else
972  {
973  return result;
974  }
975 }
976 
977 inline std::vector<DataType> GetLayerInOutDatatype(const Layer* layer)
978 {
979  DataType dataTypeIn = layer->GetNumInputSlots() == 0 ? DataType::Float32 :
981  DataType dataTypeOut = layer->GetNumOutputSlots() == 0 ? DataType::Float32 :
983  return {dataTypeIn, dataTypeOut};
984 }
985 
986 // Refactor to allow passing the IConnectableLayer* rather than Layer Iterator
987 // on Graph and SubgraphView which are different types.
989  IConnectableLayer* it,
990  Optional<std::vector<std::string>&> errMessages,
991  OptimizationResult& result,
992  BackendSettings& backendSettings,
993  std::vector<BackendId>& availablePreferredBackends)
994 {
995  auto ReturnError = [&](const Layer* layer)
996  {
997  return ReturnWithError(result, layer, backendSettings, errMessages);
998  };
999 
1000  auto layer = PolymorphicDowncast<Layer*>(it);
1001 
1002  if (layer->GetType() == LayerType::Input)
1003  {
1004  return;
1005  }
1006 
1007  std::vector<DataType> inOutDataType = GetLayerInOutDatatype(layer);
1008 
1009  std::string reasonIfUnsupported;
1010  bool found = false;
1011  if (!CheckScaleSetOnQuantizedType(layer, errMessages))
1012  {
1013  // don't bomb immediately, find all the quantized outputs
1014  // which haven't had a scale set and report them all back.
1015  result.m_Error = true;
1016  }
1017 
1018  // First try assign layer to hint backend
1019  if (layer->GetBackendHint().has_value() &&
1020  backendSettings.IsBackendSupported(layer->GetBackendHint().value()) &&
1021  AttemptBackendAssignment(backendSettings,
1022  optNetObjPtr->GetGraph(),
1023  layer,
1024  layer->GetBackendHint().value(),
1025  inOutDataType[0],
1026  inOutDataType[1],
1027  availablePreferredBackends,
1028  reasonIfUnsupported,
1029  errMessages).IsOk())
1030  {
1031  found = true;
1032  backendSettings.m_SelectedBackends.insert(layer->GetBackendHint().value());
1033  }
1034  else
1035  {
1036  // Try assign layer to prefered list of backends
1037  for (const auto& backend : availablePreferredBackends)
1038  {
1039  if (layer->GetBackendHint().has_value() &&
1040  layer->GetBackendHint().value() == backend)
1041  {
1042  continue; //Don't re-test the backend hint
1043  }
1044 
1045  OptimizationResult res = AttemptBackendAssignment(backendSettings,
1046  optNetObjPtr->GetGraph(),
1047  layer,
1048  backend,
1049  inOutDataType[0],
1050  inOutDataType[1],
1051  availablePreferredBackends,
1052  reasonIfUnsupported,
1053  errMessages);
1054 
1055  if (res.IsOk())
1056  {
1057  found = true;
1058  backendSettings.m_SelectedBackends.insert(backend);
1059  break;
1060  }
1061  else if (res.IsError())
1062  {
1063  result = res; // Cannot continue.
1064  // Note: we don't need to log the error as it would already
1065  // be logged in AttemptBackendAssignment().
1066  }
1067  else
1068  {
1069  ARMNN_ASSERT_MSG(res.IsWarningOnly(), "OptimizationResult in unexpected state.");
1070  }
1071  }
1072  }
1073 
1074  // If the layer is unsupported by any devices, log and return a null network.
1075  if (!found)
1076  {
1077  // NOTE: if the layer is not an operation queue type AND we have not got CpuRef as a
1078  // fallback we should set the compute device on the layer to CpuRef (these are not
1079  // available as accelerated operations, or are only available under certain
1080  // conditions, currently they comprise MemCopy, Constant, Permute)
1081  armnn::LayerType layerType = layer->GetType();
1082  if (!backendSettings.IsCpuRefUsed() && (layerType == armnn::LayerType::MemCopy ||
1083  layerType == armnn::LayerType::Constant ||
1084  layerType == armnn::LayerType::Permute))
1085  {
1086  BackendId cpuBackendId(armnn::Compute::CpuRef);
1087  layer->SetBackendId(cpuBackendId);
1088  backendSettings.m_SelectedBackends.insert(cpuBackendId);
1089  }
1090  else
1091  {
1092  result = ReturnError(layer);
1093  }
1094  }
1095 
1096 }
1097 
1099  BackendSettings& backendSettings,
1100  Graph::Iterator& firstLayer,
1101  Graph::Iterator& lastLayer,
1102  Optional<std::vector<std::string>&> errMessages)
1103 {
1104  ARMNN_SCOPED_PROFILING_EVENT(Compute::Undefined, "Optimizer_AssignBackends");
1105  OptimizationResult result;
1106 
1107  auto availablePreferredBackends = backendSettings.GetAvailablePreferredBackends();
1108  if (availablePreferredBackends.empty())
1109  {
1110  std::stringstream failureMsg;
1111  failureMsg << "No preferred backends are available";
1112  ReportError(failureMsg.str(), errMessages);
1113 
1114  result.m_Error = true;
1115  return result;
1116  }
1117 
1118  for (auto it = firstLayer; it != lastLayer; ++it)
1119  {
1120  auto layer = PolymorphicDowncast<Layer*>(*it);
1121  std::vector<DataType> inOutDataType = GetLayerInOutDatatype(layer);
1122 
1123  // In AttemptBackendAssignment() we check:
1124  // - if input/output datatypes of the layer are float16
1125  // - if the layer is supported with these datatypes
1126  // If the layer is not supported (failing on ARM_COMPUTE_RETURN_ERROR_ON_CPU_F16_UNSUPPORTED() in clframework),
1127  // we attempt to insert convertion layers either side of the new fp32 layer.
1128  bool isFloat16 = false;
1129  for (auto type : inOutDataType)
1130  {
1131  if (type == DataType::Float16)
1132  {
1133  isFloat16 = true;
1134  break;
1135  }
1136  }
1137 
1138  if (layer->GetBackendId() == "Unknown" || isFloat16)
1139  {
1140  AssignBackendsIConnectable(optNetObjPtr,
1141  *it,
1142  errMessages,
1143  result,
1144  backendSettings,
1145  availablePreferredBackends);
1146  }
1147  }
1148 
1149  for (auto it = firstLayer; it != lastLayer; ++it)
1150  {
1151  auto layer = PolymorphicDowncast<Layer*>(*it);
1152 
1153  if(layer->GetType() == LayerType::Input)
1154  {
1155  BackendId connectedBackendId = layer->GetOutputSlot(0).GetConnection(0)->GetOwningLayer().GetBackendId();
1156  layer->SetBackendId(connectedBackendId);
1157  }
1158  }
1159 
1160  return result;
1161 }
1162 
1164  BackendSettings& backendSettings,
1167  Optional<std::vector<std::string>&> errMessages)
1168 {
1169  ARMNN_SCOPED_PROFILING_EVENT(Compute::Undefined, "Optimizer_AssignBackends");
1170  OptimizationResult result;
1171 
1172  auto availablePreferredBackends = backendSettings.GetAvailablePreferredBackends();
1173  if (availablePreferredBackends.empty())
1174  {
1175  std::stringstream failureMsg;
1176  failureMsg << "No preferred backends are available";
1177  ReportError(failureMsg.str(), errMessages);
1178 
1179  result.m_Error = true;
1180  return result;
1181  }
1182 
1183  for (auto it = firstLayer; it != lastLayer; ++it)
1184  {
1185  AssignBackendsIConnectable(optNetObjPtr,
1186  *it,
1187  errMessages,
1188  result,
1189  backendSettings,
1190  availablePreferredBackends);
1191  }
1192 
1193  for (auto it = firstLayer; it != lastLayer; ++it)
1194  {
1195  auto layer = PolymorphicDowncast<Layer*>(*it);
1196 
1197  if(layer->GetType() == LayerType::Input)
1198  {
1199  BackendId connectedBackendId = layer->GetOutputSlot(0).GetConnection(0)->GetOwningLayer().GetBackendId();
1200  layer->SetBackendId(connectedBackendId);
1201  }
1202  }
1203 
1204  return result;
1205 }
1206 
1208  BackendSettings& backendSettings,
1209  SubgraphView& subgraph,
1210  Optional<std::vector<std::string>&> errMessages)
1211 {
1214  return AssignBackends(optNetObjPtr,
1215  backendSettings,
1216  firstLayer,
1217  lastLayer,
1218  errMessages);
1219 }
1220 
1222  BackendSettings& backendSettings)
1223 {
1224  BackendsMap backends;
1225  auto const& backendRegistry = BackendRegistryInstance();
1226  for (auto&& selectedBackend : backendSettings.m_SupportedBackends)
1227  {
1228  auto backendFactory = backendRegistry.GetFactory(selectedBackend);
1229  auto backendObjPtr = backendFactory();
1230  ARMNN_ASSERT(backendObjPtr);
1231 
1232  backendObjPtr->RegisterTensorHandleFactories(handleFactoryRegistry);
1233 
1234  backends[backendObjPtr->GetId()] = std::move(backendObjPtr);
1235  }
1236 
1237  return backends;
1238 }
1239 
1241  BackendSettings& backendSettings,
1242  BackendsMap& backends,
1243  const ModelOptions& modelOptions,
1244  Optional<std::vector<std::string>&> errMessages)
1245 {
1246  ARMNN_ASSERT(optNetObjPtr);
1247  ARMNN_SCOPED_PROFILING_EVENT(Compute::Undefined, "Optimizer_ApplyBackendOptimizations")
1248  OptimizationResult result;
1249 
1250  // Get the optimized graph
1251  Graph& optGraph = optNetObjPtr->GetGraph();
1252 
1253  // Run backend specific optimizations
1254  for (auto&& selectedBackend : backendSettings.m_SelectedBackends)
1255  {
1256  auto backendObjPtr = backends.find(selectedBackend)->second.get();
1257  ARMNN_ASSERT(backendObjPtr);
1258 
1259  if (selectedBackend == armnn::Compute::GpuAcc || selectedBackend == armnn::Compute::CpuAcc)
1260  {
1263  }
1264 
1265  // Select sub-graphs based on backend
1268  // Select layers assigned to the requested backend
1269  [&backendObjPtr](const Layer& layer)
1270  {
1271 
1272  return layer.GetType() != LayerType::Input &&
1273  layer.GetType() != LayerType::Output &&
1274  layer.GetBackendId() == backendObjPtr->GetId();
1275  });
1276  if (subgraphs.empty())
1277  {
1278  // No sub-graphs found, try with next selected backend
1279  continue;
1280  }
1281 
1282  // Try to optimize each sub-graph
1283  for (auto& subgraph : subgraphs)
1284  {
1285  // Try to optimize the current sub-graph
1286  ARMNN_SCOPED_PROFILING_EVENT(backendObjPtr->GetId(), "Optimizer_OptimizeSubgraph");
1287  OptimizationViews optimizationViews = backendObjPtr->OptimizeSubgraphView(*subgraph, modelOptions);
1288  ARMNN_ASSERT(optimizationViews.Validate(*subgraph));
1289 
1290  // Optimization attempted, check the resulting optimized sub-graph
1291  for (auto& substitution : optimizationViews.GetSubstitutions())
1292  {
1293  // Sub-graph optimized, substitute the sub-graph with the new optimized one in the main optimized graph
1294  SubgraphView& replacementSubgraph = substitution.m_ReplacementSubgraph;
1295  SubgraphView& substitutableSubgraph = substitution.m_SubstitutableSubgraph;
1296  optGraph.SubstituteSubgraph(substitutableSubgraph, replacementSubgraph);
1297 
1298  // Assign the current backend to the optimized sub-graph
1299  const SubgraphView::IConnectableLayers& subgraphLayers = replacementSubgraph.GetIConnectableLayers();
1300  std::for_each(subgraphLayers.begin(), subgraphLayers.end(), [&selectedBackend](IConnectableLayer* l)
1301  {
1302  ARMNN_ASSERT(l);
1303  PolymorphicDowncast<Layer*>(l)->SetBackendId(selectedBackend);
1304  });
1305  }
1306 
1307  if (!optimizationViews.GetFailedSubgraphs().empty())
1308  {
1309  std::stringstream warningMsg;
1310  warningMsg << "Some sub-graph(s) failed to optimized on " << backendObjPtr->GetId() << " backend.";
1311  ReportWarning(warningMsg.str(), errMessages);
1312 
1313  // Failed to optimize the given sub-graph, re-assign the sub-graph layers to other available backends
1314  BackendSettings settingsCopy(backendSettings);
1315  if (!backendObjPtr->GetId().IsCpuRef())
1316  {
1317  // Add the current backend to the list of backends to ignore
1318  settingsCopy.m_IgnoredBackends.insert(backendObjPtr->GetId());
1319  }
1320 
1321  int count=0;
1322  for (auto& failedSubgraph : optimizationViews.GetFailedSubgraphs())
1323  {
1324  // An error occurred: the optimization was attempted but not performed, try different backends
1325  std::stringstream subgraphMsg;
1326  subgraphMsg << "Re-assigning backends to " << failedSubgraph.GetIConnectableLayers().size()
1327  << " layers inside sub-graph " << count++;
1328  ReportWarning(subgraphMsg.str(), errMessages);
1329 
1330  OptimizationResult reassignmentResult = AssignBackends(optNetObjPtr,
1331  settingsCopy,
1332  *subgraph,
1333  errMessages);
1334  if (reassignmentResult.m_Error)
1335  {
1336  // Failed to re-assign one of the remaining backends to each layer of the sub-graph
1337  result.m_Error = true;
1338  return result;
1339  }
1340  }
1341  }
1342  }
1343  }
1344 
1345  return result;
1346 }
1347 
1350  TensorHandleFactoryRegistry& registry)
1351 {
1352  if (src != dst)
1353  {
1354  ITensorHandleFactory* srcFactory = registry.GetFactory(src);
1355  ITensorHandleFactory* dstFactory = registry.GetFactory(dst);
1356 
1357  if (srcFactory && dstFactory &&
1358  (srcFactory->GetExportFlags() & dstFactory->GetImportFlags()) != 0)
1359  {
1360  return false;
1361  }
1362  return true;
1363  }
1364  return false;
1365 }
1366 
1367 // Find the handle factory for the input layer which results in fewest required copies.
1369  OutputSlot& slot,
1370  TensorHandleFactoryRegistry& registry,
1371  bool importEnabled)
1372 {
1373  Layer& layer = slot.GetOwningLayer();
1375 
1376  // Explicitly select the tensorhandle factory for InputLayer because the rules for it are slightly different. It
1377  // doesn't matter which backend it is assigned to because they all use the same implementation, which
1378  // requires Map/Unmap support. This means that, so long as the handle type supports map/unmap semantics, we can
1379  // select a factory with maximum compatibility with the layers connected to the InputLayer.
1380 
1381  // First ensure the from backends can support the TensorHandeAPI
1382  auto frmBackend = backends.find(layer.GetBackendId());
1383  if (frmBackend == backends.end() ||
1384  !frmBackend->second->SupportsTensorAllocatorAPI())
1385  {
1387  }
1388 
1389  // Go through all connections to the output slot and determine the TensorHandleFactory which results in the
1390  // fewest copies.
1391  std::map<ITensorHandleFactory::FactoryId, int> factoryScores;
1392  int topScore = 0;
1394 
1395  for (auto&& connection : slot.GetConnections())
1396  {
1397 
1398  const Layer& connectedLayer = connection->GetOwningLayer();
1399 
1400  auto toBackend = backends.find(connectedLayer.GetBackendId());
1401  ARMNN_ASSERT_MSG(toBackend != backends.end(), "Backend id not found for the connected layer");
1402 
1403  if (!toBackend->second.get()->SupportsTensorAllocatorAPI())
1404  {
1405  // The destination backend does not support the tensor allocator API, move to the next one
1406  continue;
1407  }
1408 
1409  auto dstPrefs = toBackend->second.get()->GetHandleFactoryPreferences();
1410  for (auto&& dst : dstPrefs)
1411  {
1412  // Input layers use the mem copy workload or import, so the selected factory must
1413  // support either the map/unmap API or Import API
1414  ITensorHandleFactory* factory = registry.GetFactory(dst);
1415  if (importEnabled && factory->GetImportFlags() == 0)
1416  {
1417  continue;
1418  }
1419  else if (!importEnabled && !factory->SupportsMapUnmap())
1420  {
1421  continue;
1422  }
1423 
1424  auto it = factoryScores.find(dst);
1425  if (it == factoryScores.end())
1426  {
1427  // Add new score to the table
1428  factoryScores[dst] = 0;
1429  if (topChoice == ITensorHandleFactory::LegacyFactoryId)
1430  {
1431  topChoice = dst;
1432  }
1433  }
1434  else
1435  {
1436  // Increase the score
1437  factoryScores[dst]++;
1438 
1439  // Track the best option
1440  if (factoryScores[dst] > topScore)
1441  {
1442  topScore = factoryScores[dst];
1443  topChoice = dst;
1444  }
1445  }
1446  }
1447  }
1448 
1449  return topChoice;
1450 }
1451 
1452 // Find the handle factory for the output layer which results in fewest required copies.
1454  OutputSlot& slot,
1455  TensorHandleFactoryRegistry& registry)
1456 {
1457  IgnoreUnused(backends, slot, registry);
1459 }
1460 
1461 // For all handle factories supported on the source backend, we wish to find the one which requires the fewest copies
1462 // when considering all connections.
1464  OutputSlot& outputSlot,
1465  TensorHandleFactoryRegistry& registry,
1466  bool exportEnabled)
1467 {
1468  // First ensure the from backends can support the TensorHandeAPI
1469  Layer& layer = outputSlot.GetOwningLayer();
1470  auto frmBackend = backends.find(layer.GetBackendId());
1471  if (frmBackend == backends.end() ||
1472  !frmBackend->second->SupportsTensorAllocatorAPI())
1473  {
1475  }
1476 
1477  bool outputConnection = false;
1478  for (auto&& connection : outputSlot.GetConnections())
1479  {
1480  const Layer& connectedLayer = connection->GetOwningLayer();
1481  if (connectedLayer.GetType() == LayerType::Output)
1482  {
1483  outputConnection = true;
1484  }
1485  }
1486 
1487  IBackendInternal* srcBackend = frmBackend->second.get();
1488  auto srcPrefs = srcBackend->GetHandleFactoryPreferences();
1489 
1490  // Initialize the scores
1491  std::map<ITensorHandleFactory::FactoryId, int> factoryScores;
1492  for (auto&& pref : srcPrefs)
1493  {
1494  if (exportEnabled)
1495  {
1496  ITensorHandleFactory* factory = registry.GetFactory(pref);
1497  if (outputConnection)
1498  {
1499  // Check if this is fallback case
1500  bool fallbackConnection = false;
1501  for (auto&& inputSlot : layer.GetInputSlots())
1502  {
1503  if (inputSlot.GetConnectedOutputSlot()->GetOwningLayer().GetBackendId() != layer.GetBackendId())
1504  {
1505  fallbackConnection = true;
1506  }
1507  }
1508  if (fallbackConnection)
1509  {
1510  auto factoryCap = factory->GetCapabilities(&layer, &layer, CapabilityClass::FallbackImportDisabled);
1511  // Cannot use factory import if fallback import is not supported.
1512  if (!factoryCap.empty())
1513  {
1514  continue;
1515  }
1516  }
1517  else if (factory->GetExportFlags() == 0)
1518  {
1519  continue;
1520  }
1521  }
1522  if (!outputConnection)
1523  {
1524  auto factoryCap = factory->GetCapabilities(&layer, &layer, CapabilityClass::FallbackImportDisabled);
1525  // Cannot use factory import if fallback import is not supported.
1526  if (!factoryCap.empty())
1527  {
1528  continue;
1529  }
1530  }
1531 
1532  }
1533  else
1534  {
1535  // Only consider factories that support map/unmap
1536  ITensorHandleFactory* factory = registry.GetFactory(pref);
1537  if (!factory->SupportsMapUnmap())
1538  {
1539  // The current tensor handle factory does not support the map/unmap strategy, move to the next one
1540  continue;
1541  }
1542  }
1543 
1544 
1545  auto it = factoryScores.find(pref);
1546  if (it == factoryScores.end())
1547  {
1548  // Add new score to the table
1549  factoryScores[pref] = 0;
1550  }
1551  }
1552 
1553  // Score each handle factory based on how many times it requires copies on the slot connections
1554  for (auto&& connection : outputSlot.GetConnections())
1555  {
1556  const Layer& connectedLayer = connection->GetOwningLayer();
1557 
1558  auto toBackend = backends.find(connectedLayer.GetBackendId());
1559  ARMNN_ASSERT_MSG(toBackend != backends.end(), "Backend id not found for the connected layer");
1560 
1561  auto dstPrefs = toBackend->second.get()->GetHandleFactoryPreferences();
1562  for (auto&& src : srcPrefs)
1563  {
1564  if (factoryScores.find(src) == factoryScores.end()) // Don't consider excluded factories
1565  {
1566  continue;
1567  }
1568 
1569  for (auto&& dst : dstPrefs)
1570  {
1571  if (RequiresCopy(src, dst, registry))
1572  {
1573  // Copy avoided, increase the score
1574  factoryScores[src]++;
1575  break;
1576  }
1577  }
1578  }
1579  }
1580 
1581  // Find the lowest score
1582  int minScore = std::numeric_limits<int>::max();
1583  for (auto it : factoryScores)
1584  {
1585  minScore = std::min(minScore, it.second);
1586  }
1587 
1588  // Collect factories matching the best(lowest) score
1589  std::vector<ITensorHandleFactory::FactoryId> optimalFactories;
1590  for (auto it : factoryScores)
1591  {
1592  if (it.second == minScore)
1593  {
1594  optimalFactories.push_back(it.first);
1595  }
1596  }
1597 
1598  // For all compatible Factories matching the best score, find the preferred one for the current layer.
1599  for (auto&& srcPref : srcPrefs)
1600  {
1601  for (auto&& comp : optimalFactories)
1602  {
1603  if (comp == srcPref)
1604  {
1605  return comp;
1606  }
1607  }
1608  }
1609 
1611 }
1612 
1614  ITensorHandleFactory::FactoryId srcFactoryId,
1615  const Layer& layer,
1616  const Layer& connectedLayer,
1617  TensorHandleFactoryRegistry& registry,
1618  bool importEnabled)
1619 {
1620  auto toBackend = backends.find(connectedLayer.GetBackendId());
1621  ARMNN_ASSERT_MSG(toBackend != backends.end(), "Backend id not found for the connected layer");
1622 
1623  auto dstPrefs = toBackend->second.get()->GetHandleFactoryPreferences();
1624 
1625  // Legacy API check for backward compatibility
1626  if (srcFactoryId == ITensorHandleFactory::LegacyFactoryId || dstPrefs.empty())
1627  {
1628  if (layer.GetBackendId() != connectedLayer.GetBackendId())
1629  {
1631  }
1632  else
1633  {
1635  }
1636  }
1637 
1638  // TensorHandleFactory API present, so perform more sophisticated strategies.
1639  // Dst Output layers don't require copy because they use import or map/unmap
1640  if (connectedLayer.GetType() == LayerType::Output)
1641  {
1643  }
1644 
1645  // Search for direct match in prefs
1646  for (auto&& pref : dstPrefs)
1647  {
1648  if (pref == srcFactoryId)
1649  {
1651  }
1652  }
1653 
1654  // Search for export/import options
1655  ITensorHandleFactory* srcFactory = registry.GetFactory(srcFactoryId);
1656  if (srcFactory->GetExportFlags() != 0 && importEnabled)
1657  {
1658  for (auto&& pref : dstPrefs)
1659  {
1660  ITensorHandleFactory* dstFactory = registry.GetFactory(pref);
1661 
1662  // Handles cases when a destPref is not listed in TensorHandleFactoryRegistry
1663  if (!dstFactory) {
1664  continue;
1665  }
1666  if ((dstFactory->GetImportFlags() & srcFactory->GetExportFlags()) != 0)
1667  {
1668  auto srcCapability = srcFactory->GetCapabilities(&layer, &layer, CapabilityClass::PaddingRequired);
1669  auto dstCapability = dstFactory->GetCapabilities(&connectedLayer,
1670  &connectedLayer,
1672  auto srcFallback = srcFactory->GetCapabilities(&layer, &layer, CapabilityClass::FallbackImportDisabled);
1673  auto dstFallback = dstFactory->GetCapabilities(&connectedLayer,
1674  &connectedLayer,
1676  // Do not require memory copy if the source and destination do not require padding.
1677  if (srcCapability.empty() && dstCapability.empty() && srcFallback.empty() && dstFallback.empty())
1678  {
1680  }
1681  }
1682  }
1683  }
1684 
1685  // Search for copy options via map/unmap
1686  if (srcFactory->SupportsMapUnmap())
1687  {
1688  for (auto&& pref : dstPrefs)
1689  {
1690  ITensorHandleFactory* dstFactory = registry.GetFactory(pref);
1691  if (dstFactory && dstFactory->SupportsMapUnmap())
1692  {
1694  }
1695  }
1696  }
1697 
1698  return EdgeStrategy::Undefined;
1699 }
1700 
1701 // Select the TensorHandleFactories and the corresponding memory strategy
1703  BackendsMap& backends,
1704  TensorHandleFactoryRegistry& registry,
1705  bool importEnabled,
1706  bool exportEnabled,
1707  Optional<std::vector<std::string>&> errMessages)
1708 {
1709  ARMNN_SCOPED_PROFILING_EVENT(Compute::Undefined, "Optimizer_SelectTensorHandleStrategy");
1710  OptimizationResult result;
1711 
1712  optGraph.ForEachLayer([&backends, &registry, &result, &errMessages, importEnabled, exportEnabled](Layer* layer)
1713  {
1714  ARMNN_ASSERT(layer);
1715 
1716  // Lets make sure the backend is in our list of supported backends. Something went wrong during backend
1717  // assignment if this check fails
1718  ARMNN_ASSERT(backends.find(layer->GetBackendId()) != backends.end());
1719 
1720  // Check each output separately
1721  for (unsigned int slotIdx = 0; slotIdx < layer->GetNumOutputSlots(); slotIdx++)
1722  {
1723  OutputSlot& outputSlot = layer->GetOutputSlot(slotIdx);
1724 
1726 
1727  // Calculate the factory to use which results in the fewest copies being made.
1728  switch(layer->GetType())
1729  {
1730  case LayerType::Input:
1731  slotOption = CalculateSlotOptionForInput(backends, outputSlot, registry, importEnabled);
1732  break;
1733  case LayerType::Output:
1734  slotOption = CalculateSlotOptionForOutput(backends, outputSlot, registry);
1735  break;
1736  default:
1737  slotOption = CalculateSlotOption(backends, outputSlot, registry, exportEnabled);
1738  break;
1739  }
1740  outputSlot.SetTensorHandleFactory(slotOption);
1741 
1742  // Now determine the "best" edge strategy for each connection given the slotOption.
1743  unsigned int connectionIdx = 0;
1744  for (auto&& connection : outputSlot.GetConnections())
1745  {
1746  const Layer& connectedLayer = connection->GetOwningLayer();
1747 
1748  EdgeStrategy strategy = CalculateEdgeStrategy(backends, slotOption, *layer, connectedLayer,
1749  registry, importEnabled);
1750 
1751  if (strategy == EdgeStrategy::Undefined)
1752  {
1753  result.m_Error = true;
1754  if (errMessages)
1755  {
1756  errMessages.value().emplace_back("Could not find valid strategy required for compatibility"
1757  " between backends.");
1758  }
1759  return;
1760  }
1761 
1762  outputSlot.SetEdgeStrategy(connectionIdx, strategy);
1763 
1764  connectionIdx++;
1765  }
1766  }
1767  });
1768 
1769  return result;
1770 }
1771 
1772 // Forwarding function to remain backward compatible with legacy OptimizerOptions
1774  const std::vector<BackendId>& backendPreferences,
1775  const IDeviceSpec& deviceSpec,
1776  const OptimizerOptions& options,
1777  Optional<std::vector<std::string>&> messages)
1778 {
1779  return Optimize(inGraph,
1780  backendPreferences,
1781  deviceSpec,
1782  OptimizerOptionsOpaque(options),
1783  messages);
1784 }
1785 
1787  const std::vector<BackendId>& backendPreferences,
1788  const IDeviceSpec& deviceSpec,
1789  const OptimizerOptionsOpaque& options,
1790  Optional<std::vector<std::string>&> messages)
1791 {
1792  ARMNN_LOG(debug) << options.ToString();
1793 
1794  // Enable profiling
1795  auto profiler = inGraph.GetProfiler();
1797  profiler->EnableProfiling(options.GetProfilingEnabled());
1798 
1800  if (backendPreferences.empty())
1801  {
1802  throw InvalidArgumentException("Invoked Optimize with no backends specified");
1803  }
1804 
1805  if (options.GetReduceFp32ToBf16())
1806  {
1807  throw InvalidArgumentException("BFloat16 optimization is currently ignored. In order to use Bf16 optimization "
1808  "Please use the FastMathEnabled backend option for CpuAcc or GpuAcc.");
1809  }
1810 
1811  if (options.GetReduceFp32ToFp16() && options.GetReduceFp32ToBf16())
1812  {
1813  throw InvalidArgumentException("BFloat16 and Float16 optimization cannot be enabled at the same time.");
1814  }
1815 
1816  // Ensure TensorInfo is set on all output slots of ConstantLayers in the graph
1818 
1819  std::unique_ptr<Graph> graph = std::make_unique<Graph>(inGraph);
1820 
1821  // We need to pass on the information about whether import and export is enabled to the LoadNetwork phase.
1822  // The mechanism to do that is to add model options to the optimized network.
1823  armnn::BackendOptions importExport("Global",
1824  {{"ImportEnabled", options.GetImportEnabled()},
1825  {"ExportEnabled", options.GetExportEnabled()}});
1826  ModelOptions optimizedOptions(options.GetModelOptions());
1827  optimizedOptions.push_back(importExport);
1828 
1829  auto optNet = IOptimizedNetworkPtr(new IOptimizedNetwork(std::move(graph), optimizedOptions),
1831 
1832  IOptimizedNetwork* optNetObjPtr = optNet.get();
1833 
1834  // Get the optimized graph
1835  Graph& optGraph = optNetObjPtr->pOptimizedNetworkImpl->GetGraph();
1836 
1838  {
1839  // Infer the tensor infos for all output slots. Throws an exception on failure
1840  optGraph.InferTensorInfos();
1841  }
1842 
1843  // Perform AddBroadcastReshapeLayer optimisation
1844  using namespace optimizations;
1846 
1848  {
1849  // Validate the tensor infos for all output slots. Throws an exception on failure
1850  optGraph.InferTensorInfos();
1851  }
1852 
1853 
1854  // Group Constant Layer optimizations together where possible.
1855  // This is important as:
1856  // FusePermuteIntoConstantLayer must happen before FoldPadIntoDepthwiseConvolution2d and
1857  // FuseBatchNormIntoDepthwiseConvolution2D.
1858  // ConvertConstDequantisationLayersToConstLayers must happen before FoldPadIntoConvolution2d
1861  // Perform optimisation passes
1867  MovePermuteUp(),
1868  MoveTransposeUp(),
1869  PermuteAsReshape(),
1881 
1882 
1883  if (options.GetReduceFp32ToFp16())
1884  {
1885  ARMNN_SCOPED_PROFILING_EVENT(Compute::Undefined, "Optimizer_ReduceFp32ToFp16");
1888  }
1889 
1890  // Initialize backend settings
1891  BackendSettings backendSettings(backendPreferences, deviceSpec);
1892  if (backendSettings.GetAvailablePreferredBackends().empty())
1893  {
1894  std::stringstream failureMsg;
1895  failureMsg << "None of the preferred backends " << backendPreferences
1896  << " are supported. Current platform provides " << backendSettings.m_SupportedBackends;
1897  ReportError(failureMsg.str(), messages);
1898  throw InvalidArgumentException(failureMsg.str());
1899  }
1900 
1901  // Create a map to temporarily hold initialized backend objects
1902  TensorHandleFactoryRegistry tensorHandleFactoryRegistry;
1903  BackendsMap backends = CreateSupportedBackends(tensorHandleFactoryRegistry, backendSettings);
1904 
1905  // Assign an available backend to each layer
1906  Graph::Iterator firstLayer = optGraph.begin();
1907  Graph::Iterator lastLayer = optGraph.end();
1908  OptimizationResult assignBackendsResult = AssignBackends(optNetObjPtr->pOptimizedNetworkImpl.get(),
1909  backendSettings,
1910  firstLayer,
1911  lastLayer,
1912  messages);
1913  if (assignBackendsResult.m_Error)
1914  {
1915  // Failed to assign a backend to each layer
1916  throw InvalidArgumentException("Failed to assign a backend to each layer");
1917  }
1918 
1921 
1922  // Apply the backend-specific optimizations
1923  OptimizationResult backendOptimizationResult = ApplyBackendOptimizations(optNetObjPtr->pOptimizedNetworkImpl.get(),
1924  backendSettings,
1925  backends,
1926  options.GetModelOptions(),
1927  messages);
1928  if (backendOptimizationResult.m_Error)
1929  {
1930  // Failed to apply the backend-specific optimizations
1931  throw InvalidArgumentException("Failed to apply the backend-specific optimizations");
1932  }
1933 
1934  // Convert constants
1935  {
1936  ARMNN_SCOPED_PROFILING_EVENT(Compute::Undefined, "Optimizer_ConvertConstants");
1939  }
1940 
1941  // This must occur after all topological changes to the graph and any redirection of variables
1942  // If the debug flag is set, then insert a DebugLayer after each layer
1943  // Doing this after applying the backend optimizations as they might have changed some layers
1944  if (options.GetDebugEnabled() && !options.GetDebugToFileEnabled())
1945  {
1947  }
1948  else if (options.GetDebugToFileEnabled())
1949  {
1950  // Setup the output file path
1951  try
1952  {
1953 #if !defined(ARMNN_DISABLE_FILESYSTEM)
1954  auto result = armnnUtils::Filesystem::CreateDirectory("/ArmNNIntermediateLayerOutputs");
1955  ARMNN_LOG(info) << "Intermediate tensors will be written to: " << result;
1956 #endif
1958  }
1959  catch (const armnn::RuntimeException& e)
1960  {
1961  // If we cannot create the output directory then we'll issue a warning and continue.
1962  ARMNN_LOG(warning) << "Unable to print intermediate layer outputs : " << e.what();
1963  }
1964  }
1965 
1966  // Calculate the compatibility strategies for tensor handles
1967  OptimizationResult strategyResult = SelectTensorHandleStrategy(optGraph,
1968  backends,
1969  tensorHandleFactoryRegistry,
1970  options.GetImportEnabled(),
1971  options.GetExportEnabled(),
1972  messages);
1973 
1974  if (strategyResult.m_Error)
1975  {
1976  // Failed to apply the backend-specific optimizations
1978  }
1979 
1980  // Based on the tensor handle strategy determined above, insert copy layers where required.
1981  {
1982  ARMNN_SCOPED_PROFILING_EVENT(Compute::Undefined, "Optimizer_AddCompatibilityLayers");
1983  optGraph.AddCompatibilityLayers(backends, tensorHandleFactoryRegistry);
1984  }
1985 
1986  return optNet;
1987 }
1988 
1989 // Forwarding function to remain backward compatible with legacy OptimizerOptions
1991  const std::vector<BackendId>& backendPreferences,
1992  const IDeviceSpec& deviceSpec,
1993  const OptimizerOptions& options,
1994  Optional<std::vector<std::string>&> messages)
1995 {
1996  return Optimize(inNetwork,
1997  backendPreferences,
1998  deviceSpec,
1999  OptimizerOptionsOpaque(options),
2000  messages);
2001 }
2002 
2004  const std::vector<BackendId>& backendPreferences,
2005  const IDeviceSpec& deviceSpec,
2006  const OptimizerOptionsOpaque& options,
2007  Optional<std::vector<std::string>&> messages)
2008 {
2009  return Optimize(inNetwork.pNetworkImpl->GetGraph(),
2010  backendPreferences,
2011  deviceSpec,
2012  options,
2013  messages);
2014 }
2015 
2016 bool NetworkImpl::GetShapeInferenceMethod()
2017 {
2018  bool shapeInferenceMethod = false;
2019 
2020  ParseOptions(m_NetworkOptions, "ShapeInferenceMethod", [&](std::string name, const BackendOptions::Var& value)
2021  {
2022  if (name == "InferAndValidate")
2023  {
2024  shapeInferenceMethod |= value.AsBool();
2025  }
2026  });
2027  return shapeInferenceMethod;
2028 }
2029 
2030 bool NetworkImpl::GetAllowExpandedDims()
2031 {
2032  bool allowExpandedDims = false;
2033 
2034  ParseOptions(m_NetworkOptions, "AllowExpandedDims", [&](std::string name, const BackendOptions::Var& value)
2035  {
2036  if (name == "AllowExpandedDims")
2037  {
2038  allowExpandedDims |= value.AsBool();
2039  }
2040  });
2041  return allowExpandedDims;
2042 }
2043 
2045 : m_NetworkOptions(networkOptions),
2046  m_Graph(std::make_unique<Graph>(GetShapeInferenceMethod(), GetAllowExpandedDims()))
2047 {}
2048 
2050 {
2051 }
2052 
2054 {
2055  m_Graph->Print();
2056  return Status::Success;
2057 }
2058 
2060 {
2061  return m_Graph->AddLayer<InputLayer>(id, name);
2062 }
2063 
2065  const char* name)
2066 {
2067  return m_Graph->AddLayer<BatchToSpaceNdLayer>(batchToSpaceNdDescriptor, name);
2068 }
2069 
2071 {
2072  return m_Graph->AddLayer<CastLayer>(name);
2073 }
2075  const char* name)
2076 {
2077  return m_Graph->AddLayer<ChannelShuffleLayer>(channelShuffleDescriptor, name);
2078 }
2079 
2081  const char* name)
2082 {
2083  return m_Graph->AddLayer<ComparisonLayer>(comparisonDescriptor, name);
2084 }
2085 
2087  const char* name)
2088 {
2089  return m_Graph->AddLayer<ElementwiseBinaryLayer>(elementwiseBinaryDesc, name);
2090 }
2091 
2093  const char* name)
2094 {
2095  return m_Graph->AddLayer<ElementwiseUnaryLayer>(elementwiseUnaryDescriptor, name);
2096 }
2097 
2099  const char* name)
2100 {
2101  return m_Graph->AddLayer<FillLayer>(fillDescriptor, name);
2102 }
2103 
2105  const char* name)
2106 {
2107  return m_Graph->AddLayer<FullyConnectedLayer>(fullyConnectedDescriptor, name);
2108 }
2109 
2111  const char* name)
2112 {
2113  return m_Graph->AddLayer<ConcatLayer>(concatDescriptor, name);
2114 }
2115 
2117  const char* name)
2118 {
2119  return m_Graph->AddLayer<Convolution2dLayer>(convolution2dDescriptor, name);
2120 }
2121 
2123 {
2124  return m_Graph->AddLayer<ConvertFp16ToFp32Layer>(name);
2125 }
2126 
2128 {
2129  return m_Graph->AddLayer<ConvertFp32ToFp16Layer>(name);
2130 }
2131 
2133  const char* name)
2134 {
2135  return m_Graph->AddLayer<Convolution3dLayer>(convolution3dDescriptor, name);
2136 }
2137 
2139  const char* name)
2140 {
2141  return m_Graph->AddLayer<DepthToSpaceLayer>(depthToSpaceDescriptor, name);
2142 }
2143 
2145  const DepthwiseConvolution2dDescriptor& convolution2dDescriptor,
2146  const char* name)
2147 {
2148  return m_Graph->AddLayer<DepthwiseConvolution2dLayer>(convolution2dDescriptor, name);
2149 }
2150 
2152  const ConstTensor& anchors, const char* name)
2153 {
2154  const auto layer = m_Graph->AddLayer<DetectionPostProcessLayer>(descriptor, name);
2155 
2156  layer->m_Anchors = std::make_shared<ScopedTensorHandle>(anchors);
2157 
2158  return layer;
2159 }
2160 
2162  const char* name)
2163 {
2164  return m_Graph->AddLayer<PermuteLayer>(permuteDescriptor, name);
2165 }
2166 
2168  const char* name)
2169 {
2170  return m_Graph->AddLayer<Pooling2dLayer>(pooling2dDescriptor, name);
2171 }
2172 
2174  const char* name)
2175 {
2176  return m_Graph->AddLayer<Pooling3dLayer>(pooling3dDescriptor, name);
2177 }
2178 
2180  const char* name)
2181 {
2182  return m_Graph->AddLayer<ActivationLayer>(activationDescriptor, name);
2183 }
2184 
2186  const char* name)
2187 {
2188  return m_Graph->AddLayer<ArgMinMaxLayer>(argMinMaxDescriptor, name);
2189 }
2190 
2192 normalizationDescriptor,
2193  const char* name)
2194 {
2195  return m_Graph->AddLayer<NormalizationLayer>(normalizationDescriptor, name);
2196 }
2197 
2198 IConnectableLayer* NetworkImpl::AddSliceLayer(const SliceDescriptor& sliceDescriptor, const char* name)
2199 {
2200  return m_Graph->AddLayer<SliceLayer>(sliceDescriptor, name);
2201 }
2202 
2204  const char* name)
2205 {
2206  return m_Graph->AddLayer<SoftmaxLayer>(softmaxDescriptor, name);
2207 }
2208 
2210  const char* name)
2211 {
2212  return m_Graph->AddLayer<SplitterLayer>(splitterDescriptor, name);
2213 }
2214 
2216 {
2217  return m_Graph->AddLayer<MaximumLayer>(name);
2218 }
2219 
2221 {
2222  return m_Graph->AddLayer<MinimumLayer>(name);
2223 }
2224 
2226 {
2227  return m_Graph->AddLayer<AdditionLayer>(name);
2228 }
2229 
2231 {
2232  return m_Graph->AddLayer<MultiplicationLayer>(name);
2233 }
2234 
2236 {
2237  return m_Graph->AddLayer<OutputLayer>(id, name);
2238 }
2239 
2241  const ConstTensor& mean,
2242  const ConstTensor& variance,
2243  const ConstTensor& beta,
2244  const ConstTensor& gamma,
2245  const char* name)
2246 {
2247  const auto layer = m_Graph->AddLayer<BatchNormalizationLayer>(desc, name);
2248 
2249  layer->m_Mean = std::make_shared<ScopedTensorHandle>(mean);
2250  layer->m_Variance = std::make_shared<ScopedTensorHandle>(variance);
2251  layer->m_Beta = std::make_shared<ScopedTensorHandle>(beta);
2252  layer->m_Gamma = std::make_shared<ScopedTensorHandle>(gamma);
2253 
2254  return layer;
2255 }
2256 
2258 {
2259  return m_Graph->AddLayer<RankLayer>(name);
2260 }
2261 
2263  const char* name)
2264 {
2265  return m_Graph->AddLayer<ReduceLayer>(reduceDescriptor, name);
2266 }
2267 
2268 IConnectableLayer* NetworkImpl::AddResizeLayer(const ResizeDescriptor& resizeDescriptor, const char* name)
2269 {
2270  return m_Graph->AddLayer<ResizeLayer>(resizeDescriptor, name);
2271 }
2272 
2274 {
2275  return m_Graph->AddLayer<ShapeLayer>(name);
2276 }
2277 
2279  const char* name)
2280 {
2281  return m_Graph->AddLayer<InstanceNormalizationLayer>(desc, name);
2282 }
2283 
2285  const char* name)
2286 {
2287  return m_Graph->AddLayer<L2NormalizationLayer>(desc, name);
2288 }
2289 
2291  const char* name)
2292 {
2293  return m_Graph->AddLayer<LogSoftmaxLayer>(desc, name);
2294 }
2295 
2297 {
2298  auto layer = m_Graph->AddLayer<ConstantLayer>(name);
2299 
2300  layer->m_LayerOutput = std::make_shared<ScopedTensorHandle>(input);
2301 
2302  return layer;
2303 }
2304 
2306  const char* name)
2307 {
2308  return m_Graph->AddLayer<ReshapeLayer>(reshapeDescriptor, name);
2309 }
2310 
2312  const char* name)
2313 {
2314  return m_Graph->AddLayer<SpaceToBatchNdLayer>(spaceToBatchNdDescriptor, name);
2315 }
2316 
2318  const char* name)
2319 {
2320  return m_Graph->AddLayer<SpaceToDepthLayer>(spaceToDepthDescriptor, name);
2321 }
2322 
2324 {
2325  return m_Graph->AddLayer<FloorLayer>(name);
2326 }
2327 
2329  const LstmInputParams& params,
2330  const char* name)
2331 {
2332  const auto layer = m_Graph->AddLayer<LstmLayer>(descriptor, name);
2333 
2334  //Lstm Basic Parameters
2336  std::make_shared<ScopedTensorHandle>(*(params.m_InputToForgetWeights));
2337  layer->m_BasicParameters.m_InputToCellWeights =
2338  std::make_shared<ScopedTensorHandle>(*(params.m_InputToCellWeights));
2339  layer->m_BasicParameters.m_InputToOutputWeights =
2340  std::make_shared<ScopedTensorHandle>(*(params.m_InputToOutputWeights));
2341  layer->m_BasicParameters.m_RecurrentToForgetWeights =
2342  std::make_shared<ScopedTensorHandle>(*(params.m_RecurrentToForgetWeights));
2343  layer->m_BasicParameters.m_RecurrentToCellWeights =
2344  std::make_shared<ScopedTensorHandle>(*(params.m_RecurrentToCellWeights));
2345  layer->m_BasicParameters.m_RecurrentToOutputWeights =
2346  std::make_shared<ScopedTensorHandle>(*(params.m_RecurrentToOutputWeights));
2347  layer->m_BasicParameters.m_ForgetGateBias =
2348  std::make_shared<ScopedTensorHandle>(*(params.m_ForgetGateBias));
2349  layer->m_BasicParameters.m_CellBias =
2350  std::make_shared<ScopedTensorHandle>(*(params.m_CellBias));
2351  layer->m_BasicParameters.m_OutputGateBias =
2352  std::make_shared<ScopedTensorHandle>(*(params.m_OutputGateBias));
2353 
2354  //Lstm Cifg parameters
2355  if(!descriptor.m_CifgEnabled)
2356  {
2357  if(params.m_InputToInputWeights == nullptr)
2358  {
2359  throw InvalidArgumentException("AddLstmLayer: Input To Input Weights cannot be NULL "
2360  "when CIFG is disabled.");
2361  }
2362  if(params.m_RecurrentToInputWeights == nullptr)
2363  {
2365  "AddLstmLayer: Recurrent To Input Weights cannot be NULL "
2366  "when CIFG is disabled.");
2367  }
2368  if(params.m_InputGateBias == nullptr)
2369  {
2370  throw InvalidArgumentException("AddLstmLayer: Input Gate Bias cannot be NULL "
2371  "when CIFG is disabled.");
2372  }
2373  layer->m_CifgParameters.m_InputToInputWeights =
2374  std::make_shared<ScopedTensorHandle>(*(params.m_InputToInputWeights));
2375  layer->m_CifgParameters.m_RecurrentToInputWeights =
2376  std::make_shared<ScopedTensorHandle>(*(params.m_RecurrentToInputWeights));
2377  layer->m_CifgParameters.m_InputGateBias =
2378  std::make_shared<ScopedTensorHandle>(*(params.m_InputGateBias));
2379  }
2380 
2381  //Lstm projection parameters
2382  if(descriptor.m_ProjectionEnabled)
2383  {
2384  if(params.m_ProjectionWeights == nullptr)
2385  {
2386  throw InvalidArgumentException("AddLstmLayer: Projection Weights cannot be NULL "
2387  "when projection is enabled.");
2388  }
2389  layer->m_ProjectionParameters.m_ProjectionWeights =
2390  std::make_shared<ScopedTensorHandle>(*(params.m_ProjectionWeights));
2391  if(params.m_ProjectionBias != nullptr)
2392  {
2393  layer->m_ProjectionParameters.m_ProjectionBias =
2394  std::make_shared<ScopedTensorHandle>(*(params.m_ProjectionBias));
2395  }
2396  }
2397 
2398  //Lstm Peephole params
2399  if(descriptor.m_PeepholeEnabled)
2400  {
2401  if(!descriptor.m_CifgEnabled)
2402  {
2403  if(params.m_CellToInputWeights == nullptr)
2404  {
2405  throw InvalidArgumentException("AddLstmLayer: Cell To Input Weights cannot be NULL "
2406  "when Peephole is enabled and CIFG disabled.");
2407  }
2408 
2409  layer->m_PeepholeParameters.m_CellToInputWeights =
2410  std::make_shared<ScopedTensorHandle>(*(params.m_CellToInputWeights));
2411  }
2412 
2413  if(params.m_CellToForgetWeights == nullptr)
2414  {
2415  throw InvalidArgumentException("AddLstmLayer: Cell To Forget Weights cannot be NULL "
2416  "when Peephole is enabled.");
2417  }
2418  if(params.m_CellToOutputWeights == nullptr)
2419  {
2420  throw InvalidArgumentException("AddLstmLayer: Cell To Output Weights cannot be NULL "
2421  "when Peephole is enabled.");
2422  }
2423 
2424  layer->m_PeepholeParameters.m_CellToForgetWeights =
2425  std::make_shared<ScopedTensorHandle>(*(params.m_CellToForgetWeights));
2426  layer->m_PeepholeParameters.m_CellToOutputWeights =
2427  std::make_shared<ScopedTensorHandle>(*(params.m_CellToOutputWeights));
2428  }
2429 
2430  //Lstm Layer Normalization params
2431  if(descriptor.m_LayerNormEnabled)
2432  {
2433  if(!descriptor.m_CifgEnabled)
2434  {
2435  if(params.m_InputLayerNormWeights == nullptr)
2436  {
2437  throw InvalidArgumentException("AddLstmLayer: Input layer normalization weights cannot be NULL "
2438  "when layer normalization is enabled and CIFG disabled.");
2439  }
2440  layer->m_LayerNormParameters.m_InputLayerNormWeights =
2441  std::make_shared<ScopedTensorHandle>(*(params.m_InputLayerNormWeights));
2442  }
2443 
2444  if(params.m_ForgetLayerNormWeights == nullptr)
2445  {
2446  throw InvalidArgumentException("AddLstmLayer: Forget layer normalization weights cannot be NULL "
2447  "when layer normalization is enabled.");
2448  }
2449  if(params.m_CellLayerNormWeights == nullptr)
2450  {
2451  throw InvalidArgumentException("AddLstmLayer: Cell layer normalization weights cannot be NULL "
2452  "when layer normalization is enabled.");
2453  }
2454  if(params.m_OutputLayerNormWeights == nullptr)
2455  {
2456  throw InvalidArgumentException("AddLstmLayer: Output layer normalization weights cannot be NULL "
2457  "when layer normalization is enabled.");
2458  }
2459  layer->m_LayerNormParameters.m_ForgetLayerNormWeights =
2460  std::make_shared<ScopedTensorHandle>(*(params.m_ForgetLayerNormWeights));
2461  layer->m_LayerNormParameters.m_CellLayerNormWeights =
2462  std::make_shared<ScopedTensorHandle>(*(params.m_CellLayerNormWeights));
2463  layer->m_LayerNormParameters.m_OutputLayerNormWeights =
2464  std::make_shared<ScopedTensorHandle>(*(params.m_OutputLayerNormWeights));
2465  }
2466  return layer;
2467 }
2468 
2470 {
2471  return m_Graph->AddLayer<DivisionLayer>(name);
2472 }
2473 
2475 {
2476  return m_Graph->AddLayer<SubtractionLayer>(name);
2477 }
2478 
2479 IConnectableLayer* NetworkImpl::AddMeanLayer(const MeanDescriptor& meanDescriptor, const char* name)
2480 {
2481  return m_Graph->AddLayer<MeanLayer>(meanDescriptor,name);
2482 }
2483 
2484 IConnectableLayer* NetworkImpl::AddPadLayer(const PadDescriptor& padDescriptor, const char* name)
2485 {
2486  return m_Graph->AddLayer<PadLayer>(padDescriptor,name);
2487 }
2488 
2490 {
2491  return m_Graph->AddLayer<QuantizeLayer>(name);
2492 }
2493 
2495 {
2496  return m_Graph->AddLayer<DequantizeLayer>(name);
2497 }
2498 
2500  const char* name)
2501 {
2502  return m_Graph->AddLayer<StridedSliceLayer>(stridedSliceDescriptor, name);
2503 }
2504 
2506  const char* name)
2507 {
2508  return m_Graph->AddLayer<GatherLayer>(gatherDescriptor, name);
2509 }
2510 
2512 {
2513  return m_Graph->AddLayer<GatherNdLayer>(name);
2514 }
2515 
2517 {
2518  return m_Graph->AddLayer<MergeLayer>(name);
2519 }
2520 
2522 {
2523  return m_Graph->AddLayer<SwitchLayer>(name);
2524 }
2525 
2527 {
2528  return m_Graph->AddLayer<PreluLayer>(name);
2529 }
2530 
2532  const ConstTensor& weights,
2533  const Optional<ConstTensor>& biases,
2534  const char* name)
2535 {
2536  if (descriptor.m_BiasEnabled && !biases.has_value())
2537  {
2538  throw InvalidArgumentException("AddTransposeConvolution2dLayer: Biases cannot be empty");
2539  }
2540 
2541  const auto layer = m_Graph->AddLayer<TransposeConvolution2dLayer>(descriptor, name);
2542 
2543  layer->m_Weight = std::make_shared<ScopedTensorHandle>(weights);
2544 
2545  if (descriptor.m_BiasEnabled)
2546  {
2547  layer->m_Bias = std::make_shared<ScopedTensorHandle>(biases.value());
2548  }
2549 
2550  return layer;
2551 }
2552 
2554  const char* name)
2555 {
2556  return m_Graph->AddLayer<TransposeLayer>(transposeDescriptor, name);
2557 }
2558 
2560  const char* name)
2561 {
2562  return m_Graph->AddLayer<StackLayer>(stackDescriptor, name);
2563 }
2564 
2565 
2567  const char* name)
2568 {
2569  return m_Graph->AddLayer<StandInLayer>(desc, name);
2570 }
2571 
2573  const char* name)
2574 {
2575  const auto layer = m_Graph->AddLayer<QuantizedLstmLayer>(name);
2576 
2577  // InputToX weights
2579  std::make_shared<ScopedTensorHandle>(params.GetInputToInputWeights());
2580  layer->m_QuantizedLstmParameters.m_InputToForgetWeights =
2581  std::make_shared<ScopedTensorHandle>(params.GetInputToForgetWeights());
2582  layer->m_QuantizedLstmParameters.m_InputToCellWeights =
2583  std::make_shared<ScopedTensorHandle>(params.GetInputToCellWeights());
2584  layer->m_QuantizedLstmParameters.m_InputToOutputWeights =
2585  std::make_shared<ScopedTensorHandle>(params.GetInputToOutputWeights());
2586 
2587  // RecurrentToX weights
2588  layer->m_QuantizedLstmParameters.m_RecurrentToInputWeights =
2589  std::make_shared<ScopedTensorHandle>(params.GetRecurrentToInputWeights());
2590  layer->m_QuantizedLstmParameters.m_RecurrentToForgetWeights =
2591  std::make_shared<ScopedTensorHandle>(params.GetRecurrentToForgetWeights());
2592  layer->m_QuantizedLstmParameters.m_RecurrentToCellWeights =
2593  std::make_shared<ScopedTensorHandle>(params.GetRecurrentToCellWeights());
2594  layer->m_QuantizedLstmParameters.m_RecurrentToOutputWeights =
2595  std::make_shared<ScopedTensorHandle>(params.GetRecurrentToOutputWeights());
2596 
2597  // Bias
2598  layer->m_QuantizedLstmParameters.m_InputGateBias =
2599  std::make_shared<ScopedTensorHandle>(params.GetInputGateBias());
2600  layer->m_QuantizedLstmParameters.m_ForgetGateBias =
2601  std::make_shared<ScopedTensorHandle>(params.GetForgetGateBias());
2602  layer->m_QuantizedLstmParameters.m_CellBias =
2603  std::make_shared<ScopedTensorHandle>(params.GetCellBias());
2604  layer->m_QuantizedLstmParameters.m_OutputGateBias =
2605  std::make_shared<ScopedTensorHandle>(params.GetOutputGateBias());
2606 
2607  return layer;
2608 }
2609 
2611  const LstmInputParams& params,
2612  const char* name)
2613 {
2614  const auto layer = m_Graph->AddLayer<QLstmLayer>(descriptor, name);
2615 
2616  // QLstm Basic Parameters
2618  std::make_shared<ScopedTensorHandle>(*(params.m_InputToForgetWeights));
2619  layer->m_BasicParameters.m_InputToCellWeights =
2620  std::make_shared<ScopedTensorHandle>(*(params.m_InputToCellWeights));
2621  layer->m_BasicParameters.m_InputToOutputWeights =
2622  std::make_shared<ScopedTensorHandle>(*(params.m_InputToOutputWeights));
2623  layer->m_BasicParameters.m_RecurrentToForgetWeights =
2624  std::make_shared<ScopedTensorHandle>(*(params.m_RecurrentToForgetWeights));
2625  layer->m_BasicParameters.m_RecurrentToCellWeights =
2626  std::make_shared<ScopedTensorHandle>(*(params.m_RecurrentToCellWeights));
2627  layer->m_BasicParameters.m_RecurrentToOutputWeights =
2628  std::make_shared<ScopedTensorHandle>(*(params.m_RecurrentToOutputWeights));
2629  layer->m_BasicParameters.m_ForgetGateBias =
2630  std::make_shared<ScopedTensorHandle>(*(params.m_ForgetGateBias));
2631  layer->m_BasicParameters.m_CellBias =
2632  std::make_shared<ScopedTensorHandle>(*(params.m_CellBias));
2633  layer->m_BasicParameters.m_OutputGateBias =
2634  std::make_shared<ScopedTensorHandle>(*(params.m_OutputGateBias));
2635 
2636  // QLstm Cifg parameters
2637  if(!descriptor.m_CifgEnabled)
2638  {
2639  if(params.m_InputToInputWeights == nullptr)
2640  {
2641  throw InvalidArgumentException("AddQLstmLayer: Input To Input Weights cannot be NULL");
2642  }
2643 
2644  if(params.m_RecurrentToInputWeights == nullptr)
2645  {
2647  "AddQLstmLayer: Recurrent To Input Weights cannot be NULL");
2648  }
2649 
2650  if(params.m_InputGateBias == nullptr)
2651  {
2652  throw InvalidArgumentException("AddQLstmLayer: Input Gate Bias cannot be NULL");
2653  }
2654 
2655  layer->m_CifgParameters.m_InputToInputWeights =
2656  std::make_shared<ScopedTensorHandle>(*(params.m_InputToInputWeights));
2657  layer->m_CifgParameters.m_RecurrentToInputWeights =
2658  std::make_shared<ScopedTensorHandle>(*(params.m_RecurrentToInputWeights));
2659  layer->m_CifgParameters.m_InputGateBias =
2660  std::make_shared<ScopedTensorHandle>(*(params.m_InputGateBias));
2661  }
2662 
2663  // QLstm Projection parameters
2664  if(descriptor.m_ProjectionEnabled)
2665  {
2666  if(params.m_ProjectionWeights == nullptr)
2667  {
2668  throw InvalidArgumentException("AddQLstmLayer: Projection Weights cannot be NULL");
2669  }
2670 
2671  layer->m_ProjectionParameters.m_ProjectionWeights =
2672  std::make_shared<ScopedTensorHandle>(*(params.m_ProjectionWeights));
2673 
2674  // Projection bias is optional even if projection is enabled
2675  if(params.m_ProjectionBias != nullptr)
2676  {
2677  layer->m_ProjectionParameters.m_ProjectionBias =
2678  std::make_shared<ScopedTensorHandle>(*(params.m_ProjectionBias));
2679  }
2680 
2681  }
2682 
2683  // QLstm Peephole params
2684  if(descriptor.m_PeepholeEnabled)
2685  {
2686  if(params.m_CellToForgetWeights == nullptr)
2687  {
2688  throw InvalidArgumentException("AddQLstmLayer: Cell To Forget Weights cannot be NULL");
2689  }
2690 
2691  if(params.m_CellToOutputWeights == nullptr)
2692  {
2693  throw InvalidArgumentException("AddQLstmLayer: Cell To Output Weights cannot be NULL");
2694  }
2695 
2696  if(!descriptor.m_CifgEnabled)
2697  {
2698  if(params.m_CellToInputWeights == nullptr)
2699  {
2700  throw InvalidArgumentException("AddQLstmLayer: Cell To Input Weights cannot be NULL");
2701  }
2702 
2703  layer->m_PeepholeParameters.m_CellToInputWeights =
2704  std::make_shared<ScopedTensorHandle>(*(params.m_CellToInputWeights));
2705  }
2706 
2707  layer->m_PeepholeParameters.m_CellToForgetWeights =
2708  std::make_shared<ScopedTensorHandle>(*(params.m_CellToForgetWeights));
2709  layer->m_PeepholeParameters.m_CellToOutputWeights =
2710  std::make_shared<ScopedTensorHandle>(*(params.m_CellToOutputWeights));
2711  }
2712 
2713  // QLstm Layer Normalization params
2714  if(descriptor.m_LayerNormEnabled)
2715  {
2716  if(params.m_ForgetLayerNormWeights == nullptr)
2717  {
2718  throw InvalidArgumentException("AddQLstmLayer: Forget layer normalization weights cannot be NULL");
2719  }
2720 
2721  if(params.m_CellLayerNormWeights == nullptr)
2722  {
2723  throw InvalidArgumentException("AddQLstmLayer: Cell layer normalization weights cannot be NULL");
2724  }
2725 
2726  if(params.m_OutputLayerNormWeights == nullptr)
2727  {
2728  throw InvalidArgumentException("AddQLstmLayer: Output layer normalization weights cannot be NULL");
2729  }
2730 
2731  if(!descriptor.m_CifgEnabled)
2732  {
2733  if(params.m_InputLayerNormWeights == nullptr)
2734  {
2735  throw InvalidArgumentException("AddQLstmLayer: Input layer normalization weights cannot be NULL");
2736  }
2737 
2738  layer->m_LayerNormParameters.m_InputLayerNormWeights =
2739  std::make_shared<ScopedTensorHandle>(*(params.m_InputLayerNormWeights));
2740  }
2741 
2742  layer->m_LayerNormParameters.m_ForgetLayerNormWeights =
2743  std::make_shared<ScopedTensorHandle>(*(params.m_ForgetLayerNormWeights));
2744  layer->m_LayerNormParameters.m_CellLayerNormWeights =
2745  std::make_shared<ScopedTensorHandle>(*(params.m_CellLayerNormWeights));
2746  layer->m_LayerNormParameters.m_OutputLayerNormWeights =
2747  std::make_shared<ScopedTensorHandle>(*(params.m_OutputLayerNormWeights));
2748  }
2749  return layer;
2750 }
2751 
2753  const char* name)
2754 {
2755  return m_Graph->AddLayer<LogicalBinaryLayer>(logicalBinaryDescriptor, name);
2756 }
2757 
2759  const UnidirectionalSequenceLstmDescriptor& descriptor,
2760  const LstmInputParams& params,
2761  const char* name)
2762 {
2763  const auto layer = m_Graph->AddLayer<UnidirectionalSequenceLstmLayer>(descriptor, name);
2764 
2765  //Lstm Basic Parameters
2767  std::make_shared<ScopedTensorHandle>(*(params.m_InputToForgetWeights));
2768  layer->m_BasicParameters.m_InputToCellWeights =
2769  std::make_shared<ScopedTensorHandle>(*(params.m_InputToCellWeights));
2770  layer->m_BasicParameters.m_InputToOutputWeights =
2771  std::make_shared<ScopedTensorHandle>(*(params.m_InputToOutputWeights));
2772  layer->m_BasicParameters.m_RecurrentToForgetWeights =
2773  std::make_shared<ScopedTensorHandle>(*(params.m_RecurrentToForgetWeights));
2774  layer->m_BasicParameters.m_RecurrentToCellWeights =
2775  std::make_shared<ScopedTensorHandle>(*(params.m_RecurrentToCellWeights));
2776  layer->m_BasicParameters.m_RecurrentToOutputWeights =
2777  std::make_shared<ScopedTensorHandle>(*(params.m_RecurrentToOutputWeights));
2778  layer->m_BasicParameters.m_ForgetGateBias =
2779  std::make_shared<ScopedTensorHandle>(*(params.m_ForgetGateBias));
2780  layer->m_BasicParameters.m_CellBias =
2781  std::make_shared<ScopedTensorHandle>(*(params.m_CellBias));
2782  layer->m_BasicParameters.m_OutputGateBias =
2783  std::make_shared<ScopedTensorHandle>(*(params.m_OutputGateBias));
2784 
2785  //Lstm Cifg parameters
2786  if(!descriptor.m_CifgEnabled)
2787  {
2788  if(params.m_InputToInputWeights == nullptr)
2789  {
2790  throw InvalidArgumentException("AddUnidirectionalSequenceLstmLayer: Input To Input Weights cannot be NULL "
2791  "when CIFG is disabled.");
2792  }
2793  if(params.m_RecurrentToInputWeights == nullptr)
2794  {
2796  "AddUnidirectionalSequenceLstmLayer: Recurrent To Input Weights cannot be NULL "
2797  "when CIFG is disabled.");
2798  }
2799  if(params.m_InputGateBias == nullptr)
2800  {
2801  throw InvalidArgumentException("AddUnidirectionalSequenceLstmLayer: Input Gate Bias cannot be NULL "
2802  "when CIFG is disabled.");
2803  }
2804  layer->m_CifgParameters.m_InputToInputWeights =
2805  std::make_shared<ScopedTensorHandle>(*(params.m_InputToInputWeights));
2806  layer->m_CifgParameters.m_RecurrentToInputWeights =
2807  std::make_shared<ScopedTensorHandle>(*(params.m_RecurrentToInputWeights));
2808  layer->m_CifgParameters.m_InputGateBias =
2809  std::make_shared<ScopedTensorHandle>(*(params.m_InputGateBias));
2810  }
2811 
2812  //Lstm projection parameters
2813  if(descriptor.m_ProjectionEnabled)
2814  {
2815  if(params.m_ProjectionWeights == nullptr)
2816  {
2817  throw InvalidArgumentException("AddUnidirectionalSequenceLstmLayer: Projection Weights cannot be NULL "
2818  "when projection is enabled.");
2819  }
2820  layer->m_ProjectionParameters.m_ProjectionWeights =
2821  std::make_shared<ScopedTensorHandle>(*(params.m_ProjectionWeights));
2822  if(params.m_ProjectionBias != nullptr)
2823  {
2824  layer->m_ProjectionParameters.m_ProjectionBias =
2825  std::make_shared<ScopedTensorHandle>(*(params.m_ProjectionBias));
2826  }
2827  }
2828 
2829  //Lstm Peephole params
2830  if(descriptor.m_PeepholeEnabled)
2831  {
2832  if(!descriptor.m_CifgEnabled)
2833  {
2834  if(params.m_CellToInputWeights == nullptr)
2835  {
2836  throw InvalidArgumentException("AddUnidirectionalSequenceLstmLayer: Cell To Input Weights "
2837  "cannot be NULL when Peephole is enabled and CIFG disabled.");
2838  }
2839 
2840  layer->m_PeepholeParameters.m_CellToInputWeights =
2841  std::make_shared<ScopedTensorHandle>(*(params.m_CellToInputWeights));
2842  }
2843 
2844  if(params.m_CellToForgetWeights == nullptr)
2845  {
2846  throw InvalidArgumentException("AddUnidirectionalSequenceLstmLayer: Cell To Forget Weights cannot be NULL "
2847  "when Peephole is enabled.");
2848  }
2849  if(params.m_CellToOutputWeights == nullptr)
2850  {
2851  throw InvalidArgumentException("AddUnidirectionalSequenceLstmLayer: Cell To Output Weights cannot be NULL "
2852  "when Peephole is enabled.");
2853  }
2854 
2855  layer->m_PeepholeParameters.m_CellToForgetWeights =
2856  std::make_shared<ScopedTensorHandle>(*(params.m_CellToForgetWeights));
2857  layer->m_PeepholeParameters.m_CellToOutputWeights =
2858  std::make_shared<ScopedTensorHandle>(*(params.m_CellToOutputWeights));
2859  }
2860 
2861  //Lstm Layer Normalization params
2862  if(descriptor.m_LayerNormEnabled)
2863  {
2864  if(!descriptor.m_CifgEnabled)
2865  {
2866  if(params.m_InputLayerNormWeights == nullptr)
2867  {
2868  throw InvalidArgumentException("AddUnidirectionalSequenceLstmLayer: Input layer normalization weights "
2869  "cannot be NULL when layer normalization is enabled and CIFG disabled.");
2870  }
2871  layer->m_LayerNormParameters.m_InputLayerNormWeights =
2872  std::make_shared<ScopedTensorHandle>(*(params.m_InputLayerNormWeights));
2873  }
2874 
2875  if(params.m_ForgetLayerNormWeights == nullptr)
2876  {
2877  throw InvalidArgumentException("AddUnidirectionalSequenceLstmLayer: Forget layer normalization weights "
2878  "cannot be NULL when layer normalization is enabled.");
2879  }
2880  if(params.m_CellLayerNormWeights == nullptr)
2881  {
2882  throw InvalidArgumentException("AddUnidirectionalSequenceLstmLayer: Cell layer normalization weights "
2883  "cannot be NULL when layer normalization is enabled.");
2884  }
2885  if(params.m_OutputLayerNormWeights == nullptr)
2886  {
2887  throw InvalidArgumentException("AddUnidirectionalSequenceLstmLayer: Output layer normalization weights "
2888  "cannot be NULL when layer normalization is enabled.");
2889  }
2890  layer->m_LayerNormParameters.m_ForgetLayerNormWeights =
2891  std::make_shared<ScopedTensorHandle>(*(params.m_ForgetLayerNormWeights));
2892  layer->m_LayerNormParameters.m_CellLayerNormWeights =
2893  std::make_shared<ScopedTensorHandle>(*(params.m_CellLayerNormWeights));
2894  layer->m_LayerNormParameters.m_OutputLayerNormWeights =
2895  std::make_shared<ScopedTensorHandle>(*(params.m_OutputLayerNormWeights));
2896  }
2897  return layer;
2898 }
2899 
2901 {
2902  return m_Graph->AddLayer<BatchMatMulLayer>(desc, name);
2903 }
2904 
2906  CompiledBlobPtr compiledBlobPtr,
2907  const Optional<BackendId>& backend,
2908  const char* name)
2909 {
2910  // Method use is for backend users.
2911  PreCompiledLayer* layer;
2912  if (name)
2913  {
2914  layer = m_Graph->AddLayer<PreCompiledLayer>(preCompiledDescriptor, name);
2915  }
2916  else
2917  {
2918  layer = m_Graph->AddLayer<PreCompiledLayer>(preCompiledDescriptor, "pre-compiled");
2919  }
2920 
2921  // Assign the pre-compiled object to layer
2922  // Pass only one compiled network, Arm NN does not handle multiple
2923  // pre-compiled objects in a single pre-compiled layer currently
2924  layer->SetPreCompiledObject(std::move(compiledBlobPtr));
2925 
2926  if (backend.has_value())
2927  {
2928  layer->SetBackendId(backend.value());
2929  }
2930  else if (layer->GetBackendHint().has_value())
2931  {
2932  layer->SetBackendId(layer->GetBackendHint().value());
2933  }
2934 
2935  return layer;
2936 }
2937 
2939 {
2940  for (auto layer : GetGraph())
2941  {
2942  layer->ExecuteStrategy(strategy);
2943  };
2944 }
2945 
2947  : m_Graph(new Graph(*other.m_Graph.get()))
2948  , m_Guid(arm::pipe::IProfilingService::GetNextGuid())
2949  , m_ModelOptions(modelOptions)
2950 {
2951 }
2952 
2953 OptimizedNetworkImpl::OptimizedNetworkImpl(std::unique_ptr<Graph> graph)
2954  : m_Graph(std::move(graph)), m_Guid(arm::pipe::IProfilingService::GetNextGuid())
2955 {
2956 }
2957 
2958 OptimizedNetworkImpl::OptimizedNetworkImpl(std::unique_ptr<Graph> graph, const ModelOptions& modelOptions)
2959  : m_Graph(std::move(graph)), m_Guid(arm::pipe::IProfilingService::GetNextGuid()), m_ModelOptions(modelOptions)
2960 {
2961 }
2962 
2964 {
2965 }
2966 
2968 {
2969  pOptimizedNetworkImpl->ExecuteStrategy(strategy);
2970 }
2971 
2973 {
2974  for (auto layer : GetGraph())
2975  {
2976  layer->ExecuteStrategy(strategy);
2977  };
2978 }
2979 
2980 } // namespace armnn
armnn::optimizations::InsertDebugToFileLayer
OptimizeForType< Layer, AddDebugToFileImpl > InsertDebugToFileLayer
Definition: AddDebug.hpp:54
armnn::Graph::InferTensorInfos
void InferTensorInfos()
Definition: Graph.cpp:568
armnn::INetwork::AddConvolution2dLayer
IConnectableLayer * AddConvolution2dLayer(const Convolution2dDescriptor &convolution2dDescriptor, const char *name=nullptr)
Adds a 2D convolution layer to the network.
Definition: Network.cpp:271
armnn::optimizations::OptimizeInverseConversionsFp16
OptimizeForConnection< ConvertFp16ToFp32Layer, ConvertFp32ToFp16Layer, OptimizeInverseConversionsImpl > OptimizeInverseConversionsFp16
Definition: OptimizeInverseConversions.hpp:42
armnn::QuantizedLstmInputParams::GetInputToCellWeights
const ConstTensor & GetInputToCellWeights() const
Definition: QuantizedLstmParams.hpp:68
armnn::BatchNormalizationLayer::m_Mean
std::shared_ptr< ConstTensorHandle > m_Mean
A unique pointer to store Mean values.
Definition: BatchNormalizationLayer.hpp:19
armnn::SelectTensorHandleStrategy
OptimizationResult SelectTensorHandleStrategy(Graph &optGraph, BackendsMap &backends, TensorHandleFactoryRegistry &registry, bool importEnabled, bool exportEnabled, Optional< std::vector< std::string > & > errMessages)
Definition: Network.cpp:1702
armnn::LstmInputParams::m_CellToForgetWeights
const ConstTensor * m_CellToForgetWeights
Definition: LstmParams.hpp:49
armnn::OptimizerOptionsOpaque
Definition: INetwork.hpp:260
armnn::NetworkImpl::AddMergeLayer
IConnectableLayer * AddMergeLayer(const char *name=nullptr)
Definition: Network.cpp:2516
armnn::INetwork::AddDepthwiseConvolution2dLayer
IConnectableLayer * AddDepthwiseConvolution2dLayer(const DepthwiseConvolution2dDescriptor &convolution2dDescriptor, const char *name=nullptr)
Adds a 2D depthwise convolution layer to the network.
Definition: Network.cpp:291
armnn::LayerType::MemCopy
@ MemCopy
armnn::NetworkImpl::AddPrecompiledLayer
IConnectableLayer * AddPrecompiledLayer(const PreCompiledDescriptor &preCompiledDescriptor, CompiledBlobPtr compiledBlobPtr, const Optional< BackendId > &backend, const char *name=nullptr)
Definition: Network.cpp:2905
armnn::Graph::GetProfiler
const std::shared_ptr< IProfiler > & GetProfiler() const
Definition: Graph.cpp:656
armnn::BackendId
Definition: BackendId.hpp:75
armnn::OptimizerOptionsOpaque::GetDebugEnabled
bool GetDebugEnabled() const
Definition: Network.cpp:180
armnn::NetworkImpl::AddResizeLayer
IConnectableLayer * AddResizeLayer(const ResizeDescriptor &resizeDescriptor, const char *name=nullptr)
Definition: Network.cpp:2268
armnn::NetworkImpl::AddQuantizedLstmLayer
IConnectableLayer * AddQuantizedLstmLayer(const QuantizedLstmInputParams &params, const char *name=nullptr)
Definition: Network.cpp:2572
armnn::PreluLayer
Definition: PreluLayer.hpp:14
armnn::NetworkImpl::AddElementwiseUnaryLayer
IConnectableLayer * AddElementwiseUnaryLayer(const ElementwiseUnaryDescriptor &elementwiseUnaryDescriptor, const char *name=nullptr)
Definition: Network.cpp:2092
armnn::ElementwiseBinaryLayer
This layer represents a elementwiseBinary operation.
Definition: ElementwiseBinaryLayer.hpp:14
armnn::OutputSlot::SetTensorHandleFactory
void SetTensorHandleFactory(const ITensorHandleFactory::FactoryId &id)
Definition: Layer.cpp:200
armnn::LayerType::Softmax
@ Softmax
armnn::IOptimizedNetwork::GetProfiler
const std::shared_ptr< IProfiler > & GetProfiler() const
Definition: Network.cpp:691
armnn::QuantizedLstmInputParams::GetRecurrentToForgetWeights
const ConstTensor & GetRecurrentToForgetWeights() const
Definition: QuantizedLstmParams.hpp:83
armnn::QuantizedLstmInputParams::GetInputToForgetWeights
const ConstTensor & GetInputToForgetWeights() const
Definition: QuantizedLstmParams.hpp:63
armnn::BackendOptions::BackendOption::GetValue
Var GetValue() const
Definition: BackendOptions.hpp:252
armnn::Graph::Iterator
LayerList::const_iterator Iterator
Definition: Graph.hpp:53
armnn::ScopedTensorHandle
Definition: TensorHandle.hpp:115
armnn::EdgeStrategy::DirectCompatibility
@ DirectCompatibility
No strategy has been defined. Used internally to verify integrity of optimizations.
armnn::ArgMinMaxLayer
This layer represents a ArgMinMax operation.
Definition: ArgMinMaxLayer.hpp:14
armnn::EdgeStrategy::Undefined
@ Undefined
armnn::RankLayer
Definition: RankLayer.hpp:13
armnn::BackendRegistryInstance
BackendRegistry & BackendRegistryInstance()
Definition: BackendRegistry.cpp:15
armnn::NetworkImpl::AddDepthToSpaceLayer
IConnectableLayer * AddDepthToSpaceLayer(const DepthToSpaceDescriptor &depthToSpaceDescriptor, const char *name=nullptr)
Definition: Network.cpp:2138
armnn::OptimizedNetworkImpl::OptimizedNetworkImpl
OptimizedNetworkImpl(const OptimizedNetworkImpl &other, const ModelOptions &modelOptions)
Definition: Network.cpp:2946
armnn::NetworkImpl::AddNormalizationLayer
IConnectableLayer * AddNormalizationLayer(const NormalizationDescriptor &normalizationDescriptor, const char *name=nullptr)
Definition: Network.cpp:2191
armnn::optimizations::FoldPadIntoConvolution2d
OptimizeForExclusiveConnection< PadLayer, Convolution2dLayer, pad_fold::FoldPadIntoConvolution2dImpl > FoldPadIntoConvolution2d
Definition: FoldPadIntoLayer2d.hpp:254
armnn::Layer::GetNumOutputSlots
unsigned int GetNumOutputSlots() const override
Returns the number of connectable output slots.
Definition: Layer.hpp:322
armnn::INetwork::AddFloorLayer
IConnectableLayer * AddFloorLayer(const char *name=nullptr)
Adds a floor layer to the network.
Definition: Network.cpp:485
armnn::NetworkImpl::AddBatchToSpaceNdLayer
IConnectableLayer * AddBatchToSpaceNdLayer(const BatchToSpaceNdDescriptor &batchToSpaceNdDescriptor, const char *name=nullptr)
Definition: Network.cpp:2064
armnn::DataType::QAsymmU8
@ QAsymmU8
armnn::ConstantLayer
A layer that the constant data can be bound to.
Definition: ConstantLayer.hpp:15
armnn::GatherDescriptor
A GatherDescriptor for the GatherLayer.
Definition: Descriptors.hpp:932
armnn::NormalizationDescriptor
A NormalizationDescriptor for the NormalizationLayer.
Definition: Descriptors.hpp:757
armnn::TensorInfo::SetDataType
void SetDataType(DataType type)
Definition: Tensor.hpp:199
armnn::ITensorHandleFactory::DeferredFactoryId
static const FactoryId DeferredFactoryId
Use the workload factory to create the tensor handle.
Definition: ITensorHandleFactory.hpp:51
armnn::TransposeDescriptor
A TransposeDescriptor for the TransposeLayer.
Definition: Descriptors.hpp:1457
armnn::BackendId::Get
const std::string & Get() const
Definition: BackendId.hpp:138
armnn::OptimizerOptionsOpaque::GetDebugToFileEnabled
bool GetDebugToFileEnabled() const
Definition: Network.cpp:185
armnn::OutputSlot
Definition: Layer.hpp:87
armnn::SubgraphViewSelector::Subgraphs
std::vector< SubgraphView::SubgraphViewPtr > Subgraphs
Definition: SubgraphViewSelector.hpp:24
IBackendInternal.hpp
armnn::INetwork::AddConstantLayer
IConnectableLayer * AddConstantLayer(const ConstTensor &input, const char *name=nullptr)
Adds a layer with no inputs and a single output, which always corresponds to the passed in constant t...
Definition: Network.cpp:461
armnn::optimizations::FusePermuteIntoConstLayer
OptimizeForConnection< ConstantLayer, PermuteLayer, ConvertConstPermuteLayersToConstLayers > FusePermuteIntoConstLayer
Definition: ConvertConstPermuteLayersToConstLayers.hpp:124
armnn::InsertConvertFp32ToFp16LayersAfter
std::vector< ConvertFp32ToFp16Layer * > InsertConvertFp32ToFp16LayersAfter(Graph &graph, Layer &layer)
Definition: NetworkUtils.cpp:79
armnn::NetworkImpl::ExecuteStrategy
void ExecuteStrategy(IStrategy &strategy) const
Definition: Network.cpp:2938
armnn::INetwork::AddTransposeConvolution2dLayer
IConnectableLayer * AddTransposeConvolution2dLayer(const TransposeConvolution2dDescriptor &descriptor, const ConstTensor &weights, const Optional< ConstTensor > &biases, const char *name=nullptr)
Adds a 2D transpose convolution layer to the network.
Definition: Network.cpp:572
armnn::BatchNormalizationLayer
This layer represents a batch normalization operation.
Definition: BatchNormalizationLayer.hpp:15
armnn::IOptimizedNetworkPtr
std::unique_ptr< IOptimizedNetwork, void(*)(IOptimizedNetwork *network)> IOptimizedNetworkPtr
Definition: INetwork.hpp:328
armnn::ElementwiseUnaryDescriptor
A ElementwiseUnaryDescriptor for the ElementwiseUnaryLayer.
Definition: Descriptors.hpp:129
armnn::OptimizeForType
Definition: Optimization.hpp:67
armnn::NetworkImpl::AddPooling2dLayer
IConnectableLayer * AddPooling2dLayer(const Pooling2dDescriptor &pooling2dDescriptor, const char *name=nullptr)
Definition: Network.cpp:2167
armnn::PadDescriptor
A PadDescriptor for the PadLayer.
Definition: Descriptors.hpp:1163
armnn::SoftmaxDescriptor
A SoftmaxDescriptor for the SoftmaxLayer.
Definition: Descriptors.hpp:177
armnn::SubgraphViewSelector::SelectSubgraphs
static Subgraphs SelectSubgraphs(Graph &graph, const LayerSelectorFunction &selector)
Selects subgraphs from a graph based on the selector function and the algorithm.
Definition: SubgraphViewSelector.cpp:259
armnn::NetworkImpl::AddConvolution2dLayer
IConnectableLayer * AddConvolution2dLayer(const Convolution2dDescriptor &convolution2dDescriptor, const char *name=nullptr)
Definition: Network.cpp:2116
armnn::INetwork::pNetworkImpl
std::unique_ptr< NetworkImpl > pNetworkImpl
Definition: INetwork.hpp:849
armnn::LayerType::ConvertFp32ToFp16
@ ConvertFp32ToFp16
armnn::optimizations::MoveTransposeUp
OptimizeForConnection< Layer, TransposeLayer, MoveTransposeUpImpl > MoveTransposeUp
Definition: MoveTransposeUp.hpp:83
armnn::BackendSettings::m_PreferredBackends
BackendIdVector m_PreferredBackends
Definition: BackendSettings.hpp:20
armnn::OptimizerOptions::m_AllowExpandedDims
bool m_AllowExpandedDims
When calculating tensor sizes, dimensions of size == 1 will be ignored.
Definition: INetwork.hpp:253
armnn::StackDescriptor
A StackDescriptor for the StackLayer.
Definition: Descriptors.hpp:1218
armnn::INetwork::AddPooling3dLayer
IConnectableLayer * AddPooling3dLayer(const Pooling3dDescriptor &pooling3dDescriptor, const char *name=nullptr)
Adds a 3D pooling layer to the network.
Definition: Network.cpp:355
armnn::FillLayer
This layer represents a fill operation.
Definition: FillLayer.hpp:13
armnn::SliceDescriptor
A SliceDescriptor for the SliceLayer.
Definition: Descriptors.hpp:1195
armnn::InputSlot::GetConnectedOutputSlot
const OutputSlot * GetConnectedOutputSlot() const
Definition: Layer.hpp:56
armnn::INetwork::AddDivisionLayer
IConnectableLayer * AddDivisionLayer(const char *name=nullptr)
Adds a division layer to the network.
Definition: Network.cpp:501
armnn::IOptimizedNetwork::SerializeToDot
Status SerializeToDot(std::ostream &stream) const
Definition: Network.cpp:686
armnn::BackendSettings::GetAvailablePreferredBackends
BackendIdVector GetAvailablePreferredBackends() const
Definition: BackendSettings.hpp:67
armnn::OptimizerOptions::m_ExportEnabled
bool m_ExportEnabled
Enable Export.
Definition: INetwork.hpp:250
armnn::OptimizerOptions::m_ReduceFp32ToFp16
bool m_ReduceFp32ToFp16
Reduces all Fp32 operators in the model to Fp16 for faster processing.
Definition: INetwork.hpp:225
armnn::DataType::Float16
@ Float16
armnn::INetwork::CreateRaw
static INetwork * CreateRaw(const NetworkOptions &networkOptions={})
Definition: Network.cpp:647
armnn::Optimizer::Pass
static void Pass(Graph &graph, const Optimizations &optimizations)
Definition: Optimizer.cpp:16
armnn::ReturnWithError
OptimizationResult ReturnWithError(OptimizationResult res, const Layer *layer, const BackendSettings &backendSettings, Optional< std::vector< std::string > & > errMessages)
Definition: Network.cpp:756
armnn::LayerType::Input
@ Input
armnnUtils::Filesystem::CreateDirectory
std::string CreateDirectory(std::string sPath)
Returns full path to temporary folder.
Definition: Filesystem.cpp:47
armnn::INetwork::AddQLstmLayer
IConnectableLayer * AddQLstmLayer(const QLstmDescriptor &descriptor, const LstmInputParams &params, const char *name=nullptr)
Add a QLstm layer to the network.
Definition: Network.cpp:609
armnn::INetwork::AddLogSoftmaxLayer
IConnectableLayer * AddLogSoftmaxLayer(const LogSoftmaxDescriptor &logSoftmaxDescriptor, const char *name=nullptr)
Adds a log softmax layer to the network.
Definition: Network.cpp:455
armnn::BackendsMap
std::map< BackendId, std::unique_ptr< class IBackendInternal > > BackendsMap
Definition: Network.hpp:271
armnn::SliceLayer
Definition: SliceLayer.hpp:13
armnn::LayerBindingId
int LayerBindingId
Type of identifiers for bindable layers (inputs, outputs).
Definition: Types.hpp:301
armnn::ITensorHandleFactory::LegacyFactoryId
static const FactoryId LegacyFactoryId
Definition: ITensorHandleFactory.hpp:50
armnn::ActivationDescriptor
An ActivationDescriptor for the ActivationLayer.
Definition: Descriptors.hpp:36
armnn::ShapeInferenceMethod::ValidateOnly
@ ValidateOnly
Validate all output shapes.
armnn::NetworkImpl::AddInstanceNormalizationLayer
IConnectableLayer * AddInstanceNormalizationLayer(const InstanceNormalizationDescriptor &desc, const char *name=nullptr)
Definition: Network.cpp:2278
armnn::TensorHandleFactoryRegistry
Definition: TensorHandleFactoryRegistry.hpp:23
armnn::optimizations::OptimizeInverseConversionsFp32
OptimizeForConnection< ConvertFp32ToFp16Layer, ConvertFp16ToFp32Layer, OptimizeInverseConversionsImpl > OptimizeInverseConversionsFp32
Definition: OptimizeInverseConversions.hpp:44
armnn::LstmInputParams::m_RecurrentToOutputWeights
const ConstTensor * m_RecurrentToOutputWeights
Definition: LstmParams.hpp:47
armnn::ITensorHandleFactory::SupportsMapUnmap
virtual bool SupportsMapUnmap() const
Definition: ITensorHandleFactory.hpp:88
armnn::IConnectableLayer
Interface for a layer that is connectable to other layers via InputSlots and OutputSlots.
Definition: INetwork.hpp:68
armnn::NetworkImpl::AddRankLayer
IConnectableLayer * AddRankLayer(const char *name=nullptr)
Definition: Network.cpp:2257
armnn::LstmDescriptor
An LstmDescriptor for the LstmLayer.
Definition: Descriptors.hpp:1069
armnn::SplitterLayer
This layer represents a split operation.
Definition: SplitterLayer.hpp:13
armnn::SpaceToBatchNdLayer
This layer represents a SpaceToBatchNd operation.
Definition: SpaceToBatchNdLayer.hpp:14
armnn::FullyConnectedDescriptor
A FullyConnectedDescriptor for the FullyConnectedLayer.
Definition: Descriptors.hpp:495
armnn::OutputSlot::SetTensorInfo
void SetTensorInfo(const TensorInfo &tensorInfo) override
Definition: Layer.cpp:87
armnn::OptimizerOptionsOpaque::OptimizerOptionsOpaque
OptimizerOptionsOpaque()
Definition: Network.cpp:48
armnn::NetworkImpl::PrintGraph
Status PrintGraph()
Definition: Network.cpp:2053
armnn::InputLayer
A layer user-provided data can be bound to (e.g. inputs, outputs).
Definition: InputLayer.hpp:13
armnn::OptimizerOptions::m_ModelOptions
ModelOptions m_ModelOptions
Enable Model Options.
Definition: INetwork.hpp:244
armnn::CalculateSlotOptionForOutput
ITensorHandleFactory::FactoryId CalculateSlotOptionForOutput(BackendsMap &backends, OutputSlot &slot, TensorHandleFactoryRegistry &registry)
Definition: Network.cpp:1453
armnn::ITensorHandleFactory::GetImportFlags
virtual MemorySourceFlags GetImportFlags() const
Definition: ITensorHandleFactory.hpp:91
armnn::IBackendInternal
Definition: IBackendInternal.hpp:77
armnn::NetworkImpl::AddMeanLayer
IConnectableLayer * AddMeanLayer(const MeanDescriptor &meanDescriptor, const char *name=nullptr)
Definition: Network.cpp:2479
armnn::ParseOptions
void ParseOptions(const std::vector< BackendOptions > &options, BackendId backend, F f)
Definition: BackendOptions.hpp:297
armnn::IOptimizedNetwork
Definition: INetwork.hpp:862
armnn::AttemptBackendAssignment
OptimizationResult AttemptBackendAssignment(BackendSettings &backendSettings, Graph &graph, Layer *layer, BackendId backend, DataType dataTypeIn, DataType dataTypeOut, const std::vector< BackendId > &availablePreferredBackends, std::string &reasonIfUnsupported, Optional< std::vector< std::string > & > errMessages)
Definition: Network.cpp:808
armnn::Layer::SetBackendId
void SetBackendId(const BackendId &id) override
Set the backend of the IConnectableLayer.
Definition: Layer.hpp:278
armnn::NetworkImpl::AddGatherNdLayer
IConnectableLayer * AddGatherNdLayer(const char *name=nullptr)
Definition: Network.cpp:2511
armnn::OptimizerOptionsOpaque::GetShapeInferenceMethod
armnn::ShapeInferenceMethod GetShapeInferenceMethod() const
Definition: Network.cpp:200
armnn::SubgraphView::beginIConnectable
IConnectableLayerIterator beginIConnectable()
Definition: SubgraphView.cpp:324
armnn::ApplyBackendOptimizations
OptimizationResult ApplyBackendOptimizations(OptimizedNetworkImpl *optNetObjPtr, BackendSettings &backendSettings, BackendsMap &backends, const ModelOptions &modelOptions, Optional< std::vector< std::string > & > errMessages)
Definition: Network.cpp:1240
armnn::INetwork::AddDetectionPostProcessLayer
IConnectableLayer * AddDetectionPostProcessLayer(const DetectionPostProcessDescriptor &descriptor, const ConstTensor &anchors, const char *name=nullptr)
Adds a Detection PostProcess layer to the network.
Definition: Network.cpp:305
armnn::INetwork::AddSubtractionLayer
IConnectableLayer * AddSubtractionLayer(const char *name=nullptr)
Adds a subtraction layer to the network.
Definition: Network.cpp:508
armnn::BackendSettings::m_SelectedBackends
BackendIdSet m_SelectedBackends
Definition: BackendSettings.hpp:22
armnn::BatchMatMulDescriptor
A BatchMatMulDescriptor for the BatchMatMul operator.
Definition: Descriptors.hpp:1551
armnn::QLstmLayer
This layer represents a QLstm operation.
Definition: QLstmLayer.hpp:79
armnn::Compute::CpuAcc
@ CpuAcc
CPU Execution: NEON: ArmCompute.
armnn::TransposeLayer
This layer represents a transpose operation.
Definition: TransposeLayer.hpp:15
armnn::Compute::GpuAcc
@ GpuAcc
GPU Execution: OpenCL: ArmCompute.
armnn::ResizeDescriptor
A ResizeDescriptor for the ResizeLayer.
Definition: Descriptors.hpp:952
armnn::INetwork::AddSliceLayer
IConnectableLayer * AddSliceLayer(const SliceDescriptor &sliceDescriptor, const char *name=nullptr)
Adds a slice layer to the network.
Definition: Network.cpp:381
armnn::NetworkImpl::AddMinimumLayer
IConnectableLayer * AddMinimumLayer(const char *name=nullptr)
Definition: Network.cpp:2220
armnn::StridedSliceDescriptor
A StridedSliceDescriptor for the StridedSliceLayer.
Definition: Descriptors.hpp:1270
armnn::ConstTensor
A tensor defined by a TensorInfo (shape and data type) and an immutable backing store.
Definition: Tensor.hpp:327
armnn::LstmInputParams::m_CellBias
const ConstTensor * m_CellBias
Definition: LstmParams.hpp:53
armnn::optimizations::OptimizeInverseTransposes
OptimizeForConnection< TransposeLayer, TransposeLayer, OptimizeInversePermutesImpl< TransposeLayer > > OptimizeInverseTransposes
Definition: OptimizeInversePermutes.hpp:45
armnn::ConcatLayer
This layer represents a merge operation.
Definition: ConcatLayer.hpp:13
armnn::Pooling3dDescriptor
A Pooling3dDescriptor for the Pooling3dLayer.
Definition: Descriptors.hpp:419
armnn::ReduceDescriptor
A ReduceDescriptor for the REDUCE operators.
Definition: Descriptors.hpp:1505
armnn::TransposeConvolution2dDescriptor::m_BiasEnabled
bool m_BiasEnabled
Enable/disable bias.
Definition: Descriptors.hpp:1448
armnn::BackendOptions
Struct for the users to pass backend specific options.
Definition: BackendOptions.hpp:22
armnn::SubgraphView::IConnectableLayerIterator
IConnectableLayers::iterator IConnectableLayerIterator
Definition: SubgraphView.hpp:64
armnn::MultiplicationLayer
This layer represents a multiplication operation.
Definition: MultiplicationLayer.hpp:14
PolymorphicDowncast.hpp
armnn::Layer
Definition: Layer.hpp:217
armnn::GatherNdLayer
This layer represents a GatherNd operator.
Definition: GatherNdLayer.hpp:14
armnn::OptimizerOptionsOpaque::GetAllowExpandedDims
bool GetAllowExpandedDims() const
Definition: Network.cpp:190
armnn::LstmInputParams::m_OutputLayerNormWeights
const ConstTensor * m_OutputLayerNormWeights
Definition: LstmParams.hpp:60
armnn::ModelOptions
std::vector< BackendOptions > ModelOptions
Definition: BackendOptions.hpp:18
armnn::EdgeStrategy
EdgeStrategy
Definition: ITensorHandleFactory.hpp:104
Timer.hpp
armnn::optimizations::SquashEqualReshapeSiblings
OptimizeForConnection< Layer, ReshapeLayer, SquashEqualSiblingsImpl< ReshapeLayer > > SquashEqualReshapeSiblings
Definition: SquashEqualSiblings.hpp:70
armnn::ComparisonDescriptor
A ComparisonDescriptor for the ComparisonLayer.
Definition: Descriptors.hpp:89
armnn::IgnoreUnused
void IgnoreUnused(Ts &&...)
Definition: IgnoreUnused.hpp:14
armnn::NetworkImpl::AddGatherLayer
IConnectableLayer * AddGatherLayer(const GatherDescriptor &gatherDescriptor, const char *name=nullptr)
Definition: Network.cpp:2505
armnn::NetworkImpl::AddBatchMatMulLayer
IConnectableLayer * AddBatchMatMulLayer(const BatchMatMulDescriptor &desc, const char *name=nullptr)
Definition: Network.cpp:2900
armnn::StandInDescriptor
A StandInDescriptor for the StandIn layer.
Definition: Descriptors.hpp:1248
armnn::QuantizedLstmLayer::m_QuantizedLstmParameters
QuantizedLstmParameters m_QuantizedLstmParameters
Definition: QuantizedLstmLayer.hpp:49
armnn::SubgraphView::IConnectableLayers
std::list< IConnectableLayer * > IConnectableLayers
Definition: SubgraphView.hpp:62
armnn::QuantizedLstmInputParams::GetInputGateBias
const ConstTensor & GetInputGateBias() const
Definition: QuantizedLstmParams.hpp:98
armnn::INetwork::AddElementwiseBinaryLayer
IConnectableLayer * AddElementwiseBinaryLayer(const ElementwiseBinaryDescriptor &elementwiseUnaryDescriptor, const char *name=nullptr)
Add an ElementwiseBinary layer to the network.
Definition: Network.cpp:313
armnn::LstmLayer
This layer represents a LSTM operation.
Definition: LstmLayer.hpp:16
Assert.hpp
armnn::INetwork::AddQuantizeLayer
IConnectableLayer * AddQuantizeLayer(const char *name=nullptr)
Add a quantize layer to the network.
Definition: Network.cpp:533
armnn::INetwork::AddMinimumLayer
IConnectableLayer * AddMinimumLayer(const char *name=nullptr)
Add a Minimum layer to the network.
Definition: Network.cpp:544
armnn::Exception::what
virtual const char * what() const noexcept override
Definition: Exceptions.cpp:32
armnn::NetworkImpl::AddMultiplicationLayer
IConnectableLayer * AddMultiplicationLayer(const char *name=nullptr)
Definition: Network.cpp:2230
TensorHandle.hpp
armnn::ViewsDescriptor
A ViewsDescriptor for the SplitterLayer.
Definition: Descriptors.hpp:244
armnn::NetworkImpl::AddAdditionLayer
IConnectableLayer * AddAdditionLayer(const char *name=nullptr)
Definition: Network.cpp:2225
armnn::LayerType::Permute
@ Permute
armnn::NetworkImpl::AddLogSoftmaxLayer
IConnectableLayer * AddLogSoftmaxLayer(const LogSoftmaxDescriptor &logSoftmaxDescriptor, const char *name=nullptr)
Definition: Network.cpp:2290
armnn::NetworkImpl::AddChannelShuffleLayer
IConnectableLayer * AddChannelShuffleLayer(const ChannelShuffleDescriptor &channelShuffleDescriptor, const char *name=nullptr)
Definition: Network.cpp:2074
armnn::Graph::begin
Iterator begin()
Returns iterator pointing to the beginning of the list. Lowercase for range-based for loops.
Definition: Graph.hpp:169
armnn::LayerType::ConvertFp16ToFp32
@ ConvertFp16ToFp32
armnn::NetworkImpl::AddStridedSliceLayer
IConnectableLayer * AddStridedSliceLayer(const StridedSliceDescriptor &stridedSliceDescriptor, const char *name=nullptr)
Definition: Network.cpp:2499
armnn::optimizations::AddBroadcastReshapeLayer
OptimizeForType< Layer, AddBroadcastReshapeLayerImpl > AddBroadcastReshapeLayer
Definition: AddBroadcastReshapeLayer.hpp:94
WorkloadFactory.hpp
armnn::PreCompiledDescriptor
A PreCompiledDescriptor for the PreCompiledLayer.
Definition: Descriptors.hpp:1334
armnn::OptimizedNetworkImpl::SerializeToDot
virtual Status SerializeToDot(std::ostream &stream) const
Definition: Network.cpp:717
armnn::CreateSupportedBackends
BackendsMap CreateSupportedBackends(TensorHandleFactoryRegistry &handleFactoryRegistry, BackendSettings &backendSettings)
Definition: Network.cpp:1221
armnn::ChannelShuffleLayer
Definition: ChannelShuffleLayer.hpp:11
armnn::OptimizerOptionsOpaque::SetShapeInferenceMethod
void SetShapeInferenceMethod(armnn::ShapeInferenceMethod ShapeInferenceMethodType)
Definition: Network.cpp:140
armnn::Graph::VerifyConstantLayerSetTensorInfo
void VerifyConstantLayerSetTensorInfo() const
For each ConstantLayer in Graph, ensures TensorInfo is set on all output slots.
Definition: Graph.cpp:545
armnn::INetwork::AddPooling2dLayer
IConnectableLayer * AddPooling2dLayer(const Pooling2dDescriptor &pooling2dDescriptor, const char *name=nullptr)
Adds a 2D pooling layer to the network.
Definition: Network.cpp:349
armnn::ActivationLayer
This layer represents an activation operation with the specified activation function.
Definition: ActivationLayer.hpp:12
armnn::QuantizedLstmInputParams::GetForgetGateBias
const ConstTensor & GetForgetGateBias() const
Definition: QuantizedLstmParams.hpp:103
armnn::DequantizeLayer
This layer dequantizes the input tensor.
Definition: DequantizeLayer.hpp:13
armnn::ShapeInferenceMethod
ShapeInferenceMethod
The ShapeInferenceMethod modify how the output shapes are treated.
Definition: Types.hpp:232
armnn::MakeOptimizations
Optimizer::Optimizations MakeOptimizations(Args &&... args)
Definition: Optimizer.hpp:43
armnn::PermuteLayer
This layer represents a permutation operation.
Definition: PermuteLayer.hpp:15
armnn::optimizations::MovePermuteUp
OptimizeForConnection< Layer, PermuteLayer, MovePermuteUpImpl > MovePermuteUp
Definition: MovePermuteUp.hpp:83
armnn::OptimizerOptionsOpaque::SetImportEnabled
void SetImportEnabled(bool ImportState)
Definition: Network.cpp:110
armnn::LogicalBinaryLayer
This layer represents a Logical Binary operation.
Definition: LogicalBinaryLayer.hpp:14
armnn::ReshapeLayer
This layer represents a reshape operation.
Definition: ReshapeLayer.hpp:15
armnn::SubgraphView::GetIConnectableLayers
const IConnectableLayers & GetIConnectableLayers() const
Definition: SubgraphView.cpp:308
armnn::RequiresCopy
bool RequiresCopy(ITensorHandleFactory::FactoryId src, ITensorHandleFactory::FactoryId dst, TensorHandleFactoryRegistry &registry)
Definition: Network.cpp:1348
armnn::INetwork::AddBatchMatMulLayer
IConnectableLayer * AddBatchMatMulLayer(const BatchMatMulDescriptor &descriptor, const char *name=nullptr)
Add a BatchMatMul layer to the network.
Definition: Network.cpp:636
ARMNN_LOG
#define ARMNN_LOG(severity)
Definition: Logging.hpp:212
armnn::IOptimizedNetwork::GetNumOutputs
size_t GetNumOutputs() const
Definition: Network.cpp:706
armnn::NetworkImpl::AddDepthwiseConvolution2dLayer
IConnectableLayer * AddDepthwiseConvolution2dLayer(const DepthwiseConvolution2dDescriptor &convolution2dDescriptor, const char *name=nullptr)
Definition: Network.cpp:2144
armnn::LstmInputParams::m_InputToOutputWeights
const ConstTensor * m_InputToOutputWeights
Definition: LstmParams.hpp:43
armnn::Optimize
IOptimizedNetworkPtr Optimize(const INetwork &network, const std::vector< BackendId > &backendPreferences, const IDeviceSpec &deviceSpec, const OptimizerOptionsOpaque &options=OptimizerOptionsOpaque(), Optional< std::vector< std::string > & > messages=EmptyOptional())
Create an optimized version of the network.
Definition: Network.cpp:2003
armnn::LogSoftmaxLayer
This layer represents a log softmax operation.
Definition: LogSoftmaxLayer.hpp:14
armnn::NetworkImpl::AddActivationLayer
IConnectableLayer * AddActivationLayer(const ActivationDescriptor &activationDescriptor, const char *name=nullptr)
Definition: Network.cpp:2179
armnn::OptimizerOptionsOpaque::SetAllowExpandedDims
void SetAllowExpandedDims(bool ExpandedDimsAllowed)
Definition: Network.cpp:145
armnn::INetwork::AddReduceLayer
IConnectableLayer * AddReduceLayer(const ReduceDescriptor &reduceDescriptor, const char *name=nullptr)
Adds a reduce layer to the network.
Definition: Network.cpp:437
TensorHandleFactoryRegistry.hpp
armnn::DetectionPostProcessLayer
This layer represents a detection postprocess operator.
Definition: DetectionPostProcessLayer.hpp:16
armnn::LstmInputParams::m_ForgetGateBias
const ConstTensor * m_ForgetGateBias
Definition: LstmParams.hpp:52
armnn::NetworkImpl::AddConstantLayer
IConnectableLayer * AddConstantLayer(const ConstTensor &input, const char *name=nullptr)
Definition: Network.cpp:2296
armnn::QuantizedLstmInputParams::GetRecurrentToCellWeights
const ConstTensor & GetRecurrentToCellWeights() const
Definition: QuantizedLstmParams.hpp:88
armnn::INetwork::AddDequantizeLayer
IConnectableLayer * AddDequantizeLayer(const char *name=nullptr)
Adds a Dequantize layer to the network.
Definition: Network.cpp:299
armnn::INetwork::Destroy
static void Destroy(INetwork *network)
Definition: Network.cpp:657
armnn::QuantizedLstmInputParams::GetOutputGateBias
const ConstTensor & GetOutputGateBias() const
Definition: QuantizedLstmParams.hpp:113
armnn::NetworkImpl::AddConvertFp32ToFp16Layer
IConnectableLayer * AddConvertFp32ToFp16Layer(const char *name=nullptr)
Definition: Network.cpp:2127
armnn
Copyright (c) 2021 ARM Limited and Contributors.
Definition: 01_00_quick_start.dox:6
armnn::ITensorHandleFactory::GetCapabilities
virtual std::vector< Capability > GetCapabilities(const IConnectableLayer *layer, const IConnectableLayer *connectedLayer, CapabilityClass capabilityClass)
Definition: ITensorHandleFactory.hpp:93
armnn::INetwork::AddMaximumLayer
IConnectableLayer * AddMaximumLayer(const char *name=nullptr)
Add a Maximum layer to the network.
Definition: Network.cpp:515
armnn::IStrategy
Definition: IStrategy.hpp:16
armnn::LstmInputParams::m_CellLayerNormWeights
const ConstTensor * m_CellLayerNormWeights
Definition: LstmParams.hpp:59
armnn::BackendOptions::Var::ToString
std::string ToString()
Definition: BackendOptions.hpp:124
armnn::LstmInputParams::m_CellToOutputWeights
const ConstTensor * m_CellToOutputWeights
Definition: LstmParams.hpp:50
armnn::SubgraphView::endIConnectable
IConnectableLayerIterator endIConnectable()
Definition: SubgraphView.cpp:329
armnn::OptimizerOptionsOpaque::GetReduceFp32ToFp16
bool GetReduceFp32ToFp16() const
Definition: Network.cpp:170
armnn::INetwork::AddStackLayer
IConnectableLayer * AddStackLayer(const StackDescriptor &descriptor, const char *name=nullptr)
Adds a stack layer to the network.
Definition: Network.cpp:591
armnn::optimizations::ConvertConstantsFloatToHalf
ConvertConstants< Float32ToFloat16, IsFloat16Layer > ConvertConstantsFloatToHalf
Definition: ConvertConstants.hpp:99
armnn::INetwork::INetwork
INetwork(NetworkOptions networkOptions={})
Definition: Network.cpp:44
armnn::BackendOptions::BackendOption::GetName
std::string GetName() const
Definition: BackendOptions.hpp:251
armnn::ReportWarning
void ReportWarning(const std::string &warningMessage, Optional< std::vector< std::string > & > warningMessages)
Definition: Network.cpp:744
armnn::OutputSlot::GetTensorInfo
const TensorInfo & GetTensorInfo() const override
Definition: Layer.cpp:92
armnn::BoostLogSeverityMapping::warning
@ warning
armnn::OptimizationViews
Definition: OptimizationViews.hpp:17
armnn::BatchToSpaceNdDescriptor
A BatchToSpaceNdDescriptor for the BatchToSpaceNdLayer.
Definition: Descriptors.hpp:863
armnn::INetwork::AddPrecompiledLayer
IConnectableLayer * AddPrecompiledLayer(const PreCompiledDescriptor &preCompiledDescriptor, CompiledBlobPtr compiledBlobPtr, const Optional< BackendId > &backend, const char *name=nullptr)
Adds a Precompiled layer to the network.
Definition: Network.cpp:361
armnn::OptionalReferenceSwitch< std::is_reference< T >::value, T >::value
const T & value() const
Definition: Optional.hpp:146
armnn::RuntimeException
Definition: Exceptions.hpp:120
armnn::TransposeConvolution2dLayer
This layer represents a 2D transpose convolution operation.
Definition: TransposeConvolution2dLayer.hpp:15
armnn::SpaceToDepthDescriptor
A SpaceToDepthDescriptor for the SpaceToDepthLayer.
Definition: Descriptors.hpp:1042
armnn::INetwork::AddMultiplicationLayer
IConnectableLayer * AddMultiplicationLayer(const char *name=nullptr)
Adds a multiplication layer to the network.
Definition: Network.cpp:409
armnn::optimizations::SquashEqualTransposeSiblings
OptimizeForConnection< Layer, TransposeLayer, SquashEqualSiblingsImpl< TransposeLayer > > SquashEqualTransposeSiblings
Definition: SquashEqualSiblings.hpp:69
armnn::NetworkImpl::AddDivisionLayer
IConnectableLayer * AddDivisionLayer(const char *name=nullptr)
Definition: Network.cpp:2469
armnn::OptimizerOptionsOpaque::~OptimizerOptionsOpaque
~OptimizerOptionsOpaque()
BackendSettings.hpp
armnn::TransposeConvolution2dLayer::m_Weight
std::shared_ptr< ConstTensorHandle > m_Weight
A unique pointer to store weight values.
Definition: TransposeConvolution2dLayer.hpp:19
armnn::SwitchLayer
This layer calculates both true and false outputs for input.
Definition: SwitchLayer.hpp:13
armnn::Graph::SubstituteSubgraph
void SubstituteSubgraph(SubgraphView &subgraph, IConnectableLayer *substituteLayer)
Substitutes the given sub-graph with either a new layer or a new sub-graph.
Definition: Graph.cpp:435
DeviceSpec.hpp
armnn::NetworkOptions
std::vector< BackendOptions > NetworkOptions
Definition: BackendOptions.hpp:16
armnn::OptimizeForConnection
Definition: Optimization.hpp:118
armnn::GatherLayer
This layer represents a Gather operator.
Definition: GatherLayer.hpp:14
armnn::INetwork::AddNormalizationLayer
IConnectableLayer * AddNormalizationLayer(const NormalizationDescriptor &normalizationDescriptor, const char *name=nullptr)
Adds a normalization layer to the network.
Definition: Network.cpp:375
armnn::GetLayerInOutDatatype
std::vector< DataType > GetLayerInOutDatatype(const Layer *layer)
Definition: Network.cpp:977
armnn::NetworkImpl::AddOutputLayer
IConnectableLayer * AddOutputLayer(LayerBindingId id, const char *name=nullptr)
Definition: Network.cpp:2235
armnn::OptimizerOptions::m_ProfilingEnabled
bool m_ProfilingEnabled
Enable profiling dump of the optimizer phase.
Definition: INetwork.hpp:247
armnn::NetworkImpl::AddSpaceToDepthLayer
IConnectableLayer * AddSpaceToDepthLayer(const SpaceToDepthDescriptor &spaceToDepthDescriptor, const char *name=nullptr)
Definition: Network.cpp:2317
armnn::Layer::GetNameStr
const std::string & GetNameStr() const
Definition: Layer.hpp:227
armnn::DetectionPostProcessDescriptor
Definition: Descriptors.hpp:701
armnn::MergeLayer
This layer dequantizes the input tensor.
Definition: MergeLayer.hpp:13
armnn::LstmInputParams::m_InputToForgetWeights
const ConstTensor * m_InputToForgetWeights
Definition: LstmParams.hpp:41
armnn::NetworkImpl::AddElementwiseBinaryLayer
IConnectableLayer * AddElementwiseBinaryLayer(const ElementwiseBinaryDescriptor &elementwiseBinaryDescriptor, const char *name=nullptr)
Definition: Network.cpp:2086
armnn::INetwork::AddSpaceToBatchNdLayer
IConnectableLayer * AddSpaceToBatchNdLayer(const SpaceToBatchNdDescriptor &spaceToBatchNdDescriptor, const char *name=nullptr)
Adds a space to batch layer to the network.
Definition: Network.cpp:473
armnn::Graph::end
Iterator end()
Returns iterator pointing to the end of the list. Lowercase for range-based for loops.
Definition: Graph.hpp:171
armnn::OutputSlot::SetEdgeStrategy
void SetEdgeStrategy(unsigned int connectionIndex, EdgeStrategy strategy)
Definition: Layer.cpp:210
armnn::OptimizedNetworkImpl::GetGraph
Graph & GetGraph()
Definition: OptimizedNetworkImpl.hpp:27
armnn::FillDescriptor
A FillDescriptor for the FillLayer.
Definition: Descriptors.hpp:913
armnn::INetwork::AddConvolution3dLayer
IConnectableLayer * AddConvolution3dLayer(const Convolution3dDescriptor &convolution3dDescriptor, const char *name=nullptr)
Adds a 3D convolution layer to the network.
Definition: Network.cpp:277
armnn::LayerType
LayerType
When adding a new layer, adapt also the LastLayer enum value in the enum class LayerType below.
Definition: Types.hpp:479
armnn::Half
half_float::half Half
Definition: Half.hpp:22
armnn::NetworkImpl::AddConvertFp16ToFp32Layer
IConnectableLayer * AddConvertFp16ToFp32Layer(const char *name=nullptr)
Definition: Network.cpp:2122
armnn::Layer::GetNumInputSlots
unsigned int GetNumInputSlots() const override
Returns the number of connectable input slots.
Definition: Layer.hpp:321
armnn::OptimizationViews::Validate
bool Validate(const SubgraphView &originalSubgraph) const
Definition: OptimizationViews.cpp:11
armnn::DetectionPostProcessLayer::m_Anchors
std::shared_ptr< ConstTensorHandle > m_Anchors
A unique pointer to store Anchor values.
Definition: DetectionPostProcessLayer.hpp:20
armnn::INetwork::AddL2NormalizationLayer
IConnectableLayer * AddL2NormalizationLayer(const L2NormalizationDescriptor &desc, const char *name=nullptr)
Adds an L2 normalization layer to the network.
Definition: Network.cpp:449
armnn::NetworkImpl::AddSubtractionLayer
IConnectableLayer * AddSubtractionLayer(const char *name=nullptr)
Definition: Network.cpp:2474
armnn::LstmInputParams::m_RecurrentToForgetWeights
const ConstTensor * m_RecurrentToForgetWeights
Definition: LstmParams.hpp:45
armnn::NetworkImpl::AddDetectionPostProcessLayer
IConnectableLayer * AddDetectionPostProcessLayer(const DetectionPostProcessDescriptor &descriptor, const ConstTensor &anchors, const char *name=nullptr)
Definition: Network.cpp:2151
armnn::Layer::GetOutputSlot
const OutputSlot & GetOutputSlot(unsigned int index=0) const override
Get the const output slot handle by slot index.
Definition: Layer.hpp:326
armnn::BackendSettings::IsCpuRefUsed
bool IsCpuRefUsed() const
Definition: BackendSettings.hpp:61
armnn::OptimizerOptionsOpaque::SetReduceFp32ToFp16
void SetReduceFp32ToFp16(bool ReduceFp32ToFp16State)
Definition: Network.cpp:135
armnn::IBackendInternal::GetHandleFactoryPreferences
virtual std::vector< ITensorHandleFactory::FactoryId > GetHandleFactoryPreferences() const
(Optional) Returns a vector of supported TensorHandleFactory ids in preference order.
Definition: IBackendInternal.cpp:143
armnn::NetworkImpl::AddFloorLayer
IConnectableLayer * AddFloorLayer(const char *name=nullptr)
Definition: Network.cpp:2323
armnn::INetwork::AddTransposeLayer
IConnectableLayer * AddTransposeLayer(const TransposeDescriptor &transposeDescriptor, const char *name=nullptr)
Adds a transpose layer to the network.
Definition: Network.cpp:580
armnn::INetwork::AddStandInLayer
IConnectableLayer * AddStandInLayer(const StandInDescriptor &descriptor, const char *name=nullptr)
Add a stand-in layer for a type unknown to the Arm NN framework.
Definition: Network.cpp:597
armnn::SubtractionLayer
This layer represents a subtraction operation.
Definition: SubtractionLayer.hpp:14
armnn::INetwork::AddAdditionLayer
IConnectableLayer * AddAdditionLayer(const char *name=nullptr)
Adds an addition layer to the network.
Definition: Network.cpp:402
armnn::OptimizerOptionsOpaque::GetProfilingEnabled
bool GetProfilingEnabled() const
Definition: Network.cpp:155
armnn::NormalizationLayer
This layer represents a normalization operation.
Definition: NormalizationLayer.hpp:13
armnn::INetwork::AddPadLayer
IConnectableLayer * AddPadLayer(const PadDescriptor &padDescriptor, const char *name=nullptr)
Adds a fully pad layer to the network.
Definition: Network.cpp:527
armnn::DepthwiseConvolution2dDescriptor
A DepthwiseConvolution2dDescriptor for the DepthwiseConvolution2dLayer.
Definition: Descriptors.hpp:647
armnn::MeanDescriptor
A MeanDescriptor for the MeanLayer.
Definition: Descriptors.hpp:1139
armnn::QuantizedLstmParameters::m_InputToInputWeights
std::shared_ptr< ConstTensorHandle > m_InputToInputWeights
A unique pointer to represent 2D weights tensor with dimensions [outputSize, inputSize] (QAsymm8).
Definition: QuantizedLstmLayer.hpp:17
armnn::INetwork::AddInstanceNormalizationLayer
IConnectableLayer * AddInstanceNormalizationLayer(const InstanceNormalizationDescriptor &desc, const char *name=nullptr)
Adds an instance normalization layer to the network.
Definition: Network.cpp:443
armnn::NetworkImpl::AddPermuteLayer
IConnectableLayer * AddPermuteLayer(const PermuteDescriptor &permuteDescriptor, const char *name=nullptr)
Definition: Network.cpp:2161
armnn::NetworkImpl::AddPooling3dLayer
IConnectableLayer * AddPooling3dLayer(const Pooling3dDescriptor &pooling3dDescriptor, const char *name=nullptr)
Definition: Network.cpp:2173
armnn::OptimizerOptions::m_DebugToFile
bool m_DebugToFile
Pass debug data to separate output files for easier troubleshooting.
Definition: INetwork.hpp:231
armnn::OptimizerOptionsOpaque::SetDebugEnabled
void SetDebugEnabled(bool DebugState)
Definition: Network.cpp:125
armnn::StridedSliceLayer
This layer represents a strided slice operation.
Definition: StridedSliceLayer.hpp:13
armnn::OutputSlot::GetConnections
const std::vector< InputSlot * > & GetConnections() const
Definition: Layer.hpp:132
armnn::IDeviceSpec
Device specific knowledge to be passed to the optimizer.
Definition: Types.hpp:291
Optimizer.hpp
armnn::IOptimizedNetwork::GetGuid
arm::pipe::ProfilingGuid GetGuid() const
Definition: Network.cpp:696
armnn::Layer::GetType
LayerType GetType() const override
Returns the armnn::LayerType of this layer.
Definition: Layer.hpp:273
armnn::IOptimizedNetwork::Destroy
static void Destroy(IOptimizedNetwork *network)
Definition: Network.cpp:676
armnn::NetworkImpl::AddInputLayer
IConnectableLayer * AddInputLayer(LayerBindingId id, const char *name=nullptr)
Definition: Network.cpp:2059
armnn::INetwork::AddMergeLayer
IConnectableLayer * AddMergeLayer(const char *name=nullptr)
Adds a merge layer to the network.
Definition: Network.cpp:397
armnn::CompiledBlobPtr
std::unique_ptr< void, CompiledBlobDeleter > CompiledBlobPtr
Definition: INetwork.hpp:331
armnn::NetworkImpl::AddConcatLayer
IConnectableLayer * AddConcatLayer(const ConcatDescriptor &concatDescriptor, const char *name=nullptr)
Definition: Network.cpp:2110
armnn::ReportError
void ReportError(const std::string &errorMessage, Optional< std::vector< std::string > & > errorMessages)
Definition: Network.cpp:732
armnn::IOptimizedNetwork::pOptimizedNetworkImpl
std::unique_ptr< OptimizedNetworkImpl > pOptimizedNetworkImpl
Definition: INetwork.hpp:907
ARMNN_SCOPED_PROFILING_EVENT
#define ARMNN_SCOPED_PROFILING_EVENT(backendId, name)
Definition: Profiling.hpp:220
armnn::SubgraphView
The SubgraphView class represents a subgraph of a Graph.
Definition: SubgraphView.hpp:31
armnn::L2NormalizationDescriptor
A L2NormalizationDescriptor for the L2NormalizationLayer.
Definition: Descriptors.hpp:797
armnn::LstmInputParams::m_InputToCellWeights
const ConstTensor * m_InputToCellWeights
Definition: LstmParams.hpp:42
armnn::INetwork::AddPermuteLayer
IConnectableLayer * AddPermuteLayer(const PermuteDescriptor &permuteDescriptor, const char *name=nullptr)
Adds a permute layer to the network.
Definition: Network.cpp:337
armnn::ShapeLayer
Definition: ShapeLayer.hpp:13
armnn::DataType::Float32
@ Float32
armnn::IWorkloadFactory::IsLayerSupported
static bool IsLayerSupported(const BackendId &backendId, const IConnectableLayer &layer, Optional< DataType > dataType, std::string &outReasonIfUnsupported)
Definition: WorkloadFactory.cpp:1548
arm
Definition: BackendRegistry.hpp:15
armnn::LstmLayer::m_BasicParameters
LstmBasicParameters m_BasicParameters
Definition: LstmLayer.hpp:20
armnn::CapabilityClass::FallbackImportDisabled
@ FallbackImportDisabled
armnn::QuantizedLstmLayer
This layer represents a QuantizedLstm operation.
Definition: QuantizedLstmLayer.hpp:45
armnn::ChannelShuffleDescriptor
A ChannelShuffleDescriptor for the ChannelShuffle operator.
Definition: Descriptors.hpp:1529
armnn::IOptimizedNetwork::PrintGraph
Status PrintGraph()
Definition: Network.cpp:681
armnn::Convolution3dDescriptor
A Convolution3dDescriptor for the Convolution3dLayer.
Definition: Descriptors.hpp:576
armnn::BatchToSpaceNdLayer
This layer represents a BatchToSpaceNd operation.
Definition: BatchToSpaceNdLayer.hpp:13
armnn::OptimizedNetworkImpl
Definition: OptimizedNetworkImpl.hpp:11
armnn::TensorInfo
Definition: Tensor.hpp:152
armnn::optimizations::Fp32NetworkToFp16Converter
OptimizeForType< Layer, ConvertFp32NetworkToFp16Impl > Fp32NetworkToFp16Converter
Definition: ConvertFp32NetworkToFp16.hpp:87
armnn::LayerType::Constant
@ Constant
armnn::ProfilerManager::GetInstance
static ProfilerManager & GetInstance()
Definition: Profiling.cpp:593
armnn::Convolution2dDescriptor
A Convolution2dDescriptor for the Convolution2dLayer.
Definition: Descriptors.hpp:522
armnn::INetwork::AddComparisonLayer
IConnectableLayer * AddComparisonLayer(const ComparisonDescriptor &comparisonDescriptor, const char *name=nullptr)
Add a Comparison layer to the network.
Definition: Network.cpp:257
armnn::NetworkImpl::AddStandInLayer
IConnectableLayer * AddStandInLayer(const StandInDescriptor &descriptor, const char *name=nullptr)
Definition: Network.cpp:2566
armnn::Layer::GetBackendId
const BackendId & GetBackendId() const
Definition: Layer.hpp:277
Layer.hpp
armnn::Graph::AddCompatibilityLayers
void AddCompatibilityLayers(std::map< BackendId, std::unique_ptr< class IBackendInternal >> &backends, TensorHandleFactoryRegistry &registry)
Modifies the graph in-place, removing edges connecting layers using different compute devices,...
Definition: Graph.cpp:303
armnn::NetworkImpl::AddQLstmLayer
IConnectableLayer * AddQLstmLayer(const QLstmDescriptor &descriptor, const LstmInputParams &params, const char *name=nullptr)
Definition: Network.cpp:2610
armnn::IOptimizedNetwork::IOptimizedNetwork
IOptimizedNetwork(const IOptimizedNetwork &other, const ModelOptions &modelOptions)
Creates a copy of the IOptimizedNetwork.
Definition: Network.cpp:662
armnn::InstanceNormalizationLayer
This layer represents an instance normalization operation.
Definition: InstanceNormalizationLayer.hpp:13
armnn::INetwork::AddCastLayer
IConnectableLayer * AddCastLayer(const char *name=nullptr)
Adds a cast layer to the network.
Definition: Network.cpp:252
armnn::BatchNormalizationDescriptor
A BatchNormalizationDescriptor for the BatchNormalizationLayer.
Definition: Descriptors.hpp:816
armnn::OptimizerOptionsOpaque::SetDebugToFileEnabled
void SetDebugToFileEnabled(bool DebugFileState)
Definition: Network.cpp:130
armnn::CastLayer
This layer represents a cast operation.
Definition: CastLayer.hpp:14
Filesystem.hpp
armnn::QuantizedLstmInputParams::GetInputToOutputWeights
const ConstTensor & GetInputToOutputWeights() const
Definition: QuantizedLstmParams.hpp:73
armnn::optimizations::InsertDebugLayer
OptimizeForType< Layer, AddDebugImpl > InsertDebugLayer
Definition: AddDebug.hpp:53
armnn::BackendOptions::BackendOption
Definition: BackendOptions.hpp:215
armnn::QLstmDescriptor
A QLstmDescriptor for the QLstmLayer.
Definition: Descriptors.hpp:1347
armnn::Status::Success
@ Success
armnn::QLstmLayer::m_BasicParameters
QLstmBasicParameters m_BasicParameters
Definition: QLstmLayer.hpp:83
armnn::BackendSettings::m_IgnoredBackends
BackendIdSet m_IgnoredBackends
Definition: BackendSettings.hpp:23
armnn::OptionalBase::has_value
bool has_value() const noexcept
Definition: Optional.hpp:53
armnn::SoftmaxLayer
This layer represents a softmax operation.
Definition: SoftmaxLayer.hpp:13
armnn::optimizations::FuseBatchNormIntoDepthwiseConvolution2DFloat16
OptimizeForExclusiveConnection< DepthwiseConvolution2dLayer, BatchNormalizationLayer, FuseBatchNorm< DepthwiseConvolution2dLayer, armnn::DataType::Float16 > > FuseBatchNormIntoDepthwiseConvolution2DFloat16
Definition: FuseBatchNorm.hpp:237
armnn::EmptyOptional
EmptyOptional is used to initialize the Optional class in case we want to have default value for an O...
Definition: Optional.hpp:32
armnn::OptimizerOptions::m_ReduceFp32ToBf16
bool m_ReduceFp32ToBf16
@Note This feature has been replaced by enabling Fast Math in compute library backend options.
Definition: INetwork.hpp:235
armnn::Status
Status
Definition: Types.hpp:42
armnn::optimizations::TransposeAsReshape
OptimizeForType< TransposeLayer, TransposeAsReshapeImpl > TransposeAsReshape
Definition: TransposeAsReshape.hpp:77
armnn::PreCompiledLayer::SetPreCompiledObject
void SetPreCompiledObject(PreCompiledObjectPtr preCompiledObject)
Definition: PreCompiledLayer.cpp:47
armnn::IOptimizedNetwork::ExecuteStrategy
void ExecuteStrategy(IStrategy &strategy) const
Definition: Network.cpp:2967
armnn::OptimizerOptions::m_shapeInferenceMethod
ShapeInferenceMethod m_shapeInferenceMethod
Infer output size when not available.
Definition: INetwork.hpp:238
armnn::ReduceLayer
This layer represents a reduction operation.
Definition: ReduceLayer.hpp:14
armnn::OptimizerOptionsOpaque::operator=
OptimizerOptionsOpaque & operator=(OptimizerOptionsOpaque other)
Definition: Network.cpp:95
armnn::CapabilityClass::PaddingRequired
@ PaddingRequired
armnn::NetworkImpl::AddTransposeConvolution2dLayer
IConnectableLayer * AddTransposeConvolution2dLayer(const TransposeConvolution2dDescriptor &descriptor, const ConstTensor &weights, const Optional< ConstTensor > &biases, const char *name=nullptr)
Definition: Network.cpp:2531
armnn::NetworkImpl::AddFillLayer
IConnectableLayer * AddFillLayer(const FillDescriptor &fillDescriptor, const char *name=nullptr)
Definition: Network.cpp:2098
armnn::BackendSettings
Definition: BackendSettings.hpp:18
armnn::OutputSlot::GetOwningLayer
Layer & GetOwningLayer() const
Definition: Layer.hpp:119
armnn::INetwork::AddActivationLayer
IConnectableLayer * AddActivationLayer(const ActivationDescriptor &activationDescriptor, const char *name=nullptr)
Adds an activation layer to the network.
Definition: Network.cpp:369
armnn::INetwork::AddGatherNdLayer
IConnectableLayer * AddGatherNdLayer(const char *name=nullptr)
Add GatherNd layer to the network.
Definition: Network.cpp:557
armnn::TensorHandleFactoryRegistry::GetFactory
ITensorHandleFactory * GetFactory(ITensorHandleFactory::FactoryId id) const
Find a TensorHandleFactory by Id Returns nullptr if not found.
Definition: TensorHandleFactoryRegistry.cpp:39
armnn::LstmInputParams::m_RecurrentToInputWeights
const ConstTensor * m_RecurrentToInputWeights
Definition: LstmParams.hpp:44
armnn::FullyConnectedLayer
This layer represents a fully connected operation.
Definition: FullyConnectedLayer.hpp:15
armnn::NetworkImpl::AddPreluLayer
IConnectableLayer * AddPreluLayer(const char *name=nullptr)
Definition: Network.cpp:2526
armnn::Compute::Undefined
@ Undefined
armnn::QuantizedLstmInputParams
Definition: QuantizedLstmParams.hpp:13
armnn::Layer::GetInputSlots
const std::vector< InputSlot > & GetInputSlots() const
Definition: Layer.hpp:245
armnn::ConstantLayer::m_LayerOutput
std::shared_ptr< ConstTensorHandle > m_LayerOutput
Definition: ConstantLayer.hpp:44
ARMNN_ASSERT_MSG
#define ARMNN_ASSERT_MSG(COND, MSG)
Definition: Assert.hpp:15
BackendRegistry.hpp
armnn::PadLayer
This layer represents a pad operation.
Definition: PadLayer.hpp:14
armnn::OptimizedNetworkImpl::PrintGraph
virtual Status PrintGraph()
Definition: Network.cpp:711
armnn::IOptimizedNetwork::GetNumInputs
size_t GetNumInputs() const
Definition: Network.cpp:701
armnn::OptimizerOptionsOpaque::GetImportEnabled
bool GetImportEnabled() const
Definition: Network.cpp:160
armnn::INetwork::AddChannelShuffleLayer
IConnectableLayer * AddChannelShuffleLayer(const ChannelShuffleDescriptor &descriptor, const char *name=nullptr)
Add a ChannelShuffle layer to the network.
Definition: Network.cpp:630
armnn::INetwork::AddGatherLayer
IConnectableLayer * AddGatherLayer(const GatherDescriptor &descriptor, const char *name=nullptr)
Add Gather layer to the network.
Definition: Network.cpp:551
armnn::Pooling3dLayer
This layer represents a pooling 3d operation.
Definition: Pooling3dLayer.hpp:13
armnn::OptimizationViews::GetFailedSubgraphs
const Subgraphs & GetFailedSubgraphs() const
Definition: OptimizationViews.hpp:54
armnn::Pooling2dLayer
This layer represents a pooling 2d operation.
Definition: Pooling2dLayer.hpp:13
armnn::NetworkImpl::AddComparisonLayer
IConnectableLayer * AddComparisonLayer(const ComparisonDescriptor &comparisonDescriptor, const char *name=nullptr)
Definition: Network.cpp:2080
armnn::Layer::GetInputSlot
const InputSlot & GetInputSlot(unsigned int index) const override
Get a const input slot handle by slot index.
Definition: Layer.hpp:324
armnn::QuantizedLstmInputParams::GetRecurrentToOutputWeights
const ConstTensor & GetRecurrentToOutputWeights() const
Definition: QuantizedLstmParams.hpp:93
armnn::BoostLogSeverityMapping::debug
@ debug
armnn::INetwork::Create
static INetworkPtr Create(const NetworkOptions &networkOptions={})
Definition: Network.cpp:652
ARMNN_NO_DEPRECATE_WARN_BEGIN
#define ARMNN_NO_DEPRECATE_WARN_BEGIN
Definition: Deprecated.hpp:33
armnn::NetworkImpl::AddCastLayer
IConnectableLayer * AddCastLayer(const char *name=nullptr)
Definition: Network.cpp:2070
armnn::OptimizationResult
Definition: Network.hpp:249
armnn::QuantizedLstmInputParams::GetInputToInputWeights
const ConstTensor & GetInputToInputWeights() const
Definition: QuantizedLstmParams.hpp:58
armnn::NetworkImpl::AddArgMinMaxLayer
IConnectableLayer * AddArgMinMaxLayer(const ArgMinMaxDescriptor &desc, const char *name=nullptr)
Definition: Network.cpp:2185
armnn::LstmInputParams::m_RecurrentToCellWeights
const ConstTensor * m_RecurrentToCellWeights
Definition: LstmParams.hpp:46
armnn::INetwork::AddDepthToSpaceLayer
IConnectableLayer * AddDepthToSpaceLayer(const DepthToSpaceDescriptor &depthToSpaceDescriptor, const char *name=nullptr)
Adds a depth to space layer to the network.
Definition: Network.cpp:284
armnn::OriginsDescriptor
An OriginsDescriptor for the ConcatLayer.
Definition: Descriptors.hpp:201
armnn::NetworkImpl::AddDequantizeLayer
IConnectableLayer * AddDequantizeLayer(const char *name=nullptr)
Definition: Network.cpp:2494
armnn::OptimizerOptionsOpaque::GetExportEnabled
bool GetExportEnabled() const
Definition: Network.cpp:165
armnn::ReshapeDescriptor
A ReshapeDescriptor for the ReshapeLayer.
Definition: Descriptors.hpp:990
armnn::Graph::ForEachLayer
void ForEachLayer(Func func) const
Definition: Graph.hpp:40
armnn::NetworkImpl::AddL2NormalizationLayer
IConnectableLayer * AddL2NormalizationLayer(const L2NormalizationDescriptor &desc, const char *name=nullptr)
Definition: Network.cpp:2284
armnn::CalculateEdgeStrategy
EdgeStrategy CalculateEdgeStrategy(BackendsMap &backends, ITensorHandleFactory::FactoryId srcFactoryId, const Layer &layer, const Layer &connectedLayer, TensorHandleFactoryRegistry &registry, bool importEnabled)
Definition: Network.cpp:1613
armnn::INetwork::AddPreluLayer
IConnectableLayer * AddPreluLayer(const char *name=nullptr)
Adds a PReLU layer to the network.
Definition: Network.cpp:567
armnn::optimizations::FoldPadIntoDepthwiseConvolution2d
OptimizeForExclusiveConnection< PadLayer, DepthwiseConvolution2dLayer, pad_fold::FoldPadIntoDepthwiseConvolution2dImpl > FoldPadIntoDepthwiseConvolution2d
Definition: FoldPadIntoLayer2d.hpp:258
armnn::OptimizerOptionsOpaque::ToString
const std::string ToString() const
Definition: Network.cpp:205
armnn::NetworkImpl::AddConvolution3dLayer
IConnectableLayer * AddConvolution3dLayer(const Convolution3dDescriptor &convolution3dDescriptor, const char *name=nullptr)
Definition: Network.cpp:2132
armnn::LstmInputParams::m_ProjectionWeights
const ConstTensor * m_ProjectionWeights
Definition: LstmParams.hpp:55
armnn::DepthwiseConvolution2dLayer
This layer represents a depthwise convolution 2d operation.
Definition: DepthwiseConvolution2dLayer.hpp:15
armnn::DataType
DataType
Definition: Types.hpp:48
armnn::PermuteDescriptor
A PermuteDescriptor for the PermuteLayer.
Definition: Descriptors.hpp:149
armnn::LstmInputParams::m_InputToInputWeights
const ConstTensor * m_InputToInputWeights
Definition: LstmParams.hpp:40
armnn::TransposeConvolution2dDescriptor
A TransposeConvolution2dDescriptor for the TransposeConvolution2dLayer.
Definition: Descriptors.hpp:1407
armnn::Graph
Definition: Graph.hpp:30
armnn::INetwork::AddSpaceToDepthLayer
IConnectableLayer * AddSpaceToDepthLayer(const SpaceToDepthDescriptor &spaceToDepthDescriptor, const char *name=nullptr)
Adds a space to depth layer to the network.
Definition: Network.cpp:479
armnn::AssignBackendsIConnectable
void AssignBackendsIConnectable(OptimizedNetworkImpl *optNetObjPtr, IConnectableLayer *it, Optional< std::vector< std::string > & > errMessages, OptimizationResult &result, BackendSettings &backendSettings, std::vector< BackendId > &availablePreferredBackends)
Definition: Network.cpp:988
armnn::INetwork::AddSwitchLayer
IConnectableLayer * AddSwitchLayer(const char *name=nullptr)
Adds a switch layer to the network.
Definition: Network.cpp:562
armnn::OptimizationResult::IsError
bool IsError() const
Definition: Network.hpp:266
armnn::IOptimizedNetwork::~IOptimizedNetwork
~IOptimizedNetwork()
armnn::NetworkImpl::GetGraph
const Graph & GetGraph() const
Definition: Network.hpp:38
Network.hpp
armnn::NetworkImpl::AddSwitchLayer
IConnectableLayer * AddSwitchLayer(const char *name=nullptr)
Definition: Network.cpp:2521
armnn::optimizations::PermuteAndBatchToSpaceAsDepthToSpace
OptimizeForConnection< PermuteLayer, BatchToSpaceNdLayer, PermuteAndBatchToSpaceAsDepthToSpaceImpl< PermuteLayer > > PermuteAndBatchToSpaceAsDepthToSpace
Definition: PermuteAndBatchToSpaceAsDepthToSpace.hpp:102
armnn::ITensorHandleFactory
Definition: ITensorHandleFactory.hpp:46
armnn::Layer::GetBackendHint
Optional< BackendId > GetBackendHint() const
Definition: Layer.hpp:342
armnn::L2NormalizationLayer
This layer represents a L2 normalization operation.
Definition: L2NormalizationLayer.hpp:13
ARMNN_ASSERT
#define ARMNN_ASSERT(COND)
Definition: Assert.hpp:14
armnn::INetwork::AddMeanLayer
IConnectableLayer * AddMeanLayer(const MeanDescriptor &meanDescriptor, const char *name=nullptr)
Add a Mean layer to the network.
Definition: Network.cpp:522
armnn::BackendSettings::m_SupportedBackends
BackendIdSet m_SupportedBackends
Definition: BackendSettings.hpp:21
armnn::NetworkImpl::AddLogicalBinaryLayer
IConnectableLayer * AddLogicalBinaryLayer(const LogicalBinaryDescriptor &logicalBinaryDescriptor, const char *name=nullptr)
Definition: Network.cpp:2752
armnn::INetwork::ExecuteStrategy
void ExecuteStrategy(IStrategy &strategy) const
Definition: Network.cpp:642
armnn::INetwork::AddShapeLayer
IConnectableLayer * AddShapeLayer(const char *name=nullptr)
Adds a shape layer to the network.
Definition: Network.cpp:586
armnn::Pooling2dDescriptor
A Pooling2dDescriptor for the Pooling2dLayer.
Definition: Descriptors.hpp:359
armnn::LogicalBinaryDescriptor
A LogicalBinaryDescriptor for the LogicalBinaryLayer.
Definition: Descriptors.hpp:1485
armnn::INetwork::~INetwork
~INetwork()
armnn::INetwork::AddResizeLayer
IConnectableLayer * AddResizeLayer(const ResizeDescriptor &resizeDescriptor, const char *name=nullptr)
Adds a resize layer to the network.
Definition: Network.cpp:431
armnn::AdditionLayer
This layer represents an addition operation.
Definition: AdditionLayer.hpp:13
armnn::CalculateSlotOption
ITensorHandleFactory::FactoryId CalculateSlotOption(BackendsMap &backends, OutputSlot &outputSlot, TensorHandleFactoryRegistry &registry, bool exportEnabled)
Definition: Network.cpp:1463
armnn::NetworkImpl::AddUnidirectionalSequenceLstmLayer
IConnectableLayer * AddUnidirectionalSequenceLstmLayer(const UnidirectionalSequenceLstmDescriptor &descriptor, const LstmInputParams &params, const char *name=nullptr)
Definition: Network.cpp:2758
armnn::optimizations::ConvertConstDequantisationLayersToConstLayers
OptimizeForConnection< ConstantLayer, DequantizeLayer, ConvertConstDequantisationLayersToConstLayersImpl > ConvertConstDequantisationLayersToConstLayers
Definition: ConvertConstDequantisationLayersToConstLayers.hpp:173
armnn::INetwork::AddConcatLayer
IConnectableLayer * AddConcatLayer(const ConcatDescriptor &concatDescriptor, const char *name=nullptr)
Adds a concatenation layer to the network.
Definition: Network.cpp:264
armnn::optimizations::OptimizeInversePermutes
OptimizeForConnection< PermuteLayer, PermuteLayer, OptimizeInversePermutesImpl< PermuteLayer > > OptimizeInversePermutes
Definition: OptimizeInversePermutes.hpp:43
armnn::NetworkImpl::AddFullyConnectedLayer
IConnectableLayer * AddFullyConnectedLayer(const FullyConnectedDescriptor &fullyConnectedDescriptor, const char *name=nullptr)
Definition: Network.cpp:2104
armnn::NetworkImpl::AddReshapeLayer
IConnectableLayer * AddReshapeLayer(const ReshapeDescriptor &reshapeDescriptor, const char *name=nullptr)
Definition: Network.cpp:2305
Exceptions.hpp
armnn::INetwork::AddBatchToSpaceNdLayer
IConnectableLayer * AddBatchToSpaceNdLayer(const BatchToSpaceNdDescriptor &batchToSpaceNdDescriptor, const char *name=nullptr)
Adds a batch to space ND layer to the network.
Definition: Network.cpp:343
armnn::INetwork
Main network class which provides the interface for building up a neural network.
Definition: INetwork.hpp:335
armnn::Optional
Definition: Optional.hpp:270
armnn::QuantizedLstmInputParams::GetRecurrentToInputWeights
const ConstTensor & GetRecurrentToInputWeights() const
Definition: QuantizedLstmParams.hpp:78
armnn::optimizations::FuseBatchNormIntoConvolution2DFloat16
OptimizeForExclusiveConnection< Convolution2dLayer, BatchNormalizationLayer, FuseBatchNorm< Convolution2dLayer, armnn::DataType::Float16 > > FuseBatchNormIntoConvolution2DFloat16
Definition: FuseBatchNorm.hpp:227
armnn::LstmBasicParameters::m_InputToForgetWeights
std::shared_ptr< ConstTensorHandle > m_InputToForgetWeights
A unique pointer to represent 2D weights tensor with dimensions [input_size, num_units].
Definition: LstmParameters.hpp:57
armnn::optimizations::FoldPadIntoPooling2d
OptimizeForExclusiveConnection< PadLayer, Pooling2dLayer, pad_fold::FoldPadIntoPooling2dImpl > FoldPadIntoPooling2d
Definition: FoldPadIntoLayer2d.hpp:260
armnn::OptimizedNetworkImpl::ExecuteStrategy
void ExecuteStrategy(IStrategy &strategy) const
Definition: Network.cpp:2972
armnn::INetwork::PrintGraph
Status PrintGraph()
Definition: Network.cpp:236
Logging.hpp
armnn::PreCompiledLayer
Definition: PreCompiledLayer.hpp:22
armnn::OptimizerOptionsOpaque::AddModelOption
void AddModelOption(armnn::BackendOptions)
Definition: Network.cpp:150
armnn::INetwork::AddFillLayer
IConnectableLayer * AddFillLayer(const FillDescriptor &fillDescriptor, const char *name=nullptr)
Add an Fill layer to the network.
Definition: Network.cpp:325
armnn::OptimizerOptionsOpaque::GetReduceFp32ToBf16
bool GetReduceFp32ToBf16() const
Definition: Network.cpp:175
armnn::NetworkImpl::~NetworkImpl
~NetworkImpl()
Definition: Network.cpp:2049
armnn::UnidirectionalSequenceLstmLayer::m_BasicParameters
LstmBasicParameters m_BasicParameters
Definition: UnidirectionalSequenceLstmLayer.hpp:20
armnn::OptimizerOptionsOpaqueImpl
Definition: Network.hpp:296
armnn::MeanLayer
This layer represents a mean operation.
Definition: MeanLayer.hpp:14
armnn::INetwork::AddQuantizedLstmLayer
IConnectableLayer * AddQuantizedLstmLayer(const QuantizedLstmInputParams &params, const char *name=nullptr)
Add a QuantizedLstm layer to the network.
Definition: Network.cpp:603
armnn::OptimizationResult::IsWarningOnly
bool IsWarningOnly() const
Definition: Network.hpp:264
armnn::BatchMatMulLayer
Definition: BatchMatMulLayer.hpp:13
armnn::OptimizationResult::m_Error
bool m_Error
Definition: Network.hpp:252
armnn::ConvertFp16ToFp32Layer
This layer converts data type Float 16 to Float 32.
Definition: ConvertFp16ToFp32Layer.hpp:14
armnn::StandInLayer
This layer represents an unknown operation in the input graph.
Definition: StandInLayer.hpp:14
armnn::INetwork::AddElementwiseUnaryLayer
IConnectableLayer * AddElementwiseUnaryLayer(const ElementwiseUnaryDescriptor &elementwiseUnaryDescriptor, const char *name=nullptr)
Add an ElementwiseUnary layer to the network.
Definition: Network.cpp:319
armnn::INetwork::AddStridedSliceLayer
IConnectableLayer * AddStridedSliceLayer(const StridedSliceDescriptor &stridedSliceDescriptor, const char *name=nullptr)
Adds a strided slice layer to the network.
Definition: Network.cpp:538
armnn::FloorLayer
This layer represents a floor operation.
Definition: FloorLayer.hpp:13
armnn::INetwork::AddRankLayer
IConnectableLayer * AddRankLayer(const char *name=nullptr)
Adds a rank layer to the network.
Definition: Network.cpp:426
armnn::optimizations::FuseBatchNormIntoConvolution2DFloat32
OptimizeForExclusiveConnection< Convolution2dLayer, BatchNormalizationLayer, FuseBatchNorm< Convolution2dLayer, armnn::DataType::Float32 > > FuseBatchNormIntoConvolution2DFloat32
Definition: FuseBatchNorm.hpp:222
armnn::INetworkPtr
std::unique_ptr< INetwork, void(*)(INetwork *network)> INetworkPtr
Definition: INetwork.hpp:327
armnn::LstmInputParams::m_CellToInputWeights
const ConstTensor * m_CellToInputWeights
Definition: LstmParams.hpp:48
armnn::ArgMinMaxDescriptor
An ArgMinMaxDescriptor for ArgMinMaxLayer.
Definition: Descriptors.hpp:67
armnn::BackendSettings::IsBackendSupported
bool IsBackendSupported(const BackendId &backend) const
Definition: BackendSettings.hpp:46
armnn::OptimizationViews::GetSubstitutions
const Substitutions & GetSubstitutions() const
Definition: OptimizationViews.hpp:53
armnn::NetworkImpl
Private implementation of INetwork.
Definition: Network.hpp:32
armnn::DepthToSpaceLayer
This layer represents a DepthToSpace operation.
Definition: DepthToSpaceLayer.hpp:14
armnn::ResizeLayer
This layer represents a resize operation.
Definition: ResizeLayer.hpp:13
armnn::UnidirectionalSequenceLstmLayer
This layer represents a LSTM operation.
Definition: UnidirectionalSequenceLstmLayer.hpp:16
armnn::LstmInputParams::m_InputLayerNormWeights
const ConstTensor * m_InputLayerNormWeights
Definition: LstmParams.hpp:57
armnn::NetworkImpl::AddTransposeLayer
IConnectableLayer * AddTransposeLayer(const TransposeDescriptor &transposeDescriptor, const char *name=nullptr)
Definition: Network.cpp:2553
armnn::INetwork::AddUnidirectionalSequenceLstmLayer
IConnectableLayer * AddUnidirectionalSequenceLstmLayer(const UnidirectionalSequenceLstmDescriptor &descriptor, const LstmInputParams &params, const char *name=nullptr)
Add a UnidirectionalSequenceLstm layer to the network.
Definition: Network.cpp:622
IgnoreUnused.hpp
armnn::CheckScaleSetOnQuantizedType
bool CheckScaleSetOnQuantizedType(Layer *layer, Optional< std::vector< std::string > & > errMessages)
Definition: Network.cpp:771
armnn::optimizations::SquashEqualPermuteSiblings
OptimizeForConnection< Layer, PermuteLayer, SquashEqualSiblingsImpl< PermuteLayer > > SquashEqualPermuteSiblings
Definition: SquashEqualSiblings.hpp:67
armnn::QLstmBasicParameters::m_InputToForgetWeights
std::shared_ptr< ConstTensorHandle > m_InputToForgetWeights
A unique pointer to represent 2D weights tensor with dimensions [num_units, inputSize] (QSymmS8).
Definition: QLstmLayer.hpp:17
armnn::QuantizedLstmInputParams::GetCellBias
const ConstTensor & GetCellBias() const
Definition: QuantizedLstmParams.hpp:108
armnn::InsertConvertFp16ToFp32LayersBefore
std::vector< ConvertFp16ToFp32Layer * > InsertConvertFp16ToFp32LayersBefore(Graph &graph, Layer &layer, bool expectCorrectInputType)
Definition: NetworkUtils.cpp:40
TypesUtils.hpp
armnn::optimizations::FuseBatchNormIntoDepthwiseConvolution2DFloat32
OptimizeForExclusiveConnection< DepthwiseConvolution2dLayer, BatchNormalizationLayer, FuseBatchNorm< DepthwiseConvolution2dLayer, armnn::DataType::Float32 > > FuseBatchNormIntoDepthwiseConvolution2DFloat32
Definition: FuseBatchNorm.hpp:232
armnn::NetworkImpl::AddLstmLayer
IConnectableLayer * AddLstmLayer(const LstmDescriptor &descriptor, const LstmInputParams &params, const char *name=nullptr)
Definition: Network.cpp:2328
armnn::DivisionLayer
This layer represents a division operation.
Definition: DivisionLayer.hpp:14
armnn::LstmInputParams
Definition: LstmParams.hpp:13
armnn::MaximumLayer
This layer represents a maximum operation.
Definition: MaximumLayer.hpp:14
armnn::MinimumLayer
This layer represents a minimum operation.
Definition: MinimumLayer.hpp:14
std
Definition: BackendId.hpp:149
armnn::EdgeStrategy::ExportToTarget
@ ExportToTarget
Destination backend can work directly with tensors on source backend.
armnn::Convolution2dLayer
This layer represents a convolution 2d operation.
Definition: Convolution2dLayer.hpp:15
armnn::Convolution3dLayer
This layer represents a convolution 3d operation.
Definition: Convolution3dLayer.hpp:16
armnn::optimizations::ConvertConstantsHalfToFloat
ConvertConstants< Float16ToFloat32, IsFloat32Layer > ConvertConstantsHalfToFloat
Definition: ConvertConstants.hpp:98
armnn::ConvertFp32ToFp16Layer
This layer converts data type Float 32 to Float 16.
Definition: ConvertFp32ToFp16Layer.hpp:13
armnn::ITensorHandleFactory::FactoryId
std::string FactoryId
Definition: ITensorHandleFactory.hpp:49
armnn::NetworkImpl::AddMaximumLayer
IConnectableLayer * AddMaximumLayer(const char *name=nullptr)
Definition: Network.cpp:2215
armnn::LayerType::Output
@ Output
armnn::NetworkImpl::AddShapeLayer
IConnectableLayer * AddShapeLayer(const char *name=nullptr)
Definition: Network.cpp:2273
armnn::AssignBackends
OptimizationResult AssignBackends(OptimizedNetworkImpl *optNetObjPtr, BackendSettings &backendSettings, Graph::Iterator &firstLayer, Graph::Iterator &lastLayer, Optional< std::vector< std::string > & > errMessages)
Definition: Network.cpp:1098
armnn::ITensorHandleFactory::GetExportFlags
virtual MemorySourceFlags GetExportFlags() const
Definition: ITensorHandleFactory.hpp:90
armnn::ComparisonLayer
This layer represents a comparison operation.
Definition: ComparisonLayer.hpp:14
armnn::LstmInputParams::m_InputGateBias
const ConstTensor * m_InputGateBias
Definition: LstmParams.hpp:51
SubgraphViewSelector.hpp
armnn::NetworkImpl::AddBatchNormalizationLayer
IConnectableLayer * AddBatchNormalizationLayer(const BatchNormalizationDescriptor &desc, const ConstTensor &mean, const ConstTensor &variance, const ConstTensor &beta, const ConstTensor &gamma, const char *name=nullptr)
Definition: Network.cpp:2240
armnn::OptimizationResult::IsOk
bool IsOk() const
Definition: Network.hpp:262
armnn::SpaceToDepthLayer
This layer represents a SpaceToDepth operation.
Definition: SpaceToDepthLayer.hpp:14
armnn::NetworkImpl::AddStackLayer
IConnectableLayer * AddStackLayer(const StackDescriptor &stackDescriptor, const char *name=nullptr)
Definition: Network.cpp:2559
armnn::GetDataTypeName
constexpr const char * GetDataTypeName(DataType dataType)
Definition: TypesUtils.hpp:220
armnn::NetworkImpl::AddSoftmaxLayer
IConnectableLayer * AddSoftmaxLayer(const SoftmaxDescriptor &softmaxDescriptor, const char *name=nullptr)
Definition: Network.cpp:2203
armnnUtils::FloatingPointConverter::ConvertFloat16To32
static void ConvertFloat16To32(const void *srcFloat16Buffer, size_t numElements, float *dstFloat32Buffer)
Definition: FloatingPointConverter.cpp:31
armnn::InvalidArgumentException
Definition: Exceptions.hpp:80
armnn::OptimizedNetworkImpl::~OptimizedNetworkImpl
virtual ~OptimizedNetworkImpl()
Definition: Network.cpp:2963
armnn::LstmInputParams::m_ForgetLayerNormWeights
const ConstTensor * m_ForgetLayerNormWeights
Definition: LstmParams.hpp:58
armnn::InstanceNormalizationDescriptor
An InstanceNormalizationDescriptor for InstanceNormalizationLayer.
Definition: Descriptors.hpp:835
armnn::INetwork::AddBatchNormalizationLayer
IConnectableLayer * AddBatchNormalizationLayer(const BatchNormalizationDescriptor &desc, const ConstTensor &mean, const ConstTensor &variance, const ConstTensor &beta, const ConstTensor &gamma, const char *name=nullptr)
Adds a batch normalization layer to the network.
Definition: Network.cpp:416
armnn::optimizations::PermuteAsReshape
OptimizeForType< PermuteLayer, PermuteAsReshapeImpl > PermuteAsReshape
Definition: PermuteAsReshape.hpp:66
armnn::NetworkImpl::AddSliceLayer
IConnectableLayer * AddSliceLayer(const SliceDescriptor &sliceDescriptor, const char *name=nullptr)
Definition: Network.cpp:2198
armnn::INetwork::AddInputLayer
IConnectableLayer * AddInputLayer(LayerBindingId id, const char *name=nullptr)
Adds an input layer to the network.
Definition: Network.cpp:241
armnn::LstmInputParams::m_ProjectionBias
const ConstTensor * m_ProjectionBias
Definition: LstmParams.hpp:56
armnn::NetworkImpl::AddQuantizeLayer
IConnectableLayer * AddQuantizeLayer(const char *name=nullptr)
Definition: Network.cpp:2489
armnn::INetwork::AddArgMinMaxLayer
IConnectableLayer * AddArgMinMaxLayer(const ArgMinMaxDescriptor &desc, const char *name=nullptr)
Adds an ArgMinMax layer to the network.
Definition: Network.cpp:246
Graph.hpp
armnn::LstmInputParams::m_OutputGateBias
const ConstTensor * m_OutputGateBias
Definition: LstmParams.hpp:54
armnn::OptimizedNetworkImpl::GetNumInputs
virtual size_t GetNumInputs() const
Definition: Network.cpp:722
armnn::ElementwiseUnaryLayer
This layer represents a elementwiseUnary operation.
Definition: ElementwiseUnaryLayer.hpp:14
armnn::Compute::CpuRef
@ CpuRef
CPU Execution: Reference C++ kernels.
armnn::OptimizerOptions
Definition: INetwork.hpp:139
armnn::ElementwiseBinaryDescriptor
A ElementwiseBinaryDescriptor for the ElementwiseBinaryLayer.
Definition: Descriptors.hpp:109
armnn::OutputLayer
A layer user-provided data can be bound to (e.g. inputs, outputs).
Definition: OutputLayer.hpp:13
armnn::INetwork::AddLogicalBinaryLayer
IConnectableLayer * AddLogicalBinaryLayer(const LogicalBinaryDescriptor &descriptor, const char *name=nullptr)
Adds a Logical Binary layer to the network.
Definition: Network.cpp:616
armnn::QuantizeLayer
Definition: QuantizeLayer.hpp:16
armnn::EdgeStrategy::CopyToTarget
@ CopyToTarget
Source backends tensor data can be exported to destination backend tensor without copy.
armnn::TensorInfo::GetDataType
DataType GetDataType() const
Definition: Tensor.hpp:198
armnn::optimizations::OptimizeConsecutiveReshapes
OptimizeForConnection< ReshapeLayer, ReshapeLayer, OptimizeConsecutiveReshapesImpl > OptimizeConsecutiveReshapes
Definition: OptimizeConsecutiveReshapes.hpp:61
armnn::INetwork::AddLstmLayer
IConnectableLayer * AddLstmLayer(const LstmDescriptor &descriptor, const LstmInputParams &params, const char *name=nullptr)
Add a Lstm layer to the network.
Definition: Network.cpp:494
All.hpp
armnn::NetworkImpl::AddSplitterLayer
IConnectableLayer * AddSplitterLayer(const ViewsDescriptor &splitterDescriptor, const char *name=nullptr)
Definition: Network.cpp:2209
armnn::NetworkImpl::AddSpaceToBatchNdLayer
IConnectableLayer * AddSpaceToBatchNdLayer(const SpaceToBatchNdDescriptor &spaceToBatchNdDescriptor, const char *name=nullptr)
Definition: Network.cpp:2311
armnn::OptimizerOptionsOpaque::SetExportEnabled
void SetExportEnabled(bool ExportState)
Definition: Network.cpp:115
armnn::optimizations::TransposeAndBatchToSpaceAsDepthToSpace
OptimizeForConnection< TransposeLayer, BatchToSpaceNdLayer, PermuteAndBatchToSpaceAsDepthToSpaceImpl< TransposeLayer > > TransposeAndBatchToSpaceAsDepthToSpace
Definition: PermuteAndBatchToSpaceAsDepthToSpace.hpp:104
armnn::INetwork::AddSplitterLayer
IConnectableLayer * AddSplitterLayer(const ViewsDescriptor &splitterDescriptor, const char *name=nullptr)
Adds a splitter layer to the network.
Definition: Network.cpp:391
armnn::OptimizedNetworkImpl::GetNumOutputs
virtual size_t GetNumOutputs() const
Definition: Network.cpp:727
armnn::OptimizerOptions::m_Debug
bool m_Debug
Add debug data for easier troubleshooting.
Definition: INetwork.hpp:228
armnn::ProfilerManager::RegisterProfiler
void RegisterProfiler(IProfiler *profiler)
Definition: Profiling.cpp:600
armnn::NetworkImpl::AddReduceLayer
IConnectableLayer * AddReduceLayer(const ReduceDescriptor &reduceDescriptor, const char *name=nullptr)
Definition: Network.cpp:2262
armnn::INetwork::AddSoftmaxLayer
IConnectableLayer * AddSoftmaxLayer(const SoftmaxDescriptor &softmaxDescriptor, const char *name=nullptr)
Adds a softmax layer to the network.
Definition: Network.cpp:385
armnn::OptimizerOptionsOpaque::SetProfilingEnabled
void SetProfilingEnabled(bool ProfilingState)
Definition: Network.cpp:120
armnn::GetLayerTypeAsCString
const char * GetLayerTypeAsCString(LayerType type)
Definition: InternalTypes.cpp:13
armnn::BoostLogSeverityMapping::info
@ info
armnn::INetwork::AddOutputLayer
IConnectableLayer * AddOutputLayer(LayerBindingId id, const char *name=nullptr)
Adds an output layer to the network.
Definition: Network.cpp:489
armnn::NetworkImpl::AddPadLayer
IConnectableLayer * AddPadLayer(const PadDescriptor &padDescriptor, const char *name=nullptr)
Definition: Network.cpp:2484
armnn::INetwork::AddFullyConnectedLayer
IConnectableLayer * AddFullyConnectedLayer(const FullyConnectedDescriptor &fullyConnectedDescriptor, const char *name=nullptr)
Adds a fully connected layer to the network.
Definition: Network.cpp:331
armnn::CalculateSlotOptionForInput
ITensorHandleFactory::FactoryId CalculateSlotOptionForInput(BackendsMap &backends, OutputSlot &slot, TensorHandleFactoryRegistry &registry, bool importEnabled)
Definition: Network.cpp:1368
armnn::StackLayer
This layer represents a stack operation.
Definition: StackLayer.hpp:13
armnn::ShapeInferenceMethod::InferAndValidate
@ InferAndValidate
Infer missing output shapes and validate all output shapes.
armnn::INetwork::AddReshapeLayer
IConnectableLayer * AddReshapeLayer(const ReshapeDescriptor &reshapeDescriptor, const char *name=nullptr)
Adds a reshape layer to the network.
Definition: Network.cpp:467
armnn::NetworkImpl::NetworkImpl
NetworkImpl(const NetworkOptions &networkOptions={})
Definition: Network.cpp:2044
armnn::OptimizerOptionsOpaque::GetModelOptions
armnn::ModelOptions GetModelOptions() const
Definition: Network.cpp:195
armnn::SpaceToBatchNdDescriptor
A SpaceToBatchNdDescriptor for the SpaceToBatchNdLayer.
Definition: Descriptors.hpp:1010
ARMNN_NO_DEPRECATE_WARN_END
#define ARMNN_NO_DEPRECATE_WARN_END
Definition: Deprecated.hpp:34
armnn::OptimizerOptions::m_ImportEnabled
bool m_ImportEnabled
Enable Import.
Definition: INetwork.hpp:241