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