aboutsummaryrefslogtreecommitdiff
path: root/21.02/_tf_parser_8cpp_source.xhtml
blob: ae2a5a37d0867a893136515e1d37143885bbbccd (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
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
<!-- 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/armnnTfParser/TfParser.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('_tf_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">TfParser.cpp</div>  </div>
</div><!--header-->
<div class="contents">
<a href="_tf_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 and Contributors. 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;</div><div class="line"><a name="l00006"></a><span class="lineno">    6</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="_tf_parser_8hpp.xhtml">TfParser.hpp</a>&quot;</span></div><div class="line"><a name="l00007"></a><span class="lineno">    7</span>&#160;</div><div class="line"><a name="l00008"></a><span class="lineno">    8</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="include_2armnn_tf_parser_2_version_8hpp.xhtml">armnnTfParser/Version.hpp</a>&quot;</span></div><div class="line"><a name="l00009"></a><span class="lineno">    9</span>&#160;</div><div class="line"><a name="l00010"></a><span class="lineno">   10</span>&#160;<span class="preprocessor">#include &lt;<a class="code" href="_types_utils_8hpp.xhtml">armnn/TypesUtils.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="_descriptors_8hpp.xhtml">armnn/Descriptors.hpp</a>&gt;</span></div><div class="line"><a name="l00012"></a><span class="lineno">   12</span>&#160;</div><div class="line"><a name="l00013"></a><span class="lineno">   13</span>&#160;<span class="preprocessor">#include &lt;<a class="code" href="_permute_8hpp.xhtml">armnnUtils/Permute.hpp</a>&gt;</span></div><div class="line"><a name="l00014"></a><span class="lineno">   14</span>&#160;<span class="preprocessor">#include &lt;<a class="code" href="_data_layout_indexed_8hpp.xhtml">armnnUtils/DataLayoutIndexed.hpp</a>&gt;</span></div><div class="line"><a name="l00015"></a><span class="lineno">   15</span>&#160;<span class="preprocessor">#include &lt;<a class="code" href="_transpose_8hpp.xhtml">armnnUtils/Transpose.hpp</a>&gt;</span></div><div class="line"><a name="l00016"></a><span class="lineno">   16</span>&#160;<span class="preprocessor">#include &lt;<a class="code" href="_ignore_unused_8hpp.xhtml">armnn/utility/IgnoreUnused.hpp</a>&gt;</span></div><div class="line"><a name="l00017"></a><span class="lineno">   17</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="l00018"></a><span class="lineno">   18</span>&#160;<span class="preprocessor">#include &lt;<a class="code" href="_polymorphic_downcast_8hpp.xhtml">armnn/utility/PolymorphicDowncast.hpp</a>&gt;</span></div><div class="line"><a name="l00019"></a><span class="lineno">   19</span>&#160;</div><div class="line"><a name="l00020"></a><span class="lineno">   20</span>&#160;<span class="preprocessor">#include &lt;<a class="code" href="_graph_topological_sort_8hpp.xhtml">GraphTopologicalSort.hpp</a>&gt;</span></div><div class="line"><a name="l00021"></a><span class="lineno">   21</span>&#160;<span class="preprocessor">#include &lt;<a class="code" href="_parser_helper_8hpp.xhtml">ParserHelper.hpp</a>&gt;</span></div><div class="line"><a name="l00022"></a><span class="lineno">   22</span>&#160;</div><div class="line"><a name="l00023"></a><span class="lineno">   23</span>&#160;<span class="preprocessor">#include &lt;google/protobuf/io/zero_copy_stream_impl.h&gt;</span></div><div class="line"><a name="l00024"></a><span class="lineno">   24</span>&#160;<span class="preprocessor">#include &lt;google/protobuf/text_format.h&gt;</span></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;<span class="preprocessor">#include &lt;tensorflow/core/framework/graph.pb.h&gt;</span></div><div class="line"><a name="l00027"></a><span class="lineno">   27</span>&#160;</div><div class="line"><a name="l00028"></a><span class="lineno">   28</span>&#160;<span class="preprocessor">#include &lt;fmt/core.h&gt;</span></div><div class="line"><a name="l00029"></a><span class="lineno">   29</span>&#160;<span class="preprocessor">#include &lt;fmt/format.h&gt;</span></div><div class="line"><a name="l00030"></a><span class="lineno">   30</span>&#160;<span class="preprocessor">#include &lt;iostream&gt;</span></div><div class="line"><a name="l00031"></a><span class="lineno">   31</span>&#160;<span class="preprocessor">#include &lt;numeric&gt;</span></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="keyword">using namespace </span><a class="code" href="namespacearmnn_utils.xhtml">armnnUtils</a>;</div><div class="line"><a name="l00034"></a><span class="lineno">   34</span>&#160;<span class="keyword">using namespace </span><a class="code" href="namespacearmnn.xhtml">armnn</a>;</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">   36</span>&#160;<span class="keyword">namespace </span><a class="code" href="namespacearmnn_tf_parser.xhtml">armnnTfParser</a></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;</div><div class="line"><a name="l00039"></a><span class="lineno">   39</span>&#160;ITfParser::ITfParser() : pTfParserImpl(new ITfParser::TfParserImpl()){}</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">   41</span>&#160;ITfParser::~ITfParser() = <span class="keywordflow">default</span>;</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"><a class="line" href="classarmnn_tf_parser_1_1_i_tf_parser.xhtml#acef5ea7cde55834460c7d8c79d646242">   43</a></span>&#160;<a class="code" href="classarmnn_tf_parser_1_1_i_tf_parser.xhtml">ITfParser</a> *ITfParser::CreateRaw()</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;    <span class="keywordflow">return</span> <span class="keyword">new</span> <a class="code" href="classarmnn_tf_parser_1_1_i_tf_parser.xhtml">ITfParser</a>();</div><div class="line"><a name="l00046"></a><span class="lineno">   46</span>&#160;}</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"><a class="line" href="classarmnn_tf_parser_1_1_i_tf_parser.xhtml#a6abaf60481f0791c686ed3b97818bd0c">   48</a></span>&#160;<a class="code" href="namespacearmnn_tf_parser.xhtml#af7cec8b9a69e02f18a5de38502675d94">ITfParserPtr</a> ITfParser::Create()</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;    <span class="keywordflow">return</span> <a class="code" href="namespacearmnn_tf_parser.xhtml#af7cec8b9a69e02f18a5de38502675d94">ITfParserPtr</a>(CreateRaw(), &amp;ITfParser::Destroy);</div><div class="line"><a name="l00051"></a><span class="lineno">   51</span>&#160;}</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"><a class="line" href="classarmnn_tf_parser_1_1_i_tf_parser.xhtml#af462572a18d8158847b326970d42c246">   53</a></span>&#160;<span class="keywordtype">void</span> ITfParser::Destroy(<a class="code" href="classarmnn_tf_parser_1_1_i_tf_parser.xhtml">ITfParser</a> *parser)</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;    <span class="keyword">delete</span> parser;</div><div class="line"><a name="l00056"></a><span class="lineno">   56</span>&#160;}</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"><a class="line" href="classarmnn_tf_parser_1_1_i_tf_parser.xhtml#add49602ee9cd2bd16c1c4ccd25555d8e">   58</a></span>&#160;<a class="code" href="namespacearmnn.xhtml#ace74f6f9feb95a964a49d79458232703">armnn::INetworkPtr</a> ITfParser::CreateNetworkFromTextFile(<span class="keyword">const</span> <span class="keywordtype">char</span>* graphFile,</div><div class="line"><a name="l00059"></a><span class="lineno">   59</span>&#160;                                                        <span class="keyword">const</span> std::map&lt;std::string, armnn::TensorShape&gt;&amp; inputShapes,</div><div class="line"><a name="l00060"></a><span class="lineno">   60</span>&#160;                                                        <span class="keyword">const</span> std::vector&lt;std::string&gt;&amp; requestedOutputs)</div><div class="line"><a name="l00061"></a><span class="lineno">   61</span>&#160;{</div><div class="line"><a name="l00062"></a><span class="lineno">   62</span>&#160;    <span class="keywordflow">return</span> pTfParserImpl-&gt;<a class="code" href="classarmnn_tf_parser_1_1_i_tf_parser.xhtml#add49602ee9cd2bd16c1c4ccd25555d8e">CreateNetworkFromTextFile</a>(graphFile, inputShapes, requestedOutputs);</div><div class="line"><a name="l00063"></a><span class="lineno">   63</span>&#160;}</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"><a class="line" href="classarmnn_tf_parser_1_1_i_tf_parser.xhtml#a56e7dd134fad3b70cb926b447fe2d16e">   65</a></span>&#160;<a class="code" href="namespacearmnn.xhtml#ace74f6f9feb95a964a49d79458232703">armnn::INetworkPtr</a> ITfParser::CreateNetworkFromBinaryFile(<span class="keyword">const</span> <span class="keywordtype">char</span>* graphFile,</div><div class="line"><a name="l00066"></a><span class="lineno">   66</span>&#160;                                                          <span class="keyword">const</span> std::map&lt;std::string, armnn::TensorShape&gt;&amp; inputShapes,</div><div class="line"><a name="l00067"></a><span class="lineno">   67</span>&#160;                                                          <span class="keyword">const</span> std::vector&lt;std::string&gt;&amp; requestedOutputs)</div><div class="line"><a name="l00068"></a><span class="lineno">   68</span>&#160;{</div><div class="line"><a name="l00069"></a><span class="lineno">   69</span>&#160;    <span class="keywordflow">return</span> pTfParserImpl-&gt;CreateNetworkFromBinaryFile(graphFile, inputShapes, requestedOutputs);</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;</div><div class="line"><a name="l00072"></a><span class="lineno"><a class="line" href="classarmnn_tf_parser_1_1_i_tf_parser.xhtml#a5448fd503a576d279c71aa8340e84b7f">   72</a></span>&#160;<a class="code" href="namespacearmnn.xhtml#ace74f6f9feb95a964a49d79458232703">armnn::INetworkPtr</a> ITfParser::CreateNetworkFromString(<span class="keyword">const</span> <span class="keywordtype">char</span>* protoText,</div><div class="line"><a name="l00073"></a><span class="lineno">   73</span>&#160;                                                      <span class="keyword">const</span> std::map&lt;std::string, armnn::TensorShape&gt;&amp; inputShapes,</div><div class="line"><a name="l00074"></a><span class="lineno">   74</span>&#160;                                                      <span class="keyword">const</span> std::vector&lt;std::string&gt;&amp; requestedOutputs)</div><div class="line"><a name="l00075"></a><span class="lineno">   75</span>&#160;{</div><div class="line"><a name="l00076"></a><span class="lineno">   76</span>&#160;    <span class="keywordflow">return</span> pTfParserImpl-&gt;CreateNetworkFromString(protoText, inputShapes, requestedOutputs);</div><div class="line"><a name="l00077"></a><span class="lineno">   77</span>&#160;}</div><div class="line"><a name="l00078"></a><span class="lineno">   78</span>&#160;</div><div class="line"><a name="l00079"></a><span class="lineno"><a class="line" href="classarmnn_tf_parser_1_1_i_tf_parser.xhtml#a8b053a6c449d0814cc831c916c126668">   79</a></span>&#160;<a class="code" href="namespacearmnn_tf_parser.xhtml#a9084adbf804022c874039ad40d1939e9">BindingPointInfo</a> ITfParser::GetNetworkInputBindingInfo(<span class="keyword">const</span> std::string&amp; name)<span class="keyword"> const</span></div><div class="line"><a name="l00080"></a><span class="lineno">   80</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l00081"></a><span class="lineno">   81</span>&#160;    <span class="keywordflow">return</span> pTfParserImpl-&gt;GetNetworkInputBindingInfo(name);</div><div class="line"><a name="l00082"></a><span class="lineno">   82</span>&#160;}</div><div class="line"><a name="l00083"></a><span class="lineno">   83</span>&#160;</div><div class="line"><a name="l00084"></a><span class="lineno"><a class="line" href="classarmnn_tf_parser_1_1_i_tf_parser.xhtml#a4b1fdcb1985af12dd1848a9ffa5d3271">   84</a></span>&#160;<a class="code" href="namespacearmnn_tf_parser.xhtml#a9084adbf804022c874039ad40d1939e9">BindingPointInfo</a> ITfParser::GetNetworkOutputBindingInfo(<span class="keyword">const</span> std::string&amp; name)<span class="keyword"> const</span></div><div class="line"><a name="l00085"></a><span class="lineno">   85</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l00086"></a><span class="lineno">   86</span>&#160;    <span class="keywordflow">return</span> pTfParserImpl-&gt;GetNetworkOutputBindingInfo(name);</div><div class="line"><a name="l00087"></a><span class="lineno">   87</span>&#160;}</div><div class="line"><a name="l00088"></a><span class="lineno">   88</span>&#160;<span class="keyword">namespace</span></div><div class="line"><a name="l00089"></a><span class="lineno">   89</span>&#160;{</div><div class="line"><a name="l00090"></a><span class="lineno">   90</span>&#160;</div><div class="line"><a name="l00091"></a><span class="lineno">   91</span>&#160;<span class="keyword">const</span> <a class="code" href="classarmnn_1_1_permutation_vector.xhtml">PermutationVector</a> <a class="code" href="namespacearmnn_utils.xhtml#a12124184ac6aec018beb98b9715330c7">NHWCToArmNN</a> = { 0, 2, 3, 1 };</div><div class="line"><a name="l00092"></a><span class="lineno">   92</span>&#160;<span class="keyword">const</span> <a class="code" href="classarmnn_1_1_permutation_vector.xhtml">PermutationVector</a> <a class="code" href="namespacearmnn_utils.xhtml#a59cbccbfbae7633020d200f8c23fe69e">ArmNNToNHWC</a> = { 0, 3, 1, 2 };</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">   95</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">typename</span> Callable&gt;</div><div class="line"><a name="l00096"></a><span class="lineno">   96</span>&#160;<span class="keywordtype">void</span> ReadMandatoryNodeAttributeImpl(<span class="keyword">const</span> tensorflow::NodeDef&amp; nodeDef,</div><div class="line"><a name="l00097"></a><span class="lineno">   97</span>&#160;    <span class="keyword">const</span> std::string&amp; attribName,</div><div class="line"><a name="l00098"></a><span class="lineno">   98</span>&#160;    tensorflow::AttrValue::ValueCase expectedValueCase,</div><div class="line"><a name="l00099"></a><span class="lineno">   99</span>&#160;    Callable callable)</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">auto</span> iter = nodeDef.attr().find(attribName);</div><div class="line"><a name="l00102"></a><span class="lineno">  102</span>&#160;    <span class="keywordflow">if</span> (iter != nodeDef.attr().end())</div><div class="line"><a name="l00103"></a><span class="lineno">  103</span>&#160;    {</div><div class="line"><a name="l00104"></a><span class="lineno">  104</span>&#160;        <span class="keyword">const</span> <span class="keyword">auto</span>&amp; attrValue = iter-&gt;second;</div><div class="line"><a name="l00105"></a><span class="lineno">  105</span>&#160;        <span class="keywordflow">if</span> (attrValue.value_case() == expectedValueCase)</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;            callable(attrValue);</div><div class="line"><a name="l00108"></a><span class="lineno">  108</span>&#160;        }</div><div class="line"><a name="l00109"></a><span class="lineno">  109</span>&#160;        <span class="keywordflow">else</span></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">throw</span> <a class="code" href="classarmnn_1_1_parse_exception.xhtml">ParseException</a>(</div><div class="line"><a name="l00112"></a><span class="lineno">  112</span>&#160;                fmt::format(<span class="stringliteral">&quot;Attribute {} of node {} expected to have {} as tensorflow::AttrValue::ValueCase, &quot;</span></div><div class="line"><a name="l00113"></a><span class="lineno">  113</span>&#160;                            <span class="stringliteral">&quot;but found {} instead {}&quot;</span>,</div><div class="line"><a name="l00114"></a><span class="lineno">  114</span>&#160;                            attribName,</div><div class="line"><a name="l00115"></a><span class="lineno">  115</span>&#160;                            nodeDef.name(),</div><div class="line"><a name="l00116"></a><span class="lineno">  116</span>&#160;                            <span class="keyword">static_cast&lt;</span><span class="keywordtype">int</span><span class="keyword">&gt;</span>(expectedValueCase),</div><div class="line"><a name="l00117"></a><span class="lineno">  117</span>&#160;                            static_cast&lt;int&gt;(attrValue.value_case()),</div><div class="line"><a name="l00118"></a><span class="lineno">  118</span>&#160;                            <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l00119"></a><span class="lineno">  119</span>&#160;        }</div><div class="line"><a name="l00120"></a><span class="lineno">  120</span>&#160;    }</div><div class="line"><a name="l00121"></a><span class="lineno">  121</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l00122"></a><span class="lineno">  122</span>&#160;    {</div><div class="line"><a name="l00123"></a><span class="lineno">  123</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="l00124"></a><span class="lineno">  124</span>&#160;            fmt::format(<span class="stringliteral">&quot;Could not find required attribute {} in node {} {}&quot;</span>,</div><div class="line"><a name="l00125"></a><span class="lineno">  125</span>&#160;                        attribName,</div><div class="line"><a name="l00126"></a><span class="lineno">  126</span>&#160;                        nodeDef.name(),</div><div class="line"><a name="l00127"></a><span class="lineno">  127</span>&#160;                        <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</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;}</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="keyword">template</span> &lt;<span class="keyword">typename</span> Callable&gt;</div><div class="line"><a name="l00132"></a><span class="lineno">  132</span>&#160;<span class="keywordtype">void</span> ReadOptionalNodeAttributeImpl(<span class="keyword">const</span> tensorflow::NodeDef&amp; nodeDef,</div><div class="line"><a name="l00133"></a><span class="lineno">  133</span>&#160;    <span class="keyword">const</span> std::string&amp; attribName,</div><div class="line"><a name="l00134"></a><span class="lineno">  134</span>&#160;    tensorflow::AttrValue::ValueCase expectedValueCase,</div><div class="line"><a name="l00135"></a><span class="lineno">  135</span>&#160;    Callable callable)</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;    <span class="keyword">auto</span> iter = nodeDef.attr().find(attribName);</div><div class="line"><a name="l00138"></a><span class="lineno">  138</span>&#160;    <span class="keywordflow">if</span> (iter != nodeDef.attr().end())</div><div class="line"><a name="l00139"></a><span class="lineno">  139</span>&#160;    {</div><div class="line"><a name="l00140"></a><span class="lineno">  140</span>&#160;        <span class="keyword">const</span> <span class="keyword">auto</span>&amp; attrValue = iter-&gt;second;</div><div class="line"><a name="l00141"></a><span class="lineno">  141</span>&#160;        <span class="keywordflow">if</span> (attrValue.value_case() == expectedValueCase)</div><div class="line"><a name="l00142"></a><span class="lineno">  142</span>&#160;        {</div><div class="line"><a name="l00143"></a><span class="lineno">  143</span>&#160;            callable(attrValue);</div><div class="line"><a name="l00144"></a><span class="lineno">  144</span>&#160;        }</div><div class="line"><a name="l00145"></a><span class="lineno">  145</span>&#160;        <span class="keywordflow">else</span></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">throw</span> <a class="code" href="classarmnn_1_1_parse_exception.xhtml">ParseException</a>(</div><div class="line"><a name="l00148"></a><span class="lineno">  148</span>&#160;                fmt::format(<span class="stringliteral">&quot;Attribute {} of node {} expected to have {} as tensorflow::AttrValue::ValueCase, &quot;</span></div><div class="line"><a name="l00149"></a><span class="lineno">  149</span>&#160;                            <span class="stringliteral">&quot;but found {} instead {}&quot;</span>,</div><div class="line"><a name="l00150"></a><span class="lineno">  150</span>&#160;                            attribName,</div><div class="line"><a name="l00151"></a><span class="lineno">  151</span>&#160;                            nodeDef.name(),</div><div class="line"><a name="l00152"></a><span class="lineno">  152</span>&#160;                            <span class="keyword">static_cast&lt;</span><span class="keywordtype">int</span><span class="keyword">&gt;</span>(expectedValueCase),</div><div class="line"><a name="l00153"></a><span class="lineno">  153</span>&#160;                            static_cast&lt;int&gt;(attrValue.value_case()),</div><div class="line"><a name="l00154"></a><span class="lineno">  154</span>&#160;                            <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l00155"></a><span class="lineno">  155</span>&#160;        }</div><div class="line"><a name="l00156"></a><span class="lineno">  156</span>&#160;    }</div><div class="line"><a name="l00157"></a><span class="lineno">  157</span>&#160;}</div><div class="line"><a name="l00158"></a><span class="lineno">  158</span>&#160;</div><div class="line"><a name="l00159"></a><span class="lineno">  159</span>&#160;<span class="keywordtype">float</span> ReadMandatoryNodeFloatAttribute(<span class="keyword">const</span> tensorflow::NodeDef&amp; nodeDef, <span class="keyword">const</span> std::string&amp; name)</div><div class="line"><a name="l00160"></a><span class="lineno">  160</span>&#160;{</div><div class="line"><a name="l00161"></a><span class="lineno">  161</span>&#160;    <span class="keywordtype">float</span> attribValue = 0.0f;</div><div class="line"><a name="l00162"></a><span class="lineno">  162</span>&#160;    ReadMandatoryNodeAttributeImpl(nodeDef, name, tensorflow::AttrValue::kF,</div><div class="line"><a name="l00163"></a><span class="lineno">  163</span>&#160;        [&amp;attribValue](<span class="keyword">const</span> tensorflow::AttrValue&amp; attrValue)</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;        attribValue = attrValue.f();</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;    <span class="keywordflow">return</span> attribValue;</div><div class="line"><a name="l00168"></a><span class="lineno">  168</span>&#160;}</div><div class="line"><a name="l00169"></a><span class="lineno">  169</span>&#160;</div><div class="line"><a name="l00170"></a><span class="lineno">  170</span>&#160;int32_t ReadMandatoryNodeInt32Attribute(<span class="keyword">const</span> tensorflow::NodeDef&amp; nodeDef, <span class="keyword">const</span> std::string&amp; name)</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;    int32_t attribValue = 0u;</div><div class="line"><a name="l00173"></a><span class="lineno">  173</span>&#160;    ReadMandatoryNodeAttributeImpl(nodeDef, name, tensorflow::AttrValue::kI,</div><div class="line"><a name="l00174"></a><span class="lineno">  174</span>&#160;                                   [&amp;attribValue](<span class="keyword">const</span> tensorflow::AttrValue&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 = <span class="keyword">static_cast&lt;</span>int32_t<span class="keyword">&gt;</span>(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;<span class="keywordtype">bool</span> ReadMandatoryNodeBoolAttribute(<span class="keyword">const</span> tensorflow::NodeDef&amp; nodeDef, <span class="keyword">const</span> std::string&amp; name)</div><div class="line"><a name="l00182"></a><span class="lineno">  182</span>&#160;{</div><div class="line"><a name="l00183"></a><span class="lineno">  183</span>&#160;    <span class="keywordtype">bool</span> attribValue = <span class="keyword">false</span>;</div><div class="line"><a name="l00184"></a><span class="lineno">  184</span>&#160;    ReadMandatoryNodeAttributeImpl(nodeDef, name, tensorflow::AttrValue::kB,</div><div class="line"><a name="l00185"></a><span class="lineno">  185</span>&#160;                                   [&amp;attribValue](<span class="keyword">const</span> tensorflow::AttrValue&amp; attrValue)</div><div class="line"><a name="l00186"></a><span class="lineno">  186</span>&#160;                                   {</div><div class="line"><a name="l00187"></a><span class="lineno">  187</span>&#160;                                       attribValue = <span class="keyword">static_cast&lt;</span><span class="keywordtype">bool</span><span class="keyword">&gt;</span>(attrValue.b());</div><div class="line"><a name="l00188"></a><span class="lineno">  188</span>&#160;                                   });</div><div class="line"><a name="l00189"></a><span class="lineno">  189</span>&#160;    <span class="keywordflow">return</span> attribValue;</div><div class="line"><a name="l00190"></a><span class="lineno">  190</span>&#160;}</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;uint32_t ReadMandatoryNodeUint32Attribute(<span class="keyword">const</span> tensorflow::NodeDef&amp; nodeDef, <span class="keyword">const</span> std::string&amp; name)</div><div class="line"><a name="l00193"></a><span class="lineno">  193</span>&#160;{</div><div class="line"><a name="l00194"></a><span class="lineno">  194</span>&#160;    uint32_t attribValue = 0u;</div><div class="line"><a name="l00195"></a><span class="lineno">  195</span>&#160;    ReadMandatoryNodeAttributeImpl(nodeDef, name, tensorflow::AttrValue::kI,</div><div class="line"><a name="l00196"></a><span class="lineno">  196</span>&#160;        [&amp;attribValue](<span class="keyword">const</span> tensorflow::AttrValue&amp; attrValue)</div><div class="line"><a name="l00197"></a><span class="lineno">  197</span>&#160;    {</div><div class="line"><a name="l00198"></a><span class="lineno">  198</span>&#160;        attribValue = <span class="keyword">static_cast&lt;</span>uint32_t<span class="keyword">&gt;</span>(attrValue.i());</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;    <span class="keywordflow">return</span> attribValue;</div><div class="line"><a name="l00201"></a><span class="lineno">  201</span>&#160;}</div><div class="line"><a name="l00202"></a><span class="lineno">  202</span>&#160;</div><div class="line"><a name="l00203"></a><span class="lineno">  203</span>&#160;std::string ReadMandatoryNodeStringAttribute(<span class="keyword">const</span> tensorflow::NodeDef&amp; nodeDef, <span class="keyword">const</span> std::string&amp; name)</div><div class="line"><a name="l00204"></a><span class="lineno">  204</span>&#160;{</div><div class="line"><a name="l00205"></a><span class="lineno">  205</span>&#160;    std::string attribValue = <span class="stringliteral">&quot;&quot;</span>;</div><div class="line"><a name="l00206"></a><span class="lineno">  206</span>&#160;    ReadMandatoryNodeAttributeImpl(nodeDef, name, tensorflow::AttrValue::kS,</div><div class="line"><a name="l00207"></a><span class="lineno">  207</span>&#160;        [&amp;attribValue](<span class="keyword">const</span> tensorflow::AttrValue&amp; attrValue)</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;        attribValue = attrValue.s();</div><div class="line"><a name="l00210"></a><span class="lineno">  210</span>&#160;    });</div><div class="line"><a name="l00211"></a><span class="lineno">  211</span>&#160;    <span class="keywordflow">return</span> attribValue;</div><div class="line"><a name="l00212"></a><span class="lineno">  212</span>&#160;}</div><div class="line"><a name="l00213"></a><span class="lineno">  213</span>&#160;</div><div class="line"><a name="l00214"></a><span class="lineno">  214</span>&#160;std::vector&lt;uint32_t&gt; ReadMandatoryNodeUint32ListAttribute(<span class="keyword">const</span> tensorflow::NodeDef&amp; nodeDef,</div><div class="line"><a name="l00215"></a><span class="lineno">  215</span>&#160;    <span class="keyword">const</span> std::string&amp; name)</div><div class="line"><a name="l00216"></a><span class="lineno">  216</span>&#160;{</div><div class="line"><a name="l00217"></a><span class="lineno">  217</span>&#160;    std::vector&lt;uint32_t&gt; attriList;</div><div class="line"><a name="l00218"></a><span class="lineno">  218</span>&#160;    ReadMandatoryNodeAttributeImpl(nodeDef, name, tensorflow::AttrValue::kList,</div><div class="line"><a name="l00219"></a><span class="lineno">  219</span>&#160;        [&amp;attriList](<span class="keyword">const</span> tensorflow::AttrValue&amp; attrValue)</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;        <span class="keywordflow">for</span> (<span class="keywordtype">int</span> attriNum = 0; attriNum &lt; attrValue.list().i_size(); ++attriNum)</div><div class="line"><a name="l00222"></a><span class="lineno">  222</span>&#160;        {</div><div class="line"><a name="l00223"></a><span class="lineno">  223</span>&#160;            attriList.push_back(static_cast&lt;uint32_t&gt;(attrValue.list().i(attriNum)));</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;    });</div><div class="line"><a name="l00226"></a><span class="lineno">  226</span>&#160;</div><div class="line"><a name="l00227"></a><span class="lineno">  227</span>&#160;    <span class="keywordflow">return</span> attriList;</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;</div><div class="line"><a name="l00230"></a><span class="lineno">  230</span>&#160;std::vector&lt;uint32_t&gt; ReadOptionalNodeUint32ListAttribute(<span class="keyword">const</span> tensorflow::NodeDef&amp; nodeDef,</div><div class="line"><a name="l00231"></a><span class="lineno">  231</span>&#160;    <span class="keyword">const</span> std::string&amp; name)</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;    std::vector&lt;uint32_t&gt; attriList;</div><div class="line"><a name="l00234"></a><span class="lineno">  234</span>&#160;    ReadOptionalNodeAttributeImpl(nodeDef, name, tensorflow::AttrValue::kList,</div><div class="line"><a name="l00235"></a><span class="lineno">  235</span>&#160;        [&amp;attriList](<span class="keyword">const</span> tensorflow::AttrValue&amp; attrValue)</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;        <span class="keywordflow">for</span> (<span class="keywordtype">int</span> attriNum = 0; attriNum &lt; attrValue.list().i_size(); ++attriNum)</div><div class="line"><a name="l00238"></a><span class="lineno">  238</span>&#160;        {</div><div class="line"><a name="l00239"></a><span class="lineno">  239</span>&#160;            attriList.push_back(static_cast&lt;uint32_t&gt;(attrValue.list().i(attriNum)));</div><div class="line"><a name="l00240"></a><span class="lineno">  240</span>&#160;        }</div><div class="line"><a name="l00241"></a><span class="lineno">  241</span>&#160;    });</div><div class="line"><a name="l00242"></a><span class="lineno">  242</span>&#160;</div><div class="line"><a name="l00243"></a><span class="lineno">  243</span>&#160;    <span class="keywordflow">return</span> attriList;</div><div class="line"><a name="l00244"></a><span class="lineno">  244</span>&#160;}</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;std::string ReadOptionalNodeStringAttribute(<span class="keyword">const</span> tensorflow::NodeDef&amp; nodeDef,</div><div class="line"><a name="l00247"></a><span class="lineno">  247</span>&#160;                                            <span class="keyword">const</span> std::string&amp; name,</div><div class="line"><a name="l00248"></a><span class="lineno">  248</span>&#160;                                            <span class="keyword">const</span> std::string&amp; defaultValue = <span class="stringliteral">&quot;&quot;</span>)</div><div class="line"><a name="l00249"></a><span class="lineno">  249</span>&#160;{</div><div class="line"><a name="l00250"></a><span class="lineno">  250</span>&#160;    std::string attribValue = defaultValue;</div><div class="line"><a name="l00251"></a><span class="lineno">  251</span>&#160;    ReadOptionalNodeAttributeImpl(nodeDef, name, tensorflow::AttrValue::kS,</div><div class="line"><a name="l00252"></a><span class="lineno">  252</span>&#160;        [&amp;attribValue](<span class="keyword">const</span> tensorflow::AttrValue&amp; attrValue)</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;        attribValue = attrValue.s();</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;    <span class="keywordflow">return</span> attribValue;</div><div class="line"><a name="l00257"></a><span class="lineno">  257</span>&#160;}</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="keywordtype">bool</span> ReadOptionalNodeBoolAttribute(<span class="keyword">const</span> tensorflow::NodeDef&amp; nodeDef,</div><div class="line"><a name="l00260"></a><span class="lineno">  260</span>&#160;    <span class="keyword">const</span> std::string&amp; name,</div><div class="line"><a name="l00261"></a><span class="lineno">  261</span>&#160;    <span class="keywordtype">bool</span> defaultValue = <span class="keyword">false</span>)</div><div class="line"><a name="l00262"></a><span class="lineno">  262</span>&#160;{</div><div class="line"><a name="l00263"></a><span class="lineno">  263</span>&#160;    <span class="keywordtype">bool</span> attribValue = defaultValue;</div><div class="line"><a name="l00264"></a><span class="lineno">  264</span>&#160;    ReadOptionalNodeAttributeImpl(nodeDef, name, tensorflow::AttrValue::kB,</div><div class="line"><a name="l00265"></a><span class="lineno">  265</span>&#160;        [&amp;attribValue](<span class="keyword">const</span> tensorflow::AttrValue&amp; attrValue)</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;        attribValue = attrValue.b();</div><div class="line"><a name="l00268"></a><span class="lineno">  268</span>&#160;    });</div><div class="line"><a name="l00269"></a><span class="lineno">  269</span>&#160;    <span class="keywordflow">return</span> attribValue;</div><div class="line"><a name="l00270"></a><span class="lineno">  270</span>&#160;}</div><div class="line"><a name="l00271"></a><span class="lineno">  271</span>&#160;</div><div class="line"><a name="l00272"></a><span class="lineno">  272</span>&#160;<a class="code" href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6">tensorflow::DataType</a> ReadMandatoryNodeTypeAttribute(<span class="keyword">const</span> tensorflow::NodeDef&amp; nodeDef, <span class="keyword">const</span> std::string&amp; name)</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;    <a class="code" href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6">tensorflow::DataType</a> attribValue = tensorflow::DT_INVALID;</div><div class="line"><a name="l00275"></a><span class="lineno">  275</span>&#160;    ReadMandatoryNodeAttributeImpl(nodeDef, name, tensorflow::AttrValue::kType,</div><div class="line"><a name="l00276"></a><span class="lineno">  276</span>&#160;        [&amp;attribValue](<span class="keyword">const</span> tensorflow::AttrValue&amp; attrValue)</div><div class="line"><a name="l00277"></a><span class="lineno">  277</span>&#160;    {</div><div class="line"><a name="l00278"></a><span class="lineno">  278</span>&#160;        attribValue = attrValue.type();</div><div class="line"><a name="l00279"></a><span class="lineno">  279</span>&#160;    });</div><div class="line"><a name="l00280"></a><span class="lineno">  280</span>&#160;    <span class="keywordflow">return</span> attribValue;</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;</div><div class="line"><a name="l00283"></a><span class="lineno">  283</span>&#160;<a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> PrepareReshape(<span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a>&amp; input, <span class="keyword">const</span> std::vector&lt;int32_t&gt;&amp; targetDims)</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;    std::vector&lt;unsigned int&gt; outDims(targetDims.begin(), targetDims.end());</div><div class="line"><a name="l00286"></a><span class="lineno">  286</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="l00287"></a><span class="lineno">  287</span>&#160;</div><div class="line"><a name="l00288"></a><span class="lineno">  288</span>&#160;    <span class="keywordflow">if</span> (stretchDim != targetDims.end())</div><div class="line"><a name="l00289"></a><span class="lineno">  289</span>&#160;    {</div><div class="line"><a name="l00290"></a><span class="lineno">  290</span>&#160;        <span class="keywordflow">if</span> (std::find(std::next(stretchDim), targetDims.end(), -1) != targetDims.end())</div><div class="line"><a name="l00291"></a><span class="lineno">  291</span>&#160;        {</div><div class="line"><a name="l00292"></a><span class="lineno">  292</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="l00293"></a><span class="lineno">  293</span>&#160;                fmt::format(<span class="stringliteral">&quot;At most one component of shape can be -1 {}&quot;</span>,</div><div class="line"><a name="l00294"></a><span class="lineno">  294</span>&#160;                            <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</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;</div><div class="line"><a name="l00297"></a><span class="lineno">  297</span>&#160;        <span class="keyword">auto</span> targetNumElements =</div><div class="line"><a name="l00298"></a><span class="lineno">  298</span>&#160;            <a class="code" href="namespacearmnn.xhtml#a375ca3cff9f1b005d1412dc5f3cf5b6e">armnn::numeric_cast</a>&lt;<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>&gt;(</div><div class="line"><a name="l00299"></a><span class="lineno">  299</span>&#160;                std::accumulate(targetDims.begin(), targetDims.end(), -1, std::multiplies&lt;int32_t&gt;()));</div><div class="line"><a name="l00300"></a><span class="lineno">  300</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="l00301"></a><span class="lineno">  301</span>&#160;        outDims[stretchIndex] = input.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a8846406ac37fbd2204f0be16ee05d5b7">GetNumElements</a>() / targetNumElements;</div><div class="line"><a name="l00302"></a><span class="lineno">  302</span>&#160;    }</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;    <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> reshapeInfo = input;</div><div class="line"><a name="l00305"></a><span class="lineno">  305</span>&#160;    reshapeInfo.<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>{ <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="l00306"></a><span class="lineno">  306</span>&#160;</div><div class="line"><a name="l00307"></a><span class="lineno">  307</span>&#160;    <span class="keywordflow">return</span> reshapeInfo;</div><div class="line"><a name="l00308"></a><span class="lineno">  308</span>&#160;}</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;<span class="comment">// We need the input0Slot to guide the reshape for input1Slot.</span></div><div class="line"><a name="l00311"></a><span class="lineno">  311</span>&#160;<a class="code" href="classarmnn_1_1_i_output_slot.xhtml">IOutputSlot</a>* <a class="code" href="namespacearmnn_1_1optimizations.xhtml#a4fc55afb4885278ad1510b2c4307af76">AddBroadcastReshapeLayer</a>(<a class="code" href="classarmnn_1_1_i_output_slot.xhtml">IOutputSlot</a>* input0Slot, <a class="code" href="classarmnn_1_1_i_output_slot.xhtml">IOutputSlot</a>* input1Slot, <span class="keywordtype">bool</span> isNHWC,</div><div class="line"><a name="l00312"></a><span class="lineno">  312</span>&#160;                                         <a class="code" href="classarmnn_1_1_i_network.xhtml">INetwork</a>&amp; m_Network, <span class="keyword">const</span> tensorflow::NodeDef&amp; nodeDef)</div><div class="line"><a name="l00313"></a><span class="lineno">  313</span>&#160;{</div><div class="line"><a name="l00314"></a><span class="lineno">  314</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a>&amp; input1Info = input1Slot-&gt;<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#a9943775a364fc4ab53b85ac88f311886">GetTensorInfo</a>();</div><div class="line"><a name="l00315"></a><span class="lineno">  315</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> inputTensorInfo = input0Slot-&gt;<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#a9943775a364fc4ab53b85ac88f311886">GetTensorInfo</a>();</div><div class="line"><a name="l00316"></a><span class="lineno">  316</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> matchDim = inputTensorInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a157e27d41e9f6b21f0d3c025fa47dc24">GetNumDimensions</a>() - (isNHWC ? 1 : 3);</div><div class="line"><a name="l00317"></a><span class="lineno">  317</span>&#160;    std::array&lt;unsigned int, MaxNumOfTensorDimensions&gt; reshapedDimensions;</div><div class="line"><a name="l00318"></a><span class="lineno">  318</span>&#160;    std::fill_n(reshapedDimensions.begin(), inputTensorInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a157e27d41e9f6b21f0d3c025fa47dc24">GetNumDimensions</a>(), 1);</div><div class="line"><a name="l00319"></a><span class="lineno">  319</span>&#160;    reshapedDimensions[matchDim] = input1Info.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a8b5d0f8a24e9d9238f412260a552acf8">GetShape</a>()[0];</div><div class="line"><a name="l00320"></a><span class="lineno">  320</span>&#160;</div><div class="line"><a name="l00321"></a><span class="lineno">  321</span>&#160;    <a class="code" href="classarmnn_1_1_tensor_info.xhtml">armnn::TensorInfo</a> reshapedInfo = input1Info;</div><div class="line"><a name="l00322"></a><span class="lineno">  322</span>&#160;    reshapedInfo.<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>{ inputTensorInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a157e27d41e9f6b21f0d3c025fa47dc24">GetNumDimensions</a>(), reshapedDimensions.data() });</div><div class="line"><a name="l00323"></a><span class="lineno">  323</span>&#160;</div><div class="line"><a name="l00324"></a><span class="lineno">  324</span>&#160;    <span class="keyword">const</span> std::string reshapeLayerName = <span class="stringliteral">&quot;reshape_for-&quot;</span> + nodeDef.name();</div><div class="line"><a name="l00325"></a><span class="lineno">  325</span>&#160;    <a class="code" href="structarmnn_1_1_reshape_descriptor.xhtml">ReshapeDescriptor</a> reshapeDesc;</div><div class="line"><a name="l00326"></a><span class="lineno">  326</span>&#160;    reshapeDesc.<a class="code" href="structarmnn_1_1_reshape_descriptor.xhtml#a1178f4dafdda81f59c15145ec327f7d9">m_TargetShape</a> = reshapedInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a8b5d0f8a24e9d9238f412260a552acf8">GetShape</a>();</div><div class="line"><a name="l00327"></a><span class="lineno">  327</span>&#160;    <a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml">IConnectableLayer</a>* <span class="keyword">const</span> reshapeLayer = m_Network.<a class="code" href="classarmnn_1_1_i_network.xhtml#a8a3380be13fba749fc4208214b049347">AddReshapeLayer</a>(reshapeDesc, reshapeLayerName.c_str());</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;    input1Slot-&gt;<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#ac1835f8756a9f03c02fcf9664e3a0fce">Connect</a>(reshapeLayer-&gt;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml#a6ec9e0eb66d7d6a01240492a0b18104c">GetInputSlot</a>(0));</div><div class="line"><a name="l00330"></a><span class="lineno">  330</span>&#160;    reshapeLayer-&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>(reshapedInfo);</div><div class="line"><a name="l00331"></a><span class="lineno">  331</span>&#160;</div><div class="line"><a name="l00332"></a><span class="lineno">  332</span>&#160;    input1Slot = &amp;reshapeLayer-&gt;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml#a80ac4eda2e7f2757ec9dd96fc96dbd16">GetOutputSlot</a>(0);</div><div class="line"><a name="l00333"></a><span class="lineno">  333</span>&#160;</div><div class="line"><a name="l00334"></a><span class="lineno">  334</span>&#160;    <span class="keywordflow">return</span> input1Slot;</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;<a class="code" href="structarmnn_tf_parser_1_1_with_output_tensor_index.xhtml">OutputId</a> ParseOutputId(<span class="keyword">const</span> std::string &amp; name)</div><div class="line"><a name="l00338"></a><span class="lineno">  338</span>&#160;{</div><div class="line"><a name="l00339"></a><span class="lineno">  339</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> outputNum = 0;</div><div class="line"><a name="l00340"></a><span class="lineno">  340</span>&#160;    <span class="keywordtype">size_t</span> colonPos = name.find_last_of(<span class="stringliteral">&quot;:&quot;</span>);</div><div class="line"><a name="l00341"></a><span class="lineno">  341</span>&#160;    <span class="keywordflow">if</span> (colonPos != std::string::npos)</div><div class="line"><a name="l00342"></a><span class="lineno">  342</span>&#160;    {</div><div class="line"><a name="l00343"></a><span class="lineno">  343</span>&#160;        <span class="keywordtype">int</span> n = std::stoi(name.substr(colonPos+1));</div><div class="line"><a name="l00344"></a><span class="lineno">  344</span>&#160;        <span class="keywordflow">if</span> (n&lt;0 || n&gt;100)</div><div class="line"><a name="l00345"></a><span class="lineno">  345</span>&#160;        {</div><div class="line"><a name="l00346"></a><span class="lineno">  346</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="l00347"></a><span class="lineno">  347</span>&#160;                fmt::format(<span class="stringliteral">&quot;Output tensor id is out of range for {} {}&quot;</span>,</div><div class="line"><a name="l00348"></a><span class="lineno">  348</span>&#160;                            name,</div><div class="line"><a name="l00349"></a><span class="lineno">  349</span>&#160;                            <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l00350"></a><span class="lineno">  350</span>&#160;        }</div><div class="line"><a name="l00351"></a><span class="lineno">  351</span>&#160;        outputNum = <span class="keyword">static_cast&lt;</span><span class="keywordtype">unsigned</span> <span class="keywordtype">int</span><span class="keyword">&gt;</span>(n);</div><div class="line"><a name="l00352"></a><span class="lineno">  352</span>&#160;    }</div><div class="line"><a name="l00353"></a><span class="lineno">  353</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="namespacearmnn_tf_parser.xhtml#abcf8e5fd95ba7e7bd8cd36fc24974223">OutputId</a>(name.substr(0,colonPos),outputNum);</div><div class="line"><a name="l00354"></a><span class="lineno">  354</span>&#160;}</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"><a class="line" href="_tf_parser_8cpp.xhtml#a3fb047570644cae325aa88d3cd7bb96e">  356</a></span>&#160;<span class="preprocessor">#define CHECK_DATA_FORMAT(NODE_DEF, FORMAT, NODE_TYPE) \</span></div><div class="line"><a name="l00357"></a><span class="lineno">  357</span>&#160;<span class="preprocessor">    if( FORMAT != &quot;NHWC&quot; &amp;&amp; FORMAT != &quot;NCHW&quot; ) \</span></div><div class="line"><a name="l00358"></a><span class="lineno">  358</span>&#160;<span class="preprocessor">    { \</span></div><div class="line"><a name="l00359"></a><span class="lineno">  359</span>&#160;<span class="preprocessor">        throw ParseException( \</span></div><div class="line"><a name="l00360"></a><span class="lineno">  360</span>&#160;<span class="preprocessor">            fmt::format(&quot;Unsupported data format {} passed for {} node {}. &quot; \</span></div><div class="line"><a name="l00361"></a><span class="lineno">  361</span>&#160;<span class="preprocessor">                        &quot;Only NHWC and NCHW supported {}&quot;, \</span></div><div class="line"><a name="l00362"></a><span class="lineno">  362</span>&#160;<span class="preprocessor">                        FORMAT, \</span></div><div class="line"><a name="l00363"></a><span class="lineno">  363</span>&#160;<span class="preprocessor">                        NODE_TYPE, \</span></div><div class="line"><a name="l00364"></a><span class="lineno">  364</span>&#160;<span class="preprocessor">                        NODE_DEF.name(), \</span></div><div class="line"><a name="l00365"></a><span class="lineno">  365</span>&#160;<span class="preprocessor">                        CHECK_LOCATION().AsString())); \</span></div><div class="line"><a name="l00366"></a><span class="lineno">  366</span>&#160;<span class="preprocessor">    }</span></div><div class="line"><a name="l00367"></a><span class="lineno">  367</span>&#160;</div><div class="line"><a name="l00368"></a><span class="lineno"><a class="line" href="_tf_parser_8cpp.xhtml#aab838eb7734e531bb5be6f6dece673bf">  368</a></span>&#160;<span class="preprocessor">#define CHECK_PADDING_TYPE(NODE_DEF, PADDING) \</span></div><div class="line"><a name="l00369"></a><span class="lineno">  369</span>&#160;<span class="preprocessor">    if(PADDING != &quot;SAME&quot; &amp;&amp; PADDING != &quot;VALID&quot; ) \</span></div><div class="line"><a name="l00370"></a><span class="lineno">  370</span>&#160;<span class="preprocessor">    { \</span></div><div class="line"><a name="l00371"></a><span class="lineno">  371</span>&#160;<span class="preprocessor">        throw ParseException( \</span></div><div class="line"><a name="l00372"></a><span class="lineno">  372</span>&#160;<span class="preprocessor">            fmt::format(&quot;Only &#39;SAME&#39; and &#39;VALID&#39; padding supported. Got {} for {} {}&quot;, \</span></div><div class="line"><a name="l00373"></a><span class="lineno">  373</span>&#160;<span class="preprocessor">                        PADDING, \</span></div><div class="line"><a name="l00374"></a><span class="lineno">  374</span>&#160;<span class="preprocessor">                        NODE_DEF.name(), \</span></div><div class="line"><a name="l00375"></a><span class="lineno">  375</span>&#160;<span class="preprocessor">                        CHECK_LOCATION().AsString())); \</span></div><div class="line"><a name="l00376"></a><span class="lineno">  376</span>&#160;<span class="preprocessor">    } \</span></div><div class="line"><a name="l00377"></a><span class="lineno">  377</span>&#160;<span class="preprocessor"></span></div><div class="line"><a name="l00378"></a><span class="lineno">  378</span>&#160;} <span class="comment">// namespace</span></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;<span class="keyword">const</span> std::map&lt;std::string, ITfParser::TfParserImpl::OperationParsingFunction&gt;</div><div class="line"><a name="l00381"></a><span class="lineno">  381</span>&#160;    ITfParser::TfParserImpl::ms_OperationNameToParsingFunctions = {</div><div class="line"><a name="l00382"></a><span class="lineno">  382</span>&#160;    { <span class="stringliteral">&quot;Const&quot;</span>,                 &amp;TfParserImpl::ParseConst },</div><div class="line"><a name="l00383"></a><span class="lineno">  383</span>&#160;    { <span class="stringliteral">&quot;Add&quot;</span>,                   &amp;TfParserImpl::ParseAdd },</div><div class="line"><a name="l00384"></a><span class="lineno">  384</span>&#160;    { <span class="stringliteral">&quot;AddN&quot;</span>,                  &amp;TfParserImpl::ParseAddN },</div><div class="line"><a name="l00385"></a><span class="lineno">  385</span>&#160;    { <span class="stringliteral">&quot;BiasAdd&quot;</span>,               &amp;TfParserImpl::ParseBiasAdd },</div><div class="line"><a name="l00386"></a><span class="lineno">  386</span>&#160;    { <span class="stringliteral">&quot;Identity&quot;</span>,              &amp;TfParserImpl::ParseIdentity },</div><div class="line"><a name="l00387"></a><span class="lineno">  387</span>&#160;    { <span class="stringliteral">&quot;Conv2D&quot;</span>,                &amp;TfParserImpl::ParseConv2D },</div><div class="line"><a name="l00388"></a><span class="lineno">  388</span>&#160;    { <span class="stringliteral">&quot;DepthwiseConv2dNative&quot;</span>, &amp;TfParserImpl::ParseDepthwiseConv2D },</div><div class="line"><a name="l00389"></a><span class="lineno">  389</span>&#160;    { <span class="stringliteral">&quot;ExpandDims&quot;</span>,            &amp;TfParserImpl::ParseExpandDims },</div><div class="line"><a name="l00390"></a><span class="lineno">  390</span>&#160;    { <span class="stringliteral">&quot;FusedBatchNorm&quot;</span>,        &amp;TfParserImpl::ParseFusedBatchNorm },</div><div class="line"><a name="l00391"></a><span class="lineno">  391</span>&#160;    { <span class="stringliteral">&quot;Gather&quot;</span>,                &amp;TfParserImpl::ParseGather},</div><div class="line"><a name="l00392"></a><span class="lineno">  392</span>&#160;    { <span class="stringliteral">&quot;Greater&quot;</span>,               &amp;TfParserImpl::ParseGreater},</div><div class="line"><a name="l00393"></a><span class="lineno">  393</span>&#160;    { <span class="stringliteral">&quot;ConcatV2&quot;</span>,              &amp;TfParserImpl::ParseConcat },</div><div class="line"><a name="l00394"></a><span class="lineno">  394</span>&#160;    { <span class="stringliteral">&quot;LRN&quot;</span>,                   &amp;TfParserImpl::ParseLrn },</div><div class="line"><a name="l00395"></a><span class="lineno">  395</span>&#160;    { <span class="stringliteral">&quot;MatMul&quot;</span>,                &amp;TfParserImpl::ParseMatMul },</div><div class="line"><a name="l00396"></a><span class="lineno">  396</span>&#160;    { <span class="stringliteral">&quot;Mean&quot;</span>,                  &amp;TfParserImpl::ParseMean },</div><div class="line"><a name="l00397"></a><span class="lineno">  397</span>&#160;    { <span class="stringliteral">&quot;Mul&quot;</span>,                   &amp;TfParserImpl::ParseMul },</div><div class="line"><a name="l00398"></a><span class="lineno">  398</span>&#160;    { <span class="stringliteral">&quot;Placeholder&quot;</span>,           &amp;TfParserImpl::ParsePlaceholder },</div><div class="line"><a name="l00399"></a><span class="lineno">  399</span>&#160;    { <span class="stringliteral">&quot;RealDiv&quot;</span>,               &amp;TfParserImpl::ParseRealDiv },</div><div class="line"><a name="l00400"></a><span class="lineno">  400</span>&#160;    { <span class="stringliteral">&quot;Relu&quot;</span>,                  &amp;TfParserImpl::ParseRelu },</div><div class="line"><a name="l00401"></a><span class="lineno">  401</span>&#160;    { <span class="stringliteral">&quot;Relu6&quot;</span>,                 &amp;TfParserImpl::ParseRelu6 },</div><div class="line"><a name="l00402"></a><span class="lineno">  402</span>&#160;    { <span class="stringliteral">&quot;Reshape&quot;</span>,               &amp;TfParserImpl::ParseReshape },</div><div class="line"><a name="l00403"></a><span class="lineno">  403</span>&#160;    { <span class="stringliteral">&quot;ResizeBilinear&quot;</span>,        &amp;TfParserImpl::ParseResizeBilinear },</div><div class="line"><a name="l00404"></a><span class="lineno">  404</span>&#160;    { <span class="stringliteral">&quot;Rsqrt&quot;</span>,                 &amp;TfParserImpl::ParseRsqrt },</div><div class="line"><a name="l00405"></a><span class="lineno">  405</span>&#160;    { <span class="stringliteral">&quot;Shape&quot;</span>,                 &amp;TfParserImpl::ParseShape },</div><div class="line"><a name="l00406"></a><span class="lineno">  406</span>&#160;    { <span class="stringliteral">&quot;Squeeze&quot;</span>,               &amp;TfParserImpl::ParseSqueeze },</div><div class="line"><a name="l00407"></a><span class="lineno">  407</span>&#160;    { <span class="stringliteral">&quot;Sigmoid&quot;</span>,               &amp;TfParserImpl::ParseSigmoid },</div><div class="line"><a name="l00408"></a><span class="lineno">  408</span>&#160;    { <span class="stringliteral">&quot;Softmax&quot;</span>,               &amp;TfParserImpl::ParseSoftmax },</div><div class="line"><a name="l00409"></a><span class="lineno">  409</span>&#160;    { <span class="stringliteral">&quot;Softplus&quot;</span>,              &amp;TfParserImpl::ParseSoftplus },</div><div class="line"><a name="l00410"></a><span class="lineno">  410</span>&#160;    { <span class="stringliteral">&quot;Split&quot;</span>,                 &amp;TfParserImpl::ParseSplit },</div><div class="line"><a name="l00411"></a><span class="lineno">  411</span>&#160;    { <span class="stringliteral">&quot;StridedSlice&quot;</span>,          &amp;TfParserImpl::ParseStridedSlice },</div><div class="line"><a name="l00412"></a><span class="lineno">  412</span>&#160;    { <span class="stringliteral">&quot;Tanh&quot;</span>,                  &amp;TfParserImpl::ParseTanh },</div><div class="line"><a name="l00413"></a><span class="lineno">  413</span>&#160;    { <span class="stringliteral">&quot;MaxPool&quot;</span>,               &amp;TfParserImpl::ParseMaxPool },</div><div class="line"><a name="l00414"></a><span class="lineno">  414</span>&#160;    { <span class="stringliteral">&quot;AvgPool&quot;</span>,               &amp;TfParserImpl::ParseAvgPool },</div><div class="line"><a name="l00415"></a><span class="lineno">  415</span>&#160;    { <span class="stringliteral">&quot;Maximum&quot;</span>,               &amp;TfParserImpl::ParseMaximum },</div><div class="line"><a name="l00416"></a><span class="lineno">  416</span>&#160;    { <span class="stringliteral">&quot;Minimum&quot;</span>,               &amp;TfParserImpl::ParseMinimum },</div><div class="line"><a name="l00417"></a><span class="lineno">  417</span>&#160;    { <span class="stringliteral">&quot;Equal&quot;</span>,                 &amp;TfParserImpl::ParseEqual },</div><div class="line"><a name="l00418"></a><span class="lineno">  418</span>&#160;    { <span class="stringliteral">&quot;Pad&quot;</span>,                   &amp;TfParserImpl::ParsePad },</div><div class="line"><a name="l00419"></a><span class="lineno">  419</span>&#160;    { <span class="stringliteral">&quot;Sub&quot;</span>,                   &amp;TfParserImpl::ParseSub },</div><div class="line"><a name="l00420"></a><span class="lineno">  420</span>&#160;    { <span class="stringliteral">&quot;Pack&quot;</span> ,                 &amp;TfParserImpl::ParseStack },</div><div class="line"><a name="l00421"></a><span class="lineno">  421</span>&#160;    { <span class="stringliteral">&quot;Stack&quot;</span>,                 &amp;TfParserImpl::ParseStack },</div><div class="line"><a name="l00422"></a><span class="lineno">  422</span>&#160;    { <span class="stringliteral">&quot;Transpose&quot;</span>,             &amp;TfParserImpl::ParseTranspose },</div><div class="line"><a name="l00423"></a><span class="lineno">  423</span>&#160;};</div><div class="line"><a name="l00424"></a><span class="lineno">  424</span>&#160;</div><div class="line"><a name="l00425"></a><span class="lineno">  425</span>&#160;<span class="keyword">const</span> std::list&lt;std::string&gt; ITfParser::TfParserImpl::m_ControlInputs = {</div><div class="line"><a name="l00426"></a><span class="lineno">  426</span>&#160;    <span class="stringliteral">&quot;Assert&quot;</span></div><div class="line"><a name="l00427"></a><span class="lineno">  427</span>&#160;};</div><div class="line"><a name="l00428"></a><span class="lineno">  428</span>&#160;</div><div class="line"><a name="l00429"></a><span class="lineno"><a class="line" href="namespacearmnn_tf_parser.xhtml#aca0a31de02d5c087029bb28c9202b4d6">  429</a></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="l00430"></a><span class="lineno">  430</span>&#160;                 uint32_t filterSize,</div><div class="line"><a name="l00431"></a><span class="lineno">  431</span>&#160;                 uint32_t stride,</div><div class="line"><a name="l00432"></a><span class="lineno">  432</span>&#160;                 uint32_t dilation,</div><div class="line"><a name="l00433"></a><span class="lineno">  433</span>&#160;                 uint32_t&amp; paddingFront,</div><div class="line"><a name="l00434"></a><span class="lineno">  434</span>&#160;                 uint32_t&amp; paddingBack,</div><div class="line"><a name="l00435"></a><span class="lineno">  435</span>&#160;                 <span class="keywordtype">bool</span> samePadding)</div><div class="line"><a name="l00436"></a><span class="lineno">  436</span>&#160;{</div><div class="line"><a name="l00437"></a><span class="lineno">  437</span>&#160;    paddingFront = 0;</div><div class="line"><a name="l00438"></a><span class="lineno">  438</span>&#160;    paddingBack = 0;</div><div class="line"><a name="l00439"></a><span class="lineno">  439</span>&#160;    <span class="keywordflow">if</span> (samePadding)</div><div class="line"><a name="l00440"></a><span class="lineno">  440</span>&#160;    {</div><div class="line"><a name="l00441"></a><span class="lineno">  441</span>&#160;        uint32_t outputSize = (inputSize + stride - 1) / stride;</div><div class="line"><a name="l00442"></a><span class="lineno">  442</span>&#160;        uint32_t dilatedSize = filterSize + (dilation - 1) * (filterSize - 1);</div><div class="line"><a name="l00443"></a><span class="lineno">  443</span>&#160;        uint32_t temp = (outputSize - 1) * stride + dilatedSize;</div><div class="line"><a name="l00444"></a><span class="lineno">  444</span>&#160;        <span class="keywordflow">if</span> (temp &gt; inputSize)</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;            paddingFront = (temp - inputSize) / 2;</div><div class="line"><a name="l00447"></a><span class="lineno">  447</span>&#160;            paddingBack = (temp - inputSize) - paddingFront;</div><div class="line"><a name="l00448"></a><span class="lineno">  448</span>&#160;        }</div><div class="line"><a name="l00449"></a><span class="lineno">  449</span>&#160;    }</div><div class="line"><a name="l00450"></a><span class="lineno">  450</span>&#160;}</div><div class="line"><a name="l00451"></a><span class="lineno">  451</span>&#160;<span class="comment"></span></div><div class="line"><a name="l00452"></a><span class="lineno">  452</span>&#160;<span class="comment">/// An Abstract base class which represents a single tensorflow operation (node)</span></div><div class="line"><a name="l00453"></a><span class="lineno">  453</span>&#160;<span class="comment">/// that has been (potentially partially) converted to Armnn.</span></div><div class="line"><a name="l00454"></a><span class="lineno">  454</span>&#160;<span class="comment">/// It may not yet have been fully converted into actual Armnn layers.</span></div><div class="line"><a name="l00455"></a><span class="lineno">  455</span>&#160;<span class="comment"></span><span class="keyword">class </span>ParsedTfOperation</div><div class="line"><a name="l00456"></a><span class="lineno">  456</span>&#160;{</div><div class="line"><a name="l00457"></a><span class="lineno">  457</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l00458"></a><span class="lineno">  458</span>&#160;    ParsedTfOperation(<a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml">ITfParser::TfParserImpl</a>* parser, <span class="keyword">const</span> tensorflow::NodeDef&amp; node)</div><div class="line"><a name="l00459"></a><span class="lineno">  459</span>&#160;    : m_Parser(parser)</div><div class="line"><a name="l00460"></a><span class="lineno">  460</span>&#160;    , m_Node(node)</div><div class="line"><a name="l00461"></a><span class="lineno">  461</span>&#160;    {</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;</div><div class="line"><a name="l00464"></a><span class="lineno">  464</span>&#160;    <span class="keyword">virtual</span> ~ParsedTfOperation() {};</div><div class="line"><a name="l00465"></a><span class="lineno">  465</span>&#160;</div><div class="line"><a name="l00466"></a><span class="lineno">  466</span>&#160;    <span class="keyword">const</span> tensorflow::NodeDef&amp; GetNode()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Node; }</div><div class="line"><a name="l00467"></a><span class="lineno">  467</span>&#160;<span class="comment"></span></div><div class="line"><a name="l00468"></a><span class="lineno">  468</span>&#160;<span class="comment">    /// Gets the ArmNN IOutputSlot corresponding to the given output index of the Tensorflow operation.</span></div><div class="line"><a name="l00469"></a><span class="lineno">  469</span>&#160;<span class="comment">    /// This may result in the creation of Armnn layers if this was deferred (e.g. see ParsedConstTfOperation).</span></div><div class="line"><a name="l00470"></a><span class="lineno">  470</span>&#160;<span class="comment"></span>    <span class="keyword">virtual</span> <a class="code" href="classarmnn_1_1_i_output_slot.xhtml">IOutputSlot</a>&amp; ResolveArmnnOutputSlot(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> tfOutputIndex) = 0;</div><div class="line"><a name="l00471"></a><span class="lineno">  471</span>&#160;<span class="comment"></span></div><div class="line"><a name="l00472"></a><span class="lineno">  472</span>&#160;<span class="comment">    /// If this operation is an Identity then this will follow return the &#39;parent&#39; operation (recursively).</span></div><div class="line"><a name="l00473"></a><span class="lineno">  473</span>&#160;<span class="comment"></span>    <span class="keyword">virtual</span> ParsedTfOperation* ResolveIdentityOperations()</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;        <span class="keywordflow">return</span> <span class="keyword">this</span>;</div><div class="line"><a name="l00476"></a><span class="lineno">  476</span>&#160;    }</div><div class="line"><a name="l00477"></a><span class="lineno">  477</span>&#160;</div><div class="line"><a name="l00478"></a><span class="lineno">  478</span>&#160;<span class="keyword">protected</span>:</div><div class="line"><a name="l00479"></a><span class="lineno">  479</span>&#160;    <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml">ITfParser::TfParserImpl</a>* m_Parser;</div><div class="line"><a name="l00480"></a><span class="lineno">  480</span>&#160;    <span class="keyword">const</span> tensorflow::NodeDef&amp; m_Node;</div><div class="line"><a name="l00481"></a><span class="lineno">  481</span>&#160;};</div><div class="line"><a name="l00482"></a><span class="lineno">  482</span>&#160;<span class="comment"></span></div><div class="line"><a name="l00483"></a><span class="lineno">  483</span>&#160;<span class="comment">/// An ParsedTfOperation where the Armnn equivalent is a single layer,</span></div><div class="line"><a name="l00484"></a><span class="lineno">  484</span>&#160;<span class="comment">/// with output slots that correspond directly to the Tf node outputs.</span></div><div class="line"><a name="l00485"></a><span class="lineno">  485</span>&#160;<span class="comment"></span><span class="keyword">class </span>SingleLayerParsedTfOperation : <span class="keyword">public</span> ParsedTfOperation</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;<span class="keyword">public</span>:</div><div class="line"><a name="l00488"></a><span class="lineno">  488</span>&#160;    SingleLayerParsedTfOperation(<a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml">ITfParser::TfParserImpl</a>* parser,</div><div class="line"><a name="l00489"></a><span class="lineno">  489</span>&#160;                                 <span class="keyword">const</span> tensorflow::NodeDef&amp; node,</div><div class="line"><a name="l00490"></a><span class="lineno">  490</span>&#160;                                 <a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml">IConnectableLayer</a>* layer)</div><div class="line"><a name="l00491"></a><span class="lineno">  491</span>&#160;    : ParsedTfOperation(parser, node)</div><div class="line"><a name="l00492"></a><span class="lineno">  492</span>&#160;    , <a class="code" href="_subgraph_view_selector_8cpp.xhtml#ae7fc37b88ff10e9294ed1c72f2a25ac7">m_Layer</a>(layer)</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;</div><div class="line"><a name="l00496"></a><span class="lineno">  496</span>&#160;    <a class="code" href="classarmnn_1_1_i_output_slot.xhtml">IOutputSlot</a>&amp; ResolveArmnnOutputSlot(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> tfOutputIndex)<span class="keyword"> override</span></div><div class="line"><a name="l00497"></a><span class="lineno">  497</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l00498"></a><span class="lineno">  498</span>&#160;        <a class="code" href="_assert_8hpp.xhtml#a5698be69cbd5dfe6c28fcd9867e8cbed">ARMNN_ASSERT</a>(<a class="code" href="_subgraph_view_selector_8cpp.xhtml#ae7fc37b88ff10e9294ed1c72f2a25ac7">m_Layer</a>);</div><div class="line"><a name="l00499"></a><span class="lineno">  499</span>&#160;        <span class="comment">// Assumes one-to-one mapping between Tf and armnn output slots.</span></div><div class="line"><a name="l00500"></a><span class="lineno">  500</span>&#160;        <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> armnnOutputSlotIdx = tfOutputIndex;</div><div class="line"><a name="l00501"></a><span class="lineno">  501</span>&#160;        <span class="keywordflow">if</span> (armnnOutputSlotIdx &gt;= <a class="code" href="_subgraph_view_selector_8cpp.xhtml#ae7fc37b88ff10e9294ed1c72f2a25ac7">m_Layer</a>-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#a1594bddc87d6477df300317658f566bb">GetNumOutputSlots</a>())</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;            <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_parse_exception.xhtml">ParseException</a>(</div><div class="line"><a name="l00504"></a><span class="lineno">  504</span>&#160;                fmt::format(<span class="stringliteral">&quot;The requested output slot #{} &quot;</span></div><div class="line"><a name="l00505"></a><span class="lineno">  505</span>&#160;                            <span class="stringliteral">&quot;for {} does not exist {}&quot;</span>,</div><div class="line"><a name="l00506"></a><span class="lineno">  506</span>&#160;                            armnnOutputSlotIdx,</div><div class="line"><a name="l00507"></a><span class="lineno">  507</span>&#160;                            <a class="code" href="_subgraph_view_selector_8cpp.xhtml#ae7fc37b88ff10e9294ed1c72f2a25ac7">m_Layer</a>-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#a7ddf0cf6f620d59c10e63495ace795d0">GetName</a>(),</div><div class="line"><a name="l00508"></a><span class="lineno">  508</span>&#160;                            <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l00509"></a><span class="lineno">  509</span>&#160;        }</div><div class="line"><a name="l00510"></a><span class="lineno">  510</span>&#160;        <span class="keywordflow">return</span> <a class="code" href="_subgraph_view_selector_8cpp.xhtml#ae7fc37b88ff10e9294ed1c72f2a25ac7">m_Layer</a>-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#a0e36688a43c35668d8db5257274c68fe">GetOutputSlot</a>(armnnOutputSlotIdx);</div><div class="line"><a name="l00511"></a><span class="lineno">  511</span>&#160;    }</div><div class="line"><a name="l00512"></a><span class="lineno">  512</span>&#160;</div><div class="line"><a name="l00513"></a><span class="lineno">  513</span>&#160;<span class="keyword">protected</span>:</div><div class="line"><a name="l00514"></a><span class="lineno">  514</span>&#160;    <a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml">IConnectableLayer</a>* <a class="code" href="_subgraph_view_selector_8cpp.xhtml#ae7fc37b88ff10e9294ed1c72f2a25ac7">m_Layer</a>;</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="comment"></span></div><div class="line"><a name="l00517"></a><span class="lineno">  517</span>&#160;<span class="comment">/// A SingleLayerParsedTfOperation for deferred layer creation.</span></div><div class="line"><a name="l00518"></a><span class="lineno">  518</span>&#160;<span class="comment"></span><span class="keyword">class </span>DeferredSingleLayerParsedTfOperation : <span class="keyword">public</span> SingleLayerParsedTfOperation</div><div class="line"><a name="l00519"></a><span class="lineno">  519</span>&#160;{</div><div class="line"><a name="l00520"></a><span class="lineno">  520</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l00521"></a><span class="lineno">  521</span>&#160;    DeferredSingleLayerParsedTfOperation(<a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml">ITfParser::TfParserImpl</a>* parser, <span class="keyword">const</span> tensorflow::NodeDef&amp; node)</div><div class="line"><a name="l00522"></a><span class="lineno">  522</span>&#160;    : SingleLayerParsedTfOperation(parser, node, <span class="keyword">nullptr</span>)</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;    }</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;    <a class="code" href="classarmnn_1_1_i_output_slot.xhtml">IOutputSlot</a>&amp; ResolveArmnnOutputSlot(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> tfOutputIndex)<span class="keyword"> override</span></div><div class="line"><a name="l00527"></a><span class="lineno">  527</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l00528"></a><span class="lineno">  528</span>&#160;        <span class="keywordflow">if</span> (!<a class="code" href="_subgraph_view_selector_8cpp.xhtml#ae7fc37b88ff10e9294ed1c72f2a25ac7">m_Layer</a>)</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;            CreateLayerDeferred();</div><div class="line"><a name="l00531"></a><span class="lineno">  531</span>&#160;        }</div><div class="line"><a name="l00532"></a><span class="lineno">  532</span>&#160;        <span class="keywordflow">return</span> SingleLayerParsedTfOperation::ResolveArmnnOutputSlot(tfOutputIndex);</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;</div><div class="line"><a name="l00535"></a><span class="lineno">  535</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l00536"></a><span class="lineno">  536</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> CreateLayerDeferred() = 0;</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;</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"><a class="line" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a7789bc092c96403f549edf62955ac1c3">  540</a></span>&#160;ITfParser::TfParserImpl::TfParserImpl()</div><div class="line"><a name="l00541"></a><span class="lineno">  541</span>&#160;    : m_Network(nullptr, nullptr)</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;}</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;</div><div class="line"><a name="l00546"></a><span class="lineno"><a class="line" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#acbdfb887feb642038726a828bd748ff3">  546</a></span>&#160;<span class="keyword">const</span> tensorflow::NodeDef* <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#acbdfb887feb642038726a828bd748ff3">ITfParser::TfParserImpl::ResolveIdentityNode</a>(<span class="keyword">const</span> tensorflow::NodeDef* nodeDef)</div><div class="line"><a name="l00547"></a><span class="lineno">  547</span>&#160;{</div><div class="line"><a name="l00548"></a><span class="lineno">  548</span>&#160;    <span class="keywordflow">if</span> (nodeDef-&gt;op() != <span class="stringliteral">&quot;Identity&quot;</span>)</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="keywordflow">return</span> nodeDef;</div><div class="line"><a name="l00551"></a><span class="lineno">  551</span>&#160;    }</div><div class="line"><a name="l00552"></a><span class="lineno">  552</span>&#160;</div><div class="line"><a name="l00553"></a><span class="lineno">  553</span>&#160;    <span class="keywordflow">if</span> (nodeDef-&gt;input_size() != 1)</div><div class="line"><a name="l00554"></a><span class="lineno">  554</span>&#160;    {</div><div class="line"><a name="l00555"></a><span class="lineno">  555</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="l00556"></a><span class="lineno">  556</span>&#160;            fmt::format(<span class="stringliteral">&quot;Identity node should have a single input! {} has {} inputs {}&quot;</span>,</div><div class="line"><a name="l00557"></a><span class="lineno">  557</span>&#160;                        nodeDef-&gt;name(),</div><div class="line"><a name="l00558"></a><span class="lineno">  558</span>&#160;                        nodeDef-&gt;input_size(),</div><div class="line"><a name="l00559"></a><span class="lineno">  559</span>&#160;                        <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l00560"></a><span class="lineno">  560</span>&#160;    }</div><div class="line"><a name="l00561"></a><span class="lineno">  561</span>&#160;</div><div class="line"><a name="l00562"></a><span class="lineno">  562</span>&#160;    <span class="keyword">auto</span> it = <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#ac2c326b2757eadec924e4b7f56a9379c">m_NodesByName</a>.find(nodeDef-&gt;input(0));</div><div class="line"><a name="l00563"></a><span class="lineno">  563</span>&#160;    <span class="keywordflow">if</span> (it != <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#ac2c326b2757eadec924e4b7f56a9379c">m_NodesByName</a>.end())</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;        <span class="keyword">const</span> tensorflow::NodeDef* inputNode = it-&gt;second;</div><div class="line"><a name="l00566"></a><span class="lineno">  566</span>&#160;        <span class="keywordflow">return</span> <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#acbdfb887feb642038726a828bd748ff3">ResolveIdentityNode</a>(inputNode);</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;    <span class="keywordflow">else</span></div><div class="line"><a name="l00569"></a><span class="lineno">  569</span>&#160;    {</div><div class="line"><a name="l00570"></a><span class="lineno">  570</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="l00571"></a><span class="lineno">  571</span>&#160;            fmt::format(<span class="stringliteral">&quot;Cannot find what the Identity node {} is linked to! {}&quot;</span>,</div><div class="line"><a name="l00572"></a><span class="lineno">  572</span>&#160;                        nodeDef-&gt;name(),</div><div class="line"><a name="l00573"></a><span class="lineno">  573</span>&#160;                        <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l00574"></a><span class="lineno">  574</span>&#160;    }</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;</div><div class="line"><a name="l00577"></a><span class="lineno">  577</span>&#160;std::vector&lt;OutputOfConstNodeDef&gt;</div><div class="line"><a name="l00578"></a><span class="lineno"><a class="line" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a9e7a394f59e8d223a79e3db798803c1c">  578</a></span>&#160;<a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a9e7a394f59e8d223a79e3db798803c1c">ITfParser::TfParserImpl::GetTfInputNodes</a>(<span class="keyword">const</span> tensorflow::NodeDef&amp; nodeDef)<span class="keyword"> const</span></div><div class="line"><a name="l00579"></a><span class="lineno">  579</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l00580"></a><span class="lineno">  580</span>&#160;    std::vector&lt;OutputOfConstNodeDef&gt; ret;</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;    <span class="keywordflow">if</span> (nodeDef.op() == <span class="stringliteral">&quot;Const&quot;</span>)</div><div class="line"><a name="l00583"></a><span class="lineno">  583</span>&#160;    {</div><div class="line"><a name="l00584"></a><span class="lineno">  584</span>&#160;        <span class="comment">// For some reason const node can have &quot;Control Inputs&quot;. We ignore them for now.</span></div><div class="line"><a name="l00585"></a><span class="lineno">  585</span>&#160;        <span class="keywordflow">return</span> ret;</div><div class="line"><a name="l00586"></a><span class="lineno">  586</span>&#160;    }</div><div class="line"><a name="l00587"></a><span class="lineno">  587</span>&#160;</div><div class="line"><a name="l00588"></a><span class="lineno">  588</span>&#160;    ret.reserve(armnn::numeric_cast&lt;size_t&gt;(nodeDef.input_size()));</div><div class="line"><a name="l00589"></a><span class="lineno">  589</span>&#160;    <span class="keywordflow">for</span> (<span class="keywordtype">int</span> j = 0; j &lt; nodeDef.input_size(); ++j)</div><div class="line"><a name="l00590"></a><span class="lineno">  590</span>&#160;    {</div><div class="line"><a name="l00591"></a><span class="lineno">  591</span>&#160;        <a class="code" href="structarmnn_tf_parser_1_1_with_output_tensor_index.xhtml">OutputId</a> outputId = ParseOutputId(nodeDef.input(j));</div><div class="line"><a name="l00592"></a><span class="lineno">  592</span>&#160;</div><div class="line"><a name="l00593"></a><span class="lineno">  593</span>&#160;        <span class="keywordflow">if</span> (nodeDef.input(j)[0] == <span class="charliteral">&#39;^&#39;</span>) <span class="comment">// I couldn&#39;t find a better test for control inputs.</span></div><div class="line"><a name="l00594"></a><span class="lineno">  594</span>&#160;        {</div><div class="line"><a name="l00595"></a><span class="lineno">  595</span>&#160;            <span class="comment">// We currently allow Control Input from TensorFlow graph but we ignore them from ArmNN graph.</span></div><div class="line"><a name="l00596"></a><span class="lineno">  596</span>&#160;            <span class="keywordflow">continue</span>;</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;</div><div class="line"><a name="l00599"></a><span class="lineno">  599</span>&#160;        <span class="keyword">auto</span> inputIt = <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#ac2c326b2757eadec924e4b7f56a9379c">m_NodesByName</a>.find(outputId.<a class="code" href="structarmnn_tf_parser_1_1_with_output_tensor_index.xhtml#a08f2876bc5d60ed9c711ac7c26747305">m_IndexedValue</a>);</div><div class="line"><a name="l00600"></a><span class="lineno">  600</span>&#160;        <span class="keywordflow">if</span> (inputIt == <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#ac2c326b2757eadec924e4b7f56a9379c">m_NodesByName</a>.end())</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">  602</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="l00603"></a><span class="lineno">  603</span>&#160;                fmt::format(<span class="stringliteral">&quot;Can&#39;t find node &#39;{}&#39;, which is listed as an input of &#39;{}&#39; {}&quot;</span>,</div><div class="line"><a name="l00604"></a><span class="lineno">  604</span>&#160;                            nodeDef.input(j),</div><div class="line"><a name="l00605"></a><span class="lineno">  605</span>&#160;                            nodeDef.name(),</div><div class="line"><a name="l00606"></a><span class="lineno">  606</span>&#160;                            <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</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;        ret.push_back(<a class="code" href="namespacearmnn_tf_parser.xhtml#a4c8735480b01dbd0f75c63377fe054e9">OutputOfConstNodeDef</a>(inputIt-&gt;second,outputId.<a class="code" href="structarmnn_tf_parser_1_1_with_output_tensor_index.xhtml#a271b1a398c11fb4bf8603119041562c9">m_Index</a>));</div><div class="line"><a name="l00609"></a><span class="lineno">  609</span>&#160;    }</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">return</span> ret;</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;</div><div class="line"><a name="l00614"></a><span class="lineno">  614</span>&#160;std::vector&lt;OutputOfParsedTfOperation&gt;</div><div class="line"><a name="l00615"></a><span class="lineno"><a class="line" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#ae295ca8b7d19bb5e6db3f93bd4561ee0">  615</a></span>&#160;<a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#ae295ca8b7d19bb5e6db3f93bd4561ee0">ITfParser::TfParserImpl::GetInputParsedTfOperationsChecked</a>(<span class="keyword">const</span> tensorflow::NodeDef&amp; nodeDef,</div><div class="line"><a name="l00616"></a><span class="lineno">  616</span>&#160;                                            std::size_t expectedNumInputs)</div><div class="line"><a name="l00617"></a><span class="lineno">  617</span>&#160;{</div><div class="line"><a name="l00618"></a><span class="lineno">  618</span>&#160;    <span class="comment">// Fetches the tensorflow nodes connected as inputs and validate the size.</span></div><div class="line"><a name="l00619"></a><span class="lineno">  619</span>&#160;    std::vector&lt;OutputOfConstNodeDef&gt; nodes = <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a9e7a394f59e8d223a79e3db798803c1c">GetTfInputNodes</a>(nodeDef);</div><div class="line"><a name="l00620"></a><span class="lineno">  620</span>&#160;    <span class="keyword">const</span> std::size_t numInputs = nodes.size();</div><div class="line"><a name="l00621"></a><span class="lineno">  621</span>&#160;    <span class="keywordflow">if</span> (numInputs != expectedNumInputs)</div><div class="line"><a name="l00622"></a><span class="lineno">  622</span>&#160;    {</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>(</div><div class="line"><a name="l00624"></a><span class="lineno">  624</span>&#160;            fmt::format(<span class="stringliteral">&quot;Unexpected number of inputs for node {}. Expected {}, found {} {}&quot;</span>,</div><div class="line"><a name="l00625"></a><span class="lineno">  625</span>&#160;                        nodeDef.name(),</div><div class="line"><a name="l00626"></a><span class="lineno">  626</span>&#160;                        expectedNumInputs,</div><div class="line"><a name="l00627"></a><span class="lineno">  627</span>&#160;                        numInputs,</div><div class="line"><a name="l00628"></a><span class="lineno">  628</span>&#160;                        <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</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;    <span class="comment">// Fetches the corresponding ParsedTfOperation operations</span></div><div class="line"><a name="l00631"></a><span class="lineno">  631</span>&#160;    std::vector&lt;OutputOfParsedTfOperation&gt; result;</div><div class="line"><a name="l00632"></a><span class="lineno">  632</span>&#160;    <span class="keywordflow">for</span> (<span class="keyword">auto</span>&amp;&amp; node : nodes)</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;        <span class="keyword">auto</span> it = <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a8dd5c5f271f0f5bd68612e7927d94e58">m_ParsedTfOperations</a>.find(node.m_IndexedValue-&gt;name());</div><div class="line"><a name="l00635"></a><span class="lineno">  635</span>&#160;        <span class="keywordflow">if</span> (it == <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a8dd5c5f271f0f5bd68612e7927d94e58">m_ParsedTfOperations</a>.end())</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;            <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_parse_exception.xhtml">ParseException</a>(</div><div class="line"><a name="l00638"></a><span class="lineno">  638</span>&#160;                fmt::format(<span class="stringliteral">&quot;Node with name &#39;{}&#39; has not been parsed {}&quot;</span>,</div><div class="line"><a name="l00639"></a><span class="lineno">  639</span>&#160;                            node.m_IndexedValue-&gt;name(),</div><div class="line"><a name="l00640"></a><span class="lineno">  640</span>&#160;                            <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l00641"></a><span class="lineno">  641</span>&#160;        }</div><div class="line"><a name="l00642"></a><span class="lineno">  642</span>&#160;        <a class="code" href="classarmnn_tf_parser_1_1_i_tf_parser.xhtml#a81cd010ead68e4d96e6cb28255143f49">ParsedTfOperation</a>* parsedOp = it-&gt;second.get();</div><div class="line"><a name="l00643"></a><span class="lineno">  643</span>&#160;        <span class="comment">// Transparently &#39;skip&#39; any Identity operations. This simplifies the logic inside the ParseXXX() functions.</span></div><div class="line"><a name="l00644"></a><span class="lineno">  644</span>&#160;        parsedOp = parsedOp-&gt;ResolveIdentityOperations();</div><div class="line"><a name="l00645"></a><span class="lineno">  645</span>&#160;        result.push_back(<a class="code" href="namespacearmnn_tf_parser.xhtml#ad85fe4a9bf2aff90c53bc2f50c8931e6">OutputOfParsedTfOperation</a>(parsedOp,node.m_Index));</div><div class="line"><a name="l00646"></a><span class="lineno">  646</span>&#160;    }</div><div class="line"><a name="l00647"></a><span class="lineno">  647</span>&#160;    <span class="keywordflow">return</span> result;</div><div class="line"><a name="l00648"></a><span class="lineno">  648</span>&#160;}</div><div class="line"><a name="l00649"></a><span class="lineno">  649</span>&#160;</div><div class="line"><a name="l00650"></a><span class="lineno"><a class="line" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#aee1bc04a8977a1a8755243ed9e54f8e2">  650</a></span>&#160;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml">IConnectableLayer</a>* <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#aee1bc04a8977a1a8755243ed9e54f8e2">ITfParser::TfParserImpl::CreateAdditionLayer</a>(</div><div class="line"><a name="l00651"></a><span class="lineno">  651</span>&#160;            <span class="keyword">const</span> tensorflow::NodeDef&amp; nodeDef,</div><div class="line"><a name="l00652"></a><span class="lineno">  652</span>&#160;            <a class="code" href="classarmnn_1_1_i_output_slot.xhtml">IOutputSlot</a>* input0Slot,</div><div class="line"><a name="l00653"></a><span class="lineno">  653</span>&#160;            <a class="code" href="classarmnn_1_1_i_output_slot.xhtml">IOutputSlot</a>* input1Slot,</div><div class="line"><a name="l00654"></a><span class="lineno">  654</span>&#160;            <span class="keyword">const</span> std::string&amp; layerName)</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="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a>&amp; input0Info = input0Slot-&gt;<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#a9943775a364fc4ab53b85ac88f311886">GetTensorInfo</a>();</div><div class="line"><a name="l00657"></a><span class="lineno">  657</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a>&amp; input1Info = input1Slot-&gt;<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#a9943775a364fc4ab53b85ac88f311886">GetTensorInfo</a>();</div><div class="line"><a name="l00658"></a><span class="lineno">  658</span>&#160;</div><div class="line"><a name="l00659"></a><span class="lineno">  659</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> input0Dim = input0Info.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a157e27d41e9f6b21f0d3c025fa47dc24">GetNumDimensions</a>();</div><div class="line"><a name="l00660"></a><span class="lineno">  660</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> input1Dim = input1Info.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a157e27d41e9f6b21f0d3c025fa47dc24">GetNumDimensions</a>();</div><div class="line"><a name="l00661"></a><span class="lineno">  661</span>&#160;    <span class="keywordflow">if</span> (input0Dim != input1Dim)</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;        <span class="comment">// broadcasting where input0 and input1 have different number of dimensions</span></div><div class="line"><a name="l00664"></a><span class="lineno">  664</span>&#160;        <span class="comment">// is only supported for 1D and 4D tensors pair</span></div><div class="line"><a name="l00665"></a><span class="lineno">  665</span>&#160;        <span class="keywordflow">if</span> (input0Dim == 1 &amp;&amp; input1Dim == 4)</div><div class="line"><a name="l00666"></a><span class="lineno">  666</span>&#160;        {</div><div class="line"><a name="l00667"></a><span class="lineno">  667</span>&#160;            input0Slot = <a class="code" href="namespacearmnn_1_1optimizations.xhtml#a4fc55afb4885278ad1510b2c4307af76">AddBroadcastReshapeLayer</a>(input1Slot, input0Slot, <span class="keyword">true</span>, *<a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a2db3ae8d422f17d455e0ba0cb6291d2a">m_Network</a>, nodeDef);</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;        <span class="keywordflow">else</span> <span class="keywordflow">if</span> (input0Dim == 4 &amp;&amp; input1Dim == 1)</div><div class="line"><a name="l00670"></a><span class="lineno">  670</span>&#160;        {</div><div class="line"><a name="l00671"></a><span class="lineno">  671</span>&#160;            input1Slot = <a class="code" href="namespacearmnn_1_1optimizations.xhtml#a4fc55afb4885278ad1510b2c4307af76">AddBroadcastReshapeLayer</a>(input0Slot, input1Slot, <span class="keyword">true</span>, *<a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a2db3ae8d422f17d455e0ba0cb6291d2a">m_Network</a>, nodeDef);</div><div class="line"><a name="l00672"></a><span class="lineno">  672</span>&#160;        }</div><div class="line"><a name="l00673"></a><span class="lineno">  673</span>&#160;        <span class="keywordflow">else</span></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="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_parse_exception.xhtml">ParseException</a>(</div><div class="line"><a name="l00676"></a><span class="lineno">  676</span>&#160;                    fmt::format(<span class="stringliteral">&quot;Unsupported broadcast configuration for {} operation {} {}&quot;</span>,</div><div class="line"><a name="l00677"></a><span class="lineno">  677</span>&#160;                                layerName,</div><div class="line"><a name="l00678"></a><span class="lineno">  678</span>&#160;                                nodeDef.name(),</div><div class="line"><a name="l00679"></a><span class="lineno">  679</span>&#160;                                <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</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;    }</div><div class="line"><a name="l00682"></a><span class="lineno">  682</span>&#160;    <a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml">IConnectableLayer</a>* <span class="keyword">const</span> layer = <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a2db3ae8d422f17d455e0ba0cb6291d2a">m_Network</a>-&gt;AddAdditionLayer(layerName.c_str());</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;    input0Slot-&gt;<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#ac1835f8756a9f03c02fcf9664e3a0fce">Connect</a>(layer-&gt;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml#a6ec9e0eb66d7d6a01240492a0b18104c">GetInputSlot</a>(0));</div><div class="line"><a name="l00685"></a><span class="lineno">  685</span>&#160;    input1Slot-&gt;<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#ac1835f8756a9f03c02fcf9664e3a0fce">Connect</a>(layer-&gt;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml#a6ec9e0eb66d7d6a01240492a0b18104c">GetInputSlot</a>(1));</div><div class="line"><a name="l00686"></a><span class="lineno">  686</span>&#160;</div><div class="line"><a name="l00687"></a><span class="lineno">  687</span>&#160;    <span class="comment">// Ensure the output tensor has the correct dimensions even if a broadcast has been done</span></div><div class="line"><a name="l00688"></a><span class="lineno">  688</span>&#160;    <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> outputInfo = input0Slot-&gt;<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#a9943775a364fc4ab53b85ac88f311886">GetTensorInfo</a>();</div><div class="line"><a name="l00689"></a><span class="lineno">  689</span>&#160;    std::vector&lt;unsigned int&gt; outputShape;</div><div class="line"><a name="l00690"></a><span class="lineno">  690</span>&#160;</div><div class="line"><a name="l00691"></a><span class="lineno">  691</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_shape.xhtml">TensorShape</a>&amp; input0Shape = input0Slot-&gt;<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#a9943775a364fc4ab53b85ac88f311886">GetTensorInfo</a>().<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a8b5d0f8a24e9d9238f412260a552acf8">GetShape</a>();</div><div class="line"><a name="l00692"></a><span class="lineno">  692</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_shape.xhtml">TensorShape</a>&amp; input1Shape = input1Slot-&gt;<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#a9943775a364fc4ab53b85ac88f311886">GetTensorInfo</a>().<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a8b5d0f8a24e9d9238f412260a552acf8">GetShape</a>();</div><div class="line"><a name="l00693"></a><span class="lineno">  693</span>&#160;</div><div class="line"><a name="l00694"></a><span class="lineno">  694</span>&#160;    <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i = 0; i &lt; input0Shape.<a class="code" href="classarmnn_1_1_tensor_shape.xhtml#a157e27d41e9f6b21f0d3c025fa47dc24">GetNumDimensions</a>(); i++)</div><div class="line"><a name="l00695"></a><span class="lineno">  695</span>&#160;    {</div><div class="line"><a name="l00696"></a><span class="lineno">  696</span>&#160;        outputShape.push_back(std::max(input0Shape[i], input1Shape[i]));</div><div class="line"><a name="l00697"></a><span class="lineno">  697</span>&#160;    }</div><div class="line"><a name="l00698"></a><span class="lineno">  698</span>&#160;</div><div class="line"><a name="l00699"></a><span class="lineno">  699</span>&#160;    outputInfo.<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>(input0Shape.<a class="code" href="classarmnn_1_1_tensor_shape.xhtml#a157e27d41e9f6b21f0d3c025fa47dc24">GetNumDimensions</a>(), outputShape.data()));</div><div class="line"><a name="l00700"></a><span class="lineno">  700</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);</div><div class="line"><a name="l00701"></a><span class="lineno">  701</span>&#160;</div><div class="line"><a name="l00702"></a><span class="lineno">  702</span>&#160;    <span class="keywordflow">return</span> layer;</div><div class="line"><a name="l00703"></a><span class="lineno">  703</span>&#160;}</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"><a class="line" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#ae65a0d536c7e4e26151b9e2574c64c4e">  705</a></span>&#160;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml">IConnectableLayer</a>* <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#aee1bc04a8977a1a8755243ed9e54f8e2">ITfParser::TfParserImpl::CreateAdditionLayer</a>(</div><div class="line"><a name="l00706"></a><span class="lineno">  706</span>&#160;            <span class="keyword">const</span> tensorflow::NodeDef&amp; nodeDef,</div><div class="line"><a name="l00707"></a><span class="lineno">  707</span>&#160;            <a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml">IConnectableLayer</a>* layerOne,</div><div class="line"><a name="l00708"></a><span class="lineno">  708</span>&#160;            <a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml">IConnectableLayer</a>* layerTwo,</div><div class="line"><a name="l00709"></a><span class="lineno">  709</span>&#160;            <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> numberOfAddition,</div><div class="line"><a name="l00710"></a><span class="lineno">  710</span>&#160;            <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> numberOfLayersToConnect,</div><div class="line"><a name="l00711"></a><span class="lineno">  711</span>&#160;            <span class="keywordtype">bool</span> isOdd)</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;    <a class="code" href="classarmnn_1_1_i_output_slot.xhtml">IOutputSlot</a>* input0Slot = &amp;layerOne-&gt;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml#a80ac4eda2e7f2757ec9dd96fc96dbd16">GetOutputSlot</a>(0);</div><div class="line"><a name="l00714"></a><span class="lineno">  714</span>&#160;    <a class="code" href="classarmnn_1_1_i_output_slot.xhtml">IOutputSlot</a>* input1Slot = &amp;layerTwo-&gt;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml#a80ac4eda2e7f2757ec9dd96fc96dbd16">GetOutputSlot</a>(0);</div><div class="line"><a name="l00715"></a><span class="lineno">  715</span>&#160;    std::string layerName(nodeDef.name());</div><div class="line"><a name="l00716"></a><span class="lineno">  716</span>&#160;    <span class="keywordflow">if</span> (isOdd || numberOfLayersToConnect != 2)</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="comment">// we are not connecting the final layer</span></div><div class="line"><a name="l00719"></a><span class="lineno">  719</span>&#160;        layerName.append(<span class="stringliteral">&quot;_addN_&quot;</span>).append(std::to_string(numberOfAddition));</div><div class="line"><a name="l00720"></a><span class="lineno">  720</span>&#160;    }</div><div class="line"><a name="l00721"></a><span class="lineno">  721</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#aee1bc04a8977a1a8755243ed9e54f8e2">CreateAdditionLayer</a>(nodeDef, input0Slot, input1Slot, layerName);</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"><a class="line" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a46aa829ec45268469dacead34f4f2e02">  724</a></span>&#160;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml">IConnectableLayer</a>* <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#aee1bc04a8977a1a8755243ed9e54f8e2">ITfParser::TfParserImpl::CreateAdditionLayer</a>(</div><div class="line"><a name="l00725"></a><span class="lineno">  725</span>&#160;        <span class="keyword">const</span> tensorflow::NodeDef&amp; nodeDef,</div><div class="line"><a name="l00726"></a><span class="lineno">  726</span>&#160;        <span class="keyword">const</span> <a class="code" href="structarmnn_tf_parser_1_1_with_output_tensor_index.xhtml">OutputOfParsedTfOperation</a>&amp; opOne,</div><div class="line"><a name="l00727"></a><span class="lineno">  727</span>&#160;        <span class="keyword">const</span> <a class="code" href="structarmnn_tf_parser_1_1_with_output_tensor_index.xhtml">OutputOfParsedTfOperation</a>&amp; opTwo,</div><div class="line"><a name="l00728"></a><span class="lineno">  728</span>&#160;        <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> numberOfAddition)</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;    <a class="code" href="classarmnn_1_1_i_output_slot.xhtml">IOutputSlot</a>* input0Slot = &amp;opOne.<a class="code" href="structarmnn_tf_parser_1_1_with_output_tensor_index.xhtml#a08f2876bc5d60ed9c711ac7c26747305">m_IndexedValue</a>-&gt;ResolveArmnnOutputSlot(opOne.<a class="code" href="structarmnn_tf_parser_1_1_with_output_tensor_index.xhtml#a271b1a398c11fb4bf8603119041562c9">m_Index</a>);</div><div class="line"><a name="l00731"></a><span class="lineno">  731</span>&#160;    <a class="code" href="classarmnn_1_1_i_output_slot.xhtml">IOutputSlot</a>* input1Slot = &amp;opTwo.<a class="code" href="structarmnn_tf_parser_1_1_with_output_tensor_index.xhtml#a08f2876bc5d60ed9c711ac7c26747305">m_IndexedValue</a>-&gt;ResolveArmnnOutputSlot(opTwo.<a class="code" href="structarmnn_tf_parser_1_1_with_output_tensor_index.xhtml#a271b1a398c11fb4bf8603119041562c9">m_Index</a>);</div><div class="line"><a name="l00732"></a><span class="lineno">  732</span>&#160;    std::string layerName(nodeDef.name());</div><div class="line"><a name="l00733"></a><span class="lineno">  733</span>&#160;    layerName.append(<span class="stringliteral">&quot;_addN_&quot;</span>).append(std::to_string(numberOfAddition));</div><div class="line"><a name="l00734"></a><span class="lineno">  734</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#aee1bc04a8977a1a8755243ed9e54f8e2">CreateAdditionLayer</a>(nodeDef, input0Slot, input1Slot, layerName);</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"><a class="line" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a614a576a18e510e4e7898259ce693ee7">  737</a></span>&#160;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml">IConnectableLayer</a>* <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#aee1bc04a8977a1a8755243ed9e54f8e2">ITfParser::TfParserImpl::CreateAdditionLayer</a>(</div><div class="line"><a name="l00738"></a><span class="lineno">  738</span>&#160;            <span class="keyword">const</span> tensorflow::NodeDef&amp; nodeDef,</div><div class="line"><a name="l00739"></a><span class="lineno">  739</span>&#160;            <span class="keyword">const</span> <a class="code" href="structarmnn_tf_parser_1_1_with_output_tensor_index.xhtml">OutputOfParsedTfOperation</a>&amp; op,</div><div class="line"><a name="l00740"></a><span class="lineno">  740</span>&#160;            <a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml">IConnectableLayer</a>* layer)</div><div class="line"><a name="l00741"></a><span class="lineno">  741</span>&#160;{</div><div class="line"><a name="l00742"></a><span class="lineno">  742</span>&#160;    <a class="code" href="classarmnn_1_1_i_output_slot.xhtml">IOutputSlot</a>* input0Slot = &amp;op.<a class="code" href="structarmnn_tf_parser_1_1_with_output_tensor_index.xhtml#a08f2876bc5d60ed9c711ac7c26747305">m_IndexedValue</a>-&gt;ResolveArmnnOutputSlot(op.<a class="code" href="structarmnn_tf_parser_1_1_with_output_tensor_index.xhtml#a271b1a398c11fb4bf8603119041562c9">m_Index</a>);</div><div class="line"><a name="l00743"></a><span class="lineno">  743</span>&#160;    <a class="code" href="classarmnn_1_1_i_output_slot.xhtml">IOutputSlot</a>* input1Slot = &amp;layer-&gt;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml#a80ac4eda2e7f2757ec9dd96fc96dbd16">GetOutputSlot</a>(0);</div><div class="line"><a name="l00744"></a><span class="lineno">  744</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#aee1bc04a8977a1a8755243ed9e54f8e2">CreateAdditionLayer</a>(nodeDef, input0Slot, input1Slot, nodeDef.name());</div><div class="line"><a name="l00745"></a><span class="lineno">  745</span>&#160;}</div><div class="line"><a name="l00746"></a><span class="lineno">  746</span>&#160;</div><div class="line"><a name="l00747"></a><span class="lineno"><a class="line" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#acd911785f874efd8628779cfcc37593b">  747</a></span>&#160;<a class="code" href="namespacearmnn_tf_parser.xhtml#aa36bf288c19fe35767bb6e059636f405">ParsedTfOperationPtr</a> <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#acd911785f874efd8628779cfcc37593b">ITfParser::TfParserImpl::ParseAddN</a>(<span class="keyword">const</span> tensorflow::NodeDef&amp; nodeDef,</div><div class="line"><a name="l00748"></a><span class="lineno">  748</span>&#160;                                                        <span class="keyword">const</span> tensorflow::GraphDef&amp; graphDef)</div><div class="line"><a name="l00749"></a><span class="lineno">  749</span>&#160;{</div><div class="line"><a name="l00750"></a><span class="lineno">  750</span>&#160;    <a class="code" href="namespacearmnn.xhtml#a44affeeb090c3c6a3062830562672e84">IgnoreUnused</a>(graphDef);</div><div class="line"><a name="l00751"></a><span class="lineno">  751</span>&#160;    uint32_t numberOfInputs = ReadMandatoryNodeUint32Attribute(nodeDef, <span class="stringliteral">&quot;N&quot;</span>);</div><div class="line"><a name="l00752"></a><span class="lineno">  752</span>&#160;    <span class="keywordflow">if</span> (numberOfInputs &lt; 2)</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="comment">// should never happen</span></div><div class="line"><a name="l00755"></a><span class="lineno">  755</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="l00756"></a><span class="lineno">  756</span>&#160;                fmt::format(<span class="stringliteral">&quot;AddN Node with name &#39;{}&#39; has less than two ({}) inputs {}&quot;</span>,</div><div class="line"><a name="l00757"></a><span class="lineno">  757</span>&#160;                            nodeDef.name(),</div><div class="line"><a name="l00758"></a><span class="lineno">  758</span>&#160;                            std::to_string(numberOfInputs),</div><div class="line"><a name="l00759"></a><span class="lineno">  759</span>&#160;                            <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</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;    <span class="keywordflow">else</span> <span class="keywordflow">if</span> (numberOfInputs == 2)</div><div class="line"><a name="l00762"></a><span class="lineno">  762</span>&#160;    {</div><div class="line"><a name="l00763"></a><span class="lineno">  763</span>&#160;        <span class="comment">//this is the same as a simple Add operation</span></div><div class="line"><a name="l00764"></a><span class="lineno">  764</span>&#160;        <span class="keywordflow">return</span> <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a19ef0406d9678e177106095779f0546e">AddAdditionLayer</a>(nodeDef, <span class="keyword">false</span>);</div><div class="line"><a name="l00765"></a><span class="lineno">  765</span>&#160;    }</div><div class="line"><a name="l00766"></a><span class="lineno">  766</span>&#160;    <span class="keywordflow">else</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;        <span class="comment">// build a binary tree of Add layers and return the final Add as the return from the function</span></div><div class="line"><a name="l00769"></a><span class="lineno">  769</span>&#160;        <span class="comment">// if we have an odd number of inputs then the final Add will consist of a layer connecting to an</span></div><div class="line"><a name="l00770"></a><span class="lineno">  770</span>&#160;        <span class="comment">// OutputOfParsedTfOperation, otherwise it will be two layers being added together</span></div><div class="line"><a name="l00771"></a><span class="lineno">  771</span>&#160;        std::vector&lt;OutputOfParsedTfOperation&gt; inputs = <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#ae295ca8b7d19bb5e6db3f93bd4561ee0">GetInputParsedTfOperationsChecked</a>(nodeDef, numberOfInputs);</div><div class="line"><a name="l00772"></a><span class="lineno">  772</span>&#160;        <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> numberOfAdditions = 0;</div><div class="line"><a name="l00773"></a><span class="lineno">  773</span>&#160;        std::vector&lt;IConnectableLayer*&gt; layers;</div><div class="line"><a name="l00774"></a><span class="lineno">  774</span>&#160;        <span class="comment">// NOTE: at this point we will have a minimum of three inputs</span></div><div class="line"><a name="l00775"></a><span class="lineno">  775</span>&#160;        <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i = 0; i &lt; numberOfInputs; ++i)</div><div class="line"><a name="l00776"></a><span class="lineno">  776</span>&#160;        {</div><div class="line"><a name="l00777"></a><span class="lineno">  777</span>&#160;            <span class="comment">// every time i is odd we have two inputs to process.</span></div><div class="line"><a name="l00778"></a><span class="lineno">  778</span>&#160;            <span class="keywordtype">bool</span> onSecondItem = i % 2;</div><div class="line"><a name="l00779"></a><span class="lineno">  779</span>&#160;            <span class="keywordflow">if</span> (onSecondItem)</div><div class="line"><a name="l00780"></a><span class="lineno">  780</span>&#160;            {</div><div class="line"><a name="l00781"></a><span class="lineno">  781</span>&#160;                ++numberOfAdditions;</div><div class="line"><a name="l00782"></a><span class="lineno">  782</span>&#160;                <a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml">IConnectableLayer</a>* newLayer = <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#aee1bc04a8977a1a8755243ed9e54f8e2">CreateAdditionLayer</a>(</div><div class="line"><a name="l00783"></a><span class="lineno">  783</span>&#160;                        nodeDef, inputs[ i - 1], inputs[i], numberOfAdditions);</div><div class="line"><a name="l00784"></a><span class="lineno">  784</span>&#160;                layers.push_back(newLayer);</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;        }</div><div class="line"><a name="l00787"></a><span class="lineno">  787</span>&#160;</div><div class="line"><a name="l00788"></a><span class="lineno">  788</span>&#160;        std::vector&lt;IConnectableLayer*&gt; layersToConnect(layers);</div><div class="line"><a name="l00789"></a><span class="lineno">  789</span>&#160;        <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> numberOfLayersToConnect = layersToConnect.size();</div><div class="line"><a name="l00790"></a><span class="lineno">  790</span>&#160;        <span class="keywordtype">bool</span> isOdd = numberOfInputs % 2;</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;        <span class="keywordflow">while</span> (numberOfLayersToConnect &gt; 1)</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;            layers.clear();</div><div class="line"><a name="l00795"></a><span class="lineno">  795</span>&#160;            <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> i = 0; i &lt; numberOfLayersToConnect; ++i) {</div><div class="line"><a name="l00796"></a><span class="lineno">  796</span>&#160;                <span class="keywordtype">bool</span> onSecondItem = i % 2;</div><div class="line"><a name="l00797"></a><span class="lineno">  797</span>&#160;                <span class="keywordflow">if</span> (onSecondItem) {</div><div class="line"><a name="l00798"></a><span class="lineno">  798</span>&#160;                    ++numberOfAdditions;</div><div class="line"><a name="l00799"></a><span class="lineno">  799</span>&#160;                    <a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml">IConnectableLayer</a>* newLayer = <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#aee1bc04a8977a1a8755243ed9e54f8e2">CreateAdditionLayer</a>(</div><div class="line"><a name="l00800"></a><span class="lineno">  800</span>&#160;                        nodeDef,</div><div class="line"><a name="l00801"></a><span class="lineno">  801</span>&#160;                        layersToConnect[i - 1],</div><div class="line"><a name="l00802"></a><span class="lineno">  802</span>&#160;                        layersToConnect[i],</div><div class="line"><a name="l00803"></a><span class="lineno">  803</span>&#160;                        numberOfAdditions,</div><div class="line"><a name="l00804"></a><span class="lineno">  804</span>&#160;                        numberOfLayersToConnect,</div><div class="line"><a name="l00805"></a><span class="lineno">  805</span>&#160;                        isOdd);</div><div class="line"><a name="l00806"></a><span class="lineno">  806</span>&#160;                    layers.push_back(newLayer);</div><div class="line"><a name="l00807"></a><span class="lineno">  807</span>&#160;                }</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="comment">//OK... need to go again... maybe</span></div><div class="line"><a name="l00810"></a><span class="lineno">  810</span>&#160;            layersToConnect = layers;</div><div class="line"><a name="l00811"></a><span class="lineno">  811</span>&#160;            numberOfLayersToConnect = layersToConnect.size();</div><div class="line"><a name="l00812"></a><span class="lineno">  812</span>&#160;        }</div><div class="line"><a name="l00813"></a><span class="lineno">  813</span>&#160;        <a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml">IConnectableLayer</a>* finalLayer = layersToConnect[0];</div><div class="line"><a name="l00814"></a><span class="lineno">  814</span>&#160;        <span class="comment">// if we had an odd number of inputs we need to connect the final layer to the</span></div><div class="line"><a name="l00815"></a><span class="lineno">  815</span>&#160;        <span class="comment">// last OutputOfParsedTfOperation in order to create the last Add layer we will</span></div><div class="line"><a name="l00816"></a><span class="lineno">  816</span>&#160;        <span class="comment">// be handing back.</span></div><div class="line"><a name="l00817"></a><span class="lineno">  817</span>&#160;        <span class="keywordflow">if</span> (isOdd)</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;            <span class="comment">// connect the final layer to the last op</span></div><div class="line"><a name="l00820"></a><span class="lineno">  820</span>&#160;            finalLayer = <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#aee1bc04a8977a1a8755243ed9e54f8e2">CreateAdditionLayer</a>(nodeDef, inputs[numberOfInputs - 1], finalLayer);</div><div class="line"><a name="l00821"></a><span class="lineno">  821</span>&#160;        }</div><div class="line"><a name="l00822"></a><span class="lineno">  822</span>&#160;        <span class="keywordflow">return</span> std::make_unique&lt;SingleLayerParsedTfOperation&gt;(<span class="keyword">this</span>, nodeDef, finalLayer);</div><div class="line"><a name="l00823"></a><span class="lineno">  823</span>&#160;    }</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"><a class="line" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a77cc856aea1ab0acd3a4bd7709fb18a3">  826</a></span>&#160;<a class="code" href="namespacearmnn_tf_parser.xhtml#aa36bf288c19fe35767bb6e059636f405">ParsedTfOperationPtr</a> <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a77cc856aea1ab0acd3a4bd7709fb18a3">ITfParser::TfParserImpl::ParseAdd</a>(<span class="keyword">const</span> tensorflow::NodeDef&amp; nodeDef,</div><div class="line"><a name="l00827"></a><span class="lineno">  827</span>&#160;                                                       <span class="keyword">const</span> tensorflow::GraphDef&amp; graphDef)</div><div class="line"><a name="l00828"></a><span class="lineno">  828</span>&#160;{</div><div class="line"><a name="l00829"></a><span class="lineno">  829</span>&#160;    <a class="code" href="namespacearmnn.xhtml#a44affeeb090c3c6a3062830562672e84">IgnoreUnused</a>(graphDef);</div><div class="line"><a name="l00830"></a><span class="lineno">  830</span>&#160;    std::vector&lt;OutputOfParsedTfOperation&gt; inputs = <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#ae295ca8b7d19bb5e6db3f93bd4561ee0">GetInputParsedTfOperationsChecked</a>(nodeDef, 2);</div><div class="line"><a name="l00831"></a><span class="lineno">  831</span>&#160;</div><div class="line"><a name="l00832"></a><span class="lineno">  832</span>&#160;    <span class="comment">// If one of the inputs is a MatMul and the other is a const, then we handle both nodes</span></div><div class="line"><a name="l00833"></a><span class="lineno">  833</span>&#160;    <span class="comment">// together as FullyConnected.</span></div><div class="line"><a name="l00834"></a><span class="lineno">  834</span>&#160;    <span class="keywordflow">if</span> (inputs[0].m_IndexedValue-&gt;GetNode().op() == <span class="stringliteral">&quot;MatMul&quot;</span> &amp;&amp;</div><div class="line"><a name="l00835"></a><span class="lineno">  835</span>&#160;        HasParsedConstTensor&lt;float&gt;(inputs[1].m_IndexedValue-&gt;GetNode().name()))</div><div class="line"><a name="l00836"></a><span class="lineno">  836</span>&#160;    {</div><div class="line"><a name="l00837"></a><span class="lineno">  837</span>&#160;        <a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml">IConnectableLayer</a>* layer =</div><div class="line"><a name="l00838"></a><span class="lineno">  838</span>&#160;            <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a64bdfd07d439803d0ec4c8b9b5c3e442">AddFullyConnectedLayer</a>(inputs[0].m_IndexedValue-&gt;GetNode(),</div><div class="line"><a name="l00839"></a><span class="lineno">  839</span>&#160;                                   &amp;nodeDef,nodeDef.name().c_str());</div><div class="line"><a name="l00840"></a><span class="lineno">  840</span>&#160;        <span class="keywordflow">return</span> std::make_unique&lt;SingleLayerParsedTfOperation&gt;(<span class="keyword">this</span>, nodeDef, layer);</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;    <span class="keywordflow">else</span> <span class="keywordflow">if</span> (HasParsedConstTensor&lt;float&gt;(inputs[0].m_IndexedValue-&gt;GetNode().name()) &amp;&amp;</div><div class="line"><a name="l00843"></a><span class="lineno">  843</span>&#160;                                         inputs[1].m_IndexedValue-&gt;GetNode().op() == <span class="stringliteral">&quot;MatMul&quot;</span>)</div><div class="line"><a name="l00844"></a><span class="lineno">  844</span>&#160;    {</div><div class="line"><a name="l00845"></a><span class="lineno">  845</span>&#160;        <a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml">IConnectableLayer</a>* layer =</div><div class="line"><a name="l00846"></a><span class="lineno">  846</span>&#160;            <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a64bdfd07d439803d0ec4c8b9b5c3e442">AddFullyConnectedLayer</a>(inputs[1].m_IndexedValue-&gt;GetNode(),</div><div class="line"><a name="l00847"></a><span class="lineno">  847</span>&#160;                                   &amp;nodeDef,nodeDef.name().c_str());</div><div class="line"><a name="l00848"></a><span class="lineno">  848</span>&#160;        <span class="keywordflow">return</span> std::make_unique&lt;SingleLayerParsedTfOperation&gt;(<span class="keyword">this</span>, nodeDef, layer);</div><div class="line"><a name="l00849"></a><span class="lineno">  849</span>&#160;    }</div><div class="line"><a name="l00850"></a><span class="lineno">  850</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l00851"></a><span class="lineno">  851</span>&#160;    {</div><div class="line"><a name="l00852"></a><span class="lineno">  852</span>&#160;        <span class="comment">// Otherwise it&#39;s just a regular addition.</span></div><div class="line"><a name="l00853"></a><span class="lineno">  853</span>&#160;        <span class="keywordflow">return</span> <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a19ef0406d9678e177106095779f0546e">AddAdditionLayer</a>(nodeDef);</div><div class="line"><a name="l00854"></a><span class="lineno">  854</span>&#160;    }</div><div class="line"><a name="l00855"></a><span class="lineno">  855</span>&#160;}</div><div class="line"><a name="l00856"></a><span class="lineno">  856</span>&#160;</div><div class="line"><a name="l00857"></a><span class="lineno"><a class="line" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a052b1116b8e9002b58610a375793ae1b">  857</a></span>&#160;<a class="code" href="namespacearmnn_tf_parser.xhtml#aa36bf288c19fe35767bb6e059636f405">ParsedTfOperationPtr</a> <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a052b1116b8e9002b58610a375793ae1b">ITfParser::TfParserImpl::ParseBiasAdd</a>(<span class="keyword">const</span> tensorflow::NodeDef&amp; nodeDef,</div><div class="line"><a name="l00858"></a><span class="lineno">  858</span>&#160;                                                           <span class="keyword">const</span> tensorflow::GraphDef&amp; graphDef)</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="namespacearmnn.xhtml#a44affeeb090c3c6a3062830562672e84">IgnoreUnused</a>(graphDef);</div><div class="line"><a name="l00861"></a><span class="lineno">  861</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a19ef0406d9678e177106095779f0546e">AddAdditionLayer</a>(nodeDef, <span class="keyword">true</span>);</div><div class="line"><a name="l00862"></a><span class="lineno">  862</span>&#160;}</div><div class="line"><a name="l00863"></a><span class="lineno">  863</span>&#160;<span class="comment"></span></div><div class="line"><a name="l00864"></a><span class="lineno">  864</span>&#160;<span class="comment">/// An ParsedTfOperation which forwards to another (used for Identity nodes).</span></div><div class="line"><a name="l00865"></a><span class="lineno">  865</span>&#160;<span class="comment"></span><span class="keyword">class </span><a class="code" href="classarmnn_tf_parser_1_1_i_tf_parser.xhtml#a793e71d331e03f1811f43fc59d501e1e">ParsedIdentityTfOperation</a> : <span class="keyword">public</span> <a class="code" href="classarmnn_tf_parser_1_1_i_tf_parser.xhtml#a81cd010ead68e4d96e6cb28255143f49">ParsedTfOperation</a></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="keyword">public</span>:</div><div class="line"><a name="l00868"></a><span class="lineno">  868</span>&#160;    <a class="code" href="classarmnn_tf_parser_1_1_i_tf_parser.xhtml#a793e71d331e03f1811f43fc59d501e1e">ParsedIdentityTfOperation</a>(<a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml">ITfParser::TfParserImpl</a>* parser,</div><div class="line"><a name="l00869"></a><span class="lineno">  869</span>&#160;                              <span class="keyword">const</span> tensorflow::NodeDef&amp; node,</div><div class="line"><a name="l00870"></a><span class="lineno">  870</span>&#160;                              <a class="code" href="classarmnn_tf_parser_1_1_i_tf_parser.xhtml#a81cd010ead68e4d96e6cb28255143f49">ParsedTfOperation</a>* representative)</div><div class="line"><a name="l00871"></a><span class="lineno">  871</span>&#160;        : <a class="code" href="classarmnn_tf_parser_1_1_i_tf_parser.xhtml#a81cd010ead68e4d96e6cb28255143f49">ParsedTfOperation</a>(parser, node)</div><div class="line"><a name="l00872"></a><span class="lineno">  872</span>&#160;        , m_Representative(representative)</div><div class="line"><a name="l00873"></a><span class="lineno">  873</span>&#160;    {</div><div class="line"><a name="l00874"></a><span class="lineno">  874</span>&#160;    }</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;    <span class="keyword">virtual</span> <a class="code" href="classarmnn_1_1_i_output_slot.xhtml">IOutputSlot</a>&amp; ResolveArmnnOutputSlot(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> tfOutputIndex)<span class="keyword"> override</span></div><div class="line"><a name="l00877"></a><span class="lineno">  877</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l00878"></a><span class="lineno">  878</span>&#160;        <a class="code" href="_assert_8hpp.xhtml#a5698be69cbd5dfe6c28fcd9867e8cbed">ARMNN_ASSERT</a>(m_Representative);</div><div class="line"><a name="l00879"></a><span class="lineno">  879</span>&#160;        <span class="keywordflow">return</span> m_Representative-&gt;ResolveArmnnOutputSlot(tfOutputIndex);</div><div class="line"><a name="l00880"></a><span class="lineno">  880</span>&#160;    }</div><div class="line"><a name="l00881"></a><span class="lineno">  881</span>&#160;</div><div class="line"><a name="l00882"></a><span class="lineno">  882</span>&#160;    <span class="keyword">virtual</span> <a class="code" href="classarmnn_tf_parser_1_1_i_tf_parser.xhtml#a81cd010ead68e4d96e6cb28255143f49">ParsedTfOperation</a>* ResolveIdentityOperations()<span class="keyword"> override</span></div><div class="line"><a name="l00883"></a><span class="lineno">  883</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l00884"></a><span class="lineno">  884</span>&#160;        <span class="keywordflow">return</span> m_Representative-&gt;ResolveIdentityOperations();</div><div class="line"><a name="l00885"></a><span class="lineno">  885</span>&#160;    }</div><div class="line"><a name="l00886"></a><span class="lineno">  886</span>&#160;</div><div class="line"><a name="l00887"></a><span class="lineno">  887</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l00888"></a><span class="lineno">  888</span>&#160;    <a class="code" href="classarmnn_tf_parser_1_1_i_tf_parser.xhtml#a81cd010ead68e4d96e6cb28255143f49">ParsedTfOperation</a>* m_Representative;</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;</div><div class="line"><a name="l00891"></a><span class="lineno"><a class="line" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#afd47848ab22a0d11cb330f25d7ba3235">  891</a></span>&#160;<a class="code" href="namespacearmnn_tf_parser.xhtml#aa36bf288c19fe35767bb6e059636f405">ParsedTfOperationPtr</a> <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#afd47848ab22a0d11cb330f25d7ba3235">ITfParser::TfParserImpl::ParseIdentity</a>(<span class="keyword">const</span> tensorflow::NodeDef&amp; nodeDef,</div><div class="line"><a name="l00892"></a><span class="lineno">  892</span>&#160;                                                            <span class="keyword">const</span> tensorflow::GraphDef&amp; graphDef)</div><div class="line"><a name="l00893"></a><span class="lineno">  893</span>&#160;{</div><div class="line"><a name="l00894"></a><span class="lineno">  894</span>&#160;    <a class="code" href="namespacearmnn.xhtml#a44affeeb090c3c6a3062830562672e84">IgnoreUnused</a>(graphDef);</div><div class="line"><a name="l00895"></a><span class="lineno">  895</span>&#160;    std::vector&lt;OutputOfParsedTfOperation&gt; inputs = <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#ae295ca8b7d19bb5e6db3f93bd4561ee0">GetInputParsedTfOperationsChecked</a>(nodeDef, 1);</div><div class="line"><a name="l00896"></a><span class="lineno">  896</span>&#160;    <span class="comment">// Any requests for the output slots of this node should be forwarded to the node connected as input.</span></div><div class="line"><a name="l00897"></a><span class="lineno">  897</span>&#160;    <span class="keywordflow">return</span> std::make_unique&lt;ParsedIdentityTfOperation&gt;(<span class="keyword">this</span>, nodeDef, inputs[0].m_IndexedValue);</div><div class="line"><a name="l00898"></a><span class="lineno">  898</span>&#160;}</div><div class="line"><a name="l00899"></a><span class="lineno">  899</span>&#160;<span class="comment"></span></div><div class="line"><a name="l00900"></a><span class="lineno">  900</span>&#160;<span class="comment">/// An ParsedTfOperation for a Const node.</span></div><div class="line"><a name="l00901"></a><span class="lineno">  901</span>&#160;<span class="comment">/// Creation of the armnn ConstLayer is deferred until it is actually needed, because Const nodes are mostly used</span></div><div class="line"><a name="l00902"></a><span class="lineno">  902</span>&#160;<span class="comment">/// for weight inputs to MatMul/Conv2D nodes and in these cases armnn doesn&#39;t need a ConstLayer.</span></div><div class="line"><a name="l00903"></a><span class="lineno">  903</span>&#160;<span class="comment"></span><span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l00904"></a><span class="lineno">  904</span>&#160;<span class="keyword">class </span><a class="code" href="classarmnn_tf_parser_1_1_i_tf_parser.xhtml#ad3c8cd69190956793af7af503dc495cd">ParsedConstTfOperation</a> : <span class="keyword">public</span> <a class="code" href="classarmnn_tf_parser_1_1_i_tf_parser.xhtml#ab9a7a00deef758531aa11d3044e78b45">DeferredSingleLayerParsedTfOperation</a></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="keyword">public</span>:</div><div class="line"><a name="l00907"></a><span class="lineno">  907</span>&#160;    <a class="code" href="classarmnn_tf_parser_1_1_i_tf_parser.xhtml#ad3c8cd69190956793af7af503dc495cd">ParsedConstTfOperation</a>(<a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml">ITfParser::TfParserImpl</a>* parser, <span class="keyword">const</span> tensorflow::NodeDef&amp; node,</div><div class="line"><a name="l00908"></a><span class="lineno">  908</span>&#160;        <span class="keyword">const</span> T* tensorData, <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a>&amp; tensorInfo)</div><div class="line"><a name="l00909"></a><span class="lineno">  909</span>&#160;        : <a class="code" href="classarmnn_tf_parser_1_1_i_tf_parser.xhtml#ab9a7a00deef758531aa11d3044e78b45">DeferredSingleLayerParsedTfOperation</a>(parser, node),</div><div class="line"><a name="l00910"></a><span class="lineno">  910</span>&#160;        m_Storage(tensorData, tensorData + tensorInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a8846406ac37fbd2204f0be16ee05d5b7">GetNumElements</a>()),</div><div class="line"><a name="l00911"></a><span class="lineno">  911</span>&#160;        m_TensorInfo(tensorInfo)</div><div class="line"><a name="l00912"></a><span class="lineno">  912</span>&#160;    {</div><div class="line"><a name="l00913"></a><span class="lineno">  913</span>&#160;        <a class="code" href="_assert_8hpp.xhtml#a5698be69cbd5dfe6c28fcd9867e8cbed">ARMNN_ASSERT</a>(<a class="code" href="namespacearmnn.xhtml#aa02b9e06fb20fa3c13da0427e6ee5ab2">GetDataTypeSize</a>(tensorInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#aea909c7327109228ef618d459015def3">GetDataType</a>()) == <span class="keyword">sizeof</span>(T));</div><div class="line"><a name="l00914"></a><span class="lineno">  914</span>&#160;    }</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;    <span class="keywordtype">void</span> CreateLayerDeferred()<span class="keyword"> override</span></div><div class="line"><a name="l00917"></a><span class="lineno">  917</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l00918"></a><span class="lineno">  918</span>&#160;        <a class="code" href="_assert_8hpp.xhtml#a5698be69cbd5dfe6c28fcd9867e8cbed">ARMNN_ASSERT</a>(<a class="code" href="_subgraph_view_selector_8cpp.xhtml#ae7fc37b88ff10e9294ed1c72f2a25ac7">m_Layer</a> == <span class="keyword">nullptr</span>);</div><div class="line"><a name="l00919"></a><span class="lineno">  919</span>&#160;        <a class="code" href="_subgraph_view_selector_8cpp.xhtml#ae7fc37b88ff10e9294ed1c72f2a25ac7">m_Layer</a> = m_Parser-&gt;m_Network-&gt;AddConstantLayer(<a class="code" href="classarmnn_1_1_const_tensor.xhtml">ConstTensor</a>(m_TensorInfo, m_Storage),</div><div class="line"><a name="l00920"></a><span class="lineno">  920</span>&#160;                                                                       m_Node.name().c_str());</div><div class="line"><a name="l00921"></a><span class="lineno">  921</span>&#160;        <a class="code" href="_subgraph_view_selector_8cpp.xhtml#ae7fc37b88ff10e9294ed1c72f2a25ac7">m_Layer</a>-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#a0e36688a43c35668d8db5257274c68fe">GetOutputSlot</a>(0).<a class="code" href="classarmnn_1_1_output_slot.xhtml#a7e5c5771d741dd5473989047a9314728">SetTensorInfo</a>(m_TensorInfo);</div><div class="line"><a name="l00922"></a><span class="lineno">  922</span>&#160;    }</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;    <a class="code" href="classarmnn_1_1_const_tensor.xhtml">ConstTensor</a> GetConstTensor(std::vector&lt;T&gt;&amp; outputTensorData)<span class="keyword"> const</span></div><div class="line"><a name="l00925"></a><span class="lineno">  925</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l00926"></a><span class="lineno">  926</span>&#160;        outputTensorData.resize(m_TensorInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a8846406ac37fbd2204f0be16ee05d5b7">GetNumElements</a>());</div><div class="line"><a name="l00927"></a><span class="lineno">  927</span>&#160;</div><div class="line"><a name="l00928"></a><span class="lineno">  928</span>&#160;        memcpy(outputTensorData.data(), m_Storage.data(), m_TensorInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#abcbdfb544ece4c31d0b37715ad0f3be0">GetNumBytes</a>());</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;        <span class="comment">// Updates the result to point to the user provided storage.</span></div><div class="line"><a name="l00931"></a><span class="lineno">  931</span>&#160;        <a class="code" href="classarmnn_1_1_const_tensor.xhtml">ConstTensor</a> constTensor(m_TensorInfo, outputTensorData);</div><div class="line"><a name="l00932"></a><span class="lineno">  932</span>&#160;        <span class="keywordflow">return</span> constTensor;</div><div class="line"><a name="l00933"></a><span class="lineno">  933</span>&#160;    }</div><div class="line"><a name="l00934"></a><span class="lineno">  934</span>&#160;</div><div class="line"><a name="l00935"></a><span class="lineno">  935</span>&#160;    <span class="keyword">const</span> T* GetStorage()<span class="keyword"> const</span></div><div class="line"><a name="l00936"></a><span class="lineno">  936</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l00937"></a><span class="lineno">  937</span>&#160;        <span class="keywordflow">return</span> m_Storage.data();</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;</div><div class="line"><a name="l00940"></a><span class="lineno">  940</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a>&amp; <a class="code" href="namespacearmnn_utils.xhtml#acee63cd08da47910fc166a1990988fa8">GetTensorInfo</a>()<span class="keyword"> const</span></div><div class="line"><a name="l00941"></a><span class="lineno">  941</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l00942"></a><span class="lineno">  942</span>&#160;        <span class="keywordflow">return</span> m_TensorInfo;</div><div class="line"><a name="l00943"></a><span class="lineno">  943</span>&#160;    }</div><div class="line"><a name="l00944"></a><span class="lineno">  944</span>&#160;</div><div class="line"><a name="l00945"></a><span class="lineno">  945</span>&#160;<span class="keyword">private</span>:<span class="comment"></span></div><div class="line"><a name="l00946"></a><span class="lineno">  946</span>&#160;<span class="comment">    ///&lt; Manages the lifetime of the tensor data.</span></div><div class="line"><a name="l00947"></a><span class="lineno">  947</span>&#160;<span class="comment"></span>    std::vector&lt;T&gt; m_Storage;<span class="comment"></span></div><div class="line"><a name="l00948"></a><span class="lineno">  948</span>&#160;<span class="comment">    ///&lt; Describes the layout of the tensor and points to the data in m_Storage.</span></div><div class="line"><a name="l00949"></a><span class="lineno">  949</span>&#160;<span class="comment"></span>    <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> m_TensorInfo;</div><div class="line"><a name="l00950"></a><span class="lineno">  950</span>&#160;};</div><div class="line"><a name="l00951"></a><span class="lineno">  951</span>&#160;</div><div class="line"><a name="l00952"></a><span class="lineno"><a class="line" href="namespacearmnn_tf_parser.xhtml#a3d934e14ca544ba7af4fe562def8a986">  952</a></span>&#160;<a class="code" href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6">DataType</a> <a class="code" href="namespacearmnn_tf_parser.xhtml#a3d934e14ca544ba7af4fe562def8a986">ConvertTfTensorDataType</a>(<span class="keyword">const</span> <a class="code" href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6">tensorflow::DataType</a> tfDataType,</div><div class="line"><a name="l00953"></a><span class="lineno">  953</span>&#160;                                 <span class="keyword">const</span> tensorflow::NodeDef&amp; nodeDef)</div><div class="line"><a name="l00954"></a><span class="lineno">  954</span>&#160;{</div><div class="line"><a name="l00955"></a><span class="lineno">  955</span>&#160;    <span class="keywordflow">switch</span> (tfDataType)</div><div class="line"><a name="l00956"></a><span class="lineno">  956</span>&#160;    {</div><div class="line"><a name="l00957"></a><span class="lineno">  957</span>&#160;    <span class="keywordflow">case</span> tensorflow::DT_FLOAT:</div><div class="line"><a name="l00958"></a><span class="lineno">  958</span>&#160;        <span class="keywordflow">return</span> DataType::Float32;</div><div class="line"><a name="l00959"></a><span class="lineno">  959</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l00960"></a><span class="lineno">  960</span>&#160;    <span class="keywordflow">case</span> tensorflow::DT_INT32:</div><div class="line"><a name="l00961"></a><span class="lineno">  961</span>&#160;        <span class="keywordflow">return</span> DataType::Signed32;</div><div class="line"><a name="l00962"></a><span class="lineno">  962</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l00963"></a><span class="lineno">  963</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l00964"></a><span class="lineno">  964</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="l00965"></a><span class="lineno">  965</span>&#160;            fmt::format(<span class="stringliteral">&quot;Unknown DataType {} for node {} {}&quot;</span>,</div><div class="line"><a name="l00966"></a><span class="lineno">  966</span>&#160;                        tensorflow::DataType_Name(tfDataType),</div><div class="line"><a name="l00967"></a><span class="lineno">  967</span>&#160;                        nodeDef.name(),</div><div class="line"><a name="l00968"></a><span class="lineno">  968</span>&#160;                        <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l00969"></a><span class="lineno">  969</span>&#160;    }</div><div class="line"><a name="l00970"></a><span class="lineno">  970</span>&#160;}</div><div class="line"><a name="l00971"></a><span class="lineno">  971</span>&#160;</div><div class="line"><a name="l00972"></a><span class="lineno">  972</span>&#160;<span class="keyword">struct </span>ParseTfTensorValueList</div><div class="line"><a name="l00973"></a><span class="lineno">  973</span>&#160;{</div><div class="line"><a name="l00974"></a><span class="lineno">  974</span>&#160;    <span class="keyword">template</span>&lt;<span class="keyword">typename</span> DataType&gt;</div><div class="line"><a name="l00975"></a><span class="lineno">  975</span>&#160;    <span class="keyword">static</span> <span class="keywordtype">void</span> Parse(</div><div class="line"><a name="l00976"></a><span class="lineno">  976</span>&#160;        <span class="keyword">const</span> tensorflow::TensorProto&amp; tfTensor,</div><div class="line"><a name="l00977"></a><span class="lineno">  977</span>&#160;        <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> dstElements,</div><div class="line"><a name="l00978"></a><span class="lineno">  978</span>&#160;        std::vector&lt;int8_t&gt;&amp; outputData);</div><div class="line"><a name="l00979"></a><span class="lineno">  979</span>&#160;</div><div class="line"><a name="l00980"></a><span class="lineno">  980</span>&#160;    <span class="keyword">template</span> &lt;<span class="keyword">typename</span> DataType&gt;</div><div class="line"><a name="l00981"></a><span class="lineno">  981</span>&#160;    <span class="keyword">static</span> <span class="keywordtype">void</span> ReadData(<span class="keyword">const</span> <span class="keywordtype">void</span>* srcData, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> numSrcElements,</div><div class="line"><a name="l00982"></a><span class="lineno">  982</span>&#160;        std::vector&lt;int8_t&gt;&amp; dstData, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> numDstElements)</div><div class="line"><a name="l00983"></a><span class="lineno">  983</span>&#160;    {</div><div class="line"><a name="l00984"></a><span class="lineno">  984</span>&#160;        <span class="comment">// If there are no entries in the list, perform no action.</span></div><div class="line"><a name="l00985"></a><span class="lineno">  985</span>&#160;        <span class="keywordflow">if</span> (numSrcElements == 0)</div><div class="line"><a name="l00986"></a><span class="lineno">  986</span>&#160;        {</div><div class="line"><a name="l00987"></a><span class="lineno">  987</span>&#160;            <span class="keywordflow">return</span>;</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;</div><div class="line"><a name="l00990"></a><span class="lineno">  990</span>&#160;        <span class="comment">// If no size was provided, use the length of the value list.</span></div><div class="line"><a name="l00991"></a><span class="lineno">  991</span>&#160;        <span class="keywordflow">if</span> (numDstElements == 0)</div><div class="line"><a name="l00992"></a><span class="lineno">  992</span>&#160;        {</div><div class="line"><a name="l00993"></a><span class="lineno">  993</span>&#160;            numDstElements = numSrcElements;</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;</div><div class="line"><a name="l00996"></a><span class="lineno">  996</span>&#160;        <span class="comment">// Allocates memory.</span></div><div class="line"><a name="l00997"></a><span class="lineno">  997</span>&#160;        dstData.resize(std::max(numSrcElements, numDstElements) * <span class="keyword">sizeof</span>(<a class="code" href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6">DataType</a>));</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="keyword">const</span> <a class="code" href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6">DataType</a>* srcTensor = <span class="keyword">reinterpret_cast&lt;</span><span class="keyword">const </span><a class="code" href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6">DataType</a>*<span class="keyword">&gt;</span>(srcData);</div><div class="line"><a name="l01000"></a><span class="lineno"> 1000</span>&#160;        <a class="code" href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6">DataType</a>* dstTensor = <span class="keyword">reinterpret_cast&lt;</span><a class="code" href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6">DataType</a>*<span class="keyword">&gt;</span>(dstData.data());</div><div class="line"><a name="l01001"></a><span class="lineno"> 1001</span>&#160;</div><div class="line"><a name="l01002"></a><span class="lineno"> 1002</span>&#160;        <span class="comment">// Copies the value list entries into the destination.</span></div><div class="line"><a name="l01003"></a><span class="lineno"> 1003</span>&#160;        std::copy(srcTensor, srcTensor + numSrcElements, dstTensor);</div><div class="line"><a name="l01004"></a><span class="lineno"> 1004</span>&#160;</div><div class="line"><a name="l01005"></a><span class="lineno"> 1005</span>&#160;        <span class="keywordflow">if</span> (numDstElements &gt; numSrcElements)</div><div class="line"><a name="l01006"></a><span class="lineno"> 1006</span>&#160;        {</div><div class="line"><a name="l01007"></a><span class="lineno"> 1007</span>&#160;            <span class="comment">// Uses the last element in the list to fill the remaining entries.</span></div><div class="line"><a name="l01008"></a><span class="lineno"> 1008</span>&#160;            std::fill(dstTensor + numSrcElements, dstTensor + numDstElements, srcTensor[numSrcElements - 1]);</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;    }</div><div class="line"><a name="l01011"></a><span class="lineno"> 1011</span>&#160;</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;</div><div class="line"><a name="l01014"></a><span class="lineno"> 1014</span>&#160;<span class="keyword">template</span> &lt;&gt;</div><div class="line"><a name="l01015"></a><span class="lineno"> 1015</span>&#160;<span class="keywordtype">void</span> ParseTfTensorValueList::Parse&lt;float&gt;(<span class="keyword">const</span> tensorflow::TensorProto&amp; tfTensor,</div><div class="line"><a name="l01016"></a><span class="lineno"> 1016</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> dstElements, std::vector&lt;int8_t&gt;&amp; outputData)</div><div class="line"><a name="l01017"></a><span class="lineno"> 1017</span>&#160;{</div><div class="line"><a name="l01018"></a><span class="lineno"> 1018</span>&#160;    ReadData&lt;float&gt;(tfTensor.float_val().data(), <span class="keyword">static_cast&lt;</span><span class="keywordtype">unsigned</span> <span class="keywordtype">int</span><span class="keyword">&gt;</span>(tfTensor.float_val_size()),</div><div class="line"><a name="l01019"></a><span class="lineno"> 1019</span>&#160;        outputData, dstElements);</div><div class="line"><a name="l01020"></a><span class="lineno"> 1020</span>&#160;}</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="keyword">template</span> &lt;&gt;</div><div class="line"><a name="l01023"></a><span class="lineno"> 1023</span>&#160;<span class="keywordtype">void</span> ParseTfTensorValueList::Parse&lt;int32_t&gt;(<span class="keyword">const</span> tensorflow::TensorProto&amp; tfTensor,</div><div class="line"><a name="l01024"></a><span class="lineno"> 1024</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> dstElements, std::vector&lt;int8_t&gt;&amp; outputData)</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;    ReadData&lt;int32_t&gt;(tfTensor.int_val().data(), <span class="keyword">static_cast&lt;</span><span class="keywordtype">unsigned</span> <span class="keywordtype">int</span><span class="keyword">&gt;</span>(tfTensor.int_val_size()),</div><div class="line"><a name="l01027"></a><span class="lineno"> 1027</span>&#160;        outputData, dstElements);</div><div class="line"><a name="l01028"></a><span class="lineno"> 1028</span>&#160;}</div><div class="line"><a name="l01029"></a><span class="lineno"> 1029</span>&#160;</div><div class="line"><a name="l01030"></a><span class="lineno"> 1030</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">template</span>&lt;<span class="keyword">typename</span>&gt; <span class="keyword">class </span>OperatorType, <span class="keyword">typename</span> T = int8_t&gt;</div><div class="line"><a name="l01031"></a><span class="lineno"> 1031</span>&#160;<span class="keyword">struct </span><a class="code" href="classarmnn_tf_parser_1_1_i_tf_parser.xhtml#ade83228b2643208ee0fb6168792e1364">MakeTfOperation</a></div><div class="line"><a name="l01032"></a><span class="lineno"> 1032</span>&#160;{</div><div class="line"><a name="l01033"></a><span class="lineno"> 1033</span>&#160;    <span class="keyword">template</span>&lt;<span class="keyword">typename</span> <a class="code" href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6">DataType</a>, <span class="keyword">class</span>... Args&gt;</div><div class="line"><a name="l01034"></a><span class="lineno"> 1034</span>&#160;    <span class="keyword">inline</span> <span class="keyword">static</span> std::unique_ptr&lt;OperatorType&lt;DataType&gt;&gt; Parse(<a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml">ITfParser::TfParserImpl</a>* parser,</div><div class="line"><a name="l01035"></a><span class="lineno"> 1035</span>&#160;                                                                <span class="keyword">const</span> tensorflow::NodeDef&amp; node,</div><div class="line"><a name="l01036"></a><span class="lineno"> 1036</span>&#160;                                                                Args&amp;&amp;... args)</div><div class="line"><a name="l01037"></a><span class="lineno"> 1037</span>&#160;    {</div><div class="line"><a name="l01038"></a><span class="lineno"> 1038</span>&#160;        <span class="keywordflow">return</span> std::make_unique&lt;OperatorType&lt;DataType&gt;&gt;(parser, node, std::forward&lt;Args&gt;(args)...);</div><div class="line"><a name="l01039"></a><span class="lineno"> 1039</span>&#160;    }</div><div class="line"><a name="l01040"></a><span class="lineno"> 1040</span>&#160;};</div><div class="line"><a name="l01041"></a><span class="lineno"> 1041</span>&#160;</div><div class="line"><a name="l01042"></a><span class="lineno"> 1042</span>&#160;<span class="keyword">template</span> &lt;&gt;</div><div class="line"><a name="l01043"></a><span class="lineno"> 1043</span>&#160;<span class="keyword">struct </span><a class="code" href="classarmnn_tf_parser_1_1_i_tf_parser.xhtml#ade83228b2643208ee0fb6168792e1364">MakeTfOperation</a>&lt;ParsedConstTfOperation&gt;</div><div class="line"><a name="l01044"></a><span class="lineno"> 1044</span>&#160;{</div><div class="line"><a name="l01045"></a><span class="lineno"> 1045</span>&#160;    <span class="keyword">template</span>&lt;<span class="keyword">typename</span> <a class="code" href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6">DataType</a>, <span class="keyword">class</span>... Args&gt;</div><div class="line"><a name="l01046"></a><span class="lineno"> 1046</span>&#160;    <span class="keyword">inline</span> <span class="keyword">static</span> std::unique_ptr&lt;ParsedConstTfOperation&lt;DataType&gt;&gt; Parse(<a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml">ITfParser::TfParserImpl</a>* parser,</div><div class="line"><a name="l01047"></a><span class="lineno"> 1047</span>&#160;        <span class="keyword">const</span> tensorflow::NodeDef&amp; node, <span class="keyword">const</span> std::vector&lt;int8_t&gt;&amp; tensorData, <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a>&amp; tensorInfo)</div><div class="line"><a name="l01048"></a><span class="lineno"> 1048</span>&#160;    {</div><div class="line"><a name="l01049"></a><span class="lineno"> 1049</span>&#160;        <span class="keywordflow">return</span> std::make_unique&lt;ParsedConstTfOperation&lt;DataType&gt;&gt;(parser, node,</div><div class="line"><a name="l01050"></a><span class="lineno"> 1050</span>&#160;            <span class="keyword">reinterpret_cast&lt;</span><span class="keyword">const </span>DataType*<span class="keyword">&gt;</span>(tensorData.data()), tensorInfo);</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;</div><div class="line"><a name="l01054"></a><span class="lineno"> 1054</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">class</span> FuncType&gt;</div><div class="line"><a name="l01055"></a><span class="lineno"> 1055</span>&#160;<span class="keyword">struct </span>InvokeParseFunction</div><div class="line"><a name="l01056"></a><span class="lineno"> 1056</span>&#160;{</div><div class="line"><a name="l01057"></a><span class="lineno"> 1057</span>&#160;    <span class="keyword">template</span>&lt;<span class="keyword">class </span>ResType, <span class="keyword">class</span>... Args&gt;</div><div class="line"><a name="l01058"></a><span class="lineno"> 1058</span>&#160;    <span class="keyword">inline</span> <span class="keyword">static</span> ResType Result(<a class="code" href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6">DataType</a> dataType, Args&amp;&amp;... args)</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;        <span class="keywordflow">if</span> (dataType == DataType::Float32)</div><div class="line"><a name="l01061"></a><span class="lineno"> 1061</span>&#160;        {</div><div class="line"><a name="l01062"></a><span class="lineno"> 1062</span>&#160;            <span class="keywordflow">return</span> FuncType::template Parse&lt;float&gt;(std::forward&lt;Args&gt;(args)...);</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="keywordflow">else</span> <span class="keywordflow">if</span> (dataType == DataType::Signed32)</div><div class="line"><a name="l01065"></a><span class="lineno"> 1065</span>&#160;        {</div><div class="line"><a name="l01066"></a><span class="lineno"> 1066</span>&#160;            <span class="keywordflow">return</span> FuncType::template Parse&lt;int32_t&gt;(std::forward&lt;Args&gt;(args)...);</div><div class="line"><a name="l01067"></a><span class="lineno"> 1067</span>&#160;        }</div><div class="line"><a name="l01068"></a><span class="lineno"> 1068</span>&#160;</div><div class="line"><a name="l01069"></a><span class="lineno"> 1069</span>&#160;        <span class="keywordflow">return</span> ResType();</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;</div><div class="line"><a name="l01072"></a><span class="lineno"> 1072</span>&#160;    <span class="keyword">template</span>&lt;<span class="keyword">class</span>... Args&gt;</div><div class="line"><a name="l01073"></a><span class="lineno"> 1073</span>&#160;    <span class="keyword">inline</span> <span class="keyword">static</span> <span class="keywordtype">void</span> Result(<a class="code" href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6">DataType</a> dataType, Args&amp;&amp;... args)</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;        <span class="keywordflow">if</span> (dataType == DataType::Float32)</div><div class="line"><a name="l01076"></a><span class="lineno"> 1076</span>&#160;        {</div><div class="line"><a name="l01077"></a><span class="lineno"> 1077</span>&#160;            FuncType::template Parse&lt;float&gt;(std::forward&lt;Args&gt;(args)...);</div><div class="line"><a name="l01078"></a><span class="lineno"> 1078</span>&#160;        }</div><div class="line"><a name="l01079"></a><span class="lineno"> 1079</span>&#160;        <span class="keywordflow">else</span> <span class="keywordflow">if</span> (dataType == DataType::Signed32)</div><div class="line"><a name="l01080"></a><span class="lineno"> 1080</span>&#160;        {</div><div class="line"><a name="l01081"></a><span class="lineno"> 1081</span>&#160;            FuncType::template Parse&lt;int32_t&gt;(std::forward&lt;Args&gt;(args)...);</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;    }</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;</div><div class="line"><a name="l01086"></a><span class="lineno"><a class="line" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#ae7258b6f1d2aeff43fe25b2f3d662703"> 1086</a></span>&#160;<a class="code" href="namespacearmnn_tf_parser.xhtml#aa36bf288c19fe35767bb6e059636f405">ParsedTfOperationPtr</a> <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#ae7258b6f1d2aeff43fe25b2f3d662703">ITfParser::TfParserImpl::ParseConst</a>(<span class="keyword">const</span> tensorflow::NodeDef&amp; nodeDef,</div><div class="line"><a name="l01087"></a><span class="lineno"> 1087</span>&#160;                                                         <span class="keyword">const</span> tensorflow::GraphDef&amp; graphDef)</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;    <a class="code" href="namespacearmnn.xhtml#a44affeeb090c3c6a3062830562672e84">IgnoreUnused</a>(graphDef);</div><div class="line"><a name="l01090"></a><span class="lineno"> 1090</span>&#160;    <a class="code" href="_assert_8hpp.xhtml#a5698be69cbd5dfe6c28fcd9867e8cbed">ARMNN_ASSERT</a>(nodeDef.op() == <span class="stringliteral">&quot;Const&quot;</span>);</div><div class="line"><a name="l01091"></a><span class="lineno"> 1091</span>&#160;</div><div class="line"><a name="l01092"></a><span class="lineno"> 1092</span>&#160;    <span class="keywordflow">if</span> (nodeDef.attr().count(<span class="stringliteral">&quot;value&quot;</span>) == 0)</div><div class="line"><a name="l01093"></a><span class="lineno"> 1093</span>&#160;    {</div><div class="line"><a name="l01094"></a><span class="lineno"> 1094</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="l01095"></a><span class="lineno"> 1095</span>&#160;            fmt::format(<span class="stringliteral">&quot;Value not found for Const node - {} {}&quot;</span>,</div><div class="line"><a name="l01096"></a><span class="lineno"> 1096</span>&#160;                        nodeDef.name(),</div><div class="line"><a name="l01097"></a><span class="lineno"> 1097</span>&#160;                        <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l01098"></a><span class="lineno"> 1098</span>&#160;    }</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">const</span> tensorflow::TensorProto&amp; tfTensor = nodeDef.attr().at(<span class="stringliteral">&quot;value&quot;</span>).tensor();</div><div class="line"><a name="l01101"></a><span class="lineno"> 1101</span>&#160;    <span class="keyword">const</span> tensorflow::TensorShapeProto&amp; tfTensorShape = tfTensor.tensor_shape();</div><div class="line"><a name="l01102"></a><span class="lineno"> 1102</span>&#160;    <span class="keyword">const</span> <a class="code" href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6">tensorflow::DataType</a> tfDataType = ReadMandatoryNodeTypeAttribute(nodeDef, <span class="stringliteral">&quot;dtype&quot;</span>);</div><div class="line"><a name="l01103"></a><span class="lineno"> 1103</span>&#160;</div><div class="line"><a name="l01104"></a><span class="lineno"> 1104</span>&#160;    <span class="keyword">const</span> <span class="keyword">auto</span> GetDimensionSize = [](<span class="keyword">auto</span>&amp; d) { <span class="keywordflow">return</span> d.size(); };</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;    std::vector&lt;unsigned int&gt; dimensionSizes;</div><div class="line"><a name="l01107"></a><span class="lineno"> 1107</span>&#160;    std::transform(tfTensorShape.dim().begin(), tfTensorShape.dim().end(),</div><div class="line"><a name="l01108"></a><span class="lineno"> 1108</span>&#160;        std::back_inserter(dimensionSizes), GetDimensionSize);</div><div class="line"><a name="l01109"></a><span class="lineno"> 1109</span>&#160;</div><div class="line"><a name="l01110"></a><span class="lineno"> 1110</span>&#160;    <span class="comment">// Calculates number of elements.</span></div><div class="line"><a name="l01111"></a><span class="lineno"> 1111</span>&#160;    <span class="keyword">const</span> <a class="code" href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6">DataType</a> dataType = <a class="code" href="namespacearmnn_tf_parser.xhtml#a3d934e14ca544ba7af4fe562def8a986">ConvertTfTensorDataType</a>(tfDataType, nodeDef);</div><div class="line"><a name="l01112"></a><span class="lineno"> 1112</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> numElements = 0U;</div><div class="line"><a name="l01113"></a><span class="lineno"> 1113</span>&#160;</div><div class="line"><a name="l01114"></a><span class="lineno"> 1114</span>&#160;    <span class="keywordflow">if</span> (!dimensionSizes.empty())</div><div class="line"><a name="l01115"></a><span class="lineno"> 1115</span>&#160;    {</div><div class="line"><a name="l01116"></a><span class="lineno"> 1116</span>&#160;        numElements = std::accumulate(dimensionSizes.begin(), dimensionSizes.end(),</div><div class="line"><a name="l01117"></a><span class="lineno"> 1117</span>&#160;                                      1U, std::multiplies&lt;unsigned int&gt;());</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;</div><div class="line"><a name="l01120"></a><span class="lineno"> 1120</span>&#160;    std::vector&lt;int8_t&gt; tensorData;</div><div class="line"><a name="l01121"></a><span class="lineno"> 1121</span>&#160;</div><div class="line"><a name="l01122"></a><span class="lineno"> 1122</span>&#160;    <span class="comment">// Get tensor data from the list of values attribute.</span></div><div class="line"><a name="l01123"></a><span class="lineno"> 1123</span>&#160;    <span class="keywordflow">if</span> (tfTensor.tensor_content().empty())</div><div class="line"><a name="l01124"></a><span class="lineno"> 1124</span>&#160;    {</div><div class="line"><a name="l01125"></a><span class="lineno"> 1125</span>&#160;        InvokeParseFunction&lt;ParseTfTensorValueList&gt;::Result&lt;<span class="keywordtype">void</span>&gt;(dataType, tfTensor, numElements, tensorData);</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="comment">// If the tensor shape is not defined, but there is a value list, then interpret the data as a 1D</span></div><div class="line"><a name="l01128"></a><span class="lineno"> 1128</span>&#160;        <span class="comment">// tensor of the provided number of elements.</span></div><div class="line"><a name="l01129"></a><span class="lineno"> 1129</span>&#160;        <span class="keywordflow">if</span> (numElements == 0)</div><div class="line"><a name="l01130"></a><span class="lineno"> 1130</span>&#160;        {</div><div class="line"><a name="l01131"></a><span class="lineno"> 1131</span>&#160;            <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> tfNumElements =</div><div class="line"><a name="l01132"></a><span class="lineno"> 1132</span>&#160;                <span class="keyword">static_cast&lt;</span><span class="keywordtype">unsigned</span> <span class="keywordtype">int</span><span class="keyword">&gt;</span>(tensorData.size()) / <a class="code" href="namespacearmnn.xhtml#aa02b9e06fb20fa3c13da0427e6ee5ab2">GetDataTypeSize</a>(dataType);</div><div class="line"><a name="l01133"></a><span class="lineno"> 1133</span>&#160;            dimensionSizes.push_back(tfNumElements);</div><div class="line"><a name="l01134"></a><span class="lineno"> 1134</span>&#160;        }</div><div class="line"><a name="l01135"></a><span class="lineno"> 1135</span>&#160;    }</div><div class="line"><a name="l01136"></a><span class="lineno"> 1136</span>&#160;    <span class="comment">// Gets tensor data from tensor content attribute.</span></div><div class="line"><a name="l01137"></a><span class="lineno"> 1137</span>&#160;    <span class="keywordflow">else</span></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;        tensorData.assign(tfTensor.tensor_content().begin(), tfTensor.tensor_content().end());</div><div class="line"><a name="l01140"></a><span class="lineno"> 1140</span>&#160;</div><div class="line"><a name="l01141"></a><span class="lineno"> 1141</span>&#160;        <span class="comment">// Checks if a tensor shape is defined for the tensor content.</span></div><div class="line"><a name="l01142"></a><span class="lineno"> 1142</span>&#160;        <span class="keywordflow">if</span> (numElements == 0)</div><div class="line"><a name="l01143"></a><span class="lineno"> 1143</span>&#160;        {</div><div class="line"><a name="l01144"></a><span class="lineno"> 1144</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="l01145"></a><span class="lineno"> 1145</span>&#160;                fmt::format(<span class="stringliteral">&quot;No tensor shape found for Const node - {} {}&quot;</span>,</div><div class="line"><a name="l01146"></a><span class="lineno"> 1146</span>&#160;                            nodeDef.name(),</div><div class="line"><a name="l01147"></a><span class="lineno"> 1147</span>&#160;                            <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</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;    }</div><div class="line"><a name="l01150"></a><span class="lineno"> 1150</span>&#160;</div><div class="line"><a name="l01151"></a><span class="lineno"> 1151</span>&#160;    <span class="comment">// Const node requires at least a list of values or a content attribute.</span></div><div class="line"><a name="l01152"></a><span class="lineno"> 1152</span>&#160;    <span class="keywordflow">if</span> (tensorData.empty())</div><div class="line"><a name="l01153"></a><span class="lineno"> 1153</span>&#160;    {</div><div class="line"><a name="l01154"></a><span class="lineno"> 1154</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="l01155"></a><span class="lineno"> 1155</span>&#160;            fmt::format(<span class="stringliteral">&quot;No tensor data found for Const node - {} {}&quot;</span>,</div><div class="line"><a name="l01156"></a><span class="lineno"> 1156</span>&#160;                        nodeDef.name(),</div><div class="line"><a name="l01157"></a><span class="lineno"> 1157</span>&#160;                        <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</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;</div><div class="line"><a name="l01160"></a><span class="lineno"> 1160</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> tensorInfo(static_cast&lt;unsigned int&gt;(dimensionSizes.size()),</div><div class="line"><a name="l01161"></a><span class="lineno"> 1161</span>&#160;                                dimensionSizes.data(),</div><div class="line"><a name="l01162"></a><span class="lineno"> 1162</span>&#160;                                dataType);</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;    <span class="comment">// If we have a list of values, then the length of the list must be</span></div><div class="line"><a name="l01165"></a><span class="lineno"> 1165</span>&#160;    <span class="comment">// less than or equal to the number of elements implied by the shape argument.</span></div><div class="line"><a name="l01166"></a><span class="lineno"> 1166</span>&#160;    <span class="keywordflow">if</span> (tensorData.size() &gt; tensorInfo.GetNumBytes())</div><div class="line"><a name="l01167"></a><span class="lineno"> 1167</span>&#160;    {</div><div class="line"><a name="l01168"></a><span class="lineno"> 1168</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="l01169"></a><span class="lineno"> 1169</span>&#160;            fmt::format(<span class="stringliteral">&quot;Number of elements ({}) should be less than or equal &quot;</span></div><div class="line"><a name="l01170"></a><span class="lineno"> 1170</span>&#160;                        <span class="stringliteral">&quot;to the number of elements implied by the shape argument ({}) for Const node - {} {}&quot;</span>,</div><div class="line"><a name="l01171"></a><span class="lineno"> 1171</span>&#160;                        (tensorData.size() / <a class="code" href="namespacearmnn.xhtml#aa02b9e06fb20fa3c13da0427e6ee5ab2">GetDataTypeSize</a>(dataType)),</div><div class="line"><a name="l01172"></a><span class="lineno"> 1172</span>&#160;                        tensorInfo.GetNumElements(),</div><div class="line"><a name="l01173"></a><span class="lineno"> 1173</span>&#160;                        nodeDef.name(),</div><div class="line"><a name="l01174"></a><span class="lineno"> 1174</span>&#160;                        <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</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="keywordflow">return</span> InvokeParseFunction&lt;MakeTfOperation&lt;ParsedConstTfOperation&gt;&gt;::Result&lt;ParsedTfOperationPtr&gt;(</div><div class="line"><a name="l01178"></a><span class="lineno"> 1178</span>&#160;        dataType, <span class="keyword">this</span>, nodeDef, tensorData, tensorInfo);</div><div class="line"><a name="l01179"></a><span class="lineno"> 1179</span>&#160;}</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;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> Type&gt;</div><div class="line"><a name="l01182"></a><span class="lineno"><a class="line" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a02394780a6b2d4c255e4526621e90adb"> 1182</a></span>&#160;<span class="keywordtype">bool</span> <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a02394780a6b2d4c255e4526621e90adb">ITfParser::TfParserImpl::HasParsedConstTensor</a>(<span class="keyword">const</span> std::string &amp; nodeName)<span class="keyword"> const</span></div><div class="line"><a name="l01183"></a><span class="lineno"> 1183</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l01184"></a><span class="lineno"> 1184</span>&#160;    <span class="keyword">auto</span> it = <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a8dd5c5f271f0f5bd68612e7927d94e58">m_ParsedTfOperations</a>.find(nodeName);</div><div class="line"><a name="l01185"></a><span class="lineno"> 1185</span>&#160;    <span class="keywordflow">if</span> (it == <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a8dd5c5f271f0f5bd68612e7927d94e58">m_ParsedTfOperations</a>.end())</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;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</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="keywordflow">return</span> <span class="keyword">dynamic_cast&lt;</span>ParsedConstTfOperation&lt;Type&gt;*<span class="keyword">&gt;</span>(it-&gt;second.get()) != <span class="keyword">nullptr</span>;</div><div class="line"><a name="l01190"></a><span class="lineno"> 1190</span>&#160;}</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="keyword">template</span>&lt;<span class="keyword">typename</span> Type&gt;</div><div class="line"><a name="l01193"></a><span class="lineno"><a class="line" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#ad22826bcee9099bbeb74eeb99c36f998"> 1193</a></span>&#160;<span class="keywordtype">bool</span> <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a02394780a6b2d4c255e4526621e90adb">ITfParser::TfParserImpl::HasParsedConstTensor</a>(<a class="code" href="classarmnn_tf_parser_1_1_i_tf_parser.xhtml#a81cd010ead68e4d96e6cb28255143f49">ParsedTfOperation</a>* parsedTfOpPtr)<span class="keyword"> const</span></div><div class="line"><a name="l01194"></a><span class="lineno"> 1194</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l01195"></a><span class="lineno"> 1195</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">dynamic_cast&lt;</span>ParsedConstTfOperation&lt;Type&gt;*<span class="keyword">&gt;</span>(parsedTfOpPtr) != <span class="keyword">nullptr</span>;</div><div class="line"><a name="l01196"></a><span class="lineno"> 1196</span>&#160;}</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"><a class="line" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a82bb92947dc9e0f04d4242910d6cbc65"> 1198</a></span>&#160;<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a82bb92947dc9e0f04d4242910d6cbc65">ITfParser::TfParserImpl::GetConstInputIndex</a>(<span class="keyword">const</span> std::vector&lt;OutputOfParsedTfOperation&gt;&amp; inputs)</div><div class="line"><a name="l01199"></a><span class="lineno"> 1199</span>&#160;{</div><div class="line"><a name="l01200"></a><span class="lineno"> 1200</span>&#160;    <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i = 0; i &lt; inputs.size(); i++)</div><div class="line"><a name="l01201"></a><span class="lineno"> 1201</span>&#160;    {</div><div class="line"><a name="l01202"></a><span class="lineno"> 1202</span>&#160;        <span class="keywordflow">if</span> (HasParsedConstTensor&lt;int32_t&gt;(inputs[i].m_IndexedValue-&gt;GetNode().name()))</div><div class="line"><a name="l01203"></a><span class="lineno"> 1203</span>&#160;        {</div><div class="line"><a name="l01204"></a><span class="lineno"> 1204</span>&#160;            <span class="keywordflow">return</span> i;</div><div class="line"><a name="l01205"></a><span class="lineno"> 1205</span>&#160;        }</div><div class="line"><a name="l01206"></a><span class="lineno"> 1206</span>&#160;    }</div><div class="line"><a name="l01207"></a><span class="lineno"> 1207</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="l01208"></a><span class="lineno"> 1208</span>&#160;            fmt::format(<span class="stringliteral">&quot;ArmNN only supports operators with constant axis. {}&quot;</span>,</div><div class="line"><a name="l01209"></a><span class="lineno"> 1209</span>&#160;                        <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l01210"></a><span class="lineno"> 1210</span>&#160;</div><div class="line"><a name="l01211"></a><span class="lineno"> 1211</span>&#160;}</div><div class="line"><a name="l01212"></a><span class="lineno"> 1212</span>&#160;</div><div class="line"><a name="l01213"></a><span class="lineno"><a class="line" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a5caa51a7c4b4444cdcc33832fabc512d"> 1213</a></span>&#160;<a class="code" href="namespacearmnn_tf_parser.xhtml#aa36bf288c19fe35767bb6e059636f405">ParsedTfOperationPtr</a> <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a5caa51a7c4b4444cdcc33832fabc512d">ITfParser::TfParserImpl::ParseConv2D</a>(<span class="keyword">const</span> tensorflow::NodeDef&amp; nodeDef,</div><div class="line"><a name="l01214"></a><span class="lineno"> 1214</span>&#160;    <span class="keyword">const</span> tensorflow::GraphDef&amp; graphDef)</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;    <a class="code" href="namespacearmnn.xhtml#a44affeeb090c3c6a3062830562672e84">IgnoreUnused</a>(graphDef);</div><div class="line"><a name="l01217"></a><span class="lineno"> 1217</span>&#160;    std::vector&lt;OutputOfParsedTfOperation&gt; inputs = <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#ae295ca8b7d19bb5e6db3f93bd4561ee0">GetInputParsedTfOperationsChecked</a>(nodeDef, 2);</div><div class="line"><a name="l01218"></a><span class="lineno"> 1218</span>&#160;    <a class="code" href="classarmnn_1_1_i_output_slot.xhtml">IOutputSlot</a>&amp; inputSlot = inputs[0].m_IndexedValue-&gt;ResolveArmnnOutputSlot(inputs[0].m_Index);</div><div class="line"><a name="l01219"></a><span class="lineno"> 1219</span>&#160;    <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> inputTensorInfo = inputSlot.<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#a9943775a364fc4ab53b85ac88f311886">GetTensorInfo</a>();</div><div class="line"><a name="l01220"></a><span class="lineno"> 1220</span>&#160;</div><div class="line"><a name="l01221"></a><span class="lineno"> 1221</span>&#160;    <span class="keywordflow">if</span> (!HasParsedConstTensor&lt;float&gt;(inputs[1].m_IndexedValue-&gt;GetNode().name()))</div><div class="line"><a name="l01222"></a><span class="lineno"> 1222</span>&#160;    {</div><div class="line"><a name="l01223"></a><span class="lineno"> 1223</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="l01224"></a><span class="lineno"> 1224</span>&#160;            fmt::format(<span class="stringliteral">&quot;ArmNN only supports Convolution layers with constant weights for {}, input {} {}&quot;</span>,</div><div class="line"><a name="l01225"></a><span class="lineno"> 1225</span>&#160;                        nodeDef.name(),</div><div class="line"><a name="l01226"></a><span class="lineno"> 1226</span>&#160;                        inputs[1].m_IndexedValue-&gt;GetNode().name(),</div><div class="line"><a name="l01227"></a><span class="lineno"> 1227</span>&#160;                        <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l01228"></a><span class="lineno"> 1228</span>&#160;    }</div><div class="line"><a name="l01229"></a><span class="lineno"> 1229</span>&#160;    ParsedConstTfOperation&lt;float&gt;* weightNode =</div><div class="line"><a name="l01230"></a><span class="lineno"> 1230</span>&#160;        PolymorphicDowncast&lt;ParsedConstTfOperation&lt;float&gt; *&gt;(inputs[1].m_IndexedValue);</div><div class="line"><a name="l01231"></a><span class="lineno"> 1231</span>&#160;</div><div class="line"><a name="l01232"></a><span class="lineno"> 1232</span>&#160;    std::string paddingString = ReadMandatoryNodeStringAttribute(nodeDef, <span class="stringliteral">&quot;padding&quot;</span>);</div><div class="line"><a name="l01233"></a><span class="lineno"> 1233</span>&#160;    std::string dataFormat = ReadMandatoryNodeStringAttribute(nodeDef, <span class="stringliteral">&quot;data_format&quot;</span>);</div><div class="line"><a name="l01234"></a><span class="lineno"> 1234</span>&#160;    std::vector&lt;uint32_t&gt; strides = ReadMandatoryNodeUint32ListAttribute(nodeDef, <span class="stringliteral">&quot;strides&quot;</span>);</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;    <a class="code" href="structarmnn_1_1_convolution2d_descriptor.xhtml">Convolution2dDescriptor</a> desc;</div><div class="line"><a name="l01237"></a><span class="lineno"> 1237</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="l01238"></a><span class="lineno"> 1238</span>&#160;</div><div class="line"><a name="l01239"></a><span class="lineno"> 1239</span>&#160;    <a class="code" href="_tf_parser_8cpp.xhtml#a3fb047570644cae325aa88d3cd7bb96e">CHECK_DATA_FORMAT</a>(nodeDef, dataFormat, <span class="stringliteral">&quot;Conv2D&quot;</span>);</div><div class="line"><a name="l01240"></a><span class="lineno"> 1240</span>&#160;</div><div class="line"><a name="l01241"></a><span class="lineno"> 1241</span>&#160;    <a class="code" href="namespacearmnn.xhtml#ad1d5cce2d9e9a5d61c243e5c989112e0">DataLayout</a> dataLayout = dataFormat == <span class="stringliteral">&quot;NHWC&quot;</span> ? DataLayout::NHWC : DataLayout::NCHW;</div><div class="line"><a name="l01242"></a><span class="lineno"> 1242</span>&#160;</div><div class="line"><a name="l01243"></a><span class="lineno"> 1243</span>&#160;    desc.<a class="code" href="structarmnn_1_1_convolution2d_descriptor.xhtml#a6089e1ca91914015777ea780a513131a">m_DataLayout</a> = dataLayout;</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;    <a class="code" href="classarmnn_utils_1_1_data_layout_indexed.xhtml">DataLayoutIndexed</a> dataLayoutIndexed(dataLayout);</div><div class="line"><a name="l01246"></a><span class="lineno"> 1246</span>&#160;</div><div class="line"><a name="l01247"></a><span class="lineno"> 1247</span>&#160;    desc.<a class="code" href="structarmnn_1_1_convolution2d_descriptor.xhtml#afe6a3377c4531315354def9023c8fdda">m_StrideX</a> = strides[dataLayoutIndexed.<a class="code" href="classarmnn_utils_1_1_data_layout_indexed.xhtml#a414e6f95548e6f7a01d5028b55ad3941">GetWidthIndex</a>()];</div><div class="line"><a name="l01248"></a><span class="lineno"> 1248</span>&#160;    desc.<a class="code" href="structarmnn_1_1_convolution2d_descriptor.xhtml#ac1fe174bbadfb39a2b636940c2e647c8">m_StrideY</a> = strides[dataLayoutIndexed.<a class="code" href="classarmnn_utils_1_1_data_layout_indexed.xhtml#a61c00316c443adc233c24e85c6c5b740">GetHeightIndex</a>()];</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;    std::vector&lt;uint32_t&gt; dilations = ReadOptionalNodeUint32ListAttribute(nodeDef, <span class="stringliteral">&quot;dilations&quot;</span>);</div><div class="line"><a name="l01251"></a><span class="lineno"> 1251</span>&#160;    <span class="keywordflow">if</span> (!dilations.empty())</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;        desc.<a class="code" href="structarmnn_1_1_convolution2d_descriptor.xhtml#aa3c6a77a963a98ccb8ea7b8fd008a8c1">m_DilationX</a> = dilations[dataLayoutIndexed.<a class="code" href="classarmnn_utils_1_1_data_layout_indexed.xhtml#a414e6f95548e6f7a01d5028b55ad3941">GetWidthIndex</a>()];</div><div class="line"><a name="l01254"></a><span class="lineno"> 1254</span>&#160;        desc.<a class="code" href="structarmnn_1_1_convolution2d_descriptor.xhtml#a302b688d88dd73cde0fb1faef6679907">m_DilationY</a> = dilations[dataLayoutIndexed.<a class="code" href="classarmnn_utils_1_1_data_layout_indexed.xhtml#a61c00316c443adc233c24e85c6c5b740">GetHeightIndex</a>()];</div><div class="line"><a name="l01255"></a><span class="lineno"> 1255</span>&#160;    }</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;    uint32_t inputHeight = inputTensorInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a8b5d0f8a24e9d9238f412260a552acf8">GetShape</a>()[dataLayoutIndexed.<a class="code" href="classarmnn_utils_1_1_data_layout_indexed.xhtml#a61c00316c443adc233c24e85c6c5b740">GetHeightIndex</a>()];</div><div class="line"><a name="l01258"></a><span class="lineno"> 1258</span>&#160;    uint32_t inputWidth  = inputTensorInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a8b5d0f8a24e9d9238f412260a552acf8">GetShape</a>()[dataLayoutIndexed.<a class="code" href="classarmnn_utils_1_1_data_layout_indexed.xhtml#a414e6f95548e6f7a01d5028b55ad3941">GetWidthIndex</a>()];</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;    <span class="comment">// Mappings from TensorFlow filter tensors to the ArmNN filter tensors.</span></div><div class="line"><a name="l01261"></a><span class="lineno"> 1261</span>&#160;    <span class="comment">// Tensorflow weights are [H, W, In, Out].</span></div><div class="line"><a name="l01262"></a><span class="lineno"> 1262</span>&#160;    <span class="comment">// ArmNN weights have to be [Out, H, W, In] when the data layout is NHWC,</span></div><div class="line"><a name="l01263"></a><span class="lineno"> 1263</span>&#160;    <span class="comment">// and [Out, In, H, W] when the data layout is NCHW.</span></div><div class="line"><a name="l01264"></a><span class="lineno"> 1264</span>&#160;    <a class="code" href="classarmnn_1_1_permutation_vector.xhtml">PermutationVector</a> permutationVector =</div><div class="line"><a name="l01265"></a><span class="lineno"> 1265</span>&#160;            dataLayout == DataLayout::NHWC ?</div><div class="line"><a name="l01266"></a><span class="lineno"> 1266</span>&#160;                std::initializer_list&lt;unsigned int&gt;{ 1, 2, 3, 0 } : <span class="comment">// NHWC: [H, W, In, Out] -&gt; [Out, H, W, In]</span></div><div class="line"><a name="l01267"></a><span class="lineno"> 1267</span>&#160;                std::initializer_list&lt;unsigned int&gt;{ 2, 3, 1, 0 };  <span class="comment">// NCHW: [H, W, In, Out] -&gt; [Out, In, H, W]</span></div><div class="line"><a name="l01268"></a><span class="lineno"> 1268</span>&#160;</div><div class="line"><a name="l01269"></a><span class="lineno"> 1269</span>&#160;    <span class="comment">// Swizzle the tensor using the given permutation vector.</span></div><div class="line"><a name="l01270"></a><span class="lineno"> 1270</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a>&amp; weightTensorInfo = weightNode-&gt;GetTensorInfo();</div><div class="line"><a name="l01271"></a><span class="lineno"> 1271</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> weightTensorSwizzledInfo = <a class="code" href="namespacearmnn_utils.xhtml#abeaf4f6785039866fd075f4569ba8e84">armnnUtils::Permuted</a>(weightTensorInfo, permutationVector);</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;    <span class="comment">// Swizzles the content of the tensor&#39;s permanent storage into a local storage.</span></div><div class="line"><a name="l01274"></a><span class="lineno"> 1274</span>&#160;    std::vector&lt;float&gt; weightTensorSwizzledData(weightTensorInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a8846406ac37fbd2204f0be16ee05d5b7">GetNumElements</a>());</div><div class="line"><a name="l01275"></a><span class="lineno"> 1275</span>&#160;    <a class="code" href="namespacearmnn_utils.xhtml#af3c74017185773dd61d8ca6662d65d43">armnnUtils::Permute</a>(weightTensorSwizzledInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a8b5d0f8a24e9d9238f412260a552acf8">GetShape</a>(), permutationVector,</div><div class="line"><a name="l01276"></a><span class="lineno"> 1276</span>&#160;                        weightNode-&gt;GetStorage(), weightTensorSwizzledData.data(), <span class="keyword">sizeof</span>(float));</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="comment">// Create a weight tensor with the newly swizzled data.</span></div><div class="line"><a name="l01279"></a><span class="lineno"> 1279</span>&#160;    <a class="code" href="classarmnn_1_1_const_tensor.xhtml">ConstTensor</a> weightTensor(weightTensorSwizzledInfo, weightTensorSwizzledData);</div><div class="line"><a name="l01280"></a><span class="lineno"> 1280</span>&#160;</div><div class="line"><a name="l01281"></a><span class="lineno"> 1281</span>&#160;    uint32_t weightHeight = weightTensor.<a class="code" href="classarmnn_1_1_base_tensor.xhtml#a8b5d0f8a24e9d9238f412260a552acf8">GetShape</a>()[dataLayoutIndexed.<a class="code" href="classarmnn_utils_1_1_data_layout_indexed.xhtml#a61c00316c443adc233c24e85c6c5b740">GetHeightIndex</a>()];</div><div class="line"><a name="l01282"></a><span class="lineno"> 1282</span>&#160;    uint32_t weightWidth  = weightTensor.<a class="code" href="classarmnn_1_1_base_tensor.xhtml#a8b5d0f8a24e9d9238f412260a552acf8">GetShape</a>()[dataLayoutIndexed.<a class="code" href="classarmnn_utils_1_1_data_layout_indexed.xhtml#a414e6f95548e6f7a01d5028b55ad3941">GetWidthIndex</a>()];</div><div class="line"><a name="l01283"></a><span class="lineno"> 1283</span>&#160;</div><div class="line"><a name="l01284"></a><span class="lineno"> 1284</span>&#160;    <span class="keywordtype">bool</span> padding = <span class="keyword">false</span>;</div><div class="line"><a name="l01285"></a><span class="lineno"> 1285</span>&#160;    <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> outputInfo;</div><div class="line"><a name="l01286"></a><span class="lineno"> 1286</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> outputHeight = 0;</div><div class="line"><a name="l01287"></a><span class="lineno"> 1287</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> outputWidth = 0;</div><div class="line"><a name="l01288"></a><span class="lineno"> 1288</span>&#160;</div><div class="line"><a name="l01289"></a><span class="lineno"> 1289</span>&#160;    <a class="code" href="_tf_parser_8cpp.xhtml#aab838eb7734e531bb5be6f6dece673bf">CHECK_PADDING_TYPE</a>(nodeDef, paddingString);</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="keywordflow">if</span> (paddingString == <span class="stringliteral">&quot;SAME&quot;</span>)</div><div class="line"><a name="l01292"></a><span class="lineno"> 1292</span>&#160;    {</div><div class="line"><a name="l01293"></a><span class="lineno"> 1293</span>&#160;        padding = <span class="keyword">true</span>;</div><div class="line"><a name="l01294"></a><span class="lineno"> 1294</span>&#160;    }</div><div class="line"><a name="l01295"></a><span class="lineno"> 1295</span>&#160;    <span class="keywordflow">else</span> <span class="keywordflow">if</span> (paddingString == <span class="stringliteral">&quot;VALID&quot;</span>)</div><div class="line"><a name="l01296"></a><span class="lineno"> 1296</span>&#160;    {</div><div class="line"><a name="l01297"></a><span class="lineno"> 1297</span>&#160;        padding = <span class="keyword">false</span>;</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;    <a class="code" href="namespacearmnn_tf_parser.xhtml#aca0a31de02d5c087029bb28c9202b4d6">CalcPadding</a>(inputHeight, weightHeight, desc.<a class="code" href="structarmnn_1_1_convolution2d_descriptor.xhtml#ac1fe174bbadfb39a2b636940c2e647c8">m_StrideY</a>, desc.<a class="code" href="structarmnn_1_1_convolution2d_descriptor.xhtml#a302b688d88dd73cde0fb1faef6679907">m_DilationY</a>, desc.<a class="code" href="structarmnn_1_1_convolution2d_descriptor.xhtml#a56b51f56cef50cdfa554258eecdab046">m_PadTop</a>, desc.<a class="code" href="structarmnn_1_1_convolution2d_descriptor.xhtml#aa9e49717ebdb741e8c767741647fc618">m_PadBottom</a>, padding);</div><div class="line"><a name="l01301"></a><span class="lineno"> 1301</span>&#160;    <a class="code" href="namespacearmnn_tf_parser.xhtml#aca0a31de02d5c087029bb28c9202b4d6">CalcPadding</a>(inputWidth, weightWidth, desc.<a class="code" href="structarmnn_1_1_convolution2d_descriptor.xhtml#afe6a3377c4531315354def9023c8fdda">m_StrideX</a>, desc.<a class="code" href="structarmnn_1_1_convolution2d_descriptor.xhtml#aa3c6a77a963a98ccb8ea7b8fd008a8c1">m_DilationX</a>, desc.<a class="code" href="structarmnn_1_1_convolution2d_descriptor.xhtml#ac18546ebbebbb32fe0a03baa9bf2c600">m_PadLeft</a>, desc.<a class="code" href="structarmnn_1_1_convolution2d_descriptor.xhtml#a002bc30e590d78cbb4f4d12171055ca7">m_PadRight</a>, padding);</div><div class="line"><a name="l01302"></a><span class="lineno"> 1302</span>&#160;</div><div class="line"><a name="l01303"></a><span class="lineno"> 1303</span>&#160;    <span class="comment">// Calculate output height and  width</span></div><div class="line"><a name="l01304"></a><span class="lineno"> 1304</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> dilatedFilterWidth = weightWidth + (desc.<a class="code" href="structarmnn_1_1_convolution2d_descriptor.xhtml#aa3c6a77a963a98ccb8ea7b8fd008a8c1">m_DilationX</a> - 1) * (weightWidth - 1);</div><div class="line"><a name="l01305"></a><span class="lineno"> 1305</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> readWidth = (inputWidth + desc.<a class="code" href="structarmnn_1_1_convolution2d_descriptor.xhtml#ac18546ebbebbb32fe0a03baa9bf2c600">m_PadLeft</a> + desc.<a class="code" href="structarmnn_1_1_convolution2d_descriptor.xhtml#a002bc30e590d78cbb4f4d12171055ca7">m_PadRight</a>) - dilatedFilterWidth;</div><div class="line"><a name="l01306"></a><span class="lineno"> 1306</span>&#160;    outputWidth = 1 + (readWidth / desc.<a class="code" href="structarmnn_1_1_convolution2d_descriptor.xhtml#afe6a3377c4531315354def9023c8fdda">m_StrideX</a>);</div><div class="line"><a name="l01307"></a><span class="lineno"> 1307</span>&#160;</div><div class="line"><a name="l01308"></a><span class="lineno"> 1308</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> dilatedFilterHeight = weightHeight + (desc.<a class="code" href="structarmnn_1_1_convolution2d_descriptor.xhtml#a302b688d88dd73cde0fb1faef6679907">m_DilationY</a> - 1) * (weightHeight - 1);</div><div class="line"><a name="l01309"></a><span class="lineno"> 1309</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> readHeight = (inputHeight + desc.<a class="code" href="structarmnn_1_1_convolution2d_descriptor.xhtml#a56b51f56cef50cdfa554258eecdab046">m_PadTop</a> + desc.<a class="code" href="structarmnn_1_1_convolution2d_descriptor.xhtml#aa9e49717ebdb741e8c767741647fc618">m_PadBottom</a>) - dilatedFilterHeight;</div><div class="line"><a name="l01310"></a><span class="lineno"> 1310</span>&#160;    outputHeight = 1 + (readHeight / desc.<a class="code" href="structarmnn_1_1_convolution2d_descriptor.xhtml#ac1fe174bbadfb39a2b636940c2e647c8">m_StrideY</a>);</div><div class="line"><a name="l01311"></a><span class="lineno"> 1311</span>&#160;</div><div class="line"><a name="l01312"></a><span class="lineno"> 1312</span>&#160;    <span class="keywordflow">switch</span> (dataLayout)</div><div class="line"><a name="l01313"></a><span class="lineno"> 1313</span>&#160;    {</div><div class="line"><a name="l01314"></a><span class="lineno"> 1314</span>&#160;    <span class="keywordflow">case</span> DataLayout::NHWC:</div><div class="line"><a name="l01315"></a><span class="lineno"> 1315</span>&#160;        outputInfo = <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a>({ inputTensorInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a8b5d0f8a24e9d9238f412260a552acf8">GetShape</a>()[0],</div><div class="line"><a name="l01316"></a><span class="lineno"> 1316</span>&#160;                                  outputHeight,</div><div class="line"><a name="l01317"></a><span class="lineno"> 1317</span>&#160;                                  outputWidth,</div><div class="line"><a name="l01318"></a><span class="lineno"> 1318</span>&#160;                                  weightTensor.<a class="code" href="classarmnn_1_1_base_tensor.xhtml#a8b5d0f8a24e9d9238f412260a552acf8">GetShape</a>()[0] },</div><div class="line"><a name="l01319"></a><span class="lineno"> 1319</span>&#160;                                DataType::Float32);</div><div class="line"><a name="l01320"></a><span class="lineno"> 1320</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l01321"></a><span class="lineno"> 1321</span>&#160;    <span class="keywordflow">case</span> DataLayout::NCHW:</div><div class="line"><a name="l01322"></a><span class="lineno"> 1322</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l01323"></a><span class="lineno"> 1323</span>&#160;        outputInfo = <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a>({ inputTensorInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a8b5d0f8a24e9d9238f412260a552acf8">GetShape</a>()[0],</div><div class="line"><a name="l01324"></a><span class="lineno"> 1324</span>&#160;                                  weightTensor.<a class="code" href="classarmnn_1_1_base_tensor.xhtml#a8b5d0f8a24e9d9238f412260a552acf8">GetShape</a>()[0],</div><div class="line"><a name="l01325"></a><span class="lineno"> 1325</span>&#160;                                  outputHeight,</div><div class="line"><a name="l01326"></a><span class="lineno"> 1326</span>&#160;                                  outputWidth },</div><div class="line"><a name="l01327"></a><span class="lineno"> 1327</span>&#160;                                DataType::Float32);</div><div class="line"><a name="l01328"></a><span class="lineno"> 1328</span>&#160;        <span class="keywordflow">break</span>;</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;</div><div class="line"><a name="l01331"></a><span class="lineno"> 1331</span>&#160;    <a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml">IConnectableLayer</a>* layer = <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a2db3ae8d422f17d455e0ba0cb6291d2a">m_Network</a>-&gt;AddConvolution2dLayer(desc,</div><div class="line"><a name="l01332"></a><span class="lineno"> 1332</span>&#160;                                                                weightTensor,</div><div class="line"><a name="l01333"></a><span class="lineno"> 1333</span>&#160;                                                                <a class="code" href="structarmnn_1_1_empty_optional.xhtml">EmptyOptional</a>(),</div><div class="line"><a name="l01334"></a><span class="lineno"> 1334</span>&#160;                                                                nodeDef.name().c_str());</div><div class="line"><a name="l01335"></a><span class="lineno"> 1335</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);</div><div class="line"><a name="l01336"></a><span class="lineno"> 1336</span>&#160;    inputSlot.<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#ac1835f8756a9f03c02fcf9664e3a0fce">Connect</a>(layer-&gt;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml#a6ec9e0eb66d7d6a01240492a0b18104c">GetInputSlot</a>(0));</div><div class="line"><a name="l01337"></a><span class="lineno"> 1337</span>&#160;</div><div class="line"><a name="l01338"></a><span class="lineno"> 1338</span>&#160;    <span class="keywordflow">return</span> std::make_unique&lt;SingleLayerParsedTfOperation&gt;(<span class="keyword">this</span>, nodeDef, layer);</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;</div><div class="line"><a name="l01341"></a><span class="lineno"><a class="line" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a87e85155fcde2f7e6e7cc0353e31867f"> 1341</a></span>&#160;<a class="code" href="namespacearmnn_tf_parser.xhtml#aa36bf288c19fe35767bb6e059636f405">ParsedTfOperationPtr</a> <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a87e85155fcde2f7e6e7cc0353e31867f">ITfParser::TfParserImpl::ParseDepthwiseConv2D</a>(<span class="keyword">const</span> tensorflow::NodeDef&amp; nodeDef,</div><div class="line"><a name="l01342"></a><span class="lineno"> 1342</span>&#160;                                                                   <span class="keyword">const</span> tensorflow::GraphDef&amp; graphDef)</div><div class="line"><a name="l01343"></a><span class="lineno"> 1343</span>&#160;{</div><div class="line"><a name="l01344"></a><span class="lineno"> 1344</span>&#160;    <a class="code" href="namespacearmnn.xhtml#a44affeeb090c3c6a3062830562672e84">IgnoreUnused</a>(graphDef);</div><div class="line"><a name="l01345"></a><span class="lineno"> 1345</span>&#160;    std::vector&lt;OutputOfParsedTfOperation&gt; inputs = <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#ae295ca8b7d19bb5e6db3f93bd4561ee0">GetInputParsedTfOperationsChecked</a>(nodeDef, 2);</div><div class="line"><a name="l01346"></a><span class="lineno"> 1346</span>&#160;    <a class="code" href="classarmnn_1_1_i_output_slot.xhtml">IOutputSlot</a>&amp; inputSlot = inputs[0].m_IndexedValue-&gt;ResolveArmnnOutputSlot(inputs[0].m_Index);</div><div class="line"><a name="l01347"></a><span class="lineno"> 1347</span>&#160;    <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> inputTensorInfo = inputSlot.<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#a9943775a364fc4ab53b85ac88f311886">GetTensorInfo</a>();</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="keywordflow">if</span> (!HasParsedConstTensor&lt;float&gt;(inputs[1].m_IndexedValue-&gt;GetNode().name()))</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;        <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_parse_exception.xhtml">ParseException</a>(</div><div class="line"><a name="l01352"></a><span class="lineno"> 1352</span>&#160;            fmt::format(<span class="stringliteral">&quot;ArmNN only supports Depthwise Convolution layer with constant weights. &quot;</span></div><div class="line"><a name="l01353"></a><span class="lineno"> 1353</span>&#160;                        <span class="stringliteral">&quot;Non const input found {} for node {} {}&quot;</span>,</div><div class="line"><a name="l01354"></a><span class="lineno"> 1354</span>&#160;                        inputs[1].m_IndexedValue-&gt;GetNode().name(),</div><div class="line"><a name="l01355"></a><span class="lineno"> 1355</span>&#160;                        nodeDef.name(),</div><div class="line"><a name="l01356"></a><span class="lineno"> 1356</span>&#160;                        <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l01357"></a><span class="lineno"> 1357</span>&#160;    }</div><div class="line"><a name="l01358"></a><span class="lineno"> 1358</span>&#160;</div><div class="line"><a name="l01359"></a><span class="lineno"> 1359</span>&#160;    ParsedConstTfOperation&lt;float&gt;* weightNode =</div><div class="line"><a name="l01360"></a><span class="lineno"> 1360</span>&#160;        PolymorphicDowncast&lt;ParsedConstTfOperation&lt;float&gt; *&gt;(inputs[1].m_IndexedValue);</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;    std::string paddingString = ReadMandatoryNodeStringAttribute(nodeDef, <span class="stringliteral">&quot;padding&quot;</span>);</div><div class="line"><a name="l01363"></a><span class="lineno"> 1363</span>&#160;    std::string dataFormat = ReadMandatoryNodeStringAttribute(nodeDef, <span class="stringliteral">&quot;data_format&quot;</span>);</div><div class="line"><a name="l01364"></a><span class="lineno"> 1364</span>&#160;    std::vector&lt;uint32_t&gt; strides = ReadMandatoryNodeUint32ListAttribute(nodeDef, <span class="stringliteral">&quot;strides&quot;</span>);</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;    <a class="code" href="structarmnn_1_1_depthwise_convolution2d_descriptor.xhtml">DepthwiseConvolution2dDescriptor</a> desc;</div><div class="line"><a name="l01367"></a><span class="lineno"> 1367</span>&#160;    desc.<a class="code" href="structarmnn_1_1_depthwise_convolution2d_descriptor.xhtml#aea202e14d8874cefd9a0f778022b7e25">m_BiasEnabled</a> = <span class="keyword">false</span>;</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;    <a class="code" href="_tf_parser_8cpp.xhtml#a3fb047570644cae325aa88d3cd7bb96e">CHECK_DATA_FORMAT</a>(nodeDef, dataFormat, <span class="stringliteral">&quot;DepthwiseConv2dNative&quot;</span>);</div><div class="line"><a name="l01370"></a><span class="lineno"> 1370</span>&#160;</div><div class="line"><a name="l01371"></a><span class="lineno"> 1371</span>&#160;    <a class="code" href="namespacearmnn.xhtml#ad1d5cce2d9e9a5d61c243e5c989112e0">DataLayout</a> dataLayout = dataFormat == <span class="stringliteral">&quot;NHWC&quot;</span> ? DataLayout::NHWC : DataLayout::NCHW;</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;    desc.<a class="code" href="structarmnn_1_1_depthwise_convolution2d_descriptor.xhtml#a6089e1ca91914015777ea780a513131a">m_DataLayout</a> = dataLayout;</div><div class="line"><a name="l01374"></a><span class="lineno"> 1374</span>&#160;</div><div class="line"><a name="l01375"></a><span class="lineno"> 1375</span>&#160;    <a class="code" href="classarmnn_utils_1_1_data_layout_indexed.xhtml">DataLayoutIndexed</a> dataLayoutIndexed(dataLayout);</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;    desc.<a class="code" href="structarmnn_1_1_depthwise_convolution2d_descriptor.xhtml#afe6a3377c4531315354def9023c8fdda">m_StrideX</a> = strides[dataLayoutIndexed.<a class="code" href="classarmnn_utils_1_1_data_layout_indexed.xhtml#a414e6f95548e6f7a01d5028b55ad3941">GetWidthIndex</a>()];</div><div class="line"><a name="l01378"></a><span class="lineno"> 1378</span>&#160;    desc.<a class="code" href="structarmnn_1_1_depthwise_convolution2d_descriptor.xhtml#ac1fe174bbadfb39a2b636940c2e647c8">m_StrideY</a> = strides[dataLayoutIndexed.<a class="code" href="classarmnn_utils_1_1_data_layout_indexed.xhtml#a61c00316c443adc233c24e85c6c5b740">GetHeightIndex</a>()];</div><div class="line"><a name="l01379"></a><span class="lineno"> 1379</span>&#160;    std::vector&lt;uint32_t&gt; dilations = ReadOptionalNodeUint32ListAttribute(nodeDef, <span class="stringliteral">&quot;dilations&quot;</span>);</div><div class="line"><a name="l01380"></a><span class="lineno"> 1380</span>&#160;    <span class="keywordflow">if</span> (!dilations.empty())</div><div class="line"><a name="l01381"></a><span class="lineno"> 1381</span>&#160;    {</div><div class="line"><a name="l01382"></a><span class="lineno"> 1382</span>&#160;        desc.<a class="code" href="structarmnn_1_1_depthwise_convolution2d_descriptor.xhtml#aa3c6a77a963a98ccb8ea7b8fd008a8c1">m_DilationX</a> = dilations[dataLayoutIndexed.<a class="code" href="classarmnn_utils_1_1_data_layout_indexed.xhtml#a414e6f95548e6f7a01d5028b55ad3941">GetWidthIndex</a>()];</div><div class="line"><a name="l01383"></a><span class="lineno"> 1383</span>&#160;        desc.<a class="code" href="structarmnn_1_1_depthwise_convolution2d_descriptor.xhtml#a302b688d88dd73cde0fb1faef6679907">m_DilationY</a> = dilations[dataLayoutIndexed.<a class="code" href="classarmnn_utils_1_1_data_layout_indexed.xhtml#a61c00316c443adc233c24e85c6c5b740">GetHeightIndex</a>()];</div><div class="line"><a name="l01384"></a><span class="lineno"> 1384</span>&#160;    }</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;    uint32_t inputHeight = inputTensorInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a8b5d0f8a24e9d9238f412260a552acf8">GetShape</a>()[dataLayoutIndexed.<a class="code" href="classarmnn_utils_1_1_data_layout_indexed.xhtml#a61c00316c443adc233c24e85c6c5b740">GetHeightIndex</a>()];</div><div class="line"><a name="l01387"></a><span class="lineno"> 1387</span>&#160;    uint32_t inputWidth  = inputTensorInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a8b5d0f8a24e9d9238f412260a552acf8">GetShape</a>()[dataLayoutIndexed.<a class="code" href="classarmnn_utils_1_1_data_layout_indexed.xhtml#a414e6f95548e6f7a01d5028b55ad3941">GetWidthIndex</a>()];</div><div class="line"><a name="l01388"></a><span class="lineno"> 1388</span>&#160;</div><div class="line"><a name="l01389"></a><span class="lineno"> 1389</span>&#160;    <span class="comment">// Mappings from TensorFlow filter tensors to the ArmNN filter tensors.</span></div><div class="line"><a name="l01390"></a><span class="lineno"> 1390</span>&#160;    <span class="comment">// Tensorflow weights come in the format [H, W, I, M].</span></div><div class="line"><a name="l01391"></a><span class="lineno"> 1391</span>&#160;    <span class="comment">// ArmNN weights have to be [M, I, H, W].</span></div><div class="line"><a name="l01392"></a><span class="lineno"> 1392</span>&#160;    <a class="code" href="classarmnn_1_1_permutation_vector.xhtml">PermutationVector</a> permutationVector{ 2, 3, 1, 0 }; <span class="comment">// [H, W, I, M] -&gt; [M, I, H, W]</span></div><div class="line"><a name="l01393"></a><span class="lineno"> 1393</span>&#160;</div><div class="line"><a name="l01394"></a><span class="lineno"> 1394</span>&#160;    <span class="comment">// Swizzle the tensor using the given permutation vector.</span></div><div class="line"><a name="l01395"></a><span class="lineno"> 1395</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a>&amp; weightTensorInfo = weightNode-&gt;GetTensorInfo();</div><div class="line"><a name="l01396"></a><span class="lineno"> 1396</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> weightTensorSwizzledInfo = <a class="code" href="namespacearmnn_utils.xhtml#abeaf4f6785039866fd075f4569ba8e84">armnnUtils::Permuted</a>(weightTensorInfo, permutationVector);</div><div class="line"><a name="l01397"></a><span class="lineno"> 1397</span>&#160;</div><div class="line"><a name="l01398"></a><span class="lineno"> 1398</span>&#160;    <span class="comment">// Swizzles the content of the tensor&#39;s permanent storage into a local storage.</span></div><div class="line"><a name="l01399"></a><span class="lineno"> 1399</span>&#160;    std::vector&lt;float&gt; weightTensorSwizzledData(weightTensorInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a8846406ac37fbd2204f0be16ee05d5b7">GetNumElements</a>());</div><div class="line"><a name="l01400"></a><span class="lineno"> 1400</span>&#160;    <a class="code" href="namespacearmnn_utils.xhtml#af3c74017185773dd61d8ca6662d65d43">armnnUtils::Permute</a>(weightTensorSwizzledInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a8b5d0f8a24e9d9238f412260a552acf8">GetShape</a>(), permutationVector,</div><div class="line"><a name="l01401"></a><span class="lineno"> 1401</span>&#160;                        weightNode-&gt;GetStorage(), weightTensorSwizzledData.data(), <span class="keyword">sizeof</span>(float));</div><div class="line"><a name="l01402"></a><span class="lineno"> 1402</span>&#160;</div><div class="line"><a name="l01403"></a><span class="lineno"> 1403</span>&#160;    <span class="comment">// Create a weight tensor with the newly swizzled data.</span></div><div class="line"><a name="l01404"></a><span class="lineno"> 1404</span>&#160;    <a class="code" href="classarmnn_1_1_const_tensor.xhtml">ConstTensor</a> weightTensor(weightTensorSwizzledInfo, weightTensorSwizzledData);</div><div class="line"><a name="l01405"></a><span class="lineno"> 1405</span>&#160;</div><div class="line"><a name="l01406"></a><span class="lineno"> 1406</span>&#160;    uint32_t weightHeight = weightTensor.<a class="code" href="classarmnn_1_1_base_tensor.xhtml#a8b5d0f8a24e9d9238f412260a552acf8">GetShape</a>()[2];</div><div class="line"><a name="l01407"></a><span class="lineno"> 1407</span>&#160;    uint32_t weightWidth  = weightTensor.<a class="code" href="classarmnn_1_1_base_tensor.xhtml#a8b5d0f8a24e9d9238f412260a552acf8">GetShape</a>()[3];</div><div class="line"><a name="l01408"></a><span class="lineno"> 1408</span>&#160;</div><div class="line"><a name="l01409"></a><span class="lineno"> 1409</span>&#160;    <span class="keywordtype">bool</span> padding = <span class="keyword">false</span>;</div><div class="line"><a name="l01410"></a><span class="lineno"> 1410</span>&#160;    <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> outputInfo;</div><div class="line"><a name="l01411"></a><span class="lineno"> 1411</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> outputHeight = 0;</div><div class="line"><a name="l01412"></a><span class="lineno"> 1412</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> outputWidth = 0;</div><div class="line"><a name="l01413"></a><span class="lineno"> 1413</span>&#160;</div><div class="line"><a name="l01414"></a><span class="lineno"> 1414</span>&#160;    <a class="code" href="_tf_parser_8cpp.xhtml#aab838eb7734e531bb5be6f6dece673bf">CHECK_PADDING_TYPE</a>(nodeDef, paddingString);</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;    <span class="keywordflow">if</span> (paddingString == <span class="stringliteral">&quot;SAME&quot;</span>)</div><div class="line"><a name="l01417"></a><span class="lineno"> 1417</span>&#160;    {</div><div class="line"><a name="l01418"></a><span class="lineno"> 1418</span>&#160;        padding = <span class="keyword">true</span>;</div><div class="line"><a name="l01419"></a><span class="lineno"> 1419</span>&#160;    }</div><div class="line"><a name="l01420"></a><span class="lineno"> 1420</span>&#160;    <span class="keywordflow">else</span> <span class="keywordflow">if</span> (paddingString == <span class="stringliteral">&quot;VALID&quot;</span>)</div><div class="line"><a name="l01421"></a><span class="lineno"> 1421</span>&#160;    {</div><div class="line"><a name="l01422"></a><span class="lineno"> 1422</span>&#160;        padding = <span class="keyword">false</span>;</div><div class="line"><a name="l01423"></a><span class="lineno"> 1423</span>&#160;    }</div><div class="line"><a name="l01424"></a><span class="lineno"> 1424</span>&#160;</div><div class="line"><a name="l01425"></a><span class="lineno"> 1425</span>&#160;    <a class="code" href="namespacearmnn_tf_parser.xhtml#aca0a31de02d5c087029bb28c9202b4d6">CalcPadding</a>(inputHeight, weightHeight, desc.<a class="code" href="structarmnn_1_1_depthwise_convolution2d_descriptor.xhtml#ac1fe174bbadfb39a2b636940c2e647c8">m_StrideY</a>, desc.<a class="code" href="structarmnn_1_1_depthwise_convolution2d_descriptor.xhtml#a302b688d88dd73cde0fb1faef6679907">m_DilationY</a>, desc.<a class="code" href="structarmnn_1_1_depthwise_convolution2d_descriptor.xhtml#a56b51f56cef50cdfa554258eecdab046">m_PadTop</a>, desc.<a class="code" href="structarmnn_1_1_depthwise_convolution2d_descriptor.xhtml#aa9e49717ebdb741e8c767741647fc618">m_PadBottom</a>, padding);</div><div class="line"><a name="l01426"></a><span class="lineno"> 1426</span>&#160;    <a class="code" href="namespacearmnn_tf_parser.xhtml#aca0a31de02d5c087029bb28c9202b4d6">CalcPadding</a>(inputWidth, weightWidth, desc.<a class="code" href="structarmnn_1_1_depthwise_convolution2d_descriptor.xhtml#afe6a3377c4531315354def9023c8fdda">m_StrideX</a>, desc.<a class="code" href="structarmnn_1_1_depthwise_convolution2d_descriptor.xhtml#aa3c6a77a963a98ccb8ea7b8fd008a8c1">m_DilationX</a>, desc.<a class="code" href="structarmnn_1_1_depthwise_convolution2d_descriptor.xhtml#ac18546ebbebbb32fe0a03baa9bf2c600">m_PadLeft</a>, desc.<a class="code" href="structarmnn_1_1_depthwise_convolution2d_descriptor.xhtml#a002bc30e590d78cbb4f4d12171055ca7">m_PadRight</a>, padding);</div><div class="line"><a name="l01427"></a><span class="lineno"> 1427</span>&#160;</div><div class="line"><a name="l01428"></a><span class="lineno"> 1428</span>&#160;    <span class="comment">// Calculate output height and  width</span></div><div class="line"><a name="l01429"></a><span class="lineno"> 1429</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> dilatedFilterWidth = weightWidth + (desc.<a class="code" href="structarmnn_1_1_depthwise_convolution2d_descriptor.xhtml#aa3c6a77a963a98ccb8ea7b8fd008a8c1">m_DilationX</a> - 1) * (weightWidth - 1);</div><div class="line"><a name="l01430"></a><span class="lineno"> 1430</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> readWidth = (inputWidth + desc.<a class="code" href="structarmnn_1_1_depthwise_convolution2d_descriptor.xhtml#ac18546ebbebbb32fe0a03baa9bf2c600">m_PadLeft</a> + desc.<a class="code" href="structarmnn_1_1_depthwise_convolution2d_descriptor.xhtml#a002bc30e590d78cbb4f4d12171055ca7">m_PadRight</a>) - dilatedFilterWidth;</div><div class="line"><a name="l01431"></a><span class="lineno"> 1431</span>&#160;    outputWidth = 1 + (readWidth / desc.<a class="code" href="structarmnn_1_1_depthwise_convolution2d_descriptor.xhtml#afe6a3377c4531315354def9023c8fdda">m_StrideX</a>);</div><div class="line"><a name="l01432"></a><span class="lineno"> 1432</span>&#160;</div><div class="line"><a name="l01433"></a><span class="lineno"> 1433</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> dilatedFilterHeight = weightHeight + (desc.<a class="code" href="structarmnn_1_1_depthwise_convolution2d_descriptor.xhtml#a302b688d88dd73cde0fb1faef6679907">m_DilationY</a> - 1) * (weightHeight - 1);</div><div class="line"><a name="l01434"></a><span class="lineno"> 1434</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> readHeight = (inputHeight + desc.<a class="code" href="structarmnn_1_1_depthwise_convolution2d_descriptor.xhtml#a56b51f56cef50cdfa554258eecdab046">m_PadTop</a> + desc.<a class="code" href="structarmnn_1_1_depthwise_convolution2d_descriptor.xhtml#aa9e49717ebdb741e8c767741647fc618">m_PadBottom</a>) - dilatedFilterHeight;</div><div class="line"><a name="l01435"></a><span class="lineno"> 1435</span>&#160;    outputHeight = 1 + (readHeight / desc.<a class="code" href="structarmnn_1_1_depthwise_convolution2d_descriptor.xhtml#ac1fe174bbadfb39a2b636940c2e647c8">m_StrideY</a>);</div><div class="line"><a name="l01436"></a><span class="lineno"> 1436</span>&#160;</div><div class="line"><a name="l01437"></a><span class="lineno"> 1437</span>&#160;    <span class="keywordflow">switch</span> (dataLayout)</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;        <span class="keywordflow">case</span> DataLayout::NHWC:</div><div class="line"><a name="l01440"></a><span class="lineno"> 1440</span>&#160;            outputInfo = <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a>({ inputTensorInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a8b5d0f8a24e9d9238f412260a552acf8">GetShape</a>()[0],</div><div class="line"><a name="l01441"></a><span class="lineno"> 1441</span>&#160;                                      outputHeight,</div><div class="line"><a name="l01442"></a><span class="lineno"> 1442</span>&#160;                                      outputWidth,</div><div class="line"><a name="l01443"></a><span class="lineno"> 1443</span>&#160;                                      weightTensor.<a class="code" href="classarmnn_1_1_base_tensor.xhtml#a8b5d0f8a24e9d9238f412260a552acf8">GetShape</a>()[0] * weightTensor.<a class="code" href="classarmnn_1_1_base_tensor.xhtml#a8b5d0f8a24e9d9238f412260a552acf8">GetShape</a>()[1]},</div><div class="line"><a name="l01444"></a><span class="lineno"> 1444</span>&#160;                                    DataType::Float32);</div><div class="line"><a name="l01445"></a><span class="lineno"> 1445</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l01446"></a><span class="lineno"> 1446</span>&#160;        <span class="keywordflow">case</span> DataLayout::NCHW:</div><div class="line"><a name="l01447"></a><span class="lineno"> 1447</span>&#160;        <span class="keywordflow">default</span>:</div><div class="line"><a name="l01448"></a><span class="lineno"> 1448</span>&#160;            outputInfo = <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a>({ inputTensorInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a8b5d0f8a24e9d9238f412260a552acf8">GetShape</a>()[0],</div><div class="line"><a name="l01449"></a><span class="lineno"> 1449</span>&#160;                                      weightTensor.<a class="code" href="classarmnn_1_1_base_tensor.xhtml#a8b5d0f8a24e9d9238f412260a552acf8">GetShape</a>()[0] * weightTensor.<a class="code" href="classarmnn_1_1_base_tensor.xhtml#a8b5d0f8a24e9d9238f412260a552acf8">GetShape</a>()[1],</div><div class="line"><a name="l01450"></a><span class="lineno"> 1450</span>&#160;                                      outputHeight,</div><div class="line"><a name="l01451"></a><span class="lineno"> 1451</span>&#160;                                      outputWidth },</div><div class="line"><a name="l01452"></a><span class="lineno"> 1452</span>&#160;                                    DataType::Float32);</div><div class="line"><a name="l01453"></a><span class="lineno"> 1453</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l01454"></a><span class="lineno"> 1454</span>&#160;    }</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;    <a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml">IConnectableLayer</a>* layer = <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a2db3ae8d422f17d455e0ba0cb6291d2a">m_Network</a>-&gt;AddDepthwiseConvolution2dLayer(desc,</div><div class="line"><a name="l01457"></a><span class="lineno"> 1457</span>&#160;                                                                         weightTensor,</div><div class="line"><a name="l01458"></a><span class="lineno"> 1458</span>&#160;                                                                         <a class="code" href="structarmnn_1_1_empty_optional.xhtml">EmptyOptional</a>(),</div><div class="line"><a name="l01459"></a><span class="lineno"> 1459</span>&#160;                                                                         nodeDef.name().c_str());</div><div class="line"><a name="l01460"></a><span class="lineno"> 1460</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);</div><div class="line"><a name="l01461"></a><span class="lineno"> 1461</span>&#160;    inputSlot.<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#ac1835f8756a9f03c02fcf9664e3a0fce">Connect</a>(layer-&gt;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml#a6ec9e0eb66d7d6a01240492a0b18104c">GetInputSlot</a>(0));</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="keywordflow">return</span> std::make_unique&lt;SingleLayerParsedTfOperation&gt;(<span class="keyword">this</span>, nodeDef, layer);</div><div class="line"><a name="l01464"></a><span class="lineno"> 1464</span>&#160;}</div><div class="line"><a name="l01465"></a><span class="lineno"> 1465</span>&#160;</div><div class="line"><a name="l01466"></a><span class="lineno"><a class="line" href="namespacearmnn_tf_parser.xhtml#a9be4b3b32d110ca8d27936f6f7df1408"> 1466</a></span>&#160;<a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> <a class="code" href="namespacearmnn_tf_parser.xhtml#a9be4b3b32d110ca8d27936f6f7df1408">OutputShapeOfExpandDims</a>(<span class="keyword">const</span> tensorflow::NodeDef&amp; nodeDef,</div><div class="line"><a name="l01467"></a><span class="lineno"> 1467</span>&#160;                                   <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> inputTensorInfo,</div><div class="line"><a name="l01468"></a><span class="lineno"> 1468</span>&#160;                                   std::int32_t expandDim)</div><div class="line"><a name="l01469"></a><span class="lineno"> 1469</span>&#160;{</div><div class="line"><a name="l01470"></a><span class="lineno"> 1470</span>&#160;    <a class="code" href="_assert_8hpp.xhtml#a5698be69cbd5dfe6c28fcd9867e8cbed">ARMNN_ASSERT</a>(nodeDef.op() == <span class="stringliteral">&quot;ExpandDims&quot;</span>);</div><div class="line"><a name="l01471"></a><span class="lineno"> 1471</span>&#160;</div><div class="line"><a name="l01472"></a><span class="lineno"> 1472</span>&#160;    <span class="keywordflow">if</span> (inputTensorInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a157e27d41e9f6b21f0d3c025fa47dc24">GetNumDimensions</a>() &gt; 4) {</div><div class="line"><a name="l01473"></a><span class="lineno"> 1473</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="l01474"></a><span class="lineno"> 1474</span>&#160;                fmt::format(<span class="stringliteral">&quot;Unsupported number of dimensions: {} for input shape for ExpandDims {} {}&quot;</span>,</div><div class="line"><a name="l01475"></a><span class="lineno"> 1475</span>&#160;                            inputTensorInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a157e27d41e9f6b21f0d3c025fa47dc24">GetNumDimensions</a>(),</div><div class="line"><a name="l01476"></a><span class="lineno"> 1476</span>&#160;                            nodeDef.name(),</div><div class="line"><a name="l01477"></a><span class="lineno"> 1477</span>&#160;                            <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l01478"></a><span class="lineno"> 1478</span>&#160;    }</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;    std::int32_t inputDimSize = <a class="code" href="namespacearmnn.xhtml#a375ca3cff9f1b005d1412dc5f3cf5b6e">armnn::numeric_cast</a>&lt;int32_t&gt;(inputTensorInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a157e27d41e9f6b21f0d3c025fa47dc24">GetNumDimensions</a>());</div><div class="line"><a name="l01481"></a><span class="lineno"> 1481</span>&#160;    std::vector&lt;uint32_t&gt; outputDims;</div><div class="line"><a name="l01482"></a><span class="lineno"> 1482</span>&#160;</div><div class="line"><a name="l01483"></a><span class="lineno"> 1483</span>&#160;    <span class="comment">// expandDim operation requires: -1-input.dims() &lt;= dim &lt;= input.dims()</span></div><div class="line"><a name="l01484"></a><span class="lineno"> 1484</span>&#160;    <span class="keywordflow">if</span> (expandDim &gt;= -1 - inputDimSize &amp;&amp; expandDim &lt;= inputDimSize)</div><div class="line"><a name="l01485"></a><span class="lineno"> 1485</span>&#160;    {</div><div class="line"><a name="l01486"></a><span class="lineno"> 1486</span>&#160;        <span class="comment">// add current input shape to outputDims</span></div><div class="line"><a name="l01487"></a><span class="lineno"> 1487</span>&#160;        <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i = 0; i &lt; inputTensorInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a157e27d41e9f6b21f0d3c025fa47dc24">GetNumDimensions</a>(); ++i) {</div><div class="line"><a name="l01488"></a><span class="lineno"> 1488</span>&#160;            <span class="keyword">auto</span> currentDimension = inputTensorInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a8b5d0f8a24e9d9238f412260a552acf8">GetShape</a>()[i];</div><div class="line"><a name="l01489"></a><span class="lineno"> 1489</span>&#160;            outputDims.push_back(currentDimension);</div><div class="line"><a name="l01490"></a><span class="lineno"> 1490</span>&#160;        }</div><div class="line"><a name="l01491"></a><span class="lineno"> 1491</span>&#160;</div><div class="line"><a name="l01492"></a><span class="lineno"> 1492</span>&#160;        <span class="comment">// insert a dimension of 1 at index &#39;expandDim&#39; of inputs shape</span></div><div class="line"><a name="l01493"></a><span class="lineno"> 1493</span>&#160;        <span class="keywordflow">if</span> (expandDim &gt;= 0)</div><div class="line"><a name="l01494"></a><span class="lineno"> 1494</span>&#160;        {</div><div class="line"><a name="l01495"></a><span class="lineno"> 1495</span>&#160;            <span class="keyword">auto</span> getPosition = std::next(outputDims.begin() + 0, expandDim);</div><div class="line"><a name="l01496"></a><span class="lineno"> 1496</span>&#160;            outputDims.insert(getPosition, 1);</div><div class="line"><a name="l01497"></a><span class="lineno"> 1497</span>&#160;        }</div><div class="line"><a name="l01498"></a><span class="lineno"> 1498</span>&#160;</div><div class="line"><a name="l01499"></a><span class="lineno"> 1499</span>&#160;        <span class="comment">// if negative number for &#39;expandDim&#39; then count backwards from the last element</span></div><div class="line"><a name="l01500"></a><span class="lineno"> 1500</span>&#160;        <span class="comment">// and insert 1 dimension at index &#39;expandDim&#39;</span></div><div class="line"><a name="l01501"></a><span class="lineno"> 1501</span>&#160;        <span class="keywordflow">if</span> (expandDim &lt; 0)</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="keywordtype">int</span> outputDimSize = <a class="code" href="namespacearmnn.xhtml#a375ca3cff9f1b005d1412dc5f3cf5b6e">armnn::numeric_cast</a>&lt;<span class="keywordtype">int</span>&gt;(outputDims.size() + 1);</div><div class="line"><a name="l01504"></a><span class="lineno"> 1504</span>&#160;            <span class="keyword">auto</span> getPosition = std::next(outputDims.begin() + outputDimSize, expandDim);</div><div class="line"><a name="l01505"></a><span class="lineno"> 1505</span>&#160;            outputDims.insert(getPosition, 1);</div><div class="line"><a name="l01506"></a><span class="lineno"> 1506</span>&#160;        }</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="keywordflow">else</span></div><div class="line"><a name="l01509"></a><span class="lineno"> 1509</span>&#160;    {</div><div class="line"><a name="l01510"></a><span class="lineno"> 1510</span>&#160;        <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_invalid_argument_exception.xhtml">InvalidArgumentException</a>(</div><div class="line"><a name="l01511"></a><span class="lineno"> 1511</span>&#160;                fmt::format(<span class="stringliteral">&quot;Cannot expand dimension {} in input tensor with {} dimension {}&quot;</span>,</div><div class="line"><a name="l01512"></a><span class="lineno"> 1512</span>&#160;                            expandDim,</div><div class="line"><a name="l01513"></a><span class="lineno"> 1513</span>&#160;                            inputDimSize,</div><div class="line"><a name="l01514"></a><span class="lineno"> 1514</span>&#160;                            <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</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;</div><div class="line"><a name="l01517"></a><span class="lineno"> 1517</span>&#160;    <span class="keywordflow">if</span> (outputDims.size() &gt; 4)</div><div class="line"><a name="l01518"></a><span class="lineno"> 1518</span>&#160;    {</div><div class="line"><a name="l01519"></a><span class="lineno"> 1519</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="l01520"></a><span class="lineno"> 1520</span>&#160;                fmt::format(<span class="stringliteral">&quot;Unsupported number of dimensions: {} for output shape for ExpandDims {} {}&quot;</span>,</div><div class="line"><a name="l01521"></a><span class="lineno"> 1521</span>&#160;                            outputDims.size(),</div><div class="line"><a name="l01522"></a><span class="lineno"> 1522</span>&#160;                            nodeDef.name(),</div><div class="line"><a name="l01523"></a><span class="lineno"> 1523</span>&#160;                            <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</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;</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> outShape = <a class="code" href="classarmnn_1_1_tensor_shape.xhtml">TensorShape</a>(static_cast&lt;unsigned int&gt;(outputDims.size()),</div><div class="line"><a name="l01527"></a><span class="lineno"> 1527</span>&#160;                                       outputDims.data());</div><div class="line"><a name="l01528"></a><span class="lineno"> 1528</span>&#160;</div><div class="line"><a name="l01529"></a><span class="lineno"> 1529</span>&#160;    <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> outTensorInfo = inputTensorInfo;</div><div class="line"><a name="l01530"></a><span class="lineno"> 1530</span>&#160;    outTensorInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#abe8889e8150beef5fd204b2d87b49298">SetShape</a>(outShape);</div><div class="line"><a name="l01531"></a><span class="lineno"> 1531</span>&#160;</div><div class="line"><a name="l01532"></a><span class="lineno"> 1532</span>&#160;    <span class="keywordflow">return</span> outTensorInfo;</div><div class="line"><a name="l01533"></a><span class="lineno"> 1533</span>&#160;}</div><div class="line"><a name="l01534"></a><span class="lineno"> 1534</span>&#160;</div><div class="line"><a name="l01535"></a><span class="lineno"><a class="line" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a165298763e91bc4322753dbe8cbe9df7"> 1535</a></span>&#160;<a class="code" href="namespacearmnn_tf_parser.xhtml#aa36bf288c19fe35767bb6e059636f405">ParsedTfOperationPtr</a> <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a165298763e91bc4322753dbe8cbe9df7">ITfParser::TfParserImpl::ParseExpandDims</a>(<span class="keyword">const</span> tensorflow::NodeDef&amp; nodeDef,</div><div class="line"><a name="l01536"></a><span class="lineno"> 1536</span>&#160;                                                             <span class="keyword">const</span> tensorflow::GraphDef&amp; graphDef)</div><div class="line"><a name="l01537"></a><span class="lineno"> 1537</span>&#160;{</div><div class="line"><a name="l01538"></a><span class="lineno"> 1538</span>&#160;    <a class="code" href="namespacearmnn.xhtml#a44affeeb090c3c6a3062830562672e84">IgnoreUnused</a>(graphDef);</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">// Number of inputs can either</span></div><div class="line"><a name="l01541"></a><span class="lineno"> 1541</span>&#160;    <span class="comment">// be 1 - that indicates that the axis parameter is passed as an attribute of the operation</span></div><div class="line"><a name="l01542"></a><span class="lineno"> 1542</span>&#160;    <span class="comment">// or 2 - which means that the axis parameter is passed as a second input</span></div><div class="line"><a name="l01543"></a><span class="lineno"> 1543</span>&#160;    std::vector&lt;OutputOfConstNodeDef&gt; nodes = <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a9e7a394f59e8d223a79e3db798803c1c">GetTfInputNodes</a>(nodeDef);</div><div class="line"><a name="l01544"></a><span class="lineno"> 1544</span>&#160;    <span class="keyword">const</span> std::size_t numInputs = nodes.size();</div><div class="line"><a name="l01545"></a><span class="lineno"> 1545</span>&#160;    std::vector&lt;OutputOfParsedTfOperation&gt; inputs;</div><div class="line"><a name="l01546"></a><span class="lineno"> 1546</span>&#160;    std::int32_t expandDim; <span class="comment">// axis or dim parameter. Describes which dimension to expand.</span></div><div class="line"><a name="l01547"></a><span class="lineno"> 1547</span>&#160;    <span class="keywordflow">if</span> (numInputs == 1)</div><div class="line"><a name="l01548"></a><span class="lineno"> 1548</span>&#160;    {</div><div class="line"><a name="l01549"></a><span class="lineno"> 1549</span>&#160;        inputs = <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#ae295ca8b7d19bb5e6db3f93bd4561ee0">GetInputParsedTfOperationsChecked</a>(nodeDef, 1);</div><div class="line"><a name="l01550"></a><span class="lineno"> 1550</span>&#160;        expandDim = ReadMandatoryNodeInt32Attribute(nodeDef, <span class="stringliteral">&quot;Tdim&quot;</span>);</div><div class="line"><a name="l01551"></a><span class="lineno"> 1551</span>&#160;    }</div><div class="line"><a name="l01552"></a><span class="lineno"> 1552</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l01553"></a><span class="lineno"> 1553</span>&#160;    {</div><div class="line"><a name="l01554"></a><span class="lineno"> 1554</span>&#160;        inputs = <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#ae295ca8b7d19bb5e6db3f93bd4561ee0">GetInputParsedTfOperationsChecked</a>(nodeDef, 2);</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;        <span class="comment">// make sure data type is int32</span></div><div class="line"><a name="l01557"></a><span class="lineno"> 1557</span>&#160;        <a class="code" href="classarmnn_1_1_i_output_slot.xhtml">IOutputSlot</a>&amp; prevLayerOutputSlot = inputs[1].m_IndexedValue-&gt;ResolveArmnnOutputSlot(inputs[1].m_Index);</div><div class="line"><a name="l01558"></a><span class="lineno"> 1558</span>&#160;        <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> inputTensorInfo = prevLayerOutputSlot.<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#a9943775a364fc4ab53b85ac88f311886">GetTensorInfo</a>();</div><div class="line"><a name="l01559"></a><span class="lineno"> 1559</span>&#160;</div><div class="line"><a name="l01560"></a><span class="lineno"> 1560</span>&#160;        <span class="keywordflow">if</span> (inputTensorInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#aea909c7327109228ef618d459015def3">GetDataType</a>()!=<a class="code" href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6accedffbc6e5308e33d3843e8bdc0dad7">armnn::DataType::Signed32</a>)</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;            <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_parse_exception.xhtml">ParseException</a>(</div><div class="line"><a name="l01563"></a><span class="lineno"> 1563</span>&#160;                    fmt::format(<span class="stringliteral">&quot;The axis parameter of ExpandDims operation given as second input is not of type int32.&quot;</span></div><div class="line"><a name="l01564"></a><span class="lineno"> 1564</span>&#160;                                <span class="stringliteral">&quot; Input {0} Node {1} {2}&quot;</span>,</div><div class="line"><a name="l01565"></a><span class="lineno"> 1565</span>&#160;                                inputs[1].m_IndexedValue-&gt;GetNode().name(),</div><div class="line"><a name="l01566"></a><span class="lineno"> 1566</span>&#160;                                nodeDef.name(),</div><div class="line"><a name="l01567"></a><span class="lineno"> 1567</span>&#160;                                <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l01568"></a><span class="lineno"> 1568</span>&#160;        }</div><div class="line"><a name="l01569"></a><span class="lineno"> 1569</span>&#160;</div><div class="line"><a name="l01570"></a><span class="lineno"> 1570</span>&#160;        <span class="comment">// ensure the second input is a constant value</span></div><div class="line"><a name="l01571"></a><span class="lineno"> 1571</span>&#160;        <span class="keywordflow">if</span> (!HasParsedConstTensor&lt;int32_t&gt;(inputs[1].m_IndexedValue-&gt;GetNode().name()))</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;            <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_parse_exception.xhtml">ParseException</a>(</div><div class="line"><a name="l01574"></a><span class="lineno"> 1574</span>&#160;                    fmt::format(<span class="stringliteral">&quot;ArmNN only supports ExpandDims layers with constant axis/dim parameter. &quot;</span></div><div class="line"><a name="l01575"></a><span class="lineno"> 1575</span>&#160;                                <span class="stringliteral">&quot;Input {0} Node {1} {2}&quot;</span>,</div><div class="line"><a name="l01576"></a><span class="lineno"> 1576</span>&#160;                                inputs[1].m_IndexedValue-&gt;GetNode().name(),</div><div class="line"><a name="l01577"></a><span class="lineno"> 1577</span>&#160;                                nodeDef.name(),</div><div class="line"><a name="l01578"></a><span class="lineno"> 1578</span>&#160;                                <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l01579"></a><span class="lineno"> 1579</span>&#160;        }</div><div class="line"><a name="l01580"></a><span class="lineno"> 1580</span>&#160;</div><div class="line"><a name="l01581"></a><span class="lineno"> 1581</span>&#160;        <span class="comment">// make sure the second input is scalar or contains only a single value</span></div><div class="line"><a name="l01582"></a><span class="lineno"> 1582</span>&#160;        <span class="comment">// (we don&#39;t support expand dims for multiple axis but we don&#39;t care what shape the</span></div><div class="line"><a name="l01583"></a><span class="lineno"> 1583</span>&#160;        <span class="comment">//  given tensor has as long as there is only a single value in it</span></div><div class="line"><a name="l01584"></a><span class="lineno"> 1584</span>&#160;        <span class="comment">//  e.g. a tensor like this [[[1]]] is completely fine)</span></div><div class="line"><a name="l01585"></a><span class="lineno"> 1585</span>&#160;        <span class="keywordflow">if</span> (inputTensorInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a8846406ac37fbd2204f0be16ee05d5b7">GetNumElements</a>() != 1)</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="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_parse_exception.xhtml">ParseException</a>(</div><div class="line"><a name="l01588"></a><span class="lineno"> 1588</span>&#160;                    fmt::format(<span class="stringliteral">&quot;The axis parameter of ExpandDims operation given as second input is not &quot;</span></div><div class="line"><a name="l01589"></a><span class="lineno"> 1589</span>&#160;                                <span class="stringliteral">&quot;allowed to hold more than one value. &quot;</span></div><div class="line"><a name="l01590"></a><span class="lineno"> 1590</span>&#160;                                <span class="stringliteral">&quot;Input {0} Node {1} {2}&quot;</span>,</div><div class="line"><a name="l01591"></a><span class="lineno"> 1591</span>&#160;                                inputs[1].m_IndexedValue-&gt;GetNode().name(),</div><div class="line"><a name="l01592"></a><span class="lineno"> 1592</span>&#160;                                nodeDef.name(),</div><div class="line"><a name="l01593"></a><span class="lineno"> 1593</span>&#160;                                <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</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;</div><div class="line"><a name="l01596"></a><span class="lineno"> 1596</span>&#160;        ParsedConstTfOperation&lt;int32_t&gt;* expandDimsNode =</div><div class="line"><a name="l01597"></a><span class="lineno"> 1597</span>&#160;                PolymorphicDowncast&lt;ParsedConstTfOperation&lt;int32_t&gt;*&gt;(inputs[1].m_IndexedValue);</div><div class="line"><a name="l01598"></a><span class="lineno"> 1598</span>&#160;</div><div class="line"><a name="l01599"></a><span class="lineno"> 1599</span>&#160;        memcpy(&amp;expandDim, expandDimsNode-&gt;GetStorage(), <span class="keyword">sizeof</span>(expandDim));</div><div class="line"><a name="l01600"></a><span class="lineno"> 1600</span>&#160;    }</div><div class="line"><a name="l01601"></a><span class="lineno"> 1601</span>&#160;</div><div class="line"><a name="l01602"></a><span class="lineno"> 1602</span>&#160;    <span class="comment">// First input is the vector that should be expanded by another dimension</span></div><div class="line"><a name="l01603"></a><span class="lineno"> 1603</span>&#160;    <a class="code" href="classarmnn_1_1_i_output_slot.xhtml">IOutputSlot</a>&amp; prevLayerOutputSlot = inputs[0].m_IndexedValue-&gt;ResolveArmnnOutputSlot(inputs[0].m_Index);</div><div class="line"><a name="l01604"></a><span class="lineno"> 1604</span>&#160;    <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> inputTensorInfo = prevLayerOutputSlot.<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#a9943775a364fc4ab53b85ac88f311886">GetTensorInfo</a>();</div><div class="line"><a name="l01605"></a><span class="lineno"> 1605</span>&#160;</div><div class="line"><a name="l01606"></a><span class="lineno"> 1606</span>&#160;    <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> outputInfo;</div><div class="line"><a name="l01607"></a><span class="lineno"> 1607</span>&#160;    outputInfo = <a class="code" href="namespacearmnn_tf_parser.xhtml#a9be4b3b32d110ca8d27936f6f7df1408">OutputShapeOfExpandDims</a>(nodeDef, inputTensorInfo, expandDim);</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;    <a class="code" href="structarmnn_1_1_reshape_descriptor.xhtml">ReshapeDescriptor</a> reshapeDesc;</div><div class="line"><a name="l01610"></a><span class="lineno"> 1610</span>&#160;    reshapeDesc.<a class="code" href="structarmnn_1_1_reshape_descriptor.xhtml#a1178f4dafdda81f59c15145ec327f7d9">m_TargetShape</a> = outputInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a8b5d0f8a24e9d9238f412260a552acf8">GetShape</a>();</div><div class="line"><a name="l01611"></a><span class="lineno"> 1611</span>&#160;    <a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml">IConnectableLayer</a>* layer = <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a2db3ae8d422f17d455e0ba0cb6291d2a">m_Network</a>-&gt;AddReshapeLayer(reshapeDesc, nodeDef.name().c_str());</div><div class="line"><a name="l01612"></a><span class="lineno"> 1612</span>&#160;    prevLayerOutputSlot.<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#ac1835f8756a9f03c02fcf9664e3a0fce">Connect</a>(layer-&gt;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml#a6ec9e0eb66d7d6a01240492a0b18104c">GetInputSlot</a>(0));</div><div class="line"><a name="l01613"></a><span class="lineno"> 1613</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);</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">return</span> std::make_unique&lt;SingleLayerParsedTfOperation&gt;(<span class="keyword">this</span>, nodeDef, layer);</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;</div><div class="line"><a name="l01618"></a><span class="lineno"><a class="line" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a838bec330f4c2495c3e86088502e35e8"> 1618</a></span>&#160;<a class="code" href="namespacearmnn_tf_parser.xhtml#aa36bf288c19fe35767bb6e059636f405">ParsedTfOperationPtr</a> <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a838bec330f4c2495c3e86088502e35e8">ITfParser::TfParserImpl::ParseFusedBatchNorm</a>(<span class="keyword">const</span> tensorflow::NodeDef&amp; nodeDef,</div><div class="line"><a name="l01619"></a><span class="lineno"> 1619</span>&#160;                                                                 <span class="keyword">const</span> tensorflow::GraphDef&amp; graphDef)</div><div class="line"><a name="l01620"></a><span class="lineno"> 1620</span>&#160;{</div><div class="line"><a name="l01621"></a><span class="lineno"> 1621</span>&#160;    <a class="code" href="namespacearmnn.xhtml#a44affeeb090c3c6a3062830562672e84">IgnoreUnused</a>(graphDef);</div><div class="line"><a name="l01622"></a><span class="lineno"> 1622</span>&#160;    std::vector&lt;OutputOfParsedTfOperation&gt; inputs = <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#ae295ca8b7d19bb5e6db3f93bd4561ee0">GetInputParsedTfOperationsChecked</a>(nodeDef, 5);</div><div class="line"><a name="l01623"></a><span class="lineno"> 1623</span>&#160;</div><div class="line"><a name="l01624"></a><span class="lineno"> 1624</span>&#160;    <span class="keywordflow">if</span> (!HasParsedConstTensor&lt;float&gt;(inputs[1].m_IndexedValue-&gt;GetNode().name()))</div><div class="line"><a name="l01625"></a><span class="lineno"> 1625</span>&#160;    {</div><div class="line"><a name="l01626"></a><span class="lineno"> 1626</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="l01627"></a><span class="lineno"> 1627</span>&#160;            fmt::format(<span class="stringliteral">&quot;ArmNN only supports FusedBatchNormalization layers with constant scale. &quot;</span></div><div class="line"><a name="l01628"></a><span class="lineno"> 1628</span>&#160;                        <span class="stringliteral">&quot;Input {}. Node {} {}&quot;</span>,</div><div class="line"><a name="l01629"></a><span class="lineno"> 1629</span>&#160;                        inputs[1].m_IndexedValue-&gt;GetNode().name(),</div><div class="line"><a name="l01630"></a><span class="lineno"> 1630</span>&#160;                        nodeDef.name(),</div><div class="line"><a name="l01631"></a><span class="lineno"> 1631</span>&#160;                        <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l01632"></a><span class="lineno"> 1632</span>&#160;    }</div><div class="line"><a name="l01633"></a><span class="lineno"> 1633</span>&#160;    ParsedConstTfOperation&lt;float&gt;* scaleNode =</div><div class="line"><a name="l01634"></a><span class="lineno"> 1634</span>&#160;        PolymorphicDowncast&lt;ParsedConstTfOperation&lt;float&gt; *&gt;(inputs[1].m_IndexedValue);</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="keywordflow">if</span> (!HasParsedConstTensor&lt;float&gt;(inputs[2].m_IndexedValue-&gt;GetNode().name()))</div><div class="line"><a name="l01637"></a><span class="lineno"> 1637</span>&#160;    {</div><div class="line"><a name="l01638"></a><span class="lineno"> 1638</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="l01639"></a><span class="lineno"> 1639</span>&#160;            fmt::format(<span class="stringliteral">&quot;ArmNN only supports FusedBatchNormalization layers with constant offset. &quot;</span></div><div class="line"><a name="l01640"></a><span class="lineno"> 1640</span>&#160;                        <span class="stringliteral">&quot;Input {}. Node {} {}&quot;</span>,</div><div class="line"><a name="l01641"></a><span class="lineno"> 1641</span>&#160;                        inputs[2].m_IndexedValue-&gt;GetNode().name(),</div><div class="line"><a name="l01642"></a><span class="lineno"> 1642</span>&#160;                        nodeDef.name(),</div><div class="line"><a name="l01643"></a><span class="lineno"> 1643</span>&#160;                        <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l01644"></a><span class="lineno"> 1644</span>&#160;    }</div><div class="line"><a name="l01645"></a><span class="lineno"> 1645</span>&#160;    ParsedConstTfOperation&lt;float&gt;* offsetNode =</div><div class="line"><a name="l01646"></a><span class="lineno"> 1646</span>&#160;        PolymorphicDowncast&lt;ParsedConstTfOperation&lt;float&gt; *&gt;(inputs[2].m_IndexedValue);</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="keywordflow">if</span> (!HasParsedConstTensor&lt;float&gt;(inputs[3].m_IndexedValue-&gt;GetNode().name()))</div><div class="line"><a name="l01649"></a><span class="lineno"> 1649</span>&#160;    {</div><div class="line"><a name="l01650"></a><span class="lineno"> 1650</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="l01651"></a><span class="lineno"> 1651</span>&#160;            fmt::format(<span class="stringliteral">&quot;ArmNN only supports FusedBatchNormalization layers with constant mean. &quot;</span></div><div class="line"><a name="l01652"></a><span class="lineno"> 1652</span>&#160;                        <span class="stringliteral">&quot;Input {}. Node {} {}&quot;</span>,</div><div class="line"><a name="l01653"></a><span class="lineno"> 1653</span>&#160;                        inputs[3].m_IndexedValue-&gt;GetNode().name(),</div><div class="line"><a name="l01654"></a><span class="lineno"> 1654</span>&#160;                        nodeDef.name(),</div><div class="line"><a name="l01655"></a><span class="lineno"> 1655</span>&#160;                        <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l01656"></a><span class="lineno"> 1656</span>&#160;    }</div><div class="line"><a name="l01657"></a><span class="lineno"> 1657</span>&#160;    ParsedConstTfOperation&lt;float&gt;* meanNode =</div><div class="line"><a name="l01658"></a><span class="lineno"> 1658</span>&#160;        PolymorphicDowncast&lt;ParsedConstTfOperation&lt;float&gt; *&gt;(inputs[3].m_IndexedValue);</div><div class="line"><a name="l01659"></a><span class="lineno"> 1659</span>&#160;</div><div class="line"><a name="l01660"></a><span class="lineno"> 1660</span>&#160;    <span class="keywordflow">if</span> (!HasParsedConstTensor&lt;float&gt;(inputs[4].m_IndexedValue-&gt;GetNode().name()))</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;        <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_parse_exception.xhtml">ParseException</a>(</div><div class="line"><a name="l01663"></a><span class="lineno"> 1663</span>&#160;            fmt::format(<span class="stringliteral">&quot;ArmNN only supports FusedBatchNormalization layers with constant variance. &quot;</span></div><div class="line"><a name="l01664"></a><span class="lineno"> 1664</span>&#160;                        <span class="stringliteral">&quot;Input {}. Node {} {}&quot;</span>,</div><div class="line"><a name="l01665"></a><span class="lineno"> 1665</span>&#160;                        inputs[4].m_IndexedValue-&gt;GetNode().name(),</div><div class="line"><a name="l01666"></a><span class="lineno"> 1666</span>&#160;                        nodeDef.name(),</div><div class="line"><a name="l01667"></a><span class="lineno"> 1667</span>&#160;                        <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</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;    ParsedConstTfOperation&lt;float&gt;* varianceNode =</div><div class="line"><a name="l01670"></a><span class="lineno"> 1670</span>&#160;        PolymorphicDowncast&lt;ParsedConstTfOperation&lt;float&gt; *&gt;(inputs[4].m_IndexedValue);</div><div class="line"><a name="l01671"></a><span class="lineno"> 1671</span>&#160;</div><div class="line"><a name="l01672"></a><span class="lineno"> 1672</span>&#160;    <span class="keyword">const</span> std::string dataFormat = ReadOptionalNodeStringAttribute(nodeDef, <span class="stringliteral">&quot;data_format&quot;</span>, <span class="stringliteral">&quot;NHWC&quot;</span>);</div><div class="line"><a name="l01673"></a><span class="lineno"> 1673</span>&#160;    <a class="code" href="_tf_parser_8cpp.xhtml#a3fb047570644cae325aa88d3cd7bb96e">CHECK_DATA_FORMAT</a>(nodeDef, dataFormat, <span class="stringliteral">&quot;FusedBatchNorm&quot;</span>);</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">// The descriptor only has the epsilon attribute.</span></div><div class="line"><a name="l01676"></a><span class="lineno"> 1676</span>&#160;    <a class="code" href="structarmnn_1_1_batch_normalization_descriptor.xhtml">BatchNormalizationDescriptor</a> desc;</div><div class="line"><a name="l01677"></a><span class="lineno"> 1677</span>&#160;    desc.<a class="code" href="structarmnn_1_1_batch_normalization_descriptor.xhtml#a11c821c7524251004a72ed13c510853c">m_Eps</a> = ReadMandatoryNodeFloatAttribute(nodeDef, <span class="stringliteral">&quot;epsilon&quot;</span>);</div><div class="line"><a name="l01678"></a><span class="lineno"> 1678</span>&#160;    desc.<a class="code" href="structarmnn_1_1_batch_normalization_descriptor.xhtml#a6089e1ca91914015777ea780a513131a">m_DataLayout</a> = dataFormat == <span class="stringliteral">&quot;NHWC&quot;</span> ? DataLayout::NHWC : DataLayout::NCHW;</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="comment">// Data for the parsed tensor args (scale, offset, mean, variance) must be stored</span></div><div class="line"><a name="l01681"></a><span class="lineno"> 1681</span>&#160;    <span class="comment">// locally until the layer is added.</span></div><div class="line"><a name="l01682"></a><span class="lineno"> 1682</span>&#160;    std::vector&lt;float&gt; scaleTensorData;</div><div class="line"><a name="l01683"></a><span class="lineno"> 1683</span>&#160;    <a class="code" href="classarmnn_1_1_const_tensor.xhtml">ConstTensor</a> scaleTensor = scaleNode-&gt;GetConstTensor(scaleTensorData);</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;    std::vector&lt;float&gt; offsetTensorData;</div><div class="line"><a name="l01686"></a><span class="lineno"> 1686</span>&#160;    <a class="code" href="classarmnn_1_1_const_tensor.xhtml">ConstTensor</a> offsetTensor = offsetNode-&gt;GetConstTensor(offsetTensorData);</div><div class="line"><a name="l01687"></a><span class="lineno"> 1687</span>&#160;</div><div class="line"><a name="l01688"></a><span class="lineno"> 1688</span>&#160;    std::vector&lt;float&gt; meanTensorData;</div><div class="line"><a name="l01689"></a><span class="lineno"> 1689</span>&#160;    <a class="code" href="classarmnn_1_1_const_tensor.xhtml">ConstTensor</a> meanTensor = meanNode-&gt;GetConstTensor(meanTensorData);</div><div class="line"><a name="l01690"></a><span class="lineno"> 1690</span>&#160;</div><div class="line"><a name="l01691"></a><span class="lineno"> 1691</span>&#160;    std::vector&lt;float&gt; varianceTensorData;</div><div class="line"><a name="l01692"></a><span class="lineno"> 1692</span>&#160;    <a class="code" href="classarmnn_1_1_const_tensor.xhtml">ConstTensor</a> varianceTensor = varianceNode-&gt;GetConstTensor(varianceTensorData);</div><div class="line"><a name="l01693"></a><span class="lineno"> 1693</span>&#160;</div><div class="line"><a name="l01694"></a><span class="lineno"> 1694</span>&#160;    <a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml">IConnectableLayer</a>* layer = <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a2db3ae8d422f17d455e0ba0cb6291d2a">m_Network</a>-&gt;AddBatchNormalizationLayer(desc,</div><div class="line"><a name="l01695"></a><span class="lineno"> 1695</span>&#160;                                                                     meanTensor,</div><div class="line"><a name="l01696"></a><span class="lineno"> 1696</span>&#160;                                                                     varianceTensor,</div><div class="line"><a name="l01697"></a><span class="lineno"> 1697</span>&#160;                                                                     offsetTensor,</div><div class="line"><a name="l01698"></a><span class="lineno"> 1698</span>&#160;                                                                     scaleTensor,</div><div class="line"><a name="l01699"></a><span class="lineno"> 1699</span>&#160;                                                                     nodeDef.name().c_str());</div><div class="line"><a name="l01700"></a><span class="lineno"> 1700</span>&#160;</div><div class="line"><a name="l01701"></a><span class="lineno"> 1701</span>&#160;    <a class="code" href="classarmnn_1_1_i_output_slot.xhtml">IOutputSlot</a>&amp; inputSlot = inputs[0].m_IndexedValue-&gt;ResolveArmnnOutputSlot(inputs[0].m_Index);</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;    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>(inputSlot.<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#a9943775a364fc4ab53b85ac88f311886">GetTensorInfo</a>());</div><div class="line"><a name="l01704"></a><span class="lineno"> 1704</span>&#160;    inputSlot.<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#ac1835f8756a9f03c02fcf9664e3a0fce">Connect</a>(layer-&gt;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml#a6ec9e0eb66d7d6a01240492a0b18104c">GetInputSlot</a>(0));</div><div class="line"><a name="l01705"></a><span class="lineno"> 1705</span>&#160;</div><div class="line"><a name="l01706"></a><span class="lineno"> 1706</span>&#160;    <span class="keywordflow">return</span> std::make_unique&lt;SingleLayerParsedTfOperation&gt;(<span class="keyword">this</span>, nodeDef, layer);</div><div class="line"><a name="l01707"></a><span class="lineno"> 1707</span>&#160;}</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"><a class="line" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a3296cce0af78204d897a746643987f07"> 1709</a></span>&#160;<span class="keywordtype">bool</span> <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a3296cce0af78204d897a746643987f07">ITfParser::TfParserImpl::IsSupportedLeakyReluPattern</a>(<span class="keyword">const</span> tensorflow::NodeDef&amp; mulNodeDef,</div><div class="line"><a name="l01710"></a><span class="lineno"> 1710</span>&#160;                                                         <span class="keywordtype">size_t</span> alphaLayerIndex,</div><div class="line"><a name="l01711"></a><span class="lineno"> 1711</span>&#160;                                                         <span class="keyword">const</span> <a class="code" href="structarmnn_tf_parser_1_1_with_output_tensor_index.xhtml">OutputOfParsedTfOperation</a>&amp; otherOp,</div><div class="line"><a name="l01712"></a><span class="lineno"> 1712</span>&#160;                                                         <a class="code" href="classarmnn_1_1_i_output_slot.xhtml">armnn::IOutputSlot</a>** outputOfLeakyRelu,</div><div class="line"><a name="l01713"></a><span class="lineno"> 1713</span>&#160;                                                         <a class="code" href="structarmnn_1_1_activation_descriptor.xhtml">armnn::ActivationDescriptor</a> &amp; desc)</div><div class="line"><a name="l01714"></a><span class="lineno"> 1714</span>&#160;{</div><div class="line"><a name="l01715"></a><span class="lineno"> 1715</span>&#160;    <span class="keyword">const</span> tensorflow::NodeDef&amp; otherNodeDef = otherOp.<a class="code" href="structarmnn_tf_parser_1_1_with_output_tensor_index.xhtml#a08f2876bc5d60ed9c711ac7c26747305">m_IndexedValue</a>-&gt;GetNode();</div><div class="line"><a name="l01716"></a><span class="lineno"> 1716</span>&#160;</div><div class="line"><a name="l01717"></a><span class="lineno"> 1717</span>&#160;    <span class="comment">// Verifying all these assumptions hold:</span></div><div class="line"><a name="l01718"></a><span class="lineno"> 1718</span>&#160;    <span class="comment">//</span></div><div class="line"><a name="l01719"></a><span class="lineno"> 1719</span>&#160;    <span class="comment">// 1, the mulNodeDef is an elementwise multiplication node &quot;Mul&quot;</span></div><div class="line"><a name="l01720"></a><span class="lineno"> 1720</span>&#160;    <span class="comment">// 2, the alphaLayerIndex selects a constant node from the inputs of the &quot;Mul&quot; node</span></div><div class="line"><a name="l01721"></a><span class="lineno"> 1721</span>&#160;    <span class="comment">// 3, the inputLayerIndex selects a layer which has the same name as otherNodeDef</span></div><div class="line"><a name="l01722"></a><span class="lineno"> 1722</span>&#160;    <span class="comment">//</span></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;    <span class="keywordflow">if</span> (mulNodeDef.op() == <span class="stringliteral">&quot;Mul&quot;</span>)</div><div class="line"><a name="l01725"></a><span class="lineno"> 1725</span>&#160;    {</div><div class="line"><a name="l01726"></a><span class="lineno"> 1726</span>&#160;        <span class="keywordtype">size_t</span> otherLayerIndex = (alphaLayerIndex == 0 ? 1 : 0);</div><div class="line"><a name="l01727"></a><span class="lineno"> 1727</span>&#160;        std::vector&lt;OutputOfParsedTfOperation&gt; inputs = <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#ae295ca8b7d19bb5e6db3f93bd4561ee0">GetInputParsedTfOperationsChecked</a>(mulNodeDef, 2);</div><div class="line"><a name="l01728"></a><span class="lineno"> 1728</span>&#160;</div><div class="line"><a name="l01729"></a><span class="lineno"> 1729</span>&#160;        <a class="code" href="_assert_8hpp.xhtml#a5698be69cbd5dfe6c28fcd9867e8cbed">ARMNN_ASSERT</a>(inputs.size() == 2);</div><div class="line"><a name="l01730"></a><span class="lineno"> 1730</span>&#160;        <a class="code" href="_assert_8hpp.xhtml#a5698be69cbd5dfe6c28fcd9867e8cbed">ARMNN_ASSERT</a>((otherLayerIndex == 0 || alphaLayerIndex == 0));</div><div class="line"><a name="l01731"></a><span class="lineno"> 1731</span>&#160;        <a class="code" href="_assert_8hpp.xhtml#a5698be69cbd5dfe6c28fcd9867e8cbed">ARMNN_ASSERT</a>((otherLayerIndex == 1 || alphaLayerIndex == 1));</div><div class="line"><a name="l01732"></a><span class="lineno"> 1732</span>&#160;        <a class="code" href="_assert_8hpp.xhtml#a5698be69cbd5dfe6c28fcd9867e8cbed">ARMNN_ASSERT</a>(((otherLayerIndex + alphaLayerIndex) == 1));</div><div class="line"><a name="l01733"></a><span class="lineno"> 1733</span>&#160;</div><div class="line"><a name="l01734"></a><span class="lineno"> 1734</span>&#160;        <span class="keywordflow">if</span> (inputs[otherLayerIndex].m_IndexedValue-&gt;GetNode().name() == otherNodeDef.name())</div><div class="line"><a name="l01735"></a><span class="lineno"> 1735</span>&#160;        {</div><div class="line"><a name="l01736"></a><span class="lineno"> 1736</span>&#160;            <span class="keywordflow">if</span> (HasParsedConstTensor&lt;float&gt;(inputs[alphaLayerIndex].m_IndexedValue-&gt;GetNode().name()))</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;                ParsedConstTfOperation&lt;float&gt;* alpha =</div><div class="line"><a name="l01739"></a><span class="lineno"> 1739</span>&#160;                    PolymorphicDowncast&lt;ParsedConstTfOperation&lt;float&gt; *&gt;(</div><div class="line"><a name="l01740"></a><span class="lineno"> 1740</span>&#160;                        inputs[alphaLayerIndex].m_IndexedValue);</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;                std::vector&lt;float&gt; const_data;</div><div class="line"><a name="l01743"></a><span class="lineno"> 1743</span>&#160;                <a class="code" href="classarmnn_1_1_const_tensor.xhtml">ConstTensor</a> const_tensor = alpha-&gt;GetConstTensor(const_data);</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;                <span class="keywordflow">if</span> (const_data.size() == 1)</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;                    desc.<a class="code" href="structarmnn_1_1_activation_descriptor.xhtml#af10fa7883e3579950f477bee92a64844">m_Function</a> = ActivationFunction::LeakyReLu;</div><div class="line"><a name="l01748"></a><span class="lineno"> 1748</span>&#160;                    desc.<a class="code" href="structarmnn_1_1_activation_descriptor.xhtml#a017b2990003a014234f13e999dc7c689">m_A</a> = const_data[0];</div><div class="line"><a name="l01749"></a><span class="lineno"> 1749</span>&#160;</div><div class="line"><a name="l01750"></a><span class="lineno"> 1750</span>&#160;                    *outputOfLeakyRelu = &amp;(otherOp.<a class="code" href="structarmnn_tf_parser_1_1_with_output_tensor_index.xhtml#a08f2876bc5d60ed9c711ac7c26747305">m_IndexedValue</a>-&gt;ResolveArmnnOutputSlot(otherOp.<a class="code" href="structarmnn_tf_parser_1_1_with_output_tensor_index.xhtml#a271b1a398c11fb4bf8603119041562c9">m_Index</a>));</div><div class="line"><a name="l01751"></a><span class="lineno"> 1751</span>&#160;                    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l01752"></a><span class="lineno"> 1752</span>&#160;                }</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;        }</div><div class="line"><a name="l01755"></a><span class="lineno"> 1755</span>&#160;    }</div><div class="line"><a name="l01756"></a><span class="lineno"> 1756</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l01757"></a><span class="lineno"> 1757</span>&#160;}</div><div class="line"><a name="l01758"></a><span class="lineno"> 1758</span>&#160;</div><div class="line"><a name="l01759"></a><span class="lineno"><a class="line" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#acb94c45784c439b75dcf858655a6d330"> 1759</a></span>&#160;<a class="code" href="namespacearmnn_tf_parser.xhtml#aa36bf288c19fe35767bb6e059636f405">ParsedTfOperationPtr</a> <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#acb94c45784c439b75dcf858655a6d330">ITfParser::TfParserImpl::ParseMaximum</a>(<span class="keyword">const</span> tensorflow::NodeDef&amp; nodeDef,</div><div class="line"><a name="l01760"></a><span class="lineno"> 1760</span>&#160;                                                          <span class="keyword">const</span> tensorflow::GraphDef&amp; graphDef)</div><div class="line"><a name="l01761"></a><span class="lineno"> 1761</span>&#160;{</div><div class="line"><a name="l01762"></a><span class="lineno"> 1762</span>&#160;    <a class="code" href="namespacearmnn.xhtml#a44affeeb090c3c6a3062830562672e84">IgnoreUnused</a>(graphDef);</div><div class="line"><a name="l01763"></a><span class="lineno"> 1763</span>&#160;    std::vector&lt;OutputOfParsedTfOperation&gt; inputs = <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#ae295ca8b7d19bb5e6db3f93bd4561ee0">GetInputParsedTfOperationsChecked</a>(nodeDef, 2);</div><div class="line"><a name="l01764"></a><span class="lineno"> 1764</span>&#160;    <span class="keywordflow">if</span> (inputs.size() != 2)</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="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_parse_exception.xhtml">ParseException</a>(</div><div class="line"><a name="l01767"></a><span class="lineno"> 1767</span>&#160;            fmt::format(<span class="stringliteral">&quot;Maximum expects two inputs!. Got {} for Node {} {}&quot;</span>,</div><div class="line"><a name="l01768"></a><span class="lineno"> 1768</span>&#160;                        inputs.size(),</div><div class="line"><a name="l01769"></a><span class="lineno"> 1769</span>&#160;                        nodeDef.name(),</div><div class="line"><a name="l01770"></a><span class="lineno"> 1770</span>&#160;                        <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l01771"></a><span class="lineno"> 1771</span>&#160;    }</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;    <span class="keyword">auto</span> inputNode0 = inputs[0].m_IndexedValue-&gt;GetNode();</div><div class="line"><a name="l01774"></a><span class="lineno"> 1774</span>&#160;    <span class="keyword">auto</span> inputNode1 = inputs[1].m_IndexedValue-&gt;GetNode();</div><div class="line"><a name="l01775"></a><span class="lineno"> 1775</span>&#160;    <a class="code" href="classarmnn_1_1_i_output_slot.xhtml">IOutputSlot</a>* outputOfLeakyRelu = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l01776"></a><span class="lineno"> 1776</span>&#160;</div><div class="line"><a name="l01777"></a><span class="lineno"> 1777</span>&#160;    <a class="code" href="structarmnn_1_1_activation_descriptor.xhtml">ActivationDescriptor</a> desc;</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="comment">// A max node may be part of a LeakyRelu, with one input as a multiplication with a scalar constant,</span></div><div class="line"><a name="l01780"></a><span class="lineno"> 1780</span>&#160;    <span class="comment">// i.e. one of the four possible scenarios:</span></div><div class="line"><a name="l01781"></a><span class="lineno"> 1781</span>&#160;    <span class="comment">//  1, max(mul(a, x), x)</span></div><div class="line"><a name="l01782"></a><span class="lineno"> 1782</span>&#160;    <span class="comment">//  2, max(mul(x, a), x)</span></div><div class="line"><a name="l01783"></a><span class="lineno"> 1783</span>&#160;    <span class="comment">//  3, max(x, mul(a, x))</span></div><div class="line"><a name="l01784"></a><span class="lineno"> 1784</span>&#160;    <span class="comment">//  4, max(x, mul(x, a))</span></div><div class="line"><a name="l01785"></a><span class="lineno"> 1785</span>&#160;    <span class="comment">// These are handled by an activation layer.</span></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;    <span class="keywordflow">if</span> (<a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a3296cce0af78204d897a746643987f07">IsSupportedLeakyReluPattern</a>(inputNode0, 0, inputs[1], &amp;outputOfLeakyRelu, desc) ||</div><div class="line"><a name="l01788"></a><span class="lineno"> 1788</span>&#160;        <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a3296cce0af78204d897a746643987f07">IsSupportedLeakyReluPattern</a>(inputNode0, 1, inputs[1], &amp;outputOfLeakyRelu, desc) ||</div><div class="line"><a name="l01789"></a><span class="lineno"> 1789</span>&#160;        <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a3296cce0af78204d897a746643987f07">IsSupportedLeakyReluPattern</a>(inputNode1, 0, inputs[0], &amp;outputOfLeakyRelu, desc) ||</div><div class="line"><a name="l01790"></a><span class="lineno"> 1790</span>&#160;        <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a3296cce0af78204d897a746643987f07">IsSupportedLeakyReluPattern</a>(inputNode1, 1, inputs[0], &amp;outputOfLeakyRelu, desc))</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;        <a class="code" href="_assert_8hpp.xhtml#a5698be69cbd5dfe6c28fcd9867e8cbed">ARMNN_ASSERT</a>(outputOfLeakyRelu != <span class="keyword">nullptr</span>);</div><div class="line"><a name="l01793"></a><span class="lineno"> 1793</span>&#160;</div><div class="line"><a name="l01794"></a><span class="lineno"> 1794</span>&#160;        <a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml">IConnectableLayer</a>* <span class="keyword">const</span> layer = <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a2db3ae8d422f17d455e0ba0cb6291d2a">m_Network</a>-&gt;AddActivationLayer(desc, nodeDef.name().c_str());</div><div class="line"><a name="l01795"></a><span class="lineno"> 1795</span>&#160;        outputOfLeakyRelu-&gt;<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#ac1835f8756a9f03c02fcf9664e3a0fce">Connect</a>(layer-&gt;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml#a6ec9e0eb66d7d6a01240492a0b18104c">GetInputSlot</a>(0));</div><div class="line"><a name="l01796"></a><span class="lineno"> 1796</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>(outputOfLeakyRelu-&gt;<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#a9943775a364fc4ab53b85ac88f311886">GetTensorInfo</a>());</div><div class="line"><a name="l01797"></a><span class="lineno"> 1797</span>&#160;        <span class="keywordflow">return</span> std::make_unique&lt;SingleLayerParsedTfOperation&gt;(<span class="keyword">this</span>, nodeDef, layer);</div><div class="line"><a name="l01798"></a><span class="lineno"> 1798</span>&#160;    }</div><div class="line"><a name="l01799"></a><span class="lineno"> 1799</span>&#160;    <span class="keywordflow">else</span></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;        <span class="comment">// Anything else is just a maximum layer.</span></div><div class="line"><a name="l01802"></a><span class="lineno"> 1802</span>&#160;</div><div class="line"><a name="l01803"></a><span class="lineno"> 1803</span>&#160;        <span class="keywordflow">return</span> <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#ae3a610533ecb2a9a87fb47785f7fb712">AddMaximumLayer</a>(nodeDef);</div><div class="line"><a name="l01804"></a><span class="lineno"> 1804</span>&#160;    }</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;</div><div class="line"><a name="l01807"></a><span class="lineno"><a class="line" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a0562881f75a2083315f1a1660686812b"> 1807</a></span>&#160;std::pair&lt;armnn::IOutputSlot*, armnn::IOutputSlot*&gt; <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a0562881f75a2083315f1a1660686812b">ITfParser::TfParserImpl::ProcessElementwiseInputSlots</a>(</div><div class="line"><a name="l01808"></a><span class="lineno"> 1808</span>&#160;            <span class="keyword">const</span> tensorflow::NodeDef&amp; nodeDef, <span class="keyword">const</span> std::string&amp; layerName)</div><div class="line"><a name="l01809"></a><span class="lineno"> 1809</span>&#160;{</div><div class="line"><a name="l01810"></a><span class="lineno"> 1810</span>&#160;    std::vector&lt;OutputOfParsedTfOperation&gt; inputs = <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#ae295ca8b7d19bb5e6db3f93bd4561ee0">GetInputParsedTfOperationsChecked</a>(nodeDef, 2);</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;    <a class="code" href="classarmnn_1_1_i_output_slot.xhtml">IOutputSlot</a>* input0Slot = &amp;inputs[0].m_IndexedValue-&gt;ResolveArmnnOutputSlot(inputs[0].m_Index);</div><div class="line"><a name="l01813"></a><span class="lineno"> 1813</span>&#160;    <a class="code" href="classarmnn_1_1_i_output_slot.xhtml">IOutputSlot</a>* input1Slot = &amp;inputs[1].m_IndexedValue-&gt;ResolveArmnnOutputSlot(inputs[1].m_Index);</div><div class="line"><a name="l01814"></a><span class="lineno"> 1814</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> input0Dim = input0Slot-&gt;<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#a9943775a364fc4ab53b85ac88f311886">GetTensorInfo</a>().<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a157e27d41e9f6b21f0d3c025fa47dc24">GetNumDimensions</a>();</div><div class="line"><a name="l01815"></a><span class="lineno"> 1815</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> input1Dim = input1Slot-&gt;<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#a9943775a364fc4ab53b85ac88f311886">GetTensorInfo</a>().<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a157e27d41e9f6b21f0d3c025fa47dc24">GetNumDimensions</a>();</div><div class="line"><a name="l01816"></a><span class="lineno"> 1816</span>&#160;</div><div class="line"><a name="l01817"></a><span class="lineno"> 1817</span>&#160;    <span class="keywordflow">if</span> (input0Dim != input1Dim)</div><div class="line"><a name="l01818"></a><span class="lineno"> 1818</span>&#160;    {</div><div class="line"><a name="l01819"></a><span class="lineno"> 1819</span>&#160;        <span class="comment">// broadcasting where input0 and input1 have different number of dimensions</span></div><div class="line"><a name="l01820"></a><span class="lineno"> 1820</span>&#160;        <span class="comment">// is only supported for 1D and 4D tensors pair</span></div><div class="line"><a name="l01821"></a><span class="lineno"> 1821</span>&#160;        <span class="keywordflow">if</span> (input0Dim == 1 &amp;&amp; input1Dim == 4)</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;            input0Slot = <a class="code" href="namespacearmnn_1_1optimizations.xhtml#a4fc55afb4885278ad1510b2c4307af76">AddBroadcastReshapeLayer</a>(input1Slot, input0Slot, <span class="keyword">true</span>, *<a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a2db3ae8d422f17d455e0ba0cb6291d2a">m_Network</a>, nodeDef);</div><div class="line"><a name="l01824"></a><span class="lineno"> 1824</span>&#160;        }</div><div class="line"><a name="l01825"></a><span class="lineno"> 1825</span>&#160;        <span class="keywordflow">else</span> <span class="keywordflow">if</span> (input0Dim == 4 &amp;&amp; input1Dim == 1)</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;            input1Slot = <a class="code" href="namespacearmnn_1_1optimizations.xhtml#a4fc55afb4885278ad1510b2c4307af76">AddBroadcastReshapeLayer</a>(input0Slot, input1Slot, <span class="keyword">true</span>, *<a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a2db3ae8d422f17d455e0ba0cb6291d2a">m_Network</a>, nodeDef);</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">else</span></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="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_parse_exception.xhtml">ParseException</a>(</div><div class="line"><a name="l01832"></a><span class="lineno"> 1832</span>&#160;                    fmt::format(<span class="stringliteral">&quot;Unsupported broadcast configuration for {} operation {} {}&quot;</span>,</div><div class="line"><a name="l01833"></a><span class="lineno"> 1833</span>&#160;                                layerName,</div><div class="line"><a name="l01834"></a><span class="lineno"> 1834</span>&#160;                                nodeDef.name(),</div><div class="line"><a name="l01835"></a><span class="lineno"> 1835</span>&#160;                                <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</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;    }</div><div class="line"><a name="l01838"></a><span class="lineno"> 1838</span>&#160;    <span class="keywordflow">return</span> {input0Slot, input1Slot};</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"> 1840</span>&#160;</div><div class="line"><a name="l01841"></a><span class="lineno"><a class="line" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a4ceb262ac0351dcf1aa9f7e1dc298489"> 1841</a></span>&#160;<a class="code" href="namespacearmnn_tf_parser.xhtml#aa36bf288c19fe35767bb6e059636f405">ParsedTfOperationPtr</a> <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a4ceb262ac0351dcf1aa9f7e1dc298489">ITfParser::TfParserImpl::ProcessComparisonLayer</a>(</div><div class="line"><a name="l01842"></a><span class="lineno"> 1842</span>&#160;    <a class="code" href="classarmnn_1_1_i_output_slot.xhtml">IOutputSlot</a>* input0Slot,</div><div class="line"><a name="l01843"></a><span class="lineno"> 1843</span>&#160;    <a class="code" href="classarmnn_1_1_i_output_slot.xhtml">IOutputSlot</a>* input1Slot,</div><div class="line"><a name="l01844"></a><span class="lineno"> 1844</span>&#160;    <a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml">IConnectableLayer</a>* <span class="keyword">const</span> layer,</div><div class="line"><a name="l01845"></a><span class="lineno"> 1845</span>&#160;    <span class="keyword">const</span> tensorflow::NodeDef&amp; nodeDef)</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;    input0Slot-&gt;<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#ac1835f8756a9f03c02fcf9664e3a0fce">Connect</a>(layer-&gt;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml#a6ec9e0eb66d7d6a01240492a0b18104c">GetInputSlot</a>(0));</div><div class="line"><a name="l01848"></a><span class="lineno"> 1848</span>&#160;    input1Slot-&gt;<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#ac1835f8756a9f03c02fcf9664e3a0fce">Connect</a>(layer-&gt;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml#a6ec9e0eb66d7d6a01240492a0b18104c">GetInputSlot</a>(1));</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;    <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> outputInfo = input0Slot-&gt;<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#a9943775a364fc4ab53b85ac88f311886">GetTensorInfo</a>();</div><div class="line"><a name="l01851"></a><span class="lineno"> 1851</span>&#160;    outputInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a71975fcec1464d639f1a78f73164d1bd">SetDataType</a>(DataType::Boolean);</div><div class="line"><a name="l01852"></a><span class="lineno"> 1852</span>&#160;    std::vector&lt;unsigned int&gt; outputShape;</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;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_shape.xhtml">TensorShape</a>&amp; input0Shape = input0Slot-&gt;<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#a9943775a364fc4ab53b85ac88f311886">GetTensorInfo</a>().<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a8b5d0f8a24e9d9238f412260a552acf8">GetShape</a>();</div><div class="line"><a name="l01855"></a><span class="lineno"> 1855</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_shape.xhtml">TensorShape</a>&amp; input1Shape = input1Slot-&gt;<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#a9943775a364fc4ab53b85ac88f311886">GetTensorInfo</a>().<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a8b5d0f8a24e9d9238f412260a552acf8">GetShape</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">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i = 0; i &lt; input0Shape.<a class="code" href="classarmnn_1_1_tensor_shape.xhtml#a157e27d41e9f6b21f0d3c025fa47dc24">GetNumDimensions</a>(); i++)</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;        outputShape.push_back(std::max(input0Shape[i], input1Shape[i]));</div><div class="line"><a name="l01860"></a><span class="lineno"> 1860</span>&#160;    }</div><div class="line"><a name="l01861"></a><span class="lineno"> 1861</span>&#160;</div><div class="line"><a name="l01862"></a><span class="lineno"> 1862</span>&#160;    outputInfo.<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>(input0Shape.<a class="code" href="classarmnn_1_1_tensor_shape.xhtml#a157e27d41e9f6b21f0d3c025fa47dc24">GetNumDimensions</a>(), outputShape.data()));</div><div class="line"><a name="l01863"></a><span class="lineno"> 1863</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);</div><div class="line"><a name="l01864"></a><span class="lineno"> 1864</span>&#160;</div><div class="line"><a name="l01865"></a><span class="lineno"> 1865</span>&#160;    <span class="keywordflow">return</span> std::make_unique&lt;SingleLayerParsedTfOperation&gt;(<span class="keyword">this</span>, nodeDef, layer);</div><div class="line"><a name="l01866"></a><span class="lineno"> 1866</span>&#160;}</div><div class="line"><a name="l01867"></a><span class="lineno"> 1867</span>&#160;</div><div class="line"><a name="l01868"></a><span class="lineno"><a class="line" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a0d5cf4cdeeb79d5e4fed01981d734b50"> 1868</a></span>&#160;<a class="code" href="namespacearmnn_tf_parser.xhtml#aa36bf288c19fe35767bb6e059636f405">ParsedTfOperationPtr</a> <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a0d5cf4cdeeb79d5e4fed01981d734b50">ITfParser::TfParserImpl::ProcessElementwiseLayer</a>(</div><div class="line"><a name="l01869"></a><span class="lineno"> 1869</span>&#160;        <a class="code" href="classarmnn_1_1_i_output_slot.xhtml">IOutputSlot</a>* input0Slot,</div><div class="line"><a name="l01870"></a><span class="lineno"> 1870</span>&#160;        <a class="code" href="classarmnn_1_1_i_output_slot.xhtml">IOutputSlot</a>* input1Slot,</div><div class="line"><a name="l01871"></a><span class="lineno"> 1871</span>&#160;        <a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml">IConnectableLayer</a>* <span class="keyword">const</span> layer,</div><div class="line"><a name="l01872"></a><span class="lineno"> 1872</span>&#160;        <span class="keyword">const</span> tensorflow::NodeDef&amp; nodeDef)</div><div class="line"><a name="l01873"></a><span class="lineno"> 1873</span>&#160;{</div><div class="line"><a name="l01874"></a><span class="lineno"> 1874</span>&#160;    input0Slot-&gt;<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#ac1835f8756a9f03c02fcf9664e3a0fce">Connect</a>(layer-&gt;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml#a6ec9e0eb66d7d6a01240492a0b18104c">GetInputSlot</a>(0));</div><div class="line"><a name="l01875"></a><span class="lineno"> 1875</span>&#160;    input1Slot-&gt;<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#ac1835f8756a9f03c02fcf9664e3a0fce">Connect</a>(layer-&gt;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml#a6ec9e0eb66d7d6a01240492a0b18104c">GetInputSlot</a>(1));</div><div class="line"><a name="l01876"></a><span class="lineno"> 1876</span>&#160;</div><div class="line"><a name="l01877"></a><span class="lineno"> 1877</span>&#160;    <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> outputInfo = input0Slot-&gt;<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#a9943775a364fc4ab53b85ac88f311886">GetTensorInfo</a>();</div><div class="line"><a name="l01878"></a><span class="lineno"> 1878</span>&#160;    std::vector&lt;unsigned int&gt; outputShape;</div><div class="line"><a name="l01879"></a><span class="lineno"> 1879</span>&#160;</div><div class="line"><a name="l01880"></a><span class="lineno"> 1880</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_shape.xhtml">TensorShape</a>&amp; input0Shape = input0Slot-&gt;<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#a9943775a364fc4ab53b85ac88f311886">GetTensorInfo</a>().<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a8b5d0f8a24e9d9238f412260a552acf8">GetShape</a>();</div><div class="line"><a name="l01881"></a><span class="lineno"> 1881</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_shape.xhtml">TensorShape</a>&amp; input1Shape = input1Slot-&gt;<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#a9943775a364fc4ab53b85ac88f311886">GetTensorInfo</a>().<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a8b5d0f8a24e9d9238f412260a552acf8">GetShape</a>();</div><div class="line"><a name="l01882"></a><span class="lineno"> 1882</span>&#160;</div><div class="line"><a name="l01883"></a><span class="lineno"> 1883</span>&#160;    <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i = 0; i &lt; input0Shape.<a class="code" href="classarmnn_1_1_tensor_shape.xhtml#a157e27d41e9f6b21f0d3c025fa47dc24">GetNumDimensions</a>(); i++)</div><div class="line"><a name="l01884"></a><span class="lineno"> 1884</span>&#160;    {</div><div class="line"><a name="l01885"></a><span class="lineno"> 1885</span>&#160;        outputShape.push_back(std::max(input0Shape[i], input1Shape[i]));</div><div class="line"><a name="l01886"></a><span class="lineno"> 1886</span>&#160;    }</div><div class="line"><a name="l01887"></a><span class="lineno"> 1887</span>&#160;</div><div class="line"><a name="l01888"></a><span class="lineno"> 1888</span>&#160;    outputInfo.<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>(input0Shape.<a class="code" href="classarmnn_1_1_tensor_shape.xhtml#a157e27d41e9f6b21f0d3c025fa47dc24">GetNumDimensions</a>(), outputShape.data()));</div><div class="line"><a name="l01889"></a><span class="lineno"> 1889</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);</div><div class="line"><a name="l01890"></a><span class="lineno"> 1890</span>&#160;</div><div class="line"><a name="l01891"></a><span class="lineno"> 1891</span>&#160;    <span class="keywordflow">return</span> std::make_unique&lt;SingleLayerParsedTfOperation&gt;(<span class="keyword">this</span>, nodeDef, layer);</div><div class="line"><a name="l01892"></a><span class="lineno"> 1892</span>&#160;}</div><div class="line"><a name="l01893"></a><span class="lineno"> 1893</span>&#160;</div><div class="line"><a name="l01894"></a><span class="lineno"><a class="line" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a9ffcd919d2466d7aa5d2325ee77c322d"> 1894</a></span>&#160;<a class="code" href="namespacearmnn_tf_parser.xhtml#aa36bf288c19fe35767bb6e059636f405">ParsedTfOperationPtr</a> <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a9ffcd919d2466d7aa5d2325ee77c322d">ITfParser::TfParserImpl::ParseGather</a>(<span class="keyword">const</span> tensorflow::NodeDef&amp; nodeDef,</div><div class="line"><a name="l01895"></a><span class="lineno"> 1895</span>&#160;                                                         <span class="keyword">const</span> tensorflow::GraphDef&amp; graphDef)</div><div class="line"><a name="l01896"></a><span class="lineno"> 1896</span>&#160;{</div><div class="line"><a name="l01897"></a><span class="lineno"> 1897</span>&#160;    <a class="code" href="namespacearmnn.xhtml#a44affeeb090c3c6a3062830562672e84">IgnoreUnused</a>(graphDef);</div><div class="line"><a name="l01898"></a><span class="lineno"> 1898</span>&#160;    std::vector&lt;OutputOfParsedTfOperation&gt; inputs = <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#ae295ca8b7d19bb5e6db3f93bd4561ee0">GetInputParsedTfOperationsChecked</a>(nodeDef, 2);</div><div class="line"><a name="l01899"></a><span class="lineno"> 1899</span>&#160;    <a class="code" href="classarmnn_1_1_i_output_slot.xhtml">IOutputSlot</a>&amp; params = inputs[0].m_IndexedValue-&gt;ResolveArmnnOutputSlot(inputs[0].m_Index);</div><div class="line"><a name="l01900"></a><span class="lineno"> 1900</span>&#160;    <a class="code" href="classarmnn_1_1_i_output_slot.xhtml">IOutputSlot</a>&amp; indices = inputs[1].m_IndexedValue-&gt;ResolveArmnnOutputSlot(inputs[1].m_Index);</div><div class="line"><a name="l01901"></a><span class="lineno"> 1901</span>&#160;    <a class="code" href="structarmnn_1_1_gather_descriptor.xhtml">GatherDescriptor</a> descriptor;</div><div class="line"><a name="l01902"></a><span class="lineno"> 1902</span>&#160;    descriptor.<a class="code" href="structarmnn_1_1_gather_descriptor.xhtml#a35d11c7d509d1adbae1ae01c58394a7f">m_Axis</a> = ReadMandatoryNodeInt32Attribute(nodeDef, <span class="stringliteral">&quot;axis&quot;</span>);</div><div class="line"><a name="l01903"></a><span class="lineno"> 1903</span>&#160;</div><div class="line"><a name="l01904"></a><span class="lineno"> 1904</span>&#160;    <span class="comment">// Infer shape of output tensor</span></div><div class="line"><a name="l01905"></a><span class="lineno"> 1905</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> paramsDim = params.<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#a9943775a364fc4ab53b85ac88f311886">GetTensorInfo</a>().<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a157e27d41e9f6b21f0d3c025fa47dc24">GetNumDimensions</a>();</div><div class="line"><a name="l01906"></a><span class="lineno"> 1906</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> indicesDim = indices.<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#a9943775a364fc4ab53b85ac88f311886">GetTensorInfo</a>().<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a157e27d41e9f6b21f0d3c025fa47dc24">GetNumDimensions</a>();</div><div class="line"><a name="l01907"></a><span class="lineno"> 1907</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> outputDim = paramsDim - 1 + indicesDim;</div><div class="line"><a name="l01908"></a><span class="lineno"> 1908</span>&#160;</div><div class="line"><a name="l01909"></a><span class="lineno"> 1909</span>&#160;    std::vector&lt;unsigned int&gt; dimSizes;</div><div class="line"><a name="l01910"></a><span class="lineno"> 1910</span>&#160;</div><div class="line"><a name="l01911"></a><span class="lineno"> 1911</span>&#160;    <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i = 0; i &lt; indicesDim; ++i)</div><div class="line"><a name="l01912"></a><span class="lineno"> 1912</span>&#160;    {</div><div class="line"><a name="l01913"></a><span class="lineno"> 1913</span>&#160;        dimSizes.push_back(indices.<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#a9943775a364fc4ab53b85ac88f311886">GetTensorInfo</a>().<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a8b5d0f8a24e9d9238f412260a552acf8">GetShape</a>()[i]);</div><div class="line"><a name="l01914"></a><span class="lineno"> 1914</span>&#160;    }</div><div class="line"><a name="l01915"></a><span class="lineno"> 1915</span>&#160;    <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i = 1; i &lt; paramsDim; ++i)</div><div class="line"><a name="l01916"></a><span class="lineno"> 1916</span>&#160;    {</div><div class="line"><a name="l01917"></a><span class="lineno"> 1917</span>&#160;        dimSizes.push_back(params.<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#a9943775a364fc4ab53b85ac88f311886">GetTensorInfo</a>().<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a8b5d0f8a24e9d9238f412260a552acf8">GetShape</a>()[i]);</div><div class="line"><a name="l01918"></a><span class="lineno"> 1918</span>&#160;    }</div><div class="line"><a name="l01919"></a><span class="lineno"> 1919</span>&#160;</div><div class="line"><a name="l01920"></a><span class="lineno"> 1920</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_shape.xhtml">TensorShape</a>&amp; inferredShape = <a class="code" href="classarmnn_1_1_tensor_shape.xhtml">TensorShape</a>(outputDim, dimSizes.data());</div><div class="line"><a name="l01921"></a><span class="lineno"> 1921</span>&#160;</div><div class="line"><a name="l01922"></a><span class="lineno"> 1922</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> inferredOutputInfo(inferredShape, params.<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#a9943775a364fc4ab53b85ac88f311886">GetTensorInfo</a>().<a class="code" href="classarmnn_1_1_tensor_info.xhtml#aea909c7327109228ef618d459015def3">GetDataType</a>());</div><div class="line"><a name="l01923"></a><span class="lineno"> 1923</span>&#160;</div><div class="line"><a name="l01924"></a><span class="lineno"> 1924</span>&#160;    <a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml">IConnectableLayer</a>* <span class="keyword">const</span> layer = <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a2db3ae8d422f17d455e0ba0cb6291d2a">m_Network</a>-&gt;AddGatherLayer(descriptor, nodeDef.name().c_str());</div><div class="line"><a name="l01925"></a><span class="lineno"> 1925</span>&#160;    layer-&gt;GetOutputSlot(0).SetTensorInfo(inferredOutputInfo);</div><div class="line"><a name="l01926"></a><span class="lineno"> 1926</span>&#160;</div><div class="line"><a name="l01927"></a><span class="lineno"> 1927</span>&#160;    params.<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#ac1835f8756a9f03c02fcf9664e3a0fce">Connect</a>(layer-&gt;GetInputSlot(0));</div><div class="line"><a name="l01928"></a><span class="lineno"> 1928</span>&#160;    indices.<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#ac1835f8756a9f03c02fcf9664e3a0fce">Connect</a>(layer-&gt;GetInputSlot(1));</div><div class="line"><a name="l01929"></a><span class="lineno"> 1929</span>&#160;</div><div class="line"><a name="l01930"></a><span class="lineno"> 1930</span>&#160;    <span class="keywordflow">return</span> std::make_unique&lt;SingleLayerParsedTfOperation&gt;(<span class="keyword">this</span>, nodeDef, layer);</div><div class="line"><a name="l01931"></a><span class="lineno"> 1931</span>&#160;}</div><div class="line"><a name="l01932"></a><span class="lineno"> 1932</span>&#160;</div><div class="line"><a name="l01933"></a><span class="lineno"><a class="line" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a3e11b85d3302eb25275a1389647d0f41"> 1933</a></span>&#160;<a class="code" href="namespacearmnn_tf_parser.xhtml#aa36bf288c19fe35767bb6e059636f405">ParsedTfOperationPtr</a> <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a3e11b85d3302eb25275a1389647d0f41">ITfParser::TfParserImpl::ParseGreater</a>(<span class="keyword">const</span> tensorflow::NodeDef&amp; nodeDef,</div><div class="line"><a name="l01934"></a><span class="lineno"> 1934</span>&#160;                                                          <span class="keyword">const</span> tensorflow::GraphDef&amp; graphDef)</div><div class="line"><a name="l01935"></a><span class="lineno"> 1935</span>&#160;{</div><div class="line"><a name="l01936"></a><span class="lineno"> 1936</span>&#160;    <a class="code" href="namespacearmnn.xhtml#a44affeeb090c3c6a3062830562672e84">IgnoreUnused</a>(graphDef);</div><div class="line"><a name="l01937"></a><span class="lineno"> 1937</span>&#160;    std::pair&lt;armnn::IOutputSlot*, armnn::IOutputSlot*&gt; inputLayers = <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a0562881f75a2083315f1a1660686812b">ProcessElementwiseInputSlots</a>(nodeDef, <span class="stringliteral">&quot;Greater&quot;</span>);</div><div class="line"><a name="l01938"></a><span class="lineno"> 1938</span>&#160;    <a class="code" href="classarmnn_1_1_i_output_slot.xhtml">IOutputSlot</a>* input0Slot = inputLayers.first;</div><div class="line"><a name="l01939"></a><span class="lineno"> 1939</span>&#160;    <a class="code" href="classarmnn_1_1_i_output_slot.xhtml">IOutputSlot</a>* input1Slot = inputLayers.second;</div><div class="line"><a name="l01940"></a><span class="lineno"> 1940</span>&#160;</div><div class="line"><a name="l01941"></a><span class="lineno"> 1941</span>&#160;    <a class="code" href="structarmnn_1_1_comparison_descriptor.xhtml">ComparisonDescriptor</a> descriptor(ComparisonOperation::Greater);</div><div class="line"><a name="l01942"></a><span class="lineno"> 1942</span>&#160;    <a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml">IConnectableLayer</a>* <span class="keyword">const</span> layer = <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a2db3ae8d422f17d455e0ba0cb6291d2a">m_Network</a>-&gt;AddComparisonLayer(descriptor, nodeDef.name().c_str());</div><div class="line"><a name="l01943"></a><span class="lineno"> 1943</span>&#160;</div><div class="line"><a name="l01944"></a><span class="lineno"> 1944</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a4ceb262ac0351dcf1aa9f7e1dc298489">ProcessComparisonLayer</a>(input0Slot, input1Slot, layer, nodeDef);</div><div class="line"><a name="l01945"></a><span class="lineno"> 1945</span>&#160;}</div><div class="line"><a name="l01946"></a><span class="lineno"> 1946</span>&#160;</div><div class="line"><a name="l01947"></a><span class="lineno"><a class="line" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#acf7e8c7e2e95c9ac09b1197c04b992a3"> 1947</a></span>&#160;<a class="code" href="namespacearmnn_tf_parser.xhtml#aa36bf288c19fe35767bb6e059636f405">ParsedTfOperationPtr</a> <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#acf7e8c7e2e95c9ac09b1197c04b992a3">ITfParser::TfParserImpl::ParseEqual</a>(<span class="keyword">const</span> tensorflow::NodeDef&amp; nodeDef,</div><div class="line"><a name="l01948"></a><span class="lineno"> 1948</span>&#160;                                                        <span class="keyword">const</span> tensorflow::GraphDef&amp; graphDef)</div><div class="line"><a name="l01949"></a><span class="lineno"> 1949</span>&#160;{</div><div class="line"><a name="l01950"></a><span class="lineno"> 1950</span>&#160;    <a class="code" href="namespacearmnn.xhtml#a44affeeb090c3c6a3062830562672e84">IgnoreUnused</a>(graphDef);</div><div class="line"><a name="l01951"></a><span class="lineno"> 1951</span>&#160;    std::pair&lt;armnn::IOutputSlot*, armnn::IOutputSlot*&gt; inputLayers = <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a0562881f75a2083315f1a1660686812b">ProcessElementwiseInputSlots</a>(nodeDef, <span class="stringliteral">&quot;Equal&quot;</span>);</div><div class="line"><a name="l01952"></a><span class="lineno"> 1952</span>&#160;    <a class="code" href="classarmnn_1_1_i_output_slot.xhtml">IOutputSlot</a>* input0Slot = inputLayers.first;</div><div class="line"><a name="l01953"></a><span class="lineno"> 1953</span>&#160;    <a class="code" href="classarmnn_1_1_i_output_slot.xhtml">IOutputSlot</a>* input1Slot = inputLayers.second;</div><div class="line"><a name="l01954"></a><span class="lineno"> 1954</span>&#160;</div><div class="line"><a name="l01955"></a><span class="lineno"> 1955</span>&#160;    <a class="code" href="structarmnn_1_1_comparison_descriptor.xhtml">ComparisonDescriptor</a> descriptor(ComparisonOperation::Equal);</div><div class="line"><a name="l01956"></a><span class="lineno"> 1956</span>&#160;    <a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml">IConnectableLayer</a>* <span class="keyword">const</span> layer = <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a2db3ae8d422f17d455e0ba0cb6291d2a">m_Network</a>-&gt;AddComparisonLayer(descriptor, nodeDef.name().c_str());</div><div class="line"><a name="l01957"></a><span class="lineno"> 1957</span>&#160;</div><div class="line"><a name="l01958"></a><span class="lineno"> 1958</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a4ceb262ac0351dcf1aa9f7e1dc298489">ProcessComparisonLayer</a>(input0Slot, input1Slot, layer, nodeDef);</div><div class="line"><a name="l01959"></a><span class="lineno"> 1959</span>&#160;}</div><div class="line"><a name="l01960"></a><span class="lineno"> 1960</span>&#160;</div><div class="line"><a name="l01961"></a><span class="lineno"><a class="line" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a5b86d12475da84cedb4632a47bb68b1e"> 1961</a></span>&#160;<a class="code" href="namespacearmnn_tf_parser.xhtml#aa36bf288c19fe35767bb6e059636f405">ParsedTfOperationPtr</a> <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a5b86d12475da84cedb4632a47bb68b1e">ITfParser::TfParserImpl::ParseMinimum</a>(<span class="keyword">const</span> tensorflow::NodeDef&amp; nodeDef,</div><div class="line"><a name="l01962"></a><span class="lineno"> 1962</span>&#160;                                                          <span class="keyword">const</span> tensorflow::GraphDef&amp; graphDef)</div><div class="line"><a name="l01963"></a><span class="lineno"> 1963</span>&#160;{</div><div class="line"><a name="l01964"></a><span class="lineno"> 1964</span>&#160;    <a class="code" href="namespacearmnn.xhtml#a44affeeb090c3c6a3062830562672e84">IgnoreUnused</a>(graphDef);</div><div class="line"><a name="l01965"></a><span class="lineno"> 1965</span>&#160;    std::pair&lt;armnn::IOutputSlot*, armnn::IOutputSlot*&gt; inputLayers = <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a0562881f75a2083315f1a1660686812b">ProcessElementwiseInputSlots</a>(nodeDef, <span class="stringliteral">&quot;Minimum&quot;</span>);</div><div class="line"><a name="l01966"></a><span class="lineno"> 1966</span>&#160;    <a class="code" href="classarmnn_1_1_i_output_slot.xhtml">IOutputSlot</a>* input0Slot = inputLayers.first;</div><div class="line"><a name="l01967"></a><span class="lineno"> 1967</span>&#160;    <a class="code" href="classarmnn_1_1_i_output_slot.xhtml">IOutputSlot</a>* input1Slot = inputLayers.second;</div><div class="line"><a name="l01968"></a><span class="lineno"> 1968</span>&#160;</div><div class="line"><a name="l01969"></a><span class="lineno"> 1969</span>&#160;    <a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml">IConnectableLayer</a>* <span class="keyword">const</span> layer = <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a2db3ae8d422f17d455e0ba0cb6291d2a">m_Network</a>-&gt;AddMinimumLayer(nodeDef.name().c_str());</div><div class="line"><a name="l01970"></a><span class="lineno"> 1970</span>&#160;</div><div class="line"><a name="l01971"></a><span class="lineno"> 1971</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a0d5cf4cdeeb79d5e4fed01981d734b50">ProcessElementwiseLayer</a>(input0Slot, input1Slot, layer, nodeDef);</div><div class="line"><a name="l01972"></a><span class="lineno"> 1972</span>&#160;}</div><div class="line"><a name="l01973"></a><span class="lineno"> 1973</span>&#160;</div><div class="line"><a name="l01974"></a><span class="lineno"><a class="line" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a6f8a3151672d48b7b929cfd9acd5add1"> 1974</a></span>&#160;<a class="code" href="namespacearmnn_tf_parser.xhtml#aa36bf288c19fe35767bb6e059636f405">ParsedTfOperationPtr</a> <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a6f8a3151672d48b7b929cfd9acd5add1">ITfParser::TfParserImpl::ParseSub</a>(<span class="keyword">const</span> tensorflow::NodeDef&amp; nodeDef,</div><div class="line"><a name="l01975"></a><span class="lineno"> 1975</span>&#160;                                                      <span class="keyword">const</span> tensorflow::GraphDef&amp; graphDef)</div><div class="line"><a name="l01976"></a><span class="lineno"> 1976</span>&#160;{</div><div class="line"><a name="l01977"></a><span class="lineno"> 1977</span>&#160;    <a class="code" href="namespacearmnn.xhtml#a44affeeb090c3c6a3062830562672e84">IgnoreUnused</a>(graphDef);</div><div class="line"><a name="l01978"></a><span class="lineno"> 1978</span>&#160;    std::vector&lt;OutputOfParsedTfOperation&gt; inputs = <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#ae295ca8b7d19bb5e6db3f93bd4561ee0">GetInputParsedTfOperationsChecked</a>(nodeDef, 2);</div><div class="line"><a name="l01979"></a><span class="lineno"> 1979</span>&#160;</div><div class="line"><a name="l01980"></a><span class="lineno"> 1980</span>&#160;    <a class="code" href="classarmnn_1_1_i_output_slot.xhtml">IOutputSlot</a>* input0Slot = &amp;inputs[0].m_IndexedValue-&gt;ResolveArmnnOutputSlot(inputs[0].m_Index);</div><div class="line"><a name="l01981"></a><span class="lineno"> 1981</span>&#160;    <a class="code" href="classarmnn_1_1_i_output_slot.xhtml">IOutputSlot</a>* input1Slot = &amp;inputs[1].m_IndexedValue-&gt;ResolveArmnnOutputSlot(inputs[1].m_Index);</div><div class="line"><a name="l01982"></a><span class="lineno"> 1982</span>&#160;</div><div class="line"><a name="l01983"></a><span class="lineno"> 1983</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a>&amp; input0Info = input0Slot-&gt;<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#a9943775a364fc4ab53b85ac88f311886">GetTensorInfo</a>();</div><div class="line"><a name="l01984"></a><span class="lineno"> 1984</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a>&amp; input1Info = input1Slot-&gt;<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#a9943775a364fc4ab53b85ac88f311886">GetTensorInfo</a>();</div><div class="line"><a name="l01985"></a><span class="lineno"> 1985</span>&#160;</div><div class="line"><a name="l01986"></a><span class="lineno"> 1986</span>&#160;    <span class="keywordflow">if</span> (input0Info.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a157e27d41e9f6b21f0d3c025fa47dc24">GetNumDimensions</a>() == 1)</div><div class="line"><a name="l01987"></a><span class="lineno"> 1987</span>&#160;    {</div><div class="line"><a name="l01988"></a><span class="lineno"> 1988</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">bool</span> isNHWC = <span class="keyword">true</span>;</div><div class="line"><a name="l01989"></a><span class="lineno"> 1989</span>&#160;        input0Slot = <a class="code" href="namespacearmnn_1_1optimizations.xhtml#a4fc55afb4885278ad1510b2c4307af76">AddBroadcastReshapeLayer</a>(input1Slot, input0Slot, isNHWC, *<a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a2db3ae8d422f17d455e0ba0cb6291d2a">m_Network</a>, nodeDef);</div><div class="line"><a name="l01990"></a><span class="lineno"> 1990</span>&#160;    }</div><div class="line"><a name="l01991"></a><span class="lineno"> 1991</span>&#160;</div><div class="line"><a name="l01992"></a><span class="lineno"> 1992</span>&#160;    <span class="keywordflow">if</span> (input1Info.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a157e27d41e9f6b21f0d3c025fa47dc24">GetNumDimensions</a>() == 1)</div><div class="line"><a name="l01993"></a><span class="lineno"> 1993</span>&#160;    {</div><div class="line"><a name="l01994"></a><span class="lineno"> 1994</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">bool</span> isNHWC = <span class="keyword">true</span>;</div><div class="line"><a name="l01995"></a><span class="lineno"> 1995</span>&#160;        input1Slot = <a class="code" href="namespacearmnn_1_1optimizations.xhtml#a4fc55afb4885278ad1510b2c4307af76">AddBroadcastReshapeLayer</a>(input0Slot, input1Slot, isNHWC, *<a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a2db3ae8d422f17d455e0ba0cb6291d2a">m_Network</a>, nodeDef);</div><div class="line"><a name="l01996"></a><span class="lineno"> 1996</span>&#160;    }</div><div class="line"><a name="l01997"></a><span class="lineno"> 1997</span>&#160;</div><div class="line"><a name="l01998"></a><span class="lineno"> 1998</span>&#160;    <a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml">IConnectableLayer</a>* <span class="keyword">const</span> layer = <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a2db3ae8d422f17d455e0ba0cb6291d2a">m_Network</a>-&gt;AddSubtractionLayer(nodeDef.name().c_str());</div><div class="line"><a name="l01999"></a><span class="lineno"> 1999</span>&#160;</div><div class="line"><a name="l02000"></a><span class="lineno"> 2000</span>&#160;    input0Slot-&gt;<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#ac1835f8756a9f03c02fcf9664e3a0fce">Connect</a>(layer-&gt;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml#a6ec9e0eb66d7d6a01240492a0b18104c">GetInputSlot</a>(0));</div><div class="line"><a name="l02001"></a><span class="lineno"> 2001</span>&#160;    input1Slot-&gt;<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#ac1835f8756a9f03c02fcf9664e3a0fce">Connect</a>(layer-&gt;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml#a6ec9e0eb66d7d6a01240492a0b18104c">GetInputSlot</a>(1));</div><div class="line"><a name="l02002"></a><span class="lineno"> 2002</span>&#160;</div><div class="line"><a name="l02003"></a><span class="lineno"> 2003</span>&#160;    <span class="keywordflow">if</span> (input0Info.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a157e27d41e9f6b21f0d3c025fa47dc24">GetNumDimensions</a>() == 1)</div><div class="line"><a name="l02004"></a><span class="lineno"> 2004</span>&#160;    {</div><div class="line"><a name="l02005"></a><span class="lineno"> 2005</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>(input1Slot-&gt;<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#a9943775a364fc4ab53b85ac88f311886">GetTensorInfo</a>());</div><div class="line"><a name="l02006"></a><span class="lineno"> 2006</span>&#160;    }</div><div class="line"><a name="l02007"></a><span class="lineno"> 2007</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l02008"></a><span class="lineno"> 2008</span>&#160;    {</div><div class="line"><a name="l02009"></a><span class="lineno"> 2009</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>(input0Slot-&gt;<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#a9943775a364fc4ab53b85ac88f311886">GetTensorInfo</a>());</div><div class="line"><a name="l02010"></a><span class="lineno"> 2010</span>&#160;    }</div><div class="line"><a name="l02011"></a><span class="lineno"> 2011</span>&#160;</div><div class="line"><a name="l02012"></a><span class="lineno"> 2012</span>&#160;    <span class="keywordflow">return</span> std::make_unique&lt;SingleLayerParsedTfOperation&gt;(<span class="keyword">this</span>, nodeDef, layer);</div><div class="line"><a name="l02013"></a><span class="lineno"> 2013</span>&#160;}</div><div class="line"><a name="l02014"></a><span class="lineno"> 2014</span>&#160;</div><div class="line"><a name="l02015"></a><span class="lineno"><a class="line" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a7fe3fd8cda30d697f99359a6e295677b"> 2015</a></span>&#160;<a class="code" href="namespacearmnn_tf_parser.xhtml#aa36bf288c19fe35767bb6e059636f405">ParsedTfOperationPtr</a> <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a7fe3fd8cda30d697f99359a6e295677b">ITfParser::TfParserImpl::ParseStack</a>(<span class="keyword">const</span> tensorflow::NodeDef&amp; nodeDef,</div><div class="line"><a name="l02016"></a><span class="lineno"> 2016</span>&#160;                                                        <span class="keyword">const</span> tensorflow::GraphDef&amp; graphDef)</div><div class="line"><a name="l02017"></a><span class="lineno"> 2017</span>&#160;{</div><div class="line"><a name="l02018"></a><span class="lineno"> 2018</span>&#160;    <a class="code" href="namespacearmnn.xhtml#a44affeeb090c3c6a3062830562672e84">IgnoreUnused</a>(graphDef);</div><div class="line"><a name="l02019"></a><span class="lineno"> 2019</span>&#160;    std::vector&lt;OutputOfConstNodeDef&gt; nodes = <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a9e7a394f59e8d223a79e3db798803c1c">GetTfInputNodes</a>(nodeDef);</div><div class="line"><a name="l02020"></a><span class="lineno"> 2020</span>&#160;</div><div class="line"><a name="l02021"></a><span class="lineno"> 2021</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> numInputs = <span class="keyword">static_cast&lt;</span><span class="keywordtype">unsigned</span> <span class="keywordtype">int</span><span class="keyword">&gt;</span>(nodes.size());</div><div class="line"><a name="l02022"></a><span class="lineno"> 2022</span>&#160;    <span class="keywordflow">if</span> (numInputs &lt; 1)</div><div class="line"><a name="l02023"></a><span class="lineno"> 2023</span>&#160;    {</div><div class="line"><a name="l02024"></a><span class="lineno"> 2024</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="l02025"></a><span class="lineno"> 2025</span>&#160;            fmt::format(<span class="stringliteral">&quot;Pack/Stack expects at least one input. Got {} for Node {} {}&quot;</span>,</div><div class="line"><a name="l02026"></a><span class="lineno"> 2026</span>&#160;                        numInputs,</div><div class="line"><a name="l02027"></a><span class="lineno"> 2027</span>&#160;                        nodeDef.name(),</div><div class="line"><a name="l02028"></a><span class="lineno"> 2028</span>&#160;                        <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l02029"></a><span class="lineno"> 2029</span>&#160;    }</div><div class="line"><a name="l02030"></a><span class="lineno"> 2030</span>&#160;</div><div class="line"><a name="l02031"></a><span class="lineno"> 2031</span>&#160;    std::vector&lt;OutputOfParsedTfOperation&gt; inputs = <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#ae295ca8b7d19bb5e6db3f93bd4561ee0">GetInputParsedTfOperationsChecked</a>(nodeDef, numInputs);</div><div class="line"><a name="l02032"></a><span class="lineno"> 2032</span>&#160;    <span class="comment">// Use the tensor shape of the first input as the &quot;correct&quot; input shape in the descriptor</span></div><div class="line"><a name="l02033"></a><span class="lineno"> 2033</span>&#160;    <a class="code" href="classarmnn_1_1_i_output_slot.xhtml">IOutputSlot</a>* input0Slot = &amp;inputs[0].m_IndexedValue-&gt;ResolveArmnnOutputSlot(inputs[0].m_Index);</div><div class="line"><a name="l02034"></a><span class="lineno"> 2034</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a>&amp; inputTensorInfo = input0Slot-&gt;<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#a9943775a364fc4ab53b85ac88f311886">GetTensorInfo</a>();</div><div class="line"><a name="l02035"></a><span class="lineno"> 2035</span>&#160;    <span class="keyword">auto</span> numDimensions = inputTensorInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a8b5d0f8a24e9d9238f412260a552acf8">GetShape</a>().<a class="code" href="classarmnn_1_1_tensor_shape.xhtml#a157e27d41e9f6b21f0d3c025fa47dc24">GetNumDimensions</a>();</div><div class="line"><a name="l02036"></a><span class="lineno"> 2036</span>&#160;</div><div class="line"><a name="l02037"></a><span class="lineno"> 2037</span>&#160;    <span class="comment">// validate axis</span></div><div class="line"><a name="l02038"></a><span class="lineno"> 2038</span>&#160;    int32_t axis = ReadMandatoryNodeInt32Attribute(nodeDef, <span class="stringliteral">&quot;axis&quot;</span>);</div><div class="line"><a name="l02039"></a><span class="lineno"> 2039</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">int</span> sNumDimensions = (<span class="keyword">static_cast&lt;</span><span class="keywordtype">int</span><span class="keyword">&gt;</span>(numDimensions) + 1);</div><div class="line"><a name="l02040"></a><span class="lineno"> 2040</span>&#160;    <span class="keywordflow">if</span> (!(axis &lt; sNumDimensions &amp;&amp; axis &gt;= -sNumDimensions))</div><div class="line"><a name="l02041"></a><span class="lineno"> 2041</span>&#160;    {</div><div class="line"><a name="l02042"></a><span class="lineno"> 2042</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="l02043"></a><span class="lineno"> 2043</span>&#160;            fmt::format(<span class="stringliteral">&quot;Axis index is not in range. Got {} for Node {} {}&quot;</span>,</div><div class="line"><a name="l02044"></a><span class="lineno"> 2044</span>&#160;                        axis,</div><div class="line"><a name="l02045"></a><span class="lineno"> 2045</span>&#160;                        nodeDef.name(),</div><div class="line"><a name="l02046"></a><span class="lineno"> 2046</span>&#160;                        <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l02047"></a><span class="lineno"> 2047</span>&#160;    }</div><div class="line"><a name="l02048"></a><span class="lineno"> 2048</span>&#160;</div><div class="line"><a name="l02049"></a><span class="lineno"> 2049</span>&#160;    <span class="keywordflow">if</span> (axis &lt; 0)</div><div class="line"><a name="l02050"></a><span class="lineno"> 2050</span>&#160;    {</div><div class="line"><a name="l02051"></a><span class="lineno"> 2051</span>&#160;        axis = <span class="keyword">static_cast&lt;</span>int32_t<span class="keyword">&gt;</span>(numDimensions) + axis + 1;</div><div class="line"><a name="l02052"></a><span class="lineno"> 2052</span>&#160;    }</div><div class="line"><a name="l02053"></a><span class="lineno"> 2053</span>&#160;</div><div class="line"><a name="l02054"></a><span class="lineno"> 2054</span>&#160;    <a class="code" href="structarmnn_1_1_stack_descriptor.xhtml">StackDescriptor</a> stackDescriptor;</div><div class="line"><a name="l02055"></a><span class="lineno"> 2055</span>&#160;    stackDescriptor.<a class="code" href="structarmnn_1_1_stack_descriptor.xhtml#ab218de7805899c8412d75d1fd1d846d2">m_Axis</a> = <span class="keyword">static_cast&lt;</span>uint32_t<span class="keyword">&gt;</span>(axis);</div><div class="line"><a name="l02056"></a><span class="lineno"> 2056</span>&#160;    stackDescriptor.<a class="code" href="structarmnn_1_1_stack_descriptor.xhtml#aed6086070440ceb94129bef06f70173f">m_NumInputs</a> = <span class="keyword">static_cast&lt;</span>uint32_t<span class="keyword">&gt;</span>(numInputs);</div><div class="line"><a name="l02057"></a><span class="lineno"> 2057</span>&#160;    stackDescriptor.<a class="code" href="structarmnn_1_1_stack_descriptor.xhtml#a2bea87b470268bb0b73457c3733dbc04">m_InputShape</a> = inputTensorInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a8b5d0f8a24e9d9238f412260a552acf8">GetShape</a>();</div><div class="line"><a name="l02058"></a><span class="lineno"> 2058</span>&#160;</div><div class="line"><a name="l02059"></a><span class="lineno"> 2059</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> supportedNumDims = 4;</div><div class="line"><a name="l02060"></a><span class="lineno"> 2060</span>&#160;    <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> viewIndex = 0; viewIndex &lt; numInputs; ++viewIndex)</div><div class="line"><a name="l02061"></a><span class="lineno"> 2061</span>&#160;    {</div><div class="line"><a name="l02062"></a><span class="lineno"> 2062</span>&#160;        <a class="code" href="classarmnn_1_1_i_output_slot.xhtml">IOutputSlot</a>&amp; inputSlot = inputs[viewIndex].m_IndexedValue-&gt;ResolveArmnnOutputSlot(inputs[viewIndex].m_Index);</div><div class="line"><a name="l02063"></a><span class="lineno"> 2063</span>&#160;        <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> inputTensorInfo = inputSlot.<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#a9943775a364fc4ab53b85ac88f311886">GetTensorInfo</a>();</div><div class="line"><a name="l02064"></a><span class="lineno"> 2064</span>&#160;</div><div class="line"><a name="l02065"></a><span class="lineno"> 2065</span>&#160;        <span class="comment">// Double check dimensions of the tensors</span></div><div class="line"><a name="l02066"></a><span class="lineno"> 2066</span>&#160;        <span class="keywordflow">if</span> (inputTensorInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a157e27d41e9f6b21f0d3c025fa47dc24">GetNumDimensions</a>() &gt;= supportedNumDims)</div><div class="line"><a name="l02067"></a><span class="lineno"> 2067</span>&#160;        {</div><div class="line"><a name="l02068"></a><span class="lineno"> 2068</span>&#160;            <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_parse_exception.xhtml">armnn::ParseException</a>(</div><div class="line"><a name="l02069"></a><span class="lineno"> 2069</span>&#160;                    fmt::format(<span class="stringliteral">&quot;The number of dimensions: {} for input tensors of the &quot;</span></div><div class="line"><a name="l02070"></a><span class="lineno"> 2070</span>&#160;                                <span class="stringliteral">&quot;Pack/Stack op. Number of dimensions should be less than {} {}&quot;</span>,</div><div class="line"><a name="l02071"></a><span class="lineno"> 2071</span>&#160;                                inputTensorInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a157e27d41e9f6b21f0d3c025fa47dc24">GetNumDimensions</a>(),</div><div class="line"><a name="l02072"></a><span class="lineno"> 2072</span>&#160;                                supportedNumDims,</div><div class="line"><a name="l02073"></a><span class="lineno"> 2073</span>&#160;                                <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l02074"></a><span class="lineno"> 2074</span>&#160;        }</div><div class="line"><a name="l02075"></a><span class="lineno"> 2075</span>&#160;    }</div><div class="line"><a name="l02076"></a><span class="lineno"> 2076</span>&#160;</div><div class="line"><a name="l02077"></a><span class="lineno"> 2077</span>&#160;    std::vector&lt;unsigned int&gt; outputDimensions;</div><div class="line"><a name="l02078"></a><span class="lineno"> 2078</span>&#160;    <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i = 0; i &lt; stackDescriptor.<a class="code" href="structarmnn_1_1_stack_descriptor.xhtml#a2bea87b470268bb0b73457c3733dbc04">m_InputShape</a>.<a class="code" href="classarmnn_1_1_tensor_shape.xhtml#a157e27d41e9f6b21f0d3c025fa47dc24">GetNumDimensions</a>(); ++i)</div><div class="line"><a name="l02079"></a><span class="lineno"> 2079</span>&#160;    {</div><div class="line"><a name="l02080"></a><span class="lineno"> 2080</span>&#160;        outputDimensions.push_back(stackDescriptor.<a class="code" href="structarmnn_1_1_stack_descriptor.xhtml#a2bea87b470268bb0b73457c3733dbc04">m_InputShape</a>[i]);</div><div class="line"><a name="l02081"></a><span class="lineno"> 2081</span>&#160;    }</div><div class="line"><a name="l02082"></a><span class="lineno"> 2082</span>&#160;    outputDimensions.insert(outputDimensions.begin() + axis, numInputs);</div><div class="line"><a name="l02083"></a><span class="lineno"> 2083</span>&#160;</div><div class="line"><a name="l02084"></a><span class="lineno"> 2084</span>&#160;    <span class="comment">// add Stack Layer</span></div><div class="line"><a name="l02085"></a><span class="lineno"> 2085</span>&#160;    <a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml">IConnectableLayer</a>* <span class="keyword">const</span> layer = <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a2db3ae8d422f17d455e0ba0cb6291d2a">m_Network</a>-&gt;AddStackLayer(stackDescriptor, nodeDef.name().c_str());</div><div class="line"><a name="l02086"></a><span class="lineno"> 2086</span>&#160;</div><div class="line"><a name="l02087"></a><span class="lineno"> 2087</span>&#160;    <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> viewIndex = 0; viewIndex &lt; numInputs; ++viewIndex)</div><div class="line"><a name="l02088"></a><span class="lineno"> 2088</span>&#160;    {</div><div class="line"><a name="l02089"></a><span class="lineno"> 2089</span>&#160;        <a class="code" href="classarmnn_1_1_i_output_slot.xhtml">IOutputSlot</a>&amp; inputSlot = inputs[viewIndex].m_IndexedValue-&gt;ResolveArmnnOutputSlot(inputs[viewIndex].m_Index);</div><div class="line"><a name="l02090"></a><span class="lineno"> 2090</span>&#160;        inputSlot.<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#ac1835f8756a9f03c02fcf9664e3a0fce">Connect</a>(layer-&gt;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml#a6ec9e0eb66d7d6a01240492a0b18104c">GetInputSlot</a>(viewIndex));</div><div class="line"><a name="l02091"></a><span class="lineno"> 2091</span>&#160;    }</div><div class="line"><a name="l02092"></a><span class="lineno"> 2092</span>&#160;</div><div class="line"><a name="l02093"></a><span class="lineno"> 2093</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>(</div><div class="line"><a name="l02094"></a><span class="lineno"> 2094</span>&#160;        <a class="code" href="classarmnn_1_1_tensor_info.xhtml">armnn::TensorInfo</a>(static_cast&lt;uint32_t&gt;(outputDimensions.size()),</div><div class="line"><a name="l02095"></a><span class="lineno"> 2095</span>&#160;                          outputDimensions.data(),</div><div class="line"><a name="l02096"></a><span class="lineno"> 2096</span>&#160;                          inputTensorInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#aea909c7327109228ef618d459015def3">GetDataType</a>()));</div><div class="line"><a name="l02097"></a><span class="lineno"> 2097</span>&#160;</div><div class="line"><a name="l02098"></a><span class="lineno"> 2098</span>&#160;    <span class="keywordflow">return</span> std::make_unique&lt;SingleLayerParsedTfOperation&gt;(<span class="keyword">this</span>, nodeDef, layer);</div><div class="line"><a name="l02099"></a><span class="lineno"> 2099</span>&#160;}</div><div class="line"><a name="l02100"></a><span class="lineno"> 2100</span>&#160;</div><div class="line"><a name="l02101"></a><span class="lineno"><a class="line" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a38b8abe6086a61e8831391b8717453cf"> 2101</a></span>&#160;<a class="code" href="namespacearmnn_tf_parser.xhtml#aa36bf288c19fe35767bb6e059636f405">ParsedTfOperationPtr</a> <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a38b8abe6086a61e8831391b8717453cf">ITfParser::TfParserImpl::ParseTranspose</a>(<span class="keyword">const</span> tensorflow::NodeDef&amp; nodeDef,</div><div class="line"><a name="l02102"></a><span class="lineno"> 2102</span>&#160;                                                            <span class="keyword">const</span> tensorflow::GraphDef&amp; graphDef)</div><div class="line"><a name="l02103"></a><span class="lineno"> 2103</span>&#160;{</div><div class="line"><a name="l02104"></a><span class="lineno"> 2104</span>&#160;    <a class="code" href="namespacearmnn.xhtml#a44affeeb090c3c6a3062830562672e84">IgnoreUnused</a>(graphDef);</div><div class="line"><a name="l02105"></a><span class="lineno"> 2105</span>&#160;</div><div class="line"><a name="l02106"></a><span class="lineno"> 2106</span>&#160;    <span class="keyword">auto</span> inputs = <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#ae295ca8b7d19bb5e6db3f93bd4561ee0">GetInputParsedTfOperationsChecked</a>(nodeDef, 2);</div><div class="line"><a name="l02107"></a><span class="lineno"> 2107</span>&#160;    <span class="keyword">const</span> <span class="keyword">auto</span> inputCount = inputs.size();</div><div class="line"><a name="l02108"></a><span class="lineno"> 2108</span>&#160;</div><div class="line"><a name="l02109"></a><span class="lineno"> 2109</span>&#160;    <span class="keywordflow">if</span> (inputCount != 2)</div><div class="line"><a name="l02110"></a><span class="lineno"> 2110</span>&#160;    {</div><div class="line"><a name="l02111"></a><span class="lineno"> 2111</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="l02112"></a><span class="lineno"> 2112</span>&#160;                fmt::format(<span class="stringliteral">&quot;The number of given input is {}. It should be two for Transpose op.&quot;</span></div><div class="line"><a name="l02113"></a><span class="lineno"> 2113</span>&#160;                            <span class="stringliteral">&quot;Node {} {}&quot;</span>,</div><div class="line"><a name="l02114"></a><span class="lineno"> 2114</span>&#160;                            inputCount,</div><div class="line"><a name="l02115"></a><span class="lineno"> 2115</span>&#160;                            nodeDef.name(),</div><div class="line"><a name="l02116"></a><span class="lineno"> 2116</span>&#160;                            <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l02117"></a><span class="lineno"> 2117</span>&#160;    }</div><div class="line"><a name="l02118"></a><span class="lineno"> 2118</span>&#160;</div><div class="line"><a name="l02119"></a><span class="lineno"> 2119</span>&#160;    <span class="keyword">auto</span>* input0Slot = &amp;inputs[0].m_IndexedValue-&gt;ResolveArmnnOutputSlot(inputs[0].m_Index);</div><div class="line"><a name="l02120"></a><span class="lineno"> 2120</span>&#160;</div><div class="line"><a name="l02121"></a><span class="lineno"> 2121</span>&#160;    <span class="keyword">const</span> <span class="keyword">auto</span>  constInput         = inputs[<a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a82bb92947dc9e0f04d4242910d6cbc65">GetConstInputIndex</a>(inputs)];</div><div class="line"><a name="l02122"></a><span class="lineno"> 2122</span>&#160;    <span class="keyword">auto</span>*       permuteVectorInput =</div><div class="line"><a name="l02123"></a><span class="lineno"> 2123</span>&#160;        PolymorphicDowncast&lt;ParsedConstTfOperation&lt;int32_t&gt;*&gt;(constInput.m_IndexedValue);</div><div class="line"><a name="l02124"></a><span class="lineno"> 2124</span>&#160;    <span class="keyword">const</span> <span class="keyword">auto</span>&amp; permuteVectorInfo  = permuteVectorInput-&gt;GetTensorInfo();</div><div class="line"><a name="l02125"></a><span class="lineno"> 2125</span>&#160;</div><div class="line"><a name="l02126"></a><span class="lineno"> 2126</span>&#160;    std::vector&lt;int32_t&gt; permuteVectorData;</div><div class="line"><a name="l02127"></a><span class="lineno"> 2127</span>&#160;    permuteVectorInput-&gt;GetConstTensor(permuteVectorData);</div><div class="line"><a name="l02128"></a><span class="lineno"> 2128</span>&#160;</div><div class="line"><a name="l02129"></a><span class="lineno"> 2129</span>&#160;    std::vector&lt;unsigned int&gt;      armnnPermuteVectorData(permuteVectorData.begin(), permuteVectorData.end());</div><div class="line"><a name="l02130"></a><span class="lineno"> 2130</span>&#160;</div><div class="line"><a name="l02131"></a><span class="lineno"> 2131</span>&#160;    <span class="keyword">const</span> <span class="keyword">auto</span> permutationVector = <a class="code" href="classarmnn_1_1_permutation_vector.xhtml">PermutationVector</a>(armnnPermuteVectorData.data(), permuteVectorInfo.GetNumElements());</div><div class="line"><a name="l02132"></a><span class="lineno"> 2132</span>&#160;    <span class="keyword">const</span> <span class="keyword">auto</span> desc              = <a class="code" href="structarmnn_1_1_transpose_descriptor.xhtml">TransposeDescriptor</a>(permutationVector);</div><div class="line"><a name="l02133"></a><span class="lineno"> 2133</span>&#160;</div><div class="line"><a name="l02134"></a><span class="lineno"> 2134</span>&#160;    <span class="keyword">auto</span>* layer = <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a2db3ae8d422f17d455e0ba0cb6291d2a">m_Network</a>-&gt;AddTransposeLayer(desc, nodeDef.name().c_str());</div><div class="line"><a name="l02135"></a><span class="lineno"> 2135</span>&#160;    <a class="code" href="_assert_8hpp.xhtml#a5698be69cbd5dfe6c28fcd9867e8cbed">ARMNN_ASSERT</a>(layer);</div><div class="line"><a name="l02136"></a><span class="lineno"> 2136</span>&#160;</div><div class="line"><a name="l02137"></a><span class="lineno"> 2137</span>&#160;    input0Slot-&gt;Connect(layer-&gt;GetInputSlot(0));</div><div class="line"><a name="l02138"></a><span class="lineno"> 2138</span>&#160;</div><div class="line"><a name="l02139"></a><span class="lineno"> 2139</span>&#160;    <span class="keyword">const</span> <span class="keyword">auto</span>&amp;       input0Info = input0Slot-&gt;GetTensorInfo();</div><div class="line"><a name="l02140"></a><span class="lineno"> 2140</span>&#160;    <a class="code" href="classarmnn_1_1_tensor_info.xhtml">armnn::TensorInfo</a> outputInfo {input0Info};</div><div class="line"><a name="l02141"></a><span class="lineno"> 2141</span>&#160;    outputInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#abe8889e8150beef5fd204b2d87b49298">SetShape</a>(<a class="code" href="namespacearmnn_utils.xhtml#a428a9a6ffdf0e8d723b50c038c56c336">armnnUtils::TransposeTensorShape</a>(input0Info.GetShape(), desc.m_DimMappings));</div><div class="line"><a name="l02142"></a><span class="lineno"> 2142</span>&#160;    layer-&gt;GetOutputSlot(0).SetTensorInfo(outputInfo);</div><div class="line"><a name="l02143"></a><span class="lineno"> 2143</span>&#160;</div><div class="line"><a name="l02144"></a><span class="lineno"> 2144</span>&#160;    <span class="keywordflow">return</span> std::make_unique&lt;SingleLayerParsedTfOperation&gt;(<span class="keyword">this</span>, nodeDef, layer);</div><div class="line"><a name="l02145"></a><span class="lineno"> 2145</span>&#160;}</div><div class="line"><a name="l02146"></a><span class="lineno"> 2146</span>&#160;</div><div class="line"><a name="l02147"></a><span class="lineno"><a class="line" href="namespacearmnn_tf_parser.xhtml#ae5488f1478c62281c5e937e79ebcd145"> 2147</a></span>&#160;<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="namespacearmnn_tf_parser.xhtml#ae5488f1478c62281c5e937e79ebcd145">CheckPaddingTensor</a>(<span class="keyword">const</span> <a class="code" href="classarmnn_1_1_const_tensor.xhtml">ConstTensor</a>&amp; paddingTensor,</div><div class="line"><a name="l02148"></a><span class="lineno"> 2148</span>&#160;                                <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a>&amp; inputTensorInfo,</div><div class="line"><a name="l02149"></a><span class="lineno"> 2149</span>&#160;                                <span class="keyword">const</span> std::string&amp; nodeName)</div><div class="line"><a name="l02150"></a><span class="lineno"> 2150</span>&#160;{</div><div class="line"><a name="l02151"></a><span class="lineno"> 2151</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> rank = paddingTensor.<a class="code" href="classarmnn_1_1_base_tensor.xhtml#a8b5d0f8a24e9d9238f412260a552acf8">GetShape</a>()[0];</div><div class="line"><a name="l02152"></a><span class="lineno"> 2152</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> expectedRank = inputTensorInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a157e27d41e9f6b21f0d3c025fa47dc24">GetNumDimensions</a>();</div><div class="line"><a name="l02153"></a><span class="lineno"> 2153</span>&#160;    <span class="keywordflow">if</span> (rank != expectedRank)</div><div class="line"><a name="l02154"></a><span class="lineno"> 2154</span>&#160;    {</div><div class="line"><a name="l02155"></a><span class="lineno"> 2155</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="l02156"></a><span class="lineno"> 2156</span>&#160;                fmt::format(<span class="stringliteral">&quot;Expected the padding tensor to be of rank {} not {} on Node {} {}.&quot;</span>,</div><div class="line"><a name="l02157"></a><span class="lineno"> 2157</span>&#160;                            expectedRank,</div><div class="line"><a name="l02158"></a><span class="lineno"> 2158</span>&#160;                            rank,</div><div class="line"><a name="l02159"></a><span class="lineno"> 2159</span>&#160;                            nodeName,</div><div class="line"><a name="l02160"></a><span class="lineno"> 2160</span>&#160;                            <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l02161"></a><span class="lineno"> 2161</span>&#160;    }</div><div class="line"><a name="l02162"></a><span class="lineno"> 2162</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> second = paddingTensor.<a class="code" href="classarmnn_1_1_base_tensor.xhtml#a8b5d0f8a24e9d9238f412260a552acf8">GetShape</a>()[1];</div><div class="line"><a name="l02163"></a><span class="lineno"> 2163</span>&#160;    <span class="keywordflow">if</span> (second != 2)</div><div class="line"><a name="l02164"></a><span class="lineno"> 2164</span>&#160;    {</div><div class="line"><a name="l02165"></a><span class="lineno"> 2165</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="l02166"></a><span class="lineno"> 2166</span>&#160;                fmt::format(<span class="stringliteral">&quot;Expected the padding tensor to be of dimensions &quot;</span></div><div class="line"><a name="l02167"></a><span class="lineno"> 2167</span>&#160;                            <span class="stringliteral">&quot;[{1}, 2] not [{1}, {2}] on Node {3} {4}.&quot;</span>,</div><div class="line"><a name="l02168"></a><span class="lineno"> 2168</span>&#160;                            rank,</div><div class="line"><a name="l02169"></a><span class="lineno"> 2169</span>&#160;                            second,</div><div class="line"><a name="l02170"></a><span class="lineno"> 2170</span>&#160;                            nodeName,</div><div class="line"><a name="l02171"></a><span class="lineno"> 2171</span>&#160;                            <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l02172"></a><span class="lineno"> 2172</span>&#160;    }</div><div class="line"><a name="l02173"></a><span class="lineno"> 2173</span>&#160;    <span class="keywordflow">return</span> rank;</div><div class="line"><a name="l02174"></a><span class="lineno"> 2174</span>&#160;}</div><div class="line"><a name="l02175"></a><span class="lineno"> 2175</span>&#160;</div><div class="line"><a name="l02176"></a><span class="lineno"><a class="line" href="namespacearmnn_tf_parser.xhtml#a9c18860db8b032de579c5ad94cbae5d0"> 2176</a></span>&#160;<a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> <a class="code" href="namespacearmnn_tf_parser.xhtml#a9c18860db8b032de579c5ad94cbae5d0">CalculatePaddedOutputTensorInfo</a>(<span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a>&amp; inputTensorInfo,</div><div class="line"><a name="l02177"></a><span class="lineno"> 2177</span>&#160;                                           <span class="keyword">const</span> std::vector&lt;std::pair&lt;unsigned int, unsigned int&gt;&gt;&amp; padList)</div><div class="line"><a name="l02178"></a><span class="lineno"> 2178</span>&#160;{</div><div class="line"><a name="l02179"></a><span class="lineno"> 2179</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> numDims = inputTensorInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a157e27d41e9f6b21f0d3c025fa47dc24">GetNumDimensions</a>();</div><div class="line"><a name="l02180"></a><span class="lineno"> 2180</span>&#160;    std::vector&lt;unsigned int&gt; outDims;</div><div class="line"><a name="l02181"></a><span class="lineno"> 2181</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="l02182"></a><span class="lineno"> 2182</span>&#160;    {</div><div class="line"><a name="l02183"></a><span class="lineno"> 2183</span>&#160;        <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> dimSize = inputTensorInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a8b5d0f8a24e9d9238f412260a552acf8">GetShape</a>()[i];</div><div class="line"><a name="l02184"></a><span class="lineno"> 2184</span>&#160;        <span class="keyword">const</span> std::pair&lt;unsigned int, unsigned int&gt;&amp; dimPadding = padList[i];</div><div class="line"><a name="l02185"></a><span class="lineno"> 2185</span>&#160;        dimSize += dimPadding.first;</div><div class="line"><a name="l02186"></a><span class="lineno"> 2186</span>&#160;        dimSize += dimPadding.second;</div><div class="line"><a name="l02187"></a><span class="lineno"> 2187</span>&#160;        outDims.push_back(dimSize);</div><div class="line"><a name="l02188"></a><span class="lineno"> 2188</span>&#160;    }</div><div class="line"><a name="l02189"></a><span class="lineno"> 2189</span>&#160;    <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> paddedTensorInfo = inputTensorInfo;</div><div class="line"><a name="l02190"></a><span class="lineno"> 2190</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> outDimsSize = <span class="keyword">static_cast&lt;</span><span class="keywordtype">unsigned</span> <span class="keywordtype">int</span><span class="keyword">&gt;</span>(outDims.size());</div><div class="line"><a name="l02191"></a><span class="lineno"> 2191</span>&#160;    paddedTensorInfo.<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>{ outDimsSize, outDims.data() });</div><div class="line"><a name="l02192"></a><span class="lineno"> 2192</span>&#160;    <span class="keywordflow">return</span> paddedTensorInfo;</div><div class="line"><a name="l02193"></a><span class="lineno"> 2193</span>&#160;}</div><div class="line"><a name="l02194"></a><span class="lineno"> 2194</span>&#160;</div><div class="line"><a name="l02195"></a><span class="lineno"><a class="line" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a2a41fc15eebc9b7bb3404d1a2634639c"> 2195</a></span>&#160;<a class="code" href="namespacearmnn_tf_parser.xhtml#aa36bf288c19fe35767bb6e059636f405">ParsedTfOperationPtr</a> <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a2a41fc15eebc9b7bb3404d1a2634639c">ITfParser::TfParserImpl::ParsePad</a>(<span class="keyword">const</span> tensorflow::NodeDef&amp; nodeDef,</div><div class="line"><a name="l02196"></a><span class="lineno"> 2196</span>&#160;                                                      <span class="keyword">const</span> tensorflow::GraphDef&amp; graphDef)</div><div class="line"><a name="l02197"></a><span class="lineno"> 2197</span>&#160;{</div><div class="line"><a name="l02198"></a><span class="lineno"> 2198</span>&#160;    <a class="code" href="namespacearmnn.xhtml#a44affeeb090c3c6a3062830562672e84">IgnoreUnused</a>(graphDef);</div><div class="line"><a name="l02199"></a><span class="lineno"> 2199</span>&#160;    <span class="comment">// input consists of:</span></div><div class="line"><a name="l02200"></a><span class="lineno"> 2200</span>&#160;    <span class="comment">// input[0] the tensor which will be padded</span></div><div class="line"><a name="l02201"></a><span class="lineno"> 2201</span>&#160;    <span class="comment">// input[1] the tensor holding the padding values</span></div><div class="line"><a name="l02202"></a><span class="lineno"> 2202</span>&#160;    std::vector&lt;OutputOfParsedTfOperation&gt; inputs = <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#ae295ca8b7d19bb5e6db3f93bd4561ee0">GetInputParsedTfOperationsChecked</a>(nodeDef, 2);</div><div class="line"><a name="l02203"></a><span class="lineno"> 2203</span>&#160;    <a class="code" href="classarmnn_1_1_i_output_slot.xhtml">IOutputSlot</a>&amp; previousLayerOutputSlot = inputs[0].m_IndexedValue-&gt;ResolveArmnnOutputSlot(inputs[0].m_Index);</div><div class="line"><a name="l02204"></a><span class="lineno"> 2204</span>&#160;    <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> inputTensorInfo = previousLayerOutputSlot.<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#a9943775a364fc4ab53b85ac88f311886">GetTensorInfo</a>();</div><div class="line"><a name="l02205"></a><span class="lineno"> 2205</span>&#160;    <span class="keywordflow">if</span> (!HasParsedConstTensor&lt;int32_t&gt;(inputs[1].m_IndexedValue))</div><div class="line"><a name="l02206"></a><span class="lineno"> 2206</span>&#160;    {</div><div class="line"><a name="l02207"></a><span class="lineno"> 2207</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="l02208"></a><span class="lineno"> 2208</span>&#160;                fmt::format(<span class="stringliteral">&quot;ArmNN only supports Pad with constant padding. &quot;</span></div><div class="line"><a name="l02209"></a><span class="lineno"> 2209</span>&#160;                            <span class="stringliteral">&quot;Input {}. Node {} {}&quot;</span>,</div><div class="line"><a name="l02210"></a><span class="lineno"> 2210</span>&#160;                            inputs[1].m_IndexedValue-&gt;GetNode().name(),</div><div class="line"><a name="l02211"></a><span class="lineno"> 2211</span>&#160;                            nodeDef.name(),</div><div class="line"><a name="l02212"></a><span class="lineno"> 2212</span>&#160;                            <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l02213"></a><span class="lineno"> 2213</span>&#160;</div><div class="line"><a name="l02214"></a><span class="lineno"> 2214</span>&#160;    }</div><div class="line"><a name="l02215"></a><span class="lineno"> 2215</span>&#160;    ParsedConstTfOperation&lt;int32_t&gt;* paddingTensorOp =</div><div class="line"><a name="l02216"></a><span class="lineno"> 2216</span>&#160;            PolymorphicDowncast&lt;ParsedConstTfOperation&lt;int32_t&gt;*&gt;(inputs[1].m_IndexedValue);</div><div class="line"><a name="l02217"></a><span class="lineno"> 2217</span>&#160;</div><div class="line"><a name="l02218"></a><span class="lineno"> 2218</span>&#160;    std::vector&lt;int32_t&gt; paddingTensorData;</div><div class="line"><a name="l02219"></a><span class="lineno"> 2219</span>&#160;    <a class="code" href="classarmnn_1_1_const_tensor.xhtml">ConstTensor</a> paddingTensor = paddingTensorOp-&gt;GetConstTensor(paddingTensorData);</div><div class="line"><a name="l02220"></a><span class="lineno"> 2220</span>&#160;    <span class="comment">// paddings is an integer tensor with shape [n, 2], where n is the rank of tensor</span></div><div class="line"><a name="l02221"></a><span class="lineno"> 2221</span>&#160;    <span class="comment">// and should match the rank of the input tensor that is being padded.</span></div><div class="line"><a name="l02222"></a><span class="lineno"> 2222</span>&#160;    <span class="comment">// For each dimension D of input, paddings[D, 0] indicates how many values to add</span></div><div class="line"><a name="l02223"></a><span class="lineno"> 2223</span>&#160;    <span class="comment">// before the contents of tensor in that dimension, and paddings[D, 1] indicates how</span></div><div class="line"><a name="l02224"></a><span class="lineno"> 2224</span>&#160;    <span class="comment">// many values to add after the contents of tensor in that dimension</span></div><div class="line"><a name="l02225"></a><span class="lineno"> 2225</span>&#160;    <span class="comment">// This needs to be translated into a padList for ACL</span></div><div class="line"><a name="l02226"></a><span class="lineno"> 2226</span>&#160;    std::vector&lt;std::pair&lt;unsigned int, unsigned int&gt;&gt; padList;</div><div class="line"><a name="l02227"></a><span class="lineno"> 2227</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> rank = <a class="code" href="namespacearmnn_tf_parser.xhtml#ae5488f1478c62281c5e937e79ebcd145">CheckPaddingTensor</a>(paddingTensor, inputTensorInfo, nodeDef.name());</div><div class="line"><a name="l02228"></a><span class="lineno"> 2228</span>&#160;    <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i = 0; i &lt; rank; ++i)</div><div class="line"><a name="l02229"></a><span class="lineno"> 2229</span>&#160;    {</div><div class="line"><a name="l02230"></a><span class="lineno"> 2230</span>&#160;        std::pair&lt;unsigned int, unsigned int&gt; paddingForDim;</div><div class="line"><a name="l02231"></a><span class="lineno"> 2231</span>&#160;        <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> j = 0; j &lt; 2; j++)</div><div class="line"><a name="l02232"></a><span class="lineno"> 2232</span>&#160;        {</div><div class="line"><a name="l02233"></a><span class="lineno"> 2233</span>&#160;            <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> index = (i * 2) + j;</div><div class="line"><a name="l02234"></a><span class="lineno"> 2234</span>&#160;            <span class="keywordtype">int</span> paddingAmount = paddingTensorData[index];</div><div class="line"><a name="l02235"></a><span class="lineno"> 2235</span>&#160;            <span class="comment">// make sure we can cast to an unsigned value</span></div><div class="line"><a name="l02236"></a><span class="lineno"> 2236</span>&#160;            <span class="keywordflow">if</span> (paddingAmount &lt; 0)</div><div class="line"><a name="l02237"></a><span class="lineno"> 2237</span>&#160;            {</div><div class="line"><a name="l02238"></a><span class="lineno"> 2238</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="l02239"></a><span class="lineno"> 2239</span>&#160;                        fmt::format(<span class="stringliteral">&quot;Negative amount {} specified at [{}, {}] of padding tensor on Node {} {}.&quot;</span>,</div><div class="line"><a name="l02240"></a><span class="lineno"> 2240</span>&#160;                                    paddingAmount,</div><div class="line"><a name="l02241"></a><span class="lineno"> 2241</span>&#160;                                    i,</div><div class="line"><a name="l02242"></a><span class="lineno"> 2242</span>&#160;                                    j,</div><div class="line"><a name="l02243"></a><span class="lineno"> 2243</span>&#160;                                    nodeDef.name(),</div><div class="line"><a name="l02244"></a><span class="lineno"> 2244</span>&#160;                                    <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l02245"></a><span class="lineno"> 2245</span>&#160;            }</div><div class="line"><a name="l02246"></a><span class="lineno"> 2246</span>&#160;            <span class="keywordflow">if</span> (j == 0)</div><div class="line"><a name="l02247"></a><span class="lineno"> 2247</span>&#160;            {</div><div class="line"><a name="l02248"></a><span class="lineno"> 2248</span>&#160;                paddingForDim.first = <span class="keyword">static_cast&lt;</span><span class="keywordtype">unsigned</span> <span class="keywordtype">int</span><span class="keyword">&gt;</span>(paddingAmount);</div><div class="line"><a name="l02249"></a><span class="lineno"> 2249</span>&#160;            }</div><div class="line"><a name="l02250"></a><span class="lineno"> 2250</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l02251"></a><span class="lineno"> 2251</span>&#160;            {</div><div class="line"><a name="l02252"></a><span class="lineno"> 2252</span>&#160;                paddingForDim.second = <span class="keyword">static_cast&lt;</span><span class="keywordtype">unsigned</span> <span class="keywordtype">int</span><span class="keyword">&gt;</span>(paddingAmount);</div><div class="line"><a name="l02253"></a><span class="lineno"> 2253</span>&#160;            }</div><div class="line"><a name="l02254"></a><span class="lineno"> 2254</span>&#160;        }</div><div class="line"><a name="l02255"></a><span class="lineno"> 2255</span>&#160;        padList.push_back(paddingForDim);</div><div class="line"><a name="l02256"></a><span class="lineno"> 2256</span>&#160;    }</div><div class="line"><a name="l02257"></a><span class="lineno"> 2257</span>&#160;    <a class="code" href="structarmnn_1_1_pad_descriptor.xhtml">PadDescriptor</a> padDescriptor(padList);</div><div class="line"><a name="l02258"></a><span class="lineno"> 2258</span>&#160;    <a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml">IConnectableLayer</a>* layer = <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a2db3ae8d422f17d455e0ba0cb6291d2a">m_Network</a>-&gt;AddPadLayer(padDescriptor, nodeDef.name().c_str());</div><div class="line"><a name="l02259"></a><span class="lineno"> 2259</span>&#160;    previousLayerOutputSlot.<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#ac1835f8756a9f03c02fcf9664e3a0fce">Connect</a>(layer-&gt;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml#a6ec9e0eb66d7d6a01240492a0b18104c">GetInputSlot</a>(0));</div><div class="line"><a name="l02260"></a><span class="lineno"> 2260</span>&#160;    <span class="comment">// Use the padding to calculate the new output tensor shape</span></div><div class="line"><a name="l02261"></a><span class="lineno"> 2261</span>&#160;    <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> outputTensorInfo = <a class="code" href="namespacearmnn_tf_parser.xhtml#a9c18860db8b032de579c5ad94cbae5d0">CalculatePaddedOutputTensorInfo</a>(inputTensorInfo, padList);</div><div class="line"><a name="l02262"></a><span class="lineno"> 2262</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="l02263"></a><span class="lineno"> 2263</span>&#160;    <span class="keywordflow">return</span> std::make_unique&lt;SingleLayerParsedTfOperation&gt;(<span class="keyword">this</span>, nodeDef, layer);</div><div class="line"><a name="l02264"></a><span class="lineno"> 2264</span>&#160;}</div><div class="line"><a name="l02265"></a><span class="lineno"> 2265</span>&#160;</div><div class="line"><a name="l02266"></a><span class="lineno"><a class="line" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a93ff9eb48ac9fb398fdce42871c2990e"> 2266</a></span>&#160;<a class="code" href="namespacearmnn_tf_parser.xhtml#aa36bf288c19fe35767bb6e059636f405">ParsedTfOperationPtr</a> <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a93ff9eb48ac9fb398fdce42871c2990e">ITfParser::TfParserImpl::ParseConcat</a>(<span class="keyword">const</span> tensorflow::NodeDef&amp; nodeDef,</div><div class="line"><a name="l02267"></a><span class="lineno"> 2267</span>&#160;                                                         <span class="keyword">const</span> tensorflow::GraphDef&amp; graphDef)</div><div class="line"><a name="l02268"></a><span class="lineno"> 2268</span>&#160;{</div><div class="line"><a name="l02269"></a><span class="lineno"> 2269</span>&#160;    <a class="code" href="namespacearmnn.xhtml#a44affeeb090c3c6a3062830562672e84">IgnoreUnused</a>(graphDef);</div><div class="line"><a name="l02270"></a><span class="lineno"> 2270</span>&#160;    std::vector&lt;OutputOfConstNodeDef&gt; nodes = <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a9e7a394f59e8d223a79e3db798803c1c">GetTfInputNodes</a>(nodeDef);</div><div class="line"><a name="l02271"></a><span class="lineno"> 2271</span>&#160;</div><div class="line"><a name="l02272"></a><span class="lineno"> 2272</span>&#160;    <span class="comment">// In tensorflow, we have the last input of the Concat layer as the axis for concatenation.</span></div><div class="line"><a name="l02273"></a><span class="lineno"> 2273</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> numInputs = <span class="keyword">static_cast&lt;</span><span class="keywordtype">unsigned</span> <span class="keywordtype">int</span><span class="keyword">&gt;</span>(nodes.size());</div><div class="line"><a name="l02274"></a><span class="lineno"> 2274</span>&#160;</div><div class="line"><a name="l02275"></a><span class="lineno"> 2275</span>&#160;    std::vector&lt;OutputOfParsedTfOperation&gt; inputs = <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#ae295ca8b7d19bb5e6db3f93bd4561ee0">GetInputParsedTfOperationsChecked</a>(nodeDef, numInputs);</div><div class="line"><a name="l02276"></a><span class="lineno"> 2276</span>&#160;</div><div class="line"><a name="l02277"></a><span class="lineno"> 2277</span>&#160;    <span class="comment">// Constant tensor index</span></div><div class="line"><a name="l02278"></a><span class="lineno"> 2278</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> index = <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a82bb92947dc9e0f04d4242910d6cbc65">GetConstInputIndex</a>(inputs);</div><div class="line"><a name="l02279"></a><span class="lineno"> 2279</span>&#160;    <span class="comment">// Get the axis tensor data</span></div><div class="line"><a name="l02280"></a><span class="lineno"> 2280</span>&#160;    ParsedConstTfOperation&lt;int32_t&gt;* shapeNode =</div><div class="line"><a name="l02281"></a><span class="lineno"> 2281</span>&#160;            PolymorphicDowncast&lt;ParsedConstTfOperation&lt;int32_t&gt;*&gt;(inputs[index].m_IndexedValue);</div><div class="line"><a name="l02282"></a><span class="lineno"> 2282</span>&#160;</div><div class="line"><a name="l02283"></a><span class="lineno"> 2283</span>&#160;    std::vector&lt;int32_t&gt; axisTensorData;</div><div class="line"><a name="l02284"></a><span class="lineno"> 2284</span>&#160;    shapeNode-&gt;GetConstTensor(axisTensorData);</div><div class="line"><a name="l02285"></a><span class="lineno"> 2285</span>&#160;</div><div class="line"><a name="l02286"></a><span class="lineno"> 2286</span>&#160;    <span class="comment">// This concatDim indicates the data format: 3 is the NHWC, 1 is the NCHW.</span></div><div class="line"><a name="l02287"></a><span class="lineno"> 2287</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> concatDim = <span class="keyword">static_cast&lt;</span><span class="keywordtype">unsigned</span> <span class="keywordtype">int</span><span class="keyword">&gt;</span>(axisTensorData[0]);</div><div class="line"><a name="l02288"></a><span class="lineno"> 2288</span>&#160;</div><div class="line"><a name="l02289"></a><span class="lineno"> 2289</span>&#160;    <span class="comment">// Armnn supports concatenation along the channel dimension for data formats NHWC and NCHW.</span></div><div class="line"><a name="l02290"></a><span class="lineno"> 2290</span>&#160;    <span class="keywordflow">if</span> (concatDim == 0 || concatDim == 2)</div><div class="line"><a name="l02291"></a><span class="lineno"> 2291</span>&#160;    {</div><div class="line"><a name="l02292"></a><span class="lineno"> 2292</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="l02293"></a><span class="lineno"> 2293</span>&#160;                fmt::format(<span class="stringliteral">&quot;Dimension {} for concatenation is not supported by Armnn. &quot;</span></div><div class="line"><a name="l02294"></a><span class="lineno"> 2294</span>&#160;                            <span class="stringliteral">&quot;Node {} {}&quot;</span>,</div><div class="line"><a name="l02295"></a><span class="lineno"> 2295</span>&#160;                            concatDim,</div><div class="line"><a name="l02296"></a><span class="lineno"> 2296</span>&#160;                            nodeDef.name(),</div><div class="line"><a name="l02297"></a><span class="lineno"> 2297</span>&#160;                            <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l02298"></a><span class="lineno"> 2298</span>&#160;    }</div><div class="line"><a name="l02299"></a><span class="lineno"> 2299</span>&#160;</div><div class="line"><a name="l02300"></a><span class="lineno"> 2300</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> supportedNumDims = 4;</div><div class="line"><a name="l02301"></a><span class="lineno"> 2301</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> numConcatViews = numInputs - 1;</div><div class="line"><a name="l02302"></a><span class="lineno"> 2302</span>&#160;    <a class="code" href="structarmnn_1_1_origins_descriptor.xhtml">OriginsDescriptor</a> concatDescriptor(static_cast&lt;uint32_t&gt;(numConcatViews), supportedNumDims);</div><div class="line"><a name="l02303"></a><span class="lineno"> 2303</span>&#160;    concatDescriptor.<a class="code" href="structarmnn_1_1_origins_descriptor.xhtml#a5b192c5fcd96a0f75542524cf646b355">SetConcatAxis</a>(concatDim);</div><div class="line"><a name="l02304"></a><span class="lineno"> 2304</span>&#160;    <a class="code" href="classarmnn_1_1_tensor_shape.xhtml">TensorShape</a> mergeDims(supportedNumDims);</div><div class="line"><a name="l02305"></a><span class="lineno"> 2305</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> mergeDim = 0;</div><div class="line"><a name="l02306"></a><span class="lineno"> 2306</span>&#160;    <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> viewIndex = 0; viewIndex &lt; numConcatViews; ++viewIndex)</div><div class="line"><a name="l02307"></a><span class="lineno"> 2307</span>&#160;    {</div><div class="line"><a name="l02308"></a><span class="lineno"> 2308</span>&#160;        <span class="comment">// Need to double check whether it should be</span></div><div class="line"><a name="l02309"></a><span class="lineno"> 2309</span>&#160;        <a class="code" href="classarmnn_1_1_i_output_slot.xhtml">IOutputSlot</a>&amp; inputSlot = inputs[viewIndex].m_IndexedValue-&gt;ResolveArmnnOutputSlot(inputs[viewIndex].m_Index);</div><div class="line"><a name="l02310"></a><span class="lineno"> 2310</span>&#160;        <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> inputTensorInfo = inputSlot.<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#a9943775a364fc4ab53b85ac88f311886">GetTensorInfo</a>();</div><div class="line"><a name="l02311"></a><span class="lineno"> 2311</span>&#160;</div><div class="line"><a name="l02312"></a><span class="lineno"> 2312</span>&#160;        <span class="comment">// Double check dimensions of the tensors</span></div><div class="line"><a name="l02313"></a><span class="lineno"> 2313</span>&#160;        <span class="keywordflow">if</span> (inputTensorInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a157e27d41e9f6b21f0d3c025fa47dc24">GetNumDimensions</a>() != supportedNumDims)</div><div class="line"><a name="l02314"></a><span class="lineno"> 2314</span>&#160;        {</div><div class="line"><a name="l02315"></a><span class="lineno"> 2315</span>&#160;            <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_parse_exception.xhtml">armnn::ParseException</a>(</div><div class="line"><a name="l02316"></a><span class="lineno"> 2316</span>&#160;                    fmt::format(<span class="stringliteral">&quot;The number of dimensions: {} for input tensors of the &quot;</span></div><div class="line"><a name="l02317"></a><span class="lineno"> 2317</span>&#160;                                <span class="stringliteral">&quot;concatenation op should be {} {}&quot;</span>,</div><div class="line"><a name="l02318"></a><span class="lineno"> 2318</span>&#160;                                inputTensorInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a157e27d41e9f6b21f0d3c025fa47dc24">GetNumDimensions</a>(),</div><div class="line"><a name="l02319"></a><span class="lineno"> 2319</span>&#160;                                supportedNumDims,</div><div class="line"><a name="l02320"></a><span class="lineno"> 2320</span>&#160;                                <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l02321"></a><span class="lineno"> 2321</span>&#160;        }</div><div class="line"><a name="l02322"></a><span class="lineno"> 2322</span>&#160;</div><div class="line"><a name="l02323"></a><span class="lineno"> 2323</span>&#160;        <span class="comment">// Copy the input tensor shape to mergeDimSizes and initialize the view origin coordinates for the current input</span></div><div class="line"><a name="l02324"></a><span class="lineno"> 2324</span>&#160;        mergeDims = inputTensorInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a8b5d0f8a24e9d9238f412260a552acf8">GetShape</a>();</div><div class="line"><a name="l02325"></a><span class="lineno"> 2325</span>&#160;        <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>* viewOrigin = <span class="keyword">const_cast&lt;</span><span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>*<span class="keyword">&gt;</span>(concatDescriptor.<a class="code" href="structarmnn_1_1_origins_descriptor.xhtml#ab78e6fe963508c1ac5c00d04bb3361a3">GetViewOrigin</a>(viewIndex));</div><div class="line"><a name="l02326"></a><span class="lineno"> 2326</span>&#160;        std::fill(viewOrigin, viewOrigin + supportedNumDims, 0);</div><div class="line"><a name="l02327"></a><span class="lineno"> 2327</span>&#160;</div><div class="line"><a name="l02328"></a><span class="lineno"> 2328</span>&#160;        <span class="comment">// Update the view origin coordinates and the merge dimension value</span></div><div class="line"><a name="l02329"></a><span class="lineno"> 2329</span>&#160;        concatDescriptor.<a class="code" href="structarmnn_1_1_origins_descriptor.xhtml#a2b125117aa61f9baf3a9cb8658aa61a2">SetViewOriginCoord</a>(viewIndex, concatDim, mergeDim);</div><div class="line"><a name="l02330"></a><span class="lineno"> 2330</span>&#160;        mergeDim += mergeDims[concatDim];</div><div class="line"><a name="l02331"></a><span class="lineno"> 2331</span>&#160;    }</div><div class="line"><a name="l02332"></a><span class="lineno"> 2332</span>&#160;</div><div class="line"><a name="l02333"></a><span class="lineno"> 2333</span>&#160;    <span class="comment">// Update the output shape</span></div><div class="line"><a name="l02334"></a><span class="lineno"> 2334</span>&#160;    mergeDims[concatDim] = mergeDim;</div><div class="line"><a name="l02335"></a><span class="lineno"> 2335</span>&#160;    <a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml">armnn::IConnectableLayer</a> *layer = <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a2db3ae8d422f17d455e0ba0cb6291d2a">m_Network</a>-&gt;AddConcatLayer(concatDescriptor, nodeDef.name().c_str());</div><div class="line"><a name="l02336"></a><span class="lineno"> 2336</span>&#160;</div><div class="line"><a name="l02337"></a><span class="lineno"> 2337</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>(<a class="code" href="classarmnn_1_1_tensor_info.xhtml">armnn::TensorInfo</a>(mergeDims, DataType::Float32));</div><div class="line"><a name="l02338"></a><span class="lineno"> 2338</span>&#160;</div><div class="line"><a name="l02339"></a><span class="lineno"> 2339</span>&#160;    <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> viewIndex = 0; viewIndex &lt; numConcatViews; ++viewIndex)</div><div class="line"><a name="l02340"></a><span class="lineno"> 2340</span>&#160;    {</div><div class="line"><a name="l02341"></a><span class="lineno"> 2341</span>&#160;        <a class="code" href="classarmnn_1_1_i_output_slot.xhtml">IOutputSlot</a>&amp; inputSlot = inputs[viewIndex].m_IndexedValue-&gt;ResolveArmnnOutputSlot(inputs[viewIndex].m_Index);</div><div class="line"><a name="l02342"></a><span class="lineno"> 2342</span>&#160;        inputSlot.<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#ac1835f8756a9f03c02fcf9664e3a0fce">Connect</a>(layer-&gt;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml#a6ec9e0eb66d7d6a01240492a0b18104c">GetInputSlot</a>(viewIndex));</div><div class="line"><a name="l02343"></a><span class="lineno"> 2343</span>&#160;    }</div><div class="line"><a name="l02344"></a><span class="lineno"> 2344</span>&#160;</div><div class="line"><a name="l02345"></a><span class="lineno"> 2345</span>&#160;    <span class="keywordflow">return</span> std::make_unique&lt;SingleLayerParsedTfOperation&gt;(<span class="keyword">this</span>, nodeDef, layer);</div><div class="line"><a name="l02346"></a><span class="lineno"> 2346</span>&#160;}</div><div class="line"><a name="l02347"></a><span class="lineno"> 2347</span>&#160;</div><div class="line"><a name="l02348"></a><span class="lineno"><a class="line" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a1b1a337a431d198f68de42bde32ce2f1"> 2348</a></span>&#160;<a class="code" href="namespacearmnn_tf_parser.xhtml#aa36bf288c19fe35767bb6e059636f405">ParsedTfOperationPtr</a> <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a1b1a337a431d198f68de42bde32ce2f1">ITfParser::TfParserImpl::ParseShape</a>(<span class="keyword">const</span> tensorflow::NodeDef&amp; nodeDef,</div><div class="line"><a name="l02349"></a><span class="lineno"> 2349</span>&#160;    <span class="keyword">const</span> tensorflow::GraphDef&amp; graphDef)</div><div class="line"><a name="l02350"></a><span class="lineno"> 2350</span>&#160;{</div><div class="line"><a name="l02351"></a><span class="lineno"> 2351</span>&#160;    <a class="code" href="namespacearmnn.xhtml#a44affeeb090c3c6a3062830562672e84">IgnoreUnused</a>(graphDef);</div><div class="line"><a name="l02352"></a><span class="lineno"> 2352</span>&#160;    <span class="comment">// Note: the Shape layer is handled in a special way, because:</span></div><div class="line"><a name="l02353"></a><span class="lineno"> 2353</span>&#160;    <span class="comment">//        1. ARMNN doesn&#39;t support int32 tensors which it outputs.</span></div><div class="line"><a name="l02354"></a><span class="lineno"> 2354</span>&#160;    <span class="comment">//        2. ARMNN works with statically shaped tensors which are known at parse time.</span></div><div class="line"><a name="l02355"></a><span class="lineno"> 2355</span>&#160;    <span class="comment">//        3. because of 1. and 2. we treat the output of Shape as a temporary const int32</span></div><div class="line"><a name="l02356"></a><span class="lineno"> 2356</span>&#160;    <span class="comment">//           tensor which may be used as an input to other ops, most likely a Reshape.</span></div><div class="line"><a name="l02357"></a><span class="lineno"> 2357</span>&#160;</div><div class="line"><a name="l02358"></a><span class="lineno"> 2358</span>&#160;    <span class="keyword">const</span> <a class="code" href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6">tensorflow::DataType</a> tfDataType = ReadMandatoryNodeTypeAttribute(nodeDef, <span class="stringliteral">&quot;out_type&quot;</span>);</div><div class="line"><a name="l02359"></a><span class="lineno"> 2359</span>&#160;    <span class="keywordflow">if</span> (tfDataType != tensorflow::DT_INT32)</div><div class="line"><a name="l02360"></a><span class="lineno"> 2360</span>&#160;    {</div><div class="line"><a name="l02361"></a><span class="lineno"> 2361</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="l02362"></a><span class="lineno"> 2362</span>&#160;            fmt::format(<span class="stringliteral">&quot;Armnn only supports DT_INT32 as out_type. Got {} for Node {} {}&quot;</span>,</div><div class="line"><a name="l02363"></a><span class="lineno"> 2363</span>&#160;                        tensorflow::DataType_Name(tfDataType),</div><div class="line"><a name="l02364"></a><span class="lineno"> 2364</span>&#160;                        nodeDef.name(),</div><div class="line"><a name="l02365"></a><span class="lineno"> 2365</span>&#160;                        <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l02366"></a><span class="lineno"> 2366</span>&#160;    }</div><div class="line"><a name="l02367"></a><span class="lineno"> 2367</span>&#160;</div><div class="line"><a name="l02368"></a><span class="lineno"> 2368</span>&#160;    <span class="keyword">const</span> std::vector&lt;OutputOfParsedTfOperation&gt; inputs = <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#ae295ca8b7d19bb5e6db3f93bd4561ee0">GetInputParsedTfOperationsChecked</a>(nodeDef, 1);</div><div class="line"><a name="l02369"></a><span class="lineno"> 2369</span>&#160;    <a class="code" href="classarmnn_1_1_i_output_slot.xhtml">IOutputSlot</a>&amp; prevLayerOutputSlot = inputs[0].m_IndexedValue-&gt;ResolveArmnnOutputSlot(inputs[0].m_Index);</div><div class="line"><a name="l02370"></a><span class="lineno"> 2370</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a>&amp; prevLayerTensorInfo = prevLayerOutputSlot.<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#a9943775a364fc4ab53b85ac88f311886">GetTensorInfo</a>();</div><div class="line"><a name="l02371"></a><span class="lineno"> 2371</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> prevLayerDimensions = prevLayerTensorInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a157e27d41e9f6b21f0d3c025fa47dc24">GetNumDimensions</a>();</div><div class="line"><a name="l02372"></a><span class="lineno"> 2372</span>&#160;</div><div class="line"><a name="l02373"></a><span class="lineno"> 2373</span>&#160;    std::vector&lt;int32_t&gt; shapeTensorData;</div><div class="line"><a name="l02374"></a><span class="lineno"> 2374</span>&#160;    shapeTensorData.reserve(prevLayerDimensions);</div><div class="line"><a name="l02375"></a><span class="lineno"> 2375</span>&#160;</div><div class="line"><a name="l02376"></a><span class="lineno"> 2376</span>&#160;    <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i=0; i&lt;prevLayerDimensions; ++i)</div><div class="line"><a name="l02377"></a><span class="lineno"> 2377</span>&#160;    {</div><div class="line"><a name="l02378"></a><span class="lineno"> 2378</span>&#160;        shapeTensorData.push_back(static_cast&lt;int32_t&gt;(prevLayerTensorInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a8b5d0f8a24e9d9238f412260a552acf8">GetShape</a>()[i]));</div><div class="line"><a name="l02379"></a><span class="lineno"> 2379</span>&#160;    }</div><div class="line"><a name="l02380"></a><span class="lineno"> 2380</span>&#160;</div><div class="line"><a name="l02381"></a><span class="lineno"> 2381</span>&#160;    <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> shapeTensorInfo(1, &amp;prevLayerDimensions, DataType::Signed32);</div><div class="line"><a name="l02382"></a><span class="lineno"> 2382</span>&#160;</div><div class="line"><a name="l02383"></a><span class="lineno"> 2383</span>&#160;    <span class="keywordflow">return</span> std::make_unique&lt;ParsedConstTfOperation&lt;int32_t&gt;&gt;(<span class="keyword">this</span>,</div><div class="line"><a name="l02384"></a><span class="lineno"> 2384</span>&#160;                                                             nodeDef,</div><div class="line"><a name="l02385"></a><span class="lineno"> 2385</span>&#160;                                                             &amp;shapeTensorData[0],</div><div class="line"><a name="l02386"></a><span class="lineno"> 2386</span>&#160;                                                             shapeTensorInfo);</div><div class="line"><a name="l02387"></a><span class="lineno"> 2387</span>&#160;}</div><div class="line"><a name="l02388"></a><span class="lineno"> 2388</span>&#160;</div><div class="line"><a name="l02389"></a><span class="lineno"><a class="line" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a7278a1a8d099cde1417ca4f7e3c2ef9c"> 2389</a></span>&#160;<a class="code" href="namespacearmnn_tf_parser.xhtml#aa36bf288c19fe35767bb6e059636f405">ParsedTfOperationPtr</a> <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a7278a1a8d099cde1417ca4f7e3c2ef9c">ITfParser::TfParserImpl::ParseReshape</a>(<span class="keyword">const</span> tensorflow::NodeDef&amp; nodeDef,</div><div class="line"><a name="l02390"></a><span class="lineno"> 2390</span>&#160;    <span class="keyword">const</span> tensorflow::GraphDef&amp; graphDef)</div><div class="line"><a name="l02391"></a><span class="lineno"> 2391</span>&#160;{</div><div class="line"><a name="l02392"></a><span class="lineno"> 2392</span>&#160;    <a class="code" href="namespacearmnn.xhtml#a44affeeb090c3c6a3062830562672e84">IgnoreUnused</a>(graphDef);</div><div class="line"><a name="l02393"></a><span class="lineno"> 2393</span>&#160;    std::vector&lt;OutputOfParsedTfOperation&gt; inputs = <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#ae295ca8b7d19bb5e6db3f93bd4561ee0">GetInputParsedTfOperationsChecked</a>(nodeDef, 2);</div><div class="line"><a name="l02394"></a><span class="lineno"> 2394</span>&#160;    <a class="code" href="classarmnn_tf_parser_1_1_i_tf_parser.xhtml#a81cd010ead68e4d96e6cb28255143f49">ParsedTfOperation</a>* inputNode = inputs[0].m_IndexedValue;</div><div class="line"><a name="l02395"></a><span class="lineno"> 2395</span>&#160;</div><div class="line"><a name="l02396"></a><span class="lineno"> 2396</span>&#160;    <span class="keywordflow">if</span> (!HasParsedConstTensor&lt;int32_t&gt;(inputs[1].m_IndexedValue-&gt;GetNode().name()))</div><div class="line"><a name="l02397"></a><span class="lineno"> 2397</span>&#160;    {</div><div class="line"><a name="l02398"></a><span class="lineno"> 2398</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="l02399"></a><span class="lineno"> 2399</span>&#160;            fmt::format(<span class="stringliteral">&quot;ArmNN only supports Reshape layers with constant shapes. &quot;</span></div><div class="line"><a name="l02400"></a><span class="lineno"> 2400</span>&#160;                        <span class="stringliteral">&quot;Input {} Node {} {}&quot;</span>,</div><div class="line"><a name="l02401"></a><span class="lineno"> 2401</span>&#160;                        inputs[1].m_IndexedValue-&gt;GetNode().name(),</div><div class="line"><a name="l02402"></a><span class="lineno"> 2402</span>&#160;                        nodeDef.name(),</div><div class="line"><a name="l02403"></a><span class="lineno"> 2403</span>&#160;                        <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l02404"></a><span class="lineno"> 2404</span>&#160;    }</div><div class="line"><a name="l02405"></a><span class="lineno"> 2405</span>&#160;    ParsedConstTfOperation&lt;int32_t&gt;* shapeNode =</div><div class="line"><a name="l02406"></a><span class="lineno"> 2406</span>&#160;        PolymorphicDowncast&lt;ParsedConstTfOperation&lt;int32_t&gt;*&gt;(inputs[1].m_IndexedValue);</div><div class="line"><a name="l02407"></a><span class="lineno"> 2407</span>&#160;</div><div class="line"><a name="l02408"></a><span class="lineno"> 2408</span>&#160;    <a class="code" href="classarmnn_1_1_i_output_slot.xhtml">armnn::IOutputSlot</a>&amp; prevLayerOutputSlot = inputNode-&gt;ResolveArmnnOutputSlot(inputs[0].m_Index);</div><div class="line"><a name="l02409"></a><span class="lineno"> 2409</span>&#160;    <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> inputTensorInfo = prevLayerOutputSlot.GetTensorInfo();</div><div class="line"><a name="l02410"></a><span class="lineno"> 2410</span>&#160;</div><div class="line"><a name="l02411"></a><span class="lineno"> 2411</span>&#160;    std::vector&lt;int32_t&gt; shapeTensorData;</div><div class="line"><a name="l02412"></a><span class="lineno"> 2412</span>&#160;    <a class="code" href="classarmnn_1_1_const_tensor.xhtml">ConstTensor</a> shapeTensor = shapeNode-&gt;GetConstTensor(shapeTensorData);</div><div class="line"><a name="l02413"></a><span class="lineno"> 2413</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> outputTensorInfo = PrepareReshape(inputTensorInfo, shapeTensorData);</div><div class="line"><a name="l02414"></a><span class="lineno"> 2414</span>&#160;</div><div class="line"><a name="l02415"></a><span class="lineno"> 2415</span>&#160;    <a class="code" href="classarmnn_1_1_tensor_shape.xhtml">TensorShape</a> targetShape = outputTensorInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a8b5d0f8a24e9d9238f412260a552acf8">GetShape</a>();</div><div class="line"><a name="l02416"></a><span class="lineno"> 2416</span>&#160;    <a class="code" href="structarmnn_1_1_reshape_descriptor.xhtml">ReshapeDescriptor</a> reshapeDesc;</div><div class="line"><a name="l02417"></a><span class="lineno"> 2417</span>&#160;    reshapeDesc.<a class="code" href="structarmnn_1_1_reshape_descriptor.xhtml#a1178f4dafdda81f59c15145ec327f7d9">m_TargetShape</a> = targetShape;</div><div class="line"><a name="l02418"></a><span class="lineno"> 2418</span>&#160;</div><div class="line"><a name="l02419"></a><span class="lineno"> 2419</span>&#160;    <a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml">IConnectableLayer</a>* layer = <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a2db3ae8d422f17d455e0ba0cb6291d2a">m_Network</a>-&gt;AddReshapeLayer(reshapeDesc, nodeDef.name().c_str());</div><div class="line"><a name="l02420"></a><span class="lineno"> 2420</span>&#160;    prevLayerOutputSlot.Connect(layer-&gt;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml#a6ec9e0eb66d7d6a01240492a0b18104c">GetInputSlot</a>(0));</div><div class="line"><a name="l02421"></a><span class="lineno"> 2421</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="l02422"></a><span class="lineno"> 2422</span>&#160;</div><div class="line"><a name="l02423"></a><span class="lineno"> 2423</span>&#160;    <span class="keywordflow">return</span> std::make_unique&lt;SingleLayerParsedTfOperation&gt;(<span class="keyword">this</span>, nodeDef, layer);</div><div class="line"><a name="l02424"></a><span class="lineno"> 2424</span>&#160;}</div><div class="line"><a name="l02425"></a><span class="lineno"> 2425</span>&#160;</div><div class="line"><a name="l02426"></a><span class="lineno"><a class="line" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#acce71942f3e1ccf87e85f3b4819e2691"> 2426</a></span>&#160;<a class="code" href="namespacearmnn_tf_parser.xhtml#aa36bf288c19fe35767bb6e059636f405">ParsedTfOperationPtr</a> <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#acce71942f3e1ccf87e85f3b4819e2691">ITfParser::TfParserImpl::ParseResizeBilinear</a>(<span class="keyword">const</span> tensorflow::NodeDef&amp; nodeDef,</div><div class="line"><a name="l02427"></a><span class="lineno"> 2427</span>&#160;    <span class="keyword">const</span> tensorflow::GraphDef&amp; graphDef)</div><div class="line"><a name="l02428"></a><span class="lineno"> 2428</span>&#160;{</div><div class="line"><a name="l02429"></a><span class="lineno"> 2429</span>&#160;    <a class="code" href="namespacearmnn.xhtml#a44affeeb090c3c6a3062830562672e84">IgnoreUnused</a>(graphDef);</div><div class="line"><a name="l02430"></a><span class="lineno"> 2430</span>&#160;    std::vector&lt;OutputOfParsedTfOperation&gt; inputs = <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#ae295ca8b7d19bb5e6db3f93bd4561ee0">GetInputParsedTfOperationsChecked</a>(nodeDef, 2);</div><div class="line"><a name="l02431"></a><span class="lineno"> 2431</span>&#160;</div><div class="line"><a name="l02432"></a><span class="lineno"> 2432</span>&#160;    <span class="keywordflow">if</span> (!HasParsedConstTensor&lt;int32_t&gt;(inputs[1].m_IndexedValue-&gt;GetNode().name()))</div><div class="line"><a name="l02433"></a><span class="lineno"> 2433</span>&#160;    {</div><div class="line"><a name="l02434"></a><span class="lineno"> 2434</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="l02435"></a><span class="lineno"> 2435</span>&#160;            fmt::format(<span class="stringliteral">&quot;ArmNN only supports ResizeBilinear layers with constant sizes. &quot;</span></div><div class="line"><a name="l02436"></a><span class="lineno"> 2436</span>&#160;                        <span class="stringliteral">&quot;Input {}. Node {} {}&quot;</span>,</div><div class="line"><a name="l02437"></a><span class="lineno"> 2437</span>&#160;                        inputs[1].m_IndexedValue-&gt;GetNode().name(),</div><div class="line"><a name="l02438"></a><span class="lineno"> 2438</span>&#160;                        nodeDef.name(),</div><div class="line"><a name="l02439"></a><span class="lineno"> 2439</span>&#160;                        <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l02440"></a><span class="lineno"> 2440</span>&#160;    }</div><div class="line"><a name="l02441"></a><span class="lineno"> 2441</span>&#160;    ParsedConstTfOperation&lt;int32_t&gt;* sizeNode =</div><div class="line"><a name="l02442"></a><span class="lineno"> 2442</span>&#160;        PolymorphicDowncast&lt;ParsedConstTfOperation&lt;int32_t&gt;*&gt;(inputs[1].m_IndexedValue);</div><div class="line"><a name="l02443"></a><span class="lineno"> 2443</span>&#160;</div><div class="line"><a name="l02444"></a><span class="lineno"> 2444</span>&#160;    <span class="comment">// Checks the align_corners attribute is not set.</span></div><div class="line"><a name="l02445"></a><span class="lineno"> 2445</span>&#160;    <span class="keywordflow">if</span> (ReadOptionalNodeBoolAttribute(nodeDef, <span class="stringliteral">&quot;align_corners&quot;</span>, <span class="keyword">false</span>))</div><div class="line"><a name="l02446"></a><span class="lineno"> 2446</span>&#160;    {</div><div class="line"><a name="l02447"></a><span class="lineno"> 2447</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="l02448"></a><span class="lineno"> 2448</span>&#160;            fmt::format(<span class="stringliteral">&quot;ArmNN only supports ResizeBilinear layers with align_corners set to false. &quot;</span></div><div class="line"><a name="l02449"></a><span class="lineno"> 2449</span>&#160;                        <span class="stringliteral">&quot;Node {} {}&quot;</span>,</div><div class="line"><a name="l02450"></a><span class="lineno"> 2450</span>&#160;                        nodeDef.name(),</div><div class="line"><a name="l02451"></a><span class="lineno"> 2451</span>&#160;                        <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l02452"></a><span class="lineno"> 2452</span>&#160;    }</div><div class="line"><a name="l02453"></a><span class="lineno"> 2453</span>&#160;</div><div class="line"><a name="l02454"></a><span class="lineno"> 2454</span>&#160;    <span class="comment">// Data for the parsed tensor args (size) must be stored locally.</span></div><div class="line"><a name="l02455"></a><span class="lineno"> 2455</span>&#160;    std::vector&lt;int32_t&gt; sizeTensorData;</div><div class="line"><a name="l02456"></a><span class="lineno"> 2456</span>&#160;    <a class="code" href="classarmnn_1_1_const_tensor.xhtml">ConstTensor</a> sizeTensor = sizeNode-&gt;GetConstTensor(sizeTensorData);</div><div class="line"><a name="l02457"></a><span class="lineno"> 2457</span>&#160;</div><div class="line"><a name="l02458"></a><span class="lineno"> 2458</span>&#160;    <span class="comment">// The descriptor only has target height and width attributes, which we get from the size tensor.</span></div><div class="line"><a name="l02459"></a><span class="lineno"> 2459</span>&#160;    <a class="code" href="structarmnn_1_1_resize_descriptor.xhtml">ResizeDescriptor</a> desc;</div><div class="line"><a name="l02460"></a><span class="lineno"> 2460</span>&#160;    desc.<a class="code" href="structarmnn_1_1_resize_descriptor.xhtml#a869254cb56968986a78a79e1d6d4a86b">m_Method</a>       = <a class="code" href="namespacearmnn.xhtml#a9a2af2f8c4af4f9efa8e79417d505ac4aaf17c98bbd83c27d6426d2ff3fa81d7f">armnn::ResizeMethod::Bilinear</a>;</div><div class="line"><a name="l02461"></a><span class="lineno"> 2461</span>&#160;    desc.<a class="code" href="structarmnn_1_1_resize_descriptor.xhtml#a46c3fa15c46fb0d1dcdc24d0ea5cb5cd">m_TargetHeight</a> = <span class="keyword">static_cast&lt;</span>uint32_t<span class="keyword">&gt;</span> (sizeTensorData[0]);</div><div class="line"><a name="l02462"></a><span class="lineno"> 2462</span>&#160;    desc.<a class="code" href="structarmnn_1_1_resize_descriptor.xhtml#adcf5037208faac36c0788239a073f75c">m_TargetWidth</a>  = <span class="keyword">static_cast&lt;</span>uint32_t<span class="keyword">&gt;</span> (sizeTensorData[1]);</div><div class="line"><a name="l02463"></a><span class="lineno"> 2463</span>&#160;    desc.<a class="code" href="structarmnn_1_1_resize_descriptor.xhtml#a6089e1ca91914015777ea780a513131a">m_DataLayout</a>   = <a class="code" href="namespacearmnn.xhtml#ad1d5cce2d9e9a5d61c243e5c989112e0ad066db54b89b0912e7e7c6da51e2da51">armnn::DataLayout::NHWC</a>;</div><div class="line"><a name="l02464"></a><span class="lineno"> 2464</span>&#160;</div><div class="line"><a name="l02465"></a><span class="lineno"> 2465</span>&#160;    <a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml">IConnectableLayer</a>* layer = <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a2db3ae8d422f17d455e0ba0cb6291d2a">m_Network</a>-&gt;AddResizeLayer(desc, nodeDef.name().c_str());</div><div class="line"><a name="l02466"></a><span class="lineno"> 2466</span>&#160;</div><div class="line"><a name="l02467"></a><span class="lineno"> 2467</span>&#160;    <a class="code" href="classarmnn_1_1_i_output_slot.xhtml">IOutputSlot</a>&amp; inputSlot = inputs[0].m_IndexedValue-&gt;ResolveArmnnOutputSlot(inputs[0].m_Index);</div><div class="line"><a name="l02468"></a><span class="lineno"> 2468</span>&#160;    <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> inputTensorInfo = inputSlot.<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#a9943775a364fc4ab53b85ac88f311886">GetTensorInfo</a>();</div><div class="line"><a name="l02469"></a><span class="lineno"> 2469</span>&#160;    <span class="comment">// The input shape is always in BHWC format, this will be swizzled below; for now,</span></div><div class="line"><a name="l02470"></a><span class="lineno"> 2470</span>&#160;    <span class="comment">// get the batch and channels to make up the ArmNN output shape with the target size.</span></div><div class="line"><a name="l02471"></a><span class="lineno"> 2471</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> outBatch = inputTensorInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a8b5d0f8a24e9d9238f412260a552acf8">GetShape</a>()[0];</div><div class="line"><a name="l02472"></a><span class="lineno"> 2472</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> outChannels = inputTensorInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a8b5d0f8a24e9d9238f412260a552acf8">GetShape</a>()[3];</div><div class="line"><a name="l02473"></a><span class="lineno"> 2473</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> outHeight = desc.<a class="code" href="structarmnn_1_1_resize_descriptor.xhtml#a46c3fa15c46fb0d1dcdc24d0ea5cb5cd">m_TargetHeight</a>;</div><div class="line"><a name="l02474"></a><span class="lineno"> 2474</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> outWidth = desc.<a class="code" href="structarmnn_1_1_resize_descriptor.xhtml#adcf5037208faac36c0788239a073f75c">m_TargetWidth</a>;</div><div class="line"><a name="l02475"></a><span class="lineno"> 2475</span>&#160;    <a class="code" href="classarmnn_1_1_tensor_shape.xhtml">TensorShape</a> outShape({outBatch, outHeight, outWidth, outChannels });</div><div class="line"><a name="l02476"></a><span class="lineno"> 2476</span>&#160;    <span class="comment">// The output DataType is always Float32, regardless of the input DataType.</span></div><div class="line"><a name="l02477"></a><span class="lineno"> 2477</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> outputTensorInfo(outShape, <a class="code" href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6a166495adc0d0f53bee6baecc577f5204">armnn::DataType::Float32</a>);</div><div class="line"><a name="l02478"></a><span class="lineno"> 2478</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="l02479"></a><span class="lineno"> 2479</span>&#160;</div><div class="line"><a name="l02480"></a><span class="lineno"> 2480</span>&#160;    inputSlot.<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#ac1835f8756a9f03c02fcf9664e3a0fce">Connect</a>(layer-&gt;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml#a6ec9e0eb66d7d6a01240492a0b18104c">GetInputSlot</a>(0));</div><div class="line"><a name="l02481"></a><span class="lineno"> 2481</span>&#160;</div><div class="line"><a name="l02482"></a><span class="lineno"> 2482</span>&#160;    <span class="keywordflow">return</span> std::make_unique&lt;SingleLayerParsedTfOperation&gt;(<span class="keyword">this</span>, nodeDef, layer);</div><div class="line"><a name="l02483"></a><span class="lineno"> 2483</span>&#160;}</div><div class="line"><a name="l02484"></a><span class="lineno"> 2484</span>&#160;</div><div class="line"><a name="l02485"></a><span class="lineno"><a class="line" href="namespacearmnn_tf_parser.xhtml#a6e06adf62d53562032e738b89f3eb37c"> 2485</a></span>&#160;<a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> <a class="code" href="namespacearmnn_tf_parser.xhtml#a6e06adf62d53562032e738b89f3eb37c">OutputShapeOfSqueeze</a>(<span class="keyword">const</span> tensorflow::NodeDef&amp; nodeDef, <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> inputTensorInfo)</div><div class="line"><a name="l02486"></a><span class="lineno"> 2486</span>&#160;{</div><div class="line"><a name="l02487"></a><span class="lineno"> 2487</span>&#160;    <a class="code" href="_assert_8hpp.xhtml#a5698be69cbd5dfe6c28fcd9867e8cbed">ARMNN_ASSERT</a>(nodeDef.op() == <span class="stringliteral">&quot;Squeeze&quot;</span>);</div><div class="line"><a name="l02488"></a><span class="lineno"> 2488</span>&#160;    <a class="code" href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6">tensorflow::DataType</a> tfDataType = ReadMandatoryNodeTypeAttribute(nodeDef, <span class="stringliteral">&quot;T&quot;</span>);</div><div class="line"><a name="l02489"></a><span class="lineno"> 2489</span>&#160;</div><div class="line"><a name="l02490"></a><span class="lineno"> 2490</span>&#160;    <a class="code" href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6">DataType</a> type;</div><div class="line"><a name="l02491"></a><span class="lineno"> 2491</span>&#160;    <span class="keywordflow">if</span> (tfDataType == tensorflow::DT_FLOAT)</div><div class="line"><a name="l02492"></a><span class="lineno"> 2492</span>&#160;    {</div><div class="line"><a name="l02493"></a><span class="lineno"> 2493</span>&#160;        type = DataType::Float32;</div><div class="line"><a name="l02494"></a><span class="lineno"> 2494</span>&#160;    }</div><div class="line"><a name="l02495"></a><span class="lineno"> 2495</span>&#160;    <span class="keywordflow">else</span> <span class="keywordflow">if</span> (tfDataType == tensorflow::DT_INT32)</div><div class="line"><a name="l02496"></a><span class="lineno"> 2496</span>&#160;    {</div><div class="line"><a name="l02497"></a><span class="lineno"> 2497</span>&#160;        type = DataType::Signed32;</div><div class="line"><a name="l02498"></a><span class="lineno"> 2498</span>&#160;    }</div><div class="line"><a name="l02499"></a><span class="lineno"> 2499</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l02500"></a><span class="lineno"> 2500</span>&#160;    {</div><div class="line"><a name="l02501"></a><span class="lineno"> 2501</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="l02502"></a><span class="lineno"> 2502</span>&#160;            fmt::format(<span class="stringliteral">&quot;Unsupported DataType {} for Squeeze operation {} {}&quot;</span>,</div><div class="line"><a name="l02503"></a><span class="lineno"> 2503</span>&#160;                        tensorflow::DataType_Name(tfDataType),</div><div class="line"><a name="l02504"></a><span class="lineno"> 2504</span>&#160;                        nodeDef.name(),</div><div class="line"><a name="l02505"></a><span class="lineno"> 2505</span>&#160;                        <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l02506"></a><span class="lineno"> 2506</span>&#160;    }</div><div class="line"><a name="l02507"></a><span class="lineno"> 2507</span>&#160;</div><div class="line"><a name="l02508"></a><span class="lineno"> 2508</span>&#160;</div><div class="line"><a name="l02509"></a><span class="lineno"> 2509</span>&#160;    <span class="keywordflow">if</span> (inputTensorInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a157e27d41e9f6b21f0d3c025fa47dc24">GetNumDimensions</a>() &gt; 4)</div><div class="line"><a name="l02510"></a><span class="lineno"> 2510</span>&#160;    {</div><div class="line"><a name="l02511"></a><span class="lineno"> 2511</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="l02512"></a><span class="lineno"> 2512</span>&#160;            fmt::format(<span class="stringliteral">&quot;Unsupported number of dimensions: {} for input shape for Squeeze {} {}&quot;</span>,</div><div class="line"><a name="l02513"></a><span class="lineno"> 2513</span>&#160;                        inputTensorInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a157e27d41e9f6b21f0d3c025fa47dc24">GetNumDimensions</a>(),</div><div class="line"><a name="l02514"></a><span class="lineno"> 2514</span>&#160;                        nodeDef.name(),</div><div class="line"><a name="l02515"></a><span class="lineno"> 2515</span>&#160;                        <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l02516"></a><span class="lineno"> 2516</span>&#160;    }</div><div class="line"><a name="l02517"></a><span class="lineno"> 2517</span>&#160;</div><div class="line"><a name="l02518"></a><span class="lineno"> 2518</span>&#160;    std::vector&lt;uint32_t&gt; squeezeDims = ReadOptionalNodeUint32ListAttribute(nodeDef, <span class="stringliteral">&quot;squeeze_dims&quot;</span>);</div><div class="line"><a name="l02519"></a><span class="lineno"> 2519</span>&#160;    <span class="keyword">static</span> <span class="keyword">const</span> uint32_t dimensionSequence[] = { 0, 1, 2, 3 };</div><div class="line"><a name="l02520"></a><span class="lineno"> 2520</span>&#160;</div><div class="line"><a name="l02521"></a><span class="lineno"> 2521</span>&#160;    <span class="keywordflow">if</span> (squeezeDims.empty())</div><div class="line"><a name="l02522"></a><span class="lineno"> 2522</span>&#160;    {</div><div class="line"><a name="l02523"></a><span class="lineno"> 2523</span>&#160;        squeezeDims.assign(dimensionSequence,</div><div class="line"><a name="l02524"></a><span class="lineno"> 2524</span>&#160;                           dimensionSequence+inputTensorInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a157e27d41e9f6b21f0d3c025fa47dc24">GetNumDimensions</a>());</div><div class="line"><a name="l02525"></a><span class="lineno"> 2525</span>&#160;    }</div><div class="line"><a name="l02526"></a><span class="lineno"> 2526</span>&#160;</div><div class="line"><a name="l02527"></a><span class="lineno"> 2527</span>&#160;    std::vector&lt;uint32_t&gt; outputDims;</div><div class="line"><a name="l02528"></a><span class="lineno"> 2528</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i = 0; i &lt; inputTensorInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a157e27d41e9f6b21f0d3c025fa47dc24">GetNumDimensions</a>(); i++)</div><div class="line"><a name="l02529"></a><span class="lineno"> 2529</span>&#160;    {</div><div class="line"><a name="l02530"></a><span class="lineno"> 2530</span>&#160;        <span class="keywordtype">bool</span> skipSqueeze = (std::find(squeezeDims.begin(), squeezeDims.end(), i) == squeezeDims.end());</div><div class="line"><a name="l02531"></a><span class="lineno"> 2531</span>&#160;        <span class="keyword">auto</span> currentDimension = inputTensorInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a8b5d0f8a24e9d9238f412260a552acf8">GetShape</a>()[i];</div><div class="line"><a name="l02532"></a><span class="lineno"> 2532</span>&#160;        <span class="keywordflow">if</span> (skipSqueeze || currentDimension != 1)</div><div class="line"><a name="l02533"></a><span class="lineno"> 2533</span>&#160;        {</div><div class="line"><a name="l02534"></a><span class="lineno"> 2534</span>&#160;            outputDims.push_back(currentDimension);</div><div class="line"><a name="l02535"></a><span class="lineno"> 2535</span>&#160;        }</div><div class="line"><a name="l02536"></a><span class="lineno"> 2536</span>&#160;    }</div><div class="line"><a name="l02537"></a><span class="lineno"> 2537</span>&#160;</div><div class="line"><a name="l02538"></a><span class="lineno"> 2538</span>&#160;    <span class="keywordflow">if</span> (outputDims.size() &gt; 4)</div><div class="line"><a name="l02539"></a><span class="lineno"> 2539</span>&#160;    {</div><div class="line"><a name="l02540"></a><span class="lineno"> 2540</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="l02541"></a><span class="lineno"> 2541</span>&#160;            fmt::format(<span class="stringliteral">&quot;Unsupported number of dimensions: {} for output shape for Squeeze {} {}&quot;</span>,</div><div class="line"><a name="l02542"></a><span class="lineno"> 2542</span>&#160;                        outputDims.size(),</div><div class="line"><a name="l02543"></a><span class="lineno"> 2543</span>&#160;                        nodeDef.name(),</div><div class="line"><a name="l02544"></a><span class="lineno"> 2544</span>&#160;                        <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l02545"></a><span class="lineno"> 2545</span>&#160;    }</div><div class="line"><a name="l02546"></a><span class="lineno"> 2546</span>&#160;</div><div class="line"><a name="l02547"></a><span class="lineno"> 2547</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>(static_cast&lt;unsigned int&gt;(outputDims.size()),</div><div class="line"><a name="l02548"></a><span class="lineno"> 2548</span>&#160;                                       outputDims.data());</div><div class="line"><a name="l02549"></a><span class="lineno"> 2549</span>&#160;</div><div class="line"><a name="l02550"></a><span class="lineno"> 2550</span>&#160;    <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> outTensorInfo = inputTensorInfo;</div><div class="line"><a name="l02551"></a><span class="lineno"> 2551</span>&#160;    outTensorInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#abe8889e8150beef5fd204b2d87b49298">SetShape</a>(outShape);</div><div class="line"><a name="l02552"></a><span class="lineno"> 2552</span>&#160;    outTensorInfo.SetDataType(type);</div><div class="line"><a name="l02553"></a><span class="lineno"> 2553</span>&#160;</div><div class="line"><a name="l02554"></a><span class="lineno"> 2554</span>&#160;    <span class="keywordflow">return</span> outTensorInfo;</div><div class="line"><a name="l02555"></a><span class="lineno"> 2555</span>&#160;}</div><div class="line"><a name="l02556"></a><span class="lineno"> 2556</span>&#160;</div><div class="line"><a name="l02557"></a><span class="lineno"><a class="line" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#ad0f8f08a9af6b35b3218969adec2a3c3"> 2557</a></span>&#160;<a class="code" href="namespacearmnn_tf_parser.xhtml#aa36bf288c19fe35767bb6e059636f405">ParsedTfOperationPtr</a> <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#ad0f8f08a9af6b35b3218969adec2a3c3">ITfParser::TfParserImpl::ParseSqueeze</a>(<span class="keyword">const</span> tensorflow::NodeDef&amp; nodeDef,</div><div class="line"><a name="l02558"></a><span class="lineno"> 2558</span>&#160;                                                          <span class="keyword">const</span> tensorflow::GraphDef&amp; graphDef)</div><div class="line"><a name="l02559"></a><span class="lineno"> 2559</span>&#160;{</div><div class="line"><a name="l02560"></a><span class="lineno"> 2560</span>&#160;    <a class="code" href="namespacearmnn.xhtml#a44affeeb090c3c6a3062830562672e84">IgnoreUnused</a>(graphDef);</div><div class="line"><a name="l02561"></a><span class="lineno"> 2561</span>&#160;    std::vector&lt;OutputOfParsedTfOperation&gt; inputs = <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#ae295ca8b7d19bb5e6db3f93bd4561ee0">GetInputParsedTfOperationsChecked</a>(nodeDef, 1);</div><div class="line"><a name="l02562"></a><span class="lineno"> 2562</span>&#160;</div><div class="line"><a name="l02563"></a><span class="lineno"> 2563</span>&#160;    <a class="code" href="classarmnn_1_1_i_output_slot.xhtml">IOutputSlot</a>&amp; prevLayerOutputSlot = inputs[0].m_IndexedValue-&gt;ResolveArmnnOutputSlot(inputs[0].m_Index);</div><div class="line"><a name="l02564"></a><span class="lineno"> 2564</span>&#160;    <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> inputTensorInfo = prevLayerOutputSlot.<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#a9943775a364fc4ab53b85ac88f311886">GetTensorInfo</a>();</div><div class="line"><a name="l02565"></a><span class="lineno"> 2565</span>&#160;</div><div class="line"><a name="l02566"></a><span class="lineno"> 2566</span>&#160;    <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> outputInfo;</div><div class="line"><a name="l02567"></a><span class="lineno"> 2567</span>&#160;    outputInfo = <a class="code" href="namespacearmnn_tf_parser.xhtml#a6e06adf62d53562032e738b89f3eb37c">OutputShapeOfSqueeze</a>(nodeDef, inputTensorInfo);</div><div class="line"><a name="l02568"></a><span class="lineno"> 2568</span>&#160;</div><div class="line"><a name="l02569"></a><span class="lineno"> 2569</span>&#160;    <a class="code" href="structarmnn_1_1_reshape_descriptor.xhtml">ReshapeDescriptor</a> reshapeDesc;</div><div class="line"><a name="l02570"></a><span class="lineno"> 2570</span>&#160;    reshapeDesc.<a class="code" href="structarmnn_1_1_reshape_descriptor.xhtml#a1178f4dafdda81f59c15145ec327f7d9">m_TargetShape</a> = outputInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a8b5d0f8a24e9d9238f412260a552acf8">GetShape</a>();</div><div class="line"><a name="l02571"></a><span class="lineno"> 2571</span>&#160;    <a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml">IConnectableLayer</a>* layer = <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a2db3ae8d422f17d455e0ba0cb6291d2a">m_Network</a>-&gt;AddReshapeLayer(reshapeDesc, nodeDef.name().c_str());</div><div class="line"><a name="l02572"></a><span class="lineno"> 2572</span>&#160;    prevLayerOutputSlot.<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#ac1835f8756a9f03c02fcf9664e3a0fce">Connect</a>(layer-&gt;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml#a6ec9e0eb66d7d6a01240492a0b18104c">GetInputSlot</a>(0));</div><div class="line"><a name="l02573"></a><span class="lineno"> 2573</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);</div><div class="line"><a name="l02574"></a><span class="lineno"> 2574</span>&#160;</div><div class="line"><a name="l02575"></a><span class="lineno"> 2575</span>&#160;    <span class="keywordflow">return</span> std::make_unique&lt;SingleLayerParsedTfOperation&gt;(<span class="keyword">this</span>, nodeDef, layer);</div><div class="line"><a name="l02576"></a><span class="lineno"> 2576</span>&#160;}</div><div class="line"><a name="l02577"></a><span class="lineno"> 2577</span>&#160;</div><div class="line"><a name="l02578"></a><span class="lineno"><a class="line" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a2cf6fe0b66ca31d917279ae5d0be39b5"> 2578</a></span>&#160;<a class="code" href="namespacearmnn_tf_parser.xhtml#aa36bf288c19fe35767bb6e059636f405">ParsedTfOperationPtr</a> <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a2cf6fe0b66ca31d917279ae5d0be39b5">ITfParser::TfParserImpl::ParseLrn</a>(<span class="keyword">const</span> tensorflow::NodeDef&amp; nodeDef,</div><div class="line"><a name="l02579"></a><span class="lineno"> 2579</span>&#160;                                                      <span class="keyword">const</span> tensorflow::GraphDef&amp; graphDef)</div><div class="line"><a name="l02580"></a><span class="lineno"> 2580</span>&#160;{</div><div class="line"><a name="l02581"></a><span class="lineno"> 2581</span>&#160;    <a class="code" href="namespacearmnn.xhtml#a44affeeb090c3c6a3062830562672e84">IgnoreUnused</a>(graphDef);</div><div class="line"><a name="l02582"></a><span class="lineno"> 2582</span>&#160;    std::vector&lt;OutputOfParsedTfOperation&gt; inputs = <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#ae295ca8b7d19bb5e6db3f93bd4561ee0">GetInputParsedTfOperationsChecked</a>(nodeDef, 1);</div><div class="line"><a name="l02583"></a><span class="lineno"> 2583</span>&#160;</div><div class="line"><a name="l02584"></a><span class="lineno"> 2584</span>&#160;    <a class="code" href="structarmnn_1_1_normalization_descriptor.xhtml">NormalizationDescriptor</a> normalizationDescriptor;</div><div class="line"><a name="l02585"></a><span class="lineno"> 2585</span>&#160;    normalizationDescriptor.<a class="code" href="structarmnn_1_1_normalization_descriptor.xhtml#a05945f080edf694b631960728b87aadb">m_NormMethodType</a> = NormalizationAlgorithmMethod::LocalBrightness;</div><div class="line"><a name="l02586"></a><span class="lineno"> 2586</span>&#160;    normalizationDescriptor.<a class="code" href="structarmnn_1_1_normalization_descriptor.xhtml#afe1f0f09d49ad2befc01f8789187b7dd">m_NormChannelType</a> = NormalizationAlgorithmChannel::Across;</div><div class="line"><a name="l02587"></a><span class="lineno"> 2587</span>&#160;    normalizationDescriptor.<a class="code" href="structarmnn_1_1_normalization_descriptor.xhtml#a174279be57d7596eeb04c6b7f7510f99">m_Alpha</a> = ReadMandatoryNodeFloatAttribute(nodeDef, <span class="stringliteral">&quot;alpha&quot;</span>);</div><div class="line"><a name="l02588"></a><span class="lineno"> 2588</span>&#160;    normalizationDescriptor.<a class="code" href="structarmnn_1_1_normalization_descriptor.xhtml#a8275d51ef9a584feb95726ea0522f6e5">m_Beta</a> = ReadMandatoryNodeFloatAttribute(nodeDef, <span class="stringliteral">&quot;beta&quot;</span>);</div><div class="line"><a name="l02589"></a><span class="lineno"> 2589</span>&#160;    normalizationDescriptor.<a class="code" href="structarmnn_1_1_normalization_descriptor.xhtml#a8526ea7cf860d8e7f8340e9f9354f9f0">m_K</a> = ReadMandatoryNodeFloatAttribute(nodeDef, <span class="stringliteral">&quot;bias&quot;</span>);</div><div class="line"><a name="l02590"></a><span class="lineno"> 2590</span>&#160;    normalizationDescriptor.<a class="code" href="structarmnn_1_1_normalization_descriptor.xhtml#aa70c05f1aad12fbd9d9ec43ea4557b03">m_NormSize</a> = ReadMandatoryNodeUint32Attribute(nodeDef, <span class="stringliteral">&quot;depth_radius&quot;</span>);</div><div class="line"><a name="l02591"></a><span class="lineno"> 2591</span>&#160;    normalizationDescriptor.<a class="code" href="structarmnn_1_1_normalization_descriptor.xhtml#a6089e1ca91914015777ea780a513131a">m_DataLayout</a> = <a class="code" href="namespacearmnn.xhtml#ad1d5cce2d9e9a5d61c243e5c989112e0ad066db54b89b0912e7e7c6da51e2da51">armnn::DataLayout::NHWC</a>;</div><div class="line"><a name="l02592"></a><span class="lineno"> 2592</span>&#160;</div><div class="line"><a name="l02593"></a><span class="lineno"> 2593</span>&#160;    <span class="comment">// The window size must be an odd value. For a window size of (2 * n + 1), TensorFlow defines depth_radius = n.</span></div><div class="line"><a name="l02594"></a><span class="lineno"> 2594</span>&#160;    normalizationDescriptor.<a class="code" href="structarmnn_1_1_normalization_descriptor.xhtml#aa70c05f1aad12fbd9d9ec43ea4557b03">m_NormSize</a> = normalizationDescriptor.<a class="code" href="structarmnn_1_1_normalization_descriptor.xhtml#aa70c05f1aad12fbd9d9ec43ea4557b03">m_NormSize</a> * 2 + 1;</div><div class="line"><a name="l02595"></a><span class="lineno"> 2595</span>&#160;</div><div class="line"><a name="l02596"></a><span class="lineno"> 2596</span>&#160;    <a class="code" href="classarmnn_1_1_i_output_slot.xhtml">IOutputSlot</a>&amp; prevLayerOutputSlot = inputs[0].m_IndexedValue-&gt;ResolveArmnnOutputSlot(inputs[0].m_Index);</div><div class="line"><a name="l02597"></a><span class="lineno"> 2597</span>&#160;    <a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml">IConnectableLayer</a>* layer = <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a2db3ae8d422f17d455e0ba0cb6291d2a">m_Network</a>-&gt;AddNormalizationLayer(normalizationDescriptor,</div><div class="line"><a name="l02598"></a><span class="lineno"> 2598</span>&#160;        nodeDef.name().c_str());</div><div class="line"><a name="l02599"></a><span class="lineno"> 2599</span>&#160;    prevLayerOutputSlot.<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#ac1835f8756a9f03c02fcf9664e3a0fce">Connect</a>(layer-&gt;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml#a6ec9e0eb66d7d6a01240492a0b18104c">GetInputSlot</a>(0));</div><div class="line"><a name="l02600"></a><span class="lineno"> 2600</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>(prevLayerOutputSlot.<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#a9943775a364fc4ab53b85ac88f311886">GetTensorInfo</a>());</div><div class="line"><a name="l02601"></a><span class="lineno"> 2601</span>&#160;</div><div class="line"><a name="l02602"></a><span class="lineno"> 2602</span>&#160;    <span class="keywordflow">return</span> std::make_unique&lt;SingleLayerParsedTfOperation&gt;(<span class="keyword">this</span>, nodeDef, layer);</div><div class="line"><a name="l02603"></a><span class="lineno"> 2603</span>&#160;}</div><div class="line"><a name="l02604"></a><span class="lineno"> 2604</span>&#160;<span class="comment"></span></div><div class="line"><a name="l02605"></a><span class="lineno"> 2605</span>&#160;<span class="comment">/// An ParsedTfOperation for a MatMul node.</span></div><div class="line"><a name="l02606"></a><span class="lineno"> 2606</span>&#160;<span class="comment">/// Creation of the armnn FullyConnected layer is deferred until it is actually needed, because</span></div><div class="line"><a name="l02607"></a><span class="lineno"> 2607</span>&#160;<span class="comment">/// MatMul nodes are often used for the first part of a biased FullyConnected (MatMul followed</span></div><div class="line"><a name="l02608"></a><span class="lineno"> 2608</span>&#160;<span class="comment">/// by Add) and in these cases armnn doesn&#39;t need a separate layer for the MatMul.</span></div><div class="line"><a name="l02609"></a><span class="lineno"> 2609</span>&#160;<span class="comment">///</span></div><div class="line"><a name="l02610"></a><span class="lineno"> 2610</span>&#160;<span class="comment"></span><span class="keyword">class </span><a class="code" href="classarmnn_tf_parser_1_1_i_tf_parser.xhtml#a97caa75ebdb49fc10250742b33d29ae7">ParsedMatMulTfOperation</a> : <span class="keyword">public</span> <a class="code" href="classarmnn_tf_parser_1_1_i_tf_parser.xhtml#ab9a7a00deef758531aa11d3044e78b45">DeferredSingleLayerParsedTfOperation</a></div><div class="line"><a name="l02611"></a><span class="lineno"> 2611</span>&#160;{</div><div class="line"><a name="l02612"></a><span class="lineno"> 2612</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l02613"></a><span class="lineno"> 2613</span>&#160;    <a class="code" href="classarmnn_tf_parser_1_1_i_tf_parser.xhtml#a97caa75ebdb49fc10250742b33d29ae7">ParsedMatMulTfOperation</a>(<a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml">ITfParser::TfParserImpl</a>* parser, <span class="keyword">const</span> tensorflow::NodeDef&amp; node)</div><div class="line"><a name="l02614"></a><span class="lineno"> 2614</span>&#160;        : <a class="code" href="classarmnn_tf_parser_1_1_i_tf_parser.xhtml#ab9a7a00deef758531aa11d3044e78b45">DeferredSingleLayerParsedTfOperation</a>(parser, node)</div><div class="line"><a name="l02615"></a><span class="lineno"> 2615</span>&#160;    {</div><div class="line"><a name="l02616"></a><span class="lineno"> 2616</span>&#160;    }</div><div class="line"><a name="l02617"></a><span class="lineno"> 2617</span>&#160;</div><div class="line"><a name="l02618"></a><span class="lineno"> 2618</span>&#160;    <span class="keywordtype">void</span> CreateLayerDeferred()<span class="keyword"> override</span></div><div class="line"><a name="l02619"></a><span class="lineno"> 2619</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l02620"></a><span class="lineno"> 2620</span>&#160;        <a class="code" href="_assert_8hpp.xhtml#a5698be69cbd5dfe6c28fcd9867e8cbed">ARMNN_ASSERT</a>(<a class="code" href="_subgraph_view_selector_8cpp.xhtml#ae7fc37b88ff10e9294ed1c72f2a25ac7">m_Layer</a> == <span class="keyword">nullptr</span>);</div><div class="line"><a name="l02621"></a><span class="lineno"> 2621</span>&#160;        <a class="code" href="_subgraph_view_selector_8cpp.xhtml#ae7fc37b88ff10e9294ed1c72f2a25ac7">m_Layer</a> = m_Parser-&gt;AddFullyConnectedLayer(m_Node, <span class="keyword">nullptr</span>, m_Node.name().c_str());</div><div class="line"><a name="l02622"></a><span class="lineno"> 2622</span>&#160;    }</div><div class="line"><a name="l02623"></a><span class="lineno"> 2623</span>&#160;};</div><div class="line"><a name="l02624"></a><span class="lineno"> 2624</span>&#160;</div><div class="line"><a name="l02625"></a><span class="lineno"><a class="line" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#af71fa342538ad7280ff4f9b132bdb71a"> 2625</a></span>&#160;<a class="code" href="namespacearmnn_tf_parser.xhtml#aa36bf288c19fe35767bb6e059636f405">ParsedTfOperationPtr</a> <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#af71fa342538ad7280ff4f9b132bdb71a">ITfParser::TfParserImpl::ParseMatMul</a>(<span class="keyword">const</span> tensorflow::NodeDef&amp; nodeDef,</div><div class="line"><a name="l02626"></a><span class="lineno"> 2626</span>&#160;                                                         <span class="keyword">const</span> tensorflow::GraphDef&amp; graphDef)</div><div class="line"><a name="l02627"></a><span class="lineno"> 2627</span>&#160;{</div><div class="line"><a name="l02628"></a><span class="lineno"> 2628</span>&#160;    <a class="code" href="namespacearmnn.xhtml#a44affeeb090c3c6a3062830562672e84">IgnoreUnused</a>(graphDef);</div><div class="line"><a name="l02629"></a><span class="lineno"> 2629</span>&#160;</div><div class="line"><a name="l02630"></a><span class="lineno"> 2630</span>&#160;    <span class="comment">// Defers the creation of the layer (see ParsedMatMulTfOperation).</span></div><div class="line"><a name="l02631"></a><span class="lineno"> 2631</span>&#160;    <span class="keywordflow">return</span> std::make_unique&lt;ParsedMatMulTfOperation&gt;(<span class="keyword">this</span>, nodeDef);</div><div class="line"><a name="l02632"></a><span class="lineno"> 2632</span>&#160;}</div><div class="line"><a name="l02633"></a><span class="lineno"> 2633</span>&#160;</div><div class="line"><a name="l02634"></a><span class="lineno"><a class="line" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a74351720e73ac419536a6a527b4b46fa"> 2634</a></span>&#160;<a class="code" href="namespacearmnn_tf_parser.xhtml#aa36bf288c19fe35767bb6e059636f405">ParsedTfOperationPtr</a> <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a74351720e73ac419536a6a527b4b46fa">ITfParser::TfParserImpl::ParseMean</a>(<span class="keyword">const</span> tensorflow::NodeDef&amp; nodeDef,</div><div class="line"><a name="l02635"></a><span class="lineno"> 2635</span>&#160;                                                       <span class="keyword">const</span> tensorflow::GraphDef&amp; graphDef)</div><div class="line"><a name="l02636"></a><span class="lineno"> 2636</span>&#160;{</div><div class="line"><a name="l02637"></a><span class="lineno"> 2637</span>&#160;    <a class="code" href="namespacearmnn.xhtml#a44affeeb090c3c6a3062830562672e84">IgnoreUnused</a>(graphDef);</div><div class="line"><a name="l02638"></a><span class="lineno"> 2638</span>&#160;    std::vector&lt;OutputOfParsedTfOperation&gt; inputs = <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#ae295ca8b7d19bb5e6db3f93bd4561ee0">GetInputParsedTfOperationsChecked</a>(nodeDef, 2);</div><div class="line"><a name="l02639"></a><span class="lineno"> 2639</span>&#160;    <a class="code" href="classarmnn_1_1_i_output_slot.xhtml">IOutputSlot</a>&amp; inputSlot = inputs[0].m_IndexedValue-&gt;ResolveArmnnOutputSlot(inputs[0].m_Index);</div><div class="line"><a name="l02640"></a><span class="lineno"> 2640</span>&#160;    <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> inputTensorInfo = inputSlot.<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#a9943775a364fc4ab53b85ac88f311886">GetTensorInfo</a>();</div><div class="line"><a name="l02641"></a><span class="lineno"> 2641</span>&#160;</div><div class="line"><a name="l02642"></a><span class="lineno"> 2642</span>&#160;    <span class="keywordflow">if</span> (inputs.size() != 2)</div><div class="line"><a name="l02643"></a><span class="lineno"> 2643</span>&#160;    {</div><div class="line"><a name="l02644"></a><span class="lineno"> 2644</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="l02645"></a><span class="lineno"> 2645</span>&#160;                fmt::format(<span class="stringliteral">&quot;Mean expects two inputs!. Got {} for Node {} {}&quot;</span>,</div><div class="line"><a name="l02646"></a><span class="lineno"> 2646</span>&#160;                            inputs.size(),</div><div class="line"><a name="l02647"></a><span class="lineno"> 2647</span>&#160;                            nodeDef.name(),</div><div class="line"><a name="l02648"></a><span class="lineno"> 2648</span>&#160;                            <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l02649"></a><span class="lineno"> 2649</span>&#160;    }</div><div class="line"><a name="l02650"></a><span class="lineno"> 2650</span>&#160;</div><div class="line"><a name="l02651"></a><span class="lineno"> 2651</span>&#160;    <span class="keywordtype">bool</span> keepDims = ReadMandatoryNodeBoolAttribute(nodeDef, <span class="stringliteral">&quot;keep_dims&quot;</span>);</div><div class="line"><a name="l02652"></a><span class="lineno"> 2652</span>&#160;</div><div class="line"><a name="l02653"></a><span class="lineno"> 2653</span>&#160;    ParsedConstTfOperation&lt;int32_t&gt;* axisNode =</div><div class="line"><a name="l02654"></a><span class="lineno"> 2654</span>&#160;             PolymorphicDowncast&lt;ParsedConstTfOperation&lt;int32_t&gt;*&gt;(inputs[1].m_IndexedValue);</div><div class="line"><a name="l02655"></a><span class="lineno"> 2655</span>&#160;</div><div class="line"><a name="l02656"></a><span class="lineno"> 2656</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a>&amp; axisTensorInfo = axisNode-&gt;GetTensorInfo();</div><div class="line"><a name="l02657"></a><span class="lineno"> 2657</span>&#160;</div><div class="line"><a name="l02658"></a><span class="lineno"> 2658</span>&#160;    <a class="code" href="classarmnn_1_1_const_tensor.xhtml">ConstTensor</a> axisTensor(axisTensorInfo, axisNode-&gt;GetStorage());</div><div class="line"><a name="l02659"></a><span class="lineno"> 2659</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">int</span>* axisData = <span class="keyword">static_cast&lt;</span><span class="keyword">const </span><span class="keywordtype">int</span>*<span class="keyword">&gt;</span>(axisTensor.GetMemoryArea());</div><div class="line"><a name="l02660"></a><span class="lineno"> 2660</span>&#160;</div><div class="line"><a name="l02661"></a><span class="lineno"> 2661</span>&#160;    <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> outputTensorInfo;</div><div class="line"><a name="l02662"></a><span class="lineno"> 2662</span>&#160;    <a class="code" href="structarmnn_1_1_mean_descriptor.xhtml">MeanDescriptor</a> meanDescriptor;</div><div class="line"><a name="l02663"></a><span class="lineno"> 2663</span>&#160;    meanDescriptor.<a class="code" href="structarmnn_1_1_mean_descriptor.xhtml#a28e0548abfc4e79c48f29a3d11a062e9">m_KeepDims</a> = keepDims;</div><div class="line"><a name="l02664"></a><span class="lineno"> 2664</span>&#160;</div><div class="line"><a name="l02665"></a><span class="lineno"> 2665</span>&#160;    <span class="comment">// Negative axis values are supported so that the process requires</span></div><div class="line"><a name="l02666"></a><span class="lineno"> 2666</span>&#160;    <span class="comment">// to convert them into the corresponding positive ones.</span></div><div class="line"><a name="l02667"></a><span class="lineno"> 2667</span>&#160;    <span class="comment">// Duplicate values are also removed.</span></div><div class="line"><a name="l02668"></a><span class="lineno"> 2668</span>&#160;    std::vector&lt;int&gt; rawAxisVector(axisData, axisData + axisTensorInfo.GetNumElements());</div><div class="line"><a name="l02669"></a><span class="lineno"> 2669</span>&#160;    std::set&lt;unsigned int&gt; positiveAxisSet;</div><div class="line"><a name="l02670"></a><span class="lineno"> 2670</span>&#160;    <span class="keywordtype">int</span> rank = <span class="keyword">static_cast&lt;</span><span class="keywordtype">int</span><span class="keyword">&gt;</span>(inputTensorInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a157e27d41e9f6b21f0d3c025fa47dc24">GetNumDimensions</a>());</div><div class="line"><a name="l02671"></a><span class="lineno"> 2671</span>&#160;</div><div class="line"><a name="l02672"></a><span class="lineno"> 2672</span>&#160;    std::transform(rawAxisVector.begin(), rawAxisVector.end(),</div><div class="line"><a name="l02673"></a><span class="lineno"> 2673</span>&#160;                   std::inserter(positiveAxisSet, positiveAxisSet.begin()),</div><div class="line"><a name="l02674"></a><span class="lineno"> 2674</span>&#160;                   [rank](<span class="keywordtype">int</span> i) -&gt; <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> { <span class="keywordflow">return</span> <span class="keyword">static_cast&lt;</span><span class="keywordtype">unsigned</span> <span class="keywordtype">int</span><span class="keyword">&gt;</span>((i + rank) % rank); });</div><div class="line"><a name="l02675"></a><span class="lineno"> 2675</span>&#160;</div><div class="line"><a name="l02676"></a><span class="lineno"> 2676</span>&#160;    <a class="code" href="namespacearmnn_utils.xhtml#aac34adc5b96d744ae53eac580213f855">CalculateReducedOutputTensoInfo</a>(inputTensorInfo, positiveAxisSet, keepDims, outputTensorInfo);</div><div class="line"><a name="l02677"></a><span class="lineno"> 2677</span>&#160;</div><div class="line"><a name="l02678"></a><span class="lineno"> 2678</span>&#160;    <span class="keywordflow">if</span> (inputTensorInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a157e27d41e9f6b21f0d3c025fa47dc24">GetNumDimensions</a>() &gt; positiveAxisSet.size())</div><div class="line"><a name="l02679"></a><span class="lineno"> 2679</span>&#160;    {</div><div class="line"><a name="l02680"></a><span class="lineno"> 2680</span>&#160;        meanDescriptor.<a class="code" href="structarmnn_1_1_mean_descriptor.xhtml#a1f0d67b087c491248bd1cde3ff995a95">m_Axis</a>.assign(positiveAxisSet.begin(), positiveAxisSet.end());</div><div class="line"><a name="l02681"></a><span class="lineno"> 2681</span>&#160;    }</div><div class="line"><a name="l02682"></a><span class="lineno"> 2682</span>&#160;</div><div class="line"><a name="l02683"></a><span class="lineno"> 2683</span>&#160;    <a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml">IConnectableLayer</a>* layer = <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a2db3ae8d422f17d455e0ba0cb6291d2a">m_Network</a>-&gt;AddMeanLayer(meanDescriptor, nodeDef.name().c_str());</div><div class="line"><a name="l02684"></a><span class="lineno"> 2684</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="l02685"></a><span class="lineno"> 2685</span>&#160;    inputSlot.<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#ac1835f8756a9f03c02fcf9664e3a0fce">Connect</a>(layer-&gt;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml#a6ec9e0eb66d7d6a01240492a0b18104c">GetInputSlot</a>(0));</div><div class="line"><a name="l02686"></a><span class="lineno"> 2686</span>&#160;</div><div class="line"><a name="l02687"></a><span class="lineno"> 2687</span>&#160;    <span class="keywordflow">return</span> std::make_unique&lt;SingleLayerParsedTfOperation&gt;(<span class="keyword">this</span>, nodeDef, layer);</div><div class="line"><a name="l02688"></a><span class="lineno"> 2688</span>&#160;}</div><div class="line"><a name="l02689"></a><span class="lineno"> 2689</span>&#160;<span class="comment"></span></div><div class="line"><a name="l02690"></a><span class="lineno"> 2690</span>&#160;<span class="comment">/// An ParsedTfOperation for a Mul node.</span></div><div class="line"><a name="l02691"></a><span class="lineno"> 2691</span>&#160;<span class="comment">/// Creation of the armnn Mul layer is deferred until it is actually needed, because Mul nodes</span></div><div class="line"><a name="l02692"></a><span class="lineno"> 2692</span>&#160;<span class="comment">/// are also used for the first part of a leaky relu activation function (Mul followed by Maximum)</span></div><div class="line"><a name="l02693"></a><span class="lineno"> 2693</span>&#160;<span class="comment">/// and in these cases armnn doesn&#39;t need a separate layer for the Mul.</span></div><div class="line"><a name="l02694"></a><span class="lineno"> 2694</span>&#160;<span class="comment">///</span></div><div class="line"><a name="l02695"></a><span class="lineno"> 2695</span>&#160;<span class="comment"></span><span class="keyword">class </span><a class="code" href="classarmnn_tf_parser_1_1_i_tf_parser.xhtml#ac28271f7220cd595de55dbb7f99f4a63">ParsedMulTfOperation</a> : <span class="keyword">public</span> <a class="code" href="classarmnn_tf_parser_1_1_i_tf_parser.xhtml#ab9a7a00deef758531aa11d3044e78b45">DeferredSingleLayerParsedTfOperation</a></div><div class="line"><a name="l02696"></a><span class="lineno"> 2696</span>&#160;{</div><div class="line"><a name="l02697"></a><span class="lineno"> 2697</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l02698"></a><span class="lineno"> 2698</span>&#160;    <a class="code" href="classarmnn_tf_parser_1_1_i_tf_parser.xhtml#ac28271f7220cd595de55dbb7f99f4a63">ParsedMulTfOperation</a>(<a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml">ITfParser::TfParserImpl</a>* parser, <span class="keyword">const</span> tensorflow::NodeDef&amp; node)</div><div class="line"><a name="l02699"></a><span class="lineno"> 2699</span>&#160;        : <a class="code" href="classarmnn_tf_parser_1_1_i_tf_parser.xhtml#ab9a7a00deef758531aa11d3044e78b45">DeferredSingleLayerParsedTfOperation</a>(parser, node)</div><div class="line"><a name="l02700"></a><span class="lineno"> 2700</span>&#160;    {</div><div class="line"><a name="l02701"></a><span class="lineno"> 2701</span>&#160;    }</div><div class="line"><a name="l02702"></a><span class="lineno"> 2702</span>&#160;</div><div class="line"><a name="l02703"></a><span class="lineno"> 2703</span>&#160;    <span class="keywordtype">void</span> CreateLayerDeferred()<span class="keyword"> override</span></div><div class="line"><a name="l02704"></a><span class="lineno"> 2704</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l02705"></a><span class="lineno"> 2705</span>&#160;        <a class="code" href="_assert_8hpp.xhtml#a5698be69cbd5dfe6c28fcd9867e8cbed">ARMNN_ASSERT</a>(<a class="code" href="_subgraph_view_selector_8cpp.xhtml#ae7fc37b88ff10e9294ed1c72f2a25ac7">m_Layer</a> == <span class="keyword">nullptr</span>);</div><div class="line"><a name="l02706"></a><span class="lineno"> 2706</span>&#160;        <a class="code" href="_subgraph_view_selector_8cpp.xhtml#ae7fc37b88ff10e9294ed1c72f2a25ac7">m_Layer</a> = m_Parser-&gt;AddMultiplicationLayer(m_Node);</div><div class="line"><a name="l02707"></a><span class="lineno"> 2707</span>&#160;    }</div><div class="line"><a name="l02708"></a><span class="lineno"> 2708</span>&#160;};</div><div class="line"><a name="l02709"></a><span class="lineno"> 2709</span>&#160;</div><div class="line"><a name="l02710"></a><span class="lineno"><a class="line" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a5f4ea9601ffef3d1549614e959d967d4"> 2710</a></span>&#160;<a class="code" href="namespacearmnn_tf_parser.xhtml#aa36bf288c19fe35767bb6e059636f405">ParsedTfOperationPtr</a> <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a5f4ea9601ffef3d1549614e959d967d4">ITfParser::TfParserImpl::ParseMul</a>(<span class="keyword">const</span> tensorflow::NodeDef&amp; nodeDef,</div><div class="line"><a name="l02711"></a><span class="lineno"> 2711</span>&#160;                                                      <span class="keyword">const</span> tensorflow::GraphDef&amp; graphDef)</div><div class="line"><a name="l02712"></a><span class="lineno"> 2712</span>&#160;{</div><div class="line"><a name="l02713"></a><span class="lineno"> 2713</span>&#160;    <a class="code" href="namespacearmnn.xhtml#a44affeeb090c3c6a3062830562672e84">IgnoreUnused</a>(graphDef);</div><div class="line"><a name="l02714"></a><span class="lineno"> 2714</span>&#160;</div><div class="line"><a name="l02715"></a><span class="lineno"> 2715</span>&#160;    <span class="keywordflow">return</span> std::make_unique&lt;ParsedMulTfOperation&gt;(<span class="keyword">this</span>, nodeDef);</div><div class="line"><a name="l02716"></a><span class="lineno"> 2716</span>&#160;}</div><div class="line"><a name="l02717"></a><span class="lineno"> 2717</span>&#160;</div><div class="line"><a name="l02718"></a><span class="lineno"><a class="line" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a46587dd82842638c50848021c57b6fad"> 2718</a></span>&#160;<a class="code" href="namespacearmnn_tf_parser.xhtml#aa36bf288c19fe35767bb6e059636f405">ParsedTfOperationPtr</a> <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a46587dd82842638c50848021c57b6fad">ITfParser::TfParserImpl::ParsePlaceholder</a>(<span class="keyword">const</span> tensorflow::NodeDef&amp; nodeDef,</div><div class="line"><a name="l02719"></a><span class="lineno"> 2719</span>&#160;    <span class="keyword">const</span> tensorflow::GraphDef&amp; graphDef)</div><div class="line"><a name="l02720"></a><span class="lineno"> 2720</span>&#160;{</div><div class="line"><a name="l02721"></a><span class="lineno"> 2721</span>&#160;    <a class="code" href="namespacearmnn.xhtml#a44affeeb090c3c6a3062830562672e84">IgnoreUnused</a>(graphDef);</div><div class="line"><a name="l02722"></a><span class="lineno"> 2722</span>&#160;</div><div class="line"><a name="l02723"></a><span class="lineno"> 2723</span>&#160;    std::vector&lt;OutputOfParsedTfOperation&gt; inputs = <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#ae295ca8b7d19bb5e6db3f93bd4561ee0">GetInputParsedTfOperationsChecked</a>(nodeDef, 0);</div><div class="line"><a name="l02724"></a><span class="lineno"> 2724</span>&#160;</div><div class="line"><a name="l02725"></a><span class="lineno"> 2725</span>&#160;    <span class="keyword">const</span> <a class="code" href="namespacearmnn.xhtml#ab8cf8f9fb6792e654c2d8d8382f6f01b">LayerBindingId</a> layerId = <a class="code" href="namespacearmnn.xhtml#a375ca3cff9f1b005d1412dc5f3cf5b6e">armnn::numeric_cast</a>&lt;<a class="code" href="namespacearmnn.xhtml#ab8cf8f9fb6792e654c2d8d8382f6f01b">LayerBindingId</a>&gt;(<a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#ac62e2558c14e01605f2b4e1e21cdd1e8">m_NetworkInputsBindingInfo</a>.size());</div><div class="line"><a name="l02726"></a><span class="lineno"> 2726</span>&#160;</div><div class="line"><a name="l02727"></a><span class="lineno"> 2727</span>&#160;    <span class="keyword">auto</span> it = <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a76ea67f3f7d1d5835c5a92b65dc0854c">m_InputShapes</a>.find(nodeDef.name());</div><div class="line"><a name="l02728"></a><span class="lineno"> 2728</span>&#160;    <span class="keywordflow">if</span> (it == <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a76ea67f3f7d1d5835c5a92b65dc0854c">m_InputShapes</a>.end())</div><div class="line"><a name="l02729"></a><span class="lineno"> 2729</span>&#160;    {</div><div class="line"><a name="l02730"></a><span class="lineno"> 2730</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="l02731"></a><span class="lineno"> 2731</span>&#160;            fmt::format(<span class="stringliteral">&quot;Missing input shape for Placeholder &#39;{}&#39; {}&quot;</span>,</div><div class="line"><a name="l02732"></a><span class="lineno"> 2732</span>&#160;                        nodeDef.name(),</div><div class="line"><a name="l02733"></a><span class="lineno"> 2733</span>&#160;                        <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l02734"></a><span class="lineno"> 2734</span>&#160;    }</div><div class="line"><a name="l02735"></a><span class="lineno"> 2735</span>&#160;    <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> tensorInfo(it-&gt;second, DataType::Float32);</div><div class="line"><a name="l02736"></a><span class="lineno"> 2736</span>&#160;</div><div class="line"><a name="l02737"></a><span class="lineno"> 2737</span>&#160;    <a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml">IConnectableLayer</a>* <span class="keyword">const</span> layer = <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a2db3ae8d422f17d455e0ba0cb6291d2a">m_Network</a>-&gt;AddInputLayer(layerId, nodeDef.name().c_str());</div><div class="line"><a name="l02738"></a><span class="lineno"> 2738</span>&#160;</div><div class="line"><a name="l02739"></a><span class="lineno"> 2739</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="l02740"></a><span class="lineno"> 2740</span>&#160;</div><div class="line"><a name="l02741"></a><span class="lineno"> 2741</span>&#160;    <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a2a1112c66d08e3760ecccf39c7854a90">TrackInputBinding</a>(layer, layerId, tensorInfo);</div><div class="line"><a name="l02742"></a><span class="lineno"> 2742</span>&#160;</div><div class="line"><a name="l02743"></a><span class="lineno"> 2743</span>&#160;    <span class="keywordflow">return</span> std::make_unique&lt;SingleLayerParsedTfOperation&gt;(<span class="keyword">this</span>, nodeDef, layer);</div><div class="line"><a name="l02744"></a><span class="lineno"> 2744</span>&#160;}</div><div class="line"><a name="l02745"></a><span class="lineno"> 2745</span>&#160;</div><div class="line"><a name="l02746"></a><span class="lineno"><a class="line" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#ab1bcf36c86bd2c3f9d8dbd8793642f43"> 2746</a></span>&#160;<a class="code" href="namespacearmnn_tf_parser.xhtml#aa36bf288c19fe35767bb6e059636f405">ParsedTfOperationPtr</a> <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#ab1bcf36c86bd2c3f9d8dbd8793642f43">ITfParser::TfParserImpl::ParseRealDiv</a>(<span class="keyword">const</span> tensorflow::NodeDef&amp; nodeDef,</div><div class="line"><a name="l02747"></a><span class="lineno"> 2747</span>&#160;                                                          <span class="keyword">const</span> tensorflow::GraphDef&amp; graphDef)</div><div class="line"><a name="l02748"></a><span class="lineno"> 2748</span>&#160;{</div><div class="line"><a name="l02749"></a><span class="lineno"> 2749</span>&#160;    <a class="code" href="namespacearmnn.xhtml#a44affeeb090c3c6a3062830562672e84">IgnoreUnused</a>(graphDef);</div><div class="line"><a name="l02750"></a><span class="lineno"> 2750</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a138dbe1b5b87970a073445ab7fc512f5">AddRealDivLayer</a>(nodeDef);</div><div class="line"><a name="l02751"></a><span class="lineno"> 2751</span>&#160;}</div><div class="line"><a name="l02752"></a><span class="lineno"> 2752</span>&#160;</div><div class="line"><a name="l02753"></a><span class="lineno"><a class="line" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a64aff7efca99114ef64a6b30953d93ee"> 2753</a></span>&#160;<a class="code" href="namespacearmnn_tf_parser.xhtml#aa36bf288c19fe35767bb6e059636f405">ParsedTfOperationPtr</a> <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a64aff7efca99114ef64a6b30953d93ee">ITfParser::TfParserImpl::ParseRelu</a>(<span class="keyword">const</span> tensorflow::NodeDef&amp; nodeDef,</div><div class="line"><a name="l02754"></a><span class="lineno"> 2754</span>&#160;    <span class="keyword">const</span> tensorflow::GraphDef&amp; graphDef)</div><div class="line"><a name="l02755"></a><span class="lineno"> 2755</span>&#160;{</div><div class="line"><a name="l02756"></a><span class="lineno"> 2756</span>&#160;    <a class="code" href="namespacearmnn.xhtml#a44affeeb090c3c6a3062830562672e84">IgnoreUnused</a>(graphDef);</div><div class="line"><a name="l02757"></a><span class="lineno"> 2757</span>&#160;</div><div class="line"><a name="l02758"></a><span class="lineno"> 2758</span>&#160;    <a class="code" href="structarmnn_1_1_activation_descriptor.xhtml">ActivationDescriptor</a> activationDesc;</div><div class="line"><a name="l02759"></a><span class="lineno"> 2759</span>&#160;    activationDesc.<a class="code" href="structarmnn_1_1_activation_descriptor.xhtml#af10fa7883e3579950f477bee92a64844">m_Function</a> = ActivationFunction::ReLu;</div><div class="line"><a name="l02760"></a><span class="lineno"> 2760</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a03e49169bbbcfea8be81ff4139d1f75f">AddActivationLayer</a>(nodeDef, activationDesc);</div><div class="line"><a name="l02761"></a><span class="lineno"> 2761</span>&#160;}</div><div class="line"><a name="l02762"></a><span class="lineno"> 2762</span>&#160;</div><div class="line"><a name="l02763"></a><span class="lineno"><a class="line" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a68cb028cdc437c8daad2e2c9406da4f9"> 2763</a></span>&#160;<a class="code" href="namespacearmnn_tf_parser.xhtml#aa36bf288c19fe35767bb6e059636f405">ParsedTfOperationPtr</a> <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a68cb028cdc437c8daad2e2c9406da4f9">ITfParser::TfParserImpl::ParseRelu6</a>(<span class="keyword">const</span> tensorflow::NodeDef&amp; nodeDef,</div><div class="line"><a name="l02764"></a><span class="lineno"> 2764</span>&#160;    <span class="keyword">const</span> tensorflow::GraphDef&amp; graphDef)</div><div class="line"><a name="l02765"></a><span class="lineno"> 2765</span>&#160;{</div><div class="line"><a name="l02766"></a><span class="lineno"> 2766</span>&#160;    <a class="code" href="namespacearmnn.xhtml#a44affeeb090c3c6a3062830562672e84">IgnoreUnused</a>(graphDef);</div><div class="line"><a name="l02767"></a><span class="lineno"> 2767</span>&#160;</div><div class="line"><a name="l02768"></a><span class="lineno"> 2768</span>&#160;    <a class="code" href="structarmnn_1_1_activation_descriptor.xhtml">ActivationDescriptor</a> activationDesc;</div><div class="line"><a name="l02769"></a><span class="lineno"> 2769</span>&#160;    activationDesc.<a class="code" href="structarmnn_1_1_activation_descriptor.xhtml#af10fa7883e3579950f477bee92a64844">m_Function</a> = ActivationFunction::BoundedReLu;</div><div class="line"><a name="l02770"></a><span class="lineno"> 2770</span>&#160;    activationDesc.<a class="code" href="structarmnn_1_1_activation_descriptor.xhtml#a017b2990003a014234f13e999dc7c689">m_A</a> = 6.0f;</div><div class="line"><a name="l02771"></a><span class="lineno"> 2771</span>&#160;    activationDesc.<a class="code" href="structarmnn_1_1_activation_descriptor.xhtml#a28c4c9cb15f6be3499abbc46b356060b">m_B</a> = 0.0f;</div><div class="line"><a name="l02772"></a><span class="lineno"> 2772</span>&#160;</div><div class="line"><a name="l02773"></a><span class="lineno"> 2773</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a03e49169bbbcfea8be81ff4139d1f75f">AddActivationLayer</a>(nodeDef, activationDesc);</div><div class="line"><a name="l02774"></a><span class="lineno"> 2774</span>&#160;}</div><div class="line"><a name="l02775"></a><span class="lineno"> 2775</span>&#160;</div><div class="line"><a name="l02776"></a><span class="lineno"><a class="line" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#aee93c8f83169730c175da7601fca5de6"> 2776</a></span>&#160;<a class="code" href="namespacearmnn_tf_parser.xhtml#aa36bf288c19fe35767bb6e059636f405">ParsedTfOperationPtr</a> <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#aee93c8f83169730c175da7601fca5de6">ITfParser::TfParserImpl::ParseSigmoid</a>(<span class="keyword">const</span> tensorflow::NodeDef&amp; nodeDef,</div><div class="line"><a name="l02777"></a><span class="lineno"> 2777</span>&#160;    <span class="keyword">const</span> tensorflow::GraphDef&amp; graphDef)</div><div class="line"><a name="l02778"></a><span class="lineno"> 2778</span>&#160;{</div><div class="line"><a name="l02779"></a><span class="lineno"> 2779</span>&#160;    <a class="code" href="namespacearmnn.xhtml#a44affeeb090c3c6a3062830562672e84">IgnoreUnused</a>(graphDef);</div><div class="line"><a name="l02780"></a><span class="lineno"> 2780</span>&#160;</div><div class="line"><a name="l02781"></a><span class="lineno"> 2781</span>&#160;    <a class="code" href="structarmnn_1_1_activation_descriptor.xhtml">ActivationDescriptor</a> activationDesc;</div><div class="line"><a name="l02782"></a><span class="lineno"> 2782</span>&#160;    activationDesc.<a class="code" href="structarmnn_1_1_activation_descriptor.xhtml#af10fa7883e3579950f477bee92a64844">m_Function</a> = ActivationFunction::Sigmoid;</div><div class="line"><a name="l02783"></a><span class="lineno"> 2783</span>&#160;</div><div class="line"><a name="l02784"></a><span class="lineno"> 2784</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a03e49169bbbcfea8be81ff4139d1f75f">AddActivationLayer</a>(nodeDef, activationDesc);</div><div class="line"><a name="l02785"></a><span class="lineno"> 2785</span>&#160;}</div><div class="line"><a name="l02786"></a><span class="lineno"> 2786</span>&#160;</div><div class="line"><a name="l02787"></a><span class="lineno"><a class="line" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a7cac9d2ac092398b0efe64ec8e006511"> 2787</a></span>&#160;<a class="code" href="namespacearmnn_tf_parser.xhtml#aa36bf288c19fe35767bb6e059636f405">ParsedTfOperationPtr</a> <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a7cac9d2ac092398b0efe64ec8e006511">ITfParser::TfParserImpl::ParseRsqrt</a>(<span class="keyword">const</span> tensorflow::NodeDef &amp;nodeDef,</div><div class="line"><a name="l02788"></a><span class="lineno"> 2788</span>&#160;    <span class="keyword">const</span> tensorflow::GraphDef &amp;graphDef)</div><div class="line"><a name="l02789"></a><span class="lineno"> 2789</span>&#160;{</div><div class="line"><a name="l02790"></a><span class="lineno"> 2790</span>&#160;    <a class="code" href="namespacearmnn.xhtml#a44affeeb090c3c6a3062830562672e84">IgnoreUnused</a>(graphDef);</div><div class="line"><a name="l02791"></a><span class="lineno"> 2791</span>&#160;</div><div class="line"><a name="l02792"></a><span class="lineno"> 2792</span>&#160;    std::vector&lt;OutputOfParsedTfOperation&gt; inputs = <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#ae295ca8b7d19bb5e6db3f93bd4561ee0">GetInputParsedTfOperationsChecked</a>(nodeDef, 1);</div><div class="line"><a name="l02793"></a><span class="lineno"> 2793</span>&#160;</div><div class="line"><a name="l02794"></a><span class="lineno"> 2794</span>&#160;    <a class="code" href="structarmnn_1_1_elementwise_unary_descriptor.xhtml">ElementwiseUnaryDescriptor</a> descriptor(UnaryOperation::Rsqrt);</div><div class="line"><a name="l02795"></a><span class="lineno"> 2795</span>&#160;    <a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml">IConnectableLayer</a>* <span class="keyword">const</span> layer = <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a2db3ae8d422f17d455e0ba0cb6291d2a">m_Network</a>-&gt;AddElementwiseUnaryLayer(descriptor, nodeDef.name().c_str());</div><div class="line"><a name="l02796"></a><span class="lineno"> 2796</span>&#160;</div><div class="line"><a name="l02797"></a><span class="lineno"> 2797</span>&#160;    <a class="code" href="classarmnn_1_1_i_output_slot.xhtml">IOutputSlot</a>&amp; prevLayerOutputSlot = inputs[0].m_IndexedValue-&gt;ResolveArmnnOutputSlot(inputs[0].m_Index);</div><div class="line"><a name="l02798"></a><span class="lineno"> 2798</span>&#160;    prevLayerOutputSlot.<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#ac1835f8756a9f03c02fcf9664e3a0fce">Connect</a>(layer-&gt;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml#a6ec9e0eb66d7d6a01240492a0b18104c">GetInputSlot</a>(0));</div><div class="line"><a name="l02799"></a><span class="lineno"> 2799</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>(prevLayerOutputSlot.<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#a9943775a364fc4ab53b85ac88f311886">GetTensorInfo</a>());</div><div class="line"><a name="l02800"></a><span class="lineno"> 2800</span>&#160;</div><div class="line"><a name="l02801"></a><span class="lineno"> 2801</span>&#160;    <span class="keywordflow">return</span> std::make_unique&lt;SingleLayerParsedTfOperation&gt;(<span class="keyword">this</span>, nodeDef, layer);</div><div class="line"><a name="l02802"></a><span class="lineno"> 2802</span>&#160;}</div><div class="line"><a name="l02803"></a><span class="lineno"> 2803</span>&#160;</div><div class="line"><a name="l02804"></a><span class="lineno"><a class="line" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a60be7de45006fefe5ace8729014b0fb7"> 2804</a></span>&#160;<a class="code" href="namespacearmnn_tf_parser.xhtml#aa36bf288c19fe35767bb6e059636f405">ParsedTfOperationPtr</a> <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a60be7de45006fefe5ace8729014b0fb7">ITfParser::TfParserImpl::ParseSoftmax</a>(<span class="keyword">const</span> tensorflow::NodeDef&amp; nodeDef,</div><div class="line"><a name="l02805"></a><span class="lineno"> 2805</span>&#160;    <span class="keyword">const</span> tensorflow::GraphDef&amp; graphDef)</div><div class="line"><a name="l02806"></a><span class="lineno"> 2806</span>&#160;{</div><div class="line"><a name="l02807"></a><span class="lineno"> 2807</span>&#160;    <a class="code" href="namespacearmnn.xhtml#a44affeeb090c3c6a3062830562672e84">IgnoreUnused</a>(graphDef);</div><div class="line"><a name="l02808"></a><span class="lineno"> 2808</span>&#160;</div><div class="line"><a name="l02809"></a><span class="lineno"> 2809</span>&#160;    std::vector&lt;OutputOfParsedTfOperation&gt; inputs = <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#ae295ca8b7d19bb5e6db3f93bd4561ee0">GetInputParsedTfOperationsChecked</a>(nodeDef, 1);</div><div class="line"><a name="l02810"></a><span class="lineno"> 2810</span>&#160;</div><div class="line"><a name="l02811"></a><span class="lineno"> 2811</span>&#160;    <a class="code" href="structarmnn_1_1_softmax_descriptor.xhtml">SoftmaxDescriptor</a> softmaxDescriptor;</div><div class="line"><a name="l02812"></a><span class="lineno"> 2812</span>&#160;    <a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml">IConnectableLayer</a>* <span class="keyword">const</span> layer = <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a2db3ae8d422f17d455e0ba0cb6291d2a">m_Network</a>-&gt;AddSoftmaxLayer(softmaxDescriptor, nodeDef.name().c_str());</div><div class="line"><a name="l02813"></a><span class="lineno"> 2813</span>&#160;</div><div class="line"><a name="l02814"></a><span class="lineno"> 2814</span>&#160;    <a class="code" href="classarmnn_1_1_i_output_slot.xhtml">IOutputSlot</a>&amp; prevLayerSlot = inputs[0].m_IndexedValue-&gt;ResolveArmnnOutputSlot(inputs[0].m_Index);</div><div class="line"><a name="l02815"></a><span class="lineno"> 2815</span>&#160;    prevLayerSlot.<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#ac1835f8756a9f03c02fcf9664e3a0fce">Connect</a>(layer-&gt;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml#a6ec9e0eb66d7d6a01240492a0b18104c">GetInputSlot</a>(0));</div><div class="line"><a name="l02816"></a><span class="lineno"> 2816</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>(prevLayerSlot.<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#a9943775a364fc4ab53b85ac88f311886">GetTensorInfo</a>());</div><div class="line"><a name="l02817"></a><span class="lineno"> 2817</span>&#160;</div><div class="line"><a name="l02818"></a><span class="lineno"> 2818</span>&#160;    <span class="keywordflow">return</span> std::make_unique&lt;SingleLayerParsedTfOperation&gt;(<span class="keyword">this</span>, nodeDef, layer);</div><div class="line"><a name="l02819"></a><span class="lineno"> 2819</span>&#160;}</div><div class="line"><a name="l02820"></a><span class="lineno"> 2820</span>&#160;</div><div class="line"><a name="l02821"></a><span class="lineno"><a class="line" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a5d67929430d96c47e5652d84da82c1fb"> 2821</a></span>&#160;<a class="code" href="namespacearmnn_tf_parser.xhtml#aa36bf288c19fe35767bb6e059636f405">ParsedTfOperationPtr</a> <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a5d67929430d96c47e5652d84da82c1fb">ITfParser::TfParserImpl::ParseSplit</a>(<span class="keyword">const</span> tensorflow::NodeDef&amp; nodeDef,</div><div class="line"><a name="l02822"></a><span class="lineno"> 2822</span>&#160;    <span class="keyword">const</span> tensorflow::GraphDef&amp; graphDef)</div><div class="line"><a name="l02823"></a><span class="lineno"> 2823</span>&#160;{</div><div class="line"><a name="l02824"></a><span class="lineno"> 2824</span>&#160;    <a class="code" href="namespacearmnn.xhtml#a44affeeb090c3c6a3062830562672e84">IgnoreUnused</a>(graphDef);</div><div class="line"><a name="l02825"></a><span class="lineno"> 2825</span>&#160;</div><div class="line"><a name="l02826"></a><span class="lineno"> 2826</span>&#160;    std::vector&lt;OutputOfConstNodeDef&gt; nodes = <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a9e7a394f59e8d223a79e3db798803c1c">GetTfInputNodes</a>(nodeDef);</div><div class="line"><a name="l02827"></a><span class="lineno"> 2827</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> numInputs = <span class="keyword">static_cast&lt;</span><span class="keywordtype">unsigned</span> <span class="keywordtype">int</span><span class="keyword">&gt;</span>(nodes.size());</div><div class="line"><a name="l02828"></a><span class="lineno"> 2828</span>&#160;    std::vector&lt;OutputOfParsedTfOperation&gt; inputs = <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#ae295ca8b7d19bb5e6db3f93bd4561ee0">GetInputParsedTfOperationsChecked</a>(nodeDef, numInputs);</div><div class="line"><a name="l02829"></a><span class="lineno"> 2829</span>&#160;</div><div class="line"><a name="l02830"></a><span class="lineno"> 2830</span>&#160;    <span class="comment">// Constant tensor index</span></div><div class="line"><a name="l02831"></a><span class="lineno"> 2831</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> index = <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a82bb92947dc9e0f04d4242910d6cbc65">GetConstInputIndex</a>(inputs);</div><div class="line"><a name="l02832"></a><span class="lineno"> 2832</span>&#160;    <span class="comment">// Get the axis tensor data</span></div><div class="line"><a name="l02833"></a><span class="lineno"> 2833</span>&#160;    ParsedConstTfOperation&lt;int32_t&gt;* shapeNode =</div><div class="line"><a name="l02834"></a><span class="lineno"> 2834</span>&#160;                PolymorphicDowncast&lt;ParsedConstTfOperation&lt;int32_t&gt;*&gt;(inputs[index].m_IndexedValue);</div><div class="line"><a name="l02835"></a><span class="lineno"> 2835</span>&#160;</div><div class="line"><a name="l02836"></a><span class="lineno"> 2836</span>&#160;    std::vector&lt;int32_t&gt; axisTensorData;</div><div class="line"><a name="l02837"></a><span class="lineno"> 2837</span>&#160;    shapeNode-&gt;GetConstTensor(axisTensorData);</div><div class="line"><a name="l02838"></a><span class="lineno"> 2838</span>&#160;</div><div class="line"><a name="l02839"></a><span class="lineno"> 2839</span>&#160;    <span class="comment">// This splitDim indicates the data format: 3 is the NHWC, 1 is the NCHW.</span></div><div class="line"><a name="l02840"></a><span class="lineno"> 2840</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> splitDim = <span class="keyword">static_cast&lt;</span><span class="keywordtype">unsigned</span> <span class="keywordtype">int</span><span class="keyword">&gt;</span>(axisTensorData[0]);</div><div class="line"><a name="l02841"></a><span class="lineno"> 2841</span>&#160;</div><div class="line"><a name="l02842"></a><span class="lineno"> 2842</span>&#160;    <span class="comment">// Armnn supports split along the channel dimension for data formats NHWC and NCHW.</span></div><div class="line"><a name="l02843"></a><span class="lineno"> 2843</span>&#160;    <span class="keywordflow">if</span> (splitDim == 0 || splitDim == 2)</div><div class="line"><a name="l02844"></a><span class="lineno"> 2844</span>&#160;    {</div><div class="line"><a name="l02845"></a><span class="lineno"> 2845</span>&#160;        <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_parse_exception.xhtml">armnn::ParseException</a>(</div><div class="line"><a name="l02846"></a><span class="lineno"> 2846</span>&#160;                fmt::format(<span class="stringliteral">&quot;Dimension {} for split is not supported by Armnn. &quot;</span></div><div class="line"><a name="l02847"></a><span class="lineno"> 2847</span>&#160;                            <span class="stringliteral">&quot;Node {} {}&quot;</span>,</div><div class="line"><a name="l02848"></a><span class="lineno"> 2848</span>&#160;                            splitDim,</div><div class="line"><a name="l02849"></a><span class="lineno"> 2849</span>&#160;                            nodeDef.name(),</div><div class="line"><a name="l02850"></a><span class="lineno"> 2850</span>&#160;                            <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l02851"></a><span class="lineno"> 2851</span>&#160;    }</div><div class="line"><a name="l02852"></a><span class="lineno"> 2852</span>&#160;</div><div class="line"><a name="l02853"></a><span class="lineno"> 2853</span>&#160;    <span class="comment">// As Armnn only supports splitter outputs of the same shape, therefore num_split will be limited to an integer.</span></div><div class="line"><a name="l02854"></a><span class="lineno"> 2854</span>&#160;    uint32_t num_split = ReadMandatoryNodeUint32Attribute(nodeDef, <span class="stringliteral">&quot;num_split&quot;</span>);</div><div class="line"><a name="l02855"></a><span class="lineno"> 2855</span>&#160;</div><div class="line"><a name="l02856"></a><span class="lineno"> 2856</span>&#160;    <a class="code" href="classarmnn_1_1_i_output_slot.xhtml">IOutputSlot</a>&amp; inputSlot = inputs[1 - index].m_IndexedValue-&gt;ResolveArmnnOutputSlot(inputs[1 - index].m_Index);</div><div class="line"><a name="l02857"></a><span class="lineno"> 2857</span>&#160;    <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> inputTensorInfo = inputSlot.<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#a9943775a364fc4ab53b85ac88f311886">GetTensorInfo</a>();</div><div class="line"><a name="l02858"></a><span class="lineno"> 2858</span>&#160;</div><div class="line"><a name="l02859"></a><span class="lineno"> 2859</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> supportedNumDims = 4;</div><div class="line"><a name="l02860"></a><span class="lineno"> 2860</span>&#160;    <span class="keyword">auto</span> inputDimSize = inputTensorInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a157e27d41e9f6b21f0d3c025fa47dc24">GetNumDimensions</a>();</div><div class="line"><a name="l02861"></a><span class="lineno"> 2861</span>&#160;</div><div class="line"><a name="l02862"></a><span class="lineno"> 2862</span>&#160;    <span class="keywordflow">if</span> (inputDimSize != supportedNumDims)</div><div class="line"><a name="l02863"></a><span class="lineno"> 2863</span>&#160;    {</div><div class="line"><a name="l02864"></a><span class="lineno"> 2864</span>&#160;        <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_parse_exception.xhtml">armnn::ParseException</a>(</div><div class="line"><a name="l02865"></a><span class="lineno"> 2865</span>&#160;                fmt::format(<span class="stringliteral">&quot;The number of dimensions: {} for input tensors of the &quot;</span></div><div class="line"><a name="l02866"></a><span class="lineno"> 2866</span>&#160;                            <span class="stringliteral">&quot;split op should be {} {}&quot;</span>,</div><div class="line"><a name="l02867"></a><span class="lineno"> 2867</span>&#160;                            inputTensorInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a157e27d41e9f6b21f0d3c025fa47dc24">GetNumDimensions</a>(),</div><div class="line"><a name="l02868"></a><span class="lineno"> 2868</span>&#160;                            supportedNumDims,</div><div class="line"><a name="l02869"></a><span class="lineno"> 2869</span>&#160;                            <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l02870"></a><span class="lineno"> 2870</span>&#160;    }</div><div class="line"><a name="l02871"></a><span class="lineno"> 2871</span>&#160;</div><div class="line"><a name="l02872"></a><span class="lineno"> 2872</span>&#160;    std::vector&lt;unsigned int&gt; splitterDimSizes(inputDimSize);</div><div class="line"><a name="l02873"></a><span class="lineno"> 2873</span>&#160;</div><div class="line"><a name="l02874"></a><span class="lineno"> 2874</span>&#160;    <span class="comment">// Add current input shape to splitterDimSizes</span></div><div class="line"><a name="l02875"></a><span class="lineno"> 2875</span>&#160;    <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i = 0; i &lt; inputDimSize; ++i)</div><div class="line"><a name="l02876"></a><span class="lineno"> 2876</span>&#160;    {</div><div class="line"><a name="l02877"></a><span class="lineno"> 2877</span>&#160;        splitterDimSizes[i] = inputTensorInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a8b5d0f8a24e9d9238f412260a552acf8">GetShape</a>()[i];</div><div class="line"><a name="l02878"></a><span class="lineno"> 2878</span>&#160;    }</div><div class="line"><a name="l02879"></a><span class="lineno"> 2879</span>&#160;</div><div class="line"><a name="l02880"></a><span class="lineno"> 2880</span>&#160;    <span class="keywordflow">if</span> (splitterDimSizes[splitDim] % num_split != 0)</div><div class="line"><a name="l02881"></a><span class="lineno"> 2881</span>&#160;    {</div><div class="line"><a name="l02882"></a><span class="lineno"> 2882</span>&#160;        <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_parse_exception.xhtml">ParseException</a>(<span class="stringliteral">&quot;Number of splits must evenly divide the dimension&quot;</span>);</div><div class="line"><a name="l02883"></a><span class="lineno"> 2883</span>&#160;    }</div><div class="line"><a name="l02884"></a><span class="lineno"> 2884</span>&#160;    splitterDimSizes[splitDim] /= num_split;</div><div class="line"><a name="l02885"></a><span class="lineno"> 2885</span>&#160;</div><div class="line"><a name="l02886"></a><span class="lineno"> 2886</span>&#160;    <a class="code" href="structarmnn_1_1_views_descriptor.xhtml">SplitterDescriptor</a> splitDesc(num_split);</div><div class="line"><a name="l02887"></a><span class="lineno"> 2887</span>&#160;    <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> g = 0; g &lt; num_split; ++g)</div><div class="line"><a name="l02888"></a><span class="lineno"> 2888</span>&#160;    {</div><div class="line"><a name="l02889"></a><span class="lineno"> 2889</span>&#160;        <span class="comment">// Set the size of the views.</span></div><div class="line"><a name="l02890"></a><span class="lineno"> 2890</span>&#160;        <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> dimIdx = 0; dimIdx &lt; splitterDimSizes.size(); ++dimIdx)</div><div class="line"><a name="l02891"></a><span class="lineno"> 2891</span>&#160;        {</div><div class="line"><a name="l02892"></a><span class="lineno"> 2892</span>&#160;            splitDesc.<a class="code" href="structarmnn_1_1_views_descriptor.xhtml#aae0893695f5803a3517985c7cb1ccb2e">SetViewSize</a>(g, dimIdx, splitterDimSizes[dimIdx]);</div><div class="line"><a name="l02893"></a><span class="lineno"> 2893</span>&#160;        }</div><div class="line"><a name="l02894"></a><span class="lineno"> 2894</span>&#160;        splitDesc.<a class="code" href="structarmnn_1_1_views_descriptor.xhtml#a2b125117aa61f9baf3a9cb8658aa61a2">SetViewOriginCoord</a>(g, splitDim, splitterDimSizes[splitDim] * g);</div><div class="line"><a name="l02895"></a><span class="lineno"> 2895</span>&#160;    }</div><div class="line"><a name="l02896"></a><span class="lineno"> 2896</span>&#160;</div><div class="line"><a name="l02897"></a><span class="lineno"> 2897</span>&#160;    <a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml">IConnectableLayer</a> *layer = <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a2db3ae8d422f17d455e0ba0cb6291d2a">m_Network</a>-&gt;AddSplitterLayer(splitDesc, nodeDef.name().c_str());</div><div class="line"><a name="l02898"></a><span class="lineno"> 2898</span>&#160;</div><div class="line"><a name="l02899"></a><span class="lineno"> 2899</span>&#160;    inputSlot.<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#ac1835f8756a9f03c02fcf9664e3a0fce">Connect</a>(layer-&gt;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml#a6ec9e0eb66d7d6a01240492a0b18104c">GetInputSlot</a>(0));</div><div class="line"><a name="l02900"></a><span class="lineno"> 2900</span>&#160;</div><div class="line"><a name="l02901"></a><span class="lineno"> 2901</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>(static_cast&lt;unsigned int&gt;(splitterDimSizes.size()),</div><div class="line"><a name="l02902"></a><span class="lineno"> 2902</span>&#160;                                       splitterDimSizes.data());</div><div class="line"><a name="l02903"></a><span class="lineno"> 2903</span>&#160;</div><div class="line"><a name="l02904"></a><span class="lineno"> 2904</span>&#160;    <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i = 0; i &lt; layer-&gt;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml#ac2dac3b61c94de52093616be4ab17f8d">GetNumOutputSlots</a>(); ++i)</div><div class="line"><a name="l02905"></a><span class="lineno"> 2905</span>&#160;    {</div><div class="line"><a name="l02906"></a><span class="lineno"> 2906</span>&#160;        layer-&gt;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml#a80ac4eda2e7f2757ec9dd96fc96dbd16">GetOutputSlot</a>(i).<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#a5ee4a6c9a2481245487b1b1a70d20fd0">SetTensorInfo</a>(<a class="code" href="classarmnn_1_1_tensor_info.xhtml">armnn::TensorInfo</a>(outShape, inputTensorInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#aea909c7327109228ef618d459015def3">GetDataType</a>()));</div><div class="line"><a name="l02907"></a><span class="lineno"> 2907</span>&#160;    }</div><div class="line"><a name="l02908"></a><span class="lineno"> 2908</span>&#160;</div><div class="line"><a name="l02909"></a><span class="lineno"> 2909</span>&#160;    <span class="keywordflow">return</span> std::make_unique&lt;SingleLayerParsedTfOperation&gt;(<span class="keyword">this</span>, nodeDef, layer);</div><div class="line"><a name="l02910"></a><span class="lineno"> 2910</span>&#160;}</div><div class="line"><a name="l02911"></a><span class="lineno"> 2911</span>&#160;</div><div class="line"><a name="l02912"></a><span class="lineno"><a class="line" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#abb49b9213d49e8f2c49dd98506f164b2"> 2912</a></span>&#160;<a class="code" href="namespacearmnn_tf_parser.xhtml#aa36bf288c19fe35767bb6e059636f405">ParsedTfOperationPtr</a> <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#abb49b9213d49e8f2c49dd98506f164b2">ITfParser::TfParserImpl::ParseSoftplus</a>(<span class="keyword">const</span> tensorflow::NodeDef&amp; nodeDef,</div><div class="line"><a name="l02913"></a><span class="lineno"> 2913</span>&#160;    <span class="keyword">const</span> tensorflow::GraphDef&amp; graphDef)</div><div class="line"><a name="l02914"></a><span class="lineno"> 2914</span>&#160;{</div><div class="line"><a name="l02915"></a><span class="lineno"> 2915</span>&#160;    <a class="code" href="namespacearmnn.xhtml#a44affeeb090c3c6a3062830562672e84">IgnoreUnused</a>(graphDef);</div><div class="line"><a name="l02916"></a><span class="lineno"> 2916</span>&#160;</div><div class="line"><a name="l02917"></a><span class="lineno"> 2917</span>&#160;    <a class="code" href="structarmnn_1_1_activation_descriptor.xhtml">ActivationDescriptor</a> activationDesc;</div><div class="line"><a name="l02918"></a><span class="lineno"> 2918</span>&#160;    activationDesc.<a class="code" href="structarmnn_1_1_activation_descriptor.xhtml#af10fa7883e3579950f477bee92a64844">m_Function</a> = ActivationFunction::SoftReLu;</div><div class="line"><a name="l02919"></a><span class="lineno"> 2919</span>&#160;</div><div class="line"><a name="l02920"></a><span class="lineno"> 2920</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a03e49169bbbcfea8be81ff4139d1f75f">AddActivationLayer</a>(nodeDef, activationDesc);</div><div class="line"><a name="l02921"></a><span class="lineno"> 2921</span>&#160;}</div><div class="line"><a name="l02922"></a><span class="lineno"> 2922</span>&#160;</div><div class="line"><a name="l02923"></a><span class="lineno"><a class="line" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a16ffc6437ceb17b6ad370192a5100944"> 2923</a></span>&#160;<a class="code" href="namespacearmnn_tf_parser.xhtml#aa36bf288c19fe35767bb6e059636f405">ParsedTfOperationPtr</a> <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a16ffc6437ceb17b6ad370192a5100944">ITfParser::TfParserImpl::ParseStridedSlice</a>(<span class="keyword">const</span> tensorflow::NodeDef&amp; nodeDef,</div><div class="line"><a name="l02924"></a><span class="lineno"> 2924</span>&#160;                                                               <span class="keyword">const</span> tensorflow::GraphDef&amp; graphDef)</div><div class="line"><a name="l02925"></a><span class="lineno"> 2925</span>&#160;{</div><div class="line"><a name="l02926"></a><span class="lineno"> 2926</span>&#160;    <a class="code" href="namespacearmnn.xhtml#a44affeeb090c3c6a3062830562672e84">IgnoreUnused</a>(graphDef);</div><div class="line"><a name="l02927"></a><span class="lineno"> 2927</span>&#160;</div><div class="line"><a name="l02928"></a><span class="lineno"> 2928</span>&#160;    std::vector&lt;OutputOfConstNodeDef&gt; nodes = <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a9e7a394f59e8d223a79e3db798803c1c">GetTfInputNodes</a>(nodeDef);</div><div class="line"><a name="l02929"></a><span class="lineno"> 2929</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> numInputs = <span class="keyword">static_cast&lt;</span><span class="keywordtype">unsigned</span> <span class="keywordtype">int</span><span class="keyword">&gt;</span>(nodes.size());</div><div class="line"><a name="l02930"></a><span class="lineno"> 2930</span>&#160;    std::vector&lt;OutputOfParsedTfOperation&gt; inputs = <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#ae295ca8b7d19bb5e6db3f93bd4561ee0">GetInputParsedTfOperationsChecked</a>(nodeDef, numInputs);</div><div class="line"><a name="l02931"></a><span class="lineno"> 2931</span>&#160;</div><div class="line"><a name="l02932"></a><span class="lineno"> 2932</span>&#160;    ParsedConstTfOperation&lt;int32_t&gt;* beginNode =</div><div class="line"><a name="l02933"></a><span class="lineno"> 2933</span>&#160;            PolymorphicDowncast&lt;ParsedConstTfOperation&lt;int32_t&gt; *&gt;(inputs[1].m_IndexedValue);</div><div class="line"><a name="l02934"></a><span class="lineno"> 2934</span>&#160;    std::vector&lt;int32_t&gt; beginTensorData;</div><div class="line"><a name="l02935"></a><span class="lineno"> 2935</span>&#160;    beginNode-&gt;GetConstTensor(beginTensorData);</div><div class="line"><a name="l02936"></a><span class="lineno"> 2936</span>&#160;</div><div class="line"><a name="l02937"></a><span class="lineno"> 2937</span>&#160;    ParsedConstTfOperation&lt;int32_t&gt;* endNode =</div><div class="line"><a name="l02938"></a><span class="lineno"> 2938</span>&#160;            PolymorphicDowncast&lt;ParsedConstTfOperation&lt;int32_t&gt; *&gt;(inputs[2].m_IndexedValue);</div><div class="line"><a name="l02939"></a><span class="lineno"> 2939</span>&#160;    std::vector&lt;int32_t&gt; endTensorData;</div><div class="line"><a name="l02940"></a><span class="lineno"> 2940</span>&#160;    endNode-&gt;GetConstTensor(endTensorData);</div><div class="line"><a name="l02941"></a><span class="lineno"> 2941</span>&#160;</div><div class="line"><a name="l02942"></a><span class="lineno"> 2942</span>&#160;    ParsedConstTfOperation&lt;int32_t&gt;* stridesNode =</div><div class="line"><a name="l02943"></a><span class="lineno"> 2943</span>&#160;            PolymorphicDowncast&lt;ParsedConstTfOperation&lt;int32_t&gt; *&gt;(inputs[3].m_IndexedValue);</div><div class="line"><a name="l02944"></a><span class="lineno"> 2944</span>&#160;    std::vector&lt;int32_t&gt; stridesTensorData;</div><div class="line"><a name="l02945"></a><span class="lineno"> 2945</span>&#160;    stridesNode-&gt;GetConstTensor(stridesTensorData);</div><div class="line"><a name="l02946"></a><span class="lineno"> 2946</span>&#160;</div><div class="line"><a name="l02947"></a><span class="lineno"> 2947</span>&#160;    <a class="code" href="structarmnn_1_1_strided_slice_descriptor.xhtml">StridedSliceDescriptor</a> desc;</div><div class="line"><a name="l02948"></a><span class="lineno"> 2948</span>&#160;    desc.<a class="code" href="structarmnn_1_1_strided_slice_descriptor.xhtml#a118fe06b7c2599da60398ee311ede923">m_Begin</a> = beginTensorData;</div><div class="line"><a name="l02949"></a><span class="lineno"> 2949</span>&#160;    desc.<a class="code" href="structarmnn_1_1_strided_slice_descriptor.xhtml#aa68194dd6258ab5b04123005a066ea25">m_End</a> = endTensorData;</div><div class="line"><a name="l02950"></a><span class="lineno"> 2950</span>&#160;    desc.<a class="code" href="structarmnn_1_1_strided_slice_descriptor.xhtml#a0d53caff836b84204adbd1c28752a201">m_Stride</a> = stridesTensorData;</div><div class="line"><a name="l02951"></a><span class="lineno"> 2951</span>&#160;    desc.<a class="code" href="structarmnn_1_1_strided_slice_descriptor.xhtml#a61081be1483984e33db452c75d569f51">m_BeginMask</a> = ReadMandatoryNodeInt32Attribute(nodeDef, <span class="stringliteral">&quot;begin_mask&quot;</span>);</div><div class="line"><a name="l02952"></a><span class="lineno"> 2952</span>&#160;    desc.<a class="code" href="structarmnn_1_1_strided_slice_descriptor.xhtml#ac37e49c0d6e6e54f9d2015d0f11f8ee7">m_EndMask</a> = ReadMandatoryNodeInt32Attribute(nodeDef, <span class="stringliteral">&quot;end_mask&quot;</span>);</div><div class="line"><a name="l02953"></a><span class="lineno"> 2953</span>&#160;    desc.<a class="code" href="structarmnn_1_1_strided_slice_descriptor.xhtml#af996d82c47e43a16f4c8faa6c6b3e030">m_EllipsisMask</a> = ReadMandatoryNodeInt32Attribute(nodeDef, <span class="stringliteral">&quot;ellipsis_mask&quot;</span>);</div><div class="line"><a name="l02954"></a><span class="lineno"> 2954</span>&#160;    desc.<a class="code" href="structarmnn_1_1_strided_slice_descriptor.xhtml#a7c91eda2b331d607bae92cd8ebf50bb9">m_NewAxisMask</a> = ReadMandatoryNodeInt32Attribute(nodeDef, <span class="stringliteral">&quot;new_axis_mask&quot;</span>);</div><div class="line"><a name="l02955"></a><span class="lineno"> 2955</span>&#160;    desc.<a class="code" href="structarmnn_1_1_strided_slice_descriptor.xhtml#a6d0384878432cfc9652b7ae8bc59506f">m_ShrinkAxisMask</a> = ReadMandatoryNodeInt32Attribute(nodeDef, <span class="stringliteral">&quot;shrink_axis_mask&quot;</span>);</div><div class="line"><a name="l02956"></a><span class="lineno"> 2956</span>&#160;    desc.<a class="code" href="structarmnn_1_1_strided_slice_descriptor.xhtml#a6089e1ca91914015777ea780a513131a">m_DataLayout</a> = <a class="code" href="namespacearmnn.xhtml#ad1d5cce2d9e9a5d61c243e5c989112e0ad066db54b89b0912e7e7c6da51e2da51">armnn::DataLayout::NHWC</a>;</div><div class="line"><a name="l02957"></a><span class="lineno"> 2957</span>&#160;    <a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml">IConnectableLayer</a>* <span class="keyword">const</span> layer = <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a2db3ae8d422f17d455e0ba0cb6291d2a">m_Network</a>-&gt;AddStridedSliceLayer(desc, nodeDef.name().c_str());</div><div class="line"><a name="l02958"></a><span class="lineno"> 2958</span>&#160;</div><div class="line"><a name="l02959"></a><span class="lineno"> 2959</span>&#160;    <a class="code" href="classarmnn_1_1_i_output_slot.xhtml">IOutputSlot</a>&amp; prevLayerSlot = inputs[0].m_IndexedValue-&gt;ResolveArmnnOutputSlot(inputs[0].m_Index);</div><div class="line"><a name="l02960"></a><span class="lineno"> 2960</span>&#160;    <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> inputTensorInfo = prevLayerSlot.<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#a9943775a364fc4ab53b85ac88f311886">GetTensorInfo</a>();</div><div class="line"><a name="l02961"></a><span class="lineno"> 2961</span>&#160;</div><div class="line"><a name="l02962"></a><span class="lineno"> 2962</span>&#160;    <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> outputTensorInfo;</div><div class="line"><a name="l02963"></a><span class="lineno"> 2963</span>&#160;    <a class="code" href="namespacearmnn_utils.xhtml#a9300450bab29bb951d6f8755b7d9d3a8">CalculateStridedSliceOutputTensorInfo</a>(inputTensorInfo, desc, outputTensorInfo);</div><div class="line"><a name="l02964"></a><span class="lineno"> 2964</span>&#160;</div><div class="line"><a name="l02965"></a><span class="lineno"> 2965</span>&#160;    prevLayerSlot.<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#ac1835f8756a9f03c02fcf9664e3a0fce">Connect</a>(layer-&gt;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml#a6ec9e0eb66d7d6a01240492a0b18104c">GetInputSlot</a>(0));</div><div class="line"><a name="l02966"></a><span class="lineno"> 2966</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="l02967"></a><span class="lineno"> 2967</span>&#160;</div><div class="line"><a name="l02968"></a><span class="lineno"> 2968</span>&#160;    <span class="keywordflow">return</span> std::make_unique&lt;SingleLayerParsedTfOperation&gt;(<span class="keyword">this</span>, nodeDef, layer);</div><div class="line"><a name="l02969"></a><span class="lineno"> 2969</span>&#160;}</div><div class="line"><a name="l02970"></a><span class="lineno"> 2970</span>&#160;</div><div class="line"><a name="l02971"></a><span class="lineno"><a class="line" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a44a628660248f91dad0ba4f625014bcc"> 2971</a></span>&#160;<a class="code" href="namespacearmnn_tf_parser.xhtml#aa36bf288c19fe35767bb6e059636f405">ParsedTfOperationPtr</a> <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a44a628660248f91dad0ba4f625014bcc">ITfParser::TfParserImpl::ParseTanh</a>(<span class="keyword">const</span> tensorflow::NodeDef&amp; nodeDef,</div><div class="line"><a name="l02972"></a><span class="lineno"> 2972</span>&#160;                                                        <span class="keyword">const</span> tensorflow::GraphDef&amp; graphDef)</div><div class="line"><a name="l02973"></a><span class="lineno"> 2973</span>&#160;{</div><div class="line"><a name="l02974"></a><span class="lineno"> 2974</span>&#160;    <a class="code" href="namespacearmnn.xhtml#a44affeeb090c3c6a3062830562672e84">IgnoreUnused</a>(graphDef);</div><div class="line"><a name="l02975"></a><span class="lineno"> 2975</span>&#160;</div><div class="line"><a name="l02976"></a><span class="lineno"> 2976</span>&#160;    <a class="code" href="structarmnn_1_1_activation_descriptor.xhtml">ActivationDescriptor</a> activationDesc;</div><div class="line"><a name="l02977"></a><span class="lineno"> 2977</span>&#160;    activationDesc.<a class="code" href="structarmnn_1_1_activation_descriptor.xhtml#af10fa7883e3579950f477bee92a64844">m_Function</a> = ActivationFunction::TanH;</div><div class="line"><a name="l02978"></a><span class="lineno"> 2978</span>&#160;    activationDesc.<a class="code" href="structarmnn_1_1_activation_descriptor.xhtml#a017b2990003a014234f13e999dc7c689">m_A</a> = 1.0f;</div><div class="line"><a name="l02979"></a><span class="lineno"> 2979</span>&#160;    activationDesc.<a class="code" href="structarmnn_1_1_activation_descriptor.xhtml#a28c4c9cb15f6be3499abbc46b356060b">m_B</a> = 1.0f;</div><div class="line"><a name="l02980"></a><span class="lineno"> 2980</span>&#160;</div><div class="line"><a name="l02981"></a><span class="lineno"> 2981</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a03e49169bbbcfea8be81ff4139d1f75f">AddActivationLayer</a>(nodeDef, activationDesc);</div><div class="line"><a name="l02982"></a><span class="lineno"> 2982</span>&#160;}</div><div class="line"><a name="l02983"></a><span class="lineno"> 2983</span>&#160;</div><div class="line"><a name="l02984"></a><span class="lineno"><a class="line" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a03e49169bbbcfea8be81ff4139d1f75f"> 2984</a></span>&#160;<a class="code" href="namespacearmnn_tf_parser.xhtml#aa36bf288c19fe35767bb6e059636f405">ParsedTfOperationPtr</a> <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a03e49169bbbcfea8be81ff4139d1f75f">ITfParser::TfParserImpl::AddActivationLayer</a>(<span class="keyword">const</span> tensorflow::NodeDef&amp; nodeDef,</div><div class="line"><a name="l02985"></a><span class="lineno"> 2985</span>&#160;    <a class="code" href="structarmnn_1_1_activation_descriptor.xhtml">ActivationDescriptor</a>&amp; activationDesc)</div><div class="line"><a name="l02986"></a><span class="lineno"> 2986</span>&#160;{</div><div class="line"><a name="l02987"></a><span class="lineno"> 2987</span>&#160;    std::vector&lt;OutputOfParsedTfOperation&gt; inputs = <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#ae295ca8b7d19bb5e6db3f93bd4561ee0">GetInputParsedTfOperationsChecked</a>(nodeDef, 1);</div><div class="line"><a name="l02988"></a><span class="lineno"> 2988</span>&#160;</div><div class="line"><a name="l02989"></a><span class="lineno"> 2989</span>&#160;    <a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml">IConnectableLayer</a>* <span class="keyword">const</span> layer = <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a2db3ae8d422f17d455e0ba0cb6291d2a">m_Network</a>-&gt;AddActivationLayer(activationDesc, nodeDef.name().c_str());</div><div class="line"><a name="l02990"></a><span class="lineno"> 2990</span>&#160;</div><div class="line"><a name="l02991"></a><span class="lineno"> 2991</span>&#160;    <a class="code" href="classarmnn_1_1_i_output_slot.xhtml">IOutputSlot</a>&amp; prevLayerOutputSlot = inputs[0].m_IndexedValue-&gt;ResolveArmnnOutputSlot(inputs[0].m_Index);</div><div class="line"><a name="l02992"></a><span class="lineno"> 2992</span>&#160;    prevLayerOutputSlot.<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#ac1835f8756a9f03c02fcf9664e3a0fce">Connect</a>(layer-&gt;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml#a6ec9e0eb66d7d6a01240492a0b18104c">GetInputSlot</a>(0));</div><div class="line"><a name="l02993"></a><span class="lineno"> 2993</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>(prevLayerOutputSlot.<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#a9943775a364fc4ab53b85ac88f311886">GetTensorInfo</a>());</div><div class="line"><a name="l02994"></a><span class="lineno"> 2994</span>&#160;    <span class="keywordflow">return</span> std::make_unique&lt;SingleLayerParsedTfOperation&gt;(<span class="keyword">this</span>, nodeDef, layer);</div><div class="line"><a name="l02995"></a><span class="lineno"> 2995</span>&#160;}</div><div class="line"><a name="l02996"></a><span class="lineno"> 2996</span>&#160;</div><div class="line"><a name="l02997"></a><span class="lineno"><a class="line" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a4cb0ff36b50bf417cfde094f34ec8e04"> 2997</a></span>&#160;<a class="code" href="namespacearmnn_tf_parser.xhtml#aa36bf288c19fe35767bb6e059636f405">ParsedTfOperationPtr</a> <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a4cb0ff36b50bf417cfde094f34ec8e04">ITfParser::TfParserImpl::ParseMaxPool</a>(<span class="keyword">const</span> tensorflow::NodeDef&amp; nodeDef,</div><div class="line"><a name="l02998"></a><span class="lineno"> 2998</span>&#160;    <span class="keyword">const</span> tensorflow::GraphDef&amp; graphDef)</div><div class="line"><a name="l02999"></a><span class="lineno"> 2999</span>&#160;{</div><div class="line"><a name="l03000"></a><span class="lineno"> 3000</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a31983c2de0331de6b32bf08c0d04cb0c">ParsePooling2d</a>(nodeDef, graphDef, PoolingAlgorithm::Max);</div><div class="line"><a name="l03001"></a><span class="lineno"> 3001</span>&#160;}</div><div class="line"><a name="l03002"></a><span class="lineno"> 3002</span>&#160;</div><div class="line"><a name="l03003"></a><span class="lineno"><a class="line" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a8a7168f2bbef09692d1983b3059046ac"> 3003</a></span>&#160;<a class="code" href="namespacearmnn_tf_parser.xhtml#aa36bf288c19fe35767bb6e059636f405">ParsedTfOperationPtr</a> <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a8a7168f2bbef09692d1983b3059046ac">ITfParser::TfParserImpl::ParseAvgPool</a>(<span class="keyword">const</span> tensorflow::NodeDef&amp; nodeDef,</div><div class="line"><a name="l03004"></a><span class="lineno"> 3004</span>&#160;    <span class="keyword">const</span> tensorflow::GraphDef&amp; graphDef)</div><div class="line"><a name="l03005"></a><span class="lineno"> 3005</span>&#160;{</div><div class="line"><a name="l03006"></a><span class="lineno"> 3006</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a31983c2de0331de6b32bf08c0d04cb0c">ParsePooling2d</a>(nodeDef, graphDef, PoolingAlgorithm::Average);</div><div class="line"><a name="l03007"></a><span class="lineno"> 3007</span>&#160;}</div><div class="line"><a name="l03008"></a><span class="lineno"> 3008</span>&#160;</div><div class="line"><a name="l03009"></a><span class="lineno"><a class="line" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a31983c2de0331de6b32bf08c0d04cb0c"> 3009</a></span>&#160;<a class="code" href="namespacearmnn_tf_parser.xhtml#aa36bf288c19fe35767bb6e059636f405">ParsedTfOperationPtr</a> <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a31983c2de0331de6b32bf08c0d04cb0c">ITfParser::TfParserImpl::ParsePooling2d</a>(<span class="keyword">const</span> tensorflow::NodeDef&amp; nodeDef,</div><div class="line"><a name="l03010"></a><span class="lineno"> 3010</span>&#160;    <span class="keyword">const</span> tensorflow::GraphDef&amp; graphDef, <a class="code" href="namespacearmnn.xhtml#a961bbfe1db71a848eff5a1f0ab775718">PoolingAlgorithm</a> pooltype)</div><div class="line"><a name="l03011"></a><span class="lineno"> 3011</span>&#160;{</div><div class="line"><a name="l03012"></a><span class="lineno"> 3012</span>&#160;    <a class="code" href="namespacearmnn.xhtml#a44affeeb090c3c6a3062830562672e84">IgnoreUnused</a>(graphDef);</div><div class="line"><a name="l03013"></a><span class="lineno"> 3013</span>&#160;</div><div class="line"><a name="l03014"></a><span class="lineno"> 3014</span>&#160;    std::vector&lt;OutputOfParsedTfOperation&gt; inputs = <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#ae295ca8b7d19bb5e6db3f93bd4561ee0">GetInputParsedTfOperationsChecked</a>(nodeDef, 1);</div><div class="line"><a name="l03015"></a><span class="lineno"> 3015</span>&#160;    <a class="code" href="classarmnn_1_1_i_output_slot.xhtml">IOutputSlot</a>&amp; inputSlot = inputs[0].m_IndexedValue-&gt;ResolveArmnnOutputSlot(inputs[0].m_Index);</div><div class="line"><a name="l03016"></a><span class="lineno"> 3016</span>&#160;    <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> inputTensorInfo = inputSlot.<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#a9943775a364fc4ab53b85ac88f311886">GetTensorInfo</a>();</div><div class="line"><a name="l03017"></a><span class="lineno"> 3017</span>&#160;</div><div class="line"><a name="l03018"></a><span class="lineno"> 3018</span>&#160;    <span class="keywordflow">if</span> (inputs.size() != 1)</div><div class="line"><a name="l03019"></a><span class="lineno"> 3019</span>&#160;    {</div><div class="line"><a name="l03020"></a><span class="lineno"> 3020</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="l03021"></a><span class="lineno"> 3021</span>&#160;            fmt::format(<span class="stringliteral">&quot;2D Pooling expects one input!. Got {} for Node {} {}&quot;</span>,</div><div class="line"><a name="l03022"></a><span class="lineno"> 3022</span>&#160;                        inputs.size(),</div><div class="line"><a name="l03023"></a><span class="lineno"> 3023</span>&#160;                        nodeDef.name(),</div><div class="line"><a name="l03024"></a><span class="lineno"> 3024</span>&#160;                        <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l03025"></a><span class="lineno"> 3025</span>&#160;    }</div><div class="line"><a name="l03026"></a><span class="lineno"> 3026</span>&#160;</div><div class="line"><a name="l03027"></a><span class="lineno"> 3027</span>&#160;    std::string paddingString = ReadMandatoryNodeStringAttribute(nodeDef, <span class="stringliteral">&quot;padding&quot;</span>);</div><div class="line"><a name="l03028"></a><span class="lineno"> 3028</span>&#160;    std::string dataFormat = ReadMandatoryNodeStringAttribute(nodeDef, <span class="stringliteral">&quot;data_format&quot;</span>);</div><div class="line"><a name="l03029"></a><span class="lineno"> 3029</span>&#160;    std::vector&lt;uint32_t&gt; strides = ReadMandatoryNodeUint32ListAttribute(nodeDef, <span class="stringliteral">&quot;strides&quot;</span>);</div><div class="line"><a name="l03030"></a><span class="lineno"> 3030</span>&#160;    std::vector&lt;uint32_t&gt; ksize = ReadMandatoryNodeUint32ListAttribute(nodeDef, <span class="stringliteral">&quot;ksize&quot;</span>); <span class="comment">// size of pool windows</span></div><div class="line"><a name="l03031"></a><span class="lineno"> 3031</span>&#160;</div><div class="line"><a name="l03032"></a><span class="lineno"> 3032</span>&#160;    <a class="code" href="structarmnn_1_1_pooling2d_descriptor.xhtml">Pooling2dDescriptor</a> pooling2dDescriptor;</div><div class="line"><a name="l03033"></a><span class="lineno"> 3033</span>&#160;    pooling2dDescriptor.<a class="code" href="structarmnn_1_1_pooling2d_descriptor.xhtml#a0031997bf43bd2747656c31e4977793a">m_PoolType</a>            = pooltype;</div><div class="line"><a name="l03034"></a><span class="lineno"> 3034</span>&#160;    pooling2dDescriptor.<a class="code" href="structarmnn_1_1_pooling2d_descriptor.xhtml#a8c29d6ea9b4186d69aad5961c910939c">m_PaddingMethod</a>       = PaddingMethod::Exclude;</div><div class="line"><a name="l03035"></a><span class="lineno"> 3035</span>&#160;    pooling2dDescriptor.<a class="code" href="structarmnn_1_1_pooling2d_descriptor.xhtml#affb5b68b3eba3ed45a06c7cde7781962">m_OutputShapeRounding</a> = OutputShapeRounding::Floor;</div><div class="line"><a name="l03036"></a><span class="lineno"> 3036</span>&#160;</div><div class="line"><a name="l03037"></a><span class="lineno"> 3037</span>&#160;    <a class="code" href="_tf_parser_8cpp.xhtml#a3fb047570644cae325aa88d3cd7bb96e">CHECK_DATA_FORMAT</a>(nodeDef, dataFormat, <span class="stringliteral">&quot;Pooling2D&quot;</span>);</div><div class="line"><a name="l03038"></a><span class="lineno"> 3038</span>&#160;    <a class="code" href="namespacearmnn.xhtml#ad1d5cce2d9e9a5d61c243e5c989112e0">DataLayout</a> dataLayout = dataFormat == <span class="stringliteral">&quot;NHWC&quot;</span> ? DataLayout::NHWC : DataLayout::NCHW;</div><div class="line"><a name="l03039"></a><span class="lineno"> 3039</span>&#160;    pooling2dDescriptor.<a class="code" href="structarmnn_1_1_pooling2d_descriptor.xhtml#a6089e1ca91914015777ea780a513131a">m_DataLayout</a> = dataLayout;</div><div class="line"><a name="l03040"></a><span class="lineno"> 3040</span>&#160;    <a class="code" href="classarmnn_utils_1_1_data_layout_indexed.xhtml">DataLayoutIndexed</a> dataLayoutIndexed(dataLayout);</div><div class="line"><a name="l03041"></a><span class="lineno"> 3041</span>&#160;</div><div class="line"><a name="l03042"></a><span class="lineno"> 3042</span>&#160;    pooling2dDescriptor.<a class="code" href="structarmnn_1_1_pooling2d_descriptor.xhtml#afe6a3377c4531315354def9023c8fdda">m_StrideX</a>    = strides[dataLayoutIndexed.<a class="code" href="classarmnn_utils_1_1_data_layout_indexed.xhtml#a414e6f95548e6f7a01d5028b55ad3941">GetWidthIndex</a>()];</div><div class="line"><a name="l03043"></a><span class="lineno"> 3043</span>&#160;    pooling2dDescriptor.<a class="code" href="structarmnn_1_1_pooling2d_descriptor.xhtml#ac1fe174bbadfb39a2b636940c2e647c8">m_StrideY</a>    = strides[dataLayoutIndexed.<a class="code" href="classarmnn_utils_1_1_data_layout_indexed.xhtml#a61c00316c443adc233c24e85c6c5b740">GetHeightIndex</a>()];</div><div class="line"><a name="l03044"></a><span class="lineno"> 3044</span>&#160;    pooling2dDescriptor.<a class="code" href="structarmnn_1_1_pooling2d_descriptor.xhtml#a6d8fb685cc1ff224f25aa127fcf62c86">m_PoolWidth</a>  = ksize[dataLayoutIndexed.<a class="code" href="classarmnn_utils_1_1_data_layout_indexed.xhtml#a414e6f95548e6f7a01d5028b55ad3941">GetWidthIndex</a>()];</div><div class="line"><a name="l03045"></a><span class="lineno"> 3045</span>&#160;    pooling2dDescriptor.<a class="code" href="structarmnn_1_1_pooling2d_descriptor.xhtml#a5699e8606c37d18c03910b242cd1b010">m_PoolHeight</a> = ksize[dataLayoutIndexed.<a class="code" href="classarmnn_utils_1_1_data_layout_indexed.xhtml#a61c00316c443adc233c24e85c6c5b740">GetHeightIndex</a>()];</div><div class="line"><a name="l03046"></a><span class="lineno"> 3046</span>&#160;</div><div class="line"><a name="l03047"></a><span class="lineno"> 3047</span>&#160;    uint32_t inputHeight = inputTensorInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a8b5d0f8a24e9d9238f412260a552acf8">GetShape</a>()[dataLayoutIndexed.<a class="code" href="classarmnn_utils_1_1_data_layout_indexed.xhtml#a61c00316c443adc233c24e85c6c5b740">GetHeightIndex</a>()];</div><div class="line"><a name="l03048"></a><span class="lineno"> 3048</span>&#160;    uint32_t inputWidth  = inputTensorInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a8b5d0f8a24e9d9238f412260a552acf8">GetShape</a>()[dataLayoutIndexed.<a class="code" href="classarmnn_utils_1_1_data_layout_indexed.xhtml#a414e6f95548e6f7a01d5028b55ad3941">GetWidthIndex</a>()];</div><div class="line"><a name="l03049"></a><span class="lineno"> 3049</span>&#160;</div><div class="line"><a name="l03050"></a><span class="lineno"> 3050</span>&#160;    <span class="keywordtype">bool</span> padding = <span class="keyword">false</span>;</div><div class="line"><a name="l03051"></a><span class="lineno"> 3051</span>&#160;    <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> outputInfo;</div><div class="line"><a name="l03052"></a><span class="lineno"> 3052</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> outputHeight = 0;</div><div class="line"><a name="l03053"></a><span class="lineno"> 3053</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> outputWidth  = 0;</div><div class="line"><a name="l03054"></a><span class="lineno"> 3054</span>&#160;</div><div class="line"><a name="l03055"></a><span class="lineno"> 3055</span>&#160;    <a class="code" href="_tf_parser_8cpp.xhtml#aab838eb7734e531bb5be6f6dece673bf">CHECK_PADDING_TYPE</a>(nodeDef, paddingString);</div><div class="line"><a name="l03056"></a><span class="lineno"> 3056</span>&#160;</div><div class="line"><a name="l03057"></a><span class="lineno"> 3057</span>&#160;    <span class="keywordflow">if</span> (paddingString == <span class="stringliteral">&quot;SAME&quot;</span>)</div><div class="line"><a name="l03058"></a><span class="lineno"> 3058</span>&#160;    {</div><div class="line"><a name="l03059"></a><span class="lineno"> 3059</span>&#160;        padding = <span class="keyword">true</span>;</div><div class="line"><a name="l03060"></a><span class="lineno"> 3060</span>&#160;</div><div class="line"><a name="l03061"></a><span class="lineno"> 3061</span>&#160;        outputHeight = <span class="keyword">static_cast&lt;</span>uint32_t<span class="keyword">&gt;</span>(ceil(static_cast&lt;float&gt;(inputHeight) /</div><div class="line"><a name="l03062"></a><span class="lineno"> 3062</span>&#160;                                                  static_cast&lt;float&gt;(pooling2dDescriptor.<a class="code" href="structarmnn_1_1_pooling2d_descriptor.xhtml#ac1fe174bbadfb39a2b636940c2e647c8">m_StrideY</a>)));</div><div class="line"><a name="l03063"></a><span class="lineno"> 3063</span>&#160;        outputWidth  = <span class="keyword">static_cast&lt;</span>uint32_t<span class="keyword">&gt;</span>(ceil(static_cast&lt;float&gt;(inputWidth) /</div><div class="line"><a name="l03064"></a><span class="lineno"> 3064</span>&#160;                                                  static_cast&lt;float&gt;(pooling2dDescriptor.<a class="code" href="structarmnn_1_1_pooling2d_descriptor.xhtml#afe6a3377c4531315354def9023c8fdda">m_StrideX</a>)));</div><div class="line"><a name="l03065"></a><span class="lineno"> 3065</span>&#160;    }</div><div class="line"><a name="l03066"></a><span class="lineno"> 3066</span>&#160;    <span class="keywordflow">else</span> <span class="keywordflow">if</span> (paddingString == <span class="stringliteral">&quot;VALID&quot;</span>)</div><div class="line"><a name="l03067"></a><span class="lineno"> 3067</span>&#160;    {</div><div class="line"><a name="l03068"></a><span class="lineno"> 3068</span>&#160;        padding = <span class="keyword">false</span>;</div><div class="line"><a name="l03069"></a><span class="lineno"> 3069</span>&#160;</div><div class="line"><a name="l03070"></a><span class="lineno"> 3070</span>&#160;        outputHeight = <span class="keyword">static_cast&lt;</span>uint32_t<span class="keyword">&gt;</span>(ceil(</div><div class="line"><a name="l03071"></a><span class="lineno"> 3071</span>&#160;                                              static_cast&lt;float&gt;(inputHeight - pooling2dDescriptor.<a class="code" href="structarmnn_1_1_pooling2d_descriptor.xhtml#a5699e8606c37d18c03910b242cd1b010">m_PoolHeight</a> + 1) /</div><div class="line"><a name="l03072"></a><span class="lineno"> 3072</span>&#160;                                              static_cast&lt;float&gt;(pooling2dDescriptor.<a class="code" href="structarmnn_1_1_pooling2d_descriptor.xhtml#ac1fe174bbadfb39a2b636940c2e647c8">m_StrideY</a>)));</div><div class="line"><a name="l03073"></a><span class="lineno"> 3073</span>&#160;        outputWidth  = <span class="keyword">static_cast&lt;</span>uint32_t<span class="keyword">&gt;</span>(ceil(</div><div class="line"><a name="l03074"></a><span class="lineno"> 3074</span>&#160;                                              static_cast&lt;float&gt;(inputWidth - pooling2dDescriptor.<a class="code" href="structarmnn_1_1_pooling2d_descriptor.xhtml#a6d8fb685cc1ff224f25aa127fcf62c86">m_PoolWidth</a> + 1) /</div><div class="line"><a name="l03075"></a><span class="lineno"> 3075</span>&#160;                                              static_cast&lt;float&gt;(pooling2dDescriptor.<a class="code" href="structarmnn_1_1_pooling2d_descriptor.xhtml#afe6a3377c4531315354def9023c8fdda">m_StrideX</a>)));</div><div class="line"><a name="l03076"></a><span class="lineno"> 3076</span>&#160;    }</div><div class="line"><a name="l03077"></a><span class="lineno"> 3077</span>&#160;</div><div class="line"><a name="l03078"></a><span class="lineno"> 3078</span>&#160;    <span class="keywordflow">switch</span> (dataLayout)</div><div class="line"><a name="l03079"></a><span class="lineno"> 3079</span>&#160;    {</div><div class="line"><a name="l03080"></a><span class="lineno"> 3080</span>&#160;        <span class="keywordflow">case</span> DataLayout::NHWC:</div><div class="line"><a name="l03081"></a><span class="lineno"> 3081</span>&#160;            outputInfo = <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a>({ inputTensorInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a8b5d0f8a24e9d9238f412260a552acf8">GetShape</a>()[0],</div><div class="line"><a name="l03082"></a><span class="lineno"> 3082</span>&#160;                                      outputHeight,</div><div class="line"><a name="l03083"></a><span class="lineno"> 3083</span>&#160;                                      outputWidth,</div><div class="line"><a name="l03084"></a><span class="lineno"> 3084</span>&#160;                                      inputTensorInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a8b5d0f8a24e9d9238f412260a552acf8">GetShape</a>()[3] },</div><div class="line"><a name="l03085"></a><span class="lineno"> 3085</span>&#160;                                    DataType::Float32);</div><div class="line"><a name="l03086"></a><span class="lineno"> 3086</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l03087"></a><span class="lineno"> 3087</span>&#160;        <span class="keywordflow">case</span> DataLayout::NCHW:</div><div class="line"><a name="l03088"></a><span class="lineno"> 3088</span>&#160;            outputInfo = <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a>({ inputTensorInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a8b5d0f8a24e9d9238f412260a552acf8">GetShape</a>()[0],</div><div class="line"><a name="l03089"></a><span class="lineno"> 3089</span>&#160;                                      inputTensorInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a8b5d0f8a24e9d9238f412260a552acf8">GetShape</a>()[1],</div><div class="line"><a name="l03090"></a><span class="lineno"> 3090</span>&#160;                                      outputHeight,</div><div class="line"><a name="l03091"></a><span class="lineno"> 3091</span>&#160;                                      outputWidth },</div><div class="line"><a name="l03092"></a><span class="lineno"> 3092</span>&#160;                                    DataType::Float32);</div><div class="line"><a name="l03093"></a><span class="lineno"> 3093</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l03094"></a><span class="lineno"> 3094</span>&#160;    }</div><div class="line"><a name="l03095"></a><span class="lineno"> 3095</span>&#160;</div><div class="line"><a name="l03096"></a><span class="lineno"> 3096</span>&#160;    <a class="code" href="namespacearmnn_tf_parser.xhtml#aca0a31de02d5c087029bb28c9202b4d6">CalcPadding</a>(inputWidth, pooling2dDescriptor.<a class="code" href="structarmnn_1_1_pooling2d_descriptor.xhtml#a6d8fb685cc1ff224f25aa127fcf62c86">m_PoolWidth</a>, pooling2dDescriptor.<a class="code" href="structarmnn_1_1_pooling2d_descriptor.xhtml#afe6a3377c4531315354def9023c8fdda">m_StrideX</a>, 1u,</div><div class="line"><a name="l03097"></a><span class="lineno"> 3097</span>&#160;                pooling2dDescriptor.<a class="code" href="structarmnn_1_1_pooling2d_descriptor.xhtml#ac18546ebbebbb32fe0a03baa9bf2c600">m_PadLeft</a>, pooling2dDescriptor.<a class="code" href="structarmnn_1_1_pooling2d_descriptor.xhtml#a002bc30e590d78cbb4f4d12171055ca7">m_PadRight</a>, padding);</div><div class="line"><a name="l03098"></a><span class="lineno"> 3098</span>&#160;    <a class="code" href="namespacearmnn_tf_parser.xhtml#aca0a31de02d5c087029bb28c9202b4d6">CalcPadding</a>(inputHeight, pooling2dDescriptor.<a class="code" href="structarmnn_1_1_pooling2d_descriptor.xhtml#a5699e8606c37d18c03910b242cd1b010">m_PoolHeight</a>, pooling2dDescriptor.<a class="code" href="structarmnn_1_1_pooling2d_descriptor.xhtml#ac1fe174bbadfb39a2b636940c2e647c8">m_StrideY</a>, 1u,</div><div class="line"><a name="l03099"></a><span class="lineno"> 3099</span>&#160;                pooling2dDescriptor.<a class="code" href="structarmnn_1_1_pooling2d_descriptor.xhtml#a56b51f56cef50cdfa554258eecdab046">m_PadTop</a>, pooling2dDescriptor.<a class="code" href="structarmnn_1_1_pooling2d_descriptor.xhtml#aa9e49717ebdb741e8c767741647fc618">m_PadBottom</a>, padding);</div><div class="line"><a name="l03100"></a><span class="lineno"> 3100</span>&#160;</div><div class="line"><a name="l03101"></a><span class="lineno"> 3101</span>&#160;</div><div class="line"><a name="l03102"></a><span class="lineno"> 3102</span>&#160;    <a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml">IConnectableLayer</a>* layer = <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a2db3ae8d422f17d455e0ba0cb6291d2a">m_Network</a>-&gt;AddPooling2dLayer(pooling2dDescriptor, nodeDef.name().c_str());</div><div class="line"><a name="l03103"></a><span class="lineno"> 3103</span>&#160;    <span class="keywordflow">if</span> (layer == <span class="keyword">nullptr</span>)</div><div class="line"><a name="l03104"></a><span class="lineno"> 3104</span>&#160;    {</div><div class="line"><a name="l03105"></a><span class="lineno"> 3105</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="l03106"></a><span class="lineno"> 3106</span>&#160;            fmt::format(<span class="stringliteral">&quot;Failed to add pooling2d layer for {} {}&quot;</span>,</div><div class="line"><a name="l03107"></a><span class="lineno"> 3107</span>&#160;                        nodeDef.name(),</div><div class="line"><a name="l03108"></a><span class="lineno"> 3108</span>&#160;                        <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l03109"></a><span class="lineno"> 3109</span>&#160;    }</div><div class="line"><a name="l03110"></a><span class="lineno"> 3110</span>&#160;</div><div class="line"><a name="l03111"></a><span class="lineno"> 3111</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);</div><div class="line"><a name="l03112"></a><span class="lineno"> 3112</span>&#160;</div><div class="line"><a name="l03113"></a><span class="lineno"> 3113</span>&#160;    inputSlot.<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#ac1835f8756a9f03c02fcf9664e3a0fce">Connect</a>(layer-&gt;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml#a6ec9e0eb66d7d6a01240492a0b18104c">GetInputSlot</a>(0));</div><div class="line"><a name="l03114"></a><span class="lineno"> 3114</span>&#160;</div><div class="line"><a name="l03115"></a><span class="lineno"> 3115</span>&#160;    <span class="keywordflow">return</span> std::make_unique&lt;SingleLayerParsedTfOperation&gt;(<span class="keyword">this</span>, nodeDef, layer);</div><div class="line"><a name="l03116"></a><span class="lineno"> 3116</span>&#160;}</div><div class="line"><a name="l03117"></a><span class="lineno"> 3117</span>&#160;</div><div class="line"><a name="l03118"></a><span class="lineno"><a class="line" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a19ef0406d9678e177106095779f0546e"> 3118</a></span>&#160;<a class="code" href="namespacearmnn_tf_parser.xhtml#aa36bf288c19fe35767bb6e059636f405">ParsedTfOperationPtr</a> <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a19ef0406d9678e177106095779f0546e">ITfParser::TfParserImpl::AddAdditionLayer</a>(<span class="keyword">const</span> tensorflow::NodeDef&amp; nodeDef, <span class="keywordtype">bool</span> isBiasAdd)</div><div class="line"><a name="l03119"></a><span class="lineno"> 3119</span>&#160;{</div><div class="line"><a name="l03120"></a><span class="lineno"> 3120</span>&#160;    std::vector&lt;OutputOfParsedTfOperation&gt; inputs = <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#ae295ca8b7d19bb5e6db3f93bd4561ee0">GetInputParsedTfOperationsChecked</a>(nodeDef, 2);</div><div class="line"><a name="l03121"></a><span class="lineno"> 3121</span>&#160;</div><div class="line"><a name="l03122"></a><span class="lineno"> 3122</span>&#160;    <a class="code" href="classarmnn_1_1_i_output_slot.xhtml">IOutputSlot</a>* input0Slot = &amp;inputs[0].m_IndexedValue-&gt;ResolveArmnnOutputSlot(inputs[0].m_Index);</div><div class="line"><a name="l03123"></a><span class="lineno"> 3123</span>&#160;    <a class="code" href="classarmnn_1_1_i_output_slot.xhtml">IOutputSlot</a>* input1Slot = &amp;inputs[1].m_IndexedValue-&gt;ResolveArmnnOutputSlot(inputs[1].m_Index);</div><div class="line"><a name="l03124"></a><span class="lineno"> 3124</span>&#160;</div><div class="line"><a name="l03125"></a><span class="lineno"> 3125</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a>&amp; input0Info = input0Slot-&gt;<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#a9943775a364fc4ab53b85ac88f311886">GetTensorInfo</a>();</div><div class="line"><a name="l03126"></a><span class="lineno"> 3126</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a>&amp; input1Info = input1Slot-&gt;<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#a9943775a364fc4ab53b85ac88f311886">GetTensorInfo</a>();</div><div class="line"><a name="l03127"></a><span class="lineno"> 3127</span>&#160;</div><div class="line"><a name="l03128"></a><span class="lineno"> 3128</span>&#160;    <span class="keywordflow">if</span> (isBiasAdd)</div><div class="line"><a name="l03129"></a><span class="lineno"> 3129</span>&#160;    {</div><div class="line"><a name="l03130"></a><span class="lineno"> 3130</span>&#160;        <span class="comment">// BiasAdd takes bias as a 1D tensor. We need to add a reshape layer to create a 4D tensor</span></div><div class="line"><a name="l03131"></a><span class="lineno"> 3131</span>&#160;        <span class="comment">// with the same data in the correct dimension for broadcast in addition.</span></div><div class="line"><a name="l03132"></a><span class="lineno"> 3132</span>&#160;        <span class="keywordflow">if</span>(input1Info.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a157e27d41e9f6b21f0d3c025fa47dc24">GetNumDimensions</a>() != 1)</div><div class="line"><a name="l03133"></a><span class="lineno"> 3133</span>&#160;        {</div><div class="line"><a name="l03134"></a><span class="lineno"> 3134</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="l03135"></a><span class="lineno"> 3135</span>&#160;                fmt::format(<span class="stringliteral">&quot;Unsupported bias for BiasAdd. It should be a 1D vector. &quot;</span></div><div class="line"><a name="l03136"></a><span class="lineno"> 3136</span>&#160;                            <span class="stringliteral">&quot;Got {} dimensions for input {}. Node {} {}&quot;</span>,</div><div class="line"><a name="l03137"></a><span class="lineno"> 3137</span>&#160;                            input1Info.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a157e27d41e9f6b21f0d3c025fa47dc24">GetNumDimensions</a>(),</div><div class="line"><a name="l03138"></a><span class="lineno"> 3138</span>&#160;                            inputs[1].m_IndexedValue-&gt;GetNode().name(),</div><div class="line"><a name="l03139"></a><span class="lineno"> 3139</span>&#160;                            nodeDef.name(),</div><div class="line"><a name="l03140"></a><span class="lineno"> 3140</span>&#160;                            <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l03141"></a><span class="lineno"> 3141</span>&#160;        }</div><div class="line"><a name="l03142"></a><span class="lineno"> 3142</span>&#160;</div><div class="line"><a name="l03143"></a><span class="lineno"> 3143</span>&#160;        <span class="keyword">const</span> std::string dataFormat = ReadMandatoryNodeStringAttribute(nodeDef, <span class="stringliteral">&quot;data_format&quot;</span>);</div><div class="line"><a name="l03144"></a><span class="lineno"> 3144</span>&#160;</div><div class="line"><a name="l03145"></a><span class="lineno"> 3145</span>&#160;        <a class="code" href="_tf_parser_8cpp.xhtml#a3fb047570644cae325aa88d3cd7bb96e">CHECK_DATA_FORMAT</a>(nodeDef, dataFormat, <span class="stringliteral">&quot;BiasAdd&quot;</span>);</div><div class="line"><a name="l03146"></a><span class="lineno"> 3146</span>&#160;        input1Slot = <a class="code" href="namespacearmnn_1_1optimizations.xhtml#a4fc55afb4885278ad1510b2c4307af76">AddBroadcastReshapeLayer</a>(input0Slot, input1Slot, dataFormat == <span class="stringliteral">&quot;NHWC&quot;</span>, *<a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a2db3ae8d422f17d455e0ba0cb6291d2a">m_Network</a>, nodeDef);</div><div class="line"><a name="l03147"></a><span class="lineno"> 3147</span>&#160;    }</div><div class="line"><a name="l03148"></a><span class="lineno"> 3148</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l03149"></a><span class="lineno"> 3149</span>&#160;    {</div><div class="line"><a name="l03150"></a><span class="lineno"> 3150</span>&#160;        <span class="keywordflow">if</span> (input0Info.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a157e27d41e9f6b21f0d3c025fa47dc24">GetNumDimensions</a>() == 1)</div><div class="line"><a name="l03151"></a><span class="lineno"> 3151</span>&#160;        {</div><div class="line"><a name="l03152"></a><span class="lineno"> 3152</span>&#160;            <span class="keyword">const</span> <span class="keywordtype">bool</span> isNHWC = <span class="keyword">true</span>;</div><div class="line"><a name="l03153"></a><span class="lineno"> 3153</span>&#160;            input0Slot = <a class="code" href="namespacearmnn_1_1optimizations.xhtml#a4fc55afb4885278ad1510b2c4307af76">AddBroadcastReshapeLayer</a>(input1Slot, input0Slot, isNHWC, *<a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a2db3ae8d422f17d455e0ba0cb6291d2a">m_Network</a>, nodeDef);</div><div class="line"><a name="l03154"></a><span class="lineno"> 3154</span>&#160;        }</div><div class="line"><a name="l03155"></a><span class="lineno"> 3155</span>&#160;</div><div class="line"><a name="l03156"></a><span class="lineno"> 3156</span>&#160;        <span class="keywordflow">if</span> (input1Info.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a157e27d41e9f6b21f0d3c025fa47dc24">GetNumDimensions</a>() == 1)</div><div class="line"><a name="l03157"></a><span class="lineno"> 3157</span>&#160;        {</div><div class="line"><a name="l03158"></a><span class="lineno"> 3158</span>&#160;            <span class="keyword">const</span> <span class="keywordtype">bool</span> isNHWC = <span class="keyword">true</span>;</div><div class="line"><a name="l03159"></a><span class="lineno"> 3159</span>&#160;            input1Slot = <a class="code" href="namespacearmnn_1_1optimizations.xhtml#a4fc55afb4885278ad1510b2c4307af76">AddBroadcastReshapeLayer</a>(input0Slot, input1Slot, isNHWC, *<a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a2db3ae8d422f17d455e0ba0cb6291d2a">m_Network</a>, nodeDef);</div><div class="line"><a name="l03160"></a><span class="lineno"> 3160</span>&#160;        }</div><div class="line"><a name="l03161"></a><span class="lineno"> 3161</span>&#160;    }</div><div class="line"><a name="l03162"></a><span class="lineno"> 3162</span>&#160;</div><div class="line"><a name="l03163"></a><span class="lineno"> 3163</span>&#160;    <a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml">IConnectableLayer</a>* <span class="keyword">const</span> layer = <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a2db3ae8d422f17d455e0ba0cb6291d2a">m_Network</a>-&gt;AddAdditionLayer(nodeDef.name().c_str());</div><div class="line"><a name="l03164"></a><span class="lineno"> 3164</span>&#160;</div><div class="line"><a name="l03165"></a><span class="lineno"> 3165</span>&#160;    input0Slot-&gt;<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#ac1835f8756a9f03c02fcf9664e3a0fce">Connect</a>(layer-&gt;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml#a6ec9e0eb66d7d6a01240492a0b18104c">GetInputSlot</a>(0));</div><div class="line"><a name="l03166"></a><span class="lineno"> 3166</span>&#160;    input1Slot-&gt;<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#ac1835f8756a9f03c02fcf9664e3a0fce">Connect</a>(layer-&gt;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml#a6ec9e0eb66d7d6a01240492a0b18104c">GetInputSlot</a>(1));</div><div class="line"><a name="l03167"></a><span class="lineno"> 3167</span>&#160;</div><div class="line"><a name="l03168"></a><span class="lineno"> 3168</span>&#160;    <span class="keywordflow">if</span> (input0Info.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a157e27d41e9f6b21f0d3c025fa47dc24">GetNumDimensions</a>() == input1Info.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a157e27d41e9f6b21f0d3c025fa47dc24">GetNumDimensions</a>())</div><div class="line"><a name="l03169"></a><span class="lineno"> 3169</span>&#160;    {</div><div class="line"><a name="l03170"></a><span class="lineno"> 3170</span>&#160;        <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_shape.xhtml">TensorShape</a>&amp; input0Shape = input0Info.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a8b5d0f8a24e9d9238f412260a552acf8">GetShape</a>();</div><div class="line"><a name="l03171"></a><span class="lineno"> 3171</span>&#160;        <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_shape.xhtml">TensorShape</a>&amp; input1Shape = input1Info.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a8b5d0f8a24e9d9238f412260a552acf8">GetShape</a>();</div><div class="line"><a name="l03172"></a><span class="lineno"> 3172</span>&#160;</div><div class="line"><a name="l03173"></a><span class="lineno"> 3173</span>&#160;        std::vector&lt;unsigned int&gt; outputShape;</div><div class="line"><a name="l03174"></a><span class="lineno"> 3174</span>&#160;        outputShape.reserve(input0Shape.<a class="code" href="classarmnn_1_1_tensor_shape.xhtml#a157e27d41e9f6b21f0d3c025fa47dc24">GetNumDimensions</a>());</div><div class="line"><a name="l03175"></a><span class="lineno"> 3175</span>&#160;        <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> outputInfo(input0Info);</div><div class="line"><a name="l03176"></a><span class="lineno"> 3176</span>&#160;</div><div class="line"><a name="l03177"></a><span class="lineno"> 3177</span>&#160;        <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i = 0; i &lt; input0Shape.<a class="code" href="classarmnn_1_1_tensor_shape.xhtml#a157e27d41e9f6b21f0d3c025fa47dc24">GetNumDimensions</a>(); i++)</div><div class="line"><a name="l03178"></a><span class="lineno"> 3178</span>&#160;        {</div><div class="line"><a name="l03179"></a><span class="lineno"> 3179</span>&#160;            outputShape.push_back(std::max(input0Shape[i], input1Shape[i]));</div><div class="line"><a name="l03180"></a><span class="lineno"> 3180</span>&#160;        }</div><div class="line"><a name="l03181"></a><span class="lineno"> 3181</span>&#160;</div><div class="line"><a name="l03182"></a><span class="lineno"> 3182</span>&#160;        outputInfo.<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>(input0Shape.<a class="code" href="classarmnn_1_1_tensor_shape.xhtml#a157e27d41e9f6b21f0d3c025fa47dc24">GetNumDimensions</a>(), outputShape.data()));</div><div class="line"><a name="l03183"></a><span class="lineno"> 3183</span>&#160;</div><div class="line"><a name="l03184"></a><span class="lineno"> 3184</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);</div><div class="line"><a name="l03185"></a><span class="lineno"> 3185</span>&#160;    }</div><div class="line"><a name="l03186"></a><span class="lineno"> 3186</span>&#160;    <span class="keywordflow">else</span> <span class="keywordflow">if</span> (input0Info.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a157e27d41e9f6b21f0d3c025fa47dc24">GetNumDimensions</a>() == 1 &amp;&amp; isBiasAdd == <span class="keyword">false</span>)</div><div class="line"><a name="l03187"></a><span class="lineno"> 3187</span>&#160;    {</div><div class="line"><a name="l03188"></a><span class="lineno"> 3188</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>(input1Slot-&gt;<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#a9943775a364fc4ab53b85ac88f311886">GetTensorInfo</a>());</div><div class="line"><a name="l03189"></a><span class="lineno"> 3189</span>&#160;    }</div><div class="line"><a name="l03190"></a><span class="lineno"> 3190</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l03191"></a><span class="lineno"> 3191</span>&#160;    {</div><div class="line"><a name="l03192"></a><span class="lineno"> 3192</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>(input0Slot-&gt;<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#a9943775a364fc4ab53b85ac88f311886">GetTensorInfo</a>());</div><div class="line"><a name="l03193"></a><span class="lineno"> 3193</span>&#160;    }</div><div class="line"><a name="l03194"></a><span class="lineno"> 3194</span>&#160;</div><div class="line"><a name="l03195"></a><span class="lineno"> 3195</span>&#160;    <span class="keywordflow">return</span> std::make_unique&lt;SingleLayerParsedTfOperation&gt;(<span class="keyword">this</span>, nodeDef, layer);</div><div class="line"><a name="l03196"></a><span class="lineno"> 3196</span>&#160;}</div><div class="line"><a name="l03197"></a><span class="lineno"> 3197</span>&#160;</div><div class="line"><a name="l03198"></a><span class="lineno"><a class="line" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a138dbe1b5b87970a073445ab7fc512f5"> 3198</a></span>&#160;<a class="code" href="namespacearmnn_tf_parser.xhtml#aa36bf288c19fe35767bb6e059636f405">ParsedTfOperationPtr</a> <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a138dbe1b5b87970a073445ab7fc512f5">ITfParser::TfParserImpl::AddRealDivLayer</a>(<span class="keyword">const</span> tensorflow::NodeDef&amp; nodeDef)</div><div class="line"><a name="l03199"></a><span class="lineno"> 3199</span>&#160;{</div><div class="line"><a name="l03200"></a><span class="lineno"> 3200</span>&#160;    std::vector&lt;OutputOfParsedTfOperation&gt; inputs = <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#ae295ca8b7d19bb5e6db3f93bd4561ee0">GetInputParsedTfOperationsChecked</a>(nodeDef, 2);</div><div class="line"><a name="l03201"></a><span class="lineno"> 3201</span>&#160;</div><div class="line"><a name="l03202"></a><span class="lineno"> 3202</span>&#160;    <a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml">IConnectableLayer</a>* <span class="keyword">const</span> layer = <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a2db3ae8d422f17d455e0ba0cb6291d2a">m_Network</a>-&gt;AddDivisionLayer(nodeDef.name().c_str());</div><div class="line"><a name="l03203"></a><span class="lineno"> 3203</span>&#160;    <a class="code" href="classarmnn_1_1_i_output_slot.xhtml">IOutputSlot</a>* input0Slot = &amp;inputs[0].m_IndexedValue-&gt;ResolveArmnnOutputSlot(inputs[0].m_Index);</div><div class="line"><a name="l03204"></a><span class="lineno"> 3204</span>&#160;    <a class="code" href="classarmnn_1_1_i_output_slot.xhtml">IOutputSlot</a>* input1Slot = &amp;inputs[1].m_IndexedValue-&gt;ResolveArmnnOutputSlot(inputs[1].m_Index);</div><div class="line"><a name="l03205"></a><span class="lineno"> 3205</span>&#160;</div><div class="line"><a name="l03206"></a><span class="lineno"> 3206</span>&#160;    <span class="keyword">auto</span> <span class="keyword">const</span> input0NumDims = input0Slot-&gt;<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#a9943775a364fc4ab53b85ac88f311886">GetTensorInfo</a>().<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a157e27d41e9f6b21f0d3c025fa47dc24">GetNumDimensions</a>();</div><div class="line"><a name="l03207"></a><span class="lineno"> 3207</span>&#160;    <span class="keyword">auto</span> <span class="keyword">const</span> input1NumDims = input1Slot-&gt;<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#a9943775a364fc4ab53b85ac88f311886">GetTensorInfo</a>().<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a157e27d41e9f6b21f0d3c025fa47dc24">GetNumDimensions</a>();</div><div class="line"><a name="l03208"></a><span class="lineno"> 3208</span>&#160;</div><div class="line"><a name="l03209"></a><span class="lineno"> 3209</span>&#160;</div><div class="line"><a name="l03210"></a><span class="lineno"> 3210</span>&#160;    <span class="keywordflow">if</span> (input0NumDims &lt; input1NumDims)</div><div class="line"><a name="l03211"></a><span class="lineno"> 3211</span>&#160;    {</div><div class="line"><a name="l03212"></a><span class="lineno"> 3212</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">bool</span> isNHWC = <span class="keyword">true</span>;</div><div class="line"><a name="l03213"></a><span class="lineno"> 3213</span>&#160;        input0Slot = <a class="code" href="namespacearmnn_1_1optimizations.xhtml#a4fc55afb4885278ad1510b2c4307af76">AddBroadcastReshapeLayer</a>(input1Slot, input0Slot, isNHWC, *<a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a2db3ae8d422f17d455e0ba0cb6291d2a">m_Network</a>, nodeDef);</div><div class="line"><a name="l03214"></a><span class="lineno"> 3214</span>&#160;    }</div><div class="line"><a name="l03215"></a><span class="lineno"> 3215</span>&#160;    <span class="keywordflow">if</span> (input1NumDims &lt; input0NumDims)</div><div class="line"><a name="l03216"></a><span class="lineno"> 3216</span>&#160;    {</div><div class="line"><a name="l03217"></a><span class="lineno"> 3217</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">bool</span> isNHWC = <span class="keyword">true</span>;</div><div class="line"><a name="l03218"></a><span class="lineno"> 3218</span>&#160;        input1Slot = <a class="code" href="namespacearmnn_1_1optimizations.xhtml#a4fc55afb4885278ad1510b2c4307af76">AddBroadcastReshapeLayer</a>(input0Slot, input1Slot, isNHWC, *<a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a2db3ae8d422f17d455e0ba0cb6291d2a">m_Network</a>, nodeDef);</div><div class="line"><a name="l03219"></a><span class="lineno"> 3219</span>&#160;    }</div><div class="line"><a name="l03220"></a><span class="lineno"> 3220</span>&#160;</div><div class="line"><a name="l03221"></a><span class="lineno"> 3221</span>&#160;    input0Slot-&gt;<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#ac1835f8756a9f03c02fcf9664e3a0fce">Connect</a>(layer-&gt;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml#a6ec9e0eb66d7d6a01240492a0b18104c">GetInputSlot</a>(0));</div><div class="line"><a name="l03222"></a><span class="lineno"> 3222</span>&#160;    input1Slot-&gt;<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#ac1835f8756a9f03c02fcf9664e3a0fce">Connect</a>(layer-&gt;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml#a6ec9e0eb66d7d6a01240492a0b18104c">GetInputSlot</a>(1));</div><div class="line"><a name="l03223"></a><span class="lineno"> 3223</span>&#160;</div><div class="line"><a name="l03224"></a><span class="lineno"> 3224</span>&#160;    <span class="keywordflow">if</span> (input0NumDims &lt; input1NumDims)</div><div class="line"><a name="l03225"></a><span class="lineno"> 3225</span>&#160;    {</div><div class="line"><a name="l03226"></a><span class="lineno"> 3226</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>(input1Slot-&gt;<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#a9943775a364fc4ab53b85ac88f311886">GetTensorInfo</a>());</div><div class="line"><a name="l03227"></a><span class="lineno"> 3227</span>&#160;    }</div><div class="line"><a name="l03228"></a><span class="lineno"> 3228</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l03229"></a><span class="lineno"> 3229</span>&#160;    {</div><div class="line"><a name="l03230"></a><span class="lineno"> 3230</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>(input0Slot-&gt;<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#a9943775a364fc4ab53b85ac88f311886">GetTensorInfo</a>());</div><div class="line"><a name="l03231"></a><span class="lineno"> 3231</span>&#160;</div><div class="line"><a name="l03232"></a><span class="lineno"> 3232</span>&#160;    }</div><div class="line"><a name="l03233"></a><span class="lineno"> 3233</span>&#160;    <span class="keywordflow">return</span> std::make_unique&lt;SingleLayerParsedTfOperation&gt;(<span class="keyword">this</span>, nodeDef, layer);</div><div class="line"><a name="l03234"></a><span class="lineno"> 3234</span>&#160;}</div><div class="line"><a name="l03235"></a><span class="lineno"> 3235</span>&#160;</div><div class="line"><a name="l03236"></a><span class="lineno"><a class="line" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#ae3a610533ecb2a9a87fb47785f7fb712"> 3236</a></span>&#160;<a class="code" href="namespacearmnn_tf_parser.xhtml#aa36bf288c19fe35767bb6e059636f405">ParsedTfOperationPtr</a> <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#ae3a610533ecb2a9a87fb47785f7fb712">ITfParser::TfParserImpl::AddMaximumLayer</a>(<span class="keyword">const</span> tensorflow::NodeDef&amp; nodeDef)</div><div class="line"><a name="l03237"></a><span class="lineno"> 3237</span>&#160;{</div><div class="line"><a name="l03238"></a><span class="lineno"> 3238</span>&#160;    std::vector&lt;OutputOfParsedTfOperation&gt; inputs = <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#ae295ca8b7d19bb5e6db3f93bd4561ee0">GetInputParsedTfOperationsChecked</a>(nodeDef, 2);</div><div class="line"><a name="l03239"></a><span class="lineno"> 3239</span>&#160;</div><div class="line"><a name="l03240"></a><span class="lineno"> 3240</span>&#160;    <a class="code" href="classarmnn_1_1_i_output_slot.xhtml">IOutputSlot</a>* input0Slot = &amp;inputs[0].m_IndexedValue-&gt;ResolveArmnnOutputSlot(inputs[0].m_Index);</div><div class="line"><a name="l03241"></a><span class="lineno"> 3241</span>&#160;    <a class="code" href="classarmnn_1_1_i_output_slot.xhtml">IOutputSlot</a>* input1Slot = &amp;inputs[1].m_IndexedValue-&gt;ResolveArmnnOutputSlot(inputs[1].m_Index);</div><div class="line"><a name="l03242"></a><span class="lineno"> 3242</span>&#160;</div><div class="line"><a name="l03243"></a><span class="lineno"> 3243</span>&#160;    <span class="keyword">auto</span> <span class="keyword">const</span> input0NumDims = input0Slot-&gt;<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#a9943775a364fc4ab53b85ac88f311886">GetTensorInfo</a>().<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a157e27d41e9f6b21f0d3c025fa47dc24">GetNumDimensions</a>();</div><div class="line"><a name="l03244"></a><span class="lineno"> 3244</span>&#160;    <span class="keyword">auto</span> <span class="keyword">const</span> input1NumDims = input1Slot-&gt;<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#a9943775a364fc4ab53b85ac88f311886">GetTensorInfo</a>().<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a157e27d41e9f6b21f0d3c025fa47dc24">GetNumDimensions</a>();</div><div class="line"><a name="l03245"></a><span class="lineno"> 3245</span>&#160;</div><div class="line"><a name="l03246"></a><span class="lineno"> 3246</span>&#160;    <span class="keywordflow">if</span> (input0NumDims &lt; input1NumDims)</div><div class="line"><a name="l03247"></a><span class="lineno"> 3247</span>&#160;    {</div><div class="line"><a name="l03248"></a><span class="lineno"> 3248</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">bool</span> isNHWC = <span class="keyword">true</span>;</div><div class="line"><a name="l03249"></a><span class="lineno"> 3249</span>&#160;        input0Slot = <a class="code" href="namespacearmnn_1_1optimizations.xhtml#a4fc55afb4885278ad1510b2c4307af76">AddBroadcastReshapeLayer</a>(input1Slot, input0Slot, isNHWC, *<a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a2db3ae8d422f17d455e0ba0cb6291d2a">m_Network</a>, nodeDef);</div><div class="line"><a name="l03250"></a><span class="lineno"> 3250</span>&#160;    }</div><div class="line"><a name="l03251"></a><span class="lineno"> 3251</span>&#160;    <span class="keywordflow">if</span> (input1NumDims &lt; input0NumDims)</div><div class="line"><a name="l03252"></a><span class="lineno"> 3252</span>&#160;    {</div><div class="line"><a name="l03253"></a><span class="lineno"> 3253</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">bool</span> isNHWC = <span class="keyword">true</span>;</div><div class="line"><a name="l03254"></a><span class="lineno"> 3254</span>&#160;        input1Slot = <a class="code" href="namespacearmnn_1_1optimizations.xhtml#a4fc55afb4885278ad1510b2c4307af76">AddBroadcastReshapeLayer</a>(input0Slot, input1Slot, isNHWC, *<a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a2db3ae8d422f17d455e0ba0cb6291d2a">m_Network</a>, nodeDef);</div><div class="line"><a name="l03255"></a><span class="lineno"> 3255</span>&#160;    }</div><div class="line"><a name="l03256"></a><span class="lineno"> 3256</span>&#160;</div><div class="line"><a name="l03257"></a><span class="lineno"> 3257</span>&#160;    <a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml">IConnectableLayer</a>* <span class="keyword">const</span> layer = <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a2db3ae8d422f17d455e0ba0cb6291d2a">m_Network</a>-&gt;AddMaximumLayer(nodeDef.name().c_str());</div><div class="line"><a name="l03258"></a><span class="lineno"> 3258</span>&#160;</div><div class="line"><a name="l03259"></a><span class="lineno"> 3259</span>&#160;    input0Slot-&gt;<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#ac1835f8756a9f03c02fcf9664e3a0fce">Connect</a>(layer-&gt;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml#a6ec9e0eb66d7d6a01240492a0b18104c">GetInputSlot</a>(0));</div><div class="line"><a name="l03260"></a><span class="lineno"> 3260</span>&#160;    input1Slot-&gt;<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#ac1835f8756a9f03c02fcf9664e3a0fce">Connect</a>(layer-&gt;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml#a6ec9e0eb66d7d6a01240492a0b18104c">GetInputSlot</a>(1));</div><div class="line"><a name="l03261"></a><span class="lineno"> 3261</span>&#160;</div><div class="line"><a name="l03262"></a><span class="lineno"> 3262</span>&#160;    <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> outputInfo = input0Slot-&gt;<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#a9943775a364fc4ab53b85ac88f311886">GetTensorInfo</a>();</div><div class="line"><a name="l03263"></a><span class="lineno"> 3263</span>&#160;    std::vector&lt;unsigned int&gt; outputShape;</div><div class="line"><a name="l03264"></a><span class="lineno"> 3264</span>&#160;</div><div class="line"><a name="l03265"></a><span class="lineno"> 3265</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_shape.xhtml">TensorShape</a>&amp; input0Shape = input0Slot-&gt;<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#a9943775a364fc4ab53b85ac88f311886">GetTensorInfo</a>().<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a8b5d0f8a24e9d9238f412260a552acf8">GetShape</a>();</div><div class="line"><a name="l03266"></a><span class="lineno"> 3266</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_shape.xhtml">TensorShape</a>&amp; input1Shape = input1Slot-&gt;<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#a9943775a364fc4ab53b85ac88f311886">GetTensorInfo</a>().<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a8b5d0f8a24e9d9238f412260a552acf8">GetShape</a>();</div><div class="line"><a name="l03267"></a><span class="lineno"> 3267</span>&#160;</div><div class="line"><a name="l03268"></a><span class="lineno"> 3268</span>&#160;    <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i = 0; i &lt; input0Shape.<a class="code" href="classarmnn_1_1_tensor_shape.xhtml#a157e27d41e9f6b21f0d3c025fa47dc24">GetNumDimensions</a>(); i++)</div><div class="line"><a name="l03269"></a><span class="lineno"> 3269</span>&#160;    {</div><div class="line"><a name="l03270"></a><span class="lineno"> 3270</span>&#160;        outputShape.push_back(std::max(input0Shape[i], input1Shape[i]));</div><div class="line"><a name="l03271"></a><span class="lineno"> 3271</span>&#160;    }</div><div class="line"><a name="l03272"></a><span class="lineno"> 3272</span>&#160;</div><div class="line"><a name="l03273"></a><span class="lineno"> 3273</span>&#160;    outputInfo.<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>(input0Shape.<a class="code" href="classarmnn_1_1_tensor_shape.xhtml#a157e27d41e9f6b21f0d3c025fa47dc24">GetNumDimensions</a>(), outputShape.data()));</div><div class="line"><a name="l03274"></a><span class="lineno"> 3274</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);</div><div class="line"><a name="l03275"></a><span class="lineno"> 3275</span>&#160;</div><div class="line"><a name="l03276"></a><span class="lineno"> 3276</span>&#160;    <span class="keywordflow">return</span> std::make_unique&lt;SingleLayerParsedTfOperation&gt;(<span class="keyword">this</span>, nodeDef, layer);</div><div class="line"><a name="l03277"></a><span class="lineno"> 3277</span>&#160;}</div><div class="line"><a name="l03278"></a><span class="lineno"> 3278</span>&#160;</div><div class="line"><a name="l03279"></a><span class="lineno"><a class="line" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a2c166c3e83ea49c47b06e754988183e8"> 3279</a></span>&#160;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml">IConnectableLayer</a>* <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a2c166c3e83ea49c47b06e754988183e8">ITfParser::TfParserImpl::AddMultiplicationLayer</a>(<span class="keyword">const</span> tensorflow::NodeDef&amp; nodeDef)</div><div class="line"><a name="l03280"></a><span class="lineno"> 3280</span>&#160;{</div><div class="line"><a name="l03281"></a><span class="lineno"> 3281</span>&#160;    std::vector&lt;OutputOfParsedTfOperation&gt; inputs = <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#ae295ca8b7d19bb5e6db3f93bd4561ee0">GetInputParsedTfOperationsChecked</a>(nodeDef, 2);</div><div class="line"><a name="l03282"></a><span class="lineno"> 3282</span>&#160;</div><div class="line"><a name="l03283"></a><span class="lineno"> 3283</span>&#160;    <a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml">IConnectableLayer</a>* <span class="keyword">const</span> layer = <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a2db3ae8d422f17d455e0ba0cb6291d2a">m_Network</a>-&gt;AddMultiplicationLayer(nodeDef.name().c_str());</div><div class="line"><a name="l03284"></a><span class="lineno"> 3284</span>&#160;    <a class="code" href="classarmnn_1_1_i_output_slot.xhtml">IOutputSlot</a>* input0Slot = &amp;inputs[0].m_IndexedValue-&gt;ResolveArmnnOutputSlot(inputs[0].m_Index);</div><div class="line"><a name="l03285"></a><span class="lineno"> 3285</span>&#160;    <a class="code" href="classarmnn_1_1_i_output_slot.xhtml">IOutputSlot</a>* input1Slot = &amp;inputs[1].m_IndexedValue-&gt;ResolveArmnnOutputSlot(inputs[1].m_Index);</div><div class="line"><a name="l03286"></a><span class="lineno"> 3286</span>&#160;</div><div class="line"><a name="l03287"></a><span class="lineno"> 3287</span>&#160;    <span class="keyword">auto</span> <span class="keyword">const</span> input0NumDims = input0Slot-&gt;<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#a9943775a364fc4ab53b85ac88f311886">GetTensorInfo</a>().<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a157e27d41e9f6b21f0d3c025fa47dc24">GetNumDimensions</a>();</div><div class="line"><a name="l03288"></a><span class="lineno"> 3288</span>&#160;    <span class="keyword">auto</span> <span class="keyword">const</span> input1NumDims = input1Slot-&gt;<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#a9943775a364fc4ab53b85ac88f311886">GetTensorInfo</a>().<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a157e27d41e9f6b21f0d3c025fa47dc24">GetNumDimensions</a>();</div><div class="line"><a name="l03289"></a><span class="lineno"> 3289</span>&#160;</div><div class="line"><a name="l03290"></a><span class="lineno"> 3290</span>&#160;    <span class="keywordflow">if</span> (input0NumDims &lt; input1NumDims)</div><div class="line"><a name="l03291"></a><span class="lineno"> 3291</span>&#160;    {</div><div class="line"><a name="l03292"></a><span class="lineno"> 3292</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">bool</span> isNHWC = <span class="keyword">true</span>;</div><div class="line"><a name="l03293"></a><span class="lineno"> 3293</span>&#160;        input0Slot = <a class="code" href="namespacearmnn_1_1optimizations.xhtml#a4fc55afb4885278ad1510b2c4307af76">AddBroadcastReshapeLayer</a>(input1Slot, input0Slot, isNHWC, *<a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a2db3ae8d422f17d455e0ba0cb6291d2a">m_Network</a>, nodeDef);</div><div class="line"><a name="l03294"></a><span class="lineno"> 3294</span>&#160;    }</div><div class="line"><a name="l03295"></a><span class="lineno"> 3295</span>&#160;    <span class="keywordflow">if</span> (input1NumDims &lt; input0NumDims)</div><div class="line"><a name="l03296"></a><span class="lineno"> 3296</span>&#160;    {</div><div class="line"><a name="l03297"></a><span class="lineno"> 3297</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">bool</span> isNHWC = <span class="keyword">true</span>;</div><div class="line"><a name="l03298"></a><span class="lineno"> 3298</span>&#160;        input1Slot = <a class="code" href="namespacearmnn_1_1optimizations.xhtml#a4fc55afb4885278ad1510b2c4307af76">AddBroadcastReshapeLayer</a>(input0Slot, input1Slot, isNHWC, *<a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a2db3ae8d422f17d455e0ba0cb6291d2a">m_Network</a>, nodeDef);</div><div class="line"><a name="l03299"></a><span class="lineno"> 3299</span>&#160;    }</div><div class="line"><a name="l03300"></a><span class="lineno"> 3300</span>&#160;</div><div class="line"><a name="l03301"></a><span class="lineno"> 3301</span>&#160;    input0Slot-&gt;<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#ac1835f8756a9f03c02fcf9664e3a0fce">Connect</a>(layer-&gt;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml#a6ec9e0eb66d7d6a01240492a0b18104c">GetInputSlot</a>(0));</div><div class="line"><a name="l03302"></a><span class="lineno"> 3302</span>&#160;    input1Slot-&gt;<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#ac1835f8756a9f03c02fcf9664e3a0fce">Connect</a>(layer-&gt;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml#a6ec9e0eb66d7d6a01240492a0b18104c">GetInputSlot</a>(1));</div><div class="line"><a name="l03303"></a><span class="lineno"> 3303</span>&#160;</div><div class="line"><a name="l03304"></a><span class="lineno"> 3304</span>&#160;    <span class="keywordflow">if</span> (input0NumDims &lt; input1NumDims)</div><div class="line"><a name="l03305"></a><span class="lineno"> 3305</span>&#160;    {</div><div class="line"><a name="l03306"></a><span class="lineno"> 3306</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>(input1Slot-&gt;<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#a9943775a364fc4ab53b85ac88f311886">GetTensorInfo</a>());</div><div class="line"><a name="l03307"></a><span class="lineno"> 3307</span>&#160;    }</div><div class="line"><a name="l03308"></a><span class="lineno"> 3308</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l03309"></a><span class="lineno"> 3309</span>&#160;    {</div><div class="line"><a name="l03310"></a><span class="lineno"> 3310</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>(input0Slot-&gt;<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#a9943775a364fc4ab53b85ac88f311886">GetTensorInfo</a>());</div><div class="line"><a name="l03311"></a><span class="lineno"> 3311</span>&#160;    }</div><div class="line"><a name="l03312"></a><span class="lineno"> 3312</span>&#160;    <span class="keywordflow">return</span> layer;</div><div class="line"><a name="l03313"></a><span class="lineno"> 3313</span>&#160;}</div><div class="line"><a name="l03314"></a><span class="lineno"> 3314</span>&#160;</div><div class="line"><a name="l03315"></a><span class="lineno"><a class="line" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a64bdfd07d439803d0ec4c8b9b5c3e442"> 3315</a></span>&#160;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml">IConnectableLayer</a>* <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a64bdfd07d439803d0ec4c8b9b5c3e442">ITfParser::TfParserImpl::AddFullyConnectedLayer</a>(<span class="keyword">const</span> tensorflow::NodeDef&amp; matMulNodeDef,</div><div class="line"><a name="l03316"></a><span class="lineno"> 3316</span>&#160;    <span class="keyword">const</span> tensorflow::NodeDef* addNodeDef, <span class="keyword">const</span> <span class="keywordtype">char</span>* armnnLayerName)</div><div class="line"><a name="l03317"></a><span class="lineno"> 3317</span>&#160;{</div><div class="line"><a name="l03318"></a><span class="lineno"> 3318</span>&#160;    <span class="comment">// Finds bias const (if applicable).</span></div><div class="line"><a name="l03319"></a><span class="lineno"> 3319</span>&#160;    ParsedConstTfOperation&lt;float&gt;* biasNode = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l03320"></a><span class="lineno"> 3320</span>&#160;    <span class="keywordflow">if</span> (addNodeDef != <span class="keyword">nullptr</span>)</div><div class="line"><a name="l03321"></a><span class="lineno"> 3321</span>&#160;    {</div><div class="line"><a name="l03322"></a><span class="lineno"> 3322</span>&#160;        std::vector&lt;OutputOfParsedTfOperation&gt; addInputs = <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#ae295ca8b7d19bb5e6db3f93bd4561ee0">GetInputParsedTfOperationsChecked</a>(*addNodeDef, 2);</div><div class="line"><a name="l03323"></a><span class="lineno"> 3323</span>&#160;        <span class="comment">// Finds our inputs.</span></div><div class="line"><a name="l03324"></a><span class="lineno"> 3324</span>&#160;        <span class="keywordflow">if</span> (HasParsedConstTensor&lt;float&gt;(addInputs[0].m_IndexedValue-&gt;GetNode().name()))</div><div class="line"><a name="l03325"></a><span class="lineno"> 3325</span>&#160;        {</div><div class="line"><a name="l03326"></a><span class="lineno"> 3326</span>&#160;            biasNode = PolymorphicDowncast&lt;ParsedConstTfOperation&lt;float&gt;*&gt;(addInputs[0].m_IndexedValue);</div><div class="line"><a name="l03327"></a><span class="lineno"> 3327</span>&#160;        }</div><div class="line"><a name="l03328"></a><span class="lineno"> 3328</span>&#160;        <span class="keywordflow">else</span> <span class="keywordflow">if</span> (HasParsedConstTensor&lt;float&gt;(addInputs[1].m_IndexedValue-&gt;GetNode().name()))</div><div class="line"><a name="l03329"></a><span class="lineno"> 3329</span>&#160;        {</div><div class="line"><a name="l03330"></a><span class="lineno"> 3330</span>&#160;            biasNode = PolymorphicDowncast&lt;ParsedConstTfOperation&lt;float&gt;*&gt;(addInputs[1].m_IndexedValue);</div><div class="line"><a name="l03331"></a><span class="lineno"> 3331</span>&#160;        }</div><div class="line"><a name="l03332"></a><span class="lineno"> 3332</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l03333"></a><span class="lineno"> 3333</span>&#160;        {</div><div class="line"><a name="l03334"></a><span class="lineno"> 3334</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="l03335"></a><span class="lineno"> 3335</span>&#160;                fmt::format(<span class="stringliteral">&quot;ArmNN only supports fully connected layers with constant bias. &quot;</span></div><div class="line"><a name="l03336"></a><span class="lineno"> 3336</span>&#160;                            <span class="stringliteral">&quot;Inputs {} and {}. AddNode {}. MatMulNode {} {}&quot;</span>,</div><div class="line"><a name="l03337"></a><span class="lineno"> 3337</span>&#160;                            addInputs[0].m_IndexedValue-&gt;GetNode().name(),</div><div class="line"><a name="l03338"></a><span class="lineno"> 3338</span>&#160;                            addInputs[1].m_IndexedValue-&gt;GetNode().name(),</div><div class="line"><a name="l03339"></a><span class="lineno"> 3339</span>&#160;                            addNodeDef-&gt;name(),</div><div class="line"><a name="l03340"></a><span class="lineno"> 3340</span>&#160;                            matMulNodeDef.name(),</div><div class="line"><a name="l03341"></a><span class="lineno"> 3341</span>&#160;                            <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l03342"></a><span class="lineno"> 3342</span>&#160;        }</div><div class="line"><a name="l03343"></a><span class="lineno"> 3343</span>&#160;    }</div><div class="line"><a name="l03344"></a><span class="lineno"> 3344</span>&#160;</div><div class="line"><a name="l03345"></a><span class="lineno"> 3345</span>&#160;    <span class="comment">// Finds matmul inputs.</span></div><div class="line"><a name="l03346"></a><span class="lineno"> 3346</span>&#160;    ParsedConstTfOperation&lt;float&gt;* weightNode = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l03347"></a><span class="lineno"> 3347</span>&#160;    <a class="code" href="classarmnn_tf_parser_1_1_i_tf_parser.xhtml#a81cd010ead68e4d96e6cb28255143f49">ParsedTfOperation</a>* inputNode  = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l03348"></a><span class="lineno"> 3348</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> inputIdx = 0;</div><div class="line"><a name="l03349"></a><span class="lineno"> 3349</span>&#160;    std::vector&lt;OutputOfParsedTfOperation&gt; mulInputs = <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#ae295ca8b7d19bb5e6db3f93bd4561ee0">GetInputParsedTfOperationsChecked</a>(matMulNodeDef, 2);</div><div class="line"><a name="l03350"></a><span class="lineno"> 3350</span>&#160;    <span class="keywordflow">if</span> (HasParsedConstTensor&lt;float&gt;(mulInputs[0].m_IndexedValue-&gt;GetNode().name()))</div><div class="line"><a name="l03351"></a><span class="lineno"> 3351</span>&#160;    {</div><div class="line"><a name="l03352"></a><span class="lineno"> 3352</span>&#160;        weightNode = PolymorphicDowncast&lt;ParsedConstTfOperation&lt;float&gt;*&gt;(mulInputs[0].m_IndexedValue);</div><div class="line"><a name="l03353"></a><span class="lineno"> 3353</span>&#160;        inputNode = mulInputs[1].m_IndexedValue;</div><div class="line"><a name="l03354"></a><span class="lineno"> 3354</span>&#160;        inputIdx = mulInputs[1].m_Index;</div><div class="line"><a name="l03355"></a><span class="lineno"> 3355</span>&#160;    }</div><div class="line"><a name="l03356"></a><span class="lineno"> 3356</span>&#160;    <span class="keywordflow">else</span> <span class="keywordflow">if</span> (HasParsedConstTensor&lt;float&gt;(mulInputs[1].m_IndexedValue-&gt;GetNode().name()))</div><div class="line"><a name="l03357"></a><span class="lineno"> 3357</span>&#160;    {</div><div class="line"><a name="l03358"></a><span class="lineno"> 3358</span>&#160;        weightNode = PolymorphicDowncast&lt;ParsedConstTfOperation&lt;float&gt;*&gt;(mulInputs[1].m_IndexedValue);</div><div class="line"><a name="l03359"></a><span class="lineno"> 3359</span>&#160;        inputNode = mulInputs[0].m_IndexedValue;</div><div class="line"><a name="l03360"></a><span class="lineno"> 3360</span>&#160;        inputIdx = mulInputs[0].m_Index;</div><div class="line"><a name="l03361"></a><span class="lineno"> 3361</span>&#160;    }</div><div class="line"><a name="l03362"></a><span class="lineno"> 3362</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l03363"></a><span class="lineno"> 3363</span>&#160;    {</div><div class="line"><a name="l03364"></a><span class="lineno"> 3364</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="l03365"></a><span class="lineno"> 3365</span>&#160;            fmt::format(<span class="stringliteral">&quot;ArmNN only supports fully connected layers with constant weights. &quot;</span></div><div class="line"><a name="l03366"></a><span class="lineno"> 3366</span>&#160;                        <span class="stringliteral">&quot;Inputs {} and {}. MatMulNode {} {}&quot;</span>,</div><div class="line"><a name="l03367"></a><span class="lineno"> 3367</span>&#160;                        mulInputs[0].m_IndexedValue-&gt;GetNode().name(),</div><div class="line"><a name="l03368"></a><span class="lineno"> 3368</span>&#160;                        mulInputs[1].m_IndexedValue-&gt;GetNode().name(),</div><div class="line"><a name="l03369"></a><span class="lineno"> 3369</span>&#160;                        matMulNodeDef.name(),</div><div class="line"><a name="l03370"></a><span class="lineno"> 3370</span>&#160;                        <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l03371"></a><span class="lineno"> 3371</span>&#160;    }</div><div class="line"><a name="l03372"></a><span class="lineno"> 3372</span>&#160;</div><div class="line"><a name="l03373"></a><span class="lineno"> 3373</span>&#160;    std::vector&lt;float&gt; weightTensorData;</div><div class="line"><a name="l03374"></a><span class="lineno"> 3374</span>&#160;    <span class="comment">// Handles weight.</span></div><div class="line"><a name="l03375"></a><span class="lineno"> 3375</span>&#160;    <a class="code" href="classarmnn_1_1_const_tensor.xhtml">ConstTensor</a> weights = weightNode-&gt;GetConstTensor(weightTensorData);</div><div class="line"><a name="l03376"></a><span class="lineno"> 3376</span>&#160;</div><div class="line"><a name="l03377"></a><span class="lineno"> 3377</span>&#160;    <a class="code" href="structarmnn_1_1_fully_connected_descriptor.xhtml">FullyConnectedDescriptor</a> desc;</div><div class="line"><a name="l03378"></a><span class="lineno"> 3378</span>&#160;    desc.<a class="code" href="structarmnn_1_1_fully_connected_descriptor.xhtml#aea202e14d8874cefd9a0f778022b7e25">m_BiasEnabled</a> = addNodeDef != <span class="keyword">nullptr</span>;</div><div class="line"><a name="l03379"></a><span class="lineno"> 3379</span>&#160;</div><div class="line"><a name="l03380"></a><span class="lineno"> 3380</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="l03381"></a><span class="lineno"> 3381</span>&#160;    <a class="code" href="classarmnn_1_1_optional.xhtml">Optional&lt;ConstTensor&gt;</a> optionalBiases;</div><div class="line"><a name="l03382"></a><span class="lineno"> 3382</span>&#160;    std::vector&lt;float&gt; biasTensorData;</div><div class="line"><a name="l03383"></a><span class="lineno"> 3383</span>&#160;    <span class="comment">// Makes the layer.</span></div><div class="line"><a name="l03384"></a><span class="lineno"> 3384</span>&#160;    <span class="keywordflow">if</span> (addNodeDef != <span class="keyword">nullptr</span>)</div><div class="line"><a name="l03385"></a><span class="lineno"> 3385</span>&#160;    {</div><div class="line"><a name="l03386"></a><span class="lineno"> 3386</span>&#160;        <a class="code" href="classarmnn_1_1_const_tensor.xhtml">ConstTensor</a> biases = biasNode-&gt;GetConstTensor(biasTensorData);</div><div class="line"><a name="l03387"></a><span class="lineno"> 3387</span>&#160;</div><div class="line"><a name="l03388"></a><span class="lineno"> 3388</span>&#160;        <span class="keywordflow">if</span> (weights.<a class="code" href="classarmnn_1_1_base_tensor.xhtml#a8b5d0f8a24e9d9238f412260a552acf8">GetShape</a>()[1] != biases.<a class="code" href="classarmnn_1_1_base_tensor.xhtml#a8b5d0f8a24e9d9238f412260a552acf8">GetShape</a>()[0])</div><div class="line"><a name="l03389"></a><span class="lineno"> 3389</span>&#160;        {</div><div class="line"><a name="l03390"></a><span class="lineno"> 3390</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="l03391"></a><span class="lineno"> 3391</span>&#160;                fmt::format(<span class="stringliteral">&quot;Shape of matmul weights and bias do not match. &quot;</span></div><div class="line"><a name="l03392"></a><span class="lineno"> 3392</span>&#160;                            <span class="stringliteral">&quot;AddNode {}. MatMulNode {} {}&quot;</span>,</div><div class="line"><a name="l03393"></a><span class="lineno"> 3393</span>&#160;                            addNodeDef-&gt;name(),</div><div class="line"><a name="l03394"></a><span class="lineno"> 3394</span>&#160;                            matMulNodeDef.name(),</div><div class="line"><a name="l03395"></a><span class="lineno"> 3395</span>&#160;                            <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l03396"></a><span class="lineno"> 3396</span>&#160;        }</div><div class="line"><a name="l03397"></a><span class="lineno"> 3397</span>&#160;</div><div class="line"><a name="l03398"></a><span class="lineno"> 3398</span>&#160;        optionalBiases = <a class="code" href="classarmnn_1_1_optional.xhtml">Optional&lt;ConstTensor&gt;</a>(biases);</div><div class="line"><a name="l03399"></a><span class="lineno"> 3399</span>&#160;    }</div><div class="line"><a name="l03400"></a><span class="lineno"> 3400</span>&#160;    layer = <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a2db3ae8d422f17d455e0ba0cb6291d2a">m_Network</a>-&gt;AddFullyConnectedLayer(desc, weights, optionalBiases, armnnLayerName);</div><div class="line"><a name="l03401"></a><span class="lineno"> 3401</span>&#160;</div><div class="line"><a name="l03402"></a><span class="lineno"> 3402</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="l03403"></a><span class="lineno"> 3403</span>&#160;</div><div class="line"><a name="l03404"></a><span class="lineno"> 3404</span>&#160;    inputNode-&gt;ResolveArmnnOutputSlot(inputIdx).Connect(layer-&gt;GetInputSlot(0));</div><div class="line"><a name="l03405"></a><span class="lineno"> 3405</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> batches = inputNode-&gt;ResolveArmnnOutputSlot(inputIdx).GetTensorInfo().GetShape()[0];</div><div class="line"><a name="l03406"></a><span class="lineno"> 3406</span>&#160;</div><div class="line"><a name="l03407"></a><span class="lineno"> 3407</span>&#160;    <span class="comment">// Handles output.</span></div><div class="line"><a name="l03408"></a><span class="lineno"> 3408</span>&#160;    <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> outputInfo({ batches, weights.<a class="code" href="classarmnn_1_1_base_tensor.xhtml#a8b5d0f8a24e9d9238f412260a552acf8">GetShape</a>()[1] }, DataType::Float32);</div><div class="line"><a name="l03409"></a><span class="lineno"> 3409</span>&#160;    layer-&gt;GetOutputSlot(0).SetTensorInfo(outputInfo);</div><div class="line"><a name="l03410"></a><span class="lineno"> 3410</span>&#160;    <span class="keywordflow">return</span> layer;</div><div class="line"><a name="l03411"></a><span class="lineno"> 3411</span>&#160;}</div><div class="line"><a name="l03412"></a><span class="lineno"> 3412</span>&#160;</div><div class="line"><a name="l03413"></a><span class="lineno"><a class="line" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a22a4253bd5cb5510d0086a0f067760ec"> 3413</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a22a4253bd5cb5510d0086a0f067760ec">ITfParser::TfParserImpl::LoadNodeDef</a>(<span class="keyword">const</span> tensorflow::NodeDef&amp; nodeDef, <span class="keyword">const</span> tensorflow::GraphDef&amp; graphDef)</div><div class="line"><a name="l03414"></a><span class="lineno"> 3414</span>&#160;{</div><div class="line"><a name="l03415"></a><span class="lineno"> 3415</span>&#160;    <span class="comment">// Gets the type of the node (assume float).</span></div><div class="line"><a name="l03416"></a><span class="lineno"> 3416</span>&#160;    <a class="code" href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6">tensorflow::DataType</a> type = tensorflow::DT_FLOAT;</div><div class="line"><a name="l03417"></a><span class="lineno"> 3417</span>&#160;    <span class="keywordflow">if</span> (nodeDef.attr().count(<span class="stringliteral">&quot;T&quot;</span>) != 0)</div><div class="line"><a name="l03418"></a><span class="lineno"> 3418</span>&#160;    {</div><div class="line"><a name="l03419"></a><span class="lineno"> 3419</span>&#160;        <span class="keyword">auto</span> attr = nodeDef.attr().at(<span class="stringliteral">&quot;T&quot;</span>);</div><div class="line"><a name="l03420"></a><span class="lineno"> 3420</span>&#160;        type      = attr.type();</div><div class="line"><a name="l03421"></a><span class="lineno"> 3421</span>&#160;    }</div><div class="line"><a name="l03422"></a><span class="lineno"> 3422</span>&#160;    <span class="keywordflow">else</span> <span class="keywordflow">if</span> (nodeDef.attr().count(<span class="stringliteral">&quot;dtype&quot;</span>) != 0)</div><div class="line"><a name="l03423"></a><span class="lineno"> 3423</span>&#160;    {</div><div class="line"><a name="l03424"></a><span class="lineno"> 3424</span>&#160;        <span class="keyword">auto</span> attr = nodeDef.attr().at(<span class="stringliteral">&quot;dtype&quot;</span>);</div><div class="line"><a name="l03425"></a><span class="lineno"> 3425</span>&#160;        type      = attr.type();</div><div class="line"><a name="l03426"></a><span class="lineno"> 3426</span>&#160;    }</div><div class="line"><a name="l03427"></a><span class="lineno"> 3427</span>&#160;</div><div class="line"><a name="l03428"></a><span class="lineno"> 3428</span>&#160;    <span class="keywordflow">if</span> ((type != tensorflow::DT_FLOAT &amp;&amp; type != tensorflow::DT_INT32) &amp;&amp; nodeDef.op() != <span class="stringliteral">&quot;Const&quot;</span>)</div><div class="line"><a name="l03429"></a><span class="lineno"> 3429</span>&#160;    {</div><div class="line"><a name="l03430"></a><span class="lineno"> 3430</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="l03431"></a><span class="lineno"> 3431</span>&#160;            fmt::format(<span class="stringliteral">&quot;Currently only FLOAT and INT32 are supported for tensorflow nodes (apart from Const). &quot;</span></div><div class="line"><a name="l03432"></a><span class="lineno"> 3432</span>&#160;                        <span class="stringliteral">&quot;Got {} for Node {} {}&quot;</span>,</div><div class="line"><a name="l03433"></a><span class="lineno"> 3433</span>&#160;                        tensorflow::DataType_Name(type),</div><div class="line"><a name="l03434"></a><span class="lineno"> 3434</span>&#160;                        nodeDef.name(),</div><div class="line"><a name="l03435"></a><span class="lineno"> 3435</span>&#160;                        <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l03436"></a><span class="lineno"> 3436</span>&#160;    }</div><div class="line"><a name="l03437"></a><span class="lineno"> 3437</span>&#160;</div><div class="line"><a name="l03438"></a><span class="lineno"> 3438</span>&#160;    <span class="keyword">const</span> std::string&amp; operation = nodeDef.op();</div><div class="line"><a name="l03439"></a><span class="lineno"> 3439</span>&#160;    <span class="keyword">auto</span> itControlInput = std::find(<a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a9414a632d2c86615287df33c0828f903">m_ControlInputs</a>.begin(), <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a9414a632d2c86615287df33c0828f903">m_ControlInputs</a>.end(), operation);</div><div class="line"><a name="l03440"></a><span class="lineno"> 3440</span>&#160;    <span class="keywordflow">if</span> (itControlInput != <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a9414a632d2c86615287df33c0828f903">m_ControlInputs</a>.end())</div><div class="line"><a name="l03441"></a><span class="lineno"> 3441</span>&#160;    {</div><div class="line"><a name="l03442"></a><span class="lineno"> 3442</span>&#160;        <span class="comment">// We currently allow Control Input from TensorFlow graph but we ignore them from ArmNN graph.</span></div><div class="line"><a name="l03443"></a><span class="lineno"> 3443</span>&#160;        <span class="keywordflow">return</span>;</div><div class="line"><a name="l03444"></a><span class="lineno"> 3444</span>&#160;    }</div><div class="line"><a name="l03445"></a><span class="lineno"> 3445</span>&#160;    <span class="keyword">auto</span> it = <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a4b6b3a1fd0ce13ce7d6e3b4342f852c9">ms_OperationNameToParsingFunctions</a>.find(operation);</div><div class="line"><a name="l03446"></a><span class="lineno"> 3446</span>&#160;    <span class="keywordflow">if</span> (it != <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a4b6b3a1fd0ce13ce7d6e3b4342f852c9">ms_OperationNameToParsingFunctions</a>.end())</div><div class="line"><a name="l03447"></a><span class="lineno"> 3447</span>&#160;    {</div><div class="line"><a name="l03448"></a><span class="lineno"> 3448</span>&#160;        <span class="keyword">auto</span> func = it-&gt;second;</div><div class="line"><a name="l03449"></a><span class="lineno"> 3449</span>&#160;        <a class="code" href="namespacearmnn_tf_parser.xhtml#aa36bf288c19fe35767bb6e059636f405">ParsedTfOperationPtr</a> parsedTfOperation = (this-&gt;*func)(nodeDef, graphDef);</div><div class="line"><a name="l03450"></a><span class="lineno"> 3450</span>&#160;        <a class="code" href="classarmnn_tf_parser_1_1_i_tf_parser.xhtml#a81cd010ead68e4d96e6cb28255143f49">ParsedTfOperation</a>* parsedTfOperationRaw = parsedTfOperation.get();</div><div class="line"><a name="l03451"></a><span class="lineno"> 3451</span>&#160;</div><div class="line"><a name="l03452"></a><span class="lineno"> 3452</span>&#160;        <span class="comment">// Stores the parsed operation so that dependent layers can connect to it.</span></div><div class="line"><a name="l03453"></a><span class="lineno"> 3453</span>&#160;        <span class="keyword">auto</span> it = <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a8dd5c5f271f0f5bd68612e7927d94e58">m_ParsedTfOperations</a>.find(nodeDef.name());</div><div class="line"><a name="l03454"></a><span class="lineno"> 3454</span>&#160;        <span class="keywordflow">if</span> (it != <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a8dd5c5f271f0f5bd68612e7927d94e58">m_ParsedTfOperations</a>.end())</div><div class="line"><a name="l03455"></a><span class="lineno"> 3455</span>&#160;        {</div><div class="line"><a name="l03456"></a><span class="lineno"> 3456</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;Name {} used by more than one node&quot;</span>, nodeDef.name()));</div><div class="line"><a name="l03457"></a><span class="lineno"> 3457</span>&#160;        }</div><div class="line"><a name="l03458"></a><span class="lineno"> 3458</span>&#160;        <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a8dd5c5f271f0f5bd68612e7927d94e58">m_ParsedTfOperations</a>[nodeDef.name()] = std::move(parsedTfOperation);</div><div class="line"><a name="l03459"></a><span class="lineno"> 3459</span>&#160;</div><div class="line"><a name="l03460"></a><span class="lineno"> 3460</span>&#160;        <span class="comment">// If this node was requested as an output from the network, then adds an ArmNN output layer.</span></div><div class="line"><a name="l03461"></a><span class="lineno"> 3461</span>&#160;        <span class="keywordflow">if</span> (std::find(<a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a86cb41745deebd9b0ccf157d97d4d9ca">m_RequestedOutputs</a>.begin(), <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a86cb41745deebd9b0ccf157d97d4d9ca">m_RequestedOutputs</a>.end(), nodeDef.name()) !=</div><div class="line"><a name="l03462"></a><span class="lineno"> 3462</span>&#160;            <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a86cb41745deebd9b0ccf157d97d4d9ca">m_RequestedOutputs</a>.end())</div><div class="line"><a name="l03463"></a><span class="lineno"> 3463</span>&#160;        {</div><div class="line"><a name="l03464"></a><span class="lineno"> 3464</span>&#160;            <span class="keyword">auto</span> outId = ParseOutputId(nodeDef.name());</div><div class="line"><a name="l03465"></a><span class="lineno"> 3465</span>&#160;            <span class="keyword">const</span> <a class="code" href="namespacearmnn.xhtml#ab8cf8f9fb6792e654c2d8d8382f6f01b">LayerBindingId</a> layerId = <a class="code" href="namespacearmnn.xhtml#a375ca3cff9f1b005d1412dc5f3cf5b6e">armnn::numeric_cast</a>&lt;<a class="code" href="namespacearmnn.xhtml#ab8cf8f9fb6792e654c2d8d8382f6f01b">LayerBindingId</a>&gt;(<a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a62d6d6cba9ed0d3ad63fffb40aec86b5">m_NetworkOutputsBindingInfo</a>.size());</div><div class="line"><a name="l03466"></a><span class="lineno"> 3466</span>&#160;            <a class="code" href="classarmnn_1_1_i_output_slot.xhtml">IOutputSlot</a>&amp; prevSlot = parsedTfOperationRaw-&gt;ResolveArmnnOutputSlot(outId.m_Index);</div><div class="line"><a name="l03467"></a><span class="lineno"> 3467</span>&#160;</div><div class="line"><a name="l03468"></a><span class="lineno"> 3468</span>&#160;            <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> tensorInfo = prevSlot.GetTensorInfo();</div><div class="line"><a name="l03469"></a><span class="lineno"> 3469</span>&#160;</div><div class="line"><a name="l03470"></a><span class="lineno"> 3470</span>&#160;            <a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml">IConnectableLayer</a>* outputLayer = <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a2db3ae8d422f17d455e0ba0cb6291d2a">m_Network</a>-&gt;AddOutputLayer(layerId, nodeDef.name().c_str());</div><div class="line"><a name="l03471"></a><span class="lineno"> 3471</span>&#160;</div><div class="line"><a name="l03472"></a><span class="lineno"> 3472</span>&#160;            prevSlot.Connect(outputLayer-&gt;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml#a6ec9e0eb66d7d6a01240492a0b18104c">GetInputSlot</a>(0));</div><div class="line"><a name="l03473"></a><span class="lineno"> 3473</span>&#160;</div><div class="line"><a name="l03474"></a><span class="lineno"> 3474</span>&#160;            <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a0c98e07875a82c71c65bbb53eb347561">TrackOutputBinding</a>(outputLayer, layerId, tensorInfo);</div><div class="line"><a name="l03475"></a><span class="lineno"> 3475</span>&#160;        }</div><div class="line"><a name="l03476"></a><span class="lineno"> 3476</span>&#160;    }</div><div class="line"><a name="l03477"></a><span class="lineno"> 3477</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l03478"></a><span class="lineno"> 3478</span>&#160;    {</div><div class="line"><a name="l03479"></a><span class="lineno"> 3479</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="l03480"></a><span class="lineno"> 3480</span>&#160;            fmt::format(<span class="stringliteral">&quot;Unsupported operation {} in tensorflow::GraphDef {}&quot;</span>,</div><div class="line"><a name="l03481"></a><span class="lineno"> 3481</span>&#160;                        operation,</div><div class="line"><a name="l03482"></a><span class="lineno"> 3482</span>&#160;                        <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l03483"></a><span class="lineno"> 3483</span>&#160;    }</div><div class="line"><a name="l03484"></a><span class="lineno"> 3484</span>&#160;}</div><div class="line"><a name="l03485"></a><span class="lineno"> 3485</span>&#160;</div><div class="line"><a name="l03486"></a><span class="lineno"><a class="line" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a51591500d0839a1f602d8cd20bb9d3ce"> 3486</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a51591500d0839a1f602d8cd20bb9d3ce">ITfParser::TfParserImpl::LoadGraphDef</a>(<span class="keyword">const</span> tensorflow::GraphDef&amp; graphDef)</div><div class="line"><a name="l03487"></a><span class="lineno"> 3487</span>&#160;{</div><div class="line"><a name="l03488"></a><span class="lineno"> 3488</span>&#160;    <span class="comment">// Adds all nodes to our map.</span></div><div class="line"><a name="l03489"></a><span class="lineno"> 3489</span>&#160;    <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#ac2c326b2757eadec924e4b7f56a9379c">m_NodesByName</a>.clear();</div><div class="line"><a name="l03490"></a><span class="lineno"> 3490</span>&#160;    <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#ac62e2558c14e01605f2b4e1e21cdd1e8">m_NetworkInputsBindingInfo</a>.clear();</div><div class="line"><a name="l03491"></a><span class="lineno"> 3491</span>&#160;    <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a62d6d6cba9ed0d3ad63fffb40aec86b5">m_NetworkOutputsBindingInfo</a>.clear();</div><div class="line"><a name="l03492"></a><span class="lineno"> 3492</span>&#160;</div><div class="line"><a name="l03493"></a><span class="lineno"> 3493</span>&#160;    <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; graphDef.node_size(); ++i)</div><div class="line"><a name="l03494"></a><span class="lineno"> 3494</span>&#160;    {</div><div class="line"><a name="l03495"></a><span class="lineno"> 3495</span>&#160;        <span class="keyword">const</span> tensorflow::NodeDef&amp; node = graphDef.node(i);</div><div class="line"><a name="l03496"></a><span class="lineno"> 3496</span>&#160;        <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#ac2c326b2757eadec924e4b7f56a9379c">m_NodesByName</a>[node.name()]      = &amp;node;</div><div class="line"><a name="l03497"></a><span class="lineno"> 3497</span>&#160;    }</div><div class="line"><a name="l03498"></a><span class="lineno"> 3498</span>&#160;</div><div class="line"><a name="l03499"></a><span class="lineno"> 3499</span>&#160;    <span class="comment">// Checks that the input nodes the user has requested exist.</span></div><div class="line"><a name="l03500"></a><span class="lineno"> 3500</span>&#160;    <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span>&amp; pair : <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a76ea67f3f7d1d5835c5a92b65dc0854c">m_InputShapes</a>)</div><div class="line"><a name="l03501"></a><span class="lineno"> 3501</span>&#160;    {</div><div class="line"><a name="l03502"></a><span class="lineno"> 3502</span>&#160;        <span class="keyword">const</span> std::string&amp; requestedInputName = pair.first;</div><div class="line"><a name="l03503"></a><span class="lineno"> 3503</span>&#160;        <span class="keyword">auto</span> nodeIt = <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#ac2c326b2757eadec924e4b7f56a9379c">m_NodesByName</a>.find(requestedInputName);</div><div class="line"><a name="l03504"></a><span class="lineno"> 3504</span>&#160;        <span class="keywordflow">if</span> (nodeIt == <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#ac2c326b2757eadec924e4b7f56a9379c">m_NodesByName</a>.end())</div><div class="line"><a name="l03505"></a><span class="lineno"> 3505</span>&#160;        {</div><div class="line"><a name="l03506"></a><span class="lineno"> 3506</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="l03507"></a><span class="lineno"> 3507</span>&#160;                    fmt::format(<span class="stringliteral">&quot;Couldn&#39;t find requested input node &#39;{}&#39; in graph {}&quot;</span>,</div><div class="line"><a name="l03508"></a><span class="lineno"> 3508</span>&#160;                                requestedInputName,</div><div class="line"><a name="l03509"></a><span class="lineno"> 3509</span>&#160;                                <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l03510"></a><span class="lineno"> 3510</span>&#160;        }</div><div class="line"><a name="l03511"></a><span class="lineno"> 3511</span>&#160;    }</div><div class="line"><a name="l03512"></a><span class="lineno"> 3512</span>&#160;</div><div class="line"><a name="l03513"></a><span class="lineno"> 3513</span>&#160;    <span class="comment">// Finds the output nodes the user requested.</span></div><div class="line"><a name="l03514"></a><span class="lineno"> 3514</span>&#160;    std::vector&lt;const tensorflow::NodeDef*&gt; targetNodes;</div><div class="line"><a name="l03515"></a><span class="lineno"> 3515</span>&#160;    <span class="keywordflow">for</span> (<span class="keyword">const</span> std::string&amp; requestedOutputName : <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a86cb41745deebd9b0ccf157d97d4d9ca">m_RequestedOutputs</a>)</div><div class="line"><a name="l03516"></a><span class="lineno"> 3516</span>&#160;    {</div><div class="line"><a name="l03517"></a><span class="lineno"> 3517</span>&#160;        <span class="keyword">auto</span> nodeIt = <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#ac2c326b2757eadec924e4b7f56a9379c">m_NodesByName</a>.find(requestedOutputName);</div><div class="line"><a name="l03518"></a><span class="lineno"> 3518</span>&#160;        <span class="keywordflow">if</span> (nodeIt == <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#ac2c326b2757eadec924e4b7f56a9379c">m_NodesByName</a>.end())</div><div class="line"><a name="l03519"></a><span class="lineno"> 3519</span>&#160;        {</div><div class="line"><a name="l03520"></a><span class="lineno"> 3520</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="l03521"></a><span class="lineno"> 3521</span>&#160;                fmt::format(<span class="stringliteral">&quot;Couldn&#39;t find requested output node &#39;{}&#39; in graph {}&quot;</span>,</div><div class="line"><a name="l03522"></a><span class="lineno"> 3522</span>&#160;                            requestedOutputName,</div><div class="line"><a name="l03523"></a><span class="lineno"> 3523</span>&#160;                            <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l03524"></a><span class="lineno"> 3524</span>&#160;        }</div><div class="line"><a name="l03525"></a><span class="lineno"> 3525</span>&#160;        targetNodes.push_back(nodeIt-&gt;second);</div><div class="line"><a name="l03526"></a><span class="lineno"> 3526</span>&#160;    }</div><div class="line"><a name="l03527"></a><span class="lineno"> 3527</span>&#160;</div><div class="line"><a name="l03528"></a><span class="lineno"> 3528</span>&#160;    <span class="comment">// Sorts them into a linear ordering such that all inputs of a node are before the node itself.</span></div><div class="line"><a name="l03529"></a><span class="lineno"> 3529</span>&#160;    std::vector&lt;const tensorflow::NodeDef*&gt; sortedNodes;</div><div class="line"><a name="l03530"></a><span class="lineno"> 3530</span>&#160;    <span class="keywordflow">if</span> (!armnnUtils::GraphTopologicalSort&lt;const tensorflow::NodeDef*&gt;(</div><div class="line"><a name="l03531"></a><span class="lineno"> 3531</span>&#160;        targetNodes,</div><div class="line"><a name="l03532"></a><span class="lineno"> 3532</span>&#160;        [<span class="keyword">this</span>](<span class="keyword">const</span> tensorflow::NodeDef* node)</div><div class="line"><a name="l03533"></a><span class="lineno"> 3533</span>&#160;        {</div><div class="line"><a name="l03534"></a><span class="lineno"> 3534</span>&#160;            <span class="keyword">auto</span> outputs = <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a9e7a394f59e8d223a79e3db798803c1c">GetTfInputNodes</a>(*node);</div><div class="line"><a name="l03535"></a><span class="lineno"> 3535</span>&#160;            std::vector&lt;const tensorflow::NodeDef*&gt; nodesOnly;</div><div class="line"><a name="l03536"></a><span class="lineno"> 3536</span>&#160;            <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span> &amp; o : outputs) {</div><div class="line"><a name="l03537"></a><span class="lineno"> 3537</span>&#160;                nodesOnly.push_back(o.m_IndexedValue);</div><div class="line"><a name="l03538"></a><span class="lineno"> 3538</span>&#160;            }</div><div class="line"><a name="l03539"></a><span class="lineno"> 3539</span>&#160;            <span class="keywordflow">return</span> nodesOnly;</div><div class="line"><a name="l03540"></a><span class="lineno"> 3540</span>&#160;        },</div><div class="line"><a name="l03541"></a><span class="lineno"> 3541</span>&#160;        sortedNodes))</div><div class="line"><a name="l03542"></a><span class="lineno"> 3542</span>&#160;    {</div><div class="line"><a name="l03543"></a><span class="lineno"> 3543</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="l03544"></a><span class="lineno"> 3544</span>&#160;            fmt::format(<span class="stringliteral">&quot;Cycle detected in graph {}&quot;</span>,</div><div class="line"><a name="l03545"></a><span class="lineno"> 3545</span>&#160;                        <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l03546"></a><span class="lineno"> 3546</span>&#160;    }</div><div class="line"><a name="l03547"></a><span class="lineno"> 3547</span>&#160;</div><div class="line"><a name="l03548"></a><span class="lineno"> 3548</span>&#160;    <span class="comment">// Parses each node in order, knowing that all inputs of a node will be processed before the node itself.</span></div><div class="line"><a name="l03549"></a><span class="lineno"> 3549</span>&#160;    <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span>&amp; it : sortedNodes)</div><div class="line"><a name="l03550"></a><span class="lineno"> 3550</span>&#160;    {</div><div class="line"><a name="l03551"></a><span class="lineno"> 3551</span>&#160;        <span class="keyword">const</span> tensorflow::NodeDef&amp; currentNode = *it;</div><div class="line"><a name="l03552"></a><span class="lineno"> 3552</span>&#160;        <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a22a4253bd5cb5510d0086a0f067760ec">LoadNodeDef</a>(currentNode, graphDef);</div><div class="line"><a name="l03553"></a><span class="lineno"> 3553</span>&#160;    }</div><div class="line"><a name="l03554"></a><span class="lineno"> 3554</span>&#160;}</div><div class="line"><a name="l03555"></a><span class="lineno"> 3555</span>&#160;</div><div class="line"><a name="l03556"></a><span class="lineno"><a class="line" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#ac915fb2df2772be3179e97b1e8287a2d"> 3556</a></span>&#160;<a class="code" href="namespacearmnn.xhtml#ace74f6f9feb95a964a49d79458232703">INetworkPtr</a> <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#ac915fb2df2772be3179e97b1e8287a2d">ITfParser::TfParserImpl::CreateNetworkFromTextFile</a>(<span class="keyword">const</span> <span class="keywordtype">char</span>* graphFile,</div><div class="line"><a name="l03557"></a><span class="lineno"> 3557</span>&#160;    <span class="keyword">const</span> std::map&lt;std::string, TensorShape&gt;&amp; inputShapes,</div><div class="line"><a name="l03558"></a><span class="lineno"> 3558</span>&#160;    <span class="keyword">const</span> std::vector&lt;std::string&gt;&amp; requestedOutputs)</div><div class="line"><a name="l03559"></a><span class="lineno"> 3559</span>&#160;{</div><div class="line"><a name="l03560"></a><span class="lineno"> 3560</span>&#160;    FILE* fd = fopen(graphFile, <span class="stringliteral">&quot;r&quot;</span>);</div><div class="line"><a name="l03561"></a><span class="lineno"> 3561</span>&#160;</div><div class="line"><a name="l03562"></a><span class="lineno"> 3562</span>&#160;    <span class="keywordflow">if</span> (fd == <span class="keyword">nullptr</span>)</div><div class="line"><a name="l03563"></a><span class="lineno"> 3563</span>&#160;    {</div><div class="line"><a name="l03564"></a><span class="lineno"> 3564</span>&#160;        <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_file_not_found_exception.xhtml">FileNotFoundException</a>(</div><div class="line"><a name="l03565"></a><span class="lineno"> 3565</span>&#160;            fmt::format(<span class="stringliteral">&quot;Graph file {} failed to open {}&quot;</span>,</div><div class="line"><a name="l03566"></a><span class="lineno"> 3566</span>&#160;                        graphFile,</div><div class="line"><a name="l03567"></a><span class="lineno"> 3567</span>&#160;                        <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l03568"></a><span class="lineno"> 3568</span>&#160;    }</div><div class="line"><a name="l03569"></a><span class="lineno"> 3569</span>&#160;</div><div class="line"><a name="l03570"></a><span class="lineno"> 3570</span>&#160;    <span class="comment">// Parses the file into a message.</span></div><div class="line"><a name="l03571"></a><span class="lineno"> 3571</span>&#160;    tensorflow::GraphDef graphDef;</div><div class="line"><a name="l03572"></a><span class="lineno"> 3572</span>&#160;    <span class="keyword">auto</span>                 input   = <span class="keyword">new</span> google::protobuf::io::FileInputStream(fileno(fd));</div><div class="line"><a name="l03573"></a><span class="lineno"> 3573</span>&#160;    <span class="keywordtype">bool</span>                 success = google::protobuf::TextFormat::Parse(input, &amp;graphDef);</div><div class="line"><a name="l03574"></a><span class="lineno"> 3574</span>&#160;    <span class="keyword">delete</span> input;</div><div class="line"><a name="l03575"></a><span class="lineno"> 3575</span>&#160;    fclose(fd);</div><div class="line"><a name="l03576"></a><span class="lineno"> 3576</span>&#160;</div><div class="line"><a name="l03577"></a><span class="lineno"> 3577</span>&#160;    <span class="keywordflow">if</span> (!success)</div><div class="line"><a name="l03578"></a><span class="lineno"> 3578</span>&#160;    {</div><div class="line"><a name="l03579"></a><span class="lineno"> 3579</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="l03580"></a><span class="lineno"> 3580</span>&#160;            fmt::format(<span class="stringliteral">&quot;Failed to parse graph file {}&quot;</span>,</div><div class="line"><a name="l03581"></a><span class="lineno"> 3581</span>&#160;                        <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l03582"></a><span class="lineno"> 3582</span>&#160;    }</div><div class="line"><a name="l03583"></a><span class="lineno"> 3583</span>&#160;</div><div class="line"><a name="l03584"></a><span class="lineno"> 3584</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a931e43b8100b02a3c1f2f5f30ba9a943">CreateNetworkFromGraphDef</a>(graphDef, inputShapes, requestedOutputs);</div><div class="line"><a name="l03585"></a><span class="lineno"> 3585</span>&#160;}</div><div class="line"><a name="l03586"></a><span class="lineno"> 3586</span>&#160;</div><div class="line"><a name="l03587"></a><span class="lineno"><a class="line" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a7e393f41f2330006fdf00f2840c6dd28"> 3587</a></span>&#160;<a class="code" href="namespacearmnn.xhtml#ace74f6f9feb95a964a49d79458232703">INetworkPtr</a> <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a7e393f41f2330006fdf00f2840c6dd28">ITfParser::TfParserImpl::CreateNetworkFromString</a>(<span class="keyword">const</span> <span class="keywordtype">char</span>* protoText,</div><div class="line"><a name="l03588"></a><span class="lineno"> 3588</span>&#160;    <span class="keyword">const</span> std::map&lt;std::string, TensorShape&gt;&amp; inputShapes,</div><div class="line"><a name="l03589"></a><span class="lineno"> 3589</span>&#160;    <span class="keyword">const</span> std::vector&lt;std::string&gt;&amp; requestedOutputs)</div><div class="line"><a name="l03590"></a><span class="lineno"> 3590</span>&#160;{</div><div class="line"><a name="l03591"></a><span class="lineno"> 3591</span>&#160;    <span class="comment">// Parses the string into a message.</span></div><div class="line"><a name="l03592"></a><span class="lineno"> 3592</span>&#160;    tensorflow::GraphDef graphDef;</div><div class="line"><a name="l03593"></a><span class="lineno"> 3593</span>&#160;    <span class="keywordtype">bool</span> success = google::protobuf::TextFormat::ParseFromString(protoText, &amp;graphDef);</div><div class="line"><a name="l03594"></a><span class="lineno"> 3594</span>&#160;</div><div class="line"><a name="l03595"></a><span class="lineno"> 3595</span>&#160;    <span class="keywordflow">if</span> (!success)</div><div class="line"><a name="l03596"></a><span class="lineno"> 3596</span>&#160;    {</div><div class="line"><a name="l03597"></a><span class="lineno"> 3597</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="l03598"></a><span class="lineno"> 3598</span>&#160;            fmt::format(<span class="stringliteral">&quot;Failed to parse graph file {}&quot;</span>,</div><div class="line"><a name="l03599"></a><span class="lineno"> 3599</span>&#160;                        <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l03600"></a><span class="lineno"> 3600</span>&#160;    }</div><div class="line"><a name="l03601"></a><span class="lineno"> 3601</span>&#160;</div><div class="line"><a name="l03602"></a><span class="lineno"> 3602</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a931e43b8100b02a3c1f2f5f30ba9a943">CreateNetworkFromGraphDef</a>(graphDef, inputShapes, requestedOutputs);</div><div class="line"><a name="l03603"></a><span class="lineno"> 3603</span>&#160;}</div><div class="line"><a name="l03604"></a><span class="lineno"> 3604</span>&#160;</div><div class="line"><a name="l03605"></a><span class="lineno"><a class="line" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a8c99f1b3140d1767d320d3e7d2e90949"> 3605</a></span>&#160;<a class="code" href="namespacearmnn.xhtml#ace74f6f9feb95a964a49d79458232703">INetworkPtr</a> <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a8c99f1b3140d1767d320d3e7d2e90949">ITfParser::TfParserImpl::CreateNetworkFromBinaryFile</a>(<span class="keyword">const</span> <span class="keywordtype">char</span>* graphFile,</div><div class="line"><a name="l03606"></a><span class="lineno"> 3606</span>&#160;    <span class="keyword">const</span> std::map&lt;std::string, TensorShape&gt;&amp; inputShapes,</div><div class="line"><a name="l03607"></a><span class="lineno"> 3607</span>&#160;    <span class="keyword">const</span> std::vector&lt;std::string&gt;&amp; requestedOutputs)</div><div class="line"><a name="l03608"></a><span class="lineno"> 3608</span>&#160;{</div><div class="line"><a name="l03609"></a><span class="lineno"> 3609</span>&#160;    FILE* fd = fopen(graphFile, <span class="stringliteral">&quot;rb&quot;</span>);</div><div class="line"><a name="l03610"></a><span class="lineno"> 3610</span>&#160;</div><div class="line"><a name="l03611"></a><span class="lineno"> 3611</span>&#160;    <span class="keywordflow">if</span> (fd == <span class="keyword">nullptr</span>)</div><div class="line"><a name="l03612"></a><span class="lineno"> 3612</span>&#160;    {</div><div class="line"><a name="l03613"></a><span class="lineno"> 3613</span>&#160;        <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_file_not_found_exception.xhtml">FileNotFoundException</a>(</div><div class="line"><a name="l03614"></a><span class="lineno"> 3614</span>&#160;            fmt::format(<span class="stringliteral">&quot;Graph file {} failed to open {}&quot;</span>,</div><div class="line"><a name="l03615"></a><span class="lineno"> 3615</span>&#160;                        graphFile,</div><div class="line"><a name="l03616"></a><span class="lineno"> 3616</span>&#160;                        <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l03617"></a><span class="lineno"> 3617</span>&#160;    }</div><div class="line"><a name="l03618"></a><span class="lineno"> 3618</span>&#160;</div><div class="line"><a name="l03619"></a><span class="lineno"> 3619</span>&#160;    <span class="comment">// Parses the file into a message.</span></div><div class="line"><a name="l03620"></a><span class="lineno"> 3620</span>&#160;    tensorflow::GraphDef graphDef;</div><div class="line"><a name="l03621"></a><span class="lineno"> 3621</span>&#160;</div><div class="line"><a name="l03622"></a><span class="lineno"> 3622</span>&#160;    google::protobuf::io::FileInputStream  inStream(fileno(fd));</div><div class="line"><a name="l03623"></a><span class="lineno"> 3623</span>&#160;    google::protobuf::io::CodedInputStream codedStream(&amp;inStream);</div><div class="line"><a name="l03624"></a><span class="lineno"> 3624</span>&#160;    codedStream.SetTotalBytesLimit(INT_MAX);</div><div class="line"><a name="l03625"></a><span class="lineno"> 3625</span>&#160;    <span class="keywordtype">bool</span> success = graphDef.ParseFromCodedStream(&amp;codedStream);</div><div class="line"><a name="l03626"></a><span class="lineno"> 3626</span>&#160;    fclose(fd);</div><div class="line"><a name="l03627"></a><span class="lineno"> 3627</span>&#160;</div><div class="line"><a name="l03628"></a><span class="lineno"> 3628</span>&#160;    <span class="keywordflow">if</span> (!success)</div><div class="line"><a name="l03629"></a><span class="lineno"> 3629</span>&#160;    {</div><div class="line"><a name="l03630"></a><span class="lineno"> 3630</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="l03631"></a><span class="lineno"> 3631</span>&#160;            fmt::format(<span class="stringliteral">&quot;Failed to parse protobuf file {} {}&quot;</span>,</div><div class="line"><a name="l03632"></a><span class="lineno"> 3632</span>&#160;                        graphFile,</div><div class="line"><a name="l03633"></a><span class="lineno"> 3633</span>&#160;                        <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l03634"></a><span class="lineno"> 3634</span>&#160;    }</div><div class="line"><a name="l03635"></a><span class="lineno"> 3635</span>&#160;</div><div class="line"><a name="l03636"></a><span class="lineno"> 3636</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a931e43b8100b02a3c1f2f5f30ba9a943">CreateNetworkFromGraphDef</a>(graphDef, inputShapes, requestedOutputs);</div><div class="line"><a name="l03637"></a><span class="lineno"> 3637</span>&#160;}</div><div class="line"><a name="l03638"></a><span class="lineno"> 3638</span>&#160;</div><div class="line"><a name="l03639"></a><span class="lineno"><a class="line" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a931e43b8100b02a3c1f2f5f30ba9a943"> 3639</a></span>&#160;<a class="code" href="namespacearmnn.xhtml#ace74f6f9feb95a964a49d79458232703">INetworkPtr</a> <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a931e43b8100b02a3c1f2f5f30ba9a943">ITfParser::TfParserImpl::CreateNetworkFromGraphDef</a>(<span class="keyword">const</span> tensorflow::GraphDef&amp; graphDef,</div><div class="line"><a name="l03640"></a><span class="lineno"> 3640</span>&#160;    <span class="keyword">const</span> std::map&lt;std::string, TensorShape&gt;&amp; inputShapes,</div><div class="line"><a name="l03641"></a><span class="lineno"> 3641</span>&#160;    <span class="keyword">const</span> std::vector&lt;std::string&gt;&amp; requestedOutputs)</div><div class="line"><a name="l03642"></a><span class="lineno"> 3642</span>&#160;{</div><div class="line"><a name="l03643"></a><span class="lineno"> 3643</span>&#160;    <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a2db3ae8d422f17d455e0ba0cb6291d2a">m_Network</a> = INetwork::Create();</div><div class="line"><a name="l03644"></a><span class="lineno"> 3644</span>&#160;</div><div class="line"><a name="l03645"></a><span class="lineno"> 3645</span>&#160;    <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a76ea67f3f7d1d5835c5a92b65dc0854c">m_InputShapes</a> = inputShapes;</div><div class="line"><a name="l03646"></a><span class="lineno"> 3646</span>&#160;    <span class="keywordflow">if</span> (requestedOutputs.size() == 0)</div><div class="line"><a name="l03647"></a><span class="lineno"> 3647</span>&#160;    {</div><div class="line"><a name="l03648"></a><span class="lineno"> 3648</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="l03649"></a><span class="lineno"> 3649</span>&#160;            fmt::format(<span class="stringliteral">&quot;requestedOutputs must have at least one entry {}&quot;</span>,</div><div class="line"><a name="l03650"></a><span class="lineno"> 3650</span>&#160;                        <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l03651"></a><span class="lineno"> 3651</span>&#160;    }</div><div class="line"><a name="l03652"></a><span class="lineno"> 3652</span>&#160;    <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a86cb41745deebd9b0ccf157d97d4d9ca">m_RequestedOutputs</a> = requestedOutputs;</div><div class="line"><a name="l03653"></a><span class="lineno"> 3653</span>&#160;</div><div class="line"><a name="l03654"></a><span class="lineno"> 3654</span>&#160;    <span class="keywordflow">try</span></div><div class="line"><a name="l03655"></a><span class="lineno"> 3655</span>&#160;    {</div><div class="line"><a name="l03656"></a><span class="lineno"> 3656</span>&#160;        <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a51591500d0839a1f602d8cd20bb9d3ce">LoadGraphDef</a>(graphDef);</div><div class="line"><a name="l03657"></a><span class="lineno"> 3657</span>&#160;    }</div><div class="line"><a name="l03658"></a><span class="lineno"> 3658</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="l03659"></a><span class="lineno"> 3659</span>&#160;    {</div><div class="line"><a name="l03660"></a><span class="lineno"> 3660</span>&#160;        <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#ae89a123aad1c66a76c398b7af216aae4">Cleanup</a>();</div><div class="line"><a name="l03661"></a><span class="lineno"> 3661</span>&#160;        <span class="keywordflow">throw</span> e;</div><div class="line"><a name="l03662"></a><span class="lineno"> 3662</span>&#160;    }</div><div class="line"><a name="l03663"></a><span class="lineno"> 3663</span>&#160;</div><div class="line"><a name="l03664"></a><span class="lineno"> 3664</span>&#160;    <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#ae89a123aad1c66a76c398b7af216aae4">Cleanup</a>();</div><div class="line"><a name="l03665"></a><span class="lineno"> 3665</span>&#160;</div><div class="line"><a name="l03666"></a><span class="lineno"> 3666</span>&#160;    <span class="keywordflow">return</span> std::move(<a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a2db3ae8d422f17d455e0ba0cb6291d2a">m_Network</a>);</div><div class="line"><a name="l03667"></a><span class="lineno"> 3667</span>&#160;}</div><div class="line"><a name="l03668"></a><span class="lineno"> 3668</span>&#160;</div><div class="line"><a name="l03669"></a><span class="lineno"><a class="line" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#ae89a123aad1c66a76c398b7af216aae4"> 3669</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#ae89a123aad1c66a76c398b7af216aae4">ITfParser::TfParserImpl::Cleanup</a>()</div><div class="line"><a name="l03670"></a><span class="lineno"> 3670</span>&#160;{</div><div class="line"><a name="l03671"></a><span class="lineno"> 3671</span>&#160;    <span class="comment">// Cleanup, in case we reuse this parser.</span></div><div class="line"><a name="l03672"></a><span class="lineno"> 3672</span>&#160;    <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a76ea67f3f7d1d5835c5a92b65dc0854c">m_InputShapes</a>.clear();</div><div class="line"><a name="l03673"></a><span class="lineno"> 3673</span>&#160;    <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a86cb41745deebd9b0ccf157d97d4d9ca">m_RequestedOutputs</a>.clear();</div><div class="line"><a name="l03674"></a><span class="lineno"> 3674</span>&#160;    <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#ac2c326b2757eadec924e4b7f56a9379c">m_NodesByName</a>.clear();</div><div class="line"><a name="l03675"></a><span class="lineno"> 3675</span>&#160;    <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a8dd5c5f271f0f5bd68612e7927d94e58">m_ParsedTfOperations</a>.clear();</div><div class="line"><a name="l03676"></a><span class="lineno"> 3676</span>&#160;}</div><div class="line"><a name="l03677"></a><span class="lineno"> 3677</span>&#160;</div><div class="line"><a name="l03678"></a><span class="lineno"><a class="line" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a8b053a6c449d0814cc831c916c126668"> 3678</a></span>&#160;<a class="code" href="namespacearmnn_tf_parser.xhtml#a9084adbf804022c874039ad40d1939e9">BindingPointInfo</a> <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a8b053a6c449d0814cc831c916c126668">ITfParser::TfParserImpl::GetNetworkInputBindingInfo</a>(<span class="keyword">const</span> std::string&amp; name)<span class="keyword"> const</span></div><div class="line"><a name="l03679"></a><span class="lineno"> 3679</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l03680"></a><span class="lineno"> 3680</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#ac41a09541f963e43c9a9300e8c28eb06">GetBindingInfo</a>(name, <span class="stringliteral">&quot;input&quot;</span>, <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#ac62e2558c14e01605f2b4e1e21cdd1e8">m_NetworkInputsBindingInfo</a>);</div><div class="line"><a name="l03681"></a><span class="lineno"> 3681</span>&#160;}</div><div class="line"><a name="l03682"></a><span class="lineno"> 3682</span>&#160;</div><div class="line"><a name="l03683"></a><span class="lineno"><a class="line" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a4b1fdcb1985af12dd1848a9ffa5d3271"> 3683</a></span>&#160;<a class="code" href="namespacearmnn_tf_parser.xhtml#a9084adbf804022c874039ad40d1939e9">BindingPointInfo</a> <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a4b1fdcb1985af12dd1848a9ffa5d3271">ITfParser::TfParserImpl::GetNetworkOutputBindingInfo</a>(<span class="keyword">const</span> std::string&amp; name)<span class="keyword"> const</span></div><div class="line"><a name="l03684"></a><span class="lineno"> 3684</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l03685"></a><span class="lineno"> 3685</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#ac41a09541f963e43c9a9300e8c28eb06">GetBindingInfo</a>(name, <span class="stringliteral">&quot;output&quot;</span>, <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a62d6d6cba9ed0d3ad63fffb40aec86b5">m_NetworkOutputsBindingInfo</a>);</div><div class="line"><a name="l03686"></a><span class="lineno"> 3686</span>&#160;}</div><div class="line"><a name="l03687"></a><span class="lineno"> 3687</span>&#160;</div><div class="line"><a name="l03688"></a><span class="lineno"><a class="line" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#ac41a09541f963e43c9a9300e8c28eb06"> 3688</a></span>&#160;std::pair&lt;LayerBindingId, TensorInfo&gt; <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#ac41a09541f963e43c9a9300e8c28eb06">ITfParser::TfParserImpl::GetBindingInfo</a>(<span class="keyword">const</span> std::string&amp; layerName,</div><div class="line"><a name="l03689"></a><span class="lineno"> 3689</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">char</span>* bindingPointDesc,</div><div class="line"><a name="l03690"></a><span class="lineno"> 3690</span>&#160;    <span class="keyword">const</span> std::unordered_map&lt;std::string, BindingPointInfo&gt;&amp; nameToBindingInfo)</div><div class="line"><a name="l03691"></a><span class="lineno"> 3691</span>&#160;{</div><div class="line"><a name="l03692"></a><span class="lineno"> 3692</span>&#160;    <span class="keyword">auto</span> it = nameToBindingInfo.find(layerName);</div><div class="line"><a name="l03693"></a><span class="lineno"> 3693</span>&#160;    <span class="keywordflow">if</span> (it == nameToBindingInfo.end())</div><div class="line"><a name="l03694"></a><span class="lineno"> 3694</span>&#160;    {</div><div class="line"><a name="l03695"></a><span class="lineno"> 3695</span>&#160;        <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_invalid_argument_exception.xhtml">InvalidArgumentException</a>(</div><div class="line"><a name="l03696"></a><span class="lineno"> 3696</span>&#160;            fmt::format(<span class="stringliteral">&quot;Unknown {} &#39;{}&#39; {}&quot;</span>,</div><div class="line"><a name="l03697"></a><span class="lineno"> 3697</span>&#160;                        bindingPointDesc,</div><div class="line"><a name="l03698"></a><span class="lineno"> 3698</span>&#160;                        layerName,</div><div class="line"><a name="l03699"></a><span class="lineno"> 3699</span>&#160;                        <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l03700"></a><span class="lineno"> 3700</span>&#160;    }</div><div class="line"><a name="l03701"></a><span class="lineno"> 3701</span>&#160;    <span class="keywordflow">return</span> it-&gt;second;</div><div class="line"><a name="l03702"></a><span class="lineno"> 3702</span>&#160;}</div><div class="line"><a name="l03703"></a><span class="lineno"> 3703</span>&#160;</div><div class="line"><a name="l03704"></a><span class="lineno"><a class="line" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a2a1112c66d08e3760ecccf39c7854a90"> 3704</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a2a1112c66d08e3760ecccf39c7854a90">ITfParser::TfParserImpl::TrackInputBinding</a>(<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml">IConnectableLayer</a>* layer,</div><div class="line"><a name="l03705"></a><span class="lineno"> 3705</span>&#160;                                                <a class="code" href="namespacearmnn.xhtml#ab8cf8f9fb6792e654c2d8d8382f6f01b">LayerBindingId</a> <span class="keywordtype">id</span>,</div><div class="line"><a name="l03706"></a><span class="lineno"> 3706</span>&#160;                                                <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a>&amp; tensorInfo)</div><div class="line"><a name="l03707"></a><span class="lineno"> 3707</span>&#160;{</div><div class="line"><a name="l03708"></a><span class="lineno"> 3708</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a5f5e6255b21fdf458d3733bbdcdc4af5">TrackBindingPoint</a>(layer, <span class="keywordtype">id</span>, tensorInfo, <span class="stringliteral">&quot;input&quot;</span>, <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#ac62e2558c14e01605f2b4e1e21cdd1e8">m_NetworkInputsBindingInfo</a>);</div><div class="line"><a name="l03709"></a><span class="lineno"> 3709</span>&#160;}</div><div class="line"><a name="l03710"></a><span class="lineno"> 3710</span>&#160;</div><div class="line"><a name="l03711"></a><span class="lineno"><a class="line" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a0c98e07875a82c71c65bbb53eb347561"> 3711</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a0c98e07875a82c71c65bbb53eb347561">ITfParser::TfParserImpl::TrackOutputBinding</a>(<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml">IConnectableLayer</a>* layer,</div><div class="line"><a name="l03712"></a><span class="lineno"> 3712</span>&#160;                                                 <a class="code" href="namespacearmnn.xhtml#ab8cf8f9fb6792e654c2d8d8382f6f01b">LayerBindingId</a> <span class="keywordtype">id</span>,</div><div class="line"><a name="l03713"></a><span class="lineno"> 3713</span>&#160;                                                 <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a>&amp; tensorInfo)</div><div class="line"><a name="l03714"></a><span class="lineno"> 3714</span>&#160;{</div><div class="line"><a name="l03715"></a><span class="lineno"> 3715</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a5f5e6255b21fdf458d3733bbdcdc4af5">TrackBindingPoint</a>(layer, <span class="keywordtype">id</span>, tensorInfo, <span class="stringliteral">&quot;output&quot;</span>, <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a62d6d6cba9ed0d3ad63fffb40aec86b5">m_NetworkOutputsBindingInfo</a>);</div><div class="line"><a name="l03716"></a><span class="lineno"> 3716</span>&#160;}</div><div class="line"><a name="l03717"></a><span class="lineno"> 3717</span>&#160;</div><div class="line"><a name="l03718"></a><span class="lineno"><a class="line" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a5f5e6255b21fdf458d3733bbdcdc4af5"> 3718</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a5f5e6255b21fdf458d3733bbdcdc4af5">ITfParser::TfParserImpl::TrackBindingPoint</a>(<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml">IConnectableLayer</a>* layer,</div><div class="line"><a name="l03719"></a><span class="lineno"> 3719</span>&#160;    <a class="code" href="namespacearmnn.xhtml#ab8cf8f9fb6792e654c2d8d8382f6f01b">LayerBindingId</a> <span class="keywordtype">id</span>,</div><div class="line"><a name="l03720"></a><span class="lineno"> 3720</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a>&amp; tensorInfo,</div><div class="line"><a name="l03721"></a><span class="lineno"> 3721</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">char</span>* bindingPointDesc,</div><div class="line"><a name="l03722"></a><span class="lineno"> 3722</span>&#160;    std::unordered_map&lt;std::string, BindingPointInfo&gt;&amp; nameToBindingInfo)</div><div class="line"><a name="l03723"></a><span class="lineno"> 3723</span>&#160;{</div><div class="line"><a name="l03724"></a><span class="lineno"> 3724</span>&#160;    <span class="keyword">const</span> std::string layerName = layer-&gt;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml#afcc1c3a20bd2860e0ddd21674389246f">GetName</a>();</div><div class="line"><a name="l03725"></a><span class="lineno"> 3725</span>&#160;    <span class="keyword">auto</span> it = nameToBindingInfo.find(layerName);</div><div class="line"><a name="l03726"></a><span class="lineno"> 3726</span>&#160;    <span class="keywordflow">if</span> (it == nameToBindingInfo.end())</div><div class="line"><a name="l03727"></a><span class="lineno"> 3727</span>&#160;    {</div><div class="line"><a name="l03728"></a><span class="lineno"> 3728</span>&#160;        nameToBindingInfo[layerName] = std::make_pair(<span class="keywordtype">id</span>, tensorInfo);</div><div class="line"><a name="l03729"></a><span class="lineno"> 3729</span>&#160;    }</div><div class="line"><a name="l03730"></a><span class="lineno"> 3730</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l03731"></a><span class="lineno"> 3731</span>&#160;    {</div><div class="line"><a name="l03732"></a><span class="lineno"> 3732</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="l03733"></a><span class="lineno"> 3733</span>&#160;            fmt::format(<span class="stringliteral">&quot;Id {} used by more than one {} layer {}&quot;</span>,</div><div class="line"><a name="l03734"></a><span class="lineno"> 3734</span>&#160;                        <span class="keywordtype">id</span>,</div><div class="line"><a name="l03735"></a><span class="lineno"> 3735</span>&#160;                        bindingPointDesc,</div><div class="line"><a name="l03736"></a><span class="lineno"> 3736</span>&#160;                        <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l03737"></a><span class="lineno"> 3737</span>&#160;    }</div><div class="line"><a name="l03738"></a><span class="lineno"> 3738</span>&#160;}</div><div class="line"><a name="l03739"></a><span class="lineno"> 3739</span>&#160;</div><div class="line"><a name="l03740"></a><span class="lineno"><a class="line" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#aa09a8bb02eed50715082d8b7fccd2f8d"> 3740</a></span>&#160;<span class="keyword">const</span> std::string <a class="code" href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#aa09a8bb02eed50715082d8b7fccd2f8d">ITfParser::TfParserImpl::GetVersion</a>()</div><div class="line"><a name="l03741"></a><span class="lineno"> 3741</span>&#160;{</div><div class="line"><a name="l03742"></a><span class="lineno"> 3742</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="include_2armnn_tf_parser_2_version_8hpp.xhtml#a3a58bd808c80a293adf0863c1bae3b5c">TF_PARSER_VERSION</a>;</div><div class="line"><a name="l03743"></a><span class="lineno"> 3743</span>&#160;}</div><div class="line"><a name="l03744"></a><span class="lineno"> 3744</span>&#160;</div><div class="line"><a name="l03745"></a><span class="lineno"> 3745</span>&#160;} <span class="comment">// namespace armnnTfParser</span></div><div class="ttc" id="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl_xhtml_ae89a123aad1c66a76c398b7af216aae4"><div class="ttname"><a href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#ae89a123aad1c66a76c398b7af216aae4">armnnTfParser::ITfParser::TfParserImpl::Cleanup</a></div><div class="ttdeci">void Cleanup()</div><div class="ttdef"><b>Definition:</b> <a href="_tf_parser_8cpp_source.xhtml#l03669">TfParser.cpp:3669</a></div></div>
<div class="ttc" id="classarmnn_tf_parser_1_1_i_tf_parser_xhtml_ad3c8cd69190956793af7af503dc495cd"><div class="ttname"><a href="classarmnn_tf_parser_1_1_i_tf_parser.xhtml#ad3c8cd69190956793af7af503dc495cd">armnnTfParser::ITfParser::ParsedConstTfOperation</a></div><div class="ttdeci">friend class ParsedConstTfOperation</div><div class="ttdef"><b>Definition:</b> <a href="_i_tf_parser_8hpp_source.xhtml#l00058">ITfParser.hpp:58</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="namespacearmnn_tf_parser_xhtml_af7cec8b9a69e02f18a5de38502675d94"><div class="ttname"><a href="namespacearmnn_tf_parser.xhtml#af7cec8b9a69e02f18a5de38502675d94">armnnTfParser::ITfParserPtr</a></div><div class="ttdeci">std::unique_ptr&lt; ITfParser, void(*)(ITfParser *parser)&gt; ITfParserPtr</div><div class="ttdef"><b>Definition:</b> <a href="_i_tf_parser_8hpp_source.xhtml#l00022">ITfParser.hpp:22</a></div></div>
<div class="ttc" id="_ignore_unused_8hpp_xhtml"><div class="ttname"><a href="_ignore_unused_8hpp.xhtml">IgnoreUnused.hpp</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_tf_parser_1_1_i_tf_parser_xhtml_add49602ee9cd2bd16c1c4ccd25555d8e"><div class="ttname"><a href="classarmnn_tf_parser_1_1_i_tf_parser.xhtml#add49602ee9cd2bd16c1c4ccd25555d8e">armnnTfParser::ITfParser::CreateNetworkFromTextFile</a></div><div class="ttdeci">armnn::INetworkPtr CreateNetworkFromTextFile(const char *graphFile, const std::map&lt; std::string, armnn::TensorShape &gt; &amp;inputShapes, const std::vector&lt; std::string &gt; &amp;requestedOutputs)</div><div class="ttdoc">Create the network from a protobuf text file on the disk. </div><div class="ttdef"><b>Definition:</b> <a href="_tf_parser_8cpp_source.xhtml#l00058">TfParser.cpp:58</a></div></div>
<div class="ttc" id="structarmnn_1_1_convolution2d_descriptor_xhtml_a6089e1ca91914015777ea780a513131a"><div class="ttname"><a href="structarmnn_1_1_convolution2d_descriptor.xhtml#a6089e1ca91914015777ea780a513131a">armnn::Convolution2dDescriptor::m_DataLayout</a></div><div class="ttdeci">DataLayout m_DataLayout</div><div class="ttdoc">The data layout to be used (NCHW, NHWC). </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l00456">Descriptors.hpp:456</a></div></div>
<div class="ttc" id="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl_xhtml_acb94c45784c439b75dcf858655a6d330"><div class="ttname"><a href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#acb94c45784c439b75dcf858655a6d330">armnnTfParser::ITfParser::TfParserImpl::ParseMaximum</a></div><div class="ttdeci">ParsedTfOperationPtr ParseMaximum(const tensorflow::NodeDef &amp;nodeDef, const tensorflow::GraphDef &amp;graphDef)</div><div class="ttdef"><b>Definition:</b> <a href="_tf_parser_8cpp_source.xhtml#l01759">TfParser.cpp:1759</a></div></div>
<div class="ttc" id="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl_xhtml_a76ea67f3f7d1d5835c5a92b65dc0854c"><div class="ttname"><a href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a76ea67f3f7d1d5835c5a92b65dc0854c">armnnTfParser::ITfParser::TfParserImpl::m_InputShapes</a></div><div class="ttdeci">std::map&lt; std::string, armnn::TensorShape &gt; m_InputShapes</div><div class="ttdef"><b>Definition:</b> <a href="_tf_parser_8hpp_source.xhtml#l00261">TfParser.hpp:261</a></div></div>
<div class="ttc" id="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl_xhtml_a46587dd82842638c50848021c57b6fad"><div class="ttname"><a href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a46587dd82842638c50848021c57b6fad">armnnTfParser::ITfParser::TfParserImpl::ParsePlaceholder</a></div><div class="ttdeci">ParsedTfOperationPtr ParsePlaceholder(const tensorflow::NodeDef &amp;nodeDef, const tensorflow::GraphDef &amp;graphDef)</div><div class="ttdef"><b>Definition:</b> <a href="_tf_parser_8cpp_source.xhtml#l02718">TfParser.cpp:2718</a></div></div>
<div class="ttc" id="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl_xhtml_ac915fb2df2772be3179e97b1e8287a2d"><div class="ttname"><a href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#ac915fb2df2772be3179e97b1e8287a2d">armnnTfParser::ITfParser::TfParserImpl::CreateNetworkFromTextFile</a></div><div class="ttdeci">armnn::INetworkPtr CreateNetworkFromTextFile(const char *graphFile, const std::map&lt; std::string, armnn::TensorShape &gt; &amp;inputShapes, const std::vector&lt; std::string &gt; &amp;requestedOutputs)</div><div class="ttdoc">Creates the network from a protobuf text file on the disk. </div><div class="ttdef"><b>Definition:</b> <a href="_tf_parser_8cpp_source.xhtml#l03556">TfParser.cpp:3556</a></div></div>
<div class="ttc" id="structarmnn_1_1_stack_descriptor_xhtml_ab218de7805899c8412d75d1fd1d846d2"><div class="ttname"><a href="structarmnn_1_1_stack_descriptor.xhtml#ab218de7805899c8412d75d1fd1d846d2">armnn::StackDescriptor::m_Axis</a></div><div class="ttdeci">uint32_t m_Axis</div><div class="ttdoc">0-based axis along which to stack the input tensors. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l01046">Descriptors.hpp:1046</a></div></div>
<div class="ttc" id="_data_layout_indexed_8hpp_xhtml"><div class="ttname"><a href="_data_layout_indexed_8hpp.xhtml">DataLayoutIndexed.hpp</a></div></div>
<div class="ttc" id="structarmnn_1_1_views_descriptor_xhtml"><div class="ttname"><a href="structarmnn_1_1_views_descriptor.xhtml">armnn::ViewsDescriptor</a></div><div class="ttdoc">A ViewsDescriptor for the SplitterLayer. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l00206">Descriptors.hpp:206</a></div></div>
<div class="ttc" id="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl_xhtml_a74351720e73ac419536a6a527b4b46fa"><div class="ttname"><a href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a74351720e73ac419536a6a527b4b46fa">armnnTfParser::ITfParser::TfParserImpl::ParseMean</a></div><div class="ttdeci">ParsedTfOperationPtr ParseMean(const tensorflow::NodeDef &amp;nodeDef, const tensorflow::GraphDef &amp;graphDef)</div><div class="ttdef"><b>Definition:</b> <a href="_tf_parser_8cpp_source.xhtml#l02634">TfParser.cpp:2634</a></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="_transpose_8hpp_xhtml"><div class="ttname"><a href="_transpose_8hpp.xhtml">Transpose.hpp</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="structarmnn_1_1_depthwise_convolution2d_descriptor_xhtml_aea202e14d8874cefd9a0f778022b7e25"><div class="ttname"><a href="structarmnn_1_1_depthwise_convolution2d_descriptor.xhtml#aea202e14d8874cefd9a0f778022b7e25">armnn::DepthwiseConvolution2dDescriptor::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#l00506">Descriptors.hpp:506</a></div></div>
<div class="ttc" id="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl_xhtml_a5f5e6255b21fdf458d3733bbdcdc4af5"><div class="ttname"><a href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a5f5e6255b21fdf458d3733bbdcdc4af5">armnnTfParser::ITfParser::TfParserImpl::TrackBindingPoint</a></div><div class="ttdeci">static void TrackBindingPoint(armnn::IConnectableLayer *layer, armnn::LayerBindingId id, const armnn::TensorInfo &amp;tensorInfo, const char *bindingPointDesc, std::unordered_map&lt; std::string, BindingPointInfo &gt; &amp;nameToBindingInfo)</div><div class="ttdef"><b>Definition:</b> <a href="_tf_parser_8cpp_source.xhtml#l03718">TfParser.cpp:3718</a></div></div>
<div class="ttc" id="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl_xhtml_a44a628660248f91dad0ba4f625014bcc"><div class="ttname"><a href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a44a628660248f91dad0ba4f625014bcc">armnnTfParser::ITfParser::TfParserImpl::ParseTanh</a></div><div class="ttdeci">ParsedTfOperationPtr ParseTanh(const tensorflow::NodeDef &amp;nodeDef, const tensorflow::GraphDef &amp;graphDef)</div><div class="ttdef"><b>Definition:</b> <a href="_tf_parser_8cpp_source.xhtml#l02971">TfParser.cpp:2971</a></div></div>
<div class="ttc" id="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl_xhtml_acbdfb887feb642038726a828bd748ff3"><div class="ttname"><a href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#acbdfb887feb642038726a828bd748ff3">armnnTfParser::ITfParser::TfParserImpl::ResolveIdentityNode</a></div><div class="ttdeci">const tensorflow::NodeDef * ResolveIdentityNode(const tensorflow::NodeDef *nodeDef)</div><div class="ttdoc">Handling identity layers as the input for Conv2D layer. </div><div class="ttdef"><b>Definition:</b> <a href="_tf_parser_8cpp_source.xhtml#l00546">TfParser.cpp:546</a></div></div>
<div class="ttc" id="namespacearmnn_xhtml_ad1d5cce2d9e9a5d61c243e5c989112e0"><div class="ttname"><a href="namespacearmnn.xhtml#ad1d5cce2d9e9a5d61c243e5c989112e0">armnn::DataLayout</a></div><div class="ttdeci">DataLayout</div><div class="ttdef"><b>Definition:</b> <a href="_types_8hpp_source.xhtml#l00050">Types.hpp:50</a></div></div>
<div class="ttc" id="classarmnn_utils_1_1_data_layout_indexed_xhtml_a414e6f95548e6f7a01d5028b55ad3941"><div class="ttname"><a href="classarmnn_utils_1_1_data_layout_indexed.xhtml#a414e6f95548e6f7a01d5028b55ad3941">armnnUtils::DataLayoutIndexed::GetWidthIndex</a></div><div class="ttdeci">unsigned int GetWidthIndex() const</div><div class="ttdef"><b>Definition:</b> <a href="_data_layout_indexed_8hpp_source.xhtml#l00025">DataLayoutIndexed.hpp:25</a></div></div>
<div class="ttc" id="structarmnn_1_1_normalization_descriptor_xhtml_a8526ea7cf860d8e7f8340e9f9354f9f0"><div class="ttname"><a href="structarmnn_1_1_normalization_descriptor.xhtml#a8526ea7cf860d8e7f8340e9f9354f9f0">armnn::NormalizationDescriptor::m_K</a></div><div class="ttdeci">float m_K</div><div class="ttdoc">Kappa value used for the across channel normalization equation. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l00601">Descriptors.hpp:601</a></div></div>
<div class="ttc" id="namespacearmnn_tf_parser_xhtml_ad85fe4a9bf2aff90c53bc2f50c8931e6"><div class="ttname"><a href="namespacearmnn_tf_parser.xhtml#ad85fe4a9bf2aff90c53bc2f50c8931e6">armnnTfParser::OutputOfParsedTfOperation</a></div><div class="ttdeci">WithOutputTensorIndex&lt; ParsedTfOperation * &gt; OutputOfParsedTfOperation</div><div class="ttdef"><b>Definition:</b> <a href="_tf_parser_8hpp_source.xhtml#l00060">TfParser.hpp:60</a></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_depthwise_convolution2d_descriptor_xhtml_aa9e49717ebdb741e8c767741647fc618"><div class="ttname"><a href="structarmnn_1_1_depthwise_convolution2d_descriptor.xhtml#aa9e49717ebdb741e8c767741647fc618">armnn::DepthwiseConvolution2dDescriptor::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#l00496">Descriptors.hpp:496</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="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl_xhtml_a2a1112c66d08e3760ecccf39c7854a90"><div class="ttname"><a href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a2a1112c66d08e3760ecccf39c7854a90">armnnTfParser::ITfParser::TfParserImpl::TrackInputBinding</a></div><div class="ttdeci">void TrackInputBinding(armnn::IConnectableLayer *layer, armnn::LayerBindingId id, const armnn::TensorInfo &amp;tensorInfo)</div><div class="ttdef"><b>Definition:</b> <a href="_tf_parser_8cpp_source.xhtml#l03704">TfParser.cpp:3704</a></div></div>
<div class="ttc" id="namespacearmnn_tf_parser_xhtml_a9084adbf804022c874039ad40d1939e9"><div class="ttname"><a href="namespacearmnn_tf_parser.xhtml#a9084adbf804022c874039ad40d1939e9">armnnTfParser::BindingPointInfo</a></div><div class="ttdeci">armnn::BindingPointInfo BindingPointInfo</div><div class="ttdef"><b>Definition:</b> <a href="_i_tf_parser_8hpp_source.xhtml#l00019">ITfParser.hpp:19</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_strided_slice_descriptor_xhtml_a6d0384878432cfc9652b7ae8bc59506f"><div class="ttname"><a href="structarmnn_1_1_strided_slice_descriptor.xhtml#a6d0384878432cfc9652b7ae8bc59506f">armnn::StridedSliceDescriptor::m_ShrinkAxisMask</a></div><div class="ttdeci">int32_t m_ShrinkAxisMask</div><div class="ttdoc">Shrink axis mask value. If set, the nth specification shrinks the dimensionality by 1...</div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l01128">Descriptors.hpp:1128</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_tf_parser_1_1_i_tf_parser_xhtml_a793e71d331e03f1811f43fc59d501e1e"><div class="ttname"><a href="classarmnn_tf_parser_1_1_i_tf_parser.xhtml#a793e71d331e03f1811f43fc59d501e1e">armnnTfParser::ITfParser::ParsedIdentityTfOperation</a></div><div class="ttdeci">friend class ParsedIdentityTfOperation</div><div class="ttdef"><b>Definition:</b> <a href="_i_tf_parser_8hpp_source.xhtml#l00064">ITfParser.hpp:64</a></div></div>
<div class="ttc" id="namespacearmnn_tf_parser_xhtml_abcf8e5fd95ba7e7bd8cd36fc24974223"><div class="ttname"><a href="namespacearmnn_tf_parser.xhtml#abcf8e5fd95ba7e7bd8cd36fc24974223">armnnTfParser::OutputId</a></div><div class="ttdeci">WithOutputTensorIndex&lt; std::string &gt; OutputId</div><div class="ttdef"><b>Definition:</b> <a href="_tf_parser_8hpp_source.xhtml#l00062">TfParser.hpp:62</a></div></div>
<div class="ttc" id="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl_xhtml_a7fe3fd8cda30d697f99359a6e295677b"><div class="ttname"><a href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a7fe3fd8cda30d697f99359a6e295677b">armnnTfParser::ITfParser::TfParserImpl::ParseStack</a></div><div class="ttdeci">ParsedTfOperationPtr ParseStack(const tensorflow::NodeDef &amp;nodeDef, const tensorflow::GraphDef &amp;graphDef)</div><div class="ttdef"><b>Definition:</b> <a href="_tf_parser_8cpp_source.xhtml#l02015">TfParser.cpp:2015</a></div></div>
<div class="ttc" id="structarmnn_1_1_strided_slice_descriptor_xhtml_a118fe06b7c2599da60398ee311ede923"><div class="ttname"><a href="structarmnn_1_1_strided_slice_descriptor.xhtml#a118fe06b7c2599da60398ee311ede923">armnn::StridedSliceDescriptor::m_Begin</a></div><div class="ttdeci">std::vector&lt; int &gt; m_Begin</div><div class="ttdoc">Begin values for the input that will be sliced. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l01115">Descriptors.hpp:1115</a></div></div>
<div class="ttc" id="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl_xhtml_a31983c2de0331de6b32bf08c0d04cb0c"><div class="ttname"><a href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a31983c2de0331de6b32bf08c0d04cb0c">armnnTfParser::ITfParser::TfParserImpl::ParsePooling2d</a></div><div class="ttdeci">ParsedTfOperationPtr ParsePooling2d(const tensorflow::NodeDef &amp;nodeDef, const tensorflow::GraphDef &amp;graphDef, armnn::PoolingAlgorithm pooltype)</div><div class="ttdef"><b>Definition:</b> <a href="_tf_parser_8cpp_source.xhtml#l03009">TfParser.cpp:3009</a></div></div>
<div class="ttc" id="structarmnn_1_1_depthwise_convolution2d_descriptor_xhtml_a6089e1ca91914015777ea780a513131a"><div class="ttname"><a href="structarmnn_1_1_depthwise_convolution2d_descriptor.xhtml#a6089e1ca91914015777ea780a513131a">armnn::DepthwiseConvolution2dDescriptor::m_DataLayout</a></div><div class="ttdeci">DataLayout m_DataLayout</div><div class="ttdoc">The data layout to be used (NCHW, NHWC). </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l00508">Descriptors.hpp:508</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_strided_slice_descriptor_xhtml_a6089e1ca91914015777ea780a513131a"><div class="ttname"><a href="structarmnn_1_1_strided_slice_descriptor.xhtml#a6089e1ca91914015777ea780a513131a">armnn::StridedSliceDescriptor::m_DataLayout</a></div><div class="ttdeci">DataLayout m_DataLayout</div><div class="ttdoc">The data layout to be used (NCHW, NHWC). </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l01136">Descriptors.hpp:1136</a></div></div>
<div class="ttc" id="structarmnn_1_1_comparison_descriptor_xhtml"><div class="ttname"><a href="structarmnn_1_1_comparison_descriptor.xhtml">armnn::ComparisonDescriptor</a></div><div class="ttdoc">A ComparisonDescriptor for the ComparisonLayer. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l00078">Descriptors.hpp:78</a></div></div>
<div class="ttc" id="structarmnn_1_1_stack_descriptor_xhtml_a2bea87b470268bb0b73457c3733dbc04"><div class="ttname"><a href="structarmnn_1_1_stack_descriptor.xhtml#a2bea87b470268bb0b73457c3733dbc04">armnn::StackDescriptor::m_InputShape</a></div><div class="ttdeci">TensorShape m_InputShape</div><div class="ttdoc">Required shape of all input tensors. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l01050">Descriptors.hpp:1050</a></div></div>
<div class="ttc" id="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl_xhtml_a8b053a6c449d0814cc831c916c126668"><div class="ttname"><a href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a8b053a6c449d0814cc831c916c126668">armnnTfParser::ITfParser::TfParserImpl::GetNetworkInputBindingInfo</a></div><div class="ttdeci">BindingPointInfo GetNetworkInputBindingInfo(const std::string &amp;name) const</div><div class="ttdoc">Retrieves 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="_tf_parser_8cpp_source.xhtml#l03678">TfParser.cpp:3678</a></div></div>
<div class="ttc" id="structarmnn_tf_parser_1_1_with_output_tensor_index_xhtml_a271b1a398c11fb4bf8603119041562c9"><div class="ttname"><a href="structarmnn_tf_parser_1_1_with_output_tensor_index.xhtml#a271b1a398c11fb4bf8603119041562c9">armnnTfParser::WithOutputTensorIndex::m_Index</a></div><div class="ttdeci">unsigned int m_Index</div><div class="ttdef"><b>Definition:</b> <a href="_tf_parser_8hpp_source.xhtml#l00049">TfParser.hpp:49</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_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl_xhtml_a5f4ea9601ffef3d1549614e959d967d4"><div class="ttname"><a href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a5f4ea9601ffef3d1549614e959d967d4">armnnTfParser::ITfParser::TfParserImpl::ParseMul</a></div><div class="ttdeci">ParsedTfOperationPtr ParseMul(const tensorflow::NodeDef &amp;nodeDef, const tensorflow::GraphDef &amp;graphDef)</div><div class="ttdef"><b>Definition:</b> <a href="_tf_parser_8cpp_source.xhtml#l02710">TfParser.cpp:2710</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="namespacearmnn_xhtml_ad8ed01ff3ff33333d8e19db4d2818bb6accedffbc6e5308e33d3843e8bdc0dad7"><div class="ttname"><a href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6accedffbc6e5308e33d3843e8bdc0dad7">armnn::DataType::Signed32</a></div></div>
<div class="ttc" id="structarmnn_1_1_normalization_descriptor_xhtml_a174279be57d7596eeb04c6b7f7510f99"><div class="ttname"><a href="structarmnn_1_1_normalization_descriptor.xhtml#a174279be57d7596eeb04c6b7f7510f99">armnn::NormalizationDescriptor::m_Alpha</a></div><div class="ttdeci">float m_Alpha</div><div class="ttdoc">Alpha value for the normalization equation. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l00597">Descriptors.hpp:597</a></div></div>
<div class="ttc" id="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl_xhtml_a2c166c3e83ea49c47b06e754988183e8"><div class="ttname"><a href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a2c166c3e83ea49c47b06e754988183e8">armnnTfParser::ITfParser::TfParserImpl::AddMultiplicationLayer</a></div><div class="ttdeci">armnn::IConnectableLayer * AddMultiplicationLayer(const tensorflow::NodeDef &amp;nodeDef)</div><div class="ttdef"><b>Definition:</b> <a href="_tf_parser_8cpp_source.xhtml#l03279">TfParser.cpp:3279</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="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl_xhtml_a38b8abe6086a61e8831391b8717453cf"><div class="ttname"><a href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a38b8abe6086a61e8831391b8717453cf">armnnTfParser::ITfParser::TfParserImpl::ParseTranspose</a></div><div class="ttdeci">ParsedTfOperationPtr ParseTranspose(const tensorflow::NodeDef &amp;nodeDef, const tensorflow::GraphDef &amp;graphDef)</div><div class="ttdef"><b>Definition:</b> <a href="_tf_parser_8cpp_source.xhtml#l02101">TfParser.cpp:2101</a></div></div>
<div class="ttc" id="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl_xhtml_a51591500d0839a1f602d8cd20bb9d3ce"><div class="ttname"><a href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a51591500d0839a1f602d8cd20bb9d3ce">armnnTfParser::ITfParser::TfParserImpl::LoadGraphDef</a></div><div class="ttdeci">void LoadGraphDef(const tensorflow::GraphDef &amp;graphDef)</div><div class="ttdoc">Sets up variables and then performs BFS to parse all nodes. </div><div class="ttdef"><b>Definition:</b> <a href="_tf_parser_8cpp_source.xhtml#l03486">TfParser.cpp:3486</a></div></div>
<div class="ttc" id="namespacearmnn_utils_xhtml_aac34adc5b96d744ae53eac580213f855"><div class="ttname"><a href="namespacearmnn_utils.xhtml#aac34adc5b96d744ae53eac580213f855">armnnUtils::CalculateReducedOutputTensoInfo</a></div><div class="ttdeci">void CalculateReducedOutputTensoInfo(const armnn::TensorInfo &amp;inputTensorInfo, const std::set&lt; unsigned int &gt; &amp;axisSet, bool keepDims, armnn::TensorInfo &amp;outputTensorInfo)</div><div class="ttdoc">Creates a tensor info after reducing the dimensions mentioned in axisData. </div><div class="ttdef"><b>Definition:</b> <a href="_parser_helper_8cpp_source.xhtml#l00052">ParserHelper.cpp:52</a></div></div>
<div class="ttc" id="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl_xhtml_a64bdfd07d439803d0ec4c8b9b5c3e442"><div class="ttname"><a href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a64bdfd07d439803d0ec4c8b9b5c3e442">armnnTfParser::ITfParser::TfParserImpl::AddFullyConnectedLayer</a></div><div class="ttdeci">armnn::IConnectableLayer * AddFullyConnectedLayer(const tensorflow::NodeDef &amp;matMulNodeDef, const tensorflow::NodeDef *addNodeDef, const char *armnnLayerName)</div><div class="ttdef"><b>Definition:</b> <a href="_tf_parser_8cpp_source.xhtml#l03315">TfParser.cpp:3315</a></div></div>
<div class="ttc" id="classarmnn_1_1_base_tensor_xhtml_a8b5d0f8a24e9d9238f412260a552acf8"><div class="ttname"><a href="classarmnn_1_1_base_tensor.xhtml#a8b5d0f8a24e9d9238f412260a552acf8">armnn::BaseTensor::GetShape</a></div><div class="ttdeci">const TensorShape &amp; GetShape() const</div><div class="ttdef"><b>Definition:</b> <a href="_tensor_8hpp_source.xhtml#l00284">Tensor.hpp:284</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_resize_descriptor_xhtml_a869254cb56968986a78a79e1d6d4a86b"><div class="ttname"><a href="structarmnn_1_1_resize_descriptor.xhtml#a869254cb56968986a78a79e1d6d4a86b">armnn::ResizeDescriptor::m_Method</a></div><div class="ttdeci">ResizeMethod m_Method</div><div class="ttdoc">The Interpolation method to use (Bilinear, NearestNeighbor). </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l00821">Descriptors.hpp:821</a></div></div>
<div class="ttc" id="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl_xhtml_a7278a1a8d099cde1417ca4f7e3c2ef9c"><div class="ttname"><a href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a7278a1a8d099cde1417ca4f7e3c2ef9c">armnnTfParser::ITfParser::TfParserImpl::ParseReshape</a></div><div class="ttdeci">ParsedTfOperationPtr ParseReshape(const tensorflow::NodeDef &amp;nodeDef, const tensorflow::GraphDef &amp;graphDef)</div><div class="ttdef"><b>Definition:</b> <a href="_tf_parser_8cpp_source.xhtml#l02389">TfParser.cpp:2389</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="structarmnn_1_1_batch_normalization_descriptor_xhtml_a6089e1ca91914015777ea780a513131a"><div class="ttname"><a href="structarmnn_1_1_batch_normalization_descriptor.xhtml#a6089e1ca91914015777ea780a513131a">armnn::BatchNormalizationDescriptor::m_DataLayout</a></div><div class="ttdeci">DataLayout m_DataLayout</div><div class="ttdoc">The data layout to be used (NCHW, NHWC). </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l00641">Descriptors.hpp:641</a></div></div>
<div class="ttc" id="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl_xhtml"><div class="ttname"><a href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml">armnnTfParser::ITfParser::TfParserImpl</a></div><div class="ttdef"><b>Definition:</b> <a href="_tf_parser_8hpp_source.xhtml#l00064">TfParser.hpp:64</a></div></div>
<div class="ttc" id="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl_xhtml_a838bec330f4c2495c3e86088502e35e8"><div class="ttname"><a href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a838bec330f4c2495c3e86088502e35e8">armnnTfParser::ITfParser::TfParserImpl::ParseFusedBatchNorm</a></div><div class="ttdeci">ParsedTfOperationPtr ParseFusedBatchNorm(const tensorflow::NodeDef &amp;nodeDef, const tensorflow::GraphDef &amp;graphDef)</div><div class="ttdef"><b>Definition:</b> <a href="_tf_parser_8cpp_source.xhtml#l01618">TfParser.cpp:1618</a></div></div>
<div class="ttc" id="namespacearmnn_tf_parser_xhtml_ae5488f1478c62281c5e937e79ebcd145"><div class="ttname"><a href="namespacearmnn_tf_parser.xhtml#ae5488f1478c62281c5e937e79ebcd145">armnnTfParser::CheckPaddingTensor</a></div><div class="ttdeci">unsigned int CheckPaddingTensor(const ConstTensor &amp;paddingTensor, const TensorInfo &amp;inputTensorInfo, const std::string &amp;nodeName)</div><div class="ttdef"><b>Definition:</b> <a href="_tf_parser_8cpp_source.xhtml#l02147">TfParser.cpp:2147</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_tf_parser_1_1_i_tf_parser_xhtml_a81cd010ead68e4d96e6cb28255143f49"><div class="ttname"><a href="classarmnn_tf_parser_1_1_i_tf_parser.xhtml#a81cd010ead68e4d96e6cb28255143f49">armnnTfParser::ITfParser::ParsedTfOperation</a></div><div class="ttdeci">friend class ParsedTfOperation</div><div class="ttdef"><b>Definition:</b> <a href="_i_tf_parser_8hpp_source.xhtml#l00061">ITfParser.hpp:61</a></div></div>
<div class="ttc" id="classarmnn_1_1_i_network_xhtml"><div class="ttname"><a href="classarmnn_1_1_i_network.xhtml">armnn::INetwork</a></div><div class="ttdoc">Main network class which provides the interface for building up a neural network. ...</div><div class="ttdef"><b>Definition:</b> <a href="_i_network_8hpp_source.xhtml#l00178">INetwork.hpp:178</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="structarmnn_1_1_normalization_descriptor_xhtml_a6089e1ca91914015777ea780a513131a"><div class="ttname"><a href="structarmnn_1_1_normalization_descriptor.xhtml#a6089e1ca91914015777ea780a513131a">armnn::NormalizationDescriptor::m_DataLayout</a></div><div class="ttdeci">DataLayout m_DataLayout</div><div class="ttdoc">The data layout to be used (NCHW, NHWC). </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l00603">Descriptors.hpp:603</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="namespacearmnn_xhtml_a44affeeb090c3c6a3062830562672e84"><div class="ttname"><a href="namespacearmnn.xhtml#a44affeeb090c3c6a3062830562672e84">armnn::IgnoreUnused</a></div><div class="ttdeci">void IgnoreUnused(Ts &amp;&amp;...)</div><div class="ttdef"><b>Definition:</b> <a href="_ignore_unused_8hpp_source.xhtml#l00014">IgnoreUnused.hpp:14</a></div></div>
<div class="ttc" id="namespacearmnn_tf_parser_xhtml"><div class="ttname"><a href="namespacearmnn_tf_parser.xhtml">armnnTfParser</a></div><div class="ttdef"><b>Definition:</b> <a href="_i_tf_parser_8hpp_source.xhtml#l00016">ITfParser.hpp:16</a></div></div>
<div class="ttc" id="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl_xhtml_a2db3ae8d422f17d455e0ba0cb6291d2a"><div class="ttname"><a href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a2db3ae8d422f17d455e0ba0cb6291d2a">armnnTfParser::ITfParser::TfParserImpl::m_Network</a></div><div class="ttdeci">armnn::INetworkPtr m_Network</div><div class="ttdoc">The network we&amp;#39;re building. Gets cleared after it is passed to the user. </div><div class="ttdef"><b>Definition:</b> <a href="_tf_parser_8hpp_source.xhtml#l00251">TfParser.hpp:251</a></div></div>
<div class="ttc" id="structarmnn_1_1_strided_slice_descriptor_xhtml_a61081be1483984e33db452c75d569f51"><div class="ttname"><a href="structarmnn_1_1_strided_slice_descriptor.xhtml#a61081be1483984e33db452c75d569f51">armnn::StridedSliceDescriptor::m_BeginMask</a></div><div class="ttdeci">int32_t m_BeginMask</div><div class="ttdoc">Begin mask value. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l01123">Descriptors.hpp:1123</a></div></div>
<div class="ttc" id="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl_xhtml_a8dd5c5f271f0f5bd68612e7927d94e58"><div class="ttname"><a href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a8dd5c5f271f0f5bd68612e7927d94e58">armnnTfParser::ITfParser::TfParserImpl::m_ParsedTfOperations</a></div><div class="ttdeci">std::unordered_map&lt; std::string, ParsedTfOperationPtr &gt; m_ParsedTfOperations</div><div class="ttdef"><b>Definition:</b> <a href="_tf_parser_8hpp_source.xhtml#l00267">TfParser.hpp:267</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="structarmnn_1_1_strided_slice_descriptor_xhtml_ac37e49c0d6e6e54f9d2015d0f11f8ee7"><div class="ttname"><a href="structarmnn_1_1_strided_slice_descriptor.xhtml#ac37e49c0d6e6e54f9d2015d0f11f8ee7">armnn::StridedSliceDescriptor::m_EndMask</a></div><div class="ttdeci">int32_t m_EndMask</div><div class="ttdoc">End mask value. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l01126">Descriptors.hpp:1126</a></div></div>
<div class="ttc" id="namespacearmnn_xhtml_a961bbfe1db71a848eff5a1f0ab775718"><div class="ttname"><a href="namespacearmnn.xhtml#a961bbfe1db71a848eff5a1f0ab775718">armnn::PoolingAlgorithm</a></div><div class="ttdeci">PoolingAlgorithm</div><div class="ttdef"><b>Definition:</b> <a href="_types_8hpp_source.xhtml#l00104">Types.hpp:104</a></div></div>
<div class="ttc" id="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl_xhtml_a86cb41745deebd9b0ccf157d97d4d9ca"><div class="ttname"><a href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a86cb41745deebd9b0ccf157d97d4d9ca">armnnTfParser::ITfParser::TfParserImpl::m_RequestedOutputs</a></div><div class="ttdeci">std::vector&lt; std::string &gt; m_RequestedOutputs</div><div class="ttdef"><b>Definition:</b> <a href="_tf_parser_8hpp_source.xhtml#l00262">TfParser.hpp:262</a></div></div>
<div class="ttc" id="namespacearmnn_utils_xhtml_a12124184ac6aec018beb98b9715330c7"><div class="ttname"><a href="namespacearmnn_utils.xhtml#a12124184ac6aec018beb98b9715330c7">armnnUtils::NHWCToArmNN</a></div><div class="ttdeci">const armnn::PermutationVector NHWCToArmNN</div><div class="ttdef"><b>Definition:</b> <a href="_parser_helper_8cpp_source.xhtml#l00016">ParserHelper.cpp:16</a></div></div>
<div class="ttc" id="classarmnn_1_1_layer_xhtml_a1594bddc87d6477df300317658f566bb"><div class="ttname"><a href="classarmnn_1_1_layer.xhtml#a1594bddc87d6477df300317658f566bb">armnn::Layer::GetNumOutputSlots</a></div><div class="ttdeci">unsigned int GetNumOutputSlots() const override</div><div class="ttdoc">Returns the number of connectable output slots. </div><div class="ttdef"><b>Definition:</b> <a href="_layer_8hpp_source.xhtml#l00314">Layer.hpp:314</a></div></div>
<div class="ttc" id="structarmnn_1_1_depthwise_convolution2d_descriptor_xhtml_a302b688d88dd73cde0fb1faef6679907"><div class="ttname"><a href="structarmnn_1_1_depthwise_convolution2d_descriptor.xhtml#a302b688d88dd73cde0fb1faef6679907">armnn::DepthwiseConvolution2dDescriptor::m_DilationY</a></div><div class="ttdeci">uint32_t m_DilationY</div><div class="ttdoc">Dilation factor value for height dimension. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l00504">Descriptors.hpp:504</a></div></div>
<div class="ttc" id="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl_xhtml_afd47848ab22a0d11cb330f25d7ba3235"><div class="ttname"><a href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#afd47848ab22a0d11cb330f25d7ba3235">armnnTfParser::ITfParser::TfParserImpl::ParseIdentity</a></div><div class="ttdeci">ParsedTfOperationPtr ParseIdentity(const tensorflow::NodeDef &amp;nodeDef, const tensorflow::GraphDef &amp;graphDef)</div><div class="ttdef"><b>Definition:</b> <a href="_tf_parser_8cpp_source.xhtml#l00891">TfParser.cpp:891</a></div></div>
<div class="ttc" id="_tf_parser_8hpp_xhtml"><div class="ttname"><a href="_tf_parser_8hpp.xhtml">TfParser.hpp</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="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl_xhtml_aee1bc04a8977a1a8755243ed9e54f8e2"><div class="ttname"><a href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#aee1bc04a8977a1a8755243ed9e54f8e2">armnnTfParser::ITfParser::TfParserImpl::CreateAdditionLayer</a></div><div class="ttdeci">armnn::IConnectableLayer * CreateAdditionLayer(const tensorflow::NodeDef &amp;nodeDef, armnn::IOutputSlot *input0Slot, armnn::IOutputSlot *input1Slot, const std::string &amp;layerName)</div><div class="ttdef"><b>Definition:</b> <a href="_tf_parser_8cpp_source.xhtml#l00650">TfParser.cpp:650</a></div></div>
<div class="ttc" id="namespacearmnn_xhtml_ab8cf8f9fb6792e654c2d8d8382f6f01b"><div class="ttname"><a href="namespacearmnn.xhtml#ab8cf8f9fb6792e654c2d8d8382f6f01b">armnn::LayerBindingId</a></div><div class="ttdeci">int LayerBindingId</div><div class="ttdoc">Type of identifiers for bindable layers (inputs, outputs). </div><div class="ttdef"><b>Definition:</b> <a href="_types_8hpp_source.xhtml#l00210">Types.hpp:210</a></div></div>
<div class="ttc" id="classarmnn_utils_1_1_data_layout_indexed_xhtml_a61c00316c443adc233c24e85c6c5b740"><div class="ttname"><a href="classarmnn_utils_1_1_data_layout_indexed.xhtml#a61c00316c443adc233c24e85c6c5b740">armnnUtils::DataLayoutIndexed::GetHeightIndex</a></div><div class="ttdeci">unsigned int GetHeightIndex() const</div><div class="ttdef"><b>Definition:</b> <a href="_data_layout_indexed_8hpp_source.xhtml#l00024">DataLayoutIndexed.hpp:24</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="_numeric_cast_8hpp_xhtml"><div class="ttname"><a href="_numeric_cast_8hpp.xhtml">NumericCast.hpp</a></div></div>
<div class="ttc" id="structarmnn_1_1_normalization_descriptor_xhtml_a05945f080edf694b631960728b87aadb"><div class="ttname"><a href="structarmnn_1_1_normalization_descriptor.xhtml#a05945f080edf694b631960728b87aadb">armnn::NormalizationDescriptor::m_NormMethodType</a></div><div class="ttdeci">NormalizationAlgorithmMethod m_NormMethodType</div><div class="ttdoc">Normalization method algorithm to use (LocalBrightness, LocalContrast). </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l00593">Descriptors.hpp:593</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_resize_descriptor_xhtml"><div class="ttname"><a href="structarmnn_1_1_resize_descriptor.xhtml">armnn::ResizeDescriptor</a></div><div class="ttdoc">A ResizeDescriptor for the ResizeLayer. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l00794">Descriptors.hpp:794</a></div></div>
<div class="ttc" id="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl_xhtml_ac62e2558c14e01605f2b4e1e21cdd1e8"><div class="ttname"><a href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#ac62e2558c14e01605f2b4e1e21cdd1e8">armnnTfParser::ITfParser::TfParserImpl::m_NetworkInputsBindingInfo</a></div><div class="ttdeci">std::unordered_map&lt; std::string, BindingPointInfo &gt; m_NetworkInputsBindingInfo</div><div class="ttdoc">Maps input layer names to their corresponding ids and tensor info. </div><div class="ttdef"><b>Definition:</b> <a href="_tf_parser_8hpp_source.xhtml#l00270">TfParser.hpp:270</a></div></div>
<div class="ttc" id="structarmnn_1_1_mean_descriptor_xhtml_a1f0d67b087c491248bd1cde3ff995a95"><div class="ttname"><a href="structarmnn_1_1_mean_descriptor.xhtml#a1f0d67b087c491248bd1cde3ff995a95">armnn::MeanDescriptor::m_Axis</a></div><div class="ttdeci">std::vector&lt; unsigned int &gt; m_Axis</div><div class="ttdoc">Values for the dimensions to reduce. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l00969">Descriptors.hpp:969</a></div></div>
<div class="ttc" id="structarmnn_1_1_stack_descriptor_xhtml"><div class="ttname"><a href="structarmnn_1_1_stack_descriptor.xhtml">armnn::StackDescriptor</a></div><div class="ttdoc">A StackDescriptor for the StackLayer. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l01024">Descriptors.hpp:1024</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_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl_xhtml_a931e43b8100b02a3c1f2f5f30ba9a943"><div class="ttname"><a href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a931e43b8100b02a3c1f2f5f30ba9a943">armnnTfParser::ITfParser::TfParserImpl::CreateNetworkFromGraphDef</a></div><div class="ttdeci">armnn::INetworkPtr CreateNetworkFromGraphDef(const tensorflow::GraphDef &amp;graphDef, const std::map&lt; std::string, armnn::TensorShape &gt; &amp;inputShapes, const std::vector&lt; std::string &gt; &amp;requestedOutputs)</div><div class="ttdoc">Parses a GraphDef loaded into memory from one of the other CreateNetwork*. </div><div class="ttdef"><b>Definition:</b> <a href="_tf_parser_8cpp_source.xhtml#l03639">TfParser.cpp:3639</a></div></div>
<div class="ttc" id="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl_xhtml_a3296cce0af78204d897a746643987f07"><div class="ttname"><a href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a3296cce0af78204d897a746643987f07">armnnTfParser::ITfParser::TfParserImpl::IsSupportedLeakyReluPattern</a></div><div class="ttdeci">bool IsSupportedLeakyReluPattern(const tensorflow::NodeDef &amp;mulNodeDef, size_t alphaLayerIndex, const OutputOfParsedTfOperation &amp;otherOp, armnn::IOutputSlot **outputOfLeakyRelu, armnn::ActivationDescriptor &amp;desc)</div><div class="ttdef"><b>Definition:</b> <a href="_tf_parser_8cpp_source.xhtml#l01709">TfParser.cpp:1709</a></div></div>
<div class="ttc" id="_polymorphic_downcast_8hpp_xhtml"><div class="ttname"><a href="_polymorphic_downcast_8hpp.xhtml">PolymorphicDowncast.hpp</a></div></div>
<div class="ttc" id="namespacearmnn_tf_parser_xhtml_aa36bf288c19fe35767bb6e059636f405"><div class="ttname"><a href="namespacearmnn_tf_parser.xhtml#aa36bf288c19fe35767bb6e059636f405">armnnTfParser::ParsedTfOperationPtr</a></div><div class="ttdeci">std::unique_ptr&lt; ParsedTfOperation &gt; ParsedTfOperationPtr</div><div class="ttdef"><b>Definition:</b> <a href="_tf_parser_8hpp_source.xhtml#l00035">TfParser.hpp:35</a></div></div>
<div class="ttc" id="namespacearmnn_tf_parser_xhtml_a9be4b3b32d110ca8d27936f6f7df1408"><div class="ttname"><a href="namespacearmnn_tf_parser.xhtml#a9be4b3b32d110ca8d27936f6f7df1408">armnnTfParser::OutputShapeOfExpandDims</a></div><div class="ttdeci">TensorInfo OutputShapeOfExpandDims(const tensorflow::NodeDef &amp;nodeDef, TensorInfo inputTensorInfo, std::int32_t expandDim)</div><div class="ttdef"><b>Definition:</b> <a href="_tf_parser_8cpp_source.xhtml#l01466">TfParser.cpp:1466</a></div></div>
<div class="ttc" id="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl_xhtml_af71fa342538ad7280ff4f9b132bdb71a"><div class="ttname"><a href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#af71fa342538ad7280ff4f9b132bdb71a">armnnTfParser::ITfParser::TfParserImpl::ParseMatMul</a></div><div class="ttdeci">ParsedTfOperationPtr ParseMatMul(const tensorflow::NodeDef &amp;nodeDef, const tensorflow::GraphDef &amp;graphDef)</div><div class="ttdef"><b>Definition:</b> <a href="_tf_parser_8cpp_source.xhtml#l02625">TfParser.cpp:2625</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_pad_descriptor_xhtml"><div class="ttname"><a href="structarmnn_1_1_pad_descriptor.xhtml">armnn::PadDescriptor</a></div><div class="ttdoc">A PadDescriptor for the PadLayer. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l00975">Descriptors.hpp:975</a></div></div>
<div class="ttc" id="namespacearmnn_utils_xhtml_af3c74017185773dd61d8ca6662d65d43"><div class="ttname"><a href="namespacearmnn_utils.xhtml#af3c74017185773dd61d8ca6662d65d43">armnnUtils::Permute</a></div><div class="ttdeci">void Permute(const armnn::TensorShape &amp;dstShape, const armnn::PermutationVector &amp;mappings, const void *src, void *dst, size_t dataTypeSize)</div><div class="ttdef"><b>Definition:</b> <a href="_permute_8cpp_source.xhtml#l00131">Permute.cpp:131</a></div></div>
<div class="ttc" id="structarmnn_1_1_origins_descriptor_xhtml_ab78e6fe963508c1ac5c00d04bb3361a3"><div class="ttname"><a href="structarmnn_1_1_origins_descriptor.xhtml#ab78e6fe963508c1ac5c00d04bb3361a3">armnn::OriginsDescriptor::GetViewOrigin</a></div><div class="ttdeci">const uint32_t * GetViewOrigin(uint32_t idx) const</div><div class="ttdoc">Return the view origin at the int value idx. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8cpp_source.xhtml#l00197">Descriptors.cpp:197</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="_types_utils_8hpp_xhtml"><div class="ttname"><a href="_types_utils_8hpp.xhtml">TypesUtils.hpp</a></div></div>
<div class="ttc" id="namespacearmnn_tf_parser_xhtml_a4c8735480b01dbd0f75c63377fe054e9"><div class="ttname"><a href="namespacearmnn_tf_parser.xhtml#a4c8735480b01dbd0f75c63377fe054e9">armnnTfParser::OutputOfConstNodeDef</a></div><div class="ttdeci">WithOutputTensorIndex&lt; const tensorflow::NodeDef * &gt; OutputOfConstNodeDef</div><div class="ttdef"><b>Definition:</b> <a href="_tf_parser_8hpp_source.xhtml#l00061">TfParser.hpp:61</a></div></div>
<div class="ttc" id="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl_xhtml_a16ffc6437ceb17b6ad370192a5100944"><div class="ttname"><a href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a16ffc6437ceb17b6ad370192a5100944">armnnTfParser::ITfParser::TfParserImpl::ParseStridedSlice</a></div><div class="ttdeci">ParsedTfOperationPtr ParseStridedSlice(const tensorflow::NodeDef &amp;nodeDef, const tensorflow::GraphDef &amp;graphDef)</div><div class="ttdef"><b>Definition:</b> <a href="_tf_parser_8cpp_source.xhtml#l02923">TfParser.cpp:2923</a></div></div>
<div class="ttc" id="structarmnn_1_1_depthwise_convolution2d_descriptor_xhtml_afe6a3377c4531315354def9023c8fdda"><div class="ttname"><a href="structarmnn_1_1_depthwise_convolution2d_descriptor.xhtml#afe6a3377c4531315354def9023c8fdda">armnn::DepthwiseConvolution2dDescriptor::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#l00498">Descriptors.hpp:498</a></div></div>
<div class="ttc" id="classarmnn_tf_parser_1_1_i_tf_parser_xhtml_ade83228b2643208ee0fb6168792e1364"><div class="ttname"><a href="classarmnn_tf_parser_1_1_i_tf_parser.xhtml#ade83228b2643208ee0fb6168792e1364">armnnTfParser::ITfParser::MakeTfOperation</a></div><div class="ttdeci">friend struct MakeTfOperation</div><div class="ttdef"><b>Definition:</b> <a href="_i_tf_parser_8hpp_source.xhtml#l00067">ITfParser.hpp:67</a></div></div>
<div class="ttc" id="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl_xhtml_a0562881f75a2083315f1a1660686812b"><div class="ttname"><a href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a0562881f75a2083315f1a1660686812b">armnnTfParser::ITfParser::TfParserImpl::ProcessElementwiseInputSlots</a></div><div class="ttdeci">std::pair&lt; armnn::IOutputSlot *, armnn::IOutputSlot * &gt; ProcessElementwiseInputSlots(const tensorflow::NodeDef &amp;nodeDef, const std::string &amp;layerName)</div><div class="ttdef"><b>Definition:</b> <a href="_tf_parser_8cpp_source.xhtml#l01807">TfParser.cpp:1807</a></div></div>
<div class="ttc" id="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl_xhtml_a2cf6fe0b66ca31d917279ae5d0be39b5"><div class="ttname"><a href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a2cf6fe0b66ca31d917279ae5d0be39b5">armnnTfParser::ITfParser::TfParserImpl::ParseLrn</a></div><div class="ttdeci">ParsedTfOperationPtr ParseLrn(const tensorflow::NodeDef &amp;nodeDef, const tensorflow::GraphDef &amp;graphDef)</div><div class="ttdef"><b>Definition:</b> <a href="_tf_parser_8cpp_source.xhtml#l02578">TfParser.cpp:2578</a></div></div>
<div class="ttc" id="_permute_8hpp_xhtml"><div class="ttname"><a href="_permute_8hpp.xhtml">Permute.hpp</a></div></div>
<div class="ttc" id="_subgraph_view_selector_8cpp_xhtml_ae7fc37b88ff10e9294ed1c72f2a25ac7"><div class="ttname"><a href="_subgraph_view_selector_8cpp.xhtml#ae7fc37b88ff10e9294ed1c72f2a25ac7">m_Layer</a></div><div class="ttdeci">Layer * m_Layer</div><div class="ttdef"><b>Definition:</b> <a href="_subgraph_view_selector_8cpp_source.xhtml#l00243">SubgraphViewSelector.cpp:243</a></div></div>
<div class="ttc" id="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl_xhtml_a87e85155fcde2f7e6e7cc0353e31867f"><div class="ttname"><a href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a87e85155fcde2f7e6e7cc0353e31867f">armnnTfParser::ITfParser::TfParserImpl::ParseDepthwiseConv2D</a></div><div class="ttdeci">ParsedTfOperationPtr ParseDepthwiseConv2D(const tensorflow::NodeDef &amp;nodeDef, const tensorflow::GraphDef &amp;graphDef)</div><div class="ttdef"><b>Definition:</b> <a href="_tf_parser_8cpp_source.xhtml#l01341">TfParser.cpp:1341</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_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl_xhtml_a68cb028cdc437c8daad2e2c9406da4f9"><div class="ttname"><a href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a68cb028cdc437c8daad2e2c9406da4f9">armnnTfParser::ITfParser::TfParserImpl::ParseRelu6</a></div><div class="ttdeci">ParsedTfOperationPtr ParseRelu6(const tensorflow::NodeDef &amp;nodeDef, const tensorflow::GraphDef &amp;graphDef)</div><div class="ttdef"><b>Definition:</b> <a href="_tf_parser_8cpp_source.xhtml#l02763">TfParser.cpp:2763</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="structarmnn_1_1_depthwise_convolution2d_descriptor_xhtml_aa3c6a77a963a98ccb8ea7b8fd008a8c1"><div class="ttname"><a href="structarmnn_1_1_depthwise_convolution2d_descriptor.xhtml#aa3c6a77a963a98ccb8ea7b8fd008a8c1">armnn::DepthwiseConvolution2dDescriptor::m_DilationX</a></div><div class="ttdeci">uint32_t m_DilationX</div><div class="ttdoc">Dilation factor value for width dimension. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l00502">Descriptors.hpp:502</a></div></div>
<div class="ttc" id="structarmnn_1_1_depthwise_convolution2d_descriptor_xhtml_a56b51f56cef50cdfa554258eecdab046"><div class="ttname"><a href="structarmnn_1_1_depthwise_convolution2d_descriptor.xhtml#a56b51f56cef50cdfa554258eecdab046">armnn::DepthwiseConvolution2dDescriptor::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#l00494">Descriptors.hpp:494</a></div></div>
<div class="ttc" id="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl_xhtml_a7e393f41f2330006fdf00f2840c6dd28"><div class="ttname"><a href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a7e393f41f2330006fdf00f2840c6dd28">armnnTfParser::ITfParser::TfParserImpl::CreateNetworkFromString</a></div><div class="ttdeci">armnn::INetworkPtr CreateNetworkFromString(const char *protoText, const std::map&lt; std::string, armnn::TensorShape &gt; &amp;inputShapes, const std::vector&lt; std::string &gt; &amp;requestedOutputs)</div><div class="ttdoc">Creates the network directly from protobuf text in a string. Useful for debugging/testing. </div><div class="ttdef"><b>Definition:</b> <a href="_tf_parser_8cpp_source.xhtml#l03587">TfParser.cpp:3587</a></div></div>
<div class="ttc" id="structarmnn_1_1_views_descriptor_xhtml_aae0893695f5803a3517985c7cb1ccb2e"><div class="ttname"><a href="structarmnn_1_1_views_descriptor.xhtml#aae0893695f5803a3517985c7cb1ccb2e">armnn::ViewsDescriptor::SetViewSize</a></div><div class="ttdeci">Status SetViewSize(uint32_t view, uint32_t coord, uint32_t value)</div><div class="ttdoc">Set the size of the views. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8cpp_source.xhtml#l00315">Descriptors.cpp:315</a></div></div>
<div class="ttc" id="structarmnn_1_1_strided_slice_descriptor_xhtml_a7c91eda2b331d607bae92cd8ebf50bb9"><div class="ttname"><a href="structarmnn_1_1_strided_slice_descriptor.xhtml#a7c91eda2b331d607bae92cd8ebf50bb9">armnn::StridedSliceDescriptor::m_NewAxisMask</a></div><div class="ttdeci">int32_t m_NewAxisMask</div><div class="ttdoc">New axis mask value. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l01133">Descriptors.hpp:1133</a></div></div>
<div class="ttc" id="structarmnn_1_1_mean_descriptor_xhtml_a28e0548abfc4e79c48f29a3d11a062e9"><div class="ttname"><a href="structarmnn_1_1_mean_descriptor.xhtml#a28e0548abfc4e79c48f29a3d11a062e9">armnn::MeanDescriptor::m_KeepDims</a></div><div class="ttdeci">bool m_KeepDims</div><div class="ttdoc">Enable/disable keep dimensions. If true, then the reduced dimensions that are of length 1 are kept...</div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l00971">Descriptors.hpp:971</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="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl_xhtml_a4b1fdcb1985af12dd1848a9ffa5d3271"><div class="ttname"><a href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a4b1fdcb1985af12dd1848a9ffa5d3271">armnnTfParser::ITfParser::TfParserImpl::GetNetworkOutputBindingInfo</a></div><div class="ttdeci">BindingPointInfo GetNetworkOutputBindingInfo(const std::string &amp;name) const</div><div class="ttdoc">Retrieves binding info (layer id and tensor info) for the network output identified by the given laye...</div><div class="ttdef"><b>Definition:</b> <a href="_tf_parser_8cpp_source.xhtml#l03683">TfParser.cpp:3683</a></div></div>
<div class="ttc" id="include_2armnn_tf_parser_2_version_8hpp_xhtml_a3a58bd808c80a293adf0863c1bae3b5c"><div class="ttname"><a href="include_2armnn_tf_parser_2_version_8hpp.xhtml#a3a58bd808c80a293adf0863c1bae3b5c">TF_PARSER_VERSION</a></div><div class="ttdeci">#define TF_PARSER_VERSION</div><div class="ttdoc">TF_PARSER_VERSION: &quot;X.Y.Z&quot; where: X = Major version number Y = Minor version number Z = Patch version...</div><div class="ttdef"><b>Definition:</b> <a href="include_2armnn_tf_parser_2_version_8hpp_source.xhtml#l00025">Version.hpp:25</a></div></div>
<div class="ttc" id="classarmnn_utils_1_1_data_layout_indexed_xhtml"><div class="ttname"><a href="classarmnn_utils_1_1_data_layout_indexed.xhtml">armnnUtils::DataLayoutIndexed</a></div><div class="ttdoc">Provides access to the appropriate indexes for Channels, Height and Width based on DataLayout...</div><div class="ttdef"><b>Definition:</b> <a href="_data_layout_indexed_8hpp_source.xhtml#l00017">DataLayoutIndexed.hpp:17</a></div></div>
<div class="ttc" id="classarmnn_1_1_tensor_info_xhtml_aea909c7327109228ef618d459015def3"><div class="ttname"><a href="classarmnn_1_1_tensor_info.xhtml#aea909c7327109228ef618d459015def3">armnn::TensorInfo::GetDataType</a></div><div class="ttdeci">DataType GetDataType() const</div><div class="ttdef"><b>Definition:</b> <a href="_tensor_8hpp_source.xhtml#l00194">Tensor.hpp:194</a></div></div>
<div class="ttc" id="structarmnn_1_1_origins_descriptor_xhtml"><div class="ttname"><a href="structarmnn_1_1_origins_descriptor.xhtml">armnn::OriginsDescriptor</a></div><div class="ttdoc">An OriginsDescriptor for the ConcatLayer. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l00163">Descriptors.hpp:163</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_strided_slice_descriptor_xhtml_af996d82c47e43a16f4c8faa6c6b3e030"><div class="ttname"><a href="structarmnn_1_1_strided_slice_descriptor.xhtml#af996d82c47e43a16f4c8faa6c6b3e030">armnn::StridedSliceDescriptor::m_EllipsisMask</a></div><div class="ttdeci">int32_t m_EllipsisMask</div><div class="ttdoc">Ellipsis mask value. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l01130">Descriptors.hpp:1130</a></div></div>
<div class="ttc" id="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl_xhtml_a0d5cf4cdeeb79d5e4fed01981d734b50"><div class="ttname"><a href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a0d5cf4cdeeb79d5e4fed01981d734b50">armnnTfParser::ITfParser::TfParserImpl::ProcessElementwiseLayer</a></div><div class="ttdeci">ParsedTfOperationPtr ProcessElementwiseLayer(armnn::IOutputSlot *input0Slot, armnn::IOutputSlot *input1Slot, armnn::IConnectableLayer *const layer, const tensorflow::NodeDef &amp;nodeDef)</div><div class="ttdef"><b>Definition:</b> <a href="_tf_parser_8cpp_source.xhtml#l01868">TfParser.cpp:1868</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="structarmnn_tf_parser_1_1_with_output_tensor_index_xhtml"><div class="ttname"><a href="structarmnn_tf_parser_1_1_with_output_tensor_index.xhtml">armnnTfParser::WithOutputTensorIndex</a></div><div class="ttdoc">WithOutputTensorIndex wraps a value and an index. </div><div class="ttdef"><b>Definition:</b> <a href="_tf_parser_8hpp_source.xhtml#l00046">TfParser.hpp:46</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="classarmnn_tf_parser_1_1_i_tf_parser_xhtml_a97caa75ebdb49fc10250742b33d29ae7"><div class="ttname"><a href="classarmnn_tf_parser_1_1_i_tf_parser.xhtml#a97caa75ebdb49fc10250742b33d29ae7">armnnTfParser::ITfParser::ParsedMatMulTfOperation</a></div><div class="ttdeci">friend class ParsedMatMulTfOperation</div><div class="ttdef"><b>Definition:</b> <a href="_i_tf_parser_8hpp_source.xhtml#l00059">ITfParser.hpp:59</a></div></div>
<div class="ttc" id="structarmnn_1_1_resize_descriptor_xhtml_adcf5037208faac36c0788239a073f75c"><div class="ttname"><a href="structarmnn_1_1_resize_descriptor.xhtml#adcf5037208faac36c0788239a073f75c">armnn::ResizeDescriptor::m_TargetWidth</a></div><div class="ttdeci">uint32_t m_TargetWidth</div><div class="ttdoc">Target width value. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l00816">Descriptors.hpp:816</a></div></div>
<div class="ttc" id="structarmnn_1_1_gather_descriptor_xhtml"><div class="ttname"><a href="structarmnn_1_1_gather_descriptor.xhtml">armnn::GatherDescriptor</a></div><div class="ttdoc">A GatherDescriptor for the GatherLayer. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l00742">Descriptors.hpp:742</a></div></div>
<div class="ttc" id="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl_xhtml_a3e11b85d3302eb25275a1389647d0f41"><div class="ttname"><a href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a3e11b85d3302eb25275a1389647d0f41">armnnTfParser::ITfParser::TfParserImpl::ParseGreater</a></div><div class="ttdeci">ParsedTfOperationPtr ParseGreater(const tensorflow::NodeDef &amp;nodeDef, const tensorflow::GraphDef &amp;graphDef)</div><div class="ttdef"><b>Definition:</b> <a href="_tf_parser_8cpp_source.xhtml#l01933">TfParser.cpp:1933</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="_graph_topological_sort_8hpp_xhtml"><div class="ttname"><a href="_graph_topological_sort_8hpp.xhtml">GraphTopologicalSort.hpp</a></div></div>
<div class="ttc" id="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl_xhtml_a77cc856aea1ab0acd3a4bd7709fb18a3"><div class="ttname"><a href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a77cc856aea1ab0acd3a4bd7709fb18a3">armnnTfParser::ITfParser::TfParserImpl::ParseAdd</a></div><div class="ttdeci">ParsedTfOperationPtr ParseAdd(const tensorflow::NodeDef &amp;nodeDef, const tensorflow::GraphDef &amp;graphDef)</div><div class="ttdef"><b>Definition:</b> <a href="_tf_parser_8cpp_source.xhtml#l00826">TfParser.cpp:826</a></div></div>
<div class="ttc" id="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl_xhtml_ae7258b6f1d2aeff43fe25b2f3d662703"><div class="ttname"><a href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#ae7258b6f1d2aeff43fe25b2f3d662703">armnnTfParser::ITfParser::TfParserImpl::ParseConst</a></div><div class="ttdeci">ParsedTfOperationPtr ParseConst(const tensorflow::NodeDef &amp;nodeDef, const tensorflow::GraphDef &amp;graphDef)</div><div class="ttdef"><b>Definition:</b> <a href="_tf_parser_8cpp_source.xhtml#l01086">TfParser.cpp:1086</a></div></div>
<div class="ttc" id="structarmnn_tf_parser_1_1_with_output_tensor_index_xhtml_a08f2876bc5d60ed9c711ac7c26747305"><div class="ttname"><a href="structarmnn_tf_parser_1_1_with_output_tensor_index.xhtml#a08f2876bc5d60ed9c711ac7c26747305">armnnTfParser::WithOutputTensorIndex::m_IndexedValue</a></div><div class="ttdeci">T m_IndexedValue</div><div class="ttdef"><b>Definition:</b> <a href="_tf_parser_8hpp_source.xhtml#l00048">TfParser.hpp:48</a></div></div>
<div class="ttc" id="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl_xhtml_abb49b9213d49e8f2c49dd98506f164b2"><div class="ttname"><a href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#abb49b9213d49e8f2c49dd98506f164b2">armnnTfParser::ITfParser::TfParserImpl::ParseSoftplus</a></div><div class="ttdeci">ParsedTfOperationPtr ParseSoftplus(const tensorflow::NodeDef &amp;nodeDef, const tensorflow::GraphDef &amp;graphDef)</div><div class="ttdef"><b>Definition:</b> <a href="_tf_parser_8cpp_source.xhtml#l02912">TfParser.cpp:2912</a></div></div>
<div class="ttc" id="structarmnn_1_1_strided_slice_descriptor_xhtml_a0d53caff836b84204adbd1c28752a201"><div class="ttname"><a href="structarmnn_1_1_strided_slice_descriptor.xhtml#a0d53caff836b84204adbd1c28752a201">armnn::StridedSliceDescriptor::m_Stride</a></div><div class="ttdeci">std::vector&lt; int &gt; m_Stride</div><div class="ttdoc">Stride values for the input that will be sliced. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l01119">Descriptors.hpp:1119</a></div></div>
<div class="ttc" id="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl_xhtml_a138dbe1b5b87970a073445ab7fc512f5"><div class="ttname"><a href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a138dbe1b5b87970a073445ab7fc512f5">armnnTfParser::ITfParser::TfParserImpl::AddRealDivLayer</a></div><div class="ttdeci">ParsedTfOperationPtr AddRealDivLayer(const tensorflow::NodeDef &amp;nodeDef)</div><div class="ttdef"><b>Definition:</b> <a href="_tf_parser_8cpp_source.xhtml#l03198">TfParser.cpp:3198</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="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl_xhtml_a60be7de45006fefe5ace8729014b0fb7"><div class="ttname"><a href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a60be7de45006fefe5ace8729014b0fb7">armnnTfParser::ITfParser::TfParserImpl::ParseSoftmax</a></div><div class="ttdeci">ParsedTfOperationPtr ParseSoftmax(const tensorflow::NodeDef &amp;nodeDef, const tensorflow::GraphDef &amp;graphDef)</div><div class="ttdef"><b>Definition:</b> <a href="_tf_parser_8cpp_source.xhtml#l02804">TfParser.cpp:2804</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="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl_xhtml_a5b86d12475da84cedb4632a47bb68b1e"><div class="ttname"><a href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a5b86d12475da84cedb4632a47bb68b1e">armnnTfParser::ITfParser::TfParserImpl::ParseMinimum</a></div><div class="ttdeci">ParsedTfOperationPtr ParseMinimum(const tensorflow::NodeDef &amp;nodeDef, const tensorflow::GraphDef &amp;graphDef)</div><div class="ttdef"><b>Definition:</b> <a href="_tf_parser_8cpp_source.xhtml#l01961">TfParser.cpp:1961</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_1_1_tensor_info_xhtml_a71975fcec1464d639f1a78f73164d1bd"><div class="ttname"><a href="classarmnn_1_1_tensor_info.xhtml#a71975fcec1464d639f1a78f73164d1bd">armnn::TensorInfo::SetDataType</a></div><div class="ttdeci">void SetDataType(DataType type)</div><div class="ttdef"><b>Definition:</b> <a href="_tensor_8hpp_source.xhtml#l00195">Tensor.hpp:195</a></div></div>
<div class="ttc" id="structarmnn_1_1_stack_descriptor_xhtml_aed6086070440ceb94129bef06f70173f"><div class="ttname"><a href="structarmnn_1_1_stack_descriptor.xhtml#aed6086070440ceb94129bef06f70173f">armnn::StackDescriptor::m_NumInputs</a></div><div class="ttdeci">uint32_t m_NumInputs</div><div class="ttdoc">Number of input tensors. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l01048">Descriptors.hpp:1048</a></div></div>
<div class="ttc" id="structarmnn_1_1_resize_descriptor_xhtml_a46c3fa15c46fb0d1dcdc24d0ea5cb5cd"><div class="ttname"><a href="structarmnn_1_1_resize_descriptor.xhtml#a46c3fa15c46fb0d1dcdc24d0ea5cb5cd">armnn::ResizeDescriptor::m_TargetHeight</a></div><div class="ttdeci">uint32_t m_TargetHeight</div><div class="ttdoc">Target height value. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l00818">Descriptors.hpp:818</a></div></div>
<div class="ttc" id="classarmnn_1_1_permutation_vector_xhtml"><div class="ttname"><a href="classarmnn_1_1_permutation_vector.xhtml">armnn::PermutationVector</a></div><div class="ttdef"><b>Definition:</b> <a href="_types_8hpp_source.xhtml#l00212">Types.hpp:212</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_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl_xhtml_a7cac9d2ac092398b0efe64ec8e006511"><div class="ttname"><a href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a7cac9d2ac092398b0efe64ec8e006511">armnnTfParser::ITfParser::TfParserImpl::ParseRsqrt</a></div><div class="ttdeci">ParsedTfOperationPtr ParseRsqrt(const tensorflow::NodeDef &amp;nodeDef, const tensorflow::GraphDef &amp;graphDef)</div><div class="ttdef"><b>Definition:</b> <a href="_tf_parser_8cpp_source.xhtml#l02787">TfParser.cpp:2787</a></div></div>
<div class="ttc" id="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl_xhtml_a8a7168f2bbef09692d1983b3059046ac"><div class="ttname"><a href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a8a7168f2bbef09692d1983b3059046ac">armnnTfParser::ITfParser::TfParserImpl::ParseAvgPool</a></div><div class="ttdeci">ParsedTfOperationPtr ParseAvgPool(const tensorflow::NodeDef &amp;nodeDef, const tensorflow::GraphDef &amp;graphDef)</div><div class="ttdef"><b>Definition:</b> <a href="_tf_parser_8cpp_source.xhtml#l03003">TfParser.cpp:3003</a></div></div>
<div class="ttc" id="structarmnn_1_1_pooling2d_descriptor_xhtml_a6089e1ca91914015777ea780a513131a"><div class="ttname"><a href="structarmnn_1_1_pooling2d_descriptor.xhtml#a6089e1ca91914015777ea780a513131a">armnn::Pooling2dDescriptor::m_DataLayout</a></div><div class="ttdeci">DataLayout m_DataLayout</div><div class="ttdoc">The data layout to be used (NCHW, NHWC). </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l00385">Descriptors.hpp:385</a></div></div>
<div class="ttc" id="namespacearmnn_utils_xhtml_a9300450bab29bb951d6f8755b7d9d3a8"><div class="ttname"><a href="namespacearmnn_utils.xhtml#a9300450bab29bb951d6f8755b7d9d3a8">armnnUtils::CalculateStridedSliceOutputTensorInfo</a></div><div class="ttdeci">void CalculateStridedSliceOutputTensorInfo(const armnn::TensorInfo &amp;inputTensorInfo, const armnn::StridedSliceDescriptor &amp;desc, armnn::TensorInfo &amp;outputTensorInfo)</div><div class="ttdoc">Create output tensor info for a StridedSlice operator. </div><div class="ttdef"><b>Definition:</b> <a href="_parser_helper_8cpp_source.xhtml#l00103">ParserHelper.cpp:103</a></div></div>
<div class="ttc" id="_parser_helper_8hpp_xhtml"><div class="ttname"><a href="_parser_helper_8hpp.xhtml">ParserHelper.hpp</a></div></div>
<div class="ttc" id="structarmnn_1_1_strided_slice_descriptor_xhtml_aa68194dd6258ab5b04123005a066ea25"><div class="ttname"><a href="structarmnn_1_1_strided_slice_descriptor.xhtml#aa68194dd6258ab5b04123005a066ea25">armnn::StridedSliceDescriptor::m_End</a></div><div class="ttdeci">std::vector&lt; int &gt; m_End</div><div class="ttdoc">End values for the input that will be sliced. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l01117">Descriptors.hpp:1117</a></div></div>
<div class="ttc" id="structarmnn_1_1_normalization_descriptor_xhtml_afe1f0f09d49ad2befc01f8789187b7dd"><div class="ttname"><a href="structarmnn_1_1_normalization_descriptor.xhtml#afe1f0f09d49ad2befc01f8789187b7dd">armnn::NormalizationDescriptor::m_NormChannelType</a></div><div class="ttdeci">NormalizationAlgorithmChannel m_NormChannelType</div><div class="ttdoc">Normalization channel algorithm to use (Across, Within). </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l00591">Descriptors.hpp:591</a></div></div>
<div class="ttc" id="namespacearmnn_tf_parser_xhtml_a3d934e14ca544ba7af4fe562def8a986"><div class="ttname"><a href="namespacearmnn_tf_parser.xhtml#a3d934e14ca544ba7af4fe562def8a986">armnnTfParser::ConvertTfTensorDataType</a></div><div class="ttdeci">DataType ConvertTfTensorDataType(const tensorflow::DataType tfDataType, const tensorflow::NodeDef &amp;nodeDef)</div><div class="ttdef"><b>Definition:</b> <a href="_tf_parser_8cpp_source.xhtml#l00952">TfParser.cpp:952</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="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl_xhtml_a93ff9eb48ac9fb398fdce42871c2990e"><div class="ttname"><a href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a93ff9eb48ac9fb398fdce42871c2990e">armnnTfParser::ITfParser::TfParserImpl::ParseConcat</a></div><div class="ttdeci">ParsedTfOperationPtr ParseConcat(const tensorflow::NodeDef &amp;nodeDef, const tensorflow::GraphDef &amp;graphDef)</div><div class="ttdef"><b>Definition:</b> <a href="_tf_parser_8cpp_source.xhtml#l02266">TfParser.cpp:2266</a></div></div>
<div class="ttc" id="_tf_parser_8cpp_xhtml_a3fb047570644cae325aa88d3cd7bb96e"><div class="ttname"><a href="_tf_parser_8cpp.xhtml#a3fb047570644cae325aa88d3cd7bb96e">CHECK_DATA_FORMAT</a></div><div class="ttdeci">#define CHECK_DATA_FORMAT(NODE_DEF, FORMAT, NODE_TYPE)</div><div class="ttdef"><b>Definition:</b> <a href="_tf_parser_8cpp_source.xhtml#l00356">TfParser.cpp:356</a></div></div>
<div class="ttc" id="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl_xhtml_a5d67929430d96c47e5652d84da82c1fb"><div class="ttname"><a href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a5d67929430d96c47e5652d84da82c1fb">armnnTfParser::ITfParser::TfParserImpl::ParseSplit</a></div><div class="ttdeci">ParsedTfOperationPtr ParseSplit(const tensorflow::NodeDef &amp;nodeDef, const tensorflow::GraphDef &amp;graphDef)</div><div class="ttdef"><b>Definition:</b> <a href="_tf_parser_8cpp_source.xhtml#l02821">TfParser.cpp:2821</a></div></div>
<div class="ttc" id="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl_xhtml_acd911785f874efd8628779cfcc37593b"><div class="ttname"><a href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#acd911785f874efd8628779cfcc37593b">armnnTfParser::ITfParser::TfParserImpl::ParseAddN</a></div><div class="ttdeci">ParsedTfOperationPtr ParseAddN(const tensorflow::NodeDef &amp;nodeDef, const tensorflow::GraphDef &amp;graphDef)</div><div class="ttdef"><b>Definition:</b> <a href="_tf_parser_8cpp_source.xhtml#l00747">TfParser.cpp:747</a></div></div>
<div class="ttc" id="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl_xhtml_acce71942f3e1ccf87e85f3b4819e2691"><div class="ttname"><a href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#acce71942f3e1ccf87e85f3b4819e2691">armnnTfParser::ITfParser::TfParserImpl::ParseResizeBilinear</a></div><div class="ttdeci">ParsedTfOperationPtr ParseResizeBilinear(const tensorflow::NodeDef &amp;nodeDef, const tensorflow::GraphDef &amp;graphDef)</div><div class="ttdef"><b>Definition:</b> <a href="_tf_parser_8cpp_source.xhtml#l02426">TfParser.cpp:2426</a></div></div>
<div class="ttc" id="classarmnn_1_1_i_network_xhtml_a8a3380be13fba749fc4208214b049347"><div class="ttname"><a href="classarmnn_1_1_i_network.xhtml#a8a3380be13fba749fc4208214b049347">armnn::INetwork::AddReshapeLayer</a></div><div class="ttdeci">IConnectableLayer * AddReshapeLayer(const ReshapeDescriptor &amp;reshapeDescriptor, const char *name=nullptr)</div><div class="ttdoc">Adds a reshape layer to the network. </div><div class="ttdef"><b>Definition:</b> <a href="_network_8cpp_source.xhtml#l00337">Network.cpp:337</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="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl_xhtml_a9414a632d2c86615287df33c0828f903"><div class="ttname"><a href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a9414a632d2c86615287df33c0828f903">armnnTfParser::ITfParser::TfParserImpl::m_ControlInputs</a></div><div class="ttdeci">static const std::list&lt; std::string &gt; m_ControlInputs</div><div class="ttdef"><b>Definition:</b> <a href="_tf_parser_8hpp_source.xhtml#l00259">TfParser.hpp:259</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="structarmnn_1_1_gather_descriptor_xhtml_a35d11c7d509d1adbae1ae01c58394a7f"><div class="ttname"><a href="structarmnn_1_1_gather_descriptor.xhtml#a35d11c7d509d1adbae1ae01c58394a7f">armnn::GatherDescriptor::m_Axis</a></div><div class="ttdeci">int32_t m_Axis</div><div class="ttdoc">The axis in params to gather indices from. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l00758">Descriptors.hpp:758</a></div></div>
<div class="ttc" id="structarmnn_1_1_elementwise_unary_descriptor_xhtml"><div class="ttname"><a href="structarmnn_1_1_elementwise_unary_descriptor.xhtml">armnn::ElementwiseUnaryDescriptor</a></div><div class="ttdoc">A ElementwiseUnaryDescriptor for the ElementwiseUnaryLayer. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l00098">Descriptors.hpp:98</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="structarmnn_1_1_depthwise_convolution2d_descriptor_xhtml_ac1fe174bbadfb39a2b636940c2e647c8"><div class="ttname"><a href="structarmnn_1_1_depthwise_convolution2d_descriptor.xhtml#ac1fe174bbadfb39a2b636940c2e647c8">armnn::DepthwiseConvolution2dDescriptor::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#l00500">Descriptors.hpp:500</a></div></div>
<div class="ttc" id="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl_xhtml_a64aff7efca99114ef64a6b30953d93ee"><div class="ttname"><a href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a64aff7efca99114ef64a6b30953d93ee">armnnTfParser::ITfParser::TfParserImpl::ParseRelu</a></div><div class="ttdeci">ParsedTfOperationPtr ParseRelu(const tensorflow::NodeDef &amp;nodeDef, const tensorflow::GraphDef &amp;graphDef)</div><div class="ttdef"><b>Definition:</b> <a href="_tf_parser_8cpp_source.xhtml#l02753">TfParser.cpp:2753</a></div></div>
<div class="ttc" id="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl_xhtml_a5caa51a7c4b4444cdcc33832fabc512d"><div class="ttname"><a href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a5caa51a7c4b4444cdcc33832fabc512d">armnnTfParser::ITfParser::TfParserImpl::ParseConv2D</a></div><div class="ttdeci">ParsedTfOperationPtr ParseConv2D(const tensorflow::NodeDef &amp;nodeDef, const tensorflow::GraphDef &amp;graphDef)</div><div class="ttdef"><b>Definition:</b> <a href="_tf_parser_8cpp_source.xhtml#l01213">TfParser.cpp:1213</a></div></div>
<div class="ttc" id="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl_xhtml_a8c99f1b3140d1767d320d3e7d2e90949"><div class="ttname"><a href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a8c99f1b3140d1767d320d3e7d2e90949">armnnTfParser::ITfParser::TfParserImpl::CreateNetworkFromBinaryFile</a></div><div class="ttdeci">armnn::INetworkPtr CreateNetworkFromBinaryFile(const char *graphFile, const std::map&lt; std::string, armnn::TensorShape &gt; &amp;inputShapes, const std::vector&lt; std::string &gt; &amp;requestedOutputs)</div><div class="ttdoc">Creates the network from a protobuf binary file on the disk. </div><div class="ttdef"><b>Definition:</b> <a href="_tf_parser_8cpp_source.xhtml#l03605">TfParser.cpp:3605</a></div></div>
<div class="ttc" id="classarmnn_tf_parser_1_1_i_tf_parser_xhtml"><div class="ttname"><a href="classarmnn_tf_parser_1_1_i_tf_parser.xhtml">armnnTfParser::ITfParser</a></div><div class="ttdoc">Parses a directed acyclic graph from a tensorflow protobuf file. </div><div class="ttdef"><b>Definition:</b> <a href="_i_tf_parser_8hpp_source.xhtml#l00025">ITfParser.hpp:25</a></div></div>
<div class="ttc" id="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl_xhtml_ad0f8f08a9af6b35b3218969adec2a3c3"><div class="ttname"><a href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#ad0f8f08a9af6b35b3218969adec2a3c3">armnnTfParser::ITfParser::TfParserImpl::ParseSqueeze</a></div><div class="ttdeci">ParsedTfOperationPtr ParseSqueeze(const tensorflow::NodeDef &amp;nodeDef, const tensorflow::GraphDef &amp;graphDef)</div><div class="ttdef"><b>Definition:</b> <a href="_tf_parser_8cpp_source.xhtml#l02557">TfParser.cpp:2557</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="namespacearmnn_xhtml_a9a2af2f8c4af4f9efa8e79417d505ac4aaf17c98bbd83c27d6426d2ff3fa81d7f"><div class="ttname"><a href="namespacearmnn.xhtml#a9a2af2f8c4af4f9efa8e79417d505ac4aaf17c98bbd83c27d6426d2ff3fa81d7f">armnn::ResizeMethod::Bilinear</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_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl_xhtml_a19ef0406d9678e177106095779f0546e"><div class="ttname"><a href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a19ef0406d9678e177106095779f0546e">armnnTfParser::ITfParser::TfParserImpl::AddAdditionLayer</a></div><div class="ttdeci">ParsedTfOperationPtr AddAdditionLayer(const tensorflow::NodeDef &amp;nodeDef, bool isBiasAdd=false)</div><div class="ttdef"><b>Definition:</b> <a href="_tf_parser_8cpp_source.xhtml#l03118">TfParser.cpp:3118</a></div></div>
<div class="ttc" id="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl_xhtml_a82bb92947dc9e0f04d4242910d6cbc65"><div class="ttname"><a href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a82bb92947dc9e0f04d4242910d6cbc65">armnnTfParser::ITfParser::TfParserImpl::GetConstInputIndex</a></div><div class="ttdeci">unsigned int GetConstInputIndex(const std::vector&lt; OutputOfParsedTfOperation &gt; &amp;inputs)</div><div class="ttdef"><b>Definition:</b> <a href="_tf_parser_8cpp_source.xhtml#l01198">TfParser.cpp:1198</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="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl_xhtml_a1b1a337a431d198f68de42bde32ce2f1"><div class="ttname"><a href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a1b1a337a431d198f68de42bde32ce2f1">armnnTfParser::ITfParser::TfParserImpl::ParseShape</a></div><div class="ttdeci">ParsedTfOperationPtr ParseShape(const tensorflow::NodeDef &amp;nodeDef, const tensorflow::GraphDef &amp;graphDef)</div><div class="ttdef"><b>Definition:</b> <a href="_tf_parser_8cpp_source.xhtml#l02348">TfParser.cpp:2348</a></div></div>
<div class="ttc" id="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl_xhtml_ae295ca8b7d19bb5e6db3f93bd4561ee0"><div class="ttname"><a href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#ae295ca8b7d19bb5e6db3f93bd4561ee0">armnnTfParser::ITfParser::TfParserImpl::GetInputParsedTfOperationsChecked</a></div><div class="ttdeci">std::vector&lt; OutputOfParsedTfOperation &gt; GetInputParsedTfOperationsChecked(const tensorflow::NodeDef &amp;nodeDef, std::size_t expectedNumInputs)</div><div class="ttdoc">Finds the IParsedTfOperations for the nodes connected as inputs of the given node in the graph...</div><div class="ttdef"><b>Definition:</b> <a href="_tf_parser_8cpp_source.xhtml#l00615">TfParser.cpp:615</a></div></div>
<div class="ttc" id="structarmnn_1_1_origins_descriptor_xhtml_a5b192c5fcd96a0f75542524cf646b355"><div class="ttname"><a href="structarmnn_1_1_origins_descriptor.xhtml#a5b192c5fcd96a0f75542524cf646b355">armnn::OriginsDescriptor::SetConcatAxis</a></div><div class="ttdeci">void SetConcatAxis(unsigned int concatAxis)</div><div class="ttdoc">Set the concatenation axis value. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8cpp_source.xhtml#l00158">Descriptors.cpp:158</a></div></div>
<div class="ttc" id="classarmnn_1_1_output_slot_xhtml_a7e5c5771d741dd5473989047a9314728"><div class="ttname"><a href="classarmnn_1_1_output_slot.xhtml#a7e5c5771d741dd5473989047a9314728">armnn::OutputSlot::SetTensorInfo</a></div><div class="ttdeci">void SetTensorInfo(const TensorInfo &amp;tensorInfo) override</div><div class="ttdef"><b>Definition:</b> <a href="_layer_8cpp_source.xhtml#l00058">Layer.cpp:58</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="structarmnn_1_1_mean_descriptor_xhtml"><div class="ttname"><a href="structarmnn_1_1_mean_descriptor.xhtml">armnn::MeanDescriptor</a></div><div class="ttdoc">A MeanDescriptor for the MeanLayer. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l00951">Descriptors.hpp:951</a></div></div>
<div class="ttc" id="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl_xhtml_a165298763e91bc4322753dbe8cbe9df7"><div class="ttname"><a href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a165298763e91bc4322753dbe8cbe9df7">armnnTfParser::ITfParser::TfParserImpl::ParseExpandDims</a></div><div class="ttdeci">ParsedTfOperationPtr ParseExpandDims(const tensorflow::NodeDef &amp;nodeDef, const tensorflow::GraphDef &amp;graphDef)</div><div class="ttdef"><b>Definition:</b> <a href="_tf_parser_8cpp_source.xhtml#l01535">TfParser.cpp:1535</a></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_utils_xhtml"><div class="ttname"><a href="namespacearmnn_utils.xhtml">armnnUtils</a></div><div class="ttdef"><b>Definition:</b> <a href="_data_layout_indexed_8hpp_source.xhtml#l00013">DataLayoutIndexed.hpp:13</a></div></div>
<div class="ttc" id="namespacearmnn_utils_xhtml_acee63cd08da47910fc166a1990988fa8"><div class="ttname"><a href="namespacearmnn_utils.xhtml#acee63cd08da47910fc166a1990988fa8">armnnUtils::GetTensorInfo</a></div><div class="ttdeci">armnn::TensorInfo GetTensorInfo(unsigned int numberOfBatches, unsigned int numberOfChannels, unsigned int height, unsigned int width, const armnn::DataLayout dataLayout, const armnn::DataType dataType)</div><div class="ttdef"><b>Definition:</b> <a href="_tensor_utils_8cpp_source.xhtml#l00038">TensorUtils.cpp:38</a></div></div>
<div class="ttc" id="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl_xhtml_a052b1116b8e9002b58610a375793ae1b"><div class="ttname"><a href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a052b1116b8e9002b58610a375793ae1b">armnnTfParser::ITfParser::TfParserImpl::ParseBiasAdd</a></div><div class="ttdeci">ParsedTfOperationPtr ParseBiasAdd(const tensorflow::NodeDef &amp;nodeDef, const tensorflow::GraphDef &amp;graphDef)</div><div class="ttdef"><b>Definition:</b> <a href="_tf_parser_8cpp_source.xhtml#l00857">TfParser.cpp:857</a></div></div>
<div class="ttc" id="classarmnn_1_1_layer_xhtml_a0e36688a43c35668d8db5257274c68fe"><div class="ttname"><a href="classarmnn_1_1_layer.xhtml#a0e36688a43c35668d8db5257274c68fe">armnn::Layer::GetOutputSlot</a></div><div class="ttdeci">const OutputSlot &amp; GetOutputSlot(unsigned int index=0) const override</div><div class="ttdoc">Get the const output slot handle by slot index. </div><div class="ttdef"><b>Definition:</b> <a href="_layer_8hpp_source.xhtml#l00318">Layer.hpp:318</a></div></div>
<div class="ttc" id="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl_xhtml_a9e7a394f59e8d223a79e3db798803c1c"><div class="ttname"><a href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a9e7a394f59e8d223a79e3db798803c1c">armnnTfParser::ITfParser::TfParserImpl::GetTfInputNodes</a></div><div class="ttdeci">std::vector&lt; OutputOfConstNodeDef &gt; GetTfInputNodes(const tensorflow::NodeDef &amp;nodeDef) const</div><div class="ttdoc">Finds the nodes connected as inputs of the given node in the graph. </div><div class="ttdef"><b>Definition:</b> <a href="_tf_parser_8cpp_source.xhtml#l00578">TfParser.cpp:578</a></div></div>
<div class="ttc" id="structarmnn_1_1_transpose_descriptor_xhtml"><div class="ttname"><a href="structarmnn_1_1_transpose_descriptor.xhtml">armnn::TransposeDescriptor</a></div><div class="ttdoc">A TransposeDescriptor for the TransposeLayer. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l01263">Descriptors.hpp:1263</a></div></div>
<div class="ttc" id="structarmnn_1_1_strided_slice_descriptor_xhtml"><div class="ttname"><a href="structarmnn_1_1_strided_slice_descriptor.xhtml">armnn::StridedSliceDescriptor</a></div><div class="ttdoc">A StridedSliceDescriptor for the StridedSliceLayer. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l01076">Descriptors.hpp:1076</a></div></div>
<div class="ttc" id="namespacearmnn_xhtml_ad8ed01ff3ff33333d8e19db4d2818bb6a166495adc0d0f53bee6baecc577f5204"><div class="ttname"><a href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6a166495adc0d0f53bee6baecc577f5204">armnn::DataType::Float32</a></div></div>
<div class="ttc" id="classarmnn_1_1_i_output_slot_xhtml_a9943775a364fc4ab53b85ac88f311886"><div class="ttname"><a href="classarmnn_1_1_i_output_slot.xhtml#a9943775a364fc4ab53b85ac88f311886">armnn::IOutputSlot::GetTensorInfo</a></div><div class="ttdeci">virtual const TensorInfo &amp; GetTensorInfo() const =0</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="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl_xhtml_a2a41fc15eebc9b7bb3404d1a2634639c"><div class="ttname"><a href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a2a41fc15eebc9b7bb3404d1a2634639c">armnnTfParser::ITfParser::TfParserImpl::ParsePad</a></div><div class="ttdeci">ParsedTfOperationPtr ParsePad(const tensorflow::NodeDef &amp;nodeDef, const tensorflow::GraphDef &amp;graphDef)</div><div class="ttdef"><b>Definition:</b> <a href="_tf_parser_8cpp_source.xhtml#l02195">TfParser.cpp:2195</a></div></div>
<div class="ttc" id="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl_xhtml_ac2c326b2757eadec924e4b7f56a9379c"><div class="ttname"><a href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#ac2c326b2757eadec924e4b7f56a9379c">armnnTfParser::ITfParser::TfParserImpl::m_NodesByName</a></div><div class="ttdeci">std::unordered_map&lt; std::string, const tensorflow::NodeDef * &gt; m_NodesByName</div><div class="ttdoc">Map of nodes extracted from the GraphDef to speed up parsing. </div><div class="ttdef"><b>Definition:</b> <a href="_tf_parser_8hpp_source.xhtml#l00265">TfParser.hpp:265</a></div></div>
<div class="ttc" id="classarmnn_1_1_layer_xhtml_a7ddf0cf6f620d59c10e63495ace795d0"><div class="ttname"><a href="classarmnn_1_1_layer.xhtml#a7ddf0cf6f620d59c10e63495ace795d0">armnn::Layer::GetName</a></div><div class="ttdeci">const char * GetName() const override</div><div class="ttdoc">Returns the name of the layer. </div><div class="ttdef"><b>Definition:</b> <a href="_layer_8hpp_source.xhtml#l00311">Layer.hpp:311</a></div></div>
<div class="ttc" id="classarmnn_1_1_i_connectable_layer_xhtml_afcc1c3a20bd2860e0ddd21674389246f"><div class="ttname"><a href="classarmnn_1_1_i_connectable_layer.xhtml#afcc1c3a20bd2860e0ddd21674389246f">armnn::IConnectableLayer::GetName</a></div><div class="ttdeci">virtual const char * GetName() const =0</div><div class="ttdoc">Returns the name of the layer. </div></div>
<div class="ttc" id="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl_xhtml_aa09a8bb02eed50715082d8b7fccd2f8d"><div class="ttname"><a href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#aa09a8bb02eed50715082d8b7fccd2f8d">armnnTfParser::ITfParser::TfParserImpl::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="_tf_parser_8cpp_source.xhtml#l03740">TfParser.cpp:3740</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="namespacearmnn_utils_xhtml_a428a9a6ffdf0e8d723b50c038c56c336"><div class="ttname"><a href="namespacearmnn_utils.xhtml#a428a9a6ffdf0e8d723b50c038c56c336">armnnUtils::TransposeTensorShape</a></div><div class="ttdeci">armnn::TensorShape TransposeTensorShape(const armnn::TensorShape &amp;srcShape, const armnn::PermutationVector &amp;mappings)</div><div class="ttdef"><b>Definition:</b> <a href="armnn_utils_2_transpose_8cpp_source.xhtml#l00098">Transpose.cpp:98</a></div></div>
<div class="ttc" id="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl_xhtml_acf7e8c7e2e95c9ac09b1197c04b992a3"><div class="ttname"><a href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#acf7e8c7e2e95c9ac09b1197c04b992a3">armnnTfParser::ITfParser::TfParserImpl::ParseEqual</a></div><div class="ttdeci">ParsedTfOperationPtr ParseEqual(const tensorflow::NodeDef &amp;nodeDef, const tensorflow::GraphDef &amp;graphDef)</div><div class="ttdef"><b>Definition:</b> <a href="_tf_parser_8cpp_source.xhtml#l01947">TfParser.cpp:1947</a></div></div>
<div class="ttc" id="_tf_parser_8cpp_xhtml_aab838eb7734e531bb5be6f6dece673bf"><div class="ttname"><a href="_tf_parser_8cpp.xhtml#aab838eb7734e531bb5be6f6dece673bf">CHECK_PADDING_TYPE</a></div><div class="ttdeci">#define CHECK_PADDING_TYPE(NODE_DEF, PADDING)</div><div class="ttdef"><b>Definition:</b> <a href="_tf_parser_8cpp_source.xhtml#l00368">TfParser.cpp:368</a></div></div>
<div class="ttc" id="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl_xhtml_a4b6b3a1fd0ce13ce7d6e3b4342f852c9"><div class="ttname"><a href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a4b6b3a1fd0ce13ce7d6e3b4342f852c9">armnnTfParser::ITfParser::TfParserImpl::ms_OperationNameToParsingFunctions</a></div><div class="ttdeci">static const std::map&lt; std::string, OperationParsingFunction &gt; ms_OperationNameToParsingFunctions</div><div class="ttdoc">Map of TensorFlow operation names to parsing member functions. </div><div class="ttdef"><b>Definition:</b> <a href="_tf_parser_8hpp_source.xhtml#l00257">TfParser.hpp:257</a></div></div>
<div class="ttc" id="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl_xhtml_a02394780a6b2d4c255e4526621e90adb"><div class="ttname"><a href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a02394780a6b2d4c255e4526621e90adb">armnnTfParser::ITfParser::TfParserImpl::HasParsedConstTensor</a></div><div class="ttdeci">bool HasParsedConstTensor(const std::string &amp;nodeName) const</div><div class="ttdoc">Checks if there is a pre-parsed const tensor available with the given name and Type. </div><div class="ttdef"><b>Definition:</b> <a href="_tf_parser_8cpp_source.xhtml#l01182">TfParser.cpp:1182</a></div></div>
<div class="ttc" id="classarmnn_1_1_i_output_slot_xhtml_ac1835f8756a9f03c02fcf9664e3a0fce"><div class="ttname"><a href="classarmnn_1_1_i_output_slot.xhtml#ac1835f8756a9f03c02fcf9664e3a0fce">armnn::IOutputSlot::Connect</a></div><div class="ttdeci">virtual int Connect(IInputSlot &amp;destination)=0</div></div>
<div class="ttc" id="namespacearmnn_1_1optimizations_xhtml_a4fc55afb4885278ad1510b2c4307af76"><div class="ttname"><a href="namespacearmnn_1_1optimizations.xhtml#a4fc55afb4885278ad1510b2c4307af76">armnn::optimizations::AddBroadcastReshapeLayer</a></div><div class="ttdeci">OptimizeForType&lt; Layer, AddBroadcastReshapeLayerImpl &gt; AddBroadcastReshapeLayer</div><div class="ttdef"><b>Definition:</b> <a href="_add_broadcast_reshape_layer_8hpp_source.xhtml#l00082">AddBroadcastReshapeLayer.hpp:82</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="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl_xhtml_a03e49169bbbcfea8be81ff4139d1f75f"><div class="ttname"><a href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a03e49169bbbcfea8be81ff4139d1f75f">armnnTfParser::ITfParser::TfParserImpl::AddActivationLayer</a></div><div class="ttdeci">ParsedTfOperationPtr AddActivationLayer(const tensorflow::NodeDef &amp;nodeDef, armnn::ActivationDescriptor &amp;desc)</div><div class="ttdef"><b>Definition:</b> <a href="_tf_parser_8cpp_source.xhtml#l02984">TfParser.cpp:2984</a></div></div>
<div class="ttc" id="structarmnn_1_1_normalization_descriptor_xhtml"><div class="ttname"><a href="structarmnn_1_1_normalization_descriptor.xhtml">armnn::NormalizationDescriptor</a></div><div class="ttdoc">A NormalizationDescriptor for the NormalizationLayer. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l00567">Descriptors.hpp:567</a></div></div>
<div class="ttc" id="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl_xhtml_a6f8a3151672d48b7b929cfd9acd5add1"><div class="ttname"><a href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a6f8a3151672d48b7b929cfd9acd5add1">armnnTfParser::ITfParser::TfParserImpl::ParseSub</a></div><div class="ttdeci">ParsedTfOperationPtr ParseSub(const tensorflow::NodeDef &amp;nodeDef, const tensorflow::GraphDef &amp;graphDef)</div><div class="ttdef"><b>Definition:</b> <a href="_tf_parser_8cpp_source.xhtml#l01974">TfParser.cpp:1974</a></div></div>
<div class="ttc" id="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl_xhtml_a4cb0ff36b50bf417cfde094f34ec8e04"><div class="ttname"><a href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a4cb0ff36b50bf417cfde094f34ec8e04">armnnTfParser::ITfParser::TfParserImpl::ParseMaxPool</a></div><div class="ttdeci">ParsedTfOperationPtr ParseMaxPool(const tensorflow::NodeDef &amp;nodeDef, const tensorflow::GraphDef &amp;graphDef)</div><div class="ttdef"><b>Definition:</b> <a href="_tf_parser_8cpp_source.xhtml#l02997">TfParser.cpp:2997</a></div></div>
<div class="ttc" id="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl_xhtml_a4ceb262ac0351dcf1aa9f7e1dc298489"><div class="ttname"><a href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a4ceb262ac0351dcf1aa9f7e1dc298489">armnnTfParser::ITfParser::TfParserImpl::ProcessComparisonLayer</a></div><div class="ttdeci">ParsedTfOperationPtr ProcessComparisonLayer(armnn::IOutputSlot *input0Slot, armnn::IOutputSlot *input1Slot, armnn::IConnectableLayer *const layer, const tensorflow::NodeDef &amp;nodeDef)</div><div class="ttdef"><b>Definition:</b> <a href="_tf_parser_8cpp_source.xhtml#l01841">TfParser.cpp:1841</a></div></div>
<div class="ttc" id="structarmnn_1_1_resize_descriptor_xhtml_a6089e1ca91914015777ea780a513131a"><div class="ttname"><a href="structarmnn_1_1_resize_descriptor.xhtml#a6089e1ca91914015777ea780a513131a">armnn::ResizeDescriptor::m_DataLayout</a></div><div class="ttdeci">DataLayout m_DataLayout</div><div class="ttdoc">The data layout to be used (NCHW, NHWC). </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l00823">Descriptors.hpp:823</a></div></div>
<div class="ttc" id="classarmnn_tf_parser_1_1_i_tf_parser_xhtml_ac28271f7220cd595de55dbb7f99f4a63"><div class="ttname"><a href="classarmnn_tf_parser_1_1_i_tf_parser.xhtml#ac28271f7220cd595de55dbb7f99f4a63">armnnTfParser::ITfParser::ParsedMulTfOperation</a></div><div class="ttdeci">friend class ParsedMulTfOperation</div><div class="ttdef"><b>Definition:</b> <a href="_i_tf_parser_8hpp_source.xhtml#l00060">ITfParser.hpp:60</a></div></div>
<div class="ttc" id="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl_xhtml_aee93c8f83169730c175da7601fca5de6"><div class="ttname"><a href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#aee93c8f83169730c175da7601fca5de6">armnnTfParser::ITfParser::TfParserImpl::ParseSigmoid</a></div><div class="ttdeci">ParsedTfOperationPtr ParseSigmoid(const tensorflow::NodeDef &amp;nodeDef, const tensorflow::GraphDef &amp;graphDef)</div><div class="ttdef"><b>Definition:</b> <a href="_tf_parser_8cpp_source.xhtml#l02776">TfParser.cpp:2776</a></div></div>
<div class="ttc" id="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl_xhtml_a0c98e07875a82c71c65bbb53eb347561"><div class="ttname"><a href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a0c98e07875a82c71c65bbb53eb347561">armnnTfParser::ITfParser::TfParserImpl::TrackOutputBinding</a></div><div class="ttdeci">void TrackOutputBinding(armnn::IConnectableLayer *layer, armnn::LayerBindingId id, const armnn::TensorInfo &amp;tensorInfo)</div><div class="ttdef"><b>Definition:</b> <a href="_tf_parser_8cpp_source.xhtml#l03711">TfParser.cpp:3711</a></div></div>
<div class="ttc" id="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl_xhtml_ac41a09541f963e43c9a9300e8c28eb06"><div class="ttname"><a href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#ac41a09541f963e43c9a9300e8c28eb06">armnnTfParser::ITfParser::TfParserImpl::GetBindingInfo</a></div><div class="ttdeci">static std::pair&lt; armnn::LayerBindingId, armnn::TensorInfo &gt; GetBindingInfo(const std::string &amp;layerName, const char *bindingPointDesc, const std::unordered_map&lt; std::string, BindingPointInfo &gt; &amp;nameToBindingInfo)</div><div class="ttdef"><b>Definition:</b> <a href="_tf_parser_8cpp_source.xhtml#l03688">TfParser.cpp:3688</a></div></div>
<div class="ttc" id="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl_xhtml_a9ffcd919d2466d7aa5d2325ee77c322d"><div class="ttname"><a href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a9ffcd919d2466d7aa5d2325ee77c322d">armnnTfParser::ITfParser::TfParserImpl::ParseGather</a></div><div class="ttdeci">ParsedTfOperationPtr ParseGather(const tensorflow::NodeDef &amp;nodeDef, const tensorflow::GraphDef &amp;graphDef)</div><div class="ttdef"><b>Definition:</b> <a href="_tf_parser_8cpp_source.xhtml#l01894">TfParser.cpp:1894</a></div></div>
<div class="ttc" id="namespacearmnn_utils_xhtml_a59cbccbfbae7633020d200f8c23fe69e"><div class="ttname"><a href="namespacearmnn_utils.xhtml#a59cbccbfbae7633020d200f8c23fe69e">armnnUtils::ArmNNToNHWC</a></div><div class="ttdeci">const armnn::PermutationVector ArmNNToNHWC</div><div class="ttdef"><b>Definition:</b> <a href="_parser_helper_8cpp_source.xhtml#l00017">ParserHelper.cpp:17</a></div></div>
<div class="ttc" id="classarmnn_1_1_tensor_info_xhtml_a157e27d41e9f6b21f0d3c025fa47dc24"><div class="ttname"><a href="classarmnn_1_1_tensor_info.xhtml#a157e27d41e9f6b21f0d3c025fa47dc24">armnn::TensorInfo::GetNumDimensions</a></div><div class="ttdeci">unsigned int GetNumDimensions() const</div><div class="ttdef"><b>Definition:</b> <a href="_tensor_8hpp_source.xhtml#l00191">Tensor.hpp:191</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="namespacearmnn_utils_xhtml_abeaf4f6785039866fd075f4569ba8e84"><div class="ttname"><a href="namespacearmnn_utils.xhtml#abeaf4f6785039866fd075f4569ba8e84">armnnUtils::Permuted</a></div><div class="ttdeci">armnn::TensorShape Permuted(const armnn::TensorShape &amp;srcShape, const armnn::PermutationVector &amp;mappings)</div><div class="ttdef"><b>Definition:</b> <a href="_permute_8cpp_source.xhtml#l00098">Permute.cpp:98</a></div></div>
<div class="ttc" id="structarmnn_1_1_softmax_descriptor_xhtml"><div class="ttname"><a href="structarmnn_1_1_softmax_descriptor.xhtml">armnn::SoftmaxDescriptor</a></div><div class="ttdoc">A SoftmaxDescriptor for the SoftmaxLayer. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l00139">Descriptors.hpp:139</a></div></div>
<div class="ttc" id="classarmnn_tf_parser_1_1_i_tf_parser_xhtml_ab9a7a00deef758531aa11d3044e78b45"><div class="ttname"><a href="classarmnn_tf_parser_1_1_i_tf_parser.xhtml#ab9a7a00deef758531aa11d3044e78b45">armnnTfParser::ITfParser::DeferredSingleLayerParsedTfOperation</a></div><div class="ttdeci">friend class DeferredSingleLayerParsedTfOperation</div><div class="ttdef"><b>Definition:</b> <a href="_i_tf_parser_8hpp_source.xhtml#l00063">ITfParser.hpp:63</a></div></div>
<div class="ttc" id="structarmnn_1_1_normalization_descriptor_xhtml_a8275d51ef9a584feb95726ea0522f6e5"><div class="ttname"><a href="structarmnn_1_1_normalization_descriptor.xhtml#a8275d51ef9a584feb95726ea0522f6e5">armnn::NormalizationDescriptor::m_Beta</a></div><div class="ttdeci">float m_Beta</div><div class="ttdoc">Beta value for the normalization equation. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l00599">Descriptors.hpp:599</a></div></div>
<div class="ttc" id="structarmnn_1_1_normalization_descriptor_xhtml_aa70c05f1aad12fbd9d9ec43ea4557b03"><div class="ttname"><a href="structarmnn_1_1_normalization_descriptor.xhtml#aa70c05f1aad12fbd9d9ec43ea4557b03">armnn::NormalizationDescriptor::m_NormSize</a></div><div class="ttdeci">uint32_t m_NormSize</div><div class="ttdoc">Depth radius value. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l00595">Descriptors.hpp:595</a></div></div>
<div class="ttc" id="structarmnn_1_1_views_descriptor_xhtml_a2b125117aa61f9baf3a9cb8658aa61a2"><div class="ttname"><a href="structarmnn_1_1_views_descriptor.xhtml#a2b125117aa61f9baf3a9cb8658aa61a2">armnn::ViewsDescriptor::SetViewOriginCoord</a></div><div class="ttdeci">Status SetViewOriginCoord(uint32_t view, uint32_t coord, uint32_t value)</div><div class="ttdoc">Set the view origin coordinates. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8cpp_source.xhtml#l00310">Descriptors.cpp:310</a></div></div>
<div class="ttc" id="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl_xhtml_ab1bcf36c86bd2c3f9d8dbd8793642f43"><div class="ttname"><a href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#ab1bcf36c86bd2c3f9d8dbd8793642f43">armnnTfParser::ITfParser::TfParserImpl::ParseRealDiv</a></div><div class="ttdeci">ParsedTfOperationPtr ParseRealDiv(const tensorflow::NodeDef &amp;nodeDef, const tensorflow::GraphDef &amp;graphDef)</div><div class="ttdef"><b>Definition:</b> <a href="_tf_parser_8cpp_source.xhtml#l02746">TfParser.cpp:2746</a></div></div>
<div class="ttc" id="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl_xhtml_a62d6d6cba9ed0d3ad63fffb40aec86b5"><div class="ttname"><a href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a62d6d6cba9ed0d3ad63fffb40aec86b5">armnnTfParser::ITfParser::TfParserImpl::m_NetworkOutputsBindingInfo</a></div><div class="ttdeci">std::unordered_map&lt; std::string, BindingPointInfo &gt; m_NetworkOutputsBindingInfo</div><div class="ttdoc">Maps output layer names to their corresponding ids and tensor info. </div><div class="ttdef"><b>Definition:</b> <a href="_tf_parser_8hpp_source.xhtml#l00273">TfParser.hpp:273</a></div></div>
<div class="ttc" id="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl_xhtml_a22a4253bd5cb5510d0086a0f067760ec"><div class="ttname"><a href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#a22a4253bd5cb5510d0086a0f067760ec">armnnTfParser::ITfParser::TfParserImpl::LoadNodeDef</a></div><div class="ttdeci">void LoadNodeDef(const tensorflow::NodeDef &amp;nodeDef, const tensorflow::GraphDef &amp;graphDef)</div><div class="ttdoc">Parses a given node, assuming nodes before it in the graph have been done. </div><div class="ttdef"><b>Definition:</b> <a href="_tf_parser_8cpp_source.xhtml#l03413">TfParser.cpp:3413</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="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_ad1d5cce2d9e9a5d61c243e5c989112e0ad066db54b89b0912e7e7c6da51e2da51"><div class="ttname"><a href="namespacearmnn.xhtml#ad1d5cce2d9e9a5d61c243e5c989112e0ad066db54b89b0912e7e7c6da51e2da51">armnn::DataLayout::NHWC</a></div></div>
<div class="ttc" id="structarmnn_1_1_origins_descriptor_xhtml_a2b125117aa61f9baf3a9cb8658aa61a2"><div class="ttname"><a href="structarmnn_1_1_origins_descriptor.xhtml#a2b125117aa61f9baf3a9cb8658aa61a2">armnn::OriginsDescriptor::SetViewOriginCoord</a></div><div class="ttdeci">Status SetViewOriginCoord(uint32_t view, uint32_t coord, uint32_t value)</div><div class="ttdoc">Set the view origin coordinates. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8cpp_source.xhtml#l00167">Descriptors.cpp:167</a></div></div>
<div class="ttc" id="include_2armnn_tf_parser_2_version_8hpp_xhtml"><div class="ttname"><a href="include_2armnn_tf_parser_2_version_8hpp.xhtml">Version.hpp</a></div></div>
<div class="ttc" id="namespacearmnn_xhtml_aa02b9e06fb20fa3c13da0427e6ee5ab2"><div class="ttname"><a href="namespacearmnn.xhtml#aa02b9e06fb20fa3c13da0427e6ee5ab2">armnn::GetDataTypeSize</a></div><div class="ttdeci">constexpr unsigned int GetDataTypeSize(DataType dataType)</div><div class="ttdef"><b>Definition:</b> <a href="_types_utils_8hpp_source.xhtml#l00126">TypesUtils.hpp:126</a></div></div>
<div class="ttc" id="namespacearmnn_tf_parser_xhtml_a9c18860db8b032de579c5ad94cbae5d0"><div class="ttname"><a href="namespacearmnn_tf_parser.xhtml#a9c18860db8b032de579c5ad94cbae5d0">armnnTfParser::CalculatePaddedOutputTensorInfo</a></div><div class="ttdeci">TensorInfo CalculatePaddedOutputTensorInfo(const TensorInfo &amp;inputTensorInfo, const std::vector&lt; std::pair&lt; unsigned int, unsigned int &gt;&gt; &amp;padList)</div><div class="ttdef"><b>Definition:</b> <a href="_tf_parser_8cpp_source.xhtml#l02176">TfParser.cpp:2176</a></div></div>
<div class="ttc" id="structarmnn_1_1_depthwise_convolution2d_descriptor_xhtml_a002bc30e590d78cbb4f4d12171055ca7"><div class="ttname"><a href="structarmnn_1_1_depthwise_convolution2d_descriptor.xhtml#a002bc30e590d78cbb4f4d12171055ca7">armnn::DepthwiseConvolution2dDescriptor::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#l00492">Descriptors.hpp:492</a></div></div>
<div class="ttc" id="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl_xhtml_ae3a610533ecb2a9a87fb47785f7fb712"><div class="ttname"><a href="structarmnn_tf_parser_1_1_i_tf_parser_1_1_tf_parser_impl.xhtml#ae3a610533ecb2a9a87fb47785f7fb712">armnnTfParser::ITfParser::TfParserImpl::AddMaximumLayer</a></div><div class="ttdeci">ParsedTfOperationPtr AddMaximumLayer(const tensorflow::NodeDef &amp;nodeDef)</div><div class="ttdef"><b>Definition:</b> <a href="_tf_parser_8cpp_source.xhtml#l03236">TfParser.cpp:3236</a></div></div>
<div class="ttc" id="namespacearmnn_tf_parser_xhtml_a6e06adf62d53562032e738b89f3eb37c"><div class="ttname"><a href="namespacearmnn_tf_parser.xhtml#a6e06adf62d53562032e738b89f3eb37c">armnnTfParser::OutputShapeOfSqueeze</a></div><div class="ttdeci">TensorInfo OutputShapeOfSqueeze(const tensorflow::NodeDef &amp;nodeDef, TensorInfo inputTensorInfo)</div><div class="ttdef"><b>Definition:</b> <a href="_tf_parser_8cpp_source.xhtml#l02485">TfParser.cpp:2485</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_50aba35e23cba3c8856f8642cc06d5dc.xhtml">armnnTfParser</a></li><li class="navelem"><a class="el" href="_tf_parser_8cpp.xhtml">TfParser.cpp</a></li>
    <li class="footer">Generated on Fri Mar 19 2021 15:26:00 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>