aboutsummaryrefslogtreecommitdiff
path: root/21.02/_onnx_parser_8cpp_source.xhtml
blob: 19bf6c222a9f7be427c1fa53ec731cdcf49b4f75 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
<!-- Copyright (c) 2020 ARM Limited. -->
<!--                                 -->
<!-- SPDX-License-Identifier: MIT    -->
<!--                                 -->
<!-- HTML header for doxygen 1.8.13-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.13"/>
<meta name="robots" content="NOINDEX, NOFOLLOW" />
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>ArmNN: src/armnnOnnxParser/OnnxParser.cpp Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<script type="text/javascript">
  $(document).ready(initResizable);
</script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<script type="text/x-mathjax-config">
  MathJax.Hub.Config({
    extensions: ["tex2jax.js"],
    jax: ["input/TeX","output/HTML-CSS"],
});
</script><script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
<link href="stylesheet.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
 <tbody>
 <tr style="height: 56px;">
  <img alt="ArmNN" src="Arm_NN_horizontal_blue.png" style="max-width: 10rem; margin-top: .5rem; margin-left 10px"/>
  <td style="padding-left: 0.5em;">
   <div id="projectname">
   &#160;<span id="projectnumber">21.02</span>
   </div>
  </td>
 </tr>
 </tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.13 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Search');
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
$(function() {
  initMenu('',true,false,'search.php','Search');
  $(document).ready(function() { init_search(); });
});
</script>
<div id="main-nav"></div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
  <div id="nav-tree">
    <div id="nav-tree-contents">
      <div id="nav-sync" class="sync"></div>
    </div>
  </div>
  <div id="splitbar" style="-moz-user-select:none;" 
       class="ui-resizable-handle">
  </div>
</div>
<script type="text/javascript">
$(document).ready(function(){initNavTree('_onnx_parser_8cpp_source.xhtml','');});
</script>
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
     onmouseover="return searchBox.OnSearchSelectShow()"
     onmouseout="return searchBox.OnSearchSelectHide()"
     onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>

<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0" 
        name="MSearchResults" id="MSearchResults">
</iframe>
</div>

<div class="header">
  <div class="headertitle">
<div class="title">OnnxParser.cpp</div>  </div>
</div><!--header-->
<div class="contents">
<a href="_onnx_parser_8cpp.xhtml">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno">    1</span>&#160;<span class="comment">//</span></div><div class="line"><a name="l00002"></a><span class="lineno">    2</span>&#160;<span class="comment">// Copyright © 2017 Arm Ltd. All rights reserved.</span></div><div class="line"><a name="l00003"></a><span class="lineno">    3</span>&#160;<span class="comment">// SPDX-License-Identifier: MIT</span></div><div class="line"><a name="l00004"></a><span class="lineno">    4</span>&#160;<span class="comment">//</span></div><div class="line"><a name="l00005"></a><span class="lineno">    5</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="_onnx_parser_8hpp.xhtml">OnnxParser.hpp</a>&quot;</span></div><div class="line"><a name="l00006"></a><span class="lineno">    6</span>&#160;</div><div class="line"><a name="l00007"></a><span class="lineno">    7</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="include_2armnn_onnx_parser_2_version_8hpp.xhtml">armnnOnnxParser/Version.hpp</a>&quot;</span></div><div class="line"><a name="l00008"></a><span class="lineno">    8</span>&#160;</div><div class="line"><a name="l00009"></a><span class="lineno">    9</span>&#160;<span class="preprocessor">#include &lt;<a class="code" href="_descriptors_8hpp.xhtml">armnn/Descriptors.hpp</a>&gt;</span></div><div class="line"><a name="l00010"></a><span class="lineno">   10</span>&#160;<span class="preprocessor">#include &lt;<a class="code" href="_assert_8hpp.xhtml">armnn/utility/Assert.hpp</a>&gt;</span></div><div class="line"><a name="l00011"></a><span class="lineno">   11</span>&#160;<span class="preprocessor">#include &lt;<a class="code" href="_numeric_cast_8hpp.xhtml">armnn/utility/NumericCast.hpp</a>&gt;</span></div><div class="line"><a name="l00012"></a><span class="lineno">   12</span>&#160;<span class="preprocessor">#include &lt;<a class="code" href="_verification_helpers_8hpp.xhtml">VerificationHelpers.hpp</a>&gt;</span></div><div class="line"><a name="l00013"></a><span class="lineno">   13</span>&#160;</div><div class="line"><a name="l00014"></a><span class="lineno">   14</span>&#160;<span class="preprocessor">#include &lt;fmt/format.h&gt;</span></div><div class="line"><a name="l00015"></a><span class="lineno">   15</span>&#160;</div><div class="line"><a name="l00016"></a><span class="lineno">   16</span>&#160;<span class="preprocessor">#include &lt;google/protobuf/text_format.h&gt;</span></div><div class="line"><a name="l00017"></a><span class="lineno">   17</span>&#160;<span class="preprocessor">#include &lt;google/protobuf/io/zero_copy_stream_impl.h&gt;</span></div><div class="line"><a name="l00018"></a><span class="lineno">   18</span>&#160;</div><div class="line"><a name="l00019"></a><span class="lineno">   19</span>&#160;<span class="preprocessor">#include &lt;iostream&gt;</span></div><div class="line"><a name="l00020"></a><span class="lineno">   20</span>&#160;<span class="preprocessor">#include &lt;numeric&gt;</span></div><div class="line"><a name="l00021"></a><span class="lineno">   21</span>&#160;</div><div class="line"><a name="l00022"></a><span class="lineno">   22</span>&#160;<span class="keyword">using namespace </span><a class="code" href="namespacearmnn.xhtml">armnn</a>;</div><div class="line"><a name="l00023"></a><span class="lineno">   23</span>&#160;</div><div class="line"><a name="l00024"></a><span class="lineno">   24</span>&#160;<span class="keyword">namespace </span><a class="code" href="namespacearmnn_onnx_parser.xhtml">armnnOnnxParser</a></div><div class="line"><a name="l00025"></a><span class="lineno">   25</span>&#160;{</div><div class="line"><a name="l00026"></a><span class="lineno">   26</span>&#160;</div><div class="line"><a name="l00027"></a><span class="lineno">   27</span>&#160;IOnnxParser::IOnnxParser() : pOnnxParserImpl(new OnnxParserImpl()) {}</div><div class="line"><a name="l00028"></a><span class="lineno">   28</span>&#160;</div><div class="line"><a name="l00029"></a><span class="lineno">   29</span>&#160;IOnnxParser::~IOnnxParser() = <span class="keywordflow">default</span>;</div><div class="line"><a name="l00030"></a><span class="lineno">   30</span>&#160;</div><div class="line"><a name="l00031"></a><span class="lineno"><a class="line" href="classarmnn_onnx_parser_1_1_i_onnx_parser.xhtml#a1ae1d4dfe89d26b84d371439d6815bfb">   31</a></span>&#160;<a class="code" href="classarmnn_onnx_parser_1_1_i_onnx_parser.xhtml">IOnnxParser</a>* IOnnxParser::CreateRaw()</div><div class="line"><a name="l00032"></a><span class="lineno">   32</span>&#160;{</div><div class="line"><a name="l00033"></a><span class="lineno">   33</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">new</span> <a class="code" href="classarmnn_onnx_parser_1_1_i_onnx_parser.xhtml">IOnnxParser</a>();</div><div class="line"><a name="l00034"></a><span class="lineno">   34</span>&#160;}</div><div class="line"><a name="l00035"></a><span class="lineno">   35</span>&#160;</div><div class="line"><a name="l00036"></a><span class="lineno"><a class="line" href="classarmnn_onnx_parser_1_1_i_onnx_parser.xhtml#af9b9254fb8a084f0db4f7deff0498b20">   36</a></span>&#160;<a class="code" href="namespacearmnn_onnx_parser.xhtml#ac7dfccab29feeb5f33f1ec0183c1e123">IOnnxParserPtr</a> IOnnxParser::Create()</div><div class="line"><a name="l00037"></a><span class="lineno">   37</span>&#160;{</div><div class="line"><a name="l00038"></a><span class="lineno">   38</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="namespacearmnn_onnx_parser.xhtml#ac7dfccab29feeb5f33f1ec0183c1e123">IOnnxParserPtr</a>(CreateRaw(), &amp;IOnnxParser::Destroy);</div><div class="line"><a name="l00039"></a><span class="lineno">   39</span>&#160;}</div><div class="line"><a name="l00040"></a><span class="lineno">   40</span>&#160;</div><div class="line"><a name="l00041"></a><span class="lineno"><a class="line" href="classarmnn_onnx_parser_1_1_i_onnx_parser.xhtml#a793da4fa60bf13f128c20d8def32c291">   41</a></span>&#160;<span class="keywordtype">void</span> IOnnxParser::Destroy(<a class="code" href="classarmnn_onnx_parser_1_1_i_onnx_parser.xhtml">IOnnxParser</a>* parser)</div><div class="line"><a name="l00042"></a><span class="lineno">   42</span>&#160;{</div><div class="line"><a name="l00043"></a><span class="lineno">   43</span>&#160;    <span class="keyword">delete</span> parser;</div><div class="line"><a name="l00044"></a><span class="lineno">   44</span>&#160;}</div><div class="line"><a name="l00045"></a><span class="lineno">   45</span>&#160;</div><div class="line"><a name="l00046"></a><span class="lineno"><a class="line" href="classarmnn_onnx_parser_1_1_i_onnx_parser.xhtml#a6bf5861864c8828e59df24a7868c5439">   46</a></span>&#160;<a class="code" href="namespacearmnn.xhtml#ace74f6f9feb95a964a49d79458232703">armnn::INetworkPtr</a> IOnnxParser::CreateNetworkFromBinaryFile(<span class="keyword">const</span> <span class="keywordtype">char</span>* graphFile)</div><div class="line"><a name="l00047"></a><span class="lineno">   47</span>&#160;{</div><div class="line"><a name="l00048"></a><span class="lineno">   48</span>&#160;    <span class="keywordflow">return</span> pOnnxParserImpl-&gt;<a class="code" href="classarmnn_onnx_parser_1_1_i_onnx_parser.xhtml#a6bf5861864c8828e59df24a7868c5439">CreateNetworkFromBinaryFile</a>(graphFile);</div><div class="line"><a name="l00049"></a><span class="lineno">   49</span>&#160;}</div><div class="line"><a name="l00050"></a><span class="lineno">   50</span>&#160;</div><div class="line"><a name="l00051"></a><span class="lineno"><a class="line" href="classarmnn_onnx_parser_1_1_i_onnx_parser.xhtml#ae6e0c06fbaab2070091357ca9ed52d0c">   51</a></span>&#160;<a class="code" href="namespacearmnn.xhtml#ace74f6f9feb95a964a49d79458232703">armnn::INetworkPtr</a> IOnnxParser::CreateNetworkFromTextFile(<span class="keyword">const</span> <span class="keywordtype">char</span>* graphFile)</div><div class="line"><a name="l00052"></a><span class="lineno">   52</span>&#160;{</div><div class="line"><a name="l00053"></a><span class="lineno">   53</span>&#160;    <span class="keywordflow">return</span> pOnnxParserImpl-&gt;CreateNetworkFromTextFile(graphFile);</div><div class="line"><a name="l00054"></a><span class="lineno">   54</span>&#160;}</div><div class="line"><a name="l00055"></a><span class="lineno">   55</span>&#160;</div><div class="line"><a name="l00056"></a><span class="lineno"><a class="line" href="classarmnn_onnx_parser_1_1_i_onnx_parser.xhtml#a7a50b3c283b44956158e43db2e0111d0">   56</a></span>&#160;<a class="code" href="namespacearmnn.xhtml#ace74f6f9feb95a964a49d79458232703">armnn::INetworkPtr</a> IOnnxParser::CreateNetworkFromString(<span class="keyword">const</span> std::string&amp; protoText)</div><div class="line"><a name="l00057"></a><span class="lineno">   57</span>&#160;{</div><div class="line"><a name="l00058"></a><span class="lineno">   58</span>&#160;    <span class="keywordflow">return</span> pOnnxParserImpl-&gt;CreateNetworkFromString(protoText);</div><div class="line"><a name="l00059"></a><span class="lineno">   59</span>&#160;}</div><div class="line"><a name="l00060"></a><span class="lineno">   60</span>&#160;</div><div class="line"><a name="l00061"></a><span class="lineno"><a class="line" href="classarmnn_onnx_parser_1_1_i_onnx_parser.xhtml#a8b053a6c449d0814cc831c916c126668">   61</a></span>&#160;<a class="code" href="namespacearmnn_onnx_parser.xhtml#a9084adbf804022c874039ad40d1939e9">BindingPointInfo</a> IOnnxParser::GetNetworkInputBindingInfo(<span class="keyword">const</span> std::string&amp; name)<span class="keyword"> const</span></div><div class="line"><a name="l00062"></a><span class="lineno">   62</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l00063"></a><span class="lineno">   63</span>&#160;    <span class="keywordflow">return</span> pOnnxParserImpl-&gt;GetNetworkInputBindingInfo(name);</div><div class="line"><a name="l00064"></a><span class="lineno">   64</span>&#160;}</div><div class="line"><a name="l00065"></a><span class="lineno">   65</span>&#160;</div><div class="line"><a name="l00066"></a><span class="lineno"><a class="line" href="classarmnn_onnx_parser_1_1_i_onnx_parser.xhtml#a4b1fdcb1985af12dd1848a9ffa5d3271">   66</a></span>&#160;<a class="code" href="namespacearmnn_onnx_parser.xhtml#a9084adbf804022c874039ad40d1939e9">BindingPointInfo</a> IOnnxParser::GetNetworkOutputBindingInfo(<span class="keyword">const</span> std::string&amp; name)<span class="keyword"> const</span></div><div class="line"><a name="l00067"></a><span class="lineno">   67</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l00068"></a><span class="lineno">   68</span>&#160;    <span class="keywordflow">return</span> pOnnxParserImpl-&gt;GetNetworkOutputBindingInfo(name);</div><div class="line"><a name="l00069"></a><span class="lineno">   69</span>&#160;}</div><div class="line"><a name="l00070"></a><span class="lineno">   70</span>&#160;</div><div class="line"><a name="l00071"></a><span class="lineno">   71</span>&#160;<span class="keyword">namespace</span></div><div class="line"><a name="l00072"></a><span class="lineno">   72</span>&#160;{</div><div class="line"><a name="l00073"></a><span class="lineno">   73</span>&#160;<span class="keywordtype">void</span> CheckValidDataType(std::initializer_list&lt;onnx::TensorProto::DataType&gt; validInputTypes,</div><div class="line"><a name="l00074"></a><span class="lineno">   74</span>&#160;                        <span class="keyword">const</span> <a class="code" href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6">onnx::TensorProto::DataType</a> actualValue,</div><div class="line"><a name="l00075"></a><span class="lineno">   75</span>&#160;                        <span class="keyword">const</span> <span class="keywordtype">char</span>* validExpr,</div><div class="line"><a name="l00076"></a><span class="lineno">   76</span>&#160;                        std::string nodeName,</div><div class="line"><a name="l00077"></a><span class="lineno">   77</span>&#160;                        std::string tensorName,</div><div class="line"><a name="l00078"></a><span class="lineno">   78</span>&#160;                        <span class="keyword">const</span> <a class="code" href="structarmnn_1_1_check_location.xhtml">armnn::CheckLocation</a>&amp; location)</div><div class="line"><a name="l00079"></a><span class="lineno">   79</span>&#160;{</div><div class="line"><a name="l00080"></a><span class="lineno">   80</span>&#160;    <span class="keywordtype">bool</span> isValid = std::any_of(validInputTypes.begin(),</div><div class="line"><a name="l00081"></a><span class="lineno">   81</span>&#160;                               validInputTypes.end(),</div><div class="line"><a name="l00082"></a><span class="lineno">   82</span>&#160;                               [&amp;actualValue](<a class="code" href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6">onnx::TensorProto::DataType</a> x) { <span class="keywordflow">return</span> x == actualValue; } );</div><div class="line"><a name="l00083"></a><span class="lineno">   83</span>&#160;    <span class="keywordflow">if</span> (!isValid)</div><div class="line"><a name="l00084"></a><span class="lineno">   84</span>&#160;    {</div><div class="line"><a name="l00085"></a><span class="lineno">   85</span>&#160;        <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_parse_exception.xhtml">ParseException</a>(</div><div class="line"><a name="l00086"></a><span class="lineno">   86</span>&#160;            fmt::format(<span class="stringliteral">&quot;Datatype {} is not valid for tensor &#39;{}&#39; of node &#39;{}&#39;, not in {{{}}}. {}&quot;</span>,</div><div class="line"><a name="l00087"></a><span class="lineno">   87</span>&#160;                        onnx::TensorProto::DataType_Name(actualValue),</div><div class="line"><a name="l00088"></a><span class="lineno">   88</span>&#160;                        tensorName,</div><div class="line"><a name="l00089"></a><span class="lineno">   89</span>&#160;                        nodeName,</div><div class="line"><a name="l00090"></a><span class="lineno">   90</span>&#160;                        validExpr,</div><div class="line"><a name="l00091"></a><span class="lineno">   91</span>&#160;                        location.<a class="code" href="structarmnn_1_1_check_location.xhtml#a5e3562cda960da001597e7dd5679b140">AsString</a>()));</div><div class="line"><a name="l00092"></a><span class="lineno">   92</span>&#160;    }</div><div class="line"><a name="l00093"></a><span class="lineno">   93</span>&#160;}</div><div class="line"><a name="l00094"></a><span class="lineno">   94</span>&#160;</div><div class="line"><a name="l00095"></a><span class="lineno"><a class="line" href="_onnx_parser_8cpp.xhtml#a71cae957feb9162183d6f62fd549ffe1">   95</a></span>&#160;<span class="preprocessor">#define CHECK_VALID_DATATYPE(NODE, TENSOR, ACTUAL, ...) \</span></div><div class="line"><a name="l00096"></a><span class="lineno">   96</span>&#160;<span class="preprocessor">CheckValidDataType({__VA_ARGS__}, ACTUAL, #__VA_ARGS__, NODE, TENSOR, CHECK_LOCATION())</span></div><div class="line"><a name="l00097"></a><span class="lineno">   97</span>&#160;</div><div class="line"><a name="l00098"></a><span class="lineno">   98</span>&#160;<span class="keyword">using</span> StrTypeListPair = std::pair&lt;const char*, std::initializer_list&lt;onnx::TensorProto::DataType&gt;&gt;;</div><div class="line"><a name="l00099"></a><span class="lineno"><a class="line" href="_onnx_parser_8cpp.xhtml#a5426a7adb280d1739cc6d66fe9ac1b9c">   99</a></span>&#160;<span class="preprocessor">#define STR_LIST(...) StrTypeListPair(#__VA_ARGS__, {__VA_ARGS__})</span></div><div class="line"><a name="l00100"></a><span class="lineno">  100</span>&#160;</div><div class="line"><a name="l00101"></a><span class="lineno">  101</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">typename</span> Callable&gt;</div><div class="line"><a name="l00102"></a><span class="lineno">  102</span>&#160;<span class="keywordtype">void</span> ReadMandatoryNodeAttributeImpl(<span class="keyword">const</span> onnx::NodeProto&amp; node,</div><div class="line"><a name="l00103"></a><span class="lineno">  103</span>&#160;                                    <span class="keyword">const</span> std::string&amp; attribName,</div><div class="line"><a name="l00104"></a><span class="lineno">  104</span>&#160;                                    onnx::AttributeProto::AttributeType expectedType,</div><div class="line"><a name="l00105"></a><span class="lineno">  105</span>&#160;                                    Callable callable)</div><div class="line"><a name="l00106"></a><span class="lineno">  106</span>&#160;{</div><div class="line"><a name="l00107"></a><span class="lineno">  107</span>&#160;  <span class="keyword">auto</span> attribs = node.attribute();</div><div class="line"><a name="l00108"></a><span class="lineno">  108</span>&#160;  <span class="keywordtype">int</span> attriNum = 0;</div><div class="line"><a name="l00109"></a><span class="lineno">  109</span>&#160;  <span class="keywordflow">while</span> (attriNum &lt; node.attribute_size())</div><div class="line"><a name="l00110"></a><span class="lineno">  110</span>&#160;  {</div><div class="line"><a name="l00111"></a><span class="lineno">  111</span>&#160;      <span class="keywordflow">if</span> (attribs.Get(attriNum).name() == attribName)</div><div class="line"><a name="l00112"></a><span class="lineno">  112</span>&#160;      {</div><div class="line"><a name="l00113"></a><span class="lineno">  113</span>&#160;          <span class="keywordflow">if</span> (attribs.Get(attriNum).type() == expectedType)</div><div class="line"><a name="l00114"></a><span class="lineno">  114</span>&#160;          {</div><div class="line"><a name="l00115"></a><span class="lineno">  115</span>&#160;              callable(attribs.Get(attriNum));</div><div class="line"><a name="l00116"></a><span class="lineno">  116</span>&#160;          }</div><div class="line"><a name="l00117"></a><span class="lineno">  117</span>&#160;          <span class="keywordflow">else</span></div><div class="line"><a name="l00118"></a><span class="lineno">  118</span>&#160;          {</div><div class="line"><a name="l00119"></a><span class="lineno">  119</span>&#160;              <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_parse_exception.xhtml">ParseException</a>(fmt::format(<span class="stringliteral">&quot;Attribute {} of node {} expected to have {} as &quot;</span></div><div class="line"><a name="l00120"></a><span class="lineno">  120</span>&#160;                                               <span class="stringliteral">&quot;onnx::AttributeProto::AttributeType, but found {} instead {}&quot;</span>,</div><div class="line"><a name="l00121"></a><span class="lineno">  121</span>&#160;                                               attribName,</div><div class="line"><a name="l00122"></a><span class="lineno">  122</span>&#160;                                               node.name(),</div><div class="line"><a name="l00123"></a><span class="lineno">  123</span>&#160;                                               onnx::AttributeProto::AttributeType_Name(expectedType),</div><div class="line"><a name="l00124"></a><span class="lineno">  124</span>&#160;                                               onnx::AttributeProto::AttributeType_Name(attribs.Get(attriNum).type()),</div><div class="line"><a name="l00125"></a><span class="lineno">  125</span>&#160;                                               <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l00126"></a><span class="lineno">  126</span>&#160;          }</div><div class="line"><a name="l00127"></a><span class="lineno">  127</span>&#160;          <span class="keywordflow">break</span>;</div><div class="line"><a name="l00128"></a><span class="lineno">  128</span>&#160;      }</div><div class="line"><a name="l00129"></a><span class="lineno">  129</span>&#160;      ++attriNum;</div><div class="line"><a name="l00130"></a><span class="lineno">  130</span>&#160;  }</div><div class="line"><a name="l00131"></a><span class="lineno">  131</span>&#160;  <span class="keywordflow">if</span> (attriNum == node.attribute_size())</div><div class="line"><a name="l00132"></a><span class="lineno">  132</span>&#160;  {</div><div class="line"><a name="l00133"></a><span class="lineno">  133</span>&#160;      <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_parse_exception.xhtml">ParseException</a>(fmt::format(<span class="stringliteral">&quot;Could not find required attribute {} in node {} {}&quot;</span>,</div><div class="line"><a name="l00134"></a><span class="lineno">  134</span>&#160;                                       attribName, node.name(), <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l00135"></a><span class="lineno">  135</span>&#160;  }</div><div class="line"><a name="l00136"></a><span class="lineno">  136</span>&#160;}</div><div class="line"><a name="l00137"></a><span class="lineno">  137</span>&#160;</div><div class="line"><a name="l00138"></a><span class="lineno">  138</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">typename</span> Callable&gt;</div><div class="line"><a name="l00139"></a><span class="lineno">  139</span>&#160;<span class="keywordtype">void</span> ReadOptionalNodeAttributeImpl(<span class="keyword">const</span> onnx::NodeProto&amp; node,</div><div class="line"><a name="l00140"></a><span class="lineno">  140</span>&#160;                                   <span class="keyword">const</span> std::string&amp; attribName,</div><div class="line"><a name="l00141"></a><span class="lineno">  141</span>&#160;                                   onnx::AttributeProto::AttributeType expectedType,</div><div class="line"><a name="l00142"></a><span class="lineno">  142</span>&#160;                                   Callable callable)</div><div class="line"><a name="l00143"></a><span class="lineno">  143</span>&#160;{</div><div class="line"><a name="l00144"></a><span class="lineno">  144</span>&#160;    <span class="keyword">auto</span> attribs = node.attribute();</div><div class="line"><a name="l00145"></a><span class="lineno">  145</span>&#160;    <span class="keywordflow">for</span> (<span class="keywordtype">int</span> attriNum = 0; attriNum &lt; node.attribute_size(); ++attriNum)</div><div class="line"><a name="l00146"></a><span class="lineno">  146</span>&#160;    {</div><div class="line"><a name="l00147"></a><span class="lineno">  147</span>&#160;        <span class="keywordflow">if</span> (attribs.Get(attriNum).name() == attribName)</div><div class="line"><a name="l00148"></a><span class="lineno">  148</span>&#160;        {</div><div class="line"><a name="l00149"></a><span class="lineno">  149</span>&#160;            <span class="keywordflow">if</span> (attribs.Get(attriNum).type() == expectedType)</div><div class="line"><a name="l00150"></a><span class="lineno">  150</span>&#160;            {</div><div class="line"><a name="l00151"></a><span class="lineno">  151</span>&#160;                callable(attribs.Get(attriNum));</div><div class="line"><a name="l00152"></a><span class="lineno">  152</span>&#160;            }</div><div class="line"><a name="l00153"></a><span class="lineno">  153</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l00154"></a><span class="lineno">  154</span>&#160;            {</div><div class="line"><a name="l00155"></a><span class="lineno">  155</span>&#160;                <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_parse_exception.xhtml">ParseException</a>(</div><div class="line"><a name="l00156"></a><span class="lineno">  156</span>&#160;                    fmt::format(<span class="stringliteral">&quot;Attribute {} of node {} expected to have {} as onnx::AttributeProto::AttributeType, &quot;</span></div><div class="line"><a name="l00157"></a><span class="lineno">  157</span>&#160;                                <span class="stringliteral">&quot;but found {} instead {}&quot;</span>,</div><div class="line"><a name="l00158"></a><span class="lineno">  158</span>&#160;                                attribName,</div><div class="line"><a name="l00159"></a><span class="lineno">  159</span>&#160;                                node.name(),</div><div class="line"><a name="l00160"></a><span class="lineno">  160</span>&#160;                                onnx::AttributeProto::AttributeType_Name(expectedType),</div><div class="line"><a name="l00161"></a><span class="lineno">  161</span>&#160;                                onnx::AttributeProto::AttributeType_Name(attribs.Get(attriNum).type()),</div><div class="line"><a name="l00162"></a><span class="lineno">  162</span>&#160;                                <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l00163"></a><span class="lineno">  163</span>&#160;            }</div><div class="line"><a name="l00164"></a><span class="lineno">  164</span>&#160;        }</div><div class="line"><a name="l00165"></a><span class="lineno">  165</span>&#160;    }</div><div class="line"><a name="l00166"></a><span class="lineno">  166</span>&#160;}</div><div class="line"><a name="l00167"></a><span class="lineno">  167</span>&#160;</div><div class="line"><a name="l00168"></a><span class="lineno">  168</span>&#160;int64_t ReadOptionalNodeInt64Attribute(<span class="keyword">const</span> onnx::NodeProto&amp; node,</div><div class="line"><a name="l00169"></a><span class="lineno">  169</span>&#160;                                       <span class="keyword">const</span> std::string&amp; name,</div><div class="line"><a name="l00170"></a><span class="lineno">  170</span>&#160;                                       <span class="keyword">const</span> int64_t defaultValue = 0)</div><div class="line"><a name="l00171"></a><span class="lineno">  171</span>&#160;{</div><div class="line"><a name="l00172"></a><span class="lineno">  172</span>&#160;    int64_t attribValue = defaultValue;</div><div class="line"><a name="l00173"></a><span class="lineno">  173</span>&#160;    ReadOptionalNodeAttributeImpl(node, name, onnx::AttributeProto::INT,</div><div class="line"><a name="l00174"></a><span class="lineno">  174</span>&#160;                                  [&amp;attribValue](<span class="keyword">const</span> onnx::AttributeProto&amp; attrValue)</div><div class="line"><a name="l00175"></a><span class="lineno">  175</span>&#160;                                      {</div><div class="line"><a name="l00176"></a><span class="lineno">  176</span>&#160;                                          attribValue = attrValue.i();</div><div class="line"><a name="l00177"></a><span class="lineno">  177</span>&#160;                                      });</div><div class="line"><a name="l00178"></a><span class="lineno">  178</span>&#160;    <span class="keywordflow">return</span> attribValue;</div><div class="line"><a name="l00179"></a><span class="lineno">  179</span>&#160;}</div><div class="line"><a name="l00180"></a><span class="lineno">  180</span>&#160;</div><div class="line"><a name="l00181"></a><span class="lineno">  181</span>&#160;std::vector&lt;uint32_t&gt; ReadMandatoryNodeUint32ListAttribute(<span class="keyword">const</span> onnx::NodeProto&amp; node,</div><div class="line"><a name="l00182"></a><span class="lineno">  182</span>&#160;                                                           <span class="keyword">const</span> std::string&amp; name)</div><div class="line"><a name="l00183"></a><span class="lineno">  183</span>&#160;{</div><div class="line"><a name="l00184"></a><span class="lineno">  184</span>&#160;    std::vector&lt;uint32_t&gt; attriList;</div><div class="line"><a name="l00185"></a><span class="lineno">  185</span>&#160;    ReadMandatoryNodeAttributeImpl(node, name, onnx::AttributeProto::INTS,</div><div class="line"><a name="l00186"></a><span class="lineno">  186</span>&#160;        [&amp;attriList](<span class="keyword">const</span> onnx::AttributeProto&amp; attrValue)</div><div class="line"><a name="l00187"></a><span class="lineno">  187</span>&#160;    {</div><div class="line"><a name="l00188"></a><span class="lineno">  188</span>&#160;        <span class="keywordflow">for</span> (<span class="keywordtype">int</span> attriNum = 0; attriNum &lt; attrValue.ints_size(); ++attriNum)</div><div class="line"><a name="l00189"></a><span class="lineno">  189</span>&#160;        {</div><div class="line"><a name="l00190"></a><span class="lineno">  190</span>&#160;            attriList.push_back(<a class="code" href="_verification_helpers_8hpp.xhtml#aaef93dc9a69f51b59f3cdd0ff0165927">CHECKED_NON_NEGATIVE</a>(<a class="code" href="_verification_helpers_8hpp.xhtml#aa693ef8620e450b6362938828002f2a6">CHECKED_INT32</a>(attrValue.ints().Get(attriNum))));</div><div class="line"><a name="l00191"></a><span class="lineno">  191</span>&#160;        }</div><div class="line"><a name="l00192"></a><span class="lineno">  192</span>&#160;    });</div><div class="line"><a name="l00193"></a><span class="lineno">  193</span>&#160;    <span class="keywordflow">return</span> attriList;</div><div class="line"><a name="l00194"></a><span class="lineno">  194</span>&#160;}</div><div class="line"><a name="l00195"></a><span class="lineno">  195</span>&#160;</div><div class="line"><a name="l00196"></a><span class="lineno">  196</span>&#160;uint32_t ReadOptionalNodeUint32Attribute(<span class="keyword">const</span> onnx::NodeProto&amp; node,</div><div class="line"><a name="l00197"></a><span class="lineno">  197</span>&#160;                                         <span class="keyword">const</span> std::string&amp; name,</div><div class="line"><a name="l00198"></a><span class="lineno">  198</span>&#160;                                         <span class="keyword">const</span> uint32_t defaultVal = 0u)</div><div class="line"><a name="l00199"></a><span class="lineno">  199</span>&#160;{</div><div class="line"><a name="l00200"></a><span class="lineno">  200</span>&#160;    uint32_t attribValue = defaultVal;</div><div class="line"><a name="l00201"></a><span class="lineno">  201</span>&#160;    ReadOptionalNodeAttributeImpl(node, name, onnx::AttributeProto::INT,</div><div class="line"><a name="l00202"></a><span class="lineno">  202</span>&#160;        [&amp;attribValue](<span class="keyword">const</span> onnx::AttributeProto&amp; attrValue)</div><div class="line"><a name="l00203"></a><span class="lineno">  203</span>&#160;    {</div><div class="line"><a name="l00204"></a><span class="lineno">  204</span>&#160;        attribValue = <a class="code" href="_verification_helpers_8hpp.xhtml#aaef93dc9a69f51b59f3cdd0ff0165927">CHECKED_NON_NEGATIVE</a>(<a class="code" href="_verification_helpers_8hpp.xhtml#aa693ef8620e450b6362938828002f2a6">CHECKED_INT32</a>((attrValue.i())));</div><div class="line"><a name="l00205"></a><span class="lineno">  205</span>&#160;    });</div><div class="line"><a name="l00206"></a><span class="lineno">  206</span>&#160;    <span class="keywordflow">return</span> attribValue;</div><div class="line"><a name="l00207"></a><span class="lineno">  207</span>&#160;}</div><div class="line"><a name="l00208"></a><span class="lineno">  208</span>&#160;</div><div class="line"><a name="l00209"></a><span class="lineno">  209</span>&#160;std::vector&lt;uint32_t&gt; ReadOptionalNodeUint32ListAttribute(<span class="keyword">const</span> onnx::NodeProto&amp; node,</div><div class="line"><a name="l00210"></a><span class="lineno">  210</span>&#160;                                                          <span class="keyword">const</span> std::string&amp; name)</div><div class="line"><a name="l00211"></a><span class="lineno">  211</span>&#160;{</div><div class="line"><a name="l00212"></a><span class="lineno">  212</span>&#160;    std::vector&lt;uint32_t&gt; attriList;</div><div class="line"><a name="l00213"></a><span class="lineno">  213</span>&#160;    ReadOptionalNodeAttributeImpl(node, name, onnx::AttributeProto::INTS,</div><div class="line"><a name="l00214"></a><span class="lineno">  214</span>&#160;        [&amp;attriList](<span class="keyword">const</span> onnx::AttributeProto&amp; attrValue)</div><div class="line"><a name="l00215"></a><span class="lineno">  215</span>&#160;    {</div><div class="line"><a name="l00216"></a><span class="lineno">  216</span>&#160;        <span class="keywordflow">for</span> (<span class="keywordtype">int</span> attriNum = 0; attriNum &lt; attrValue.ints_size(); ++attriNum)</div><div class="line"><a name="l00217"></a><span class="lineno">  217</span>&#160;        {</div><div class="line"><a name="l00218"></a><span class="lineno">  218</span>&#160;            attriList.push_back(<a class="code" href="_verification_helpers_8hpp.xhtml#aaef93dc9a69f51b59f3cdd0ff0165927">CHECKED_NON_NEGATIVE</a>(<a class="code" href="_verification_helpers_8hpp.xhtml#aa693ef8620e450b6362938828002f2a6">CHECKED_INT32</a>(attrValue.ints().Get(attriNum))));</div><div class="line"><a name="l00219"></a><span class="lineno">  219</span>&#160;        }</div><div class="line"><a name="l00220"></a><span class="lineno">  220</span>&#160;    });</div><div class="line"><a name="l00221"></a><span class="lineno">  221</span>&#160;</div><div class="line"><a name="l00222"></a><span class="lineno">  222</span>&#160;    <span class="keywordflow">return</span> attriList;</div><div class="line"><a name="l00223"></a><span class="lineno">  223</span>&#160;}</div><div class="line"><a name="l00224"></a><span class="lineno">  224</span>&#160;</div><div class="line"><a name="l00225"></a><span class="lineno">  225</span>&#160;<span class="keywordtype">float</span> ReadOptionalNodeFloatAttribute(<span class="keyword">const</span> onnx::NodeProto&amp; node,</div><div class="line"><a name="l00226"></a><span class="lineno">  226</span>&#160;                                     <span class="keyword">const</span> std::string&amp; name,</div><div class="line"><a name="l00227"></a><span class="lineno">  227</span>&#160;                                     <span class="keyword">const</span> <span class="keywordtype">float</span> defaultValue = 0.0f)</div><div class="line"><a name="l00228"></a><span class="lineno">  228</span>&#160;{</div><div class="line"><a name="l00229"></a><span class="lineno">  229</span>&#160;    <span class="keywordtype">float</span> attribValue = defaultValue;</div><div class="line"><a name="l00230"></a><span class="lineno">  230</span>&#160;    ReadOptionalNodeAttributeImpl(node, name, onnx::AttributeProto::FLOAT,</div><div class="line"><a name="l00231"></a><span class="lineno">  231</span>&#160;        [&amp;attribValue](<span class="keyword">const</span> onnx::AttributeProto&amp; attrValue)</div><div class="line"><a name="l00232"></a><span class="lineno">  232</span>&#160;    {</div><div class="line"><a name="l00233"></a><span class="lineno">  233</span>&#160;        attribValue = attrValue.f();</div><div class="line"><a name="l00234"></a><span class="lineno">  234</span>&#160;    });</div><div class="line"><a name="l00235"></a><span class="lineno">  235</span>&#160;    <span class="keywordflow">return</span> attribValue;</div><div class="line"><a name="l00236"></a><span class="lineno">  236</span>&#160;}</div><div class="line"><a name="l00237"></a><span class="lineno">  237</span>&#160;</div><div class="line"><a name="l00238"></a><span class="lineno">  238</span>&#160;std::string ReadOptionalNodeStringAttribute(<span class="keyword">const</span> onnx::NodeProto&amp; node, <span class="keyword">const</span> std::string&amp; name)</div><div class="line"><a name="l00239"></a><span class="lineno">  239</span>&#160;{</div><div class="line"><a name="l00240"></a><span class="lineno">  240</span>&#160;    std::string attribValue = <span class="stringliteral">&quot;&quot;</span>;</div><div class="line"><a name="l00241"></a><span class="lineno">  241</span>&#160;    ReadOptionalNodeAttributeImpl(node, name, onnx::AttributeProto::STRING,</div><div class="line"><a name="l00242"></a><span class="lineno">  242</span>&#160;        [&amp;attribValue](<span class="keyword">const</span> onnx::AttributeProto&amp; attrValue)</div><div class="line"><a name="l00243"></a><span class="lineno">  243</span>&#160;    {</div><div class="line"><a name="l00244"></a><span class="lineno">  244</span>&#160;        attribValue = attrValue.s();</div><div class="line"><a name="l00245"></a><span class="lineno">  245</span>&#160;    });</div><div class="line"><a name="l00246"></a><span class="lineno">  246</span>&#160;    <span class="keywordflow">return</span> attribValue;</div><div class="line"><a name="l00247"></a><span class="lineno">  247</span>&#160;}</div><div class="line"><a name="l00248"></a><span class="lineno">  248</span>&#160;</div><div class="line"><a name="l00249"></a><span class="lineno">  249</span>&#160;<a class="code" href="classarmnn_1_1_tensor_info.xhtml">armnn::TensorInfo</a> <a class="code" href="namespacearmnn_deserializer.xhtml#a948b8c615ff06defa3b80d2352259ff2">ToTensorInfo</a>(<span class="keyword">const</span> std::string&amp; name, std::vector&lt;unsigned int&gt;&amp; shape, <span class="keywordtype">int</span> data_type)</div><div class="line"><a name="l00250"></a><span class="lineno">  250</span>&#160;{</div><div class="line"><a name="l00251"></a><span class="lineno">  251</span>&#160;  <a class="code" href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6">DataType</a> type;</div><div class="line"><a name="l00252"></a><span class="lineno">  252</span>&#160;  <span class="keywordflow">switch</span>(data_type)</div><div class="line"><a name="l00253"></a><span class="lineno">  253</span>&#160;  {</div><div class="line"><a name="l00254"></a><span class="lineno">  254</span>&#160;      <span class="keywordflow">case</span> onnx::TensorProto::FLOAT:</div><div class="line"><a name="l00255"></a><span class="lineno">  255</span>&#160;      {</div><div class="line"><a name="l00256"></a><span class="lineno">  256</span>&#160;        type = DataType::Float32;</div><div class="line"><a name="l00257"></a><span class="lineno">  257</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l00258"></a><span class="lineno">  258</span>&#160;      }</div><div class="line"><a name="l00259"></a><span class="lineno">  259</span>&#160;      <span class="keywordflow">case</span> onnx::TensorProto::INT32:</div><div class="line"><a name="l00260"></a><span class="lineno">  260</span>&#160;      <span class="keywordflow">case</span> onnx::TensorProto::INT64:</div><div class="line"><a name="l00261"></a><span class="lineno">  261</span>&#160;      {</div><div class="line"><a name="l00262"></a><span class="lineno">  262</span>&#160;          type = DataType::Signed32;</div><div class="line"><a name="l00263"></a><span class="lineno">  263</span>&#160;          <span class="keywordflow">break</span>;</div><div class="line"><a name="l00264"></a><span class="lineno">  264</span>&#160;      }</div><div class="line"><a name="l00265"></a><span class="lineno">  265</span>&#160;      <span class="keywordflow">default</span>:</div><div class="line"><a name="l00266"></a><span class="lineno">  266</span>&#160;      {</div><div class="line"><a name="l00267"></a><span class="lineno">  267</span>&#160;          <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_parse_exception.xhtml">ParseException</a>(</div><div class="line"><a name="l00268"></a><span class="lineno">  268</span>&#160;              fmt::format(<span class="stringliteral">&quot;&#39;{}&#39; is not a currently supported datatype for tensor {}.&quot;</span></div><div class="line"><a name="l00269"></a><span class="lineno">  269</span>&#160;                          <span class="stringliteral">&quot; Supported dataTypes are FLOAT, INT32 and INT64.  {}&quot;</span>,</div><div class="line"><a name="l00270"></a><span class="lineno">  270</span>&#160;                          onnx::TensorProto::DataType_Name(static_cast&lt;onnx::TensorProto::DataType&gt;(data_type)),</div><div class="line"><a name="l00271"></a><span class="lineno">  271</span>&#160;                          name,</div><div class="line"><a name="l00272"></a><span class="lineno">  272</span>&#160;                          <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString() ));</div><div class="line"><a name="l00273"></a><span class="lineno">  273</span>&#160;      }</div><div class="line"><a name="l00274"></a><span class="lineno">  274</span>&#160;  }</div><div class="line"><a name="l00275"></a><span class="lineno">  275</span>&#160;</div><div class="line"><a name="l00276"></a><span class="lineno">  276</span>&#160;  <span class="comment">// To avoid crashes by trivial tensors</span></div><div class="line"><a name="l00277"></a><span class="lineno">  277</span>&#160;  <span class="keywordflow">if</span> (shape.empty())</div><div class="line"><a name="l00278"></a><span class="lineno">  278</span>&#160;  {</div><div class="line"><a name="l00279"></a><span class="lineno">  279</span>&#160;      <span class="keywordflow">return</span> <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a>(<a class="code" href="classarmnn_1_1_tensor_shape.xhtml">TensorShape</a>(), type);</div><div class="line"><a name="l00280"></a><span class="lineno">  280</span>&#160;  }</div><div class="line"><a name="l00281"></a><span class="lineno">  281</span>&#160;</div><div class="line"><a name="l00282"></a><span class="lineno">  282</span>&#160;  <span class="keywordflow">return</span> <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a>(<a class="code" href="classarmnn_1_1_tensor_shape.xhtml">TensorShape</a>(static_cast&lt;unsigned int&gt;(shape.size()), shape.data()), type);</div><div class="line"><a name="l00283"></a><span class="lineno">  283</span>&#160;}</div><div class="line"><a name="l00284"></a><span class="lineno">  284</span>&#160;</div><div class="line"><a name="l00285"></a><span class="lineno">  285</span>&#160;<a class="code" href="classarmnn_1_1_tensor_info.xhtml">armnn::TensorInfo</a> <a class="code" href="namespacearmnn_deserializer.xhtml#a948b8c615ff06defa3b80d2352259ff2">ToTensorInfo</a>(<span class="keyword">const</span> onnx::ValueInfoProto&amp; <a class="code" href="namespacearmnn.xhtml#a4dc0adc6737b5944e7671bee71788407acaf9b6b99962bf5c2264824231d7a40c">info</a>)</div><div class="line"><a name="l00286"></a><span class="lineno">  286</span>&#160;{</div><div class="line"><a name="l00287"></a><span class="lineno">  287</span>&#160;  <span class="keyword">const</span> onnx::TensorShapeProto onnxShape = info.type().tensor_type().shape();</div><div class="line"><a name="l00288"></a><span class="lineno">  288</span>&#160;  std::vector&lt;unsigned int&gt; shapeDims;</div><div class="line"><a name="l00289"></a><span class="lineno">  289</span>&#160;  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; onnxShape.dim_size(); ++i)</div><div class="line"><a name="l00290"></a><span class="lineno">  290</span>&#160;  {</div><div class="line"><a name="l00291"></a><span class="lineno">  291</span>&#160;      shapeDims.push_back(<a class="code" href="_verification_helpers_8hpp.xhtml#aaef93dc9a69f51b59f3cdd0ff0165927">CHECKED_NON_NEGATIVE</a>(<a class="code" href="_verification_helpers_8hpp.xhtml#aa693ef8620e450b6362938828002f2a6">CHECKED_INT32</a>(onnxShape.dim(i).dim_value())));</div><div class="line"><a name="l00292"></a><span class="lineno">  292</span>&#160;  }</div><div class="line"><a name="l00293"></a><span class="lineno">  293</span>&#160;</div><div class="line"><a name="l00294"></a><span class="lineno">  294</span>&#160;  <span class="keywordflow">if</span> (shapeDims.empty())</div><div class="line"><a name="l00295"></a><span class="lineno">  295</span>&#160;  {</div><div class="line"><a name="l00296"></a><span class="lineno">  296</span>&#160;      shapeDims.push_back(1);</div><div class="line"><a name="l00297"></a><span class="lineno">  297</span>&#160;  }</div><div class="line"><a name="l00298"></a><span class="lineno">  298</span>&#160;</div><div class="line"><a name="l00299"></a><span class="lineno">  299</span>&#160;  <span class="keywordflow">return</span> <a class="code" href="namespacearmnn_deserializer.xhtml#a948b8c615ff06defa3b80d2352259ff2">ToTensorInfo</a>(info.name(), shapeDims, info.type().tensor_type().elem_type());</div><div class="line"><a name="l00300"></a><span class="lineno">  300</span>&#160;}</div><div class="line"><a name="l00301"></a><span class="lineno">  301</span>&#160;</div><div class="line"><a name="l00302"></a><span class="lineno">  302</span>&#160;<a class="code" href="classarmnn_1_1_tensor_info.xhtml">armnn::TensorInfo</a> <a class="code" href="namespacearmnn_deserializer.xhtml#a948b8c615ff06defa3b80d2352259ff2">ToTensorInfo</a>(<span class="keyword">const</span> onnx::TensorProto&amp; tensor)</div><div class="line"><a name="l00303"></a><span class="lineno">  303</span>&#160;{</div><div class="line"><a name="l00304"></a><span class="lineno">  304</span>&#160;  std::vector&lt;unsigned int&gt; shapeDims;</div><div class="line"><a name="l00305"></a><span class="lineno">  305</span>&#160;</div><div class="line"><a name="l00306"></a><span class="lineno">  306</span>&#160;  <span class="keywordflow">for</span> (<span class="keyword">auto</span> dim: tensor.dims())</div><div class="line"><a name="l00307"></a><span class="lineno">  307</span>&#160;  {</div><div class="line"><a name="l00308"></a><span class="lineno">  308</span>&#160;      shapeDims.push_back(<a class="code" href="_verification_helpers_8hpp.xhtml#aaef93dc9a69f51b59f3cdd0ff0165927">CHECKED_NON_NEGATIVE</a>(<a class="code" href="_verification_helpers_8hpp.xhtml#aa693ef8620e450b6362938828002f2a6">CHECKED_INT32</a>(dim)));</div><div class="line"><a name="l00309"></a><span class="lineno">  309</span>&#160;  }</div><div class="line"><a name="l00310"></a><span class="lineno">  310</span>&#160;</div><div class="line"><a name="l00311"></a><span class="lineno">  311</span>&#160;  <span class="keywordflow">if</span> (shapeDims.empty())</div><div class="line"><a name="l00312"></a><span class="lineno">  312</span>&#160;  {</div><div class="line"><a name="l00313"></a><span class="lineno">  313</span>&#160;      shapeDims.push_back(1);</div><div class="line"><a name="l00314"></a><span class="lineno">  314</span>&#160;  }</div><div class="line"><a name="l00315"></a><span class="lineno">  315</span>&#160;</div><div class="line"><a name="l00316"></a><span class="lineno">  316</span>&#160;  <span class="keywordflow">return</span> <a class="code" href="namespacearmnn_deserializer.xhtml#a948b8c615ff06defa3b80d2352259ff2">ToTensorInfo</a>(tensor.name(), shapeDims, tensor.data_type());</div><div class="line"><a name="l00317"></a><span class="lineno">  317</span>&#160;}</div><div class="line"><a name="l00318"></a><span class="lineno">  318</span>&#160;</div><div class="line"><a name="l00319"></a><span class="lineno">  319</span>&#160;std::string TensorInfoAsString(<span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a>&amp; info,</div><div class="line"><a name="l00320"></a><span class="lineno">  320</span>&#160;                               <span class="keyword">const</span> std::string&amp; name,</div><div class="line"><a name="l00321"></a><span class="lineno">  321</span>&#160;                               <span class="keyword">const</span> <a class="code" href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6">onnx::TensorProto::DataType</a>&amp; type)</div><div class="line"><a name="l00322"></a><span class="lineno">  322</span>&#160;{</div><div class="line"><a name="l00323"></a><span class="lineno">  323</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_shape.xhtml">TensorShape</a> shape = info.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a8b5d0f8a24e9d9238f412260a552acf8">GetShape</a>();</div><div class="line"><a name="l00324"></a><span class="lineno">  324</span>&#160;    std::stringstream ss;</div><div class="line"><a name="l00325"></a><span class="lineno">  325</span>&#160;    ss &lt;&lt; <span class="stringliteral">&quot;tensor &#39;&quot;</span> &lt;&lt; name &lt;&lt; <span class="stringliteral">&quot;&#39; contains &quot;</span></div><div class="line"><a name="l00326"></a><span class="lineno">  326</span>&#160;       &lt;&lt; onnx::TensorProto::DataType_Name(type)</div><div class="line"><a name="l00327"></a><span class="lineno">  327</span>&#160;       &lt;&lt; <span class="stringliteral">&quot; and has shape [&quot;</span>;</div><div class="line"><a name="l00328"></a><span class="lineno">  328</span>&#160;</div><div class="line"><a name="l00329"></a><span class="lineno">  329</span>&#160;    <span class="keywordflow">for</span> (uint32_t i = 0; i &lt; shape.<a class="code" href="classarmnn_1_1_tensor_shape.xhtml#a157e27d41e9f6b21f0d3c025fa47dc24">GetNumDimensions</a>() - 1; ++i)</div><div class="line"><a name="l00330"></a><span class="lineno">  330</span>&#160;    {</div><div class="line"><a name="l00331"></a><span class="lineno">  331</span>&#160;        ss &lt;&lt; shape[i] &lt;&lt; <span class="stringliteral">&quot;, &quot;</span>;</div><div class="line"><a name="l00332"></a><span class="lineno">  332</span>&#160;    }</div><div class="line"><a name="l00333"></a><span class="lineno">  333</span>&#160;    ss &lt;&lt; shape[shape.<a class="code" href="classarmnn_1_1_tensor_shape.xhtml#a157e27d41e9f6b21f0d3c025fa47dc24">GetNumDimensions</a>() - 1] &lt;&lt; <span class="stringliteral">&quot;]&quot;</span>;</div><div class="line"><a name="l00334"></a><span class="lineno">  334</span>&#160;    <span class="keywordflow">return</span> ss.str();</div><div class="line"><a name="l00335"></a><span class="lineno">  335</span>&#160;}</div><div class="line"><a name="l00336"></a><span class="lineno">  336</span>&#160;</div><div class="line"><a name="l00337"></a><span class="lineno">  337</span>&#160;<span class="keywordtype">void</span> <a class="code" href="namespacearmnn_tf_parser.xhtml#aca0a31de02d5c087029bb28c9202b4d6">CalcPadding</a>(uint32_t inputSize,</div><div class="line"><a name="l00338"></a><span class="lineno">  338</span>&#160;                 uint32_t filterSize,</div><div class="line"><a name="l00339"></a><span class="lineno">  339</span>&#160;                 uint32_t stride,</div><div class="line"><a name="l00340"></a><span class="lineno">  340</span>&#160;                 uint32_t dilation,</div><div class="line"><a name="l00341"></a><span class="lineno">  341</span>&#160;                 uint32_t* paddingFront,</div><div class="line"><a name="l00342"></a><span class="lineno">  342</span>&#160;                 uint32_t* paddingBack,</div><div class="line"><a name="l00343"></a><span class="lineno">  343</span>&#160;                 <span class="keywordtype">bool</span> isUpper)</div><div class="line"><a name="l00344"></a><span class="lineno">  344</span>&#160;{</div><div class="line"><a name="l00345"></a><span class="lineno">  345</span>&#160;    uint32_t outputSize = (inputSize + stride - 1) / stride;</div><div class="line"><a name="l00346"></a><span class="lineno">  346</span>&#160;    uint32_t dilatedSize = filterSize + (dilation - 1) * (filterSize - 1);</div><div class="line"><a name="l00347"></a><span class="lineno">  347</span>&#160;    uint32_t temp = (outputSize - 1) * stride + dilatedSize;</div><div class="line"><a name="l00348"></a><span class="lineno">  348</span>&#160;    *paddingFront = (temp - inputSize) / 2;</div><div class="line"><a name="l00349"></a><span class="lineno">  349</span>&#160;    *paddingBack = *paddingFront;</div><div class="line"><a name="l00350"></a><span class="lineno">  350</span>&#160;    <span class="keywordflow">if</span>((temp - inputSize) % 2 == 1)</div><div class="line"><a name="l00351"></a><span class="lineno">  351</span>&#160;    {</div><div class="line"><a name="l00352"></a><span class="lineno">  352</span>&#160;        <span class="keywordflow">if</span> (isUpper)</div><div class="line"><a name="l00353"></a><span class="lineno">  353</span>&#160;        {</div><div class="line"><a name="l00354"></a><span class="lineno">  354</span>&#160;            *paddingBack += 1;</div><div class="line"><a name="l00355"></a><span class="lineno">  355</span>&#160;        }</div><div class="line"><a name="l00356"></a><span class="lineno">  356</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l00357"></a><span class="lineno">  357</span>&#160;        {</div><div class="line"><a name="l00358"></a><span class="lineno">  358</span>&#160;            *paddingFront += 1;</div><div class="line"><a name="l00359"></a><span class="lineno">  359</span>&#160;        }</div><div class="line"><a name="l00360"></a><span class="lineno">  360</span>&#160;    }</div><div class="line"><a name="l00361"></a><span class="lineno">  361</span>&#160;}</div><div class="line"><a name="l00362"></a><span class="lineno">  362</span>&#160;</div><div class="line"><a name="l00363"></a><span class="lineno">  363</span>&#160;<a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> ComputeReshapeInfo(<span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_shape.xhtml">TensorShape</a>&amp; targetShapeTensor,</div><div class="line"><a name="l00364"></a><span class="lineno">  364</span>&#160;                              <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_shape.xhtml">TensorShape</a>&amp; inShape,</div><div class="line"><a name="l00365"></a><span class="lineno">  365</span>&#160;                              <span class="keyword">const</span> std::string&amp; outName)</div><div class="line"><a name="l00366"></a><span class="lineno">  366</span>&#160;{</div><div class="line"><a name="l00367"></a><span class="lineno">  367</span>&#160;    std::vector&lt;int&gt; targetDims;</div><div class="line"><a name="l00368"></a><span class="lineno">  368</span>&#160;    <span class="keywordflow">for</span>(uint i = 0; i &lt; targetShapeTensor.<a class="code" href="classarmnn_1_1_tensor_shape.xhtml#a157e27d41e9f6b21f0d3c025fa47dc24">GetNumDimensions</a>(); ++i)</div><div class="line"><a name="l00369"></a><span class="lineno">  369</span>&#160;    {</div><div class="line"><a name="l00370"></a><span class="lineno">  370</span>&#160;        <span class="keywordtype">int</span> val = <a class="code" href="_verification_helpers_8hpp.xhtml#aa693ef8620e450b6362938828002f2a6">CHECKED_INT32</a>(targetShapeTensor[i]);</div><div class="line"><a name="l00371"></a><span class="lineno">  371</span>&#160;        <span class="keywordflow">if</span>(val == 0)</div><div class="line"><a name="l00372"></a><span class="lineno">  372</span>&#160;        {</div><div class="line"><a name="l00373"></a><span class="lineno">  373</span>&#160;            targetDims.push_back(static_cast&lt;int&gt;(inShape[static_cast&lt;uint&gt;(i)]));</div><div class="line"><a name="l00374"></a><span class="lineno">  374</span>&#160;        }</div><div class="line"><a name="l00375"></a><span class="lineno">  375</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l00376"></a><span class="lineno">  376</span>&#160;        {</div><div class="line"><a name="l00377"></a><span class="lineno">  377</span>&#160;            targetDims.push_back(val);</div><div class="line"><a name="l00378"></a><span class="lineno">  378</span>&#160;        }</div><div class="line"><a name="l00379"></a><span class="lineno">  379</span>&#160;    }</div><div class="line"><a name="l00380"></a><span class="lineno">  380</span>&#160;</div><div class="line"><a name="l00381"></a><span class="lineno">  381</span>&#160;    std::vector&lt;unsigned int&gt; outDims(targetDims.begin(), targetDims.end());</div><div class="line"><a name="l00382"></a><span class="lineno">  382</span>&#160;    <span class="keyword">const</span> <span class="keyword">auto</span> stretchDim = std::find(targetDims.begin(), targetDims.end(), -1);</div><div class="line"><a name="l00383"></a><span class="lineno">  383</span>&#160;    <span class="keywordflow">if</span> (stretchDim != targetDims.end())</div><div class="line"><a name="l00384"></a><span class="lineno">  384</span>&#160;    {</div><div class="line"><a name="l00385"></a><span class="lineno">  385</span>&#160;        <span class="keywordflow">if</span> (std::find(std::next(stretchDim), targetDims.end(), -1) != targetDims.end())</div><div class="line"><a name="l00386"></a><span class="lineno">  386</span>&#160;        {</div><div class="line"><a name="l00387"></a><span class="lineno">  387</span>&#160;            std::stringstream ss;</div><div class="line"><a name="l00388"></a><span class="lineno">  388</span>&#160;            ss &lt;&lt; <span class="stringliteral">&quot;[ &quot;</span>;</div><div class="line"><a name="l00389"></a><span class="lineno">  389</span>&#160;            <span class="keywordflow">for</span>(uint i = 0; i &lt; targetDims.size() - 1; ++i)</div><div class="line"><a name="l00390"></a><span class="lineno">  390</span>&#160;            {</div><div class="line"><a name="l00391"></a><span class="lineno">  391</span>&#160;                ss &lt;&lt; targetDims[i] &lt;&lt; <span class="stringliteral">&quot;, &quot;</span>;</div><div class="line"><a name="l00392"></a><span class="lineno">  392</span>&#160;            }</div><div class="line"><a name="l00393"></a><span class="lineno">  393</span>&#160;            ss &lt;&lt; targetDims[targetDims.size() - 1] &lt;&lt; <span class="stringliteral">&quot; ]&quot;</span>;</div><div class="line"><a name="l00394"></a><span class="lineno">  394</span>&#160;</div><div class="line"><a name="l00395"></a><span class="lineno">  395</span>&#160;            <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_parse_exception.xhtml">ParseException</a>(</div><div class="line"><a name="l00396"></a><span class="lineno">  396</span>&#160;                fmt::format(<span class="stringliteral">&quot;Error during creation of reshaped tensor &#39;{}&#39;. At most one component of shape can be &quot;</span></div><div class="line"><a name="l00397"></a><span class="lineno">  397</span>&#160;                            <span class="stringliteral">&quot; -1 and here, shape is {} {}&quot;</span>,</div><div class="line"><a name="l00398"></a><span class="lineno">  398</span>&#160;                            outName,</div><div class="line"><a name="l00399"></a><span class="lineno">  399</span>&#160;                            ss.str(),</div><div class="line"><a name="l00400"></a><span class="lineno">  400</span>&#160;                            <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l00401"></a><span class="lineno">  401</span>&#160;        }</div><div class="line"><a name="l00402"></a><span class="lineno">  402</span>&#160;</div><div class="line"><a name="l00403"></a><span class="lineno">  403</span>&#160;        <span class="keyword">auto</span> targetNumElements = <a class="code" href="namespacearmnn.xhtml#a375ca3cff9f1b005d1412dc5f3cf5b6e">armnn::numeric_cast</a>&lt;<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>&gt;(std::accumulate(targetDims.begin(), targetDims.end(),</div><div class="line"><a name="l00404"></a><span class="lineno">  404</span>&#160;            -1, std::multiplies&lt;int32_t&gt;()));</div><div class="line"><a name="l00405"></a><span class="lineno">  405</span>&#160;        <span class="keyword">auto</span> stretchIndex = <span class="keyword">static_cast&lt;</span><span class="keywordtype">size_t</span><span class="keyword">&gt;</span>(std::distance(targetDims.begin(), stretchDim));</div><div class="line"><a name="l00406"></a><span class="lineno">  406</span>&#160;        outDims[stretchIndex] = inShape.<a class="code" href="classarmnn_1_1_tensor_shape.xhtml#a8846406ac37fbd2204f0be16ee05d5b7">GetNumElements</a>() / targetNumElements;</div><div class="line"><a name="l00407"></a><span class="lineno">  407</span>&#160;    }</div><div class="line"><a name="l00408"></a><span class="lineno">  408</span>&#160;    <a class="code" href="classarmnn_1_1_tensor_shape.xhtml">TensorShape</a> outShape = <a class="code" href="classarmnn_1_1_tensor_shape.xhtml">TensorShape</a>{<span class="keyword">static_cast&lt;</span><span class="keywordtype">unsigned</span> <span class="keywordtype">int</span><span class="keyword">&gt;</span>(outDims.size()), outDims.data()};</div><div class="line"><a name="l00409"></a><span class="lineno">  409</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a>(outShape, DataType::Float32);</div><div class="line"><a name="l00410"></a><span class="lineno">  410</span>&#160;}</div><div class="line"><a name="l00411"></a><span class="lineno">  411</span>&#160;</div><div class="line"><a name="l00412"></a><span class="lineno">  412</span>&#160;} <span class="comment">//namespace</span></div><div class="line"><a name="l00413"></a><span class="lineno">  413</span>&#160;</div><div class="line"><a name="l00414"></a><span class="lineno">  414</span>&#160;<span class="keyword">const</span> std::map&lt;std::string, OnnxParserImpl::OperationParsingFunction&gt; OnnxParserImpl::m_ParserFunctions = {</div><div class="line"><a name="l00415"></a><span class="lineno">  415</span>&#160;    { <span class="stringliteral">&quot;BatchNormalization&quot;</span>,    &amp;OnnxParserImpl::ParseBatchNormalization},</div><div class="line"><a name="l00416"></a><span class="lineno">  416</span>&#160;    { <span class="stringliteral">&quot;GlobalAveragePool&quot;</span>,     &amp;OnnxParserImpl::ParseGlobalAveragePool},</div><div class="line"><a name="l00417"></a><span class="lineno">  417</span>&#160;    { <span class="stringliteral">&quot;AveragePool&quot;</span>,           &amp;OnnxParserImpl::ParseAveragePool },</div><div class="line"><a name="l00418"></a><span class="lineno">  418</span>&#160;    { <span class="stringliteral">&quot;Clip&quot;</span>,                  &amp;OnnxParserImpl::ParseClip },</div><div class="line"><a name="l00419"></a><span class="lineno">  419</span>&#160;    { <span class="stringliteral">&quot;Constant&quot;</span>,              &amp;OnnxParserImpl::ParseConstant },</div><div class="line"><a name="l00420"></a><span class="lineno">  420</span>&#160;    { <span class="stringliteral">&quot;MaxPool&quot;</span>,               &amp;OnnxParserImpl::ParseMaxPool },</div><div class="line"><a name="l00421"></a><span class="lineno">  421</span>&#160;    { <span class="stringliteral">&quot;Reshape&quot;</span>,               &amp;OnnxParserImpl::ParseReshape },</div><div class="line"><a name="l00422"></a><span class="lineno">  422</span>&#160;    { <span class="stringliteral">&quot;Sigmoid&quot;</span>,               &amp;OnnxParserImpl::ParseSigmoid },</div><div class="line"><a name="l00423"></a><span class="lineno">  423</span>&#160;    { <span class="stringliteral">&quot;Tanh&quot;</span>,                  &amp;OnnxParserImpl::ParseTanh },</div><div class="line"><a name="l00424"></a><span class="lineno">  424</span>&#160;    { <span class="stringliteral">&quot;Relu&quot;</span>,                  &amp;OnnxParserImpl::ParseRelu },</div><div class="line"><a name="l00425"></a><span class="lineno">  425</span>&#160;    { <span class="stringliteral">&quot;LeakyRelu&quot;</span>,             &amp;OnnxParserImpl::ParseLeakyRelu },</div><div class="line"><a name="l00426"></a><span class="lineno">  426</span>&#160;    { <span class="stringliteral">&quot;Conv&quot;</span>,                  &amp;OnnxParserImpl::ParseConv },</div><div class="line"><a name="l00427"></a><span class="lineno">  427</span>&#160;    { <span class="stringliteral">&quot;Add&quot;</span>,                   &amp;OnnxParserImpl::ParseAdd },</div><div class="line"><a name="l00428"></a><span class="lineno">  428</span>&#160;    { <span class="stringliteral">&quot;Flatten&quot;</span>,               &amp;OnnxParserImpl::ParseFlatten},</div><div class="line"><a name="l00429"></a><span class="lineno">  429</span>&#160;};</div><div class="line"><a name="l00430"></a><span class="lineno">  430</span>&#160;</div><div class="line"><a name="l00431"></a><span class="lineno">  431</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> TypePair, <span class="keyword">typename</span> Location&gt;</div><div class="line"><a name="l00432"></a><span class="lineno"><a class="line" href="classarmnn_onnx_parser_1_1_onnx_parser_impl.xhtml#a74e612d0e7242695de575fb44e7f0762">  432</a></span>&#160;<span class="keywordtype">void</span> OnnxParserImpl::ValidateInputs(<span class="keyword">const</span> onnx::NodeProto&amp; node,</div><div class="line"><a name="l00433"></a><span class="lineno">  433</span>&#160;                                TypePair validInputs,</div><div class="line"><a name="l00434"></a><span class="lineno">  434</span>&#160;                                <span class="keyword">const</span> Location&amp; location)</div><div class="line"><a name="l00435"></a><span class="lineno">  435</span>&#160;{</div><div class="line"><a name="l00436"></a><span class="lineno">  436</span>&#160;    <span class="keywordflow">for</span>(<span class="keyword">auto</span> input : node.input())</div><div class="line"><a name="l00437"></a><span class="lineno">  437</span>&#160;    {</div><div class="line"><a name="l00438"></a><span class="lineno">  438</span>&#160;        CheckValidDataType(validInputs.second,</div><div class="line"><a name="l00439"></a><span class="lineno">  439</span>&#160;                           m_TensorsInfo[input].m_dtype,</div><div class="line"><a name="l00440"></a><span class="lineno">  440</span>&#160;                           validInputs.first,</div><div class="line"><a name="l00441"></a><span class="lineno">  441</span>&#160;                           node.name(),</div><div class="line"><a name="l00442"></a><span class="lineno">  442</span>&#160;                           input,</div><div class="line"><a name="l00443"></a><span class="lineno">  443</span>&#160;                           location);</div><div class="line"><a name="l00444"></a><span class="lineno">  444</span>&#160;    }</div><div class="line"><a name="l00445"></a><span class="lineno">  445</span>&#160;}</div><div class="line"><a name="l00446"></a><span class="lineno">  446</span>&#160;</div><div class="line"><a name="l00447"></a><span class="lineno"><a class="line" href="_onnx_parser_8cpp.xhtml#a0e987f9d4f46b35c9b1ff0cc950dc5b1">  447</a></span>&#160;<span class="preprocessor">#define VALID_INPUTS(NODE, VALID_INPUTS) \</span></div><div class="line"><a name="l00448"></a><span class="lineno">  448</span>&#160;<span class="preprocessor">    OnnxParserImpl::ValidateInputs(NODE, \</span></div><div class="line"><a name="l00449"></a><span class="lineno">  449</span>&#160;<span class="preprocessor">                               VALID_INPUTS, \</span></div><div class="line"><a name="l00450"></a><span class="lineno">  450</span>&#160;<span class="preprocessor">                               CHECK_LOCATION())</span></div><div class="line"><a name="l00451"></a><span class="lineno">  451</span>&#160;</div><div class="line"><a name="l00452"></a><span class="lineno">  452</span>&#160;std::vector&lt;TensorInfo&gt; OnnxParserImpl::ComputeOutputInfo(std::vector&lt;std::string&gt; outNames,</div><div class="line"><a name="l00453"></a><span class="lineno">  453</span>&#160;                                                          <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml">IConnectableLayer</a>* layer,</div><div class="line"><a name="l00454"></a><span class="lineno">  454</span>&#160;                                                          std::vector&lt;TensorShape&gt; inputShapes)</div><div class="line"><a name="l00455"></a><span class="lineno">  455</span>&#160;{</div><div class="line"><a name="l00456"></a><span class="lineno">  456</span>&#160;    <a class="code" href="_assert_8hpp.xhtml#a5698be69cbd5dfe6c28fcd9867e8cbed">ARMNN_ASSERT</a>(! outNames.empty());</div><div class="line"><a name="l00457"></a><span class="lineno">  457</span>&#160;    <span class="keywordtype">bool</span> needCompute = std::any_of(outNames.begin(),</div><div class="line"><a name="l00458"></a><span class="lineno">  458</span>&#160;                                   outNames.end(),</div><div class="line"><a name="l00459"></a><span class="lineno">  459</span>&#160;                                   [<span class="keyword">this</span>](std::string name)</div><div class="line"><a name="l00460"></a><span class="lineno">  460</span>&#160;                                   {</div><div class="line"><a name="l00461"></a><span class="lineno">  461</span>&#160;                                       <span class="keywordflow">return</span> (m_TensorsInfo.count(name) == 0 || m_TensorsInfo[name].m_info == <span class="keyword">nullptr</span>);</div><div class="line"><a name="l00462"></a><span class="lineno">  462</span>&#160;                                   });</div><div class="line"><a name="l00463"></a><span class="lineno">  463</span>&#160;     std::vector&lt;TensorInfo&gt; outInfo;</div><div class="line"><a name="l00464"></a><span class="lineno">  464</span>&#160;     <span class="comment">//if the output info(s) are not here, we need to compute them</span></div><div class="line"><a name="l00465"></a><span class="lineno">  465</span>&#160;     std::vector&lt;TensorShape&gt; inferredShapes;</div><div class="line"><a name="l00466"></a><span class="lineno">  466</span>&#160;     <span class="keywordflow">if</span>(needCompute)</div><div class="line"><a name="l00467"></a><span class="lineno">  467</span>&#160;     {</div><div class="line"><a name="l00468"></a><span class="lineno">  468</span>&#160;         inferredShapes = layer-&gt;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml#aa6e3c075c888e7c16942a468a3aae33c">InferOutputShapes</a>(inputShapes);</div><div class="line"><a name="l00469"></a><span class="lineno">  469</span>&#160;         <a class="code" href="_assert_8hpp.xhtml#a5698be69cbd5dfe6c28fcd9867e8cbed">ARMNN_ASSERT</a>(inferredShapes.size() == outNames.size());</div><div class="line"><a name="l00470"></a><span class="lineno">  470</span>&#160;     }</div><div class="line"><a name="l00471"></a><span class="lineno">  471</span>&#160;     <span class="keywordflow">for</span> (uint i = 0; i &lt; outNames.size(); ++i)</div><div class="line"><a name="l00472"></a><span class="lineno">  472</span>&#160;     {</div><div class="line"><a name="l00473"></a><span class="lineno">  473</span>&#160;         <span class="keywordflow">if</span>(needCompute)</div><div class="line"><a name="l00474"></a><span class="lineno">  474</span>&#160;         {</div><div class="line"><a name="l00475"></a><span class="lineno">  475</span>&#160;             m_TensorsInfo[outNames[i]] = OnnxTensor();</div><div class="line"><a name="l00476"></a><span class="lineno">  476</span>&#160;             m_TensorsInfo[outNames[i]].m_info = std::make_unique&lt;TensorInfo&gt;(</div><div class="line"><a name="l00477"></a><span class="lineno">  477</span>&#160;                <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a>(inferredShapes[i], DataType::Float32));</div><div class="line"><a name="l00478"></a><span class="lineno">  478</span>&#160;         }</div><div class="line"><a name="l00479"></a><span class="lineno">  479</span>&#160;        outInfo.push_back(*m_TensorsInfo[outNames[i]].m_info);</div><div class="line"><a name="l00480"></a><span class="lineno">  480</span>&#160;     }</div><div class="line"><a name="l00481"></a><span class="lineno">  481</span>&#160;     <span class="keywordflow">return</span> outInfo;</div><div class="line"><a name="l00482"></a><span class="lineno">  482</span>&#160;}</div><div class="line"><a name="l00483"></a><span class="lineno">  483</span>&#160;</div><div class="line"><a name="l00484"></a><span class="lineno"><a class="line" href="classarmnn_onnx_parser_1_1_onnx_parser_impl.xhtml#ad131103003f2f4c6e4e3a7406192ad30">  484</a></span>&#160;OnnxParserImpl::OnnxParserImpl()</div><div class="line"><a name="l00485"></a><span class="lineno">  485</span>&#160;    : m_Network(nullptr, nullptr)</div><div class="line"><a name="l00486"></a><span class="lineno">  486</span>&#160;{</div><div class="line"><a name="l00487"></a><span class="lineno">  487</span>&#160;}</div><div class="line"><a name="l00488"></a><span class="lineno">  488</span>&#160;</div><div class="line"><a name="l00489"></a><span class="lineno">  489</span>&#160;<span class="keywordtype">void</span> OnnxParserImpl::ResetParser()</div><div class="line"><a name="l00490"></a><span class="lineno">  490</span>&#160;{</div><div class="line"><a name="l00491"></a><span class="lineno">  491</span>&#160;    m_Network = <a class="code" href="namespacearmnn.xhtml#ace74f6f9feb95a964a49d79458232703">armnn::INetworkPtr</a>(<span class="keyword">nullptr</span>, <span class="keyword">nullptr</span>);</div><div class="line"><a name="l00492"></a><span class="lineno">  492</span>&#160;    m_Graph = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00493"></a><span class="lineno">  493</span>&#160;}</div><div class="line"><a name="l00494"></a><span class="lineno">  494</span>&#160;</div><div class="line"><a name="l00495"></a><span class="lineno">  495</span>&#160;<span class="keywordtype">void</span> OnnxParserImpl::Cleanup()</div><div class="line"><a name="l00496"></a><span class="lineno">  496</span>&#160;{</div><div class="line"><a name="l00497"></a><span class="lineno">  497</span>&#160;    m_TensorConnections.clear();</div><div class="line"><a name="l00498"></a><span class="lineno">  498</span>&#160;    m_TensorsInfo.clear();</div><div class="line"><a name="l00499"></a><span class="lineno">  499</span>&#160;    m_OutputsMap.clear();</div><div class="line"><a name="l00500"></a><span class="lineno">  500</span>&#160;    m_OutputsFusedAndUsed.clear();</div><div class="line"><a name="l00501"></a><span class="lineno">  501</span>&#160;}</div><div class="line"><a name="l00502"></a><span class="lineno">  502</span>&#160;</div><div class="line"><a name="l00503"></a><span class="lineno">  503</span>&#160;std::pair&lt;ConstTensor, std::unique_ptr&lt;float[]&gt;&gt; OnnxParserImpl::CreateConstTensor(<span class="keyword">const</span> std::string name)</div><div class="line"><a name="l00504"></a><span class="lineno">  504</span>&#160;{</div><div class="line"><a name="l00505"></a><span class="lineno">  505</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> tensorInfo = *m_TensorsInfo[name].m_info;</div><div class="line"><a name="l00506"></a><span class="lineno">  506</span>&#160;    onnx::TensorProto onnxTensor = *m_TensorsInfo[name].m_tensor;</div><div class="line"><a name="l00507"></a><span class="lineno">  507</span>&#160;</div><div class="line"><a name="l00508"></a><span class="lineno">  508</span>&#160;    <span class="keyword">auto</span> srcData = onnxTensor.float_data().data();</div><div class="line"><a name="l00509"></a><span class="lineno">  509</span>&#160;    std::unique_ptr&lt;float[]&gt; tensorData(<span class="keyword">new</span> <span class="keywordtype">float</span>[tensorInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a8846406ac37fbd2204f0be16ee05d5b7">GetNumElements</a>()]);</div><div class="line"><a name="l00510"></a><span class="lineno">  510</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> tensorSizeInBytes = tensorInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#abcbdfb544ece4c31d0b37715ad0f3be0">GetNumBytes</a>();</div><div class="line"><a name="l00511"></a><span class="lineno">  511</span>&#160;    <span class="comment">// Copy the value list entries into the destination</span></div><div class="line"><a name="l00512"></a><span class="lineno">  512</span>&#160;    <span class="keywordflow">if</span> (!onnxTensor.has_raw_data())</div><div class="line"><a name="l00513"></a><span class="lineno">  513</span>&#160;    {</div><div class="line"><a name="l00514"></a><span class="lineno">  514</span>&#160;        <span class="keywordflow">if</span>(tensorInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a8846406ac37fbd2204f0be16ee05d5b7">GetNumElements</a>() != <span class="keyword">static_cast&lt;</span>uint<span class="keyword">&gt;</span>(onnxTensor.float_data_size()))</div><div class="line"><a name="l00515"></a><span class="lineno">  515</span>&#160;        {</div><div class="line"><a name="l00516"></a><span class="lineno">  516</span>&#160;            <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_parse_exception.xhtml">ParseException</a>(</div><div class="line"><a name="l00517"></a><span class="lineno">  517</span>&#160;                fmt::format(<span class="stringliteral">&quot;The number of data provided ({}) does not match the tensor &#39;{}&#39; number of &quot;</span></div><div class="line"><a name="l00518"></a><span class="lineno">  518</span>&#160;                            <span class="stringliteral">&quot;elements ({}) {}&quot;</span>,</div><div class="line"><a name="l00519"></a><span class="lineno">  519</span>&#160;                            onnxTensor.float_data_size(),</div><div class="line"><a name="l00520"></a><span class="lineno">  520</span>&#160;                            name,</div><div class="line"><a name="l00521"></a><span class="lineno">  521</span>&#160;                            tensorInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a8846406ac37fbd2204f0be16ee05d5b7">GetNumElements</a>(),</div><div class="line"><a name="l00522"></a><span class="lineno">  522</span>&#160;                            <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l00523"></a><span class="lineno">  523</span>&#160;        }</div><div class="line"><a name="l00524"></a><span class="lineno">  524</span>&#160;        ::memcpy(tensorData.get(), srcData, tensorSizeInBytes);</div><div class="line"><a name="l00525"></a><span class="lineno">  525</span>&#160;    }</div><div class="line"><a name="l00526"></a><span class="lineno">  526</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l00527"></a><span class="lineno">  527</span>&#160;    {</div><div class="line"><a name="l00528"></a><span class="lineno">  528</span>&#160;        ::memcpy(tensorData.get(), onnxTensor.raw_data().c_str(), tensorSizeInBytes);</div><div class="line"><a name="l00529"></a><span class="lineno">  529</span>&#160;    }</div><div class="line"><a name="l00530"></a><span class="lineno">  530</span>&#160;</div><div class="line"><a name="l00531"></a><span class="lineno">  531</span>&#160;    <span class="comment">// Const tensors requires at least a list of values</span></div><div class="line"><a name="l00532"></a><span class="lineno">  532</span>&#160;    <span class="keywordflow">if</span> (tensorInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a8846406ac37fbd2204f0be16ee05d5b7">GetNumElements</a>() == 0)</div><div class="line"><a name="l00533"></a><span class="lineno">  533</span>&#160;    {</div><div class="line"><a name="l00534"></a><span class="lineno">  534</span>&#160;        <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_parse_exception.xhtml">ParseException</a>(fmt::format(<span class="stringliteral">&quot;No tensor data found for Const tensor &#39;{}&#39; {}&quot;</span>,</div><div class="line"><a name="l00535"></a><span class="lineno">  535</span>&#160;                                         name,</div><div class="line"><a name="l00536"></a><span class="lineno">  536</span>&#160;                                         <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l00537"></a><span class="lineno">  537</span>&#160;    }</div><div class="line"><a name="l00538"></a><span class="lineno">  538</span>&#160;    <span class="keywordflow">return</span> std::make_pair(<a class="code" href="classarmnn_1_1_const_tensor.xhtml">ConstTensor</a>(tensorInfo, tensorData.get()), std::move(tensorData));</div><div class="line"><a name="l00539"></a><span class="lineno">  539</span>&#160;}</div><div class="line"><a name="l00540"></a><span class="lineno">  540</span>&#160;</div><div class="line"><a name="l00541"></a><span class="lineno"><a class="line" href="classarmnn_onnx_parser_1_1_onnx_parser_impl.xhtml#a975a79b9b35d51ea81c42c05d245e7c0">  541</a></span>&#160;<a class="code" href="namespacearmnn_onnx_parser.xhtml#a503ae4f55dae1486e53978657083b35d">ModelPtr</a> <a class="code" href="classarmnn_onnx_parser_1_1_onnx_parser_impl.xhtml#a975a79b9b35d51ea81c42c05d245e7c0">OnnxParserImpl::LoadModelFromTextFile</a>(<span class="keyword">const</span> <span class="keywordtype">char</span>* graphFile)</div><div class="line"><a name="l00542"></a><span class="lineno">  542</span>&#160;{</div><div class="line"><a name="l00543"></a><span class="lineno">  543</span>&#160;    FILE* fd = fopen(graphFile, <span class="stringliteral">&quot;r&quot;</span>);</div><div class="line"><a name="l00544"></a><span class="lineno">  544</span>&#160;</div><div class="line"><a name="l00545"></a><span class="lineno">  545</span>&#160;    <span class="keywordflow">if</span> (fd == <span class="keyword">nullptr</span>)</div><div class="line"><a name="l00546"></a><span class="lineno">  546</span>&#160;    {</div><div class="line"><a name="l00547"></a><span class="lineno">  547</span>&#160;        <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_file_not_found_exception.xhtml">FileNotFoundException</a>(fmt::format(<span class="stringliteral">&quot;Invalid (null) filename {}&quot;</span>, <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l00548"></a><span class="lineno">  548</span>&#160;    }</div><div class="line"><a name="l00549"></a><span class="lineno">  549</span>&#160;</div><div class="line"><a name="l00550"></a><span class="lineno">  550</span>&#160;    <span class="comment">// Parse the file into a message</span></div><div class="line"><a name="l00551"></a><span class="lineno">  551</span>&#160;    <a class="code" href="namespacearmnn_onnx_parser.xhtml#a503ae4f55dae1486e53978657083b35d">ModelPtr</a>     modelProto = std::make_unique&lt;onnx::ModelProto&gt;();</div><div class="line"><a name="l00552"></a><span class="lineno">  552</span>&#160;    <span class="keyword">using</span> google::protobuf::io::FileInputStream;</div><div class="line"><a name="l00553"></a><span class="lineno">  553</span>&#160;    std::unique_ptr&lt;FileInputStream&gt; input = std::make_unique&lt;FileInputStream&gt;(fileno(fd));</div><div class="line"><a name="l00554"></a><span class="lineno">  554</span>&#160;    <span class="keywordtype">bool</span>                 success = google::protobuf::TextFormat::Parse(input.get(), modelProto.get());</div><div class="line"><a name="l00555"></a><span class="lineno">  555</span>&#160;    fclose(fd);</div><div class="line"><a name="l00556"></a><span class="lineno">  556</span>&#160;</div><div class="line"><a name="l00557"></a><span class="lineno">  557</span>&#160;    <span class="keywordflow">if</span> (!success)</div><div class="line"><a name="l00558"></a><span class="lineno">  558</span>&#160;    {</div><div class="line"><a name="l00559"></a><span class="lineno">  559</span>&#160;        std::stringstream <a class="code" href="namespacearmnn.xhtml#a4dc0adc6737b5944e7671bee71788407acb5e100e5a9a3e7f6d1fd97512215282">error</a>;</div><div class="line"><a name="l00560"></a><span class="lineno">  560</span>&#160;        error &lt;&lt; <span class="stringliteral">&quot;Failed to parse graph file&quot;</span>;</div><div class="line"><a name="l00561"></a><span class="lineno">  561</span>&#160;        <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_parse_exception.xhtml">ParseException</a>(fmt::format(<span class="stringliteral">&quot;{} {}&quot;</span>, error.str(), <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l00562"></a><span class="lineno">  562</span>&#160;    }</div><div class="line"><a name="l00563"></a><span class="lineno">  563</span>&#160;    <span class="keywordflow">return</span> modelProto;</div><div class="line"><a name="l00564"></a><span class="lineno">  564</span>&#160;}</div><div class="line"><a name="l00565"></a><span class="lineno">  565</span>&#160;</div><div class="line"><a name="l00566"></a><span class="lineno"><a class="line" href="classarmnn_onnx_parser_1_1_onnx_parser_impl.xhtml#aaf4ce461aa35597cf80954314a3cb0e1">  566</a></span>&#160;<a class="code" href="namespacearmnn.xhtml#ace74f6f9feb95a964a49d79458232703">INetworkPtr</a> <a class="code" href="classarmnn_onnx_parser_1_1_onnx_parser_impl.xhtml#aaf4ce461aa35597cf80954314a3cb0e1">OnnxParserImpl::CreateNetworkFromTextFile</a>(<span class="keyword">const</span> <span class="keywordtype">char</span>* graphFile)</div><div class="line"><a name="l00567"></a><span class="lineno">  567</span>&#160;{</div><div class="line"><a name="l00568"></a><span class="lineno">  568</span>&#160;    ResetParser();</div><div class="line"><a name="l00569"></a><span class="lineno">  569</span>&#160;    <a class="code" href="namespacearmnn_onnx_parser.xhtml#a503ae4f55dae1486e53978657083b35d">ModelPtr</a> modelProto = <a class="code" href="classarmnn_onnx_parser_1_1_onnx_parser_impl.xhtml#a975a79b9b35d51ea81c42c05d245e7c0">LoadModelFromTextFile</a>(graphFile);</div><div class="line"><a name="l00570"></a><span class="lineno">  570</span>&#160;    <span class="keywordflow">return</span> CreateNetworkFromModel(*modelProto);</div><div class="line"><a name="l00571"></a><span class="lineno">  571</span>&#160;}</div><div class="line"><a name="l00572"></a><span class="lineno">  572</span>&#160;</div><div class="line"><a name="l00573"></a><span class="lineno">  573</span>&#160;</div><div class="line"><a name="l00574"></a><span class="lineno"><a class="line" href="classarmnn_onnx_parser_1_1_onnx_parser_impl.xhtml#acf9c6119ceb99755bc1f86c5a325c796">  574</a></span>&#160;<a class="code" href="namespacearmnn_onnx_parser.xhtml#a503ae4f55dae1486e53978657083b35d">ModelPtr</a> <a class="code" href="classarmnn_onnx_parser_1_1_onnx_parser_impl.xhtml#acf9c6119ceb99755bc1f86c5a325c796">OnnxParserImpl::LoadModelFromBinaryFile</a>(<span class="keyword">const</span> <span class="keywordtype">char</span>* graphFile)</div><div class="line"><a name="l00575"></a><span class="lineno">  575</span>&#160;{</div><div class="line"><a name="l00576"></a><span class="lineno">  576</span>&#160;    FILE* fd = fopen(graphFile, <span class="stringliteral">&quot;rb&quot;</span>);</div><div class="line"><a name="l00577"></a><span class="lineno">  577</span>&#160;</div><div class="line"><a name="l00578"></a><span class="lineno">  578</span>&#160;    <span class="keywordflow">if</span> (fd == <span class="keyword">nullptr</span>)</div><div class="line"><a name="l00579"></a><span class="lineno">  579</span>&#160;    {</div><div class="line"><a name="l00580"></a><span class="lineno">  580</span>&#160;        <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_file_not_found_exception.xhtml">FileNotFoundException</a>(fmt::format(<span class="stringliteral">&quot;Invalid (null) filename {}&quot;</span>, <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l00581"></a><span class="lineno">  581</span>&#160;    }</div><div class="line"><a name="l00582"></a><span class="lineno">  582</span>&#160;</div><div class="line"><a name="l00583"></a><span class="lineno">  583</span>&#160;    <span class="comment">// Parse the file into a message</span></div><div class="line"><a name="l00584"></a><span class="lineno">  584</span>&#160;    <a class="code" href="namespacearmnn_onnx_parser.xhtml#a503ae4f55dae1486e53978657083b35d">ModelPtr</a> modelProto = std::make_unique&lt;onnx::ModelProto&gt;();</div><div class="line"><a name="l00585"></a><span class="lineno">  585</span>&#160;</div><div class="line"><a name="l00586"></a><span class="lineno">  586</span>&#160;    google::protobuf::io::FileInputStream  inStream(fileno(fd));</div><div class="line"><a name="l00587"></a><span class="lineno">  587</span>&#160;    google::protobuf::io::CodedInputStream codedStream(&amp;inStream);</div><div class="line"><a name="l00588"></a><span class="lineno">  588</span>&#160;    codedStream.SetTotalBytesLimit(INT_MAX);</div><div class="line"><a name="l00589"></a><span class="lineno">  589</span>&#160;    <span class="keywordtype">bool</span> success = modelProto.get()-&gt;ParseFromCodedStream(&amp;codedStream);</div><div class="line"><a name="l00590"></a><span class="lineno">  590</span>&#160;    fclose(fd);</div><div class="line"><a name="l00591"></a><span class="lineno">  591</span>&#160;</div><div class="line"><a name="l00592"></a><span class="lineno">  592</span>&#160;    <span class="keywordflow">if</span> (!success)</div><div class="line"><a name="l00593"></a><span class="lineno">  593</span>&#160;    {</div><div class="line"><a name="l00594"></a><span class="lineno">  594</span>&#160;        std::stringstream <a class="code" href="namespacearmnn.xhtml#a4dc0adc6737b5944e7671bee71788407acb5e100e5a9a3e7f6d1fd97512215282">error</a>;</div><div class="line"><a name="l00595"></a><span class="lineno">  595</span>&#160;        error &lt;&lt; <span class="stringliteral">&quot;Failed to parse graph file&quot;</span>;</div><div class="line"><a name="l00596"></a><span class="lineno">  596</span>&#160;        <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_parse_exception.xhtml">ParseException</a>(fmt::format(<span class="stringliteral">&quot;{} {}&quot;</span>, error.str(), <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l00597"></a><span class="lineno">  597</span>&#160;    }</div><div class="line"><a name="l00598"></a><span class="lineno">  598</span>&#160;    <span class="keywordflow">return</span> modelProto;</div><div class="line"><a name="l00599"></a><span class="lineno">  599</span>&#160;</div><div class="line"><a name="l00600"></a><span class="lineno">  600</span>&#160;}</div><div class="line"><a name="l00601"></a><span class="lineno">  601</span>&#160;</div><div class="line"><a name="l00602"></a><span class="lineno"><a class="line" href="classarmnn_onnx_parser_1_1_onnx_parser_impl.xhtml#aed935c554e4f6a4e7b9dcde057d00877">  602</a></span>&#160;<a class="code" href="namespacearmnn.xhtml#ace74f6f9feb95a964a49d79458232703">INetworkPtr</a> <a class="code" href="classarmnn_onnx_parser_1_1_onnx_parser_impl.xhtml#aed935c554e4f6a4e7b9dcde057d00877">OnnxParserImpl::CreateNetworkFromBinaryFile</a>(<span class="keyword">const</span> <span class="keywordtype">char</span>* graphFile)</div><div class="line"><a name="l00603"></a><span class="lineno">  603</span>&#160;{</div><div class="line"><a name="l00604"></a><span class="lineno">  604</span>&#160;    ResetParser();</div><div class="line"><a name="l00605"></a><span class="lineno">  605</span>&#160;    <a class="code" href="namespacearmnn_onnx_parser.xhtml#a503ae4f55dae1486e53978657083b35d">ModelPtr</a> modelProto = <a class="code" href="classarmnn_onnx_parser_1_1_onnx_parser_impl.xhtml#acf9c6119ceb99755bc1f86c5a325c796">LoadModelFromBinaryFile</a>(graphFile);</div><div class="line"><a name="l00606"></a><span class="lineno">  606</span>&#160;    <span class="keywordflow">return</span> CreateNetworkFromModel(*modelProto);</div><div class="line"><a name="l00607"></a><span class="lineno">  607</span>&#160;}</div><div class="line"><a name="l00608"></a><span class="lineno">  608</span>&#160;</div><div class="line"><a name="l00609"></a><span class="lineno"><a class="line" href="classarmnn_onnx_parser_1_1_onnx_parser_impl.xhtml#a181f87cf45fdc9f040a41c985ce7f8cd">  609</a></span>&#160;<a class="code" href="namespacearmnn_onnx_parser.xhtml#a503ae4f55dae1486e53978657083b35d">ModelPtr</a> <a class="code" href="classarmnn_onnx_parser_1_1_onnx_parser_impl.xhtml#a181f87cf45fdc9f040a41c985ce7f8cd">OnnxParserImpl::LoadModelFromString</a>(<span class="keyword">const</span> std::string&amp; protoText)</div><div class="line"><a name="l00610"></a><span class="lineno">  610</span>&#160;{</div><div class="line"><a name="l00611"></a><span class="lineno">  611</span>&#160;    <span class="keywordflow">if</span> (protoText == <span class="stringliteral">&quot;&quot;</span>)</div><div class="line"><a name="l00612"></a><span class="lineno">  612</span>&#160;    {</div><div class="line"><a name="l00613"></a><span class="lineno">  613</span>&#160;        <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_invalid_argument_exception.xhtml">InvalidArgumentException</a>(fmt::format(<span class="stringliteral">&quot;Invalid (empty) string for model parameter {}&quot;</span>,</div><div class="line"><a name="l00614"></a><span class="lineno">  614</span>&#160;                                                   <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l00615"></a><span class="lineno">  615</span>&#160;    }</div><div class="line"><a name="l00616"></a><span class="lineno">  616</span>&#160;    <span class="comment">// Parse the string into a message</span></div><div class="line"><a name="l00617"></a><span class="lineno">  617</span>&#160;    <a class="code" href="namespacearmnn_onnx_parser.xhtml#a503ae4f55dae1486e53978657083b35d">ModelPtr</a> modelProto = std::make_unique&lt;onnx::ModelProto&gt;();</div><div class="line"><a name="l00618"></a><span class="lineno">  618</span>&#160;    <span class="keywordtype">bool</span> success = google::protobuf::TextFormat::ParseFromString(protoText, modelProto.get());</div><div class="line"><a name="l00619"></a><span class="lineno">  619</span>&#160;    <span class="keywordflow">if</span> (!success)</div><div class="line"><a name="l00620"></a><span class="lineno">  620</span>&#160;    {</div><div class="line"><a name="l00621"></a><span class="lineno">  621</span>&#160;        std::stringstream <a class="code" href="namespacearmnn.xhtml#a4dc0adc6737b5944e7671bee71788407acb5e100e5a9a3e7f6d1fd97512215282">error</a>;</div><div class="line"><a name="l00622"></a><span class="lineno">  622</span>&#160;        error &lt;&lt; <span class="stringliteral">&quot;Failed to parse graph file&quot;</span>;</div><div class="line"><a name="l00623"></a><span class="lineno">  623</span>&#160;        <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_parse_exception.xhtml">ParseException</a>(fmt::format(<span class="stringliteral">&quot;{} {}&quot;</span>, error.str(), <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l00624"></a><span class="lineno">  624</span>&#160;    }</div><div class="line"><a name="l00625"></a><span class="lineno">  625</span>&#160;    <span class="keywordflow">return</span> modelProto;</div><div class="line"><a name="l00626"></a><span class="lineno">  626</span>&#160;}</div><div class="line"><a name="l00627"></a><span class="lineno">  627</span>&#160;</div><div class="line"><a name="l00628"></a><span class="lineno"><a class="line" href="classarmnn_onnx_parser_1_1_onnx_parser_impl.xhtml#a30c0c947bb15e86ee6d535ecd934c0a6">  628</a></span>&#160;<a class="code" href="namespacearmnn.xhtml#ace74f6f9feb95a964a49d79458232703">INetworkPtr</a> <a class="code" href="classarmnn_onnx_parser_1_1_onnx_parser_impl.xhtml#a30c0c947bb15e86ee6d535ecd934c0a6">OnnxParserImpl::CreateNetworkFromString</a>(<span class="keyword">const</span> std::string&amp; protoText)</div><div class="line"><a name="l00629"></a><span class="lineno">  629</span>&#160;{</div><div class="line"><a name="l00630"></a><span class="lineno">  630</span>&#160;    ResetParser();</div><div class="line"><a name="l00631"></a><span class="lineno">  631</span>&#160;    <a class="code" href="namespacearmnn_onnx_parser.xhtml#a503ae4f55dae1486e53978657083b35d">ModelPtr</a> modelProto = <a class="code" href="classarmnn_onnx_parser_1_1_onnx_parser_impl.xhtml#a181f87cf45fdc9f040a41c985ce7f8cd">LoadModelFromString</a>(protoText);</div><div class="line"><a name="l00632"></a><span class="lineno">  632</span>&#160;    <span class="keywordflow">return</span> CreateNetworkFromModel(*modelProto);</div><div class="line"><a name="l00633"></a><span class="lineno">  633</span>&#160;}</div><div class="line"><a name="l00634"></a><span class="lineno">  634</span>&#160;</div><div class="line"><a name="l00635"></a><span class="lineno">  635</span>&#160;<a class="code" href="namespacearmnn.xhtml#ace74f6f9feb95a964a49d79458232703">INetworkPtr</a> OnnxParserImpl::CreateNetworkFromModel(onnx::ModelProto&amp; model)</div><div class="line"><a name="l00636"></a><span class="lineno">  636</span>&#160;{</div><div class="line"><a name="l00637"></a><span class="lineno">  637</span>&#160;    m_Network = INetwork::Create();</div><div class="line"><a name="l00638"></a><span class="lineno">  638</span>&#160;    <span class="keywordflow">try</span></div><div class="line"><a name="l00639"></a><span class="lineno">  639</span>&#160;    {</div><div class="line"><a name="l00640"></a><span class="lineno">  640</span>&#160;        m_Graph = std::make_unique&lt;onnx::GraphProto&gt;(*model.mutable_graph());</div><div class="line"><a name="l00641"></a><span class="lineno">  641</span>&#160;        LoadGraph();</div><div class="line"><a name="l00642"></a><span class="lineno">  642</span>&#160;    }</div><div class="line"><a name="l00643"></a><span class="lineno">  643</span>&#160;    <span class="keywordflow">catch</span> (<span class="keyword">const</span> <a class="code" href="classarmnn_1_1_parse_exception.xhtml">ParseException</a>&amp; e)</div><div class="line"><a name="l00644"></a><span class="lineno">  644</span>&#160;    {</div><div class="line"><a name="l00645"></a><span class="lineno">  645</span>&#160;        Cleanup();</div><div class="line"><a name="l00646"></a><span class="lineno">  646</span>&#160;        <span class="keywordflow">throw</span> e;</div><div class="line"><a name="l00647"></a><span class="lineno">  647</span>&#160;    }</div><div class="line"><a name="l00648"></a><span class="lineno">  648</span>&#160;    Cleanup();</div><div class="line"><a name="l00649"></a><span class="lineno">  649</span>&#160;    <span class="keywordflow">return</span> std::move(m_Network);</div><div class="line"><a name="l00650"></a><span class="lineno">  650</span>&#160;}</div><div class="line"><a name="l00651"></a><span class="lineno">  651</span>&#160;</div><div class="line"><a name="l00652"></a><span class="lineno">  652</span>&#160;<span class="keywordtype">void</span> OnnxParserImpl::LoadGraph()</div><div class="line"><a name="l00653"></a><span class="lineno">  653</span>&#160;{</div><div class="line"><a name="l00654"></a><span class="lineno">  654</span>&#160;    <a class="code" href="_assert_8hpp.xhtml#a5698be69cbd5dfe6c28fcd9867e8cbed">ARMNN_ASSERT</a>(m_Graph.get() != <span class="keyword">nullptr</span>);</div><div class="line"><a name="l00655"></a><span class="lineno">  655</span>&#160;</div><div class="line"><a name="l00656"></a><span class="lineno">  656</span>&#160;    <span class="comment">//Fill m_TensorsInfo with the shapes and value of every tensor</span></div><div class="line"><a name="l00657"></a><span class="lineno">  657</span>&#160;    SetupInfo(m_Graph-&gt;mutable_output());</div><div class="line"><a name="l00658"></a><span class="lineno">  658</span>&#160;    SetupInfo(m_Graph-&gt;mutable_input());</div><div class="line"><a name="l00659"></a><span class="lineno">  659</span>&#160;    SetupInfo(m_Graph-&gt;mutable_value_info());</div><div class="line"><a name="l00660"></a><span class="lineno">  660</span>&#160;</div><div class="line"><a name="l00661"></a><span class="lineno">  661</span>&#160;    <span class="keywordflow">for</span> (<span class="keyword">auto</span> tensor : m_Graph-&gt;initializer())</div><div class="line"><a name="l00662"></a><span class="lineno">  662</span>&#160;    {</div><div class="line"><a name="l00663"></a><span class="lineno">  663</span>&#160;        m_TensorsInfo[tensor.name()].m_tensor = std::make_unique&lt;const onnx::TensorProto&gt;(tensor);</div><div class="line"><a name="l00664"></a><span class="lineno">  664</span>&#160;        m_TensorsInfo[tensor.name()].m_info = std::make_unique&lt;TensorInfo&gt;(<a class="code" href="namespacearmnn_deserializer.xhtml#a948b8c615ff06defa3b80d2352259ff2">ToTensorInfo</a>(tensor));</div><div class="line"><a name="l00665"></a><span class="lineno">  665</span>&#160;        m_TensorsInfo[tensor.name()].m_dtype =</div><div class="line"><a name="l00666"></a><span class="lineno">  666</span>&#160;            <span class="keyword">static_cast&lt;</span><a class="code" href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6">onnx::TensorProto::DataType</a><span class="keyword">&gt;</span>(tensor.data_type());</div><div class="line"><a name="l00667"></a><span class="lineno">  667</span>&#160;    }</div><div class="line"><a name="l00668"></a><span class="lineno">  668</span>&#160;</div><div class="line"><a name="l00669"></a><span class="lineno">  669</span>&#160;    SetupInputLayers();</div><div class="line"><a name="l00670"></a><span class="lineno">  670</span>&#160;    SetupOutputLayers();</div><div class="line"><a name="l00671"></a><span class="lineno">  671</span>&#160;</div><div class="line"><a name="l00672"></a><span class="lineno">  672</span>&#160;    <span class="comment">//Detect FullyConnected layers with bias and update the FusedAndUsed map acccordingly</span></div><div class="line"><a name="l00673"></a><span class="lineno">  673</span>&#160;    DetectFullyConnected();</div><div class="line"><a name="l00674"></a><span class="lineno">  674</span>&#160;</div><div class="line"><a name="l00675"></a><span class="lineno">  675</span>&#160;    <span class="comment">//Parsing the graph</span></div><div class="line"><a name="l00676"></a><span class="lineno">  676</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> nodeIndex = 0; nodeIndex &lt; static_cast&lt;size_t&gt;(m_Graph-&gt;node_size()); nodeIndex++)</div><div class="line"><a name="l00677"></a><span class="lineno">  677</span>&#160;    {</div><div class="line"><a name="l00678"></a><span class="lineno">  678</span>&#160;        <span class="keyword">auto</span> node = m_Graph-&gt;node(static_cast&lt;int&gt;(nodeIndex));</div><div class="line"><a name="l00679"></a><span class="lineno">  679</span>&#160;        <span class="keyword">const</span> std::string&amp; operation = node.op_type();</div><div class="line"><a name="l00680"></a><span class="lineno">  680</span>&#160;</div><div class="line"><a name="l00681"></a><span class="lineno">  681</span>&#160;        <span class="comment">// check which layers we handled already (add and matmul fused as FC)</span></div><div class="line"><a name="l00682"></a><span class="lineno">  682</span>&#160;        <span class="keywordflow">if</span> (operation == <span class="stringliteral">&quot;MatMul&quot;</span> )</div><div class="line"><a name="l00683"></a><span class="lineno">  683</span>&#160;        {</div><div class="line"><a name="l00684"></a><span class="lineno">  684</span>&#160;            <span class="keywordflow">if</span>(m_OutputsFusedAndUsed[nodeIndex].inputForNodes != m_OutputsFusedAndUsed[nodeIndex].fusedWithNodes.size())</div><div class="line"><a name="l00685"></a><span class="lineno">  685</span>&#160;            {</div><div class="line"><a name="l00686"></a><span class="lineno">  686</span>&#160;                <span class="comment">//Node which can not be fused as a FullyConnected layer (used in layers as a simple matmul output)</span></div><div class="line"><a name="l00687"></a><span class="lineno">  687</span>&#160;                AddFullyConnected(node);</div><div class="line"><a name="l00688"></a><span class="lineno">  688</span>&#160;            }</div><div class="line"><a name="l00689"></a><span class="lineno">  689</span>&#160;        }</div><div class="line"><a name="l00690"></a><span class="lineno">  690</span>&#160;        <span class="keywordflow">else</span> <span class="keywordflow">if</span> (!(m_OutputsFusedAndUsed[nodeIndex].fusedWithNodes.empty()) &amp;&amp; operation == <span class="stringliteral">&quot;Add&quot;</span>)</div><div class="line"><a name="l00691"></a><span class="lineno">  691</span>&#160;        {</div><div class="line"><a name="l00692"></a><span class="lineno">  692</span>&#160;            <span class="keywordtype">int</span> matmulIndex = <span class="keyword">static_cast&lt;</span><span class="keywordtype">int</span><span class="keyword">&gt;</span> (m_OutputsFusedAndUsed[nodeIndex].fusedWithNodes[0]);</div><div class="line"><a name="l00693"></a><span class="lineno">  693</span>&#160;            AddFullyConnected(m_Graph-&gt;node(matmulIndex), &amp;node);</div><div class="line"><a name="l00694"></a><span class="lineno">  694</span>&#160;        }</div><div class="line"><a name="l00695"></a><span class="lineno">  695</span>&#160;        <span class="keywordflow">else</span> <span class="keywordflow">if</span> (m_OutputsFusedAndUsed[nodeIndex].fusedWithNodes.empty()) <span class="comment">//node is not part of a fused layer</span></div><div class="line"><a name="l00696"></a><span class="lineno">  696</span>&#160;        {</div><div class="line"><a name="l00697"></a><span class="lineno">  697</span>&#160;            <span class="keyword">auto</span> it = m_ParserFunctions.find(operation);</div><div class="line"><a name="l00698"></a><span class="lineno">  698</span>&#160;            <span class="keywordflow">if</span> (it != m_ParserFunctions.end())</div><div class="line"><a name="l00699"></a><span class="lineno">  699</span>&#160;            {</div><div class="line"><a name="l00700"></a><span class="lineno">  700</span>&#160;                <span class="keyword">auto</span> func = it-&gt;second;</div><div class="line"><a name="l00701"></a><span class="lineno">  701</span>&#160;                (this-&gt;*func)(node);</div><div class="line"><a name="l00702"></a><span class="lineno">  702</span>&#160;            }</div><div class="line"><a name="l00703"></a><span class="lineno">  703</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l00704"></a><span class="lineno">  704</span>&#160;            {</div><div class="line"><a name="l00705"></a><span class="lineno">  705</span>&#160;                <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_parse_exception.xhtml">ParseException</a>(fmt::format(<span class="stringliteral">&quot;Unsupported operation {} for node &#39;{}&#39; {}&quot;</span>,</div><div class="line"><a name="l00706"></a><span class="lineno">  706</span>&#160;                                                 operation,</div><div class="line"><a name="l00707"></a><span class="lineno">  707</span>&#160;                                                 node.name(),</div><div class="line"><a name="l00708"></a><span class="lineno">  708</span>&#160;                                                 <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l00709"></a><span class="lineno">  709</span>&#160;            }</div><div class="line"><a name="l00710"></a><span class="lineno">  710</span>&#160;        }</div><div class="line"><a name="l00711"></a><span class="lineno">  711</span>&#160;    }</div><div class="line"><a name="l00712"></a><span class="lineno">  712</span>&#160;</div><div class="line"><a name="l00713"></a><span class="lineno">  713</span>&#160;    <span class="comment">//Making the connections between outputs and inputs of each layers</span></div><div class="line"><a name="l00714"></a><span class="lineno">  714</span>&#160;    <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span>&amp; tensorCon : m_TensorConnections)</div><div class="line"><a name="l00715"></a><span class="lineno">  715</span>&#160;    {</div><div class="line"><a name="l00716"></a><span class="lineno">  716</span>&#160;        <span class="keywordflow">if</span> (tensorCon.second.outputSlot != <span class="keyword">nullptr</span>)</div><div class="line"><a name="l00717"></a><span class="lineno">  717</span>&#160;        {</div><div class="line"><a name="l00718"></a><span class="lineno">  718</span>&#160;            <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> inputSlotIdx = 0; inputSlotIdx &lt; tensorCon.second.inputSlots.size(); ++inputSlotIdx)</div><div class="line"><a name="l00719"></a><span class="lineno">  719</span>&#160;            {</div><div class="line"><a name="l00720"></a><span class="lineno">  720</span>&#160;                tensorCon.second.outputSlot-&gt;Connect(*(tensorCon.second.inputSlots[inputSlotIdx]));</div><div class="line"><a name="l00721"></a><span class="lineno">  721</span>&#160;            }</div><div class="line"><a name="l00722"></a><span class="lineno">  722</span>&#160;        }</div><div class="line"><a name="l00723"></a><span class="lineno">  723</span>&#160;    }</div><div class="line"><a name="l00724"></a><span class="lineno">  724</span>&#160;}</div><div class="line"><a name="l00725"></a><span class="lineno">  725</span>&#160;</div><div class="line"><a name="l00726"></a><span class="lineno">  726</span>&#160;<span class="keywordtype">void</span> OnnxParserImpl::SetupInfo(<span class="keyword">const</span> google::protobuf::RepeatedPtrField&lt;onnx::ValueInfoProto &gt;* list)</div><div class="line"><a name="l00727"></a><span class="lineno">  727</span>&#160;{</div><div class="line"><a name="l00728"></a><span class="lineno">  728</span>&#160;    <span class="keywordflow">for</span> (<span class="keyword">auto</span> tensor : *list)</div><div class="line"><a name="l00729"></a><span class="lineno">  729</span>&#160;    {</div><div class="line"><a name="l00730"></a><span class="lineno">  730</span>&#160;        m_TensorsInfo[tensor.name()] = OnnxTensor();</div><div class="line"><a name="l00731"></a><span class="lineno">  731</span>&#160;        m_TensorsInfo[tensor.name()].m_info = std::make_unique&lt;TensorInfo&gt;(<a class="code" href="namespacearmnn_deserializer.xhtml#a948b8c615ff06defa3b80d2352259ff2">ToTensorInfo</a>(tensor));</div><div class="line"><a name="l00732"></a><span class="lineno">  732</span>&#160;        m_TensorsInfo[tensor.name()].m_dtype =</div><div class="line"><a name="l00733"></a><span class="lineno">  733</span>&#160;            <span class="keyword">static_cast&lt;</span><a class="code" href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6">onnx::TensorProto::DataType</a><span class="keyword">&gt;</span>(tensor.type().tensor_type().elem_type());</div><div class="line"><a name="l00734"></a><span class="lineno">  734</span>&#160;    }</div><div class="line"><a name="l00735"></a><span class="lineno">  735</span>&#160;}</div><div class="line"><a name="l00736"></a><span class="lineno">  736</span>&#160;</div><div class="line"><a name="l00737"></a><span class="lineno">  737</span>&#160;<span class="keywordtype">void</span> OnnxParserImpl::DetectFullyConnected()</div><div class="line"><a name="l00738"></a><span class="lineno">  738</span>&#160;{</div><div class="line"><a name="l00739"></a><span class="lineno">  739</span>&#160;    m_OutputsFusedAndUsed = std::vector&lt;UsageSummary&gt; (<span class="keyword">static_cast&lt;</span><span class="keywordtype">size_t</span><span class="keyword">&gt;</span>(m_Graph-&gt;node_size()), UsageSummary());</div><div class="line"><a name="l00740"></a><span class="lineno">  740</span>&#160;    <span class="keyword">auto</span> matmulAndConstant = [&amp;](<span class="keyword">const</span> std::string&amp; constInput,</div><div class="line"><a name="l00741"></a><span class="lineno">  741</span>&#160;                                 <span class="keyword">const</span> std::string&amp; matmulInput,</div><div class="line"><a name="l00742"></a><span class="lineno">  742</span>&#160;                                 <span class="keywordtype">int</span>&amp; nodeIndex)</div><div class="line"><a name="l00743"></a><span class="lineno">  743</span>&#160;    {</div><div class="line"><a name="l00744"></a><span class="lineno">  744</span>&#160;        <span class="keyword">auto</span> matmulIt = m_OutputsMap.find(matmulInput);</div><div class="line"><a name="l00745"></a><span class="lineno">  745</span>&#160;        <span class="keywordflow">if</span>(matmulIt != m_OutputsMap.end()  &amp;&amp; matmulIt-&gt;second.first-&gt;op_type() == <span class="stringliteral">&quot;MatMul&quot;</span></div><div class="line"><a name="l00746"></a><span class="lineno">  746</span>&#160;            &amp;&amp; m_TensorsInfo[constInput].isConstant())</div><div class="line"><a name="l00747"></a><span class="lineno">  747</span>&#160;        {</div><div class="line"><a name="l00748"></a><span class="lineno">  748</span>&#160;            nodeIndex = matmulIt-&gt;second.second;</div><div class="line"><a name="l00749"></a><span class="lineno">  749</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00750"></a><span class="lineno">  750</span>&#160;        }</div><div class="line"><a name="l00751"></a><span class="lineno">  751</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00752"></a><span class="lineno">  752</span>&#160;    };</div><div class="line"><a name="l00753"></a><span class="lineno">  753</span>&#160;</div><div class="line"><a name="l00754"></a><span class="lineno">  754</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">int</span> nodeIndex = 0; nodeIndex &lt; m_Graph-&gt;node_size(); nodeIndex++)</div><div class="line"><a name="l00755"></a><span class="lineno">  755</span>&#160;    {</div><div class="line"><a name="l00756"></a><span class="lineno">  756</span>&#160;        <span class="keyword">const</span> onnx::NodeProto* node = &amp;m_Graph-&gt;node(nodeIndex);</div><div class="line"><a name="l00757"></a><span class="lineno">  757</span>&#160;        <span class="keywordflow">for</span> (<span class="keyword">const</span> std::string&amp; output : node-&gt;output())</div><div class="line"><a name="l00758"></a><span class="lineno">  758</span>&#160;        {</div><div class="line"><a name="l00759"></a><span class="lineno">  759</span>&#160;            m_OutputsMap[output] = std::make_pair(node, nodeIndex);</div><div class="line"><a name="l00760"></a><span class="lineno">  760</span>&#160;        }</div><div class="line"><a name="l00761"></a><span class="lineno">  761</span>&#160;</div><div class="line"><a name="l00762"></a><span class="lineno">  762</span>&#160;        <span class="keywordflow">for</span> (<span class="keyword">const</span> std::string&amp; input : node-&gt;input()) <span class="comment">//count how many time a node is used as input</span></div><div class="line"><a name="l00763"></a><span class="lineno">  763</span>&#160;        {</div><div class="line"><a name="l00764"></a><span class="lineno">  764</span>&#160;            <span class="keyword">auto</span> matmulIt = m_OutputsMap.find(input);</div><div class="line"><a name="l00765"></a><span class="lineno">  765</span>&#160;            <span class="keywordflow">if</span>(matmulIt != m_OutputsMap.end()){</div><div class="line"><a name="l00766"></a><span class="lineno">  766</span>&#160;                ++m_OutputsFusedAndUsed[<span class="keyword">static_cast&lt;</span><span class="keywordtype">size_t</span><span class="keyword">&gt;</span>(matmulIt-&gt;second.second)].inputForNodes; <span class="comment">//node used</span></div><div class="line"><a name="l00767"></a><span class="lineno">  767</span>&#160;            }</div><div class="line"><a name="l00768"></a><span class="lineno">  768</span>&#160;        }</div><div class="line"><a name="l00769"></a><span class="lineno">  769</span>&#160;</div><div class="line"><a name="l00770"></a><span class="lineno">  770</span>&#160;        <span class="keywordflow">if</span> (node-&gt;op_type() == <span class="stringliteral">&quot;Add&quot;</span>)</div><div class="line"><a name="l00771"></a><span class="lineno">  771</span>&#160;        {</div><div class="line"><a name="l00772"></a><span class="lineno">  772</span>&#160;            <span class="keywordtype">int</span> matmulIndex = 0;</div><div class="line"><a name="l00773"></a><span class="lineno">  773</span>&#160;            <span class="keywordflow">if</span> (matmulAndConstant(node-&gt;input(0), node-&gt;input(1), matmulIndex) ||</div><div class="line"><a name="l00774"></a><span class="lineno">  774</span>&#160;                matmulAndConstant(node-&gt;input(1), node-&gt;input(0), matmulIndex))</div><div class="line"><a name="l00775"></a><span class="lineno">  775</span>&#160;            {</div><div class="line"><a name="l00776"></a><span class="lineno">  776</span>&#160;                <span class="comment">//matmul and add were fused</span></div><div class="line"><a name="l00777"></a><span class="lineno">  777</span>&#160;                m_OutputsFusedAndUsed[<span class="keyword">static_cast&lt;</span><span class="keywordtype">size_t</span><span class="keyword">&gt;</span>(matmulIndex)].fusedWithNodes</div><div class="line"><a name="l00778"></a><span class="lineno">  778</span>&#160;                                                                       .push_back(static_cast&lt;size_t&gt;(nodeIndex));</div><div class="line"><a name="l00779"></a><span class="lineno">  779</span>&#160;</div><div class="line"><a name="l00780"></a><span class="lineno">  780</span>&#160;                m_OutputsFusedAndUsed[<span class="keyword">static_cast&lt;</span><span class="keywordtype">size_t</span><span class="keyword">&gt;</span>(nodeIndex)].fusedWithNodes</div><div class="line"><a name="l00781"></a><span class="lineno">  781</span>&#160;                                                                     .push_back(static_cast&lt;size_t&gt;(matmulIndex));</div><div class="line"><a name="l00782"></a><span class="lineno">  782</span>&#160;            }</div><div class="line"><a name="l00783"></a><span class="lineno">  783</span>&#160;        }</div><div class="line"><a name="l00784"></a><span class="lineno">  784</span>&#160;    }</div><div class="line"><a name="l00785"></a><span class="lineno">  785</span>&#160;</div><div class="line"><a name="l00786"></a><span class="lineno">  786</span>&#160;    <span class="keywordflow">for</span> (<span class="keyword">auto</span> output: m_Graph-&gt;output()) { <span class="comment">//Add usages as output of the graph in count of usages</span></div><div class="line"><a name="l00787"></a><span class="lineno">  787</span>&#160;        <span class="keyword">auto</span> matmulIt = m_OutputsMap.find(output.name());</div><div class="line"><a name="l00788"></a><span class="lineno">  788</span>&#160;        <span class="keywordflow">if</span>(matmulIt != m_OutputsMap.end()){</div><div class="line"><a name="l00789"></a><span class="lineno">  789</span>&#160;            ++m_OutputsFusedAndUsed[<span class="keyword">static_cast&lt;</span><span class="keywordtype">size_t</span><span class="keyword">&gt;</span>(matmulIt-&gt;second.second)].inputForNodes;</div><div class="line"><a name="l00790"></a><span class="lineno">  790</span>&#160;        }</div><div class="line"><a name="l00791"></a><span class="lineno">  791</span>&#160;    }</div><div class="line"><a name="l00792"></a><span class="lineno">  792</span>&#160;}</div><div class="line"><a name="l00793"></a><span class="lineno">  793</span>&#160;</div><div class="line"><a name="l00794"></a><span class="lineno">  794</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> Location&gt;</div><div class="line"><a name="l00795"></a><span class="lineno">  795</span>&#160;<span class="keywordtype">void</span> OnnxParserImpl::GetInputAndParam(<span class="keyword">const</span> onnx::NodeProto&amp; node,</div><div class="line"><a name="l00796"></a><span class="lineno">  796</span>&#160;                                      std::string* inputName,</div><div class="line"><a name="l00797"></a><span class="lineno">  797</span>&#160;                                      std::string* constName,</div><div class="line"><a name="l00798"></a><span class="lineno">  798</span>&#160;                                      <span class="keyword">const</span> Location&amp; location)</div><div class="line"><a name="l00799"></a><span class="lineno">  799</span>&#160;{</div><div class="line"><a name="l00800"></a><span class="lineno">  800</span>&#160;    <span class="keywordtype">int</span> cstIndex;</div><div class="line"><a name="l00801"></a><span class="lineno">  801</span>&#160;    <span class="keywordflow">if</span> (m_TensorsInfo[node.input(0)].isConstant())</div><div class="line"><a name="l00802"></a><span class="lineno">  802</span>&#160;    {</div><div class="line"><a name="l00803"></a><span class="lineno">  803</span>&#160;        cstIndex = 0;</div><div class="line"><a name="l00804"></a><span class="lineno">  804</span>&#160;    }</div><div class="line"><a name="l00805"></a><span class="lineno">  805</span>&#160;    <span class="keywordflow">else</span> <span class="keywordflow">if</span> (m_TensorsInfo[node.input(1)].isConstant())</div><div class="line"><a name="l00806"></a><span class="lineno">  806</span>&#160;    {</div><div class="line"><a name="l00807"></a><span class="lineno">  807</span>&#160;        cstIndex = 1;</div><div class="line"><a name="l00808"></a><span class="lineno">  808</span>&#160;    }</div><div class="line"><a name="l00809"></a><span class="lineno">  809</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l00810"></a><span class="lineno">  810</span>&#160;    {</div><div class="line"><a name="l00811"></a><span class="lineno">  811</span>&#160;        <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_parse_exception.xhtml">ParseException</a>(fmt::format(<span class="stringliteral">&quot;One of the input tensors (&#39;{}&#39; or &#39;{}&#39;) should be constant in node &#39;{}&#39; {}&quot;</span>,</div><div class="line"><a name="l00812"></a><span class="lineno">  812</span>&#160;                                         node.input(0),</div><div class="line"><a name="l00813"></a><span class="lineno">  813</span>&#160;                                         node.input(1),</div><div class="line"><a name="l00814"></a><span class="lineno">  814</span>&#160;                                         node.name(),</div><div class="line"><a name="l00815"></a><span class="lineno">  815</span>&#160;                                         location.AsString()));</div><div class="line"><a name="l00816"></a><span class="lineno">  816</span>&#160;    }</div><div class="line"><a name="l00817"></a><span class="lineno">  817</span>&#160;    <span class="keywordflow">if</span>(constName)</div><div class="line"><a name="l00818"></a><span class="lineno">  818</span>&#160;    {</div><div class="line"><a name="l00819"></a><span class="lineno">  819</span>&#160;        *constName = node.input(cstIndex);</div><div class="line"><a name="l00820"></a><span class="lineno">  820</span>&#160;    }</div><div class="line"><a name="l00821"></a><span class="lineno">  821</span>&#160;    <span class="keywordflow">if</span>(inputName)</div><div class="line"><a name="l00822"></a><span class="lineno">  822</span>&#160;    {</div><div class="line"><a name="l00823"></a><span class="lineno">  823</span>&#160;        *inputName = node.input(!cstIndex);</div><div class="line"><a name="l00824"></a><span class="lineno">  824</span>&#160;    }</div><div class="line"><a name="l00825"></a><span class="lineno">  825</span>&#160;}</div><div class="line"><a name="l00826"></a><span class="lineno">  826</span>&#160;</div><div class="line"><a name="l00827"></a><span class="lineno">  827</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> Location&gt;</div><div class="line"><a name="l00828"></a><span class="lineno">  828</span>&#160;<span class="keywordtype">void</span> OnnxParserImpl::To1DTensor(<span class="keyword">const</span> std::string&amp; name, <span class="keyword">const</span> Location&amp; location)</div><div class="line"><a name="l00829"></a><span class="lineno">  829</span>&#160;{</div><div class="line"><a name="l00830"></a><span class="lineno">  830</span>&#160;    <a class="code" href="classarmnn_1_1_tensor_shape.xhtml">TensorShape</a> shape = m_TensorsInfo[name].m_info-&gt;GetShape();</div><div class="line"><a name="l00831"></a><span class="lineno">  831</span>&#160;    std::vector&lt;uint32_t&gt; newShape;</div><div class="line"><a name="l00832"></a><span class="lineno">  832</span>&#160;    <span class="keywordflow">for</span>(uint i = 0; i &lt; shape.<a class="code" href="classarmnn_1_1_tensor_shape.xhtml#a157e27d41e9f6b21f0d3c025fa47dc24">GetNumDimensions</a>() - 1; ++i)</div><div class="line"><a name="l00833"></a><span class="lineno">  833</span>&#160;    {</div><div class="line"><a name="l00834"></a><span class="lineno">  834</span>&#160;        <span class="keywordflow">if</span>(shape[i] != 1)</div><div class="line"><a name="l00835"></a><span class="lineno">  835</span>&#160;        {</div><div class="line"><a name="l00836"></a><span class="lineno">  836</span>&#160;            <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_parse_exception.xhtml">ParseException</a>(</div><div class="line"><a name="l00837"></a><span class="lineno">  837</span>&#160;                fmt::format(<span class="stringliteral">&quot;Only tensors with shape [1, ..., 1, X] can be converted to 1D and {} {}&quot;</span>,</div><div class="line"><a name="l00838"></a><span class="lineno">  838</span>&#160;                            TensorInfoAsString(*m_TensorsInfo[name].m_info, name, m_TensorsInfo[name].m_dtype),</div><div class="line"><a name="l00839"></a><span class="lineno">  839</span>&#160;                            location.AsString()));</div><div class="line"><a name="l00840"></a><span class="lineno">  840</span>&#160;        }</div><div class="line"><a name="l00841"></a><span class="lineno">  841</span>&#160;    }</div><div class="line"><a name="l00842"></a><span class="lineno">  842</span>&#160;    newShape.push_back(shape[shape.<a class="code" href="classarmnn_1_1_tensor_shape.xhtml#a157e27d41e9f6b21f0d3c025fa47dc24">GetNumDimensions</a>() - 1]);</div><div class="line"><a name="l00843"></a><span class="lineno">  843</span>&#160;</div><div class="line"><a name="l00844"></a><span class="lineno">  844</span>&#160;    m_TensorsInfo[name].m_info-&gt;SetShape(<a class="code" href="classarmnn_1_1_tensor_shape.xhtml">TensorShape</a>(static_cast&lt;unsigned int&gt;(newShape.size()), newShape.data()));</div><div class="line"><a name="l00845"></a><span class="lineno">  845</span>&#160;}</div><div class="line"><a name="l00846"></a><span class="lineno">  846</span>&#160;</div><div class="line"><a name="l00847"></a><span class="lineno">  847</span>&#160;<span class="keywordtype">void</span> OnnxParserImpl::AddConvLayerWithDepthwiseConv(<span class="keyword">const</span> onnx::NodeProto&amp; node, <span class="keyword">const</span> <a class="code" href="structarmnn_1_1_convolution2d_descriptor.xhtml">Convolution2dDescriptor</a>&amp; convDesc)</div><div class="line"><a name="l00848"></a><span class="lineno">  848</span>&#160;{</div><div class="line"><a name="l00849"></a><span class="lineno">  849</span>&#160;    <a class="code" href="_assert_8hpp.xhtml#a5698be69cbd5dfe6c28fcd9867e8cbed">ARMNN_ASSERT</a>(node.op_type() == <span class="stringliteral">&quot;Conv&quot;</span>);</div><div class="line"><a name="l00850"></a><span class="lineno">  850</span>&#160;</div><div class="line"><a name="l00851"></a><span class="lineno">  851</span>&#160;    <a class="code" href="structarmnn_1_1_depthwise_convolution2d_descriptor.xhtml">DepthwiseConvolution2dDescriptor</a> desc;</div><div class="line"><a name="l00852"></a><span class="lineno">  852</span>&#160;    desc.<a class="code" href="structarmnn_1_1_depthwise_convolution2d_descriptor.xhtml#ac18546ebbebbb32fe0a03baa9bf2c600">m_PadLeft</a>      = convDesc.<a class="code" href="structarmnn_1_1_convolution2d_descriptor.xhtml#ac18546ebbebbb32fe0a03baa9bf2c600">m_PadLeft</a>;</div><div class="line"><a name="l00853"></a><span class="lineno">  853</span>&#160;    desc.m_PadRight     = convDesc.<a class="code" href="structarmnn_1_1_convolution2d_descriptor.xhtml#a002bc30e590d78cbb4f4d12171055ca7">m_PadRight</a>;</div><div class="line"><a name="l00854"></a><span class="lineno">  854</span>&#160;    desc.m_PadTop       = convDesc.<a class="code" href="structarmnn_1_1_convolution2d_descriptor.xhtml#a56b51f56cef50cdfa554258eecdab046">m_PadTop</a>;</div><div class="line"><a name="l00855"></a><span class="lineno">  855</span>&#160;    desc.m_PadBottom    = convDesc.<a class="code" href="structarmnn_1_1_convolution2d_descriptor.xhtml#aa9e49717ebdb741e8c767741647fc618">m_PadBottom</a>;</div><div class="line"><a name="l00856"></a><span class="lineno">  856</span>&#160;    desc.m_StrideX      = convDesc.<a class="code" href="structarmnn_1_1_convolution2d_descriptor.xhtml#afe6a3377c4531315354def9023c8fdda">m_StrideX</a>;</div><div class="line"><a name="l00857"></a><span class="lineno">  857</span>&#160;    desc.m_StrideY      = convDesc.<a class="code" href="structarmnn_1_1_convolution2d_descriptor.xhtml#ac1fe174bbadfb39a2b636940c2e647c8">m_StrideY</a>;</div><div class="line"><a name="l00858"></a><span class="lineno">  858</span>&#160;    desc.m_BiasEnabled  = convDesc.<a class="code" href="structarmnn_1_1_convolution2d_descriptor.xhtml#aea202e14d8874cefd9a0f778022b7e25">m_BiasEnabled</a>;</div><div class="line"><a name="l00859"></a><span class="lineno">  859</span>&#160;</div><div class="line"><a name="l00860"></a><span class="lineno">  860</span>&#160;    <a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml">armnn::IConnectableLayer</a>* layer;</div><div class="line"><a name="l00861"></a><span class="lineno">  861</span>&#160;    <span class="keyword">auto</span> weightTensor = CreateConstTensor(node.input(1));</div><div class="line"><a name="l00862"></a><span class="lineno">  862</span>&#160;    <a class="code" href="classarmnn_1_1_tensor_shape.xhtml">TensorShape</a>&amp; weightShape = weightTensor.first.GetShape();</div><div class="line"><a name="l00863"></a><span class="lineno">  863</span>&#160;    weightShape[1] = weightShape[0];</div><div class="line"><a name="l00864"></a><span class="lineno">  864</span>&#160;    weightShape[0] = 1;</div><div class="line"><a name="l00865"></a><span class="lineno">  865</span>&#160;    m_TensorsInfo[node.input(1)].m_info-&gt;SetShape(weightShape);</div><div class="line"><a name="l00866"></a><span class="lineno">  866</span>&#160;</div><div class="line"><a name="l00867"></a><span class="lineno">  867</span>&#160;    <span class="keywordflow">if</span> (node.input_size() == 3)</div><div class="line"><a name="l00868"></a><span class="lineno">  868</span>&#160;    {</div><div class="line"><a name="l00869"></a><span class="lineno">  869</span>&#160;        <span class="keywordflow">if</span>(!m_TensorsInfo[node.input(2)].isConstant())</div><div class="line"><a name="l00870"></a><span class="lineno">  870</span>&#160;        {</div><div class="line"><a name="l00871"></a><span class="lineno">  871</span>&#160;            <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_parse_exception.xhtml">ParseException</a>(fmt::format(<span class="stringliteral">&quot;Bias &#39;{}&#39; should be constant in Conv layer &#39;{}&#39; {}&quot;</span>,</div><div class="line"><a name="l00872"></a><span class="lineno">  872</span>&#160;                                             node.input(2),</div><div class="line"><a name="l00873"></a><span class="lineno">  873</span>&#160;                                             node.name(),</div><div class="line"><a name="l00874"></a><span class="lineno">  874</span>&#160;                                             <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l00875"></a><span class="lineno">  875</span>&#160;        }</div><div class="line"><a name="l00876"></a><span class="lineno">  876</span>&#160;        desc.m_BiasEnabled = <span class="keyword">true</span>;</div><div class="line"><a name="l00877"></a><span class="lineno">  877</span>&#160;        <span class="keyword">auto</span> biasTensor = CreateConstTensor(node.input(2));</div><div class="line"><a name="l00878"></a><span class="lineno">  878</span>&#160;        layer = m_Network-&gt;AddDepthwiseConvolution2dLayer(desc,</div><div class="line"><a name="l00879"></a><span class="lineno">  879</span>&#160;                                                          weightTensor.first,</div><div class="line"><a name="l00880"></a><span class="lineno">  880</span>&#160;                                                          <a class="code" href="classarmnn_1_1_optional.xhtml">Optional&lt;ConstTensor&gt;</a>(biasTensor.first),</div><div class="line"><a name="l00881"></a><span class="lineno">  881</span>&#160;                                                          node.name().c_str());</div><div class="line"><a name="l00882"></a><span class="lineno">  882</span>&#160;    }</div><div class="line"><a name="l00883"></a><span class="lineno">  883</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l00884"></a><span class="lineno">  884</span>&#160;    {</div><div class="line"><a name="l00885"></a><span class="lineno">  885</span>&#160;        layer = m_Network-&gt;AddDepthwiseConvolution2dLayer(desc,</div><div class="line"><a name="l00886"></a><span class="lineno">  886</span>&#160;                                                          weightTensor.first,</div><div class="line"><a name="l00887"></a><span class="lineno">  887</span>&#160;                                                          <a class="code" href="structarmnn_1_1_empty_optional.xhtml">EmptyOptional</a>(),</div><div class="line"><a name="l00888"></a><span class="lineno">  888</span>&#160;                                                          node.name().c_str());</div><div class="line"><a name="l00889"></a><span class="lineno">  889</span>&#160;    }</div><div class="line"><a name="l00890"></a><span class="lineno">  890</span>&#160;    <a class="code" href="_assert_8hpp.xhtml#a5698be69cbd5dfe6c28fcd9867e8cbed">ARMNN_ASSERT</a>(layer != <span class="keyword">nullptr</span>);</div><div class="line"><a name="l00891"></a><span class="lineno">  891</span>&#160;</div><div class="line"><a name="l00892"></a><span class="lineno">  892</span>&#160;    <span class="keyword">auto</span> outputInfo = ComputeOutputInfo({ node.output(0) }, layer,</div><div class="line"><a name="l00893"></a><span class="lineno">  893</span>&#160;                                        { m_TensorsInfo[node.input(0)].m_info-&gt;GetShape(),</div><div class="line"><a name="l00894"></a><span class="lineno">  894</span>&#160;                                          m_TensorsInfo[node.input(1)].m_info-&gt;GetShape() });</div><div class="line"><a name="l00895"></a><span class="lineno">  895</span>&#160;</div><div class="line"><a name="l00896"></a><span class="lineno">  896</span>&#160;    layer-&gt;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml#a80ac4eda2e7f2757ec9dd96fc96dbd16">GetOutputSlot</a>(0).<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#a5ee4a6c9a2481245487b1b1a70d20fd0">SetTensorInfo</a>(outputInfo[0]);</div><div class="line"><a name="l00897"></a><span class="lineno">  897</span>&#160;</div><div class="line"><a name="l00898"></a><span class="lineno">  898</span>&#160;    <span class="comment">// register the input connection slots for the layer, connections are made after all layers have been created</span></div><div class="line"><a name="l00899"></a><span class="lineno">  899</span>&#160;    <span class="comment">// only the tensors for the inputs are relevant, exclude the const tensors</span></div><div class="line"><a name="l00900"></a><span class="lineno">  900</span>&#160;    RegisterInputSlots(layer, {node.input(0)});</div><div class="line"><a name="l00901"></a><span class="lineno">  901</span>&#160;</div><div class="line"><a name="l00902"></a><span class="lineno">  902</span>&#160;    <span class="comment">// register the output connection slots for the layer, connections are made after all layers have been created</span></div><div class="line"><a name="l00903"></a><span class="lineno">  903</span>&#160;    RegisterOutputSlots(layer, {node.output(0)});</div><div class="line"><a name="l00904"></a><span class="lineno">  904</span>&#160;}</div><div class="line"><a name="l00905"></a><span class="lineno">  905</span>&#160;</div><div class="line"><a name="l00906"></a><span class="lineno">  906</span>&#160;<span class="keywordtype">void</span> OnnxParserImpl::AddFullyConnected(<span class="keyword">const</span> onnx::NodeProto&amp; matmulNode, <span class="keyword">const</span> onnx::NodeProto* addNode)</div><div class="line"><a name="l00907"></a><span class="lineno">  907</span>&#160;{</div><div class="line"><a name="l00908"></a><span class="lineno">  908</span>&#160;</div><div class="line"><a name="l00909"></a><span class="lineno">  909</span>&#160;    <span class="comment">// find matmul inputs</span></div><div class="line"><a name="l00910"></a><span class="lineno">  910</span>&#160;    std::string weightName;</div><div class="line"><a name="l00911"></a><span class="lineno">  911</span>&#160;    std::string inputName;</div><div class="line"><a name="l00912"></a><span class="lineno">  912</span>&#160;    <a class="code" href="_verification_helpers_8hpp.xhtml#a479b2821a7a2cbb8fa8eb7f60a47065d">CHECK_VALID_SIZE</a>(static_cast&lt;size_t&gt;(matmulNode.input_size()), 2);</div><div class="line"><a name="l00913"></a><span class="lineno">  913</span>&#160;    <a class="code" href="_verification_helpers_8hpp.xhtml#a479b2821a7a2cbb8fa8eb7f60a47065d">CHECK_VALID_SIZE</a>(static_cast&lt;size_t&gt;(matmulNode.output_size()), 1);</div><div class="line"><a name="l00914"></a><span class="lineno">  914</span>&#160;    <a class="code" href="_onnx_parser_8cpp.xhtml#a0e987f9d4f46b35c9b1ff0cc950dc5b1">VALID_INPUTS</a>(matmulNode, <a class="code" href="_onnx_parser_8cpp.xhtml#a5426a7adb280d1739cc6d66fe9ac1b9c">STR_LIST</a>(onnx::TensorProto::FLOAT));</div><div class="line"><a name="l00915"></a><span class="lineno">  915</span>&#160;</div><div class="line"><a name="l00916"></a><span class="lineno">  916</span>&#160;    GetInputAndParam(matmulNode, &amp;inputName, &amp;weightName, <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>());</div><div class="line"><a name="l00917"></a><span class="lineno">  917</span>&#160;</div><div class="line"><a name="l00918"></a><span class="lineno">  918</span>&#160;    <a class="code" href="structarmnn_1_1_fully_connected_descriptor.xhtml">FullyConnectedDescriptor</a> desc;</div><div class="line"><a name="l00919"></a><span class="lineno">  919</span>&#160;    desc.<a class="code" href="structarmnn_1_1_fully_connected_descriptor.xhtml#aea202e14d8874cefd9a0f778022b7e25">m_BiasEnabled</a> = addNode != <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00920"></a><span class="lineno">  920</span>&#160;</div><div class="line"><a name="l00921"></a><span class="lineno">  921</span>&#160;    <a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml">IConnectableLayer</a>* layer = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00922"></a><span class="lineno">  922</span>&#160;    <span class="keywordflow">if</span>(desc.<a class="code" href="structarmnn_1_1_fully_connected_descriptor.xhtml#aea202e14d8874cefd9a0f778022b7e25">m_BiasEnabled</a>)</div><div class="line"><a name="l00923"></a><span class="lineno">  923</span>&#160;    {</div><div class="line"><a name="l00924"></a><span class="lineno">  924</span>&#160;        <span class="comment">// find bias const</span></div><div class="line"><a name="l00925"></a><span class="lineno">  925</span>&#160;        std::string biasName;</div><div class="line"><a name="l00926"></a><span class="lineno">  926</span>&#160;        <a class="code" href="_verification_helpers_8hpp.xhtml#a479b2821a7a2cbb8fa8eb7f60a47065d">CHECK_VALID_SIZE</a>(static_cast&lt;size_t&gt;(addNode-&gt;input_size()), 2);</div><div class="line"><a name="l00927"></a><span class="lineno">  927</span>&#160;        <a class="code" href="_verification_helpers_8hpp.xhtml#a479b2821a7a2cbb8fa8eb7f60a47065d">CHECK_VALID_SIZE</a>(static_cast&lt;size_t&gt;(addNode-&gt;output_size()), 1);</div><div class="line"><a name="l00928"></a><span class="lineno">  928</span>&#160;        <a class="code" href="_onnx_parser_8cpp.xhtml#a0e987f9d4f46b35c9b1ff0cc950dc5b1">VALID_INPUTS</a>(*addNode, <a class="code" href="_onnx_parser_8cpp.xhtml#a5426a7adb280d1739cc6d66fe9ac1b9c">STR_LIST</a>(onnx::TensorProto::FLOAT));</div><div class="line"><a name="l00929"></a><span class="lineno">  929</span>&#160;</div><div class="line"><a name="l00930"></a><span class="lineno">  930</span>&#160;        GetInputAndParam(*addNode, <span class="keyword">nullptr</span>, &amp;biasName, <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>());</div><div class="line"><a name="l00931"></a><span class="lineno">  931</span>&#160;</div><div class="line"><a name="l00932"></a><span class="lineno">  932</span>&#160;        <span class="comment">//Output shape is [1, weights[1]] and 1d vec in ONNX can be [1,X] so we convert biases to &quot;armnn&quot; 1D</span></div><div class="line"><a name="l00933"></a><span class="lineno">  933</span>&#160;        To1DTensor(biasName, <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>());</div><div class="line"><a name="l00934"></a><span class="lineno">  934</span>&#160;        <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> weightInfo = *m_TensorsInfo[weightName].m_info;</div><div class="line"><a name="l00935"></a><span class="lineno">  935</span>&#160;        <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> biasInfo = *m_TensorsInfo[biasName].m_info;</div><div class="line"><a name="l00936"></a><span class="lineno">  936</span>&#160;</div><div class="line"><a name="l00937"></a><span class="lineno">  937</span>&#160;        <span class="keywordflow">if</span> (weightInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a8b5d0f8a24e9d9238f412260a552acf8">GetShape</a>()[1] != biasInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a8b5d0f8a24e9d9238f412260a552acf8">GetShape</a>()[0])</div><div class="line"><a name="l00938"></a><span class="lineno">  938</span>&#160;        {</div><div class="line"><a name="l00939"></a><span class="lineno">  939</span>&#160;            <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_parse_exception.xhtml">ParseException</a>(</div><div class="line"><a name="l00940"></a><span class="lineno">  940</span>&#160;                fmt::format(<span class="stringliteral">&quot;Shape of weights &#39;{}&#39; and bias of following Add node &#39;{}&#39; do not match : {}&quot;</span></div><div class="line"><a name="l00941"></a><span class="lineno">  941</span>&#160;                            <span class="stringliteral">&quot; and {} ( /!\\ bias should be a 1D tensor) {}&quot;</span>,</div><div class="line"><a name="l00942"></a><span class="lineno">  942</span>&#160;                            weightName,</div><div class="line"><a name="l00943"></a><span class="lineno">  943</span>&#160;                            addNode-&gt;name(),</div><div class="line"><a name="l00944"></a><span class="lineno">  944</span>&#160;                            TensorInfoAsString(*m_TensorsInfo[weightName].m_info, weightName,</div><div class="line"><a name="l00945"></a><span class="lineno">  945</span>&#160;                                               m_TensorsInfo[weightName].m_dtype),</div><div class="line"><a name="l00946"></a><span class="lineno">  946</span>&#160;                            TensorInfoAsString(*m_TensorsInfo[biasName].m_info, biasName,</div><div class="line"><a name="l00947"></a><span class="lineno">  947</span>&#160;                                               m_TensorsInfo[biasName].m_dtype ),</div><div class="line"><a name="l00948"></a><span class="lineno">  948</span>&#160;                            <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l00949"></a><span class="lineno">  949</span>&#160;        }</div><div class="line"><a name="l00950"></a><span class="lineno">  950</span>&#160;        layer = m_Network-&gt;AddFullyConnectedLayer(desc,</div><div class="line"><a name="l00951"></a><span class="lineno">  951</span>&#160;                                                  CreateConstTensor(weightName).first,</div><div class="line"><a name="l00952"></a><span class="lineno">  952</span>&#160;                                                  <a class="code" href="classarmnn_1_1_optional.xhtml">Optional&lt;ConstTensor&gt;</a>(CreateConstTensor(biasName).first),</div><div class="line"><a name="l00953"></a><span class="lineno">  953</span>&#160;                                                  matmulNode.name().c_str());</div><div class="line"><a name="l00954"></a><span class="lineno">  954</span>&#160;        <a class="code" href="_assert_8hpp.xhtml#a5698be69cbd5dfe6c28fcd9867e8cbed">ARMNN_ASSERT</a>(layer != <span class="keyword">nullptr</span>);</div><div class="line"><a name="l00955"></a><span class="lineno">  955</span>&#160;</div><div class="line"><a name="l00956"></a><span class="lineno">  956</span>&#160;        <span class="keyword">auto</span> outputInfo = ComputeOutputInfo({addNode-&gt;output(0)}, layer,</div><div class="line"><a name="l00957"></a><span class="lineno">  957</span>&#160;                                            {m_TensorsInfo[inputName].m_info-&gt;GetShape(),</div><div class="line"><a name="l00958"></a><span class="lineno">  958</span>&#160;                                             m_TensorsInfo[weightName].m_info-&gt;GetShape()});</div><div class="line"><a name="l00959"></a><span class="lineno">  959</span>&#160;</div><div class="line"><a name="l00960"></a><span class="lineno">  960</span>&#160;        layer-&gt;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml#a80ac4eda2e7f2757ec9dd96fc96dbd16">GetOutputSlot</a>(0).<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#a5ee4a6c9a2481245487b1b1a70d20fd0">SetTensorInfo</a>(outputInfo[0]);</div><div class="line"><a name="l00961"></a><span class="lineno">  961</span>&#160;</div><div class="line"><a name="l00962"></a><span class="lineno">  962</span>&#160;        RegisterInputSlots(layer, {inputName});</div><div class="line"><a name="l00963"></a><span class="lineno">  963</span>&#160;        RegisterOutputSlots(layer, {addNode-&gt;output(0)});</div><div class="line"><a name="l00964"></a><span class="lineno">  964</span>&#160;    }</div><div class="line"><a name="l00965"></a><span class="lineno">  965</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l00966"></a><span class="lineno">  966</span>&#160;    {</div><div class="line"><a name="l00967"></a><span class="lineno">  967</span>&#160;        layer = m_Network-&gt;AddFullyConnectedLayer(desc,</div><div class="line"><a name="l00968"></a><span class="lineno">  968</span>&#160;                                                  CreateConstTensor(weightName).first,</div><div class="line"><a name="l00969"></a><span class="lineno">  969</span>&#160;                                                  <a class="code" href="structarmnn_1_1_empty_optional.xhtml">EmptyOptional</a>(),</div><div class="line"><a name="l00970"></a><span class="lineno">  970</span>&#160;                                                  matmulNode.name().c_str());</div><div class="line"><a name="l00971"></a><span class="lineno">  971</span>&#160;        <a class="code" href="_assert_8hpp.xhtml#a5698be69cbd5dfe6c28fcd9867e8cbed">ARMNN_ASSERT</a>(layer != <span class="keyword">nullptr</span>);</div><div class="line"><a name="l00972"></a><span class="lineno">  972</span>&#160;</div><div class="line"><a name="l00973"></a><span class="lineno">  973</span>&#160;        <span class="keyword">auto</span> outputInfo = ComputeOutputInfo({matmulNode.output(0)}, layer,</div><div class="line"><a name="l00974"></a><span class="lineno">  974</span>&#160;                                            {m_TensorsInfo[inputName].m_info-&gt;GetShape(),</div><div class="line"><a name="l00975"></a><span class="lineno">  975</span>&#160;                                             m_TensorsInfo[weightName].m_info-&gt;GetShape()});</div><div class="line"><a name="l00976"></a><span class="lineno">  976</span>&#160;        layer-&gt;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml#a80ac4eda2e7f2757ec9dd96fc96dbd16">GetOutputSlot</a>(0).<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#a5ee4a6c9a2481245487b1b1a70d20fd0">SetTensorInfo</a>(outputInfo[0]);</div><div class="line"><a name="l00977"></a><span class="lineno">  977</span>&#160;</div><div class="line"><a name="l00978"></a><span class="lineno">  978</span>&#160;        RegisterInputSlots(layer, {inputName});</div><div class="line"><a name="l00979"></a><span class="lineno">  979</span>&#160;        RegisterOutputSlots(layer, {matmulNode.output(0)});</div><div class="line"><a name="l00980"></a><span class="lineno">  980</span>&#160;    }</div><div class="line"><a name="l00981"></a><span class="lineno">  981</span>&#160;}</div><div class="line"><a name="l00982"></a><span class="lineno">  982</span>&#160;</div><div class="line"><a name="l00983"></a><span class="lineno">  983</span>&#160;<span class="keywordtype">void</span> OnnxParserImpl::AddPoolingLayer(<span class="keyword">const</span> onnx::NodeProto&amp; node, <a class="code" href="structarmnn_1_1_pooling2d_descriptor.xhtml">Pooling2dDescriptor</a>&amp; desc)</div><div class="line"><a name="l00984"></a><span class="lineno">  984</span>&#160;{</div><div class="line"><a name="l00985"></a><span class="lineno">  985</span>&#160;</div><div class="line"><a name="l00986"></a><span class="lineno">  986</span>&#160;    <a class="code" href="_verification_helpers_8hpp.xhtml#a479b2821a7a2cbb8fa8eb7f60a47065d">CHECK_VALID_SIZE</a>(static_cast&lt;size_t&gt;(node.input_size()), 1);</div><div class="line"><a name="l00987"></a><span class="lineno">  987</span>&#160;    <a class="code" href="_verification_helpers_8hpp.xhtml#a479b2821a7a2cbb8fa8eb7f60a47065d">CHECK_VALID_SIZE</a>(static_cast&lt;size_t&gt;(node.output_size()), 1);</div><div class="line"><a name="l00988"></a><span class="lineno">  988</span>&#160;</div><div class="line"><a name="l00989"></a><span class="lineno">  989</span>&#160;    <a class="code" href="_onnx_parser_8cpp.xhtml#a0e987f9d4f46b35c9b1ff0cc950dc5b1">VALID_INPUTS</a>(node, <a class="code" href="_onnx_parser_8cpp.xhtml#a5426a7adb280d1739cc6d66fe9ac1b9c">STR_LIST</a>(onnx::TensorProto::FLOAT));</div><div class="line"><a name="l00990"></a><span class="lineno">  990</span>&#160;</div><div class="line"><a name="l00991"></a><span class="lineno">  991</span>&#160;    std::vector&lt;uint32_t&gt; kernel_shape = ReadMandatoryNodeUint32ListAttribute(node, <span class="stringliteral">&quot;kernel_shape&quot;</span>); <span class="comment">//size of pool win</span></div><div class="line"><a name="l00992"></a><span class="lineno">  992</span>&#160;    std::vector&lt;uint32_t&gt; strides = ReadOptionalNodeUint32ListAttribute(node, <span class="stringliteral">&quot;strides&quot;</span>);</div><div class="line"><a name="l00993"></a><span class="lineno">  993</span>&#160;    std::vector&lt;uint32_t&gt; pads = ReadOptionalNodeUint32ListAttribute(node, <span class="stringliteral">&quot;pads&quot;</span>);</div><div class="line"><a name="l00994"></a><span class="lineno">  994</span>&#160;</div><div class="line"><a name="l00995"></a><span class="lineno">  995</span>&#160;    desc.<a class="code" href="structarmnn_1_1_pooling2d_descriptor.xhtml#affb5b68b3eba3ed45a06c7cde7781962">m_OutputShapeRounding</a> = OutputShapeRounding::Floor;</div><div class="line"><a name="l00996"></a><span class="lineno">  996</span>&#160;    desc.<a class="code" href="structarmnn_1_1_pooling2d_descriptor.xhtml#a6d8fb685cc1ff224f25aa127fcf62c86">m_PoolWidth</a>  = kernel_shape[1];</div><div class="line"><a name="l00997"></a><span class="lineno">  997</span>&#160;    desc.<a class="code" href="structarmnn_1_1_pooling2d_descriptor.xhtml#a5699e8606c37d18c03910b242cd1b010">m_PoolHeight</a> = kernel_shape[0];</div><div class="line"><a name="l00998"></a><span class="lineno">  998</span>&#160;</div><div class="line"><a name="l00999"></a><span class="lineno">  999</span>&#160;    <span class="keywordflow">if</span>(strides.empty())</div><div class="line"><a name="l01000"></a><span class="lineno"> 1000</span>&#160;    {</div><div class="line"><a name="l01001"></a><span class="lineno"> 1001</span>&#160;        desc.<a class="code" href="structarmnn_1_1_pooling2d_descriptor.xhtml#afe6a3377c4531315354def9023c8fdda">m_StrideX</a>    = 1;</div><div class="line"><a name="l01002"></a><span class="lineno"> 1002</span>&#160;        desc.<a class="code" href="structarmnn_1_1_pooling2d_descriptor.xhtml#ac1fe174bbadfb39a2b636940c2e647c8">m_StrideY</a>    = 1;</div><div class="line"><a name="l01003"></a><span class="lineno"> 1003</span>&#160;    }</div><div class="line"><a name="l01004"></a><span class="lineno"> 1004</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l01005"></a><span class="lineno"> 1005</span>&#160;    {</div><div class="line"><a name="l01006"></a><span class="lineno"> 1006</span>&#160;        desc.<a class="code" href="structarmnn_1_1_pooling2d_descriptor.xhtml#afe6a3377c4531315354def9023c8fdda">m_StrideX</a>    = strides[1];</div><div class="line"><a name="l01007"></a><span class="lineno"> 1007</span>&#160;        desc.<a class="code" href="structarmnn_1_1_pooling2d_descriptor.xhtml#ac1fe174bbadfb39a2b636940c2e647c8">m_StrideY</a>    = strides[0];</div><div class="line"><a name="l01008"></a><span class="lineno"> 1008</span>&#160;    }</div><div class="line"><a name="l01009"></a><span class="lineno"> 1009</span>&#160;</div><div class="line"><a name="l01010"></a><span class="lineno"> 1010</span>&#160;    <span class="comment">//Check new padding version first</span></div><div class="line"><a name="l01011"></a><span class="lineno"> 1011</span>&#160;    <span class="keywordflow">if</span>(pads.empty())</div><div class="line"><a name="l01012"></a><span class="lineno"> 1012</span>&#160;    {</div><div class="line"><a name="l01013"></a><span class="lineno"> 1013</span>&#160;        <span class="comment">//Check deprecated version</span></div><div class="line"><a name="l01014"></a><span class="lineno"> 1014</span>&#160;        std::string paddingString = ReadOptionalNodeStringAttribute(node, <span class="stringliteral">&quot;auto_pad&quot;</span>);</div><div class="line"><a name="l01015"></a><span class="lineno"> 1015</span>&#160;        <span class="keywordflow">if</span>(paddingString != <span class="stringliteral">&quot;VALID&quot;</span> &amp;&amp; paddingString != <span class="stringliteral">&quot;&quot;</span> &amp;&amp; paddingString != <span class="stringliteral">&quot;NOTSET&quot;</span>)</div><div class="line"><a name="l01016"></a><span class="lineno"> 1016</span>&#160;        {</div><div class="line"><a name="l01017"></a><span class="lineno"> 1017</span>&#160;            <span class="keywordtype">bool</span> isUpper;</div><div class="line"><a name="l01018"></a><span class="lineno"> 1018</span>&#160;            <span class="keywordflow">if</span>( paddingString == <span class="stringliteral">&quot;SAME_LOWER&quot;</span>)</div><div class="line"><a name="l01019"></a><span class="lineno"> 1019</span>&#160;            {</div><div class="line"><a name="l01020"></a><span class="lineno"> 1020</span>&#160;                isUpper = <span class="keyword">false</span>;</div><div class="line"><a name="l01021"></a><span class="lineno"> 1021</span>&#160;            }</div><div class="line"><a name="l01022"></a><span class="lineno"> 1022</span>&#160;            <span class="keywordflow">else</span> <span class="keywordflow">if</span> (paddingString == <span class="stringliteral">&quot;SAME_UPPER&quot;</span>)</div><div class="line"><a name="l01023"></a><span class="lineno"> 1023</span>&#160;            {</div><div class="line"><a name="l01024"></a><span class="lineno"> 1024</span>&#160;                isUpper = <span class="keyword">true</span>;</div><div class="line"><a name="l01025"></a><span class="lineno"> 1025</span>&#160;            }</div><div class="line"><a name="l01026"></a><span class="lineno"> 1026</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l01027"></a><span class="lineno"> 1027</span>&#160;            {</div><div class="line"><a name="l01028"></a><span class="lineno"> 1028</span>&#160;                <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_parse_exception.xhtml">ParseException</a>(fmt::format(<span class="stringliteral">&quot;Invalid auto_pad attribute for node {}. &quot;</span></div><div class="line"><a name="l01029"></a><span class="lineno"> 1029</span>&#160;                                                 <span class="stringliteral">&quot;Only SAME_UPPER, SAME_LOWER or VALID supported and found {} {}&quot;</span>,</div><div class="line"><a name="l01030"></a><span class="lineno"> 1030</span>&#160;                                                 node.name(),</div><div class="line"><a name="l01031"></a><span class="lineno"> 1031</span>&#160;                                                 paddingString,</div><div class="line"><a name="l01032"></a><span class="lineno"> 1032</span>&#160;                                                 <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l01033"></a><span class="lineno"> 1033</span>&#160;            }</div><div class="line"><a name="l01034"></a><span class="lineno"> 1034</span>&#160;            <span class="keyword">auto</span> inputInfo = *m_TensorsInfo[node.input(0)].m_info;</div><div class="line"><a name="l01035"></a><span class="lineno"> 1035</span>&#160;            uint32_t inputHeight = inputInfo.GetShape()[2];</div><div class="line"><a name="l01036"></a><span class="lineno"> 1036</span>&#160;            uint32_t inputWidth  = inputInfo.GetShape()[3];</div><div class="line"><a name="l01037"></a><span class="lineno"> 1037</span>&#160;            <a class="code" href="namespacearmnn_tf_parser.xhtml#aca0a31de02d5c087029bb28c9202b4d6">CalcPadding</a>(inputHeight,</div><div class="line"><a name="l01038"></a><span class="lineno"> 1038</span>&#160;                        desc.<a class="code" href="structarmnn_1_1_pooling2d_descriptor.xhtml#a5699e8606c37d18c03910b242cd1b010">m_PoolHeight</a>,</div><div class="line"><a name="l01039"></a><span class="lineno"> 1039</span>&#160;                        desc.<a class="code" href="structarmnn_1_1_pooling2d_descriptor.xhtml#ac1fe174bbadfb39a2b636940c2e647c8">m_StrideY</a>,</div><div class="line"><a name="l01040"></a><span class="lineno"> 1040</span>&#160;                        1u,</div><div class="line"><a name="l01041"></a><span class="lineno"> 1041</span>&#160;                        &amp;desc.<a class="code" href="structarmnn_1_1_pooling2d_descriptor.xhtml#a56b51f56cef50cdfa554258eecdab046">m_PadTop</a>,</div><div class="line"><a name="l01042"></a><span class="lineno"> 1042</span>&#160;                        &amp;desc.<a class="code" href="structarmnn_1_1_pooling2d_descriptor.xhtml#aa9e49717ebdb741e8c767741647fc618">m_PadBottom</a>,</div><div class="line"><a name="l01043"></a><span class="lineno"> 1043</span>&#160;                        isUpper);</div><div class="line"><a name="l01044"></a><span class="lineno"> 1044</span>&#160;            <a class="code" href="namespacearmnn_tf_parser.xhtml#aca0a31de02d5c087029bb28c9202b4d6">CalcPadding</a>(inputWidth,</div><div class="line"><a name="l01045"></a><span class="lineno"> 1045</span>&#160;                        desc.<a class="code" href="structarmnn_1_1_pooling2d_descriptor.xhtml#a6d8fb685cc1ff224f25aa127fcf62c86">m_PoolWidth</a>,</div><div class="line"><a name="l01046"></a><span class="lineno"> 1046</span>&#160;                        desc.<a class="code" href="structarmnn_1_1_pooling2d_descriptor.xhtml#afe6a3377c4531315354def9023c8fdda">m_StrideX</a>,</div><div class="line"><a name="l01047"></a><span class="lineno"> 1047</span>&#160;                        1u,</div><div class="line"><a name="l01048"></a><span class="lineno"> 1048</span>&#160;                        &amp;desc.<a class="code" href="structarmnn_1_1_pooling2d_descriptor.xhtml#ac18546ebbebbb32fe0a03baa9bf2c600">m_PadLeft</a>,</div><div class="line"><a name="l01049"></a><span class="lineno"> 1049</span>&#160;                        &amp;desc.<a class="code" href="structarmnn_1_1_pooling2d_descriptor.xhtml#a002bc30e590d78cbb4f4d12171055ca7">m_PadRight</a>,</div><div class="line"><a name="l01050"></a><span class="lineno"> 1050</span>&#160;                        isUpper);</div><div class="line"><a name="l01051"></a><span class="lineno"> 1051</span>&#160;        }</div><div class="line"><a name="l01052"></a><span class="lineno"> 1052</span>&#160;    }</div><div class="line"><a name="l01053"></a><span class="lineno"> 1053</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l01054"></a><span class="lineno"> 1054</span>&#160;    {</div><div class="line"><a name="l01055"></a><span class="lineno"> 1055</span>&#160;        desc.<a class="code" href="structarmnn_1_1_pooling2d_descriptor.xhtml#a56b51f56cef50cdfa554258eecdab046">m_PadTop</a>     = pads[0];</div><div class="line"><a name="l01056"></a><span class="lineno"> 1056</span>&#160;        desc.<a class="code" href="structarmnn_1_1_pooling2d_descriptor.xhtml#ac18546ebbebbb32fe0a03baa9bf2c600">m_PadLeft</a>    = pads[1];</div><div class="line"><a name="l01057"></a><span class="lineno"> 1057</span>&#160;        desc.<a class="code" href="structarmnn_1_1_pooling2d_descriptor.xhtml#aa9e49717ebdb741e8c767741647fc618">m_PadBottom</a>  = pads[2];</div><div class="line"><a name="l01058"></a><span class="lineno"> 1058</span>&#160;        desc.<a class="code" href="structarmnn_1_1_pooling2d_descriptor.xhtml#a002bc30e590d78cbb4f4d12171055ca7">m_PadRight</a>   = pads[3];</div><div class="line"><a name="l01059"></a><span class="lineno"> 1059</span>&#160;    }</div><div class="line"><a name="l01060"></a><span class="lineno"> 1060</span>&#160;</div><div class="line"><a name="l01061"></a><span class="lineno"> 1061</span>&#160;    <a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml">IConnectableLayer</a>* layer = m_Network-&gt;AddPooling2dLayer(desc, node.name().c_str());</div><div class="line"><a name="l01062"></a><span class="lineno"> 1062</span>&#160;    <a class="code" href="_assert_8hpp.xhtml#a5698be69cbd5dfe6c28fcd9867e8cbed">ARMNN_ASSERT</a>(layer != <span class="keyword">nullptr</span>);</div><div class="line"><a name="l01063"></a><span class="lineno"> 1063</span>&#160;</div><div class="line"><a name="l01064"></a><span class="lineno"> 1064</span>&#160;    <span class="keyword">auto</span> outputInfo = ComputeOutputInfo({node.output(0)}, layer, {m_TensorsInfo[node.input(0)].m_info-&gt;GetShape()});</div><div class="line"><a name="l01065"></a><span class="lineno"> 1065</span>&#160;    layer-&gt;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml#a80ac4eda2e7f2757ec9dd96fc96dbd16">GetOutputSlot</a>(0).<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#a5ee4a6c9a2481245487b1b1a70d20fd0">SetTensorInfo</a>(outputInfo[0]);</div><div class="line"><a name="l01066"></a><span class="lineno"> 1066</span>&#160;</div><div class="line"><a name="l01067"></a><span class="lineno"> 1067</span>&#160;    <span class="comment">// register the input connection slots for the layer, connections are made after all layers have been created</span></div><div class="line"><a name="l01068"></a><span class="lineno"> 1068</span>&#160;    <span class="comment">// only the tensors for the inputs are relevant, exclude the const tensors</span></div><div class="line"><a name="l01069"></a><span class="lineno"> 1069</span>&#160;    RegisterInputSlots(layer, {node.input(0)});</div><div class="line"><a name="l01070"></a><span class="lineno"> 1070</span>&#160;</div><div class="line"><a name="l01071"></a><span class="lineno"> 1071</span>&#160;    <span class="comment">// register the output connection slots for the layer, connections are made after all layers have been created</span></div><div class="line"><a name="l01072"></a><span class="lineno"> 1072</span>&#160;    RegisterOutputSlots(layer, {node.output(0)});</div><div class="line"><a name="l01073"></a><span class="lineno"> 1073</span>&#160;}</div><div class="line"><a name="l01074"></a><span class="lineno"> 1074</span>&#160;</div><div class="line"><a name="l01075"></a><span class="lineno"> 1075</span>&#160;std::pair&lt;std::string, std::string&gt; OnnxParserImpl::AddPrepareBroadcast(<span class="keyword">const</span> std::string&amp; input0,</div><div class="line"><a name="l01076"></a><span class="lineno"> 1076</span>&#160;                                                                        <span class="keyword">const</span> std::string&amp; input1)</div><div class="line"><a name="l01077"></a><span class="lineno"> 1077</span>&#160;{</div><div class="line"><a name="l01078"></a><span class="lineno"> 1078</span>&#160;    std::pair&lt;std::string, std::string&gt; inputs = std::make_pair(input0, input1);</div><div class="line"><a name="l01079"></a><span class="lineno"> 1079</span>&#160;</div><div class="line"><a name="l01080"></a><span class="lineno"> 1080</span>&#160;    <a class="code" href="classarmnn_1_1_tensor_shape.xhtml">TensorShape</a> input0Shape = m_TensorsInfo[input0].m_info-&gt;GetShape();</div><div class="line"><a name="l01081"></a><span class="lineno"> 1081</span>&#160;    <a class="code" href="classarmnn_1_1_tensor_shape.xhtml">TensorShape</a> input1Shape = m_TensorsInfo[input1].m_info-&gt;GetShape();</div><div class="line"><a name="l01082"></a><span class="lineno"> 1082</span>&#160;</div><div class="line"><a name="l01083"></a><span class="lineno"> 1083</span>&#160;    <span class="keywordflow">if</span>(input1Shape.<a class="code" href="classarmnn_1_1_tensor_shape.xhtml#a157e27d41e9f6b21f0d3c025fa47dc24">GetNumDimensions</a>() &lt; input0Shape.<a class="code" href="classarmnn_1_1_tensor_shape.xhtml#a157e27d41e9f6b21f0d3c025fa47dc24">GetNumDimensions</a>())</div><div class="line"><a name="l01084"></a><span class="lineno"> 1084</span>&#160;    {</div><div class="line"><a name="l01085"></a><span class="lineno"> 1085</span>&#160;        <span class="keyword">auto</span> outputName = fmt::format(<span class="stringliteral">&quot;reshape_output_{}&quot;</span>, input1);</div><div class="line"><a name="l01086"></a><span class="lineno"> 1086</span>&#160;        PrependForBroadcast(outputName, input1, input0);</div><div class="line"><a name="l01087"></a><span class="lineno"> 1087</span>&#160;        inputs.second = outputName;</div><div class="line"><a name="l01088"></a><span class="lineno"> 1088</span>&#160;    }</div><div class="line"><a name="l01089"></a><span class="lineno"> 1089</span>&#160;    <span class="keywordflow">else</span> <span class="keywordflow">if</span>(input0Shape.<a class="code" href="classarmnn_1_1_tensor_shape.xhtml#a157e27d41e9f6b21f0d3c025fa47dc24">GetNumDimensions</a>() &lt; input1Shape.<a class="code" href="classarmnn_1_1_tensor_shape.xhtml#a157e27d41e9f6b21f0d3c025fa47dc24">GetNumDimensions</a>())</div><div class="line"><a name="l01090"></a><span class="lineno"> 1090</span>&#160;    {</div><div class="line"><a name="l01091"></a><span class="lineno"> 1091</span>&#160;        <span class="keyword">auto</span> outputName = fmt::format(<span class="stringliteral">&quot;reshape_output_{}&quot;</span>, input0);</div><div class="line"><a name="l01092"></a><span class="lineno"> 1092</span>&#160;        PrependForBroadcast(outputName, input0, input1);</div><div class="line"><a name="l01093"></a><span class="lineno"> 1093</span>&#160;        inputs.first = outputName;</div><div class="line"><a name="l01094"></a><span class="lineno"> 1094</span>&#160;    }</div><div class="line"><a name="l01095"></a><span class="lineno"> 1095</span>&#160;    <span class="keywordflow">return</span> inputs;</div><div class="line"><a name="l01096"></a><span class="lineno"> 1096</span>&#160;}</div><div class="line"><a name="l01097"></a><span class="lineno"> 1097</span>&#160;</div><div class="line"><a name="l01098"></a><span class="lineno"> 1098</span>&#160;<span class="keywordtype">void</span> OnnxParserImpl::CreateConstantLayer(<span class="keyword">const</span> std::string&amp; tensorName, <span class="keyword">const</span> std::string&amp; layerName)</div><div class="line"><a name="l01099"></a><span class="lineno"> 1099</span>&#160;{</div><div class="line"><a name="l01100"></a><span class="lineno"> 1100</span>&#160;    <span class="keyword">auto</span> armnnTensor = CreateConstTensor(tensorName);</div><div class="line"><a name="l01101"></a><span class="lineno"> 1101</span>&#160;</div><div class="line"><a name="l01102"></a><span class="lineno"> 1102</span>&#160;    <a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml">IConnectableLayer</a>* layer = m_Network-&gt;AddConstantLayer(armnnTensor.first, layerName.c_str());</div><div class="line"><a name="l01103"></a><span class="lineno"> 1103</span>&#160;    layer-&gt;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml#a80ac4eda2e7f2757ec9dd96fc96dbd16">GetOutputSlot</a>(0).<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#a5ee4a6c9a2481245487b1b1a70d20fd0">SetTensorInfo</a>(armnnTensor.first.GetInfo());</div><div class="line"><a name="l01104"></a><span class="lineno"> 1104</span>&#160;    RegisterOutputSlots(layer, {tensorName});</div><div class="line"><a name="l01105"></a><span class="lineno"> 1105</span>&#160;}</div><div class="line"><a name="l01106"></a><span class="lineno"> 1106</span>&#160;</div><div class="line"><a name="l01107"></a><span class="lineno"> 1107</span>&#160;<span class="keywordtype">void</span> OnnxParserImpl::CreateReshapeLayer(<span class="keyword">const</span> std::string&amp; inputName,</div><div class="line"><a name="l01108"></a><span class="lineno"> 1108</span>&#160;                                        <span class="keyword">const</span> std::string&amp; outputName,</div><div class="line"><a name="l01109"></a><span class="lineno"> 1109</span>&#160;                                        <span class="keyword">const</span> std::string&amp; layerName)</div><div class="line"><a name="l01110"></a><span class="lineno"> 1110</span>&#160;{</div><div class="line"><a name="l01111"></a><span class="lineno"> 1111</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> outputTensorInfo = *m_TensorsInfo[outputName].m_info;</div><div class="line"><a name="l01112"></a><span class="lineno"> 1112</span>&#160;    <a class="code" href="structarmnn_1_1_reshape_descriptor.xhtml">ReshapeDescriptor</a> reshapeDesc;</div><div class="line"><a name="l01113"></a><span class="lineno"> 1113</span>&#160;    reshapeDesc.<a class="code" href="structarmnn_1_1_reshape_descriptor.xhtml#a1178f4dafdda81f59c15145ec327f7d9">m_TargetShape</a> = outputTensorInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a8b5d0f8a24e9d9238f412260a552acf8">GetShape</a>();</div><div class="line"><a name="l01114"></a><span class="lineno"> 1114</span>&#160;</div><div class="line"><a name="l01115"></a><span class="lineno"> 1115</span>&#160;    <a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml">IConnectableLayer</a>* layer = m_Network-&gt;AddReshapeLayer(reshapeDesc, layerName.c_str());</div><div class="line"><a name="l01116"></a><span class="lineno"> 1116</span>&#160;    <a class="code" href="_assert_8hpp.xhtml#a5698be69cbd5dfe6c28fcd9867e8cbed">ARMNN_ASSERT</a>(layer != <span class="keyword">nullptr</span>);</div><div class="line"><a name="l01117"></a><span class="lineno"> 1117</span>&#160;    layer-&gt;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml#a80ac4eda2e7f2757ec9dd96fc96dbd16">GetOutputSlot</a>(0).<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#a5ee4a6c9a2481245487b1b1a70d20fd0">SetTensorInfo</a>(outputTensorInfo);</div><div class="line"><a name="l01118"></a><span class="lineno"> 1118</span>&#160;</div><div class="line"><a name="l01119"></a><span class="lineno"> 1119</span>&#160;    <span class="comment">// register the input connection slots for the layer, connections are made after all layers have been created</span></div><div class="line"><a name="l01120"></a><span class="lineno"> 1120</span>&#160;    <span class="comment">// only the tensors for the inputs are relevant, exclude the const tensors</span></div><div class="line"><a name="l01121"></a><span class="lineno"> 1121</span>&#160;    RegisterInputSlots(layer, {inputName});</div><div class="line"><a name="l01122"></a><span class="lineno"> 1122</span>&#160;</div><div class="line"><a name="l01123"></a><span class="lineno"> 1123</span>&#160;    <span class="comment">// register the output connection slots for the layer, connections are made after all layers have been created</span></div><div class="line"><a name="l01124"></a><span class="lineno"> 1124</span>&#160;    RegisterOutputSlots(layer, {outputName});</div><div class="line"><a name="l01125"></a><span class="lineno"> 1125</span>&#160;}</div><div class="line"><a name="l01126"></a><span class="lineno"> 1126</span>&#160;</div><div class="line"><a name="l01127"></a><span class="lineno"> 1127</span>&#160;<span class="keywordtype">void</span> OnnxParserImpl::ParseActivation(<span class="keyword">const</span> onnx::NodeProto&amp; node, <span class="keyword">const</span> <a class="code" href="namespacearmnn.xhtml#a56297e0f7b215eea46c818cb7528d9ea">armnn::ActivationFunction</a> func)</div><div class="line"><a name="l01128"></a><span class="lineno"> 1128</span>&#160;{</div><div class="line"><a name="l01129"></a><span class="lineno"> 1129</span>&#160;    <a class="code" href="_verification_helpers_8hpp.xhtml#a479b2821a7a2cbb8fa8eb7f60a47065d">CHECK_VALID_SIZE</a>(static_cast&lt;size_t&gt;(node.input_size()), 1, 3);</div><div class="line"><a name="l01130"></a><span class="lineno"> 1130</span>&#160;    <a class="code" href="_verification_helpers_8hpp.xhtml#a479b2821a7a2cbb8fa8eb7f60a47065d">CHECK_VALID_SIZE</a>(static_cast&lt;size_t&gt;(node.output_size()), 1);</div><div class="line"><a name="l01131"></a><span class="lineno"> 1131</span>&#160;</div><div class="line"><a name="l01132"></a><span class="lineno"> 1132</span>&#160;    <a class="code" href="_onnx_parser_8cpp.xhtml#a0e987f9d4f46b35c9b1ff0cc950dc5b1">VALID_INPUTS</a>(node, <a class="code" href="_onnx_parser_8cpp.xhtml#a5426a7adb280d1739cc6d66fe9ac1b9c">STR_LIST</a>(onnx::TensorProto::FLOAT));</div><div class="line"><a name="l01133"></a><span class="lineno"> 1133</span>&#160;</div><div class="line"><a name="l01134"></a><span class="lineno"> 1134</span>&#160;    <a class="code" href="structarmnn_1_1_activation_descriptor.xhtml">ActivationDescriptor</a> desc;</div><div class="line"><a name="l01135"></a><span class="lineno"> 1135</span>&#160;    desc.<a class="code" href="structarmnn_1_1_activation_descriptor.xhtml#af10fa7883e3579950f477bee92a64844">m_Function</a> = func;</div><div class="line"><a name="l01136"></a><span class="lineno"> 1136</span>&#160;</div><div class="line"><a name="l01137"></a><span class="lineno"> 1137</span>&#160;    <span class="keywordflow">if</span> (func == ActivationFunction::BoundedReLu)</div><div class="line"><a name="l01138"></a><span class="lineno"> 1138</span>&#160;    {</div><div class="line"><a name="l01139"></a><span class="lineno"> 1139</span>&#160;        desc.<a class="code" href="structarmnn_1_1_activation_descriptor.xhtml#a017b2990003a014234f13e999dc7c689">m_A</a> = node.input(2).empty() ? std::numeric_limits&lt;float&gt;::max() : std::stof(node.input(2));</div><div class="line"><a name="l01140"></a><span class="lineno"> 1140</span>&#160;        desc.<a class="code" href="structarmnn_1_1_activation_descriptor.xhtml#a28c4c9cb15f6be3499abbc46b356060b">m_B</a> = node.input(1).empty() ? std::numeric_limits&lt;float&gt;::lowest() : std::stof(node.input(1));</div><div class="line"><a name="l01141"></a><span class="lineno"> 1141</span>&#160;    }</div><div class="line"><a name="l01142"></a><span class="lineno"> 1142</span>&#160;</div><div class="line"><a name="l01143"></a><span class="lineno"> 1143</span>&#160;    <a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml">IConnectableLayer</a>* <span class="keyword">const</span> layer = m_Network-&gt;AddActivationLayer(desc, node.name().c_str());</div><div class="line"><a name="l01144"></a><span class="lineno"> 1144</span>&#160;    <a class="code" href="_assert_8hpp.xhtml#a5698be69cbd5dfe6c28fcd9867e8cbed">ARMNN_ASSERT</a>(layer != <span class="keyword">nullptr</span>);</div><div class="line"><a name="l01145"></a><span class="lineno"> 1145</span>&#160;</div><div class="line"><a name="l01146"></a><span class="lineno"> 1146</span>&#160;    <span class="keyword">auto</span> outputInfo = ComputeOutputInfo({ node.output(0)}, layer, {m_TensorsInfo[node.input(0)].m_info-&gt;GetShape()});</div><div class="line"><a name="l01147"></a><span class="lineno"> 1147</span>&#160;    layer-&gt;GetOutputSlot(0).SetTensorInfo(outputInfo[0]);</div><div class="line"><a name="l01148"></a><span class="lineno"> 1148</span>&#160;</div><div class="line"><a name="l01149"></a><span class="lineno"> 1149</span>&#160;    <span class="comment">// register the input connection slots for the layer, connections are made after all layers have been created</span></div><div class="line"><a name="l01150"></a><span class="lineno"> 1150</span>&#160;    <span class="comment">// only the tensors for the inputs are relevant, exclude the const tensors</span></div><div class="line"><a name="l01151"></a><span class="lineno"> 1151</span>&#160;    RegisterInputSlots(layer, {node.input(0)});</div><div class="line"><a name="l01152"></a><span class="lineno"> 1152</span>&#160;</div><div class="line"><a name="l01153"></a><span class="lineno"> 1153</span>&#160;    <span class="comment">// register the output connection slots for the layer, connections are made after all layers have been created</span></div><div class="line"><a name="l01154"></a><span class="lineno"> 1154</span>&#160;    RegisterOutputSlots(layer, {node.output(0)});</div><div class="line"><a name="l01155"></a><span class="lineno"> 1155</span>&#160;}</div><div class="line"><a name="l01156"></a><span class="lineno"> 1156</span>&#160;</div><div class="line"><a name="l01157"></a><span class="lineno"> 1157</span>&#160;<span class="keywordtype">void</span> OnnxParserImpl::ParseClip(<span class="keyword">const</span> onnx::NodeProto&amp; node)</div><div class="line"><a name="l01158"></a><span class="lineno"> 1158</span>&#160;{</div><div class="line"><a name="l01159"></a><span class="lineno"> 1159</span>&#160;    ParseActivation(node, ActivationFunction::BoundedReLu);</div><div class="line"><a name="l01160"></a><span class="lineno"> 1160</span>&#160;}</div><div class="line"><a name="l01161"></a><span class="lineno"> 1161</span>&#160;</div><div class="line"><a name="l01162"></a><span class="lineno"> 1162</span>&#160;<span class="keywordtype">void</span> OnnxParserImpl::ParseSigmoid(<span class="keyword">const</span> onnx::NodeProto&amp; node)</div><div class="line"><a name="l01163"></a><span class="lineno"> 1163</span>&#160;{</div><div class="line"><a name="l01164"></a><span class="lineno"> 1164</span>&#160;    ParseActivation(node, ActivationFunction::Sigmoid);</div><div class="line"><a name="l01165"></a><span class="lineno"> 1165</span>&#160;}</div><div class="line"><a name="l01166"></a><span class="lineno"> 1166</span>&#160;</div><div class="line"><a name="l01167"></a><span class="lineno"> 1167</span>&#160;<span class="keywordtype">void</span> OnnxParserImpl::ParseTanh(<span class="keyword">const</span> onnx::NodeProto&amp; node)</div><div class="line"><a name="l01168"></a><span class="lineno"> 1168</span>&#160;{</div><div class="line"><a name="l01169"></a><span class="lineno"> 1169</span>&#160;    ParseActivation(node, ActivationFunction::TanH);</div><div class="line"><a name="l01170"></a><span class="lineno"> 1170</span>&#160;}</div><div class="line"><a name="l01171"></a><span class="lineno"> 1171</span>&#160;</div><div class="line"><a name="l01172"></a><span class="lineno"> 1172</span>&#160;<span class="keywordtype">void</span> OnnxParserImpl::ParseRelu(<span class="keyword">const</span> onnx::NodeProto&amp; node)</div><div class="line"><a name="l01173"></a><span class="lineno"> 1173</span>&#160;{</div><div class="line"><a name="l01174"></a><span class="lineno"> 1174</span>&#160;    ParseActivation(node, ActivationFunction::ReLu);</div><div class="line"><a name="l01175"></a><span class="lineno"> 1175</span>&#160;}</div><div class="line"><a name="l01176"></a><span class="lineno"> 1176</span>&#160;</div><div class="line"><a name="l01177"></a><span class="lineno"> 1177</span>&#160;<span class="keywordtype">void</span> OnnxParserImpl::ParseLeakyRelu(<span class="keyword">const</span> onnx::NodeProto&amp; node)</div><div class="line"><a name="l01178"></a><span class="lineno"> 1178</span>&#160;{</div><div class="line"><a name="l01179"></a><span class="lineno"> 1179</span>&#160;    ParseActivation(node, ActivationFunction::LeakyReLu);</div><div class="line"><a name="l01180"></a><span class="lineno"> 1180</span>&#160;}</div><div class="line"><a name="l01181"></a><span class="lineno"> 1181</span>&#160;</div><div class="line"><a name="l01182"></a><span class="lineno"> 1182</span>&#160;<span class="keywordtype">void</span> OnnxParserImpl::ParseAdd(<span class="keyword">const</span> onnx::NodeProto&amp; node)</div><div class="line"><a name="l01183"></a><span class="lineno"> 1183</span>&#160;{</div><div class="line"><a name="l01184"></a><span class="lineno"> 1184</span>&#160;    <a class="code" href="_verification_helpers_8hpp.xhtml#a479b2821a7a2cbb8fa8eb7f60a47065d">CHECK_VALID_SIZE</a>(static_cast&lt;size_t&gt;(node.input_size()), 2);</div><div class="line"><a name="l01185"></a><span class="lineno"> 1185</span>&#160;    <a class="code" href="_verification_helpers_8hpp.xhtml#a479b2821a7a2cbb8fa8eb7f60a47065d">CHECK_VALID_SIZE</a>(static_cast&lt;size_t&gt;(node.output_size()), 1);</div><div class="line"><a name="l01186"></a><span class="lineno"> 1186</span>&#160;</div><div class="line"><a name="l01187"></a><span class="lineno"> 1187</span>&#160;    <a class="code" href="_onnx_parser_8cpp.xhtml#a0e987f9d4f46b35c9b1ff0cc950dc5b1">VALID_INPUTS</a>(node, <a class="code" href="_onnx_parser_8cpp.xhtml#a5426a7adb280d1739cc6d66fe9ac1b9c">STR_LIST</a>(onnx::TensorProto::FLOAT));</div><div class="line"><a name="l01188"></a><span class="lineno"> 1188</span>&#160;</div><div class="line"><a name="l01189"></a><span class="lineno"> 1189</span>&#160;    <span class="comment">// TODO: unify broadcast validation code across layers</span></div><div class="line"><a name="l01190"></a><span class="lineno"> 1190</span>&#160;    <span class="comment">// tracked by: IVGCVSW-1576</span></div><div class="line"><a name="l01191"></a><span class="lineno"> 1191</span>&#160;</div><div class="line"><a name="l01192"></a><span class="lineno"> 1192</span>&#160;    <span class="comment">// Checking broadcast compatibility : only scalar or 1D tensors</span></div><div class="line"><a name="l01193"></a><span class="lineno"> 1193</span>&#160;    <span class="keyword">auto</span> inputs = AddPrepareBroadcast(node.input(0), node.input(1));</div><div class="line"><a name="l01194"></a><span class="lineno"> 1194</span>&#160;    <span class="keyword">auto</span> input0 = *m_TensorsInfo[inputs.first].m_info;</div><div class="line"><a name="l01195"></a><span class="lineno"> 1195</span>&#160;    <span class="keyword">auto</span> input1 = *m_TensorsInfo[inputs.second].m_info;</div><div class="line"><a name="l01196"></a><span class="lineno"> 1196</span>&#160;    <a class="code" href="_assert_8hpp.xhtml#a5698be69cbd5dfe6c28fcd9867e8cbed">ARMNN_ASSERT</a>(input0.GetNumDimensions() == input1.GetNumDimensions());</div><div class="line"><a name="l01197"></a><span class="lineno"> 1197</span>&#160;</div><div class="line"><a name="l01198"></a><span class="lineno"> 1198</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> numDims = input0.GetNumDimensions();</div><div class="line"><a name="l01199"></a><span class="lineno"> 1199</span>&#160;    <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i = 0; i &lt; numDims; i++)</div><div class="line"><a name="l01200"></a><span class="lineno"> 1200</span>&#160;    {</div><div class="line"><a name="l01201"></a><span class="lineno"> 1201</span>&#160;        <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> dim0 = input0.GetShape()[i];</div><div class="line"><a name="l01202"></a><span class="lineno"> 1202</span>&#160;        <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> dim1 = input1.GetShape()[i];</div><div class="line"><a name="l01203"></a><span class="lineno"> 1203</span>&#160;        <span class="keywordflow">if</span> (dim0 != dim1 &amp;&amp; dim0 != 1 &amp;&amp; dim1 != 1)</div><div class="line"><a name="l01204"></a><span class="lineno"> 1204</span>&#160;        {</div><div class="line"><a name="l01205"></a><span class="lineno"> 1205</span>&#160;            <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_parse_exception.xhtml">ParseException</a>(</div><div class="line"><a name="l01206"></a><span class="lineno"> 1206</span>&#160;                fmt::format(<span class="stringliteral">&quot;Broadcast is only supported for scalar or 1D tensors in Add node &#39;{}&#39;. &quot;</span></div><div class="line"><a name="l01207"></a><span class="lineno"> 1207</span>&#160;                            <span class="stringliteral">&quot;Input dimensions should either match or one should be of size 1 and here, &quot;</span></div><div class="line"><a name="l01208"></a><span class="lineno"> 1208</span>&#160;                            <span class="stringliteral">&quot;{} and {} {}&quot;</span>,</div><div class="line"><a name="l01209"></a><span class="lineno"> 1209</span>&#160;                            node.name(),</div><div class="line"><a name="l01210"></a><span class="lineno"> 1210</span>&#160;                            TensorInfoAsString(*m_TensorsInfo[inputs.first].m_info, inputs.first,</div><div class="line"><a name="l01211"></a><span class="lineno"> 1211</span>&#160;                                               m_TensorsInfo[inputs.first].m_dtype),</div><div class="line"><a name="l01212"></a><span class="lineno"> 1212</span>&#160;                            TensorInfoAsString(*m_TensorsInfo[inputs.second].m_info, inputs.second,</div><div class="line"><a name="l01213"></a><span class="lineno"> 1213</span>&#160;                                               m_TensorsInfo[inputs.second].m_dtype),</div><div class="line"><a name="l01214"></a><span class="lineno"> 1214</span>&#160;                            <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l01215"></a><span class="lineno"> 1215</span>&#160;        }</div><div class="line"><a name="l01216"></a><span class="lineno"> 1216</span>&#160;    }</div><div class="line"><a name="l01217"></a><span class="lineno"> 1217</span>&#160;</div><div class="line"><a name="l01218"></a><span class="lineno"> 1218</span>&#160;</div><div class="line"><a name="l01219"></a><span class="lineno"> 1219</span>&#160;    <a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml">IConnectableLayer</a>* layer = m_Network-&gt;AddAdditionLayer(node.name().c_str());</div><div class="line"><a name="l01220"></a><span class="lineno"> 1220</span>&#160;    <a class="code" href="_assert_8hpp.xhtml#a5698be69cbd5dfe6c28fcd9867e8cbed">ARMNN_ASSERT</a>(layer != <span class="keyword">nullptr</span>);</div><div class="line"><a name="l01221"></a><span class="lineno"> 1221</span>&#160;</div><div class="line"><a name="l01222"></a><span class="lineno"> 1222</span>&#160;    <span class="keyword">auto</span> outputInfo = ComputeOutputInfo({ node.output(0) }, layer,</div><div class="line"><a name="l01223"></a><span class="lineno"> 1223</span>&#160;                                        { m_TensorsInfo[inputs.first].m_info-&gt;GetShape(),</div><div class="line"><a name="l01224"></a><span class="lineno"> 1224</span>&#160;                                          m_TensorsInfo[inputs.second].m_info-&gt;GetShape() });</div><div class="line"><a name="l01225"></a><span class="lineno"> 1225</span>&#160;    layer-&gt;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml#a80ac4eda2e7f2757ec9dd96fc96dbd16">GetOutputSlot</a>(0).<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#a5ee4a6c9a2481245487b1b1a70d20fd0">SetTensorInfo</a>(outputInfo[0]);</div><div class="line"><a name="l01226"></a><span class="lineno"> 1226</span>&#160;</div><div class="line"><a name="l01227"></a><span class="lineno"> 1227</span>&#160;    <span class="comment">// register the input connection -&gt; for constant inputs, we need to make a newDim constant layer</span></div><div class="line"><a name="l01228"></a><span class="lineno"> 1228</span>&#160;    <span class="keywordflow">if</span>(m_TensorsInfo[inputs.first].isConstant()) {</div><div class="line"><a name="l01229"></a><span class="lineno"> 1229</span>&#160;        CreateConstantLayer(inputs.first, fmt::format(<span class="stringliteral">&quot;Add:constant_of_{}&quot;</span>, node.input(0)));</div><div class="line"><a name="l01230"></a><span class="lineno"> 1230</span>&#160;    }</div><div class="line"><a name="l01231"></a><span class="lineno"> 1231</span>&#160;    <span class="keywordflow">if</span>(m_TensorsInfo[inputs.second].isConstant()) {</div><div class="line"><a name="l01232"></a><span class="lineno"> 1232</span>&#160;        CreateConstantLayer(inputs.second, fmt::format(<span class="stringliteral">&quot;Add:constant_of_{}&quot;</span>, node.input(1)));</div><div class="line"><a name="l01233"></a><span class="lineno"> 1233</span>&#160;    }</div><div class="line"><a name="l01234"></a><span class="lineno"> 1234</span>&#160;    RegisterInputSlots(layer, {inputs.first, inputs.second});</div><div class="line"><a name="l01235"></a><span class="lineno"> 1235</span>&#160;</div><div class="line"><a name="l01236"></a><span class="lineno"> 1236</span>&#160;    <span class="comment">// register the output connection</span></div><div class="line"><a name="l01237"></a><span class="lineno"> 1237</span>&#160;    RegisterOutputSlots(layer, {node.output(0)});</div><div class="line"><a name="l01238"></a><span class="lineno"> 1238</span>&#160;}</div><div class="line"><a name="l01239"></a><span class="lineno"> 1239</span>&#160;</div><div class="line"><a name="l01240"></a><span class="lineno"> 1240</span>&#160;<span class="keywordtype">void</span> OnnxParserImpl::ParseAveragePool(<span class="keyword">const</span> onnx::NodeProto&amp; node)</div><div class="line"><a name="l01241"></a><span class="lineno"> 1241</span>&#160;{</div><div class="line"><a name="l01242"></a><span class="lineno"> 1242</span>&#160;    <a class="code" href="structarmnn_1_1_pooling2d_descriptor.xhtml">Pooling2dDescriptor</a> desc;</div><div class="line"><a name="l01243"></a><span class="lineno"> 1243</span>&#160;    desc.<a class="code" href="structarmnn_1_1_pooling2d_descriptor.xhtml#a0031997bf43bd2747656c31e4977793a">m_PoolType</a> = PoolingAlgorithm::Average;</div><div class="line"><a name="l01244"></a><span class="lineno"> 1244</span>&#160;</div><div class="line"><a name="l01245"></a><span class="lineno"> 1245</span>&#160;    uint32_t count_include_pad = 0;</div><div class="line"><a name="l01246"></a><span class="lineno"> 1246</span>&#160;    count_include_pad = ReadOptionalNodeUint32Attribute(node, <span class="stringliteral">&quot;count_include_pad&quot;</span>);</div><div class="line"><a name="l01247"></a><span class="lineno"> 1247</span>&#160;    <span class="keywordflow">if</span>(count_include_pad) {</div><div class="line"><a name="l01248"></a><span class="lineno"> 1248</span>&#160;        desc.<a class="code" href="structarmnn_1_1_pooling2d_descriptor.xhtml#a8c29d6ea9b4186d69aad5961c910939c">m_PaddingMethod</a> = PaddingMethod::IgnoreValue;</div><div class="line"><a name="l01249"></a><span class="lineno"> 1249</span>&#160;    }</div><div class="line"><a name="l01250"></a><span class="lineno"> 1250</span>&#160;    AddPoolingLayer(node, desc);</div><div class="line"><a name="l01251"></a><span class="lineno"> 1251</span>&#160;}</div><div class="line"><a name="l01252"></a><span class="lineno"> 1252</span>&#160;</div><div class="line"><a name="l01253"></a><span class="lineno"> 1253</span>&#160;<span class="keywordtype">void</span> OnnxParserImpl::ParseBatchNormalization(<span class="keyword">const</span> onnx::NodeProto&amp; node)</div><div class="line"><a name="l01254"></a><span class="lineno"> 1254</span>&#160;{</div><div class="line"><a name="l01255"></a><span class="lineno"> 1255</span>&#160;    <span class="comment">//IGNORE momentum parameter and spatial parameters</span></div><div class="line"><a name="l01256"></a><span class="lineno"> 1256</span>&#160;</div><div class="line"><a name="l01257"></a><span class="lineno"> 1257</span>&#160;    <a class="code" href="_verification_helpers_8hpp.xhtml#a479b2821a7a2cbb8fa8eb7f60a47065d">CHECK_VALID_SIZE</a>(static_cast&lt;size_t&gt;(node.input_size()), 5);</div><div class="line"><a name="l01258"></a><span class="lineno"> 1258</span>&#160;    <a class="code" href="_verification_helpers_8hpp.xhtml#a479b2821a7a2cbb8fa8eb7f60a47065d">CHECK_VALID_SIZE</a>(static_cast&lt;size_t&gt;(node.output_size()), 1);</div><div class="line"><a name="l01259"></a><span class="lineno"> 1259</span>&#160;</div><div class="line"><a name="l01260"></a><span class="lineno"> 1260</span>&#160;    <a class="code" href="_onnx_parser_8cpp.xhtml#a0e987f9d4f46b35c9b1ff0cc950dc5b1">VALID_INPUTS</a>(node, <a class="code" href="_onnx_parser_8cpp.xhtml#a5426a7adb280d1739cc6d66fe9ac1b9c">STR_LIST</a>(onnx::TensorProto::FLOAT));</div><div class="line"><a name="l01261"></a><span class="lineno"> 1261</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ind = 1; ind &lt; node.input_size(); ++ind)</div><div class="line"><a name="l01262"></a><span class="lineno"> 1262</span>&#160;    {</div><div class="line"><a name="l01263"></a><span class="lineno"> 1263</span>&#160;        <span class="keyword">auto</span> tensor = node.input(ind);</div><div class="line"><a name="l01264"></a><span class="lineno"> 1264</span>&#160;        <span class="keywordflow">if</span>(! m_TensorsInfo[tensor].isConstant())</div><div class="line"><a name="l01265"></a><span class="lineno"> 1265</span>&#160;        {</div><div class="line"><a name="l01266"></a><span class="lineno"> 1266</span>&#160;            <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_parse_exception.xhtml">ParseException</a>(</div><div class="line"><a name="l01267"></a><span class="lineno"> 1267</span>&#160;                fmt::format(<span class="stringliteral">&quot;Input tensor &#39;{}&#39; should be constant in BatchNormalization node &#39;{}&#39; {}&quot;</span>,</div><div class="line"><a name="l01268"></a><span class="lineno"> 1268</span>&#160;                            tensor,</div><div class="line"><a name="l01269"></a><span class="lineno"> 1269</span>&#160;                            node.name(),</div><div class="line"><a name="l01270"></a><span class="lineno"> 1270</span>&#160;                            <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l01271"></a><span class="lineno"> 1271</span>&#160;        }</div><div class="line"><a name="l01272"></a><span class="lineno"> 1272</span>&#160;    }</div><div class="line"><a name="l01273"></a><span class="lineno"> 1273</span>&#160;</div><div class="line"><a name="l01274"></a><span class="lineno"> 1274</span>&#160;    <span class="keywordtype">float</span> epsilon = ReadOptionalNodeFloatAttribute(node, <span class="stringliteral">&quot;epsilon&quot;</span>, 1e-5f);</div><div class="line"><a name="l01275"></a><span class="lineno"> 1275</span>&#160;    <a class="code" href="structarmnn_1_1_batch_normalization_descriptor.xhtml">BatchNormalizationDescriptor</a> desc;</div><div class="line"><a name="l01276"></a><span class="lineno"> 1276</span>&#160;    desc.<a class="code" href="structarmnn_1_1_batch_normalization_descriptor.xhtml#a11c821c7524251004a72ed13c510853c">m_Eps</a> = epsilon;</div><div class="line"><a name="l01277"></a><span class="lineno"> 1277</span>&#160;</div><div class="line"><a name="l01278"></a><span class="lineno"> 1278</span>&#160;    <span class="keyword">auto</span> scaleTensor = CreateConstTensor(node.input(1));</div><div class="line"><a name="l01279"></a><span class="lineno"> 1279</span>&#160;    <span class="keyword">auto</span> biasTensor = CreateConstTensor(node.input(2));</div><div class="line"><a name="l01280"></a><span class="lineno"> 1280</span>&#160;    <span class="keyword">auto</span> meanTensor = CreateConstTensor(node.input(3));</div><div class="line"><a name="l01281"></a><span class="lineno"> 1281</span>&#160;    <span class="keyword">auto</span> varTensor = CreateConstTensor(node.input(4));</div><div class="line"><a name="l01282"></a><span class="lineno"> 1282</span>&#160;</div><div class="line"><a name="l01283"></a><span class="lineno"> 1283</span>&#160;    <a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml">IConnectableLayer</a>* layer = m_Network-&gt;AddBatchNormalizationLayer(desc,</div><div class="line"><a name="l01284"></a><span class="lineno"> 1284</span>&#160;                                                                     meanTensor.first,</div><div class="line"><a name="l01285"></a><span class="lineno"> 1285</span>&#160;                                                                     varTensor.first,</div><div class="line"><a name="l01286"></a><span class="lineno"> 1286</span>&#160;                                                                     biasTensor.first,</div><div class="line"><a name="l01287"></a><span class="lineno"> 1287</span>&#160;                                                                     scaleTensor.first,</div><div class="line"><a name="l01288"></a><span class="lineno"> 1288</span>&#160;                                                                     node.name().c_str());</div><div class="line"><a name="l01289"></a><span class="lineno"> 1289</span>&#160;    <a class="code" href="_assert_8hpp.xhtml#a5698be69cbd5dfe6c28fcd9867e8cbed">ARMNN_ASSERT</a>(layer != <span class="keyword">nullptr</span>);</div><div class="line"><a name="l01290"></a><span class="lineno"> 1290</span>&#160;</div><div class="line"><a name="l01291"></a><span class="lineno"> 1291</span>&#160;    <span class="keyword">auto</span> outputInfo = ComputeOutputInfo({node.output(0)}, layer, {m_TensorsInfo[node.input(0)].m_info-&gt;GetShape()});</div><div class="line"><a name="l01292"></a><span class="lineno"> 1292</span>&#160;    layer-&gt;GetOutputSlot(0).SetTensorInfo(outputInfo[0]);</div><div class="line"><a name="l01293"></a><span class="lineno"> 1293</span>&#160;</div><div class="line"><a name="l01294"></a><span class="lineno"> 1294</span>&#160;    RegisterInputSlots(layer, {node.input(0)}); <span class="comment">//don&#39;t register constant inputs</span></div><div class="line"><a name="l01295"></a><span class="lineno"> 1295</span>&#160;</div><div class="line"><a name="l01296"></a><span class="lineno"> 1296</span>&#160;    <span class="comment">// register the output connection</span></div><div class="line"><a name="l01297"></a><span class="lineno"> 1297</span>&#160;    RegisterOutputSlots(layer, {node.output(0)});</div><div class="line"><a name="l01298"></a><span class="lineno"> 1298</span>&#160;}</div><div class="line"><a name="l01299"></a><span class="lineno"> 1299</span>&#160;</div><div class="line"><a name="l01300"></a><span class="lineno"> 1300</span>&#160;<span class="keywordtype">void</span> OnnxParserImpl::ParseConstant(<span class="keyword">const</span> onnx::NodeProto&amp; node)</div><div class="line"><a name="l01301"></a><span class="lineno"> 1301</span>&#160;{</div><div class="line"><a name="l01302"></a><span class="lineno"> 1302</span>&#160;    <a class="code" href="_verification_helpers_8hpp.xhtml#a479b2821a7a2cbb8fa8eb7f60a47065d">CHECK_VALID_SIZE</a>(static_cast&lt;size_t&gt;(node.attribute_size()), 1);</div><div class="line"><a name="l01303"></a><span class="lineno"> 1303</span>&#160;    <span class="keywordflow">if</span> (!node.attribute(0).has_t())</div><div class="line"><a name="l01304"></a><span class="lineno"> 1304</span>&#160;    {</div><div class="line"><a name="l01305"></a><span class="lineno"> 1305</span>&#160;        <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_parse_exception.xhtml">ParseException</a>(fmt::format(<span class="stringliteral">&quot;Value not found for Constant node &#39;{}&#39; {}&quot;</span>,</div><div class="line"><a name="l01306"></a><span class="lineno"> 1306</span>&#160;                                         node.name(),</div><div class="line"><a name="l01307"></a><span class="lineno"> 1307</span>&#160;                                         <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l01308"></a><span class="lineno"> 1308</span>&#160;    }</div><div class="line"><a name="l01309"></a><span class="lineno"> 1309</span>&#160;    <span class="keyword">const</span> onnx::TensorProto&amp; onnxTensor = node.attribute(0).t();</div><div class="line"><a name="l01310"></a><span class="lineno"> 1310</span>&#160;</div><div class="line"><a name="l01311"></a><span class="lineno"> 1311</span>&#160;    <span class="comment">//ONNX can have Float16 and double constant nodes but ArmNN only supports float32</span></div><div class="line"><a name="l01312"></a><span class="lineno"> 1312</span>&#160;    <a class="code" href="_onnx_parser_8cpp.xhtml#a71cae957feb9162183d6f62fd549ffe1">CHECK_VALID_DATATYPE</a>(node.name(), onnxTensor.name(),</div><div class="line"><a name="l01313"></a><span class="lineno"> 1313</span>&#160;                         <span class="keyword">static_cast&lt;</span><a class="code" href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6">onnx::TensorProto::DataType</a><span class="keyword">&gt;</span>(onnxTensor.data_type()), onnx::TensorProto::FLOAT);</div><div class="line"><a name="l01314"></a><span class="lineno"> 1314</span>&#160;</div><div class="line"><a name="l01315"></a><span class="lineno"> 1315</span>&#160;    <span class="comment">//Register this as a m_ConstParam so we know we can use it as a constant param in future layers.</span></div><div class="line"><a name="l01316"></a><span class="lineno"> 1316</span>&#160;    m_TensorsInfo[node.output(0)].m_tensor = std::make_unique&lt;const onnx::TensorProto&gt;(onnxTensor);</div><div class="line"><a name="l01317"></a><span class="lineno"> 1317</span>&#160;    m_TensorsInfo[node.output(0)].m_info = std::make_unique&lt;TensorInfo&gt;(<a class="code" href="namespacearmnn_deserializer.xhtml#a948b8c615ff06defa3b80d2352259ff2">ToTensorInfo</a>(onnxTensor));</div><div class="line"><a name="l01318"></a><span class="lineno"> 1318</span>&#160;    m_TensorsInfo[node.output(0)].m_dtype = <span class="keyword">static_cast&lt;</span><a class="code" href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6">onnx::TensorProto::DataType</a><span class="keyword">&gt;</span>(onnxTensor.data_type());</div><div class="line"><a name="l01319"></a><span class="lineno"> 1319</span>&#160;</div><div class="line"><a name="l01320"></a><span class="lineno"> 1320</span>&#160;    CreateConstantLayer(node.output(0), node.name());</div><div class="line"><a name="l01321"></a><span class="lineno"> 1321</span>&#160;}</div><div class="line"><a name="l01322"></a><span class="lineno"> 1322</span>&#160;</div><div class="line"><a name="l01323"></a><span class="lineno"> 1323</span>&#160;<span class="keywordtype">void</span> OnnxParserImpl::ParseConv(<span class="keyword">const</span> onnx::NodeProto&amp; node)</div><div class="line"><a name="l01324"></a><span class="lineno"> 1324</span>&#160;{</div><div class="line"><a name="l01325"></a><span class="lineno"> 1325</span>&#160;    <a class="code" href="_verification_helpers_8hpp.xhtml#a479b2821a7a2cbb8fa8eb7f60a47065d">CHECK_VALID_SIZE</a>(static_cast&lt;size_t&gt;(node.input_size()), 2, 3); <span class="comment">//input, weight, (bias)</span></div><div class="line"><a name="l01326"></a><span class="lineno"> 1326</span>&#160;    <a class="code" href="_verification_helpers_8hpp.xhtml#a479b2821a7a2cbb8fa8eb7f60a47065d">CHECK_VALID_SIZE</a>(static_cast&lt;size_t&gt;(node.output_size()), 1);</div><div class="line"><a name="l01327"></a><span class="lineno"> 1327</span>&#160;</div><div class="line"><a name="l01328"></a><span class="lineno"> 1328</span>&#160;    <a class="code" href="_onnx_parser_8cpp.xhtml#a0e987f9d4f46b35c9b1ff0cc950dc5b1">VALID_INPUTS</a>(node, <a class="code" href="_onnx_parser_8cpp.xhtml#a5426a7adb280d1739cc6d66fe9ac1b9c">STR_LIST</a>(onnx::TensorProto::FLOAT));</div><div class="line"><a name="l01329"></a><span class="lineno"> 1329</span>&#160;</div><div class="line"><a name="l01330"></a><span class="lineno"> 1330</span>&#160;    <span class="keywordflow">if</span>(m_TensorsInfo[node.input(0)].m_info-&gt;GetNumDimensions() != 4)</div><div class="line"><a name="l01331"></a><span class="lineno"> 1331</span>&#160;    {</div><div class="line"><a name="l01332"></a><span class="lineno"> 1332</span>&#160;        <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_parse_exception.xhtml">ParseException</a>(</div><div class="line"><a name="l01333"></a><span class="lineno"> 1333</span>&#160;            fmt::format(<span class="stringliteral">&quot;ArmNN only supports 2D convolution and Conv layer &#39;{}&#39; input {} {}&quot;</span>,</div><div class="line"><a name="l01334"></a><span class="lineno"> 1334</span>&#160;                        node.name(),</div><div class="line"><a name="l01335"></a><span class="lineno"> 1335</span>&#160;                        TensorInfoAsString(*m_TensorsInfo[node.input(0)].m_info, node.input(0),</div><div class="line"><a name="l01336"></a><span class="lineno"> 1336</span>&#160;                                           m_TensorsInfo[node.input(0)].m_dtype),</div><div class="line"><a name="l01337"></a><span class="lineno"> 1337</span>&#160;                        <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l01338"></a><span class="lineno"> 1338</span>&#160;    }</div><div class="line"><a name="l01339"></a><span class="lineno"> 1339</span>&#160;</div><div class="line"><a name="l01340"></a><span class="lineno"> 1340</span>&#160;    <span class="keywordflow">if</span>(!m_TensorsInfo[node.input(1)].isConstant())</div><div class="line"><a name="l01341"></a><span class="lineno"> 1341</span>&#160;    {</div><div class="line"><a name="l01342"></a><span class="lineno"> 1342</span>&#160;        <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_parse_exception.xhtml">ParseException</a>(</div><div class="line"><a name="l01343"></a><span class="lineno"> 1343</span>&#160;            fmt::format(<span class="stringliteral">&quot;Weights &#39;{}&#39; should be constant in Conv layer &#39;{}&#39; {}&quot;</span>,</div><div class="line"><a name="l01344"></a><span class="lineno"> 1344</span>&#160;                        node.input(1),</div><div class="line"><a name="l01345"></a><span class="lineno"> 1345</span>&#160;                        node.name(),</div><div class="line"><a name="l01346"></a><span class="lineno"> 1346</span>&#160;                        <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l01347"></a><span class="lineno"> 1347</span>&#160;    }</div><div class="line"><a name="l01348"></a><span class="lineno"> 1348</span>&#160;</div><div class="line"><a name="l01349"></a><span class="lineno"> 1349</span>&#160;    <span class="keyword">auto</span> inputInfo = *m_TensorsInfo[node.input(0)].m_info;</div><div class="line"><a name="l01350"></a><span class="lineno"> 1350</span>&#160;</div><div class="line"><a name="l01351"></a><span class="lineno"> 1351</span>&#160;    <a class="code" href="structarmnn_1_1_convolution2d_descriptor.xhtml">Convolution2dDescriptor</a> desc;</div><div class="line"><a name="l01352"></a><span class="lineno"> 1352</span>&#160;    desc.<a class="code" href="structarmnn_1_1_convolution2d_descriptor.xhtml#aea202e14d8874cefd9a0f778022b7e25">m_BiasEnabled</a> = <span class="keyword">false</span>;</div><div class="line"><a name="l01353"></a><span class="lineno"> 1353</span>&#160;</div><div class="line"><a name="l01354"></a><span class="lineno"> 1354</span>&#160;    std::vector&lt;uint32_t&gt; strides = ReadOptionalNodeUint32ListAttribute(node, <span class="stringliteral">&quot;strides&quot;</span>);</div><div class="line"><a name="l01355"></a><span class="lineno"> 1355</span>&#160;    <span class="keywordflow">if</span>(strides.empty())</div><div class="line"><a name="l01356"></a><span class="lineno"> 1356</span>&#160;    {</div><div class="line"><a name="l01357"></a><span class="lineno"> 1357</span>&#160;        desc.<a class="code" href="structarmnn_1_1_convolution2d_descriptor.xhtml#afe6a3377c4531315354def9023c8fdda">m_StrideX</a>    = 1;</div><div class="line"><a name="l01358"></a><span class="lineno"> 1358</span>&#160;        desc.<a class="code" href="structarmnn_1_1_convolution2d_descriptor.xhtml#ac1fe174bbadfb39a2b636940c2e647c8">m_StrideY</a>    = 1;</div><div class="line"><a name="l01359"></a><span class="lineno"> 1359</span>&#160;    }</div><div class="line"><a name="l01360"></a><span class="lineno"> 1360</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l01361"></a><span class="lineno"> 1361</span>&#160;    {</div><div class="line"><a name="l01362"></a><span class="lineno"> 1362</span>&#160;        desc.<a class="code" href="structarmnn_1_1_convolution2d_descriptor.xhtml#afe6a3377c4531315354def9023c8fdda">m_StrideX</a>    = strides[1];</div><div class="line"><a name="l01363"></a><span class="lineno"> 1363</span>&#160;        desc.<a class="code" href="structarmnn_1_1_convolution2d_descriptor.xhtml#ac1fe174bbadfb39a2b636940c2e647c8">m_StrideY</a>    = strides[0];</div><div class="line"><a name="l01364"></a><span class="lineno"> 1364</span>&#160;    }</div><div class="line"><a name="l01365"></a><span class="lineno"> 1365</span>&#160;</div><div class="line"><a name="l01366"></a><span class="lineno"> 1366</span>&#160;    std::vector&lt;uint32_t&gt; dilations = ReadOptionalNodeUint32ListAttribute(node, <span class="stringliteral">&quot;dilations&quot;</span>);</div><div class="line"><a name="l01367"></a><span class="lineno"> 1367</span>&#160;    <span class="keywordflow">if</span>(!dilations.empty())</div><div class="line"><a name="l01368"></a><span class="lineno"> 1368</span>&#160;    {</div><div class="line"><a name="l01369"></a><span class="lineno"> 1369</span>&#160;        desc.<a class="code" href="structarmnn_1_1_convolution2d_descriptor.xhtml#aa3c6a77a963a98ccb8ea7b8fd008a8c1">m_DilationX</a> = dilations[1];</div><div class="line"><a name="l01370"></a><span class="lineno"> 1370</span>&#160;        desc.<a class="code" href="structarmnn_1_1_convolution2d_descriptor.xhtml#a302b688d88dd73cde0fb1faef6679907">m_DilationY</a> = dilations[0];</div><div class="line"><a name="l01371"></a><span class="lineno"> 1371</span>&#160;    }</div><div class="line"><a name="l01372"></a><span class="lineno"> 1372</span>&#160;</div><div class="line"><a name="l01373"></a><span class="lineno"> 1373</span>&#160;    std::vector&lt;uint32_t&gt; pads = ReadOptionalNodeUint32ListAttribute(node, <span class="stringliteral">&quot;pads&quot;</span>);</div><div class="line"><a name="l01374"></a><span class="lineno"> 1374</span>&#160;    <span class="comment">//Check new padding version first</span></div><div class="line"><a name="l01375"></a><span class="lineno"> 1375</span>&#160;    <span class="keywordflow">if</span>(pads.empty())</div><div class="line"><a name="l01376"></a><span class="lineno"> 1376</span>&#160;    {</div><div class="line"><a name="l01377"></a><span class="lineno"> 1377</span>&#160;        <span class="comment">//Check deprecated version</span></div><div class="line"><a name="l01378"></a><span class="lineno"> 1378</span>&#160;        std::string paddingString = ReadOptionalNodeStringAttribute(node, <span class="stringliteral">&quot;auto_pad&quot;</span>);</div><div class="line"><a name="l01379"></a><span class="lineno"> 1379</span>&#160;        <span class="keywordflow">if</span>(paddingString != <span class="stringliteral">&quot;VALID&quot;</span> &amp;&amp; paddingString != <span class="stringliteral">&quot;&quot;</span> &amp;&amp; paddingString != <span class="stringliteral">&quot;NOTSET&quot;</span>)</div><div class="line"><a name="l01380"></a><span class="lineno"> 1380</span>&#160;        {</div><div class="line"><a name="l01381"></a><span class="lineno"> 1381</span>&#160;            <span class="keywordtype">bool</span> isUpper;</div><div class="line"><a name="l01382"></a><span class="lineno"> 1382</span>&#160;            <span class="keywordflow">if</span>( paddingString == <span class="stringliteral">&quot;SAME_LOWER&quot;</span>)</div><div class="line"><a name="l01383"></a><span class="lineno"> 1383</span>&#160;            {</div><div class="line"><a name="l01384"></a><span class="lineno"> 1384</span>&#160;                isUpper = <span class="keyword">false</span>;</div><div class="line"><a name="l01385"></a><span class="lineno"> 1385</span>&#160;            }</div><div class="line"><a name="l01386"></a><span class="lineno"> 1386</span>&#160;            <span class="keywordflow">else</span> <span class="keywordflow">if</span> (paddingString == <span class="stringliteral">&quot;SAME_UPPER&quot;</span>)</div><div class="line"><a name="l01387"></a><span class="lineno"> 1387</span>&#160;            {</div><div class="line"><a name="l01388"></a><span class="lineno"> 1388</span>&#160;                isUpper = <span class="keyword">true</span>;</div><div class="line"><a name="l01389"></a><span class="lineno"> 1389</span>&#160;            }</div><div class="line"><a name="l01390"></a><span class="lineno"> 1390</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l01391"></a><span class="lineno"> 1391</span>&#160;            {</div><div class="line"><a name="l01392"></a><span class="lineno"> 1392</span>&#160;                <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_parse_exception.xhtml">ParseException</a>(</div><div class="line"><a name="l01393"></a><span class="lineno"> 1393</span>&#160;                    fmt::format(<span class="stringliteral">&quot;Invalid auto_pad attribute for node {}. Only SAME_UPPER, SAME_LOWER or VALID &quot;</span></div><div class="line"><a name="l01394"></a><span class="lineno"> 1394</span>&#160;                                <span class="stringliteral">&quot;supported and found {} {}&quot;</span>,</div><div class="line"><a name="l01395"></a><span class="lineno"> 1395</span>&#160;                                node.name(),</div><div class="line"><a name="l01396"></a><span class="lineno"> 1396</span>&#160;                                paddingString,</div><div class="line"><a name="l01397"></a><span class="lineno"> 1397</span>&#160;                                <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l01398"></a><span class="lineno"> 1398</span>&#160;            }</div><div class="line"><a name="l01399"></a><span class="lineno"> 1399</span>&#160;            uint32_t inputHeight = inputInfo.GetShape()[2];</div><div class="line"><a name="l01400"></a><span class="lineno"> 1400</span>&#160;            uint32_t inputWidth  = inputInfo.GetShape()[3];</div><div class="line"><a name="l01401"></a><span class="lineno"> 1401</span>&#160;</div><div class="line"><a name="l01402"></a><span class="lineno"> 1402</span>&#160;            uint32_t weightHeight;</div><div class="line"><a name="l01403"></a><span class="lineno"> 1403</span>&#160;            uint32_t weightWidth;</div><div class="line"><a name="l01404"></a><span class="lineno"> 1404</span>&#160;            std::vector&lt;uint32_t&gt; kernel_shape = ReadOptionalNodeUint32ListAttribute(node, <span class="stringliteral">&quot;kernel_shape&quot;</span>);</div><div class="line"><a name="l01405"></a><span class="lineno"> 1405</span>&#160;            <span class="keywordflow">if</span> (kernel_shape.empty())</div><div class="line"><a name="l01406"></a><span class="lineno"> 1406</span>&#160;            {</div><div class="line"><a name="l01407"></a><span class="lineno"> 1407</span>&#160;                <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> weightTensorInfo = *m_TensorsInfo[node.input(1)].m_info;</div><div class="line"><a name="l01408"></a><span class="lineno"> 1408</span>&#160;                weightHeight = weightTensorInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a8b5d0f8a24e9d9238f412260a552acf8">GetShape</a>()[2];</div><div class="line"><a name="l01409"></a><span class="lineno"> 1409</span>&#160;                weightWidth = weightTensorInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a8b5d0f8a24e9d9238f412260a552acf8">GetShape</a>()[3];</div><div class="line"><a name="l01410"></a><span class="lineno"> 1410</span>&#160;            }</div><div class="line"><a name="l01411"></a><span class="lineno"> 1411</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l01412"></a><span class="lineno"> 1412</span>&#160;            {</div><div class="line"><a name="l01413"></a><span class="lineno"> 1413</span>&#160;                weightHeight = kernel_shape[0];</div><div class="line"><a name="l01414"></a><span class="lineno"> 1414</span>&#160;                weightWidth = kernel_shape[1];</div><div class="line"><a name="l01415"></a><span class="lineno"> 1415</span>&#160;            }</div><div class="line"><a name="l01416"></a><span class="lineno"> 1416</span>&#160;            <a class="code" href="namespacearmnn_tf_parser.xhtml#aca0a31de02d5c087029bb28c9202b4d6">CalcPadding</a>(inputHeight,</div><div class="line"><a name="l01417"></a><span class="lineno"> 1417</span>&#160;                        weightHeight,</div><div class="line"><a name="l01418"></a><span class="lineno"> 1418</span>&#160;                        desc.<a class="code" href="structarmnn_1_1_convolution2d_descriptor.xhtml#ac1fe174bbadfb39a2b636940c2e647c8">m_StrideY</a>,</div><div class="line"><a name="l01419"></a><span class="lineno"> 1419</span>&#160;                        desc.<a class="code" href="structarmnn_1_1_convolution2d_descriptor.xhtml#a302b688d88dd73cde0fb1faef6679907">m_DilationY</a>,</div><div class="line"><a name="l01420"></a><span class="lineno"> 1420</span>&#160;                        &amp;desc.<a class="code" href="structarmnn_1_1_convolution2d_descriptor.xhtml#a56b51f56cef50cdfa554258eecdab046">m_PadTop</a>,</div><div class="line"><a name="l01421"></a><span class="lineno"> 1421</span>&#160;                        &amp;desc.<a class="code" href="structarmnn_1_1_convolution2d_descriptor.xhtml#aa9e49717ebdb741e8c767741647fc618">m_PadBottom</a>,</div><div class="line"><a name="l01422"></a><span class="lineno"> 1422</span>&#160;                        isUpper);</div><div class="line"><a name="l01423"></a><span class="lineno"> 1423</span>&#160;            <a class="code" href="namespacearmnn_tf_parser.xhtml#aca0a31de02d5c087029bb28c9202b4d6">CalcPadding</a>(inputWidth,</div><div class="line"><a name="l01424"></a><span class="lineno"> 1424</span>&#160;                        weightWidth,</div><div class="line"><a name="l01425"></a><span class="lineno"> 1425</span>&#160;                        desc.<a class="code" href="structarmnn_1_1_convolution2d_descriptor.xhtml#afe6a3377c4531315354def9023c8fdda">m_StrideX</a>,</div><div class="line"><a name="l01426"></a><span class="lineno"> 1426</span>&#160;                        desc.<a class="code" href="structarmnn_1_1_convolution2d_descriptor.xhtml#aa3c6a77a963a98ccb8ea7b8fd008a8c1">m_DilationX</a>,</div><div class="line"><a name="l01427"></a><span class="lineno"> 1427</span>&#160;                        &amp;desc.<a class="code" href="structarmnn_1_1_convolution2d_descriptor.xhtml#ac18546ebbebbb32fe0a03baa9bf2c600">m_PadLeft</a>,</div><div class="line"><a name="l01428"></a><span class="lineno"> 1428</span>&#160;                        &amp;desc.<a class="code" href="structarmnn_1_1_convolution2d_descriptor.xhtml#a002bc30e590d78cbb4f4d12171055ca7">m_PadRight</a>,</div><div class="line"><a name="l01429"></a><span class="lineno"> 1429</span>&#160;                        isUpper);</div><div class="line"><a name="l01430"></a><span class="lineno"> 1430</span>&#160;        }</div><div class="line"><a name="l01431"></a><span class="lineno"> 1431</span>&#160;    }</div><div class="line"><a name="l01432"></a><span class="lineno"> 1432</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l01433"></a><span class="lineno"> 1433</span>&#160;    {</div><div class="line"><a name="l01434"></a><span class="lineno"> 1434</span>&#160;        desc.<a class="code" href="structarmnn_1_1_convolution2d_descriptor.xhtml#a56b51f56cef50cdfa554258eecdab046">m_PadTop</a>     = pads[0];</div><div class="line"><a name="l01435"></a><span class="lineno"> 1435</span>&#160;        desc.<a class="code" href="structarmnn_1_1_convolution2d_descriptor.xhtml#ac18546ebbebbb32fe0a03baa9bf2c600">m_PadLeft</a>    = pads[1];</div><div class="line"><a name="l01436"></a><span class="lineno"> 1436</span>&#160;        desc.<a class="code" href="structarmnn_1_1_convolution2d_descriptor.xhtml#aa9e49717ebdb741e8c767741647fc618">m_PadBottom</a>  = pads[2];</div><div class="line"><a name="l01437"></a><span class="lineno"> 1437</span>&#160;        desc.<a class="code" href="structarmnn_1_1_convolution2d_descriptor.xhtml#a002bc30e590d78cbb4f4d12171055ca7">m_PadRight</a>   = pads[3];</div><div class="line"><a name="l01438"></a><span class="lineno"> 1438</span>&#160;    }</div><div class="line"><a name="l01439"></a><span class="lineno"> 1439</span>&#160;</div><div class="line"><a name="l01440"></a><span class="lineno"> 1440</span>&#160;    uint32_t group = ReadOptionalNodeUint32Attribute(node, <span class="stringliteral">&quot;group&quot;</span>, 1);</div><div class="line"><a name="l01441"></a><span class="lineno"> 1441</span>&#160;    <span class="keywordflow">if</span>(group &gt; 1)</div><div class="line"><a name="l01442"></a><span class="lineno"> 1442</span>&#160;    {</div><div class="line"><a name="l01443"></a><span class="lineno"> 1443</span>&#160;        <span class="keywordflow">if</span> (group &gt; inputInfo.GetShape()[1])</div><div class="line"><a name="l01444"></a><span class="lineno"> 1444</span>&#160;        {</div><div class="line"><a name="l01445"></a><span class="lineno"> 1445</span>&#160;            <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_parse_exception.xhtml">ParseException</a>(</div><div class="line"><a name="l01446"></a><span class="lineno"> 1446</span>&#160;                fmt::format(<span class="stringliteral">&quot;Error parsing Convolution node: {}. &quot;</span></div><div class="line"><a name="l01447"></a><span class="lineno"> 1447</span>&#160;                            <span class="stringliteral">&quot;The &#39;group&#39;={} parameter cannot be larger than the &quot;</span></div><div class="line"><a name="l01448"></a><span class="lineno"> 1448</span>&#160;                            <span class="stringliteral">&quot;channel of the input shape={} (in NCHW format). {}&quot;</span>,</div><div class="line"><a name="l01449"></a><span class="lineno"> 1449</span>&#160;                            node.name(),</div><div class="line"><a name="l01450"></a><span class="lineno"> 1450</span>&#160;                            group,</div><div class="line"><a name="l01451"></a><span class="lineno"> 1451</span>&#160;                            inputInfo.GetShape()[1],</div><div class="line"><a name="l01452"></a><span class="lineno"> 1452</span>&#160;                            <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l01453"></a><span class="lineno"> 1453</span>&#160;        }</div><div class="line"><a name="l01454"></a><span class="lineno"> 1454</span>&#160;        <span class="keywordflow">else</span> <span class="keywordflow">if</span> (group == inputInfo.GetShape()[1])</div><div class="line"><a name="l01455"></a><span class="lineno"> 1455</span>&#160;        {</div><div class="line"><a name="l01456"></a><span class="lineno"> 1456</span>&#160;            <span class="comment">// we use a depthwise convolution here, because the number of groups equals to the</span></div><div class="line"><a name="l01457"></a><span class="lineno"> 1457</span>&#160;            <span class="comment">// input channels</span></div><div class="line"><a name="l01458"></a><span class="lineno"> 1458</span>&#160;            AddConvLayerWithDepthwiseConv(node, desc);</div><div class="line"><a name="l01459"></a><span class="lineno"> 1459</span>&#160;            <span class="keywordflow">return</span>;</div><div class="line"><a name="l01460"></a><span class="lineno"> 1460</span>&#160;        }</div><div class="line"><a name="l01461"></a><span class="lineno"> 1461</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l01462"></a><span class="lineno"> 1462</span>&#160;        {</div><div class="line"><a name="l01463"></a><span class="lineno"> 1463</span>&#160;            <span class="comment">// TODO: split the input by channels into channels/groups separate convolutions</span></div><div class="line"><a name="l01464"></a><span class="lineno"> 1464</span>&#160;            <span class="comment">//  and concatenate the results afterwards</span></div><div class="line"><a name="l01465"></a><span class="lineno"> 1465</span>&#160;            <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_parse_exception.xhtml">ParseException</a>(fmt::format(<span class="stringliteral">&quot;Error parsing Convolution node: {}. &quot;</span></div><div class="line"><a name="l01466"></a><span class="lineno"> 1466</span>&#160;                                             <span class="stringliteral">&quot;The &#39;group&#39;={} parameter should be 1 or be equal to the &quot;</span></div><div class="line"><a name="l01467"></a><span class="lineno"> 1467</span>&#160;                                             <span class="stringliteral">&quot;channel of the input shape={} (in NCHW format). {}&quot;</span>,</div><div class="line"><a name="l01468"></a><span class="lineno"> 1468</span>&#160;                                             node.name(),</div><div class="line"><a name="l01469"></a><span class="lineno"> 1469</span>&#160;                                             group,</div><div class="line"><a name="l01470"></a><span class="lineno"> 1470</span>&#160;                                             inputInfo.GetShape()[1],</div><div class="line"><a name="l01471"></a><span class="lineno"> 1471</span>&#160;                                             <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l01472"></a><span class="lineno"> 1472</span>&#160;        }</div><div class="line"><a name="l01473"></a><span class="lineno"> 1473</span>&#160;    }</div><div class="line"><a name="l01474"></a><span class="lineno"> 1474</span>&#160;</div><div class="line"><a name="l01475"></a><span class="lineno"> 1475</span>&#160;    <a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml">armnn::IConnectableLayer</a>* layer;</div><div class="line"><a name="l01476"></a><span class="lineno"> 1476</span>&#160;    <span class="keyword">auto</span> weightTensor = CreateConstTensor(node.input(1));</div><div class="line"><a name="l01477"></a><span class="lineno"> 1477</span>&#160;</div><div class="line"><a name="l01478"></a><span class="lineno"> 1478</span>&#160;    <span class="keywordflow">if</span> (node.input_size() == 3)</div><div class="line"><a name="l01479"></a><span class="lineno"> 1479</span>&#160;    {</div><div class="line"><a name="l01480"></a><span class="lineno"> 1480</span>&#160;        <span class="keywordflow">if</span>(!m_TensorsInfo[node.input(2)].isConstant())</div><div class="line"><a name="l01481"></a><span class="lineno"> 1481</span>&#160;        {</div><div class="line"><a name="l01482"></a><span class="lineno"> 1482</span>&#160;            <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_parse_exception.xhtml">ParseException</a>(fmt::format(<span class="stringliteral">&quot;Bias &#39;{}&#39; should be constant in Conv layer &#39;{}&#39; {}&quot;</span>,</div><div class="line"><a name="l01483"></a><span class="lineno"> 1483</span>&#160;                                             node.input(2),</div><div class="line"><a name="l01484"></a><span class="lineno"> 1484</span>&#160;                                             node.name(),</div><div class="line"><a name="l01485"></a><span class="lineno"> 1485</span>&#160;                                             <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l01486"></a><span class="lineno"> 1486</span>&#160;        }</div><div class="line"><a name="l01487"></a><span class="lineno"> 1487</span>&#160;        desc.<a class="code" href="structarmnn_1_1_convolution2d_descriptor.xhtml#aea202e14d8874cefd9a0f778022b7e25">m_BiasEnabled</a> = <span class="keyword">true</span>;</div><div class="line"><a name="l01488"></a><span class="lineno"> 1488</span>&#160;        <span class="keyword">auto</span> biasTensor = CreateConstTensor(node.input(2));</div><div class="line"><a name="l01489"></a><span class="lineno"> 1489</span>&#160;        layer = m_Network-&gt;AddConvolution2dLayer(desc,</div><div class="line"><a name="l01490"></a><span class="lineno"> 1490</span>&#160;                                                 weightTensor.first,</div><div class="line"><a name="l01491"></a><span class="lineno"> 1491</span>&#160;                                                 <a class="code" href="classarmnn_1_1_optional.xhtml">Optional&lt;ConstTensor&gt;</a>(biasTensor.first),</div><div class="line"><a name="l01492"></a><span class="lineno"> 1492</span>&#160;                                                 node.name().c_str());</div><div class="line"><a name="l01493"></a><span class="lineno"> 1493</span>&#160;    }</div><div class="line"><a name="l01494"></a><span class="lineno"> 1494</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l01495"></a><span class="lineno"> 1495</span>&#160;    {</div><div class="line"><a name="l01496"></a><span class="lineno"> 1496</span>&#160;        layer = m_Network-&gt;AddConvolution2dLayer(desc,</div><div class="line"><a name="l01497"></a><span class="lineno"> 1497</span>&#160;                                                 weightTensor.first,</div><div class="line"><a name="l01498"></a><span class="lineno"> 1498</span>&#160;                                                 <a class="code" href="structarmnn_1_1_empty_optional.xhtml">EmptyOptional</a>(),</div><div class="line"><a name="l01499"></a><span class="lineno"> 1499</span>&#160;                                                 node.name().c_str());</div><div class="line"><a name="l01500"></a><span class="lineno"> 1500</span>&#160;    }</div><div class="line"><a name="l01501"></a><span class="lineno"> 1501</span>&#160;    <a class="code" href="_assert_8hpp.xhtml#a5698be69cbd5dfe6c28fcd9867e8cbed">ARMNN_ASSERT</a>(layer != <span class="keyword">nullptr</span>);</div><div class="line"><a name="l01502"></a><span class="lineno"> 1502</span>&#160;</div><div class="line"><a name="l01503"></a><span class="lineno"> 1503</span>&#160;    <span class="keyword">auto</span> outputInfo = ComputeOutputInfo({ node.output(0) }, layer,</div><div class="line"><a name="l01504"></a><span class="lineno"> 1504</span>&#160;                                        { m_TensorsInfo[node.input(0)].m_info-&gt;GetShape(),</div><div class="line"><a name="l01505"></a><span class="lineno"> 1505</span>&#160;                                          m_TensorsInfo[node.input(1)].m_info-&gt;GetShape() });</div><div class="line"><a name="l01506"></a><span class="lineno"> 1506</span>&#160;    layer-&gt;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml#a80ac4eda2e7f2757ec9dd96fc96dbd16">GetOutputSlot</a>(0).<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#a5ee4a6c9a2481245487b1b1a70d20fd0">SetTensorInfo</a>(outputInfo[0]);</div><div class="line"><a name="l01507"></a><span class="lineno"> 1507</span>&#160;</div><div class="line"><a name="l01508"></a><span class="lineno"> 1508</span>&#160;    <span class="comment">// register the input connection slots for the layer, connections are made after all layers have been created</span></div><div class="line"><a name="l01509"></a><span class="lineno"> 1509</span>&#160;    <span class="comment">// only the tensors for the inputs are relevant, exclude the const tensors</span></div><div class="line"><a name="l01510"></a><span class="lineno"> 1510</span>&#160;    RegisterInputSlots(layer, {node.input(0)});</div><div class="line"><a name="l01511"></a><span class="lineno"> 1511</span>&#160;</div><div class="line"><a name="l01512"></a><span class="lineno"> 1512</span>&#160;    <span class="comment">// register the output connection slots for the layer, connections are made after all layers have been created</span></div><div class="line"><a name="l01513"></a><span class="lineno"> 1513</span>&#160;    RegisterOutputSlots(layer, {node.output(0)});</div><div class="line"><a name="l01514"></a><span class="lineno"> 1514</span>&#160;}</div><div class="line"><a name="l01515"></a><span class="lineno"> 1515</span>&#160;</div><div class="line"><a name="l01516"></a><span class="lineno"> 1516</span>&#160;<span class="keywordtype">void</span> OnnxParserImpl::ParseFlatten(<span class="keyword">const</span> onnx::NodeProto&amp; node)</div><div class="line"><a name="l01517"></a><span class="lineno"> 1517</span>&#160;{</div><div class="line"><a name="l01518"></a><span class="lineno"> 1518</span>&#160;    <a class="code" href="_verification_helpers_8hpp.xhtml#a479b2821a7a2cbb8fa8eb7f60a47065d">CHECK_VALID_SIZE</a>(static_cast&lt;size_t&gt;(node.input_size()), 1);</div><div class="line"><a name="l01519"></a><span class="lineno"> 1519</span>&#160;    <a class="code" href="_verification_helpers_8hpp.xhtml#a479b2821a7a2cbb8fa8eb7f60a47065d">CHECK_VALID_SIZE</a>(static_cast&lt;size_t&gt;(node.output_size()), 1);</div><div class="line"><a name="l01520"></a><span class="lineno"> 1520</span>&#160;</div><div class="line"><a name="l01521"></a><span class="lineno"> 1521</span>&#160;    <a class="code" href="_onnx_parser_8cpp.xhtml#a71cae957feb9162183d6f62fd549ffe1">CHECK_VALID_DATATYPE</a>(node.name(), node.input(0),</div><div class="line"><a name="l01522"></a><span class="lineno"> 1522</span>&#160;                         m_TensorsInfo[node.input(0)].m_dtype,</div><div class="line"><a name="l01523"></a><span class="lineno"> 1523</span>&#160;                         onnx::TensorProto::FLOAT);</div><div class="line"><a name="l01524"></a><span class="lineno"> 1524</span>&#160;</div><div class="line"><a name="l01525"></a><span class="lineno"> 1525</span>&#160;    int64_t axis = ReadOptionalNodeInt64Attribute(node, <span class="stringliteral">&quot;axis&quot;</span>, 1);</div><div class="line"><a name="l01526"></a><span class="lineno"> 1526</span>&#160;    <a class="code" href="classarmnn_1_1_tensor_shape.xhtml">TensorShape</a> inputShape = m_TensorsInfo[node.input(0)].m_info-&gt;GetShape();</div><div class="line"><a name="l01527"></a><span class="lineno"> 1527</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01528"></a><span class="lineno"> 1528</span>&#160;<span class="comment">    /// Negative axis conversion</span></div><div class="line"><a name="l01529"></a><span class="lineno"> 1529</span>&#160;<span class="comment"></span>    <span class="keywordflow">if</span> (axis &lt; 0)</div><div class="line"><a name="l01530"></a><span class="lineno"> 1530</span>&#160;    {</div><div class="line"><a name="l01531"></a><span class="lineno"> 1531</span>&#160;        axis += inputShape.<a class="code" href="classarmnn_1_1_tensor_shape.xhtml#a157e27d41e9f6b21f0d3c025fa47dc24">GetNumDimensions</a>();</div><div class="line"><a name="l01532"></a><span class="lineno"> 1532</span>&#160;    }</div><div class="line"><a name="l01533"></a><span class="lineno"> 1533</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01534"></a><span class="lineno"> 1534</span>&#160;<span class="comment">    /// Check Axis is within dimensions</span></div><div class="line"><a name="l01535"></a><span class="lineno"> 1535</span>&#160;<span class="comment"></span>    <span class="keywordflow">if</span> (axis &lt; 0 || axis &gt;= inputShape.<a class="code" href="classarmnn_1_1_tensor_shape.xhtml#a157e27d41e9f6b21f0d3c025fa47dc24">GetNumDimensions</a>())</div><div class="line"><a name="l01536"></a><span class="lineno"> 1536</span>&#160;    {</div><div class="line"><a name="l01537"></a><span class="lineno"> 1537</span>&#160;        <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_parse_exception.xhtml">ParseException</a>(fmt::format(<span class="stringliteral">&quot;Axis &#39;{}&#39; invalid. Tensor has &#39;{}&#39; dimensions in FlattenLayer &#39;{}&#39;&quot;</span>,</div><div class="line"><a name="l01538"></a><span class="lineno"> 1538</span>&#160;                                         axis, inputShape.<a class="code" href="classarmnn_1_1_tensor_shape.xhtml#a157e27d41e9f6b21f0d3c025fa47dc24">GetNumDimensions</a>(), node.name()));</div><div class="line"><a name="l01539"></a><span class="lineno"> 1539</span>&#160;    }</div><div class="line"><a name="l01540"></a><span class="lineno"> 1540</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01541"></a><span class="lineno"> 1541</span>&#160;<span class="comment">    /// If axis chosen is 0 dimension1 will always be 1 in output , default dimension2 to 1 because 0 is invalid</span></div><div class="line"><a name="l01542"></a><span class="lineno"> 1542</span>&#160;<span class="comment"></span>    uint dimension1{1};</div><div class="line"><a name="l01543"></a><span class="lineno"> 1543</span>&#160;    uint dimension2{1};</div><div class="line"><a name="l01544"></a><span class="lineno"> 1544</span>&#160;    uint i{0};</div><div class="line"><a name="l01545"></a><span class="lineno"> 1545</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01546"></a><span class="lineno"> 1546</span>&#160;<span class="comment">    /// dimension1 = (d_0 * d_1 ... d_(axis-1))</span></div><div class="line"><a name="l01547"></a><span class="lineno"> 1547</span>&#160;<span class="comment"></span>    <span class="keywordflow">for</span> (i = 0; i &lt; axis; i++){</div><div class="line"><a name="l01548"></a><span class="lineno"> 1548</span>&#160;        dimension1 *= inputShape[i];</div><div class="line"><a name="l01549"></a><span class="lineno"> 1549</span>&#160;    }</div><div class="line"><a name="l01550"></a><span class="lineno"> 1550</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01551"></a><span class="lineno"> 1551</span>&#160;<span class="comment">    /// dimension2 = (d_axis * d_(axis+1) ... d_n)</span></div><div class="line"><a name="l01552"></a><span class="lineno"> 1552</span>&#160;<span class="comment"></span>    <span class="keywordflow">for</span> (i = static_cast&lt;uint&gt;(axis); i &lt; inputShape.<a class="code" href="classarmnn_1_1_tensor_shape.xhtml#a157e27d41e9f6b21f0d3c025fa47dc24">GetNumDimensions</a>(); i++){</div><div class="line"><a name="l01553"></a><span class="lineno"> 1553</span>&#160;        dimension2 *= inputShape[i];</div><div class="line"><a name="l01554"></a><span class="lineno"> 1554</span>&#160;    }</div><div class="line"><a name="l01555"></a><span class="lineno"> 1555</span>&#160;</div><div class="line"><a name="l01556"></a><span class="lineno"> 1556</span>&#160;    <a class="code" href="classarmnn_1_1_tensor_shape.xhtml">TensorShape</a> outputShape{dimension1, dimension2};</div><div class="line"><a name="l01557"></a><span class="lineno"> 1557</span>&#160;</div><div class="line"><a name="l01558"></a><span class="lineno"> 1558</span>&#160;    <span class="keyword">auto</span> outInfo = ComputeReshapeInfo(outputShape, inputShape, node.output(0));</div><div class="line"><a name="l01559"></a><span class="lineno"> 1559</span>&#160;    m_TensorsInfo[node.output(0)].m_info = std::make_unique&lt;TensorInfo&gt;(outInfo);</div><div class="line"><a name="l01560"></a><span class="lineno"> 1560</span>&#160;    CreateReshapeLayer(node.input(0), node.output(0), node.name());</div><div class="line"><a name="l01561"></a><span class="lineno"> 1561</span>&#160;}</div><div class="line"><a name="l01562"></a><span class="lineno"> 1562</span>&#160;</div><div class="line"><a name="l01563"></a><span class="lineno"> 1563</span>&#160;<span class="keywordtype">void</span> OnnxParserImpl::ParseGlobalAveragePool(<span class="keyword">const</span> onnx::NodeProto&amp; node)</div><div class="line"><a name="l01564"></a><span class="lineno"> 1564</span>&#160;{</div><div class="line"><a name="l01565"></a><span class="lineno"> 1565</span>&#160;    <a class="code" href="structarmnn_1_1_pooling2d_descriptor.xhtml">Pooling2dDescriptor</a> desc = <a class="code" href="structarmnn_1_1_pooling2d_descriptor.xhtml">Pooling2dDescriptor</a>();</div><div class="line"><a name="l01566"></a><span class="lineno"> 1566</span>&#160;    desc.<a class="code" href="structarmnn_1_1_pooling2d_descriptor.xhtml#a0031997bf43bd2747656c31e4977793a">m_PoolType</a> = PoolingAlgorithm::Average;</div><div class="line"><a name="l01567"></a><span class="lineno"> 1567</span>&#160;</div><div class="line"><a name="l01568"></a><span class="lineno"> 1568</span>&#160;    <span class="comment">//kernel size is the same as input</span></div><div class="line"><a name="l01569"></a><span class="lineno"> 1569</span>&#160;    <a class="code" href="classarmnn_1_1_tensor_shape.xhtml">TensorShape</a> inputShape = m_TensorsInfo[node.input(0)].m_info-&gt;GetShape();</div><div class="line"><a name="l01570"></a><span class="lineno"> 1570</span>&#160;    desc.<a class="code" href="structarmnn_1_1_pooling2d_descriptor.xhtml#a6d8fb685cc1ff224f25aa127fcf62c86">m_PoolWidth</a>  = inputShape[3];</div><div class="line"><a name="l01571"></a><span class="lineno"> 1571</span>&#160;    desc.<a class="code" href="structarmnn_1_1_pooling2d_descriptor.xhtml#a5699e8606c37d18c03910b242cd1b010">m_PoolHeight</a> = inputShape[2];</div><div class="line"><a name="l01572"></a><span class="lineno"> 1572</span>&#160;</div><div class="line"><a name="l01573"></a><span class="lineno"> 1573</span>&#160;    <a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml">IConnectableLayer</a>* layer = m_Network-&gt;AddPooling2dLayer(desc, node.name().c_str());</div><div class="line"><a name="l01574"></a><span class="lineno"> 1574</span>&#160;    <a class="code" href="_assert_8hpp.xhtml#a5698be69cbd5dfe6c28fcd9867e8cbed">ARMNN_ASSERT</a>(layer != <span class="keyword">nullptr</span>);</div><div class="line"><a name="l01575"></a><span class="lineno"> 1575</span>&#160;</div><div class="line"><a name="l01576"></a><span class="lineno"> 1576</span>&#160;    <span class="keyword">auto</span> outputInfo = ComputeOutputInfo({node.output(0)}, layer, {inputShape});</div><div class="line"><a name="l01577"></a><span class="lineno"> 1577</span>&#160;    layer-&gt;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml#a80ac4eda2e7f2757ec9dd96fc96dbd16">GetOutputSlot</a>(0).<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#a5ee4a6c9a2481245487b1b1a70d20fd0">SetTensorInfo</a>(outputInfo[0]);</div><div class="line"><a name="l01578"></a><span class="lineno"> 1578</span>&#160;</div><div class="line"><a name="l01579"></a><span class="lineno"> 1579</span>&#160;    <span class="comment">// register the input connection slots for the layer, connections are made after all layers have been created</span></div><div class="line"><a name="l01580"></a><span class="lineno"> 1580</span>&#160;    <span class="comment">// only the tensors for the inputs are relevant, exclude the const tensors</span></div><div class="line"><a name="l01581"></a><span class="lineno"> 1581</span>&#160;    RegisterInputSlots(layer, {node.input(0)});</div><div class="line"><a name="l01582"></a><span class="lineno"> 1582</span>&#160;</div><div class="line"><a name="l01583"></a><span class="lineno"> 1583</span>&#160;    <span class="comment">// register the output connection slots for the layer, connections are made after all layers have been created</span></div><div class="line"><a name="l01584"></a><span class="lineno"> 1584</span>&#160;    RegisterOutputSlots(layer, {node.output(0)});</div><div class="line"><a name="l01585"></a><span class="lineno"> 1585</span>&#160;}</div><div class="line"><a name="l01586"></a><span class="lineno"> 1586</span>&#160;</div><div class="line"><a name="l01587"></a><span class="lineno"> 1587</span>&#160;<span class="keywordtype">void</span> OnnxParserImpl::ParseMaxPool(<span class="keyword">const</span> onnx::NodeProto&amp; node)</div><div class="line"><a name="l01588"></a><span class="lineno"> 1588</span>&#160;{</div><div class="line"><a name="l01589"></a><span class="lineno"> 1589</span>&#160;    <a class="code" href="structarmnn_1_1_pooling2d_descriptor.xhtml">Pooling2dDescriptor</a> desc;</div><div class="line"><a name="l01590"></a><span class="lineno"> 1590</span>&#160;    desc.<a class="code" href="structarmnn_1_1_pooling2d_descriptor.xhtml#a0031997bf43bd2747656c31e4977793a">m_PoolType</a> = PoolingAlgorithm::Max;</div><div class="line"><a name="l01591"></a><span class="lineno"> 1591</span>&#160;    desc.<a class="code" href="structarmnn_1_1_pooling2d_descriptor.xhtml#a8c29d6ea9b4186d69aad5961c910939c">m_PaddingMethod</a> = PaddingMethod::Exclude;</div><div class="line"><a name="l01592"></a><span class="lineno"> 1592</span>&#160;    AddPoolingLayer(node, desc);</div><div class="line"><a name="l01593"></a><span class="lineno"> 1593</span>&#160;}</div><div class="line"><a name="l01594"></a><span class="lineno"> 1594</span>&#160;</div><div class="line"><a name="l01595"></a><span class="lineno"> 1595</span>&#160;<span class="keywordtype">void</span> OnnxParserImpl::ParseReshape(<span class="keyword">const</span> onnx::NodeProto&amp; node)</div><div class="line"><a name="l01596"></a><span class="lineno"> 1596</span>&#160;{</div><div class="line"><a name="l01597"></a><span class="lineno"> 1597</span>&#160;    <a class="code" href="_verification_helpers_8hpp.xhtml#a479b2821a7a2cbb8fa8eb7f60a47065d">CHECK_VALID_SIZE</a>(static_cast&lt;size_t&gt;(node.input_size()), 2);</div><div class="line"><a name="l01598"></a><span class="lineno"> 1598</span>&#160;    <a class="code" href="_verification_helpers_8hpp.xhtml#a479b2821a7a2cbb8fa8eb7f60a47065d">CHECK_VALID_SIZE</a>(static_cast&lt;size_t&gt;(node.output_size()), 1);</div><div class="line"><a name="l01599"></a><span class="lineno"> 1599</span>&#160;</div><div class="line"><a name="l01600"></a><span class="lineno"> 1600</span>&#160;    <a class="code" href="_onnx_parser_8cpp.xhtml#a71cae957feb9162183d6f62fd549ffe1">CHECK_VALID_DATATYPE</a>(node.name(), node.input(0),</div><div class="line"><a name="l01601"></a><span class="lineno"> 1601</span>&#160;                         m_TensorsInfo[node.input(0)].m_dtype,</div><div class="line"><a name="l01602"></a><span class="lineno"> 1602</span>&#160;                         onnx::TensorProto::FLOAT); <span class="comment">//input</span></div><div class="line"><a name="l01603"></a><span class="lineno"> 1603</span>&#160;    <a class="code" href="_onnx_parser_8cpp.xhtml#a71cae957feb9162183d6f62fd549ffe1">CHECK_VALID_DATATYPE</a>(node.name(), node.input(1),</div><div class="line"><a name="l01604"></a><span class="lineno"> 1604</span>&#160;                         m_TensorsInfo[node.input(1)].m_dtype,</div><div class="line"><a name="l01605"></a><span class="lineno"> 1605</span>&#160;                         onnx::TensorProto::INT64); <span class="comment">//shape</span></div><div class="line"><a name="l01606"></a><span class="lineno"> 1606</span>&#160;</div><div class="line"><a name="l01607"></a><span class="lineno"> 1607</span>&#160;    <span class="keywordflow">if</span>(!m_TensorsInfo[node.input(1)].isConstant())</div><div class="line"><a name="l01608"></a><span class="lineno"> 1608</span>&#160;    {</div><div class="line"><a name="l01609"></a><span class="lineno"> 1609</span>&#160;        <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_parse_exception.xhtml">ParseException</a>(fmt::format(<span class="stringliteral">&quot;Shape &#39;{}&#39; should be constant in Reshape layer &#39;{}&#39; {}&quot;</span>,</div><div class="line"><a name="l01610"></a><span class="lineno"> 1610</span>&#160;                                         node.input(1),</div><div class="line"><a name="l01611"></a><span class="lineno"> 1611</span>&#160;                                         node.name(),</div><div class="line"><a name="l01612"></a><span class="lineno"> 1612</span>&#160;                                         <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l01613"></a><span class="lineno"> 1613</span>&#160;    }</div><div class="line"><a name="l01614"></a><span class="lineno"> 1614</span>&#160;</div><div class="line"><a name="l01615"></a><span class="lineno"> 1615</span>&#160;    <span class="keywordflow">if</span>(m_TensorsInfo[node.input(0)].isConstant())</div><div class="line"><a name="l01616"></a><span class="lineno"> 1616</span>&#160;    {</div><div class="line"><a name="l01617"></a><span class="lineno"> 1617</span>&#160;        <span class="comment">//make a new cst tensor -&gt; move the data to the output tensor (the shape is already good in the output tensor)</span></div><div class="line"><a name="l01618"></a><span class="lineno"> 1618</span>&#160;        <span class="keywordflow">if</span>(m_TensorsInfo.count(node.output(0)) == 0)</div><div class="line"><a name="l01619"></a><span class="lineno"> 1619</span>&#160;        {</div><div class="line"><a name="l01620"></a><span class="lineno"> 1620</span>&#160;            m_TensorsInfo[node.output(0)] = OnnxTensor();</div><div class="line"><a name="l01621"></a><span class="lineno"> 1621</span>&#160;        }</div><div class="line"><a name="l01622"></a><span class="lineno"> 1622</span>&#160;        m_TensorsInfo[node.output(0)].m_tensor =</div><div class="line"><a name="l01623"></a><span class="lineno"> 1623</span>&#160;            std::make_unique&lt;onnx::TensorProto&gt;(*m_TensorsInfo[node.input(0)].m_tensor);</div><div class="line"><a name="l01624"></a><span class="lineno"> 1624</span>&#160;    }</div><div class="line"><a name="l01625"></a><span class="lineno"> 1625</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l01626"></a><span class="lineno"> 1626</span>&#160;    {</div><div class="line"><a name="l01627"></a><span class="lineno"> 1627</span>&#160;        <a class="code" href="classarmnn_1_1_tensor_shape.xhtml">TensorShape</a> inputShape = m_TensorsInfo[node.input(0)].m_info-&gt;GetShape();</div><div class="line"><a name="l01628"></a><span class="lineno"> 1628</span>&#160;</div><div class="line"><a name="l01629"></a><span class="lineno"> 1629</span>&#160;        <span class="keywordflow">if</span>(m_TensorsInfo.count(node.output(0)) == 0 || m_TensorsInfo[node.output(0)].m_info == <span class="keyword">nullptr</span>)</div><div class="line"><a name="l01630"></a><span class="lineno"> 1630</span>&#160;        {</div><div class="line"><a name="l01631"></a><span class="lineno"> 1631</span>&#160;            uint64_t dims = <span class="keyword">static_cast&lt;</span>uint64_t<span class="keyword">&gt;</span>(m_TensorsInfo[node.input(1)].m_tensor-&gt;int64_data_size());</div><div class="line"><a name="l01632"></a><span class="lineno"> 1632</span>&#160;            <a class="code" href="classarmnn_1_1_tensor_shape.xhtml">TensorShape</a> targetShape{<span class="keyword">static_cast&lt;</span><span class="keywordtype">unsigned</span> <span class="keywordtype">int</span><span class="keyword">&gt;</span>(dims), 1};</div><div class="line"><a name="l01633"></a><span class="lineno"> 1633</span>&#160;</div><div class="line"><a name="l01634"></a><span class="lineno"> 1634</span>&#160;            <span class="keywordflow">for</span>(uint i = 0; i &lt; dims; i++)</div><div class="line"><a name="l01635"></a><span class="lineno"> 1635</span>&#160;            {</div><div class="line"><a name="l01636"></a><span class="lineno"> 1636</span>&#160;                <span class="keywordtype">int</span> val = <a class="code" href="_verification_helpers_8hpp.xhtml#aa693ef8620e450b6362938828002f2a6">CHECKED_INT32</a>(m_TensorsInfo[node.input(1)].m_tensor-&gt;int64_data(static_cast&lt;int&gt;(i)));</div><div class="line"><a name="l01637"></a><span class="lineno"> 1637</span>&#160;                targetShape[i]= <span class="keyword">static_cast&lt;</span><span class="keywordtype">unsigned</span> <span class="keywordtype">int</span><span class="keyword">&gt;</span>(val);</div><div class="line"><a name="l01638"></a><span class="lineno"> 1638</span>&#160;            }</div><div class="line"><a name="l01639"></a><span class="lineno"> 1639</span>&#160;</div><div class="line"><a name="l01640"></a><span class="lineno"> 1640</span>&#160;            <span class="keyword">auto</span> outInfo = ComputeReshapeInfo(targetShape, inputShape, node.output(0));</div><div class="line"><a name="l01641"></a><span class="lineno"> 1641</span>&#160;            m_TensorsInfo[node.output(0)].m_info = std::make_unique&lt;TensorInfo&gt;(outInfo);</div><div class="line"><a name="l01642"></a><span class="lineno"> 1642</span>&#160;        }</div><div class="line"><a name="l01643"></a><span class="lineno"> 1643</span>&#160;</div><div class="line"><a name="l01644"></a><span class="lineno"> 1644</span>&#160;        CreateReshapeLayer(node.input(0), node.output(0), node.name());</div><div class="line"><a name="l01645"></a><span class="lineno"> 1645</span>&#160;    }</div><div class="line"><a name="l01646"></a><span class="lineno"> 1646</span>&#160;}</div><div class="line"><a name="l01647"></a><span class="lineno"> 1647</span>&#160;</div><div class="line"><a name="l01648"></a><span class="lineno"> 1648</span>&#160;<span class="keywordtype">void</span> OnnxParserImpl::PrependForBroadcast(<span class="keyword">const</span> std::string&amp; outputName,</div><div class="line"><a name="l01649"></a><span class="lineno"> 1649</span>&#160;                                         <span class="keyword">const</span> std::string&amp; input0,</div><div class="line"><a name="l01650"></a><span class="lineno"> 1650</span>&#160;                                         <span class="keyword">const</span> std::string&amp; input1)</div><div class="line"><a name="l01651"></a><span class="lineno"> 1651</span>&#160;{</div><div class="line"><a name="l01652"></a><span class="lineno"> 1652</span>&#160;    <span class="comment">//input0 should be reshaped to have same number of dim as input1</span></div><div class="line"><a name="l01653"></a><span class="lineno"> 1653</span>&#160;    <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> outputTensorInfo = <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a>(*m_TensorsInfo[input0].m_info);</div><div class="line"><a name="l01654"></a><span class="lineno"> 1654</span>&#160;</div><div class="line"><a name="l01655"></a><span class="lineno"> 1655</span>&#160;    <a class="code" href="classarmnn_1_1_tensor_shape.xhtml">TensorShape</a> input0Shape = m_TensorsInfo[input0].m_info-&gt;GetShape();</div><div class="line"><a name="l01656"></a><span class="lineno"> 1656</span>&#160;    <a class="code" href="classarmnn_1_1_tensor_shape.xhtml">TensorShape</a> input1Shape = m_TensorsInfo[input1].m_info-&gt;GetShape();</div><div class="line"><a name="l01657"></a><span class="lineno"> 1657</span>&#160;</div><div class="line"><a name="l01658"></a><span class="lineno"> 1658</span>&#160;    uint32_t diff = input1Shape.<a class="code" href="classarmnn_1_1_tensor_shape.xhtml#a157e27d41e9f6b21f0d3c025fa47dc24">GetNumDimensions</a>() - input0Shape.<a class="code" href="classarmnn_1_1_tensor_shape.xhtml#a157e27d41e9f6b21f0d3c025fa47dc24">GetNumDimensions</a>();</div><div class="line"><a name="l01659"></a><span class="lineno"> 1659</span>&#160;    std::vector&lt;uint32_t&gt; newShape;</div><div class="line"><a name="l01660"></a><span class="lineno"> 1660</span>&#160;    <span class="keywordflow">while</span>(diff &gt; 0)</div><div class="line"><a name="l01661"></a><span class="lineno"> 1661</span>&#160;    {</div><div class="line"><a name="l01662"></a><span class="lineno"> 1662</span>&#160;        newShape.push_back(1);</div><div class="line"><a name="l01663"></a><span class="lineno"> 1663</span>&#160;        diff--;</div><div class="line"><a name="l01664"></a><span class="lineno"> 1664</span>&#160;    }</div><div class="line"><a name="l01665"></a><span class="lineno"> 1665</span>&#160;    <span class="keywordflow">for</span> (uint dim = 0; dim &lt; input0Shape.<a class="code" href="classarmnn_1_1_tensor_shape.xhtml#a157e27d41e9f6b21f0d3c025fa47dc24">GetNumDimensions</a>(); ++dim)</div><div class="line"><a name="l01666"></a><span class="lineno"> 1666</span>&#160;    {</div><div class="line"><a name="l01667"></a><span class="lineno"> 1667</span>&#160;        newShape.push_back(input0Shape[dim]);</div><div class="line"><a name="l01668"></a><span class="lineno"> 1668</span>&#160;    }</div><div class="line"><a name="l01669"></a><span class="lineno"> 1669</span>&#160;    outputTensorInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#abe8889e8150beef5fd204b2d87b49298">SetShape</a>(<a class="code" href="classarmnn_1_1_tensor_shape.xhtml">TensorShape</a>(static_cast&lt;unsigned int&gt;(newShape.size()), newShape.data()));</div><div class="line"><a name="l01670"></a><span class="lineno"> 1670</span>&#160;</div><div class="line"><a name="l01671"></a><span class="lineno"> 1671</span>&#160;    <span class="comment">//add the new tensor to m_TensorsInfo</span></div><div class="line"><a name="l01672"></a><span class="lineno"> 1672</span>&#160;    m_TensorsInfo[outputName] = OnnxTensor();</div><div class="line"><a name="l01673"></a><span class="lineno"> 1673</span>&#160;    m_TensorsInfo[outputName].m_info = std::make_unique&lt;TensorInfo&gt;(outputTensorInfo);</div><div class="line"><a name="l01674"></a><span class="lineno"> 1674</span>&#160;</div><div class="line"><a name="l01675"></a><span class="lineno"> 1675</span>&#160;    <span class="comment">//add reshape layer if the parent was not constant...</span></div><div class="line"><a name="l01676"></a><span class="lineno"> 1676</span>&#160;    <span class="keywordflow">if</span>( ! m_TensorsInfo[input0].isConstant())</div><div class="line"><a name="l01677"></a><span class="lineno"> 1677</span>&#160;    {</div><div class="line"><a name="l01678"></a><span class="lineno"> 1678</span>&#160;        CreateReshapeLayer(input0, outputName, fmt::format(<span class="stringliteral">&quot;Add:reshapeOf{}&quot;</span>, input0));</div><div class="line"><a name="l01679"></a><span class="lineno"> 1679</span>&#160;    }</div><div class="line"><a name="l01680"></a><span class="lineno"> 1680</span>&#160;    <span class="keywordflow">else</span> <span class="comment">//make it constant and it will be create in Add</span></div><div class="line"><a name="l01681"></a><span class="lineno"> 1681</span>&#160;    {</div><div class="line"><a name="l01682"></a><span class="lineno"> 1682</span>&#160;        m_TensorsInfo[outputName].m_tensor = std::make_unique&lt;onnx::TensorProto&gt;(*m_TensorsInfo[input0].m_tensor);</div><div class="line"><a name="l01683"></a><span class="lineno"> 1683</span>&#160;</div><div class="line"><a name="l01684"></a><span class="lineno"> 1684</span>&#160;    }</div><div class="line"><a name="l01685"></a><span class="lineno"> 1685</span>&#160;}</div><div class="line"><a name="l01686"></a><span class="lineno"> 1686</span>&#160;</div><div class="line"><a name="l01687"></a><span class="lineno"> 1687</span>&#160;<span class="keywordtype">void</span> OnnxParserImpl::SetupInputLayers()</div><div class="line"><a name="l01688"></a><span class="lineno"> 1688</span>&#160;{</div><div class="line"><a name="l01689"></a><span class="lineno"> 1689</span>&#160;    <span class="comment">//Find user input and add their layers</span></div><div class="line"><a name="l01690"></a><span class="lineno"> 1690</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">int</span> inputIndex = 0; inputIndex &lt; m_Graph-&gt;input_size(); ++inputIndex)</div><div class="line"><a name="l01691"></a><span class="lineno"> 1691</span>&#160;    {</div><div class="line"><a name="l01692"></a><span class="lineno"> 1692</span>&#160;        <span class="keyword">auto</span> input = m_Graph-&gt;input(inputIndex);</div><div class="line"><a name="l01693"></a><span class="lineno"> 1693</span>&#160;        <span class="keywordflow">if</span> (! m_TensorsInfo[input.name()].isConstant())</div><div class="line"><a name="l01694"></a><span class="lineno"> 1694</span>&#160;        {</div><div class="line"><a name="l01695"></a><span class="lineno"> 1695</span>&#160;            <a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml">IConnectableLayer</a>* layer =</div><div class="line"><a name="l01696"></a><span class="lineno"> 1696</span>&#160;              m_Network-&gt;AddInputLayer(static_cast&lt;armnn::LayerBindingId&gt;(inputIndex), input.name().c_str());</div><div class="line"><a name="l01697"></a><span class="lineno"> 1697</span>&#160;            <span class="keyword">auto</span> tensorInfo = <a class="code" href="namespacearmnn_deserializer.xhtml#a948b8c615ff06defa3b80d2352259ff2">ToTensorInfo</a>(input);</div><div class="line"><a name="l01698"></a><span class="lineno"> 1698</span>&#160;            layer-&gt;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml#a80ac4eda2e7f2757ec9dd96fc96dbd16">GetOutputSlot</a>(0).<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#a5ee4a6c9a2481245487b1b1a70d20fd0">SetTensorInfo</a>(tensorInfo);</div><div class="line"><a name="l01699"></a><span class="lineno"> 1699</span>&#160;</div><div class="line"><a name="l01700"></a><span class="lineno"> 1700</span>&#160;            RegisterOutputSlots(layer,{ input.name() });</div><div class="line"><a name="l01701"></a><span class="lineno"> 1701</span>&#160;        }</div><div class="line"><a name="l01702"></a><span class="lineno"> 1702</span>&#160;    }</div><div class="line"><a name="l01703"></a><span class="lineno"> 1703</span>&#160;}</div><div class="line"><a name="l01704"></a><span class="lineno"> 1704</span>&#160;</div><div class="line"><a name="l01705"></a><span class="lineno"> 1705</span>&#160;<span class="keywordtype">void</span> OnnxParserImpl::SetupOutputLayers()</div><div class="line"><a name="l01706"></a><span class="lineno"> 1706</span>&#160;{</div><div class="line"><a name="l01707"></a><span class="lineno"> 1707</span>&#160;    <span class="keywordflow">if</span>(m_Graph-&gt;output_size() == 0)</div><div class="line"><a name="l01708"></a><span class="lineno"> 1708</span>&#160;    {</div><div class="line"><a name="l01709"></a><span class="lineno"> 1709</span>&#160;        <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_parse_exception.xhtml">ParseException</a>(fmt::format(<span class="stringliteral">&quot;The given model does not have any outputs {}&quot;</span>, <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l01710"></a><span class="lineno"> 1710</span>&#160;    }</div><div class="line"><a name="l01711"></a><span class="lineno"> 1711</span>&#160;</div><div class="line"><a name="l01712"></a><span class="lineno"> 1712</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">int</span> outputIndex = 0; outputIndex &lt; m_Graph-&gt;output_size(); ++outputIndex)</div><div class="line"><a name="l01713"></a><span class="lineno"> 1713</span>&#160;    {</div><div class="line"><a name="l01714"></a><span class="lineno"> 1714</span>&#160;        <a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml">IConnectableLayer</a>* layer =</div><div class="line"><a name="l01715"></a><span class="lineno"> 1715</span>&#160;            m_Network-&gt;AddOutputLayer(static_cast&lt;armnn::LayerBindingId&gt;(outputIndex),</div><div class="line"><a name="l01716"></a><span class="lineno"> 1716</span>&#160;                m_Graph-&gt;output(outputIndex).name().c_str());</div><div class="line"><a name="l01717"></a><span class="lineno"> 1717</span>&#160;</div><div class="line"><a name="l01718"></a><span class="lineno"> 1718</span>&#160;        RegisterInputSlots(layer, { m_Graph-&gt;output(outputIndex).name() });</div><div class="line"><a name="l01719"></a><span class="lineno"> 1719</span>&#160;    }</div><div class="line"><a name="l01720"></a><span class="lineno"> 1720</span>&#160;}</div><div class="line"><a name="l01721"></a><span class="lineno"> 1721</span>&#160;</div><div class="line"><a name="l01722"></a><span class="lineno"> 1722</span>&#160;<span class="keywordtype">void</span> OnnxParserImpl::RegisterInputSlots(<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml">IConnectableLayer</a>* layer, <span class="keyword">const</span> std::vector&lt;std::string&gt;&amp; tensorIds)</div><div class="line"><a name="l01723"></a><span class="lineno"> 1723</span>&#160;{</div><div class="line"><a name="l01724"></a><span class="lineno"> 1724</span>&#160;    <a class="code" href="_assert_8hpp.xhtml#a5698be69cbd5dfe6c28fcd9867e8cbed">ARMNN_ASSERT</a>(layer != <span class="keyword">nullptr</span>);</div><div class="line"><a name="l01725"></a><span class="lineno"> 1725</span>&#160;    <span class="keywordflow">if</span> (tensorIds.size() != layer-&gt;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml#a9c2cba04b6d7ace4fc2a2436b82a5a63">GetNumInputSlots</a>())</div><div class="line"><a name="l01726"></a><span class="lineno"> 1726</span>&#160;    {</div><div class="line"><a name="l01727"></a><span class="lineno"> 1727</span>&#160;        <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_parse_exception.xhtml">ParseException</a>(</div><div class="line"><a name="l01728"></a><span class="lineno"> 1728</span>&#160;            fmt::format(<span class="stringliteral">&quot;The number of tensor inputs ({}) does not match the number expected ({}) {}&quot;</span>,</div><div class="line"><a name="l01729"></a><span class="lineno"> 1729</span>&#160;                        tensorIds.size(),</div><div class="line"><a name="l01730"></a><span class="lineno"> 1730</span>&#160;                        layer-&gt;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml#a9c2cba04b6d7ace4fc2a2436b82a5a63">GetNumInputSlots</a>(),</div><div class="line"><a name="l01731"></a><span class="lineno"> 1731</span>&#160;                        <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l01732"></a><span class="lineno"> 1732</span>&#160;    }</div><div class="line"><a name="l01733"></a><span class="lineno"> 1733</span>&#160;    <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> slotIndex = 0; slotIndex &lt; layer-&gt;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml#a9c2cba04b6d7ace4fc2a2436b82a5a63">GetNumInputSlots</a>(); ++slotIndex)</div><div class="line"><a name="l01734"></a><span class="lineno"> 1734</span>&#160;    {</div><div class="line"><a name="l01735"></a><span class="lineno"> 1735</span>&#160;        std::string tensorId = tensorIds[slotIndex];</div><div class="line"><a name="l01736"></a><span class="lineno"> 1736</span>&#160;        <a class="code" href="classarmnn_1_1_i_input_slot.xhtml">armnn::IInputSlot</a>* slot = &amp;(layer-&gt;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml#a6ec9e0eb66d7d6a01240492a0b18104c">GetInputSlot</a>(slotIndex));</div><div class="line"><a name="l01737"></a><span class="lineno"> 1737</span>&#160;</div><div class="line"><a name="l01738"></a><span class="lineno"> 1738</span>&#160;        <span class="keyword">auto</span> it = m_TensorConnections.find(tensorId);</div><div class="line"><a name="l01739"></a><span class="lineno"> 1739</span>&#160;</div><div class="line"><a name="l01740"></a><span class="lineno"> 1740</span>&#160;        <span class="keywordflow">if</span> (it == m_TensorConnections.end())</div><div class="line"><a name="l01741"></a><span class="lineno"> 1741</span>&#160;        {</div><div class="line"><a name="l01742"></a><span class="lineno"> 1742</span>&#160;            <span class="comment">//First time seing this tensor, we need to map it</span></div><div class="line"><a name="l01743"></a><span class="lineno"> 1743</span>&#160;            m_TensorConnections[tensorId] = TensorSlots();</div><div class="line"><a name="l01744"></a><span class="lineno"> 1744</span>&#160;        }</div><div class="line"><a name="l01745"></a><span class="lineno"> 1745</span>&#160;        m_TensorConnections[tensorId].inputSlots.push_back(slot);</div><div class="line"><a name="l01746"></a><span class="lineno"> 1746</span>&#160;    }</div><div class="line"><a name="l01747"></a><span class="lineno"> 1747</span>&#160;}</div><div class="line"><a name="l01748"></a><span class="lineno"> 1748</span>&#160;</div><div class="line"><a name="l01749"></a><span class="lineno"> 1749</span>&#160;<span class="keywordtype">void</span> OnnxParserImpl::RegisterOutputSlots(<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml">IConnectableLayer</a>* layer, <span class="keyword">const</span> std::vector&lt;std::string&gt;&amp; tensorIds)</div><div class="line"><a name="l01750"></a><span class="lineno"> 1750</span>&#160;{</div><div class="line"><a name="l01751"></a><span class="lineno"> 1751</span>&#160;    <a class="code" href="_assert_8hpp.xhtml#a5698be69cbd5dfe6c28fcd9867e8cbed">ARMNN_ASSERT</a>(layer != <span class="keyword">nullptr</span>);</div><div class="line"><a name="l01752"></a><span class="lineno"> 1752</span>&#160;    <span class="keywordflow">if</span> (tensorIds.size() != layer-&gt;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml#ac2dac3b61c94de52093616be4ab17f8d">GetNumOutputSlots</a>())</div><div class="line"><a name="l01753"></a><span class="lineno"> 1753</span>&#160;    {</div><div class="line"><a name="l01754"></a><span class="lineno"> 1754</span>&#160;        <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_parse_exception.xhtml">ParseException</a>(</div><div class="line"><a name="l01755"></a><span class="lineno"> 1755</span>&#160;            fmt::format(<span class="stringliteral">&quot;The number of tensor outputs ({}) does not match the number expected ({}) {} &quot;</span>,</div><div class="line"><a name="l01756"></a><span class="lineno"> 1756</span>&#160;                        tensorIds.size(),</div><div class="line"><a name="l01757"></a><span class="lineno"> 1757</span>&#160;                        layer-&gt;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml#ac2dac3b61c94de52093616be4ab17f8d">GetNumOutputSlots</a>(),</div><div class="line"><a name="l01758"></a><span class="lineno"> 1758</span>&#160;                        <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l01759"></a><span class="lineno"> 1759</span>&#160;    }</div><div class="line"><a name="l01760"></a><span class="lineno"> 1760</span>&#160;</div><div class="line"><a name="l01761"></a><span class="lineno"> 1761</span>&#160;    <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> slotIndex = 0; slotIndex &lt; layer-&gt;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml#ac2dac3b61c94de52093616be4ab17f8d">GetNumOutputSlots</a>(); ++slotIndex)</div><div class="line"><a name="l01762"></a><span class="lineno"> 1762</span>&#160;    {</div><div class="line"><a name="l01763"></a><span class="lineno"> 1763</span>&#160;        std::string tensorId = tensorIds[slotIndex];</div><div class="line"><a name="l01764"></a><span class="lineno"> 1764</span>&#160;        <a class="code" href="classarmnn_1_1_i_output_slot.xhtml">armnn::IOutputSlot</a>* slot = &amp;(layer-&gt;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml#a80ac4eda2e7f2757ec9dd96fc96dbd16">GetOutputSlot</a>(slotIndex));</div><div class="line"><a name="l01765"></a><span class="lineno"> 1765</span>&#160;</div><div class="line"><a name="l01766"></a><span class="lineno"> 1766</span>&#160;        <span class="keyword">auto</span> it = m_TensorConnections.find(tensorId);</div><div class="line"><a name="l01767"></a><span class="lineno"> 1767</span>&#160;</div><div class="line"><a name="l01768"></a><span class="lineno"> 1768</span>&#160;        <span class="keywordflow">if</span> (it == m_TensorConnections.end())</div><div class="line"><a name="l01769"></a><span class="lineno"> 1769</span>&#160;        {</div><div class="line"><a name="l01770"></a><span class="lineno"> 1770</span>&#160;            <span class="comment">//First time seing this tensor, we need to map it</span></div><div class="line"><a name="l01771"></a><span class="lineno"> 1771</span>&#160;            m_TensorConnections[tensorId] = TensorSlots();</div><div class="line"><a name="l01772"></a><span class="lineno"> 1772</span>&#160;        }</div><div class="line"><a name="l01773"></a><span class="lineno"> 1773</span>&#160;</div><div class="line"><a name="l01774"></a><span class="lineno"> 1774</span>&#160;        TensorSlots&amp; tensorSlots = m_TensorConnections[tensorId];</div><div class="line"><a name="l01775"></a><span class="lineno"> 1775</span>&#160;</div><div class="line"><a name="l01776"></a><span class="lineno"> 1776</span>&#160;        <span class="comment">// assuming there is only one producer for that tensor</span></div><div class="line"><a name="l01777"></a><span class="lineno"> 1777</span>&#160;        <span class="keywordflow">if</span> (tensorSlots.outputSlot != <span class="keyword">nullptr</span>)</div><div class="line"><a name="l01778"></a><span class="lineno"> 1778</span>&#160;        {</div><div class="line"><a name="l01779"></a><span class="lineno"> 1779</span>&#160;            <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_parse_exception.xhtml">ParseException</a>(fmt::format(<span class="stringliteral">&quot;Another layer has already registered itself as the producer of &quot;</span></div><div class="line"><a name="l01780"></a><span class="lineno"> 1780</span>&#160;                                             <span class="stringliteral">&quot;tensor:{} {}&quot;</span>,</div><div class="line"><a name="l01781"></a><span class="lineno"> 1781</span>&#160;                                             tensorId,</div><div class="line"><a name="l01782"></a><span class="lineno"> 1782</span>&#160;                                             <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l01783"></a><span class="lineno"> 1783</span>&#160;        }</div><div class="line"><a name="l01784"></a><span class="lineno"> 1784</span>&#160;        tensorSlots.outputSlot = slot;</div><div class="line"><a name="l01785"></a><span class="lineno"> 1785</span>&#160;    }</div><div class="line"><a name="l01786"></a><span class="lineno"> 1786</span>&#160;}</div><div class="line"><a name="l01787"></a><span class="lineno"> 1787</span>&#160;</div><div class="line"><a name="l01788"></a><span class="lineno"><a class="line" href="classarmnn_onnx_parser_1_1_onnx_parser_impl.xhtml#a8b053a6c449d0814cc831c916c126668"> 1788</a></span>&#160;<a class="code" href="namespacearmnn_onnx_parser.xhtml#a9084adbf804022c874039ad40d1939e9">BindingPointInfo</a> <a class="code" href="classarmnn_onnx_parser_1_1_onnx_parser_impl.xhtml#a8b053a6c449d0814cc831c916c126668">OnnxParserImpl::GetNetworkInputBindingInfo</a>(<span class="keyword">const</span> std::string&amp; name)<span class="keyword"> const</span></div><div class="line"><a name="l01789"></a><span class="lineno"> 1789</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l01790"></a><span class="lineno"> 1790</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i = 0; i &lt; m_Graph-&gt;input_size(); ++i)</div><div class="line"><a name="l01791"></a><span class="lineno"> 1791</span>&#160;    {</div><div class="line"><a name="l01792"></a><span class="lineno"> 1792</span>&#160;        <span class="keyword">auto</span> input = m_Graph-&gt;input(i);</div><div class="line"><a name="l01793"></a><span class="lineno"> 1793</span>&#160;        <span class="keywordflow">if</span>(input.name() == name)</div><div class="line"><a name="l01794"></a><span class="lineno"> 1794</span>&#160;        {</div><div class="line"><a name="l01795"></a><span class="lineno"> 1795</span>&#160;            <span class="keywordflow">return</span> std::make_pair(static_cast&lt;armnn::LayerBindingId&gt;(i), <a class="code" href="namespacearmnn_deserializer.xhtml#a948b8c615ff06defa3b80d2352259ff2">ToTensorInfo</a>(input));</div><div class="line"><a name="l01796"></a><span class="lineno"> 1796</span>&#160;        }</div><div class="line"><a name="l01797"></a><span class="lineno"> 1797</span>&#160;    }</div><div class="line"><a name="l01798"></a><span class="lineno"> 1798</span>&#160;    <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_invalid_argument_exception.xhtml">InvalidArgumentException</a>(fmt::format(<span class="stringliteral">&quot;The input layer &#39;{}&#39; does not exist {}&quot;</span>,</div><div class="line"><a name="l01799"></a><span class="lineno"> 1799</span>&#160;                                               name, <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l01800"></a><span class="lineno"> 1800</span>&#160;}</div><div class="line"><a name="l01801"></a><span class="lineno"> 1801</span>&#160;</div><div class="line"><a name="l01802"></a><span class="lineno"><a class="line" href="classarmnn_onnx_parser_1_1_onnx_parser_impl.xhtml#a4b1fdcb1985af12dd1848a9ffa5d3271"> 1802</a></span>&#160;<a class="code" href="namespacearmnn_onnx_parser.xhtml#a9084adbf804022c874039ad40d1939e9">BindingPointInfo</a> <a class="code" href="classarmnn_onnx_parser_1_1_onnx_parser_impl.xhtml#a4b1fdcb1985af12dd1848a9ffa5d3271">OnnxParserImpl::GetNetworkOutputBindingInfo</a>(<span class="keyword">const</span> std::string&amp; name)<span class="keyword"> const</span></div><div class="line"><a name="l01803"></a><span class="lineno"> 1803</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l01804"></a><span class="lineno"> 1804</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i = 0; i &lt; m_Graph-&gt;output_size(); ++i)</div><div class="line"><a name="l01805"></a><span class="lineno"> 1805</span>&#160;    {</div><div class="line"><a name="l01806"></a><span class="lineno"> 1806</span>&#160;        <span class="keyword">auto</span> output = m_Graph-&gt;output(i);</div><div class="line"><a name="l01807"></a><span class="lineno"> 1807</span>&#160;        <span class="keywordflow">if</span>(output.name() == name)</div><div class="line"><a name="l01808"></a><span class="lineno"> 1808</span>&#160;        {</div><div class="line"><a name="l01809"></a><span class="lineno"> 1809</span>&#160;            <span class="keywordflow">return</span> std::make_pair(static_cast&lt;armnn::LayerBindingId&gt;(i), <a class="code" href="namespacearmnn_deserializer.xhtml#a948b8c615ff06defa3b80d2352259ff2">ToTensorInfo</a>(output));</div><div class="line"><a name="l01810"></a><span class="lineno"> 1810</span>&#160;        }</div><div class="line"><a name="l01811"></a><span class="lineno"> 1811</span>&#160;    }</div><div class="line"><a name="l01812"></a><span class="lineno"> 1812</span>&#160;    <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_invalid_argument_exception.xhtml">InvalidArgumentException</a>(fmt::format(<span class="stringliteral">&quot;The output layer &#39;{}&#39; does not exist {}&quot;</span>,</div><div class="line"><a name="l01813"></a><span class="lineno"> 1813</span>&#160;                                               name, <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l01814"></a><span class="lineno"> 1814</span>&#160;}</div><div class="line"><a name="l01815"></a><span class="lineno"> 1815</span>&#160;</div><div class="line"><a name="l01816"></a><span class="lineno"><a class="line" href="classarmnn_onnx_parser_1_1_onnx_parser_impl.xhtml#a7cf8b801043e1eccd5e6db1325eaa4fe"> 1816</a></span>&#160;std::vector&lt;std::string&gt; <a class="code" href="classarmnn_onnx_parser_1_1_onnx_parser_impl.xhtml#a7cf8b801043e1eccd5e6db1325eaa4fe">OnnxParserImpl::GetInputs</a>(<a class="code" href="namespacearmnn_onnx_parser.xhtml#a503ae4f55dae1486e53978657083b35d">ModelPtr</a>&amp; model)</div><div class="line"><a name="l01817"></a><span class="lineno"> 1817</span>&#160;{</div><div class="line"><a name="l01818"></a><span class="lineno"> 1818</span>&#160;    <span class="keywordflow">if</span>(model == <span class="keyword">nullptr</span>) {</div><div class="line"><a name="l01819"></a><span class="lineno"> 1819</span>&#160;        <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_invalid_argument_exception.xhtml">InvalidArgumentException</a>(fmt::format(<span class="stringliteral">&quot;The given model cannot be null {}&quot;</span>,</div><div class="line"><a name="l01820"></a><span class="lineno"> 1820</span>&#160;                                                   <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l01821"></a><span class="lineno"> 1821</span>&#160;    }</div><div class="line"><a name="l01822"></a><span class="lineno"> 1822</span>&#160;</div><div class="line"><a name="l01823"></a><span class="lineno"> 1823</span>&#160;    std::vector&lt;std::string&gt; inputNames;</div><div class="line"><a name="l01824"></a><span class="lineno"> 1824</span>&#160;    std::map&lt;std::string, bool&gt; isConstant;</div><div class="line"><a name="l01825"></a><span class="lineno"> 1825</span>&#160;    <span class="keywordflow">for</span>(<span class="keyword">auto</span> tensor : model-&gt;graph().initializer())</div><div class="line"><a name="l01826"></a><span class="lineno"> 1826</span>&#160;    {</div><div class="line"><a name="l01827"></a><span class="lineno"> 1827</span>&#160;        isConstant[tensor.name()] = <span class="keyword">true</span>;</div><div class="line"><a name="l01828"></a><span class="lineno"> 1828</span>&#160;    }</div><div class="line"><a name="l01829"></a><span class="lineno"> 1829</span>&#160;    <span class="keywordflow">for</span>(<span class="keyword">auto</span> input : model-&gt;graph().input())</div><div class="line"><a name="l01830"></a><span class="lineno"> 1830</span>&#160;    {</div><div class="line"><a name="l01831"></a><span class="lineno"> 1831</span>&#160;        <span class="keyword">auto</span> it = isConstant.find(input.name());</div><div class="line"><a name="l01832"></a><span class="lineno"> 1832</span>&#160;        <span class="keywordflow">if</span>(it == isConstant.end())</div><div class="line"><a name="l01833"></a><span class="lineno"> 1833</span>&#160;        {</div><div class="line"><a name="l01834"></a><span class="lineno"> 1834</span>&#160;            inputNames.push_back(input.name());</div><div class="line"><a name="l01835"></a><span class="lineno"> 1835</span>&#160;        }</div><div class="line"><a name="l01836"></a><span class="lineno"> 1836</span>&#160;    }</div><div class="line"><a name="l01837"></a><span class="lineno"> 1837</span>&#160;    <span class="keywordflow">return</span> inputNames;</div><div class="line"><a name="l01838"></a><span class="lineno"> 1838</span>&#160;}</div><div class="line"><a name="l01839"></a><span class="lineno"> 1839</span>&#160;</div><div class="line"><a name="l01840"></a><span class="lineno"><a class="line" href="classarmnn_onnx_parser_1_1_onnx_parser_impl.xhtml#ad116319e33228bc23ec505887d3eee4d"> 1840</a></span>&#160;std::vector&lt;std::string&gt; <a class="code" href="classarmnn_onnx_parser_1_1_onnx_parser_impl.xhtml#ad116319e33228bc23ec505887d3eee4d">OnnxParserImpl::GetOutputs</a>(<a class="code" href="namespacearmnn_onnx_parser.xhtml#a503ae4f55dae1486e53978657083b35d">ModelPtr</a>&amp; model)</div><div class="line"><a name="l01841"></a><span class="lineno"> 1841</span>&#160;{</div><div class="line"><a name="l01842"></a><span class="lineno"> 1842</span>&#160;    <span class="keywordflow">if</span>(model == <span class="keyword">nullptr</span>) {</div><div class="line"><a name="l01843"></a><span class="lineno"> 1843</span>&#160;        <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_invalid_argument_exception.xhtml">InvalidArgumentException</a>(fmt::format(<span class="stringliteral">&quot;The given model cannot be null {}&quot;</span>,</div><div class="line"><a name="l01844"></a><span class="lineno"> 1844</span>&#160;                                                   <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l01845"></a><span class="lineno"> 1845</span>&#160;    }</div><div class="line"><a name="l01846"></a><span class="lineno"> 1846</span>&#160;</div><div class="line"><a name="l01847"></a><span class="lineno"> 1847</span>&#160;    std::vector&lt;std::string&gt; outputNames;</div><div class="line"><a name="l01848"></a><span class="lineno"> 1848</span>&#160;    <span class="keywordflow">for</span>(<span class="keyword">auto</span> output : model-&gt;graph().output())</div><div class="line"><a name="l01849"></a><span class="lineno"> 1849</span>&#160;    {</div><div class="line"><a name="l01850"></a><span class="lineno"> 1850</span>&#160;        outputNames.push_back(output.name());</div><div class="line"><a name="l01851"></a><span class="lineno"> 1851</span>&#160;    }</div><div class="line"><a name="l01852"></a><span class="lineno"> 1852</span>&#160;    <span class="keywordflow">return</span> outputNames;</div><div class="line"><a name="l01853"></a><span class="lineno"> 1853</span>&#160;}</div><div class="line"><a name="l01854"></a><span class="lineno"> 1854</span>&#160;</div><div class="line"><a name="l01855"></a><span class="lineno"><a class="line" href="classarmnn_onnx_parser_1_1_onnx_parser_impl.xhtml#aa09a8bb02eed50715082d8b7fccd2f8d"> 1855</a></span>&#160;<span class="keyword">const</span> std::string <a class="code" href="classarmnn_onnx_parser_1_1_onnx_parser_impl.xhtml#aa09a8bb02eed50715082d8b7fccd2f8d">OnnxParserImpl::GetVersion</a>()</div><div class="line"><a name="l01856"></a><span class="lineno"> 1856</span>&#160;{</div><div class="line"><a name="l01857"></a><span class="lineno"> 1857</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="include_2armnn_onnx_parser_2_version_8hpp.xhtml#a91718cb27a114419c34ce33827e94321">ONNX_PARSER_VERSION</a>;</div><div class="line"><a name="l01858"></a><span class="lineno"> 1858</span>&#160;}</div><div class="line"><a name="l01859"></a><span class="lineno"> 1859</span>&#160;</div><div class="line"><a name="l01860"></a><span class="lineno"> 1860</span>&#160;} <span class="comment">// namespace armnnOnnxParser</span></div><div class="ttc" id="classarmnn_1_1_tensor_shape_xhtml_a8846406ac37fbd2204f0be16ee05d5b7"><div class="ttname"><a href="classarmnn_1_1_tensor_shape.xhtml#a8846406ac37fbd2204f0be16ee05d5b7">armnn::TensorShape::GetNumElements</a></div><div class="ttdeci">unsigned int GetNumElements() const</div><div class="ttdoc">Function that calculates the tensor elements by multiplying all dimension size which are Specified...</div><div class="ttdef"><b>Definition:</b> <a href="_tensor_8cpp_source.xhtml#l00181">Tensor.cpp:181</a></div></div>
<div class="ttc" id="structarmnn_1_1_convolution2d_descriptor_xhtml_aa9e49717ebdb741e8c767741647fc618"><div class="ttname"><a href="structarmnn_1_1_convolution2d_descriptor.xhtml#aa9e49717ebdb741e8c767741647fc618">armnn::Convolution2dDescriptor::m_PadBottom</a></div><div class="ttdeci">uint32_t m_PadBottom</div><div class="ttdoc">Padding bottom value in the height dimension. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l00444">Descriptors.hpp:444</a></div></div>
<div class="ttc" id="structarmnn_1_1_convolution2d_descriptor_xhtml_aea202e14d8874cefd9a0f778022b7e25"><div class="ttname"><a href="structarmnn_1_1_convolution2d_descriptor.xhtml#aea202e14d8874cefd9a0f778022b7e25">armnn::Convolution2dDescriptor::m_BiasEnabled</a></div><div class="ttdeci">bool m_BiasEnabled</div><div class="ttdoc">Enable/disable bias. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l00454">Descriptors.hpp:454</a></div></div>
<div class="ttc" id="classarmnn_1_1_i_connectable_layer_xhtml_ac2dac3b61c94de52093616be4ab17f8d"><div class="ttname"><a href="classarmnn_1_1_i_connectable_layer.xhtml#ac2dac3b61c94de52093616be4ab17f8d">armnn::IConnectableLayer::GetNumOutputSlots</a></div><div class="ttdeci">virtual unsigned int GetNumOutputSlots() const =0</div><div class="ttdoc">Returns the number of connectable output slots. </div></div>
<div class="ttc" id="classarmnn_1_1_i_connectable_layer_xhtml"><div class="ttname"><a href="classarmnn_1_1_i_connectable_layer.xhtml">armnn::IConnectableLayer</a></div><div class="ttdoc">Interface for a layer that is connectable to other layers via InputSlots and OutputSlots. </div><div class="ttdef"><b>Definition:</b> <a href="_i_network_8hpp_source.xhtml#l00062">INetwork.hpp:62</a></div></div>
<div class="ttc" id="structarmnn_1_1_pooling2d_descriptor_xhtml_aa9e49717ebdb741e8c767741647fc618"><div class="ttname"><a href="structarmnn_1_1_pooling2d_descriptor.xhtml#aa9e49717ebdb741e8c767741647fc618">armnn::Pooling2dDescriptor::m_PadBottom</a></div><div class="ttdeci">uint32_t m_PadBottom</div><div class="ttdoc">Padding bottom value in the height dimension. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l00371">Descriptors.hpp:371</a></div></div>
<div class="ttc" id="classarmnn_1_1_i_connectable_layer_xhtml_a9c2cba04b6d7ace4fc2a2436b82a5a63"><div class="ttname"><a href="classarmnn_1_1_i_connectable_layer.xhtml#a9c2cba04b6d7ace4fc2a2436b82a5a63">armnn::IConnectableLayer::GetNumInputSlots</a></div><div class="ttdeci">virtual unsigned int GetNumInputSlots() const =0</div><div class="ttdoc">Returns the number of connectable input slots. </div></div>
<div class="ttc" id="classarmnn_1_1_tensor_info_xhtml_a8b5d0f8a24e9d9238f412260a552acf8"><div class="ttname"><a href="classarmnn_1_1_tensor_info.xhtml#a8b5d0f8a24e9d9238f412260a552acf8">armnn::TensorInfo::GetShape</a></div><div class="ttdeci">const TensorShape &amp; GetShape() const</div><div class="ttdef"><b>Definition:</b> <a href="_tensor_8hpp_source.xhtml#l00187">Tensor.hpp:187</a></div></div>
<div class="ttc" id="structarmnn_1_1_pooling2d_descriptor_xhtml_ac18546ebbebbb32fe0a03baa9bf2c600"><div class="ttname"><a href="structarmnn_1_1_pooling2d_descriptor.xhtml#ac18546ebbebbb32fe0a03baa9bf2c600">armnn::Pooling2dDescriptor::m_PadLeft</a></div><div class="ttdeci">uint32_t m_PadLeft</div><div class="ttdoc">Padding left value in the width dimension. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l00365">Descriptors.hpp:365</a></div></div>
<div class="ttc" id="classarmnn_1_1_optional_xhtml"><div class="ttname"><a href="classarmnn_1_1_optional.xhtml">armnn::Optional</a></div><div class="ttdef"><b>Definition:</b> <a href="_optional_8hpp_source.xhtml#l00270">Optional.hpp:270</a></div></div>
<div class="ttc" id="structarmnn_1_1_check_location_xhtml_a5e3562cda960da001597e7dd5679b140"><div class="ttname"><a href="structarmnn_1_1_check_location.xhtml#a5e3562cda960da001597e7dd5679b140">armnn::CheckLocation::AsString</a></div><div class="ttdeci">std::string AsString() const</div><div class="ttdef"><b>Definition:</b> <a href="_exceptions_8hpp_source.xhtml#l00029">Exceptions.hpp:29</a></div></div>
<div class="ttc" id="structarmnn_1_1_reshape_descriptor_xhtml"><div class="ttname"><a href="structarmnn_1_1_reshape_descriptor.xhtml">armnn::ReshapeDescriptor</a></div><div class="ttdoc">A ReshapeDescriptor for the ReshapeLayer. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l00832">Descriptors.hpp:832</a></div></div>
<div class="ttc" id="classarmnn_onnx_parser_1_1_onnx_parser_impl_xhtml_a8b053a6c449d0814cc831c916c126668"><div class="ttname"><a href="classarmnn_onnx_parser_1_1_onnx_parser_impl.xhtml#a8b053a6c449d0814cc831c916c126668">armnnOnnxParser::OnnxParserImpl::GetNetworkInputBindingInfo</a></div><div class="ttdeci">BindingPointInfo GetNetworkInputBindingInfo(const std::string &amp;name) const</div><div class="ttdoc">Retrieve binding info (layer id and tensor info) for the network input identified by the given layer ...</div><div class="ttdef"><b>Definition:</b> <a href="_onnx_parser_8cpp_source.xhtml#l01788">OnnxParser.cpp:1788</a></div></div>
<div class="ttc" id="classarmnn_1_1_tensor_info_xhtml"><div class="ttname"><a href="classarmnn_1_1_tensor_info.xhtml">armnn::TensorInfo</a></div><div class="ttdef"><b>Definition:</b> <a href="_tensor_8hpp_source.xhtml#l00152">Tensor.hpp:152</a></div></div>
<div class="ttc" id="structarmnn_1_1_pooling2d_descriptor_xhtml_a6d8fb685cc1ff224f25aa127fcf62c86"><div class="ttname"><a href="structarmnn_1_1_pooling2d_descriptor.xhtml#a6d8fb685cc1ff224f25aa127fcf62c86">armnn::Pooling2dDescriptor::m_PoolWidth</a></div><div class="ttdeci">uint32_t m_PoolWidth</div><div class="ttdoc">Pooling width value. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l00373">Descriptors.hpp:373</a></div></div>
<div class="ttc" id="structarmnn_1_1_convolution2d_descriptor_xhtml"><div class="ttname"><a href="structarmnn_1_1_convolution2d_descriptor.xhtml">armnn::Convolution2dDescriptor</a></div><div class="ttdoc">A Convolution2dDescriptor for the Convolution2dLayer. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l00408">Descriptors.hpp:408</a></div></div>
<div class="ttc" id="structarmnn_1_1_depthwise_convolution2d_descriptor_xhtml_ac18546ebbebbb32fe0a03baa9bf2c600"><div class="ttname"><a href="structarmnn_1_1_depthwise_convolution2d_descriptor.xhtml#ac18546ebbebbb32fe0a03baa9bf2c600">armnn::DepthwiseConvolution2dDescriptor::m_PadLeft</a></div><div class="ttdeci">uint32_t m_PadLeft</div><div class="ttdoc">Padding left value in the width dimension. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l00490">Descriptors.hpp:490</a></div></div>
<div class="ttc" id="classarmnn_1_1_tensor_info_xhtml_abcbdfb544ece4c31d0b37715ad0f3be0"><div class="ttname"><a href="classarmnn_1_1_tensor_info.xhtml#abcbdfb544ece4c31d0b37715ad0f3be0">armnn::TensorInfo::GetNumBytes</a></div><div class="ttdeci">unsigned int GetNumBytes() const</div><div class="ttdef"><b>Definition:</b> <a href="_tensor_8cpp_source.xhtml#l00418">Tensor.cpp:418</a></div></div>
<div class="ttc" id="structarmnn_1_1_batch_normalization_descriptor_xhtml_a11c821c7524251004a72ed13c510853c"><div class="ttname"><a href="structarmnn_1_1_batch_normalization_descriptor.xhtml#a11c821c7524251004a72ed13c510853c">armnn::BatchNormalizationDescriptor::m_Eps</a></div><div class="ttdeci">float m_Eps</div><div class="ttdoc">Value to add to the variance. Used to avoid dividing by zero. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l00639">Descriptors.hpp:639</a></div></div>
<div class="ttc" id="structarmnn_1_1_pooling2d_descriptor_xhtml_a8c29d6ea9b4186d69aad5961c910939c"><div class="ttname"><a href="structarmnn_1_1_pooling2d_descriptor.xhtml#a8c29d6ea9b4186d69aad5961c910939c">armnn::Pooling2dDescriptor::m_PaddingMethod</a></div><div class="ttdeci">PaddingMethod m_PaddingMethod</div><div class="ttdoc">The padding method to be used. (Exclude, IgnoreValue). </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l00383">Descriptors.hpp:383</a></div></div>
<div class="ttc" id="classarmnn_1_1_file_not_found_exception_xhtml"><div class="ttname"><a href="classarmnn_1_1_file_not_found_exception.xhtml">armnn::FileNotFoundException</a></div><div class="ttdef"><b>Definition:</b> <a href="_exceptions_8hpp_source.xhtml#l00086">Exceptions.hpp:86</a></div></div>
<div class="ttc" id="classarmnn_onnx_parser_1_1_onnx_parser_impl_xhtml_a4b1fdcb1985af12dd1848a9ffa5d3271"><div class="ttname"><a href="classarmnn_onnx_parser_1_1_onnx_parser_impl.xhtml#a4b1fdcb1985af12dd1848a9ffa5d3271">armnnOnnxParser::OnnxParserImpl::GetNetworkOutputBindingInfo</a></div><div class="ttdeci">BindingPointInfo GetNetworkOutputBindingInfo(const std::string &amp;name) const</div><div class="ttdoc">Retrieve binding info (layer id and tensor info) for the network output identified by the given layer...</div><div class="ttdef"><b>Definition:</b> <a href="_onnx_parser_8cpp_source.xhtml#l01802">OnnxParser.cpp:1802</a></div></div>
<div class="ttc" id="structarmnn_1_1_pooling2d_descriptor_xhtml_a56b51f56cef50cdfa554258eecdab046"><div class="ttname"><a href="structarmnn_1_1_pooling2d_descriptor.xhtml#a56b51f56cef50cdfa554258eecdab046">armnn::Pooling2dDescriptor::m_PadTop</a></div><div class="ttdeci">uint32_t m_PadTop</div><div class="ttdoc">Padding top value in the height dimension. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l00369">Descriptors.hpp:369</a></div></div>
<div class="ttc" id="structarmnn_1_1_convolution2d_descriptor_xhtml_a002bc30e590d78cbb4f4d12171055ca7"><div class="ttname"><a href="structarmnn_1_1_convolution2d_descriptor.xhtml#a002bc30e590d78cbb4f4d12171055ca7">armnn::Convolution2dDescriptor::m_PadRight</a></div><div class="ttdeci">uint32_t m_PadRight</div><div class="ttdoc">Padding right value in the width dimension. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l00440">Descriptors.hpp:440</a></div></div>
<div class="ttc" id="_onnx_parser_8cpp_xhtml_a0e987f9d4f46b35c9b1ff0cc950dc5b1"><div class="ttname"><a href="_onnx_parser_8cpp.xhtml#a0e987f9d4f46b35c9b1ff0cc950dc5b1">VALID_INPUTS</a></div><div class="ttdeci">#define VALID_INPUTS(NODE, VALID_INPUTS)</div><div class="ttdef"><b>Definition:</b> <a href="_onnx_parser_8cpp_source.xhtml#l00447">OnnxParser.cpp:447</a></div></div>
<div class="ttc" id="namespacearmnn_xhtml"><div class="ttname"><a href="namespacearmnn.xhtml">armnn</a></div><div class="ttdoc">Copyright (c) 2021 ARM Limited and Contributors. </div><div class="ttdef"><b>Definition:</b> <a href="01__00__software__tools_8dox_source.xhtml#l00006">01_00_software_tools.dox:6</a></div></div>
<div class="ttc" id="classarmnn_1_1_tensor_shape_xhtml"><div class="ttname"><a href="classarmnn_1_1_tensor_shape.xhtml">armnn::TensorShape</a></div><div class="ttdef"><b>Definition:</b> <a href="_tensor_8hpp_source.xhtml#l00020">Tensor.hpp:20</a></div></div>
<div class="ttc" id="structarmnn_1_1_convolution2d_descriptor_xhtml_a302b688d88dd73cde0fb1faef6679907"><div class="ttname"><a href="structarmnn_1_1_convolution2d_descriptor.xhtml#a302b688d88dd73cde0fb1faef6679907">armnn::Convolution2dDescriptor::m_DilationY</a></div><div class="ttdeci">uint32_t m_DilationY</div><div class="ttdoc">Dilation along y axis. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l00452">Descriptors.hpp:452</a></div></div>
<div class="ttc" id="namespacearmnn_xhtml_a4dc0adc6737b5944e7671bee71788407acb5e100e5a9a3e7f6d1fd97512215282"><div class="ttname"><a href="namespacearmnn.xhtml#a4dc0adc6737b5944e7671bee71788407acb5e100e5a9a3e7f6d1fd97512215282">armnn::BoostLogSeverityMapping::error</a></div></div>
<div class="ttc" id="structarmnn_1_1_pooling2d_descriptor_xhtml_afe6a3377c4531315354def9023c8fdda"><div class="ttname"><a href="structarmnn_1_1_pooling2d_descriptor.xhtml#afe6a3377c4531315354def9023c8fdda">armnn::Pooling2dDescriptor::m_StrideX</a></div><div class="ttdeci">uint32_t m_StrideX</div><div class="ttdoc">Stride value when proceeding through input for the width dimension. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l00377">Descriptors.hpp:377</a></div></div>
<div class="ttc" id="classarmnn_onnx_parser_1_1_i_onnx_parser_xhtml_a6bf5861864c8828e59df24a7868c5439"><div class="ttname"><a href="classarmnn_onnx_parser_1_1_i_onnx_parser.xhtml#a6bf5861864c8828e59df24a7868c5439">armnnOnnxParser::IOnnxParser::CreateNetworkFromBinaryFile</a></div><div class="ttdeci">armnn::INetworkPtr CreateNetworkFromBinaryFile(const char *graphFile)</div><div class="ttdoc">Create the network from a protobuf binary file on disk. </div><div class="ttdef"><b>Definition:</b> <a href="_onnx_parser_8cpp_source.xhtml#l00046">OnnxParser.cpp:46</a></div></div>
<div class="ttc" id="_onnx_parser_8hpp_xhtml"><div class="ttname"><a href="_onnx_parser_8hpp.xhtml">OnnxParser.hpp</a></div></div>
<div class="ttc" id="classarmnn_1_1_i_output_slot_xhtml_a5ee4a6c9a2481245487b1b1a70d20fd0"><div class="ttname"><a href="classarmnn_1_1_i_output_slot.xhtml#a5ee4a6c9a2481245487b1b1a70d20fd0">armnn::IOutputSlot::SetTensorInfo</a></div><div class="ttdeci">virtual void SetTensorInfo(const TensorInfo &amp;tensorInfo)=0</div></div>
<div class="ttc" id="classarmnn_onnx_parser_1_1_onnx_parser_impl_xhtml_aa09a8bb02eed50715082d8b7fccd2f8d"><div class="ttname"><a href="classarmnn_onnx_parser_1_1_onnx_parser_impl.xhtml#aa09a8bb02eed50715082d8b7fccd2f8d">armnnOnnxParser::OnnxParserImpl::GetVersion</a></div><div class="ttdeci">static const std::string GetVersion()</div><div class="ttdoc">Retrieve version in X.Y.Z form. </div><div class="ttdef"><b>Definition:</b> <a href="_onnx_parser_8cpp_source.xhtml#l01855">OnnxParser.cpp:1855</a></div></div>
<div class="ttc" id="_numeric_cast_8hpp_xhtml"><div class="ttname"><a href="_numeric_cast_8hpp.xhtml">NumericCast.hpp</a></div></div>
<div class="ttc" id="classarmnn_onnx_parser_1_1_onnx_parser_impl_xhtml_a7cf8b801043e1eccd5e6db1325eaa4fe"><div class="ttname"><a href="classarmnn_onnx_parser_1_1_onnx_parser_impl.xhtml#a7cf8b801043e1eccd5e6db1325eaa4fe">armnnOnnxParser::OnnxParserImpl::GetInputs</a></div><div class="ttdeci">static std::vector&lt; std::string &gt; GetInputs(ModelPtr &amp;model)</div><div class="ttdoc">Retrieve inputs names. </div><div class="ttdef"><b>Definition:</b> <a href="_onnx_parser_8cpp_source.xhtml#l01816">OnnxParser.cpp:1816</a></div></div>
<div class="ttc" id="classarmnn_1_1_tensor_info_xhtml_abe8889e8150beef5fd204b2d87b49298"><div class="ttname"><a href="classarmnn_1_1_tensor_info.xhtml#abe8889e8150beef5fd204b2d87b49298">armnn::TensorInfo::SetShape</a></div><div class="ttdeci">void SetShape(const TensorShape &amp;newShape)</div><div class="ttdef"><b>Definition:</b> <a href="_tensor_8hpp_source.xhtml#l00189">Tensor.hpp:189</a></div></div>
<div class="ttc" id="structarmnn_1_1_reshape_descriptor_xhtml_a1178f4dafdda81f59c15145ec327f7d9"><div class="ttname"><a href="structarmnn_1_1_reshape_descriptor.xhtml#a1178f4dafdda81f59c15145ec327f7d9">armnn::ReshapeDescriptor::m_TargetShape</a></div><div class="ttdeci">TensorShape m_TargetShape</div><div class="ttdoc">Target shape value. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l00848">Descriptors.hpp:848</a></div></div>
<div class="ttc" id="structarmnn_1_1_pooling2d_descriptor_xhtml_a5699e8606c37d18c03910b242cd1b010"><div class="ttname"><a href="structarmnn_1_1_pooling2d_descriptor.xhtml#a5699e8606c37d18c03910b242cd1b010">armnn::Pooling2dDescriptor::m_PoolHeight</a></div><div class="ttdeci">uint32_t m_PoolHeight</div><div class="ttdoc">Pooling height value. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l00375">Descriptors.hpp:375</a></div></div>
<div class="ttc" id="structarmnn_1_1_convolution2d_descriptor_xhtml_a56b51f56cef50cdfa554258eecdab046"><div class="ttname"><a href="structarmnn_1_1_convolution2d_descriptor.xhtml#a56b51f56cef50cdfa554258eecdab046">armnn::Convolution2dDescriptor::m_PadTop</a></div><div class="ttdeci">uint32_t m_PadTop</div><div class="ttdoc">Padding top value in the height dimension. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l00442">Descriptors.hpp:442</a></div></div>
<div class="ttc" id="structarmnn_1_1_convolution2d_descriptor_xhtml_afe6a3377c4531315354def9023c8fdda"><div class="ttname"><a href="structarmnn_1_1_convolution2d_descriptor.xhtml#afe6a3377c4531315354def9023c8fdda">armnn::Convolution2dDescriptor::m_StrideX</a></div><div class="ttdeci">uint32_t m_StrideX</div><div class="ttdoc">Stride value when proceeding through input for the width dimension. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l00446">Descriptors.hpp:446</a></div></div>
<div class="ttc" id="namespacearmnn_onnx_parser_xhtml_a503ae4f55dae1486e53978657083b35d"><div class="ttname"><a href="namespacearmnn_onnx_parser.xhtml#a503ae4f55dae1486e53978657083b35d">armnnOnnxParser::ModelPtr</a></div><div class="ttdeci">std::unique_ptr&lt; onnx::ModelProto &gt; ModelPtr</div><div class="ttdef"><b>Definition:</b> <a href="_onnx_parser_8hpp_source.xhtml#l00023">OnnxParser.hpp:23</a></div></div>
<div class="ttc" id="classarmnn_onnx_parser_1_1_onnx_parser_impl_xhtml_aaf4ce461aa35597cf80954314a3cb0e1"><div class="ttname"><a href="classarmnn_onnx_parser_1_1_onnx_parser_impl.xhtml#aaf4ce461aa35597cf80954314a3cb0e1">armnnOnnxParser::OnnxParserImpl::CreateNetworkFromTextFile</a></div><div class="ttdeci">armnn::INetworkPtr CreateNetworkFromTextFile(const char *graphFile)</div><div class="ttdoc">Create the network from a protobuf text file on disk. </div><div class="ttdef"><b>Definition:</b> <a href="_onnx_parser_8cpp_source.xhtml#l00566">OnnxParser.cpp:566</a></div></div>
<div class="ttc" id="classarmnn_onnx_parser_1_1_onnx_parser_impl_xhtml_ad116319e33228bc23ec505887d3eee4d"><div class="ttname"><a href="classarmnn_onnx_parser_1_1_onnx_parser_impl.xhtml#ad116319e33228bc23ec505887d3eee4d">armnnOnnxParser::OnnxParserImpl::GetOutputs</a></div><div class="ttdeci">static std::vector&lt; std::string &gt; GetOutputs(ModelPtr &amp;model)</div><div class="ttdoc">Retrieve outputs names. </div><div class="ttdef"><b>Definition:</b> <a href="_onnx_parser_8cpp_source.xhtml#l01840">OnnxParser.cpp:1840</a></div></div>
<div class="ttc" id="_verification_helpers_8hpp_xhtml"><div class="ttname"><a href="_verification_helpers_8hpp.xhtml">VerificationHelpers.hpp</a></div></div>
<div class="ttc" id="namespacearmnn_xhtml_ad8ed01ff3ff33333d8e19db4d2818bb6"><div class="ttname"><a href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6">armnn::DataType</a></div><div class="ttdeci">DataType</div><div class="ttdef"><b>Definition:</b> <a href="_types_8hpp_source.xhtml#l00032">Types.hpp:32</a></div></div>
<div class="ttc" id="structarmnn_1_1_pooling2d_descriptor_xhtml_a002bc30e590d78cbb4f4d12171055ca7"><div class="ttname"><a href="structarmnn_1_1_pooling2d_descriptor.xhtml#a002bc30e590d78cbb4f4d12171055ca7">armnn::Pooling2dDescriptor::m_PadRight</a></div><div class="ttdeci">uint32_t m_PadRight</div><div class="ttdoc">Padding right value in the width dimension. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l00367">Descriptors.hpp:367</a></div></div>
<div class="ttc" id="classarmnn_1_1_i_output_slot_xhtml"><div class="ttname"><a href="classarmnn_1_1_i_output_slot.xhtml">armnn::IOutputSlot</a></div><div class="ttdoc">An output connection slot for a layer. </div><div class="ttdef"><b>Definition:</b> <a href="_i_network_8hpp_source.xhtml#l00038">INetwork.hpp:38</a></div></div>
<div class="ttc" id="classarmnn_onnx_parser_1_1_onnx_parser_impl_xhtml_aed935c554e4f6a4e7b9dcde057d00877"><div class="ttname"><a href="classarmnn_onnx_parser_1_1_onnx_parser_impl.xhtml#aed935c554e4f6a4e7b9dcde057d00877">armnnOnnxParser::OnnxParserImpl::CreateNetworkFromBinaryFile</a></div><div class="ttdeci">armnn::INetworkPtr CreateNetworkFromBinaryFile(const char *graphFile)</div><div class="ttdoc">Create the network from a protobuf binary file on disk. </div><div class="ttdef"><b>Definition:</b> <a href="_onnx_parser_8cpp_source.xhtml#l00602">OnnxParser.cpp:602</a></div></div>
<div class="ttc" id="structarmnn_1_1_fully_connected_descriptor_xhtml"><div class="ttname"><a href="structarmnn_1_1_fully_connected_descriptor.xhtml">armnn::FullyConnectedDescriptor</a></div><div class="ttdoc">A FullyConnectedDescriptor for the FullyConnectedLayer. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l00389">Descriptors.hpp:389</a></div></div>
<div class="ttc" id="structarmnn_1_1_fully_connected_descriptor_xhtml_aea202e14d8874cefd9a0f778022b7e25"><div class="ttname"><a href="structarmnn_1_1_fully_connected_descriptor.xhtml#aea202e14d8874cefd9a0f778022b7e25">armnn::FullyConnectedDescriptor::m_BiasEnabled</a></div><div class="ttdeci">bool m_BiasEnabled</div><div class="ttdoc">Enable/disable bias. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l00402">Descriptors.hpp:402</a></div></div>
<div class="ttc" id="classarmnn_1_1_const_tensor_xhtml"><div class="ttname"><a href="classarmnn_1_1_const_tensor.xhtml">armnn::ConstTensor</a></div><div class="ttdoc">A tensor defined by a TensorInfo (shape and data type) and an immutable backing store. </div><div class="ttdef"><b>Definition:</b> <a href="_tensor_8hpp_source.xhtml#l00314">Tensor.hpp:314</a></div></div>
<div class="ttc" id="structarmnn_1_1_check_location_xhtml"><div class="ttname"><a href="structarmnn_1_1_check_location.xhtml">armnn::CheckLocation</a></div><div class="ttdef"><b>Definition:</b> <a href="_exceptions_8hpp_source.xhtml#l00014">Exceptions.hpp:14</a></div></div>
<div class="ttc" id="_verification_helpers_8hpp_xhtml_a479b2821a7a2cbb8fa8eb7f60a47065d"><div class="ttname"><a href="_verification_helpers_8hpp.xhtml#a479b2821a7a2cbb8fa8eb7f60a47065d">CHECK_VALID_SIZE</a></div><div class="ttdeci">#define CHECK_VALID_SIZE(ACTUAL,...)</div><div class="ttdef"><b>Definition:</b> <a href="_verification_helpers_8hpp_source.xhtml#l00032">VerificationHelpers.hpp:32</a></div></div>
<div class="ttc" id="classarmnn_onnx_parser_1_1_i_onnx_parser_xhtml"><div class="ttname"><a href="classarmnn_onnx_parser_1_1_i_onnx_parser.xhtml">armnnOnnxParser::IOnnxParser</a></div><div class="ttdef"><b>Definition:</b> <a href="_i_onnx_parser_8hpp_source.xhtml#l00023">IOnnxParser.hpp:23</a></div></div>
<div class="ttc" id="_verification_helpers_8hpp_xhtml_aaef93dc9a69f51b59f3cdd0ff0165927"><div class="ttname"><a href="_verification_helpers_8hpp.xhtml#aaef93dc9a69f51b59f3cdd0ff0165927">CHECKED_NON_NEGATIVE</a></div><div class="ttdeci">#define CHECKED_NON_NEGATIVE(VALUE)</div><div class="ttdef"><b>Definition:</b> <a href="_verification_helpers_8hpp_source.xhtml#l00035">VerificationHelpers.hpp:35</a></div></div>
<div class="ttc" id="classarmnn_onnx_parser_1_1_onnx_parser_impl_xhtml_a181f87cf45fdc9f040a41c985ce7f8cd"><div class="ttname"><a href="classarmnn_onnx_parser_1_1_onnx_parser_impl.xhtml#a181f87cf45fdc9f040a41c985ce7f8cd">armnnOnnxParser::OnnxParserImpl::LoadModelFromString</a></div><div class="ttdeci">static ModelPtr LoadModelFromString(const std::string &amp;inputString)</div><div class="ttdef"><b>Definition:</b> <a href="_onnx_parser_8cpp_source.xhtml#l00609">OnnxParser.cpp:609</a></div></div>
<div class="ttc" id="namespacearmnn_tf_parser_xhtml_aca0a31de02d5c087029bb28c9202b4d6"><div class="ttname"><a href="namespacearmnn_tf_parser.xhtml#aca0a31de02d5c087029bb28c9202b4d6">armnnTfParser::CalcPadding</a></div><div class="ttdeci">void CalcPadding(uint32_t inputSize, uint32_t filterSize, uint32_t stride, uint32_t dilation, uint32_t &amp;paddingFront, uint32_t &amp;paddingBack, bool samePadding)</div><div class="ttdef"><b>Definition:</b> <a href="_tf_parser_8cpp_source.xhtml#l00429">TfParser.cpp:429</a></div></div>
<div class="ttc" id="_assert_8hpp_xhtml_a5698be69cbd5dfe6c28fcd9867e8cbed"><div class="ttname"><a href="_assert_8hpp.xhtml#a5698be69cbd5dfe6c28fcd9867e8cbed">ARMNN_ASSERT</a></div><div class="ttdeci">#define ARMNN_ASSERT(COND)</div><div class="ttdef"><b>Definition:</b> <a href="_assert_8hpp_source.xhtml#l00014">Assert.hpp:14</a></div></div>
<div class="ttc" id="structarmnn_1_1_activation_descriptor_xhtml"><div class="ttname"><a href="structarmnn_1_1_activation_descriptor.xhtml">armnn::ActivationDescriptor</a></div><div class="ttdoc">An ActivationDescriptor for the ActivationLayer. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l00025">Descriptors.hpp:25</a></div></div>
<div class="ttc" id="classarmnn_1_1_invalid_argument_exception_xhtml"><div class="ttname"><a href="classarmnn_1_1_invalid_argument_exception.xhtml">armnn::InvalidArgumentException</a></div><div class="ttdef"><b>Definition:</b> <a href="_exceptions_8hpp_source.xhtml#l00080">Exceptions.hpp:80</a></div></div>
<div class="ttc" id="_exceptions_8hpp_xhtml_aa3be76aec4ce713822a5ea1ecbb7bc61"><div class="ttname"><a href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a></div><div class="ttdeci">#define CHECK_LOCATION()</div><div class="ttdef"><b>Definition:</b> <a href="_exceptions_8hpp_source.xhtml#l00197">Exceptions.hpp:197</a></div></div>
<div class="ttc" id="classarmnn_onnx_parser_1_1_onnx_parser_impl_xhtml_a975a79b9b35d51ea81c42c05d245e7c0"><div class="ttname"><a href="classarmnn_onnx_parser_1_1_onnx_parser_impl.xhtml#a975a79b9b35d51ea81c42c05d245e7c0">armnnOnnxParser::OnnxParserImpl::LoadModelFromTextFile</a></div><div class="ttdeci">static ModelPtr LoadModelFromTextFile(const char *fileName)</div><div class="ttdef"><b>Definition:</b> <a href="_onnx_parser_8cpp_source.xhtml#l00541">OnnxParser.cpp:541</a></div></div>
<div class="ttc" id="structarmnn_1_1_convolution2d_descriptor_xhtml_ac1fe174bbadfb39a2b636940c2e647c8"><div class="ttname"><a href="structarmnn_1_1_convolution2d_descriptor.xhtml#ac1fe174bbadfb39a2b636940c2e647c8">armnn::Convolution2dDescriptor::m_StrideY</a></div><div class="ttdeci">uint32_t m_StrideY</div><div class="ttdoc">Stride value when proceeding through input for the height dimension. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l00448">Descriptors.hpp:448</a></div></div>
<div class="ttc" id="structarmnn_1_1_activation_descriptor_xhtml_a017b2990003a014234f13e999dc7c689"><div class="ttname"><a href="structarmnn_1_1_activation_descriptor.xhtml#a017b2990003a014234f13e999dc7c689">armnn::ActivationDescriptor::m_A</a></div><div class="ttdeci">float m_A</div><div class="ttdoc">Alpha upper bound value used by the activation functions. (BoundedReLu, Linear, TanH, Elu). </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l00050">Descriptors.hpp:50</a></div></div>
<div class="ttc" id="structarmnn_1_1_convolution2d_descriptor_xhtml_aa3c6a77a963a98ccb8ea7b8fd008a8c1"><div class="ttname"><a href="structarmnn_1_1_convolution2d_descriptor.xhtml#aa3c6a77a963a98ccb8ea7b8fd008a8c1">armnn::Convolution2dDescriptor::m_DilationX</a></div><div class="ttdeci">uint32_t m_DilationX</div><div class="ttdoc">Dilation along x axis. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l00450">Descriptors.hpp:450</a></div></div>
<div class="ttc" id="_assert_8hpp_xhtml"><div class="ttname"><a href="_assert_8hpp.xhtml">Assert.hpp</a></div></div>
<div class="ttc" id="structarmnn_1_1_empty_optional_xhtml"><div class="ttname"><a href="structarmnn_1_1_empty_optional.xhtml">armnn::EmptyOptional</a></div><div class="ttdoc">EmptyOptional is used to initialize the Optional class in case we want to have default value for an O...</div><div class="ttdef"><b>Definition:</b> <a href="_optional_8hpp_source.xhtml#l00032">Optional.hpp:32</a></div></div>
<div class="ttc" id="classarmnn_1_1_parse_exception_xhtml"><div class="ttname"><a href="classarmnn_1_1_parse_exception.xhtml">armnn::ParseException</a></div><div class="ttdef"><b>Definition:</b> <a href="_exceptions_8hpp_source.xhtml#l00092">Exceptions.hpp:92</a></div></div>
<div class="ttc" id="namespacearmnn_onnx_parser_xhtml"><div class="ttname"><a href="namespacearmnn_onnx_parser.xhtml">armnnOnnxParser</a></div><div class="ttdef"><b>Definition:</b> <a href="_i_onnx_parser_8hpp_source.xhtml#l00014">IOnnxParser.hpp:14</a></div></div>
<div class="ttc" id="structarmnn_1_1_pooling2d_descriptor_xhtml_a0031997bf43bd2747656c31e4977793a"><div class="ttname"><a href="structarmnn_1_1_pooling2d_descriptor.xhtml#a0031997bf43bd2747656c31e4977793a">armnn::Pooling2dDescriptor::m_PoolType</a></div><div class="ttdeci">PoolingAlgorithm m_PoolType</div><div class="ttdoc">The pooling algorithm to use (Max. Average, L2). </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l00363">Descriptors.hpp:363</a></div></div>
<div class="ttc" id="namespacearmnn_xhtml_a4dc0adc6737b5944e7671bee71788407acaf9b6b99962bf5c2264824231d7a40c"><div class="ttname"><a href="namespacearmnn.xhtml#a4dc0adc6737b5944e7671bee71788407acaf9b6b99962bf5c2264824231d7a40c">armnn::BoostLogSeverityMapping::info</a></div></div>
<div class="ttc" id="_descriptors_8hpp_xhtml"><div class="ttname"><a href="_descriptors_8hpp.xhtml">Descriptors.hpp</a></div></div>
<div class="ttc" id="_onnx_parser_8cpp_xhtml_a5426a7adb280d1739cc6d66fe9ac1b9c"><div class="ttname"><a href="_onnx_parser_8cpp.xhtml#a5426a7adb280d1739cc6d66fe9ac1b9c">STR_LIST</a></div><div class="ttdeci">#define STR_LIST(...)</div><div class="ttdef"><b>Definition:</b> <a href="_onnx_parser_8cpp_source.xhtml#l00099">OnnxParser.cpp:99</a></div></div>
<div class="ttc" id="classarmnn_1_1_tensor_shape_xhtml_a157e27d41e9f6b21f0d3c025fa47dc24"><div class="ttname"><a href="classarmnn_1_1_tensor_shape.xhtml#a157e27d41e9f6b21f0d3c025fa47dc24">armnn::TensorShape::GetNumDimensions</a></div><div class="ttdeci">unsigned int GetNumDimensions() const</div><div class="ttdoc">Function that returns the tensor rank. </div><div class="ttdef"><b>Definition:</b> <a href="_tensor_8cpp_source.xhtml#l00174">Tensor.cpp:174</a></div></div>
<div class="ttc" id="structarmnn_1_1_pooling2d_descriptor_xhtml_affb5b68b3eba3ed45a06c7cde7781962"><div class="ttname"><a href="structarmnn_1_1_pooling2d_descriptor.xhtml#affb5b68b3eba3ed45a06c7cde7781962">armnn::Pooling2dDescriptor::m_OutputShapeRounding</a></div><div class="ttdeci">OutputShapeRounding m_OutputShapeRounding</div><div class="ttdoc">The rounding method for the output shape. (Floor, Ceiling). </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l00381">Descriptors.hpp:381</a></div></div>
<div class="ttc" id="classarmnn_1_1_i_connectable_layer_xhtml_a6ec9e0eb66d7d6a01240492a0b18104c"><div class="ttname"><a href="classarmnn_1_1_i_connectable_layer.xhtml#a6ec9e0eb66d7d6a01240492a0b18104c">armnn::IConnectableLayer::GetInputSlot</a></div><div class="ttdeci">virtual const IInputSlot &amp; GetInputSlot(unsigned int index) const =0</div><div class="ttdoc">Get a const input slot handle by slot index. </div></div>
<div class="ttc" id="namespacearmnn_xhtml_a375ca3cff9f1b005d1412dc5f3cf5b6e"><div class="ttname"><a href="namespacearmnn.xhtml#a375ca3cff9f1b005d1412dc5f3cf5b6e">armnn::numeric_cast</a></div><div class="ttdeci">std::enable_if_t&lt; std::is_unsigned&lt; Source &gt;::value &amp;&amp;std::is_unsigned&lt; Dest &gt;::value, Dest &gt; numeric_cast(Source source)</div><div class="ttdef"><b>Definition:</b> <a href="_numeric_cast_8hpp_source.xhtml#l00035">NumericCast.hpp:35</a></div></div>
<div class="ttc" id="namespacearmnn_deserializer_xhtml_a948b8c615ff06defa3b80d2352259ff2"><div class="ttname"><a href="namespacearmnn_deserializer.xhtml#a948b8c615ff06defa3b80d2352259ff2">armnnDeserializer::ToTensorInfo</a></div><div class="ttdeci">armnn::TensorInfo ToTensorInfo(TensorRawPtr tensorPtr)</div><div class="ttdef"><b>Definition:</b> <a href="_deserializer_8cpp_source.xhtml#l00568">Deserializer.cpp:568</a></div></div>
<div class="ttc" id="classarmnn_1_1_i_connectable_layer_xhtml_a80ac4eda2e7f2757ec9dd96fc96dbd16"><div class="ttname"><a href="classarmnn_1_1_i_connectable_layer.xhtml#a80ac4eda2e7f2757ec9dd96fc96dbd16">armnn::IConnectableLayer::GetOutputSlot</a></div><div class="ttdeci">virtual const IOutputSlot &amp; GetOutputSlot(unsigned int index) const =0</div><div class="ttdoc">Get the const output slot handle by slot index. </div></div>
<div class="ttc" id="include_2armnn_onnx_parser_2_version_8hpp_xhtml"><div class="ttname"><a href="include_2armnn_onnx_parser_2_version_8hpp.xhtml">Version.hpp</a></div></div>
<div class="ttc" id="namespacearmnn_xhtml_ace74f6f9feb95a964a49d79458232703"><div class="ttname"><a href="namespacearmnn.xhtml#ace74f6f9feb95a964a49d79458232703">armnn::INetworkPtr</a></div><div class="ttdeci">std::unique_ptr&lt; INetwork, void(*)(INetwork *network)&gt; INetworkPtr</div><div class="ttdef"><b>Definition:</b> <a href="_i_network_8hpp_source.xhtml#l00173">INetwork.hpp:173</a></div></div>
<div class="ttc" id="_onnx_parser_8cpp_xhtml_a71cae957feb9162183d6f62fd549ffe1"><div class="ttname"><a href="_onnx_parser_8cpp.xhtml#a71cae957feb9162183d6f62fd549ffe1">CHECK_VALID_DATATYPE</a></div><div class="ttdeci">#define CHECK_VALID_DATATYPE(NODE, TENSOR, ACTUAL,...)</div><div class="ttdef"><b>Definition:</b> <a href="_onnx_parser_8cpp_source.xhtml#l00095">OnnxParser.cpp:95</a></div></div>
<div class="ttc" id="classarmnn_1_1_i_connectable_layer_xhtml_aa6e3c075c888e7c16942a468a3aae33c"><div class="ttname"><a href="classarmnn_1_1_i_connectable_layer.xhtml#aa6e3c075c888e7c16942a468a3aae33c">armnn::IConnectableLayer::InferOutputShapes</a></div><div class="ttdeci">virtual std::vector&lt; TensorShape &gt; InferOutputShapes(const std::vector&lt; TensorShape &gt; &amp;inputShapes) const =0</div><div class="ttdoc">Infer the shape of the output(s) based on the provided input shape(s) </div></div>
<div class="ttc" id="namespacearmnn_onnx_parser_xhtml_a9084adbf804022c874039ad40d1939e9"><div class="ttname"><a href="namespacearmnn_onnx_parser.xhtml#a9084adbf804022c874039ad40d1939e9">armnnOnnxParser::BindingPointInfo</a></div><div class="ttdeci">armnn::BindingPointInfo BindingPointInfo</div><div class="ttdef"><b>Definition:</b> <a href="_i_onnx_parser_8hpp_source.xhtml#l00017">IOnnxParser.hpp:17</a></div></div>
<div class="ttc" id="classarmnn_onnx_parser_1_1_onnx_parser_impl_xhtml_a30c0c947bb15e86ee6d535ecd934c0a6"><div class="ttname"><a href="classarmnn_onnx_parser_1_1_onnx_parser_impl.xhtml#a30c0c947bb15e86ee6d535ecd934c0a6">armnnOnnxParser::OnnxParserImpl::CreateNetworkFromString</a></div><div class="ttdeci">armnn::INetworkPtr CreateNetworkFromString(const std::string &amp;protoText)</div><div class="ttdoc">Create the network directly from protobuf text in a string. Useful for debugging/testing. </div><div class="ttdef"><b>Definition:</b> <a href="_onnx_parser_8cpp_source.xhtml#l00628">OnnxParser.cpp:628</a></div></div>
<div class="ttc" id="_verification_helpers_8hpp_xhtml_aa693ef8620e450b6362938828002f2a6"><div class="ttname"><a href="_verification_helpers_8hpp.xhtml#aa693ef8620e450b6362938828002f2a6">CHECKED_INT32</a></div><div class="ttdeci">#define CHECKED_INT32(VALUE)</div><div class="ttdef"><b>Definition:</b> <a href="_verification_helpers_8hpp_source.xhtml#l00030">VerificationHelpers.hpp:30</a></div></div>
<div class="ttc" id="structarmnn_1_1_pooling2d_descriptor_xhtml"><div class="ttname"><a href="structarmnn_1_1_pooling2d_descriptor.xhtml">armnn::Pooling2dDescriptor</a></div><div class="ttdoc">A Pooling2dDescriptor for the Pooling2dLayer. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l00329">Descriptors.hpp:329</a></div></div>
<div class="ttc" id="include_2armnn_onnx_parser_2_version_8hpp_xhtml_a91718cb27a114419c34ce33827e94321"><div class="ttname"><a href="include_2armnn_onnx_parser_2_version_8hpp.xhtml#a91718cb27a114419c34ce33827e94321">ONNX_PARSER_VERSION</a></div><div class="ttdeci">#define ONNX_PARSER_VERSION</div><div class="ttdoc">ONNX_PARSER_VERSION: &quot;X.Y.Z&quot; where: X = Major version number Y = Minor version number Z = Patch versi...</div><div class="ttdef"><b>Definition:</b> <a href="include_2armnn_onnx_parser_2_version_8hpp_source.xhtml#l00025">Version.hpp:25</a></div></div>
<div class="ttc" id="namespacearmnn_onnx_parser_xhtml_ac7dfccab29feeb5f33f1ec0183c1e123"><div class="ttname"><a href="namespacearmnn_onnx_parser.xhtml#ac7dfccab29feeb5f33f1ec0183c1e123">armnnOnnxParser::IOnnxParserPtr</a></div><div class="ttdeci">std::unique_ptr&lt; IOnnxParser, void(*)(IOnnxParser *parser)&gt; IOnnxParserPtr</div><div class="ttdef"><b>Definition:</b> <a href="_i_onnx_parser_8hpp_source.xhtml#l00021">IOnnxParser.hpp:21</a></div></div>
<div class="ttc" id="classarmnn_onnx_parser_1_1_onnx_parser_impl_xhtml_acf9c6119ceb99755bc1f86c5a325c796"><div class="ttname"><a href="classarmnn_onnx_parser_1_1_onnx_parser_impl.xhtml#acf9c6119ceb99755bc1f86c5a325c796">armnnOnnxParser::OnnxParserImpl::LoadModelFromBinaryFile</a></div><div class="ttdeci">static ModelPtr LoadModelFromBinaryFile(const char *fileName)</div><div class="ttdef"><b>Definition:</b> <a href="_onnx_parser_8cpp_source.xhtml#l00574">OnnxParser.cpp:574</a></div></div>
<div class="ttc" id="structarmnn_1_1_activation_descriptor_xhtml_a28c4c9cb15f6be3499abbc46b356060b"><div class="ttname"><a href="structarmnn_1_1_activation_descriptor.xhtml#a28c4c9cb15f6be3499abbc46b356060b">armnn::ActivationDescriptor::m_B</a></div><div class="ttdeci">float m_B</div><div class="ttdoc">Beta lower bound value used by the activation functions. (BoundedReLu, Linear, TanH). </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l00052">Descriptors.hpp:52</a></div></div>
<div class="ttc" id="structarmnn_1_1_activation_descriptor_xhtml_af10fa7883e3579950f477bee92a64844"><div class="ttname"><a href="structarmnn_1_1_activation_descriptor.xhtml#af10fa7883e3579950f477bee92a64844">armnn::ActivationDescriptor::m_Function</a></div><div class="ttdeci">ActivationFunction m_Function</div><div class="ttdoc">The activation function to use (Sigmoid, TanH, Linear, ReLu, BoundedReLu, SoftReLu, LeakyReLu, Abs, Sqrt, Square, Elu). </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l00048">Descriptors.hpp:48</a></div></div>
<div class="ttc" id="classarmnn_1_1_i_input_slot_xhtml"><div class="ttname"><a href="classarmnn_1_1_i_input_slot.xhtml">armnn::IInputSlot</a></div><div class="ttdoc">An input connection slot for a layer. </div><div class="ttdef"><b>Definition:</b> <a href="_i_network_8hpp_source.xhtml#l00025">INetwork.hpp:25</a></div></div>
<div class="ttc" id="structarmnn_1_1_pooling2d_descriptor_xhtml_ac1fe174bbadfb39a2b636940c2e647c8"><div class="ttname"><a href="structarmnn_1_1_pooling2d_descriptor.xhtml#ac1fe174bbadfb39a2b636940c2e647c8">armnn::Pooling2dDescriptor::m_StrideY</a></div><div class="ttdeci">uint32_t m_StrideY</div><div class="ttdoc">Stride value when proceeding through input for the height dimension. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l00379">Descriptors.hpp:379</a></div></div>
<div class="ttc" id="structarmnn_1_1_depthwise_convolution2d_descriptor_xhtml"><div class="ttname"><a href="structarmnn_1_1_depthwise_convolution2d_descriptor.xhtml">armnn::DepthwiseConvolution2dDescriptor</a></div><div class="ttdoc">A DepthwiseConvolution2dDescriptor for the DepthwiseConvolution2dLayer. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l00460">Descriptors.hpp:460</a></div></div>
<div class="ttc" id="structarmnn_1_1_batch_normalization_descriptor_xhtml"><div class="ttname"><a href="structarmnn_1_1_batch_normalization_descriptor.xhtml">armnn::BatchNormalizationDescriptor</a></div><div class="ttdoc">A BatchNormalizationDescriptor for the BatchNormalizationLayer. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l00626">Descriptors.hpp:626</a></div></div>
<div class="ttc" id="structarmnn_1_1_convolution2d_descriptor_xhtml_ac18546ebbebbb32fe0a03baa9bf2c600"><div class="ttname"><a href="structarmnn_1_1_convolution2d_descriptor.xhtml#ac18546ebbebbb32fe0a03baa9bf2c600">armnn::Convolution2dDescriptor::m_PadLeft</a></div><div class="ttdeci">uint32_t m_PadLeft</div><div class="ttdoc">Padding left value in the width dimension. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l00438">Descriptors.hpp:438</a></div></div>
<div class="ttc" id="classarmnn_1_1_tensor_info_xhtml_a8846406ac37fbd2204f0be16ee05d5b7"><div class="ttname"><a href="classarmnn_1_1_tensor_info.xhtml#a8846406ac37fbd2204f0be16ee05d5b7">armnn::TensorInfo::GetNumElements</a></div><div class="ttdeci">unsigned int GetNumElements() const</div><div class="ttdef"><b>Definition:</b> <a href="_tensor_8hpp_source.xhtml#l00192">Tensor.hpp:192</a></div></div>
<div class="ttc" id="namespacearmnn_xhtml_a56297e0f7b215eea46c818cb7528d9ea"><div class="ttname"><a href="namespacearmnn.xhtml#a56297e0f7b215eea46c818cb7528d9ea">armnn::ActivationFunction</a></div><div class="ttdeci">ActivationFunction</div><div class="ttdef"><b>Definition:</b> <a href="_types_8hpp_source.xhtml#l00056">Types.hpp:56</a></div></div>
</div><!-- fragment --></div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
  <ul>
    <li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.xhtml">src</a></li><li class="navelem"><a class="el" href="dir_29e3193d5087607956cb928081b12830.xhtml">armnnOnnxParser</a></li><li class="navelem"><a class="el" href="_onnx_parser_8cpp.xhtml">OnnxParser.cpp</a></li>
    <li class="footer">Generated on Fri Mar 19 2021 15:25:37 for ArmNN by
    <a href="http://www.doxygen.org/index.html">
    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
  </ul>
</div>
</body>
</html>