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