aboutsummaryrefslogtreecommitdiff
path: root/21.02/_caffe_parser_8cpp_source.xhtml
blob: 7d42ad3670682320794004da2817253034855513 (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
<!-- 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/armnnCaffeParser/CaffeParser.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('_caffe_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">CaffeParser.cpp</div>  </div>
</div><!--header-->
<div class="contents">
<a href="_caffe_parser_8cpp.xhtml">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno">    1</span>&#160;<span class="comment">//</span></div><div class="line"><a name="l00002"></a><span class="lineno">    2</span>&#160;<span class="comment">// Copyright © 2017 Arm Ltd. All rights reserved.</span></div><div class="line"><a name="l00003"></a><span class="lineno">    3</span>&#160;<span class="comment">// SPDX-License-Identifier: MIT</span></div><div class="line"><a name="l00004"></a><span class="lineno">    4</span>&#160;<span class="comment">//</span></div><div class="line"><a name="l00005"></a><span class="lineno">    5</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="_caffe_parser_8hpp.xhtml">CaffeParser.hpp</a>&quot;</span></div><div class="line"><a name="l00006"></a><span class="lineno">    6</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="_record_by_record_caffe_parser_8hpp.xhtml">RecordByRecordCaffeParser.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_caffe_parser_2_version_8hpp.xhtml">armnnCaffeParser/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 &quot;<a class="code" href="_descriptors_8hpp.xhtml">armnn/Descriptors.hpp</a>&quot;</span></div><div class="line"><a name="l00011"></a><span class="lineno">   11</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="_i_network_8hpp.xhtml">armnn/INetwork.hpp</a>&quot;</span></div><div class="line"><a name="l00012"></a><span class="lineno">   12</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="_utils_8hpp.xhtml">armnn/Utils.hpp</a>&quot;</span></div><div class="line"><a name="l00013"></a><span class="lineno">   13</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="_exceptions_8hpp.xhtml">armnn/Exceptions.hpp</a>&quot;</span></div><div class="line"><a name="l00014"></a><span class="lineno">   14</span>&#160;</div><div class="line"><a name="l00015"></a><span class="lineno">   15</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="_graph_topological_sort_8hpp.xhtml">GraphTopologicalSort.hpp</a>&quot;</span></div><div class="line"><a name="l00016"></a><span class="lineno">   16</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="_verification_helpers_8hpp.xhtml">VerificationHelpers.hpp</a>&quot;</span></div><div class="line"><a name="l00017"></a><span class="lineno">   17</span>&#160;</div><div class="line"><a name="l00018"></a><span class="lineno">   18</span>&#160;<span class="preprocessor">#include &lt;<a class="code" href="_assert_8hpp.xhtml">armnn/utility/Assert.hpp</a>&gt;</span></div><div class="line"><a name="l00019"></a><span class="lineno">   19</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="l00020"></a><span class="lineno">   20</span>&#160;</div><div class="line"><a name="l00021"></a><span class="lineno">   21</span>&#160;<span class="preprocessor">#include &lt;fmt/format.h&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="comment">// Caffe</span></div><div class="line"><a name="l00024"></a><span class="lineno">   24</span>&#160;<span class="preprocessor">#include &quot;caffe/proto/caffe.pb.h&quot;</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="comment">// ProtoBuf</span></div><div class="line"><a name="l00027"></a><span class="lineno">   27</span>&#160;<span class="preprocessor">#include &lt;google/protobuf/io/coded_stream.h&gt;</span></div><div class="line"><a name="l00028"></a><span class="lineno">   28</span>&#160;<span class="preprocessor">#include &lt;google/protobuf/io/zero_copy_stream.h&gt;</span></div><div class="line"><a name="l00029"></a><span class="lineno">   29</span>&#160;<span class="preprocessor">#include &lt;google/protobuf/io/zero_copy_stream_impl.h&gt;</span></div><div class="line"><a name="l00030"></a><span class="lineno">   30</span>&#160;<span class="preprocessor">#include &lt;google/protobuf/text_format.h&gt;</span></div><div class="line"><a name="l00031"></a><span class="lineno">   31</span>&#160;<span class="preprocessor">#include &lt;google/protobuf/stubs/common.h&gt;</span></div><div class="line"><a name="l00032"></a><span class="lineno">   32</span>&#160;<span class="preprocessor">#include &lt;google/protobuf/stubs/once.h&gt;</span></div><div class="line"><a name="l00033"></a><span class="lineno">   33</span>&#160;<span class="preprocessor">#include &lt;google/protobuf/io/coded_stream.h&gt;</span></div><div class="line"><a name="l00034"></a><span class="lineno">   34</span>&#160;<span class="preprocessor">#include &lt;google/protobuf/descriptor.h&gt;</span></div><div class="line"><a name="l00035"></a><span class="lineno">   35</span>&#160;<span class="preprocessor">#include &lt;google/protobuf/generated_message_reflection.h&gt;</span></div><div class="line"><a name="l00036"></a><span class="lineno">   36</span>&#160;<span class="preprocessor">#include &lt;google/protobuf/reflection_ops.h&gt;</span></div><div class="line"><a name="l00037"></a><span class="lineno">   37</span>&#160;<span class="preprocessor">#include &lt;google/protobuf/wire_format.h&gt;</span></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;<span class="preprocessor">#include &lt;cmath&gt;</span></div><div class="line"><a name="l00040"></a><span class="lineno">   40</span>&#160;<span class="preprocessor">#include &lt;iostream&gt;</span></div><div class="line"><a name="l00041"></a><span class="lineno">   41</span>&#160;<span class="preprocessor">#include &lt;sstream&gt;</span></div><div class="line"><a name="l00042"></a><span class="lineno">   42</span>&#160;<span class="preprocessor">#include &lt;queue&gt;</span></div><div class="line"><a name="l00043"></a><span class="lineno">   43</span>&#160;<span class="preprocessor">#include &lt;fcntl.h&gt;</span></div><div class="line"><a name="l00044"></a><span class="lineno">   44</span>&#160;<span class="comment"></span></div><div class="line"><a name="l00045"></a><span class="lineno">   45</span>&#160;<span class="comment">/// Caffe networks are loaded from protobuf files (binary or text) using the protobuf library and the generated</span></div><div class="line"><a name="l00046"></a><span class="lineno">   46</span>&#160;<span class="comment">/// code from caffe.pb.h. This gives us a caffe::NetParameter which is an in-memory version of the file.</span></div><div class="line"><a name="l00047"></a><span class="lineno">   47</span>&#160;<span class="comment">/// This contains a flat list of Caffe &#39;layers&#39; (e.g. convolution, pooling etc.).</span></div><div class="line"><a name="l00048"></a><span class="lineno">   48</span>&#160;<span class="comment">/// Each layer has inputs (called &quot;bottoms&quot;) and outputs (called &quot;tops&quot;). Data flows from bottom to top.</span></div><div class="line"><a name="l00049"></a><span class="lineno">   49</span>&#160;<span class="comment">/// The bottoms of a layer refer to the tops of other layers, not their names.</span></div><div class="line"><a name="l00050"></a><span class="lineno">   50</span>&#160;<span class="comment">/// The names of layers seem to be arbitrary (you could rename a layer and the network wouldn&#39;t</span></div><div class="line"><a name="l00051"></a><span class="lineno">   51</span>&#160;<span class="comment">/// need any other changes).</span></div><div class="line"><a name="l00052"></a><span class="lineno">   52</span>&#160;<span class="comment">///</span></div><div class="line"><a name="l00053"></a><span class="lineno">   53</span>&#160;<span class="comment">/// Some layers (e.g. Relu) can be configured so that their top and bottom are both the same. This is called an</span></div><div class="line"><a name="l00054"></a><span class="lineno">   54</span>&#160;<span class="comment">/// &quot;in-place&quot; layer and is a Caffe runtime feature used to reduce memory usage by modifying tensors in-place.</span></div><div class="line"><a name="l00055"></a><span class="lineno">   55</span>&#160;<span class="comment">/// This isn&#39;t relevant to the parser and so we preprocess these layers to convert them to regular layers, to result</span></div><div class="line"><a name="l00056"></a><span class="lineno">   56</span>&#160;<span class="comment">/// in a consistent graph structure.</span></div><div class="line"><a name="l00057"></a><span class="lineno">   57</span>&#160;<span class="comment"></span></div><div class="line"><a name="l00058"></a><span class="lineno">   58</span>&#160;<span class="keyword">namespace </span><a class="code" href="namespacearmnn_caffe_parser.xhtml">armnnCaffeParser</a></div><div class="line"><a name="l00059"></a><span class="lineno">   59</span>&#160;{</div><div class="line"><a name="l00060"></a><span class="lineno">   60</span>&#160;</div><div class="line"><a name="l00061"></a><span class="lineno">   61</span>&#160;<span class="keyword">using namespace </span><a class="code" href="namespacearmnn.xhtml">armnn</a>;</div><div class="line"><a name="l00062"></a><span class="lineno">   62</span>&#160;<span class="keyword">using namespace </span><a class="code" href="namespacecaffe.xhtml">caffe</a>;</div><div class="line"><a name="l00063"></a><span class="lineno">   63</span>&#160;<span class="keyword">using namespace </span><a class="code" href="namespacestd.xhtml">std</a>;</div><div class="line"><a name="l00064"></a><span class="lineno">   64</span>&#160;<span class="keyword">using namespace </span><a class="code" href="namespacegoogle_1_1protobuf_1_1io.xhtml">google::protobuf::io</a>;</div><div class="line"><a name="l00065"></a><span class="lineno">   65</span>&#160;</div><div class="line"><a name="l00066"></a><span class="lineno">   66</span>&#160;ICaffeParser::ICaffeParser() : pCaffeParserImpl(new RecordByRecordCaffeParser()) {}</div><div class="line"><a name="l00067"></a><span class="lineno">   67</span>&#160;</div><div class="line"><a name="l00068"></a><span class="lineno">   68</span>&#160;ICaffeParser::~ICaffeParser() = <span class="keywordflow">default</span>;</div><div class="line"><a name="l00069"></a><span class="lineno">   69</span>&#160;</div><div class="line"><a name="l00070"></a><span class="lineno"><a class="line" href="classarmnn_caffe_parser_1_1_i_caffe_parser.xhtml#a706b8481b6bd660dd3c3898fdf7a2993">   70</a></span>&#160;<a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser.xhtml">ICaffeParser</a>* ICaffeParser::CreateRaw()</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">   72</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">new</span> <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser.xhtml">ICaffeParser</a>();</div><div class="line"><a name="l00073"></a><span class="lineno">   73</span>&#160;}</div><div class="line"><a name="l00074"></a><span class="lineno">   74</span>&#160;</div><div class="line"><a name="l00075"></a><span class="lineno"><a class="line" href="classarmnn_caffe_parser_1_1_i_caffe_parser.xhtml#abd42446e41480b0cc9df7ce06af412e3">   75</a></span>&#160;<a class="code" href="namespacearmnn_caffe_parser.xhtml#a33c76910f1980ffaa41c22e0151cce2a">ICaffeParserPtr</a> ICaffeParser::Create()</div><div class="line"><a name="l00076"></a><span class="lineno">   76</span>&#160;{</div><div class="line"><a name="l00077"></a><span class="lineno">   77</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="namespacearmnn_caffe_parser.xhtml#a33c76910f1980ffaa41c22e0151cce2a">ICaffeParserPtr</a>(CreateRaw(), &amp;ICaffeParser::Destroy);</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">   79</span>&#160;</div><div class="line"><a name="l00080"></a><span class="lineno"><a class="line" href="classarmnn_caffe_parser_1_1_i_caffe_parser.xhtml#a5e8137c09390352d2f8b420d147d3b2e">   80</a></span>&#160;<span class="keywordtype">void</span> ICaffeParser::Destroy(<a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser.xhtml">ICaffeParser</a>* parser)</div><div class="line"><a name="l00081"></a><span class="lineno">   81</span>&#160;{</div><div class="line"><a name="l00082"></a><span class="lineno">   82</span>&#160;    <span class="keyword">delete</span> parser;</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">   84</span>&#160;</div><div class="line"><a name="l00085"></a><span class="lineno"><a class="line" href="classarmnn_caffe_parser_1_1_i_caffe_parser.xhtml#add49602ee9cd2bd16c1c4ccd25555d8e">   85</a></span>&#160;<a class="code" href="namespacearmnn.xhtml#ace74f6f9feb95a964a49d79458232703">armnn::INetworkPtr</a> ICaffeParser::CreateNetworkFromTextFile(</div><div class="line"><a name="l00086"></a><span class="lineno">   86</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">char</span>* graphFile,</div><div class="line"><a name="l00087"></a><span class="lineno">   87</span>&#160;    <span class="keyword">const</span> std::map&lt;std::string, armnn::TensorShape&gt;&amp; inputShapes,</div><div class="line"><a name="l00088"></a><span class="lineno">   88</span>&#160;    <span class="keyword">const</span> std::vector&lt;std::string&gt;&amp; requestedOutputs)</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;    <span class="keywordflow">return</span> pCaffeParserImpl-&gt;<a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser.xhtml#add49602ee9cd2bd16c1c4ccd25555d8e">CreateNetworkFromTextFile</a>(graphFile, inputShapes, requestedOutputs);</div><div class="line"><a name="l00091"></a><span class="lineno">   91</span>&#160;}</div><div class="line"><a name="l00092"></a><span class="lineno">   92</span>&#160;</div><div class="line"><a name="l00093"></a><span class="lineno"><a class="line" href="classarmnn_caffe_parser_1_1_i_caffe_parser.xhtml#a56e7dd134fad3b70cb926b447fe2d16e">   93</a></span>&#160;<a class="code" href="namespacearmnn.xhtml#ace74f6f9feb95a964a49d79458232703">armnn::INetworkPtr</a> ICaffeParser::CreateNetworkFromBinaryFile(</div><div class="line"><a name="l00094"></a><span class="lineno">   94</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">char</span>* graphFile,</div><div class="line"><a name="l00095"></a><span class="lineno">   95</span>&#160;    <span class="keyword">const</span> std::map&lt;std::string, armnn::TensorShape&gt;&amp; inputShapes,</div><div class="line"><a name="l00096"></a><span class="lineno">   96</span>&#160;    <span class="keyword">const</span> std::vector&lt;std::string&gt;&amp; requestedOutputs)</div><div class="line"><a name="l00097"></a><span class="lineno">   97</span>&#160;{</div><div class="line"><a name="l00098"></a><span class="lineno">   98</span>&#160;    <span class="keywordflow">return</span> pCaffeParserImpl-&gt;CreateNetworkFromBinaryFile(graphFile, inputShapes,requestedOutputs);</div><div class="line"><a name="l00099"></a><span class="lineno">   99</span>&#160;}</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"><a class="line" href="classarmnn_caffe_parser_1_1_i_caffe_parser.xhtml#a5448fd503a576d279c71aa8340e84b7f">  101</a></span>&#160;<a class="code" href="namespacearmnn.xhtml#ace74f6f9feb95a964a49d79458232703">armnn::INetworkPtr</a> ICaffeParser::CreateNetworkFromString(</div><div class="line"><a name="l00102"></a><span class="lineno">  102</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">char</span>* protoText,</div><div class="line"><a name="l00103"></a><span class="lineno">  103</span>&#160;    <span class="keyword">const</span> std::map&lt;std::string, armnn::TensorShape&gt;&amp; inputShapes,</div><div class="line"><a name="l00104"></a><span class="lineno">  104</span>&#160;    <span class="keyword">const</span> std::vector&lt;std::string&gt;&amp; requestedOutputs)</div><div class="line"><a name="l00105"></a><span class="lineno">  105</span>&#160;{</div><div class="line"><a name="l00106"></a><span class="lineno">  106</span>&#160;    <span class="keywordflow">return</span> pCaffeParserImpl-&gt;CreateNetworkFromString(protoText, inputShapes, requestedOutputs);</div><div class="line"><a name="l00107"></a><span class="lineno">  107</span>&#160;}</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"><a class="line" href="classarmnn_caffe_parser_1_1_i_caffe_parser.xhtml#a8b053a6c449d0814cc831c916c126668">  109</a></span>&#160;<a class="code" href="namespacearmnn.xhtml#a280670a263dc4fd40491f6d0a2737f44">BindingPointInfo</a> ICaffeParser::GetNetworkInputBindingInfo(<span class="keyword">const</span> std::string&amp; name)<span class="keyword"> const</span></div><div class="line"><a name="l00110"></a><span class="lineno">  110</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l00111"></a><span class="lineno">  111</span>&#160;    <span class="keywordflow">return</span> pCaffeParserImpl-&gt;GetNetworkInputBindingInfo(name);</div><div class="line"><a name="l00112"></a><span class="lineno">  112</span>&#160;}</div><div class="line"><a name="l00113"></a><span class="lineno">  113</span>&#160;</div><div class="line"><a name="l00114"></a><span class="lineno"><a class="line" href="classarmnn_caffe_parser_1_1_i_caffe_parser.xhtml#a4b1fdcb1985af12dd1848a9ffa5d3271">  114</a></span>&#160;<a class="code" href="namespacearmnn.xhtml#a280670a263dc4fd40491f6d0a2737f44">BindingPointInfo</a> ICaffeParser::GetNetworkOutputBindingInfo(<span class="keyword">const</span> std::string&amp; name)<span class="keyword"> const</span></div><div class="line"><a name="l00115"></a><span class="lineno">  115</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l00116"></a><span class="lineno">  116</span>&#160;    <span class="keywordflow">return</span> pCaffeParserImpl-&gt;GetNetworkOutputBindingInfo(name);</div><div class="line"><a name="l00117"></a><span class="lineno">  117</span>&#160;}</div><div class="line"><a name="l00118"></a><span class="lineno">  118</span>&#160;</div><div class="line"><a name="l00119"></a><span class="lineno">  119</span>&#160;<span class="keyword">namespace</span></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;</div><div class="line"><a name="l00122"></a><span class="lineno">  122</span>&#160;<span class="keyword">const</span> <span class="keywordtype">float</span>* GetArrayPtrFromBlob(<span class="keyword">const</span> LayerParameter&amp; layerParam, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> blobIndex)</div><div class="line"><a name="l00123"></a><span class="lineno">  123</span>&#160;{</div><div class="line"><a name="l00124"></a><span class="lineno">  124</span>&#160;    <span class="keyword">auto</span> nBlobs = layerParam.blobs_size();</div><div class="line"><a name="l00125"></a><span class="lineno">  125</span>&#160;    <span class="keywordflow">if</span> (blobIndex &gt;= armnn::numeric_cast&lt;unsigned int&gt;(nBlobs))</div><div class="line"><a name="l00126"></a><span class="lineno">  126</span>&#160;    {</div><div class="line"><a name="l00127"></a><span class="lineno">  127</span>&#160;        <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_parse_exception.xhtml">ParseException</a>(</div><div class="line"><a name="l00128"></a><span class="lineno">  128</span>&#160;            fmt::format(<span class="stringliteral">&quot;Expected data blob at index {} in layer {} not found. nBlobs={}. {}&quot;</span>,</div><div class="line"><a name="l00129"></a><span class="lineno">  129</span>&#160;                        blobIndex,</div><div class="line"><a name="l00130"></a><span class="lineno">  130</span>&#160;                        layerParam.name(),</div><div class="line"><a name="l00131"></a><span class="lineno">  131</span>&#160;                        nBlobs,</div><div class="line"><a name="l00132"></a><span class="lineno">  132</span>&#160;                        <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l00133"></a><span class="lineno">  133</span>&#160;    }</div><div class="line"><a name="l00134"></a><span class="lineno">  134</span>&#160;</div><div class="line"><a name="l00135"></a><span class="lineno">  135</span>&#160;    <span class="keyword">const</span> BlobProto&amp; blob = layerParam.blobs(armnn::numeric_cast&lt;int&gt;(blobIndex));</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">const</span> <span class="keywordtype">float</span>* arrayPtr = blob.data().data();</div><div class="line"><a name="l00138"></a><span class="lineno">  138</span>&#160;    <span class="keywordflow">return</span> arrayPtr;</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;</div><div class="line"><a name="l00141"></a><span class="lineno">  141</span>&#160;<span class="keywordtype">void</span> GetDataFromBlob(<span class="keyword">const</span> LayerParameter&amp; layerParam, vector&lt;float&gt;&amp; outData, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> blobIndex)</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;    <span class="keyword">auto</span> nBlobs = layerParam.blobs_size();</div><div class="line"><a name="l00144"></a><span class="lineno">  144</span>&#160;    <span class="keywordflow">if</span> (blobIndex &gt;= armnn::numeric_cast&lt;unsigned int&gt;(nBlobs))</div><div class="line"><a name="l00145"></a><span class="lineno">  145</span>&#160;    {</div><div class="line"><a name="l00146"></a><span class="lineno">  146</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="l00147"></a><span class="lineno">  147</span>&#160;            fmt::format(<span class="stringliteral">&quot;Expected data blob at index {} in layer {} not found. {}&quot;</span>,</div><div class="line"><a name="l00148"></a><span class="lineno">  148</span>&#160;                        blobIndex,</div><div class="line"><a name="l00149"></a><span class="lineno">  149</span>&#160;                        layerParam.name(),</div><div class="line"><a name="l00150"></a><span class="lineno">  150</span>&#160;                        <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l00151"></a><span class="lineno">  151</span>&#160;    }</div><div class="line"><a name="l00152"></a><span class="lineno">  152</span>&#160;</div><div class="line"><a name="l00153"></a><span class="lineno">  153</span>&#160;    <span class="keyword">const</span> BlobProto&amp; blob = layerParam.blobs(armnn::numeric_cast&lt;int&gt;(blobIndex));</div><div class="line"><a name="l00154"></a><span class="lineno">  154</span>&#160;</div><div class="line"><a name="l00155"></a><span class="lineno">  155</span>&#160;    <span class="keywordtype">size_t</span> blobSize = <a class="code" href="namespacearmnn.xhtml#a375ca3cff9f1b005d1412dc5f3cf5b6e">armnn::numeric_cast</a>&lt;<span class="keywordtype">size_t</span>&gt;(blob.data_size());</div><div class="line"><a name="l00156"></a><span class="lineno">  156</span>&#160;    <span class="keywordflow">if</span> (blobSize != outData.size())</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;        <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_parse_exception.xhtml">ParseException</a>(</div><div class="line"><a name="l00159"></a><span class="lineno">  159</span>&#160;            fmt::format(<span class="stringliteral">&quot;Data blob at index {} in layer {} has an unexpected size. &quot;</span></div><div class="line"><a name="l00160"></a><span class="lineno">  160</span>&#160;                        <span class="stringliteral">&quot;Expected {} elements but got {} elements. {}&quot;</span>,</div><div class="line"><a name="l00161"></a><span class="lineno">  161</span>&#160;                        blobIndex,</div><div class="line"><a name="l00162"></a><span class="lineno">  162</span>&#160;                        layerParam.name(),</div><div class="line"><a name="l00163"></a><span class="lineno">  163</span>&#160;                        outData.size(),</div><div class="line"><a name="l00164"></a><span class="lineno">  164</span>&#160;                        blobSize,</div><div class="line"><a name="l00165"></a><span class="lineno">  165</span>&#160;                        <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l00166"></a><span class="lineno">  166</span>&#160;    }</div><div class="line"><a name="l00167"></a><span class="lineno">  167</span>&#160;</div><div class="line"><a name="l00168"></a><span class="lineno">  168</span>&#160;    <span class="keywordtype">int</span> outSizeInt = <a class="code" href="namespacearmnn.xhtml#a375ca3cff9f1b005d1412dc5f3cf5b6e">armnn::numeric_cast</a>&lt;<span class="keywordtype">int</span>&gt;(outData.size());</div><div class="line"><a name="l00169"></a><span class="lineno">  169</span>&#160;    <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; outSizeInt; ++i)</div><div class="line"><a name="l00170"></a><span class="lineno">  170</span>&#160;    {</div><div class="line"><a name="l00171"></a><span class="lineno">  171</span>&#160;        outData[<span class="keyword">static_cast&lt;</span><span class="keywordtype">size_t</span><span class="keyword">&gt;</span>(i)] = blob.data(i);</div><div class="line"><a name="l00172"></a><span class="lineno">  172</span>&#160;    }</div><div class="line"><a name="l00173"></a><span class="lineno">  173</span>&#160;}</div><div class="line"><a name="l00174"></a><span class="lineno">  174</span>&#160;</div><div class="line"><a name="l00175"></a><span class="lineno">  175</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l00176"></a><span class="lineno">  176</span>&#160;<span class="keywordtype">size_t</span> SizeOfVectorData(<span class="keyword">const</span> vector&lt;T&gt;&amp; vec)</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> vec.size() * <span class="keyword">sizeof</span>(T);</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">void</span> ValidateNumInputsOutputs(<span class="keyword">const</span> caffe::LayerParameter&amp; layerParameter,</div><div class="line"><a name="l00182"></a><span class="lineno">  182</span>&#160;                              <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>                 numInputs,</div><div class="line"><a name="l00183"></a><span class="lineno">  183</span>&#160;                              <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>                 numOutputs)</div><div class="line"><a name="l00184"></a><span class="lineno">  184</span>&#160;{</div><div class="line"><a name="l00185"></a><span class="lineno">  185</span>&#160;    <span class="keywordtype">int</span> numInputsActual = layerParameter.bottom_size();</div><div class="line"><a name="l00186"></a><span class="lineno">  186</span>&#160;    <span class="keywordflow">if</span> (numInputs != armnn::numeric_cast&lt;unsigned int&gt;(numInputsActual))</div><div class="line"><a name="l00187"></a><span class="lineno">  187</span>&#160;    {</div><div class="line"><a name="l00188"></a><span class="lineno">  188</span>&#160;        <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_parse_exception.xhtml">ParseException</a>(</div><div class="line"><a name="l00189"></a><span class="lineno">  189</span>&#160;            fmt::format(<span class="stringliteral">&quot;Invalid number of inputs requested {} for layer {} &quot;</span></div><div class="line"><a name="l00190"></a><span class="lineno">  190</span>&#160;                        <span class="stringliteral">&quot;while only {} present. {}&quot;</span>,</div><div class="line"><a name="l00191"></a><span class="lineno">  191</span>&#160;                        numInputs,</div><div class="line"><a name="l00192"></a><span class="lineno">  192</span>&#160;                        layerParameter.name(),</div><div class="line"><a name="l00193"></a><span class="lineno">  193</span>&#160;                        numInputsActual,</div><div class="line"><a name="l00194"></a><span class="lineno">  194</span>&#160;                        <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l00195"></a><span class="lineno">  195</span>&#160;    }</div><div class="line"><a name="l00196"></a><span class="lineno">  196</span>&#160;</div><div class="line"><a name="l00197"></a><span class="lineno">  197</span>&#160;    <span class="keywordtype">int</span> numOutputsActual = layerParameter.top_size();</div><div class="line"><a name="l00198"></a><span class="lineno">  198</span>&#160;    <span class="keywordflow">if</span> (numOutputs != armnn::numeric_cast&lt;unsigned int&gt;(numOutputsActual))</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">throw</span> <a class="code" href="classarmnn_1_1_parse_exception.xhtml">ParseException</a>(</div><div class="line"><a name="l00201"></a><span class="lineno">  201</span>&#160;            fmt::format(<span class="stringliteral">&quot;Invalid number of outputs requested {} for layer {} &quot;</span></div><div class="line"><a name="l00202"></a><span class="lineno">  202</span>&#160;                        <span class="stringliteral">&quot;while only {} present. {}&quot;</span>,</div><div class="line"><a name="l00203"></a><span class="lineno">  203</span>&#160;                        numOutputs,</div><div class="line"><a name="l00204"></a><span class="lineno">  204</span>&#160;                        layerParameter.name(),</div><div class="line"><a name="l00205"></a><span class="lineno">  205</span>&#160;                        numOutputsActual,</div><div class="line"><a name="l00206"></a><span class="lineno">  206</span>&#160;                        <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l00207"></a><span class="lineno">  207</span>&#160;    }</div><div class="line"><a name="l00208"></a><span class="lineno">  208</span>&#160;}</div><div class="line"><a name="l00209"></a><span class="lineno">  209</span>&#160;</div><div class="line"><a name="l00210"></a><span class="lineno">  210</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">typename</span> ParamType, <span class="keyword">typename</span> ExtractOptional, <span class="keyword">typename</span> ExtractFallback, <span class="keyword">typename</span> ValueType&gt;</div><div class="line"><a name="l00211"></a><span class="lineno">  211</span>&#160;ValueType GetOptionalWithFallback(<span class="keyword">const</span> ParamType&amp; param,</div><div class="line"><a name="l00212"></a><span class="lineno">  212</span>&#160;                                  ExtractOptional extractOptional,</div><div class="line"><a name="l00213"></a><span class="lineno">  213</span>&#160;                                  ExtractFallback extractFallback,</div><div class="line"><a name="l00214"></a><span class="lineno">  214</span>&#160;                                  ValueType defaultValue)</div><div class="line"><a name="l00215"></a><span class="lineno">  215</span>&#160;{</div><div class="line"><a name="l00216"></a><span class="lineno">  216</span>&#160;    <span class="keyword">auto</span> optValue = extractOptional(param, defaultValue);</div><div class="line"><a name="l00217"></a><span class="lineno">  217</span>&#160;    <span class="keywordflow">if</span> (optValue.first)</div><div class="line"><a name="l00218"></a><span class="lineno">  218</span>&#160;    {</div><div class="line"><a name="l00219"></a><span class="lineno">  219</span>&#160;        <span class="keywordflow">return</span> optValue.second;</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="keyword">auto</span> fallbackValue = extractFallback(param, defaultValue);</div><div class="line"><a name="l00222"></a><span class="lineno">  222</span>&#160;    <span class="keywordflow">return</span> fallbackValue.second;</div><div class="line"><a name="l00223"></a><span class="lineno">  223</span>&#160;}</div><div class="line"><a name="l00224"></a><span class="lineno">  224</span>&#160;</div><div class="line"><a name="l00225"></a><span class="lineno"><a class="line" href="_caffe_parser_8cpp.xhtml#a7553d91772274ed9b103824bbf7f75a5">  225</a></span>&#160;<span class="preprocessor">#define GET_OPTIONAL_WITH_VECTOR_FALLBACK(PARAM, \</span></div><div class="line"><a name="l00226"></a><span class="lineno">  226</span>&#160;<span class="preprocessor">                                          PARAM_TYPE, \</span></div><div class="line"><a name="l00227"></a><span class="lineno">  227</span>&#160;<span class="preprocessor">                                          OPTIONAL_VALUE, \</span></div><div class="line"><a name="l00228"></a><span class="lineno">  228</span>&#160;<span class="preprocessor">                                          FALLBACK_VECTOR, \</span></div><div class="line"><a name="l00229"></a><span class="lineno">  229</span>&#160;<span class="preprocessor">                                          VALUE_TYPE, \</span></div><div class="line"><a name="l00230"></a><span class="lineno">  230</span>&#160;<span class="preprocessor">                                          DEFAULT_VALUE) \</span></div><div class="line"><a name="l00231"></a><span class="lineno">  231</span>&#160;<span class="preprocessor">    GetOptionalWithFallback( \</span></div><div class="line"><a name="l00232"></a><span class="lineno">  232</span>&#160;<span class="preprocessor">        PARAM, \</span></div><div class="line"><a name="l00233"></a><span class="lineno">  233</span>&#160;<span class="preprocessor">        [](const PARAM_TYPE &amp; param, VALUE_TYPE defaultValue) \</span></div><div class="line"><a name="l00234"></a><span class="lineno">  234</span>&#160;<span class="preprocessor">        { \</span></div><div class="line"><a name="l00235"></a><span class="lineno">  235</span>&#160;<span class="preprocessor">            if (param.has_##OPTIONAL_VALUE ()) \</span></div><div class="line"><a name="l00236"></a><span class="lineno">  236</span>&#160;<span class="preprocessor">            { \</span></div><div class="line"><a name="l00237"></a><span class="lineno">  237</span>&#160;<span class="preprocessor">                return std::make_pair(true, param.OPTIONAL_VALUE ()); \</span></div><div class="line"><a name="l00238"></a><span class="lineno">  238</span>&#160;<span class="preprocessor">            } \</span></div><div class="line"><a name="l00239"></a><span class="lineno">  239</span>&#160;<span class="preprocessor">            else \</span></div><div class="line"><a name="l00240"></a><span class="lineno">  240</span>&#160;<span class="preprocessor">            { \</span></div><div class="line"><a name="l00241"></a><span class="lineno">  241</span>&#160;<span class="preprocessor">                return std::make_pair(false, defaultValue); \</span></div><div class="line"><a name="l00242"></a><span class="lineno">  242</span>&#160;<span class="preprocessor">            } \</span></div><div class="line"><a name="l00243"></a><span class="lineno">  243</span>&#160;<span class="preprocessor">        }, \</span></div><div class="line"><a name="l00244"></a><span class="lineno">  244</span>&#160;<span class="preprocessor">        [](const PARAM_TYPE &amp; param, VALUE_TYPE defaultValue) \</span></div><div class="line"><a name="l00245"></a><span class="lineno">  245</span>&#160;<span class="preprocessor">        { \</span></div><div class="line"><a name="l00246"></a><span class="lineno">  246</span>&#160;<span class="preprocessor">            if (param.FALLBACK_VECTOR##_size() &gt; 0) \</span></div><div class="line"><a name="l00247"></a><span class="lineno">  247</span>&#160;<span class="preprocessor">            { \</span></div><div class="line"><a name="l00248"></a><span class="lineno">  248</span>&#160;<span class="preprocessor">                return std::make_pair(true, (param.FALLBACK_VECTOR ()).Get(0)); \</span></div><div class="line"><a name="l00249"></a><span class="lineno">  249</span>&#160;<span class="preprocessor">            } \</span></div><div class="line"><a name="l00250"></a><span class="lineno">  250</span>&#160;<span class="preprocessor">            else \</span></div><div class="line"><a name="l00251"></a><span class="lineno">  251</span>&#160;<span class="preprocessor">            { \</span></div><div class="line"><a name="l00252"></a><span class="lineno">  252</span>&#160;<span class="preprocessor">                return std::make_pair(false, defaultValue); \</span></div><div class="line"><a name="l00253"></a><span class="lineno">  253</span>&#160;<span class="preprocessor">            } \</span></div><div class="line"><a name="l00254"></a><span class="lineno">  254</span>&#160;<span class="preprocessor">        }, \</span></div><div class="line"><a name="l00255"></a><span class="lineno">  255</span>&#160;<span class="preprocessor">        DEFAULT_VALUE)</span></div><div class="line"><a name="l00256"></a><span class="lineno">  256</span>&#160;</div><div class="line"><a name="l00257"></a><span class="lineno"><a class="line" href="_caffe_parser_8cpp.xhtml#a69f4a692d0095f6b19b0cd99cd75e465">  257</a></span>&#160;<span class="preprocessor">#define GET_OPTIONAL_WITH_FALLBACK(PARAM, \</span></div><div class="line"><a name="l00258"></a><span class="lineno">  258</span>&#160;<span class="preprocessor">                                   PARAM_TYPE, \</span></div><div class="line"><a name="l00259"></a><span class="lineno">  259</span>&#160;<span class="preprocessor">                                   OPTIONAL_VALUE, \</span></div><div class="line"><a name="l00260"></a><span class="lineno">  260</span>&#160;<span class="preprocessor">                                   FALLBACK_VALUE, \</span></div><div class="line"><a name="l00261"></a><span class="lineno">  261</span>&#160;<span class="preprocessor">                                   VALUE_TYPE, \</span></div><div class="line"><a name="l00262"></a><span class="lineno">  262</span>&#160;<span class="preprocessor">                                   DEFAULT_VALUE) \</span></div><div class="line"><a name="l00263"></a><span class="lineno">  263</span>&#160;<span class="preprocessor">    GetOptionalWithFallback( \</span></div><div class="line"><a name="l00264"></a><span class="lineno">  264</span>&#160;<span class="preprocessor">        PARAM, \</span></div><div class="line"><a name="l00265"></a><span class="lineno">  265</span>&#160;<span class="preprocessor">        [](const PARAM_TYPE &amp; param, VALUE_TYPE defaultValue) \</span></div><div class="line"><a name="l00266"></a><span class="lineno">  266</span>&#160;<span class="preprocessor">        { \</span></div><div class="line"><a name="l00267"></a><span class="lineno">  267</span>&#160;<span class="preprocessor">            if (param.has_##OPTIONAL_VALUE ()) \</span></div><div class="line"><a name="l00268"></a><span class="lineno">  268</span>&#160;<span class="preprocessor">            { \</span></div><div class="line"><a name="l00269"></a><span class="lineno">  269</span>&#160;<span class="preprocessor">                return std::make_pair(true, param.OPTIONAL_VALUE ()); \</span></div><div class="line"><a name="l00270"></a><span class="lineno">  270</span>&#160;<span class="preprocessor">            } \</span></div><div class="line"><a name="l00271"></a><span class="lineno">  271</span>&#160;<span class="preprocessor">            else \</span></div><div class="line"><a name="l00272"></a><span class="lineno">  272</span>&#160;<span class="preprocessor">            { \</span></div><div class="line"><a name="l00273"></a><span class="lineno">  273</span>&#160;<span class="preprocessor">                return std::make_pair(false, defaultValue); \</span></div><div class="line"><a name="l00274"></a><span class="lineno">  274</span>&#160;<span class="preprocessor">            } \</span></div><div class="line"><a name="l00275"></a><span class="lineno">  275</span>&#160;<span class="preprocessor">        }, \</span></div><div class="line"><a name="l00276"></a><span class="lineno">  276</span>&#160;<span class="preprocessor">        [](const PARAM_TYPE &amp; param, VALUE_TYPE defaultValue) \</span></div><div class="line"><a name="l00277"></a><span class="lineno">  277</span>&#160;<span class="preprocessor">        { \</span></div><div class="line"><a name="l00278"></a><span class="lineno">  278</span>&#160;<span class="preprocessor">            if (param.has_##FALLBACK_VALUE ()) \</span></div><div class="line"><a name="l00279"></a><span class="lineno">  279</span>&#160;<span class="preprocessor">            { \</span></div><div class="line"><a name="l00280"></a><span class="lineno">  280</span>&#160;<span class="preprocessor">                return std::make_pair(true, param.FALLBACK_VALUE ()); \</span></div><div class="line"><a name="l00281"></a><span class="lineno">  281</span>&#160;<span class="preprocessor">            } \</span></div><div class="line"><a name="l00282"></a><span class="lineno">  282</span>&#160;<span class="preprocessor">            else \</span></div><div class="line"><a name="l00283"></a><span class="lineno">  283</span>&#160;<span class="preprocessor">            { \</span></div><div class="line"><a name="l00284"></a><span class="lineno">  284</span>&#160;<span class="preprocessor">                return std::make_pair(false, defaultValue); \</span></div><div class="line"><a name="l00285"></a><span class="lineno">  285</span>&#160;<span class="preprocessor">            } \</span></div><div class="line"><a name="l00286"></a><span class="lineno">  286</span>&#160;<span class="preprocessor">        }, \</span></div><div class="line"><a name="l00287"></a><span class="lineno">  287</span>&#160;<span class="preprocessor">        DEFAULT_VALUE)</span></div><div class="line"><a name="l00288"></a><span class="lineno">  288</span>&#160;</div><div class="line"><a name="l00289"></a><span class="lineno">  289</span>&#160;} <span class="comment">// namespace &lt;anonymous&gt;</span></div><div class="line"><a name="l00290"></a><span class="lineno">  290</span>&#160;</div><div class="line"><a name="l00291"></a><span class="lineno">  291</span>&#160;<span class="keyword">const</span> std::map&lt;std::string, ICaffeParser::CaffeParserImpl::OperationParsingFunction&gt;</div><div class="line"><a name="l00292"></a><span class="lineno">  292</span>&#160;    ICaffeParser::CaffeParserImpl::ms_CaffeLayerNameToParsingFunctions = {</div><div class="line"><a name="l00293"></a><span class="lineno">  293</span>&#160;    { <span class="stringliteral">&quot;Input&quot;</span>,        &amp;CaffeParserImpl::ParseInputLayer },</div><div class="line"><a name="l00294"></a><span class="lineno">  294</span>&#160;    { <span class="stringliteral">&quot;Convolution&quot;</span>,  &amp;CaffeParserImpl::ParseConvLayer },</div><div class="line"><a name="l00295"></a><span class="lineno">  295</span>&#160;    { <span class="stringliteral">&quot;Deconvolution&quot;</span>,&amp;CaffeParserImpl::ParseDeconvLayer },</div><div class="line"><a name="l00296"></a><span class="lineno">  296</span>&#160;    { <span class="stringliteral">&quot;Pooling&quot;</span>,      &amp;CaffeParserImpl::ParsePoolingLayer },</div><div class="line"><a name="l00297"></a><span class="lineno">  297</span>&#160;    { <span class="stringliteral">&quot;ReLU&quot;</span>,         &amp;CaffeParserImpl::ParseReluLayer },</div><div class="line"><a name="l00298"></a><span class="lineno">  298</span>&#160;    { <span class="stringliteral">&quot;LRN&quot;</span>,          &amp;CaffeParserImpl::ParseLRNLayer },</div><div class="line"><a name="l00299"></a><span class="lineno">  299</span>&#160;    { <span class="stringliteral">&quot;InnerProduct&quot;</span>, &amp;CaffeParserImpl::ParseInnerProductLayer },</div><div class="line"><a name="l00300"></a><span class="lineno">  300</span>&#160;    { <span class="stringliteral">&quot;Softmax&quot;</span>,      &amp;CaffeParserImpl::ParseSoftmaxLayer },</div><div class="line"><a name="l00301"></a><span class="lineno">  301</span>&#160;    { <span class="stringliteral">&quot;Eltwise&quot;</span>,      &amp;CaffeParserImpl::ParseEltwiseLayer },</div><div class="line"><a name="l00302"></a><span class="lineno">  302</span>&#160;    { <span class="stringliteral">&quot;Concat&quot;</span>,       &amp;CaffeParserImpl::ParseConcatLayer },</div><div class="line"><a name="l00303"></a><span class="lineno">  303</span>&#160;    { <span class="stringliteral">&quot;BatchNorm&quot;</span>,    &amp;CaffeParserImpl::ParseBatchNormLayer },</div><div class="line"><a name="l00304"></a><span class="lineno">  304</span>&#160;    { <span class="stringliteral">&quot;Scale&quot;</span>,        &amp;CaffeParserImpl::ParseScaleLayer },</div><div class="line"><a name="l00305"></a><span class="lineno">  305</span>&#160;    { <span class="stringliteral">&quot;Split&quot;</span>,        &amp;CaffeParserImpl::ParseSplitLayer },</div><div class="line"><a name="l00306"></a><span class="lineno">  306</span>&#160;    { <span class="stringliteral">&quot;Dropout&quot;</span>,      &amp;CaffeParserImpl::ParseDropoutLayer},</div><div class="line"><a name="l00307"></a><span class="lineno">  307</span>&#160;    { <span class="stringliteral">&quot;ArgMax&quot;</span>,       &amp;CaffeParserImpl::ParseArgmaxLayer},</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"><a class="line" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a4ddfa6cb51f928114a8151b8f455f115">  310</a></span>&#160;ICaffeParser::CaffeParserImpl::CaffeParserImpl()</div><div class="line"><a name="l00311"></a><span class="lineno">  311</span>&#160;    : m_Network(nullptr, nullptr)</div><div class="line"><a name="l00312"></a><span class="lineno">  312</span>&#160;{</div><div class="line"><a name="l00313"></a><span class="lineno">  313</span>&#160;</div><div class="line"><a name="l00314"></a><span class="lineno">  314</span>&#160;}</div><div class="line"><a name="l00315"></a><span class="lineno">  315</span>&#160;</div><div class="line"><a name="l00316"></a><span class="lineno"><a class="line" href="classarmnn_caffe_parser_1_1_caffe_parser.xhtml#a82fc903eb5648250a6d82371a94772a3">  316</a></span>&#160;<a class="code" href="classarmnn_caffe_parser_1_1_caffe_parser.xhtml#a82fc903eb5648250a6d82371a94772a3">CaffeParser::CaffeParser</a>()</div><div class="line"><a name="l00317"></a><span class="lineno">  317</span>&#160;: <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a4ddfa6cb51f928114a8151b8f455f115">CaffeParserImpl</a>()</div><div class="line"><a name="l00318"></a><span class="lineno">  318</span>&#160;{</div><div class="line"><a name="l00319"></a><span class="lineno">  319</span>&#160;</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;</div><div class="line"><a name="l00322"></a><span class="lineno"><a class="line" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a8b053a6c449d0814cc831c916c126668">  322</a></span>&#160;<a class="code" href="namespacearmnn.xhtml#a280670a263dc4fd40491f6d0a2737f44">BindingPointInfo</a> <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a8b053a6c449d0814cc831c916c126668">ICaffeParser::CaffeParserImpl::GetNetworkInputBindingInfo</a>(<span class="keyword">const</span> std::string&amp; name)<span class="keyword"> const</span></div><div class="line"><a name="l00323"></a><span class="lineno">  323</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l00324"></a><span class="lineno">  324</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#afb7e4da478bab76261963479baad5788">GetBindingInfo</a>(name, <span class="stringliteral">&quot;input&quot;</span>, <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#ac62e2558c14e01605f2b4e1e21cdd1e8">m_NetworkInputsBindingInfo</a>);</div><div class="line"><a name="l00325"></a><span class="lineno">  325</span>&#160;}</div><div class="line"><a name="l00326"></a><span class="lineno">  326</span>&#160;</div><div class="line"><a name="l00327"></a><span class="lineno"><a class="line" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a4b1fdcb1985af12dd1848a9ffa5d3271">  327</a></span>&#160;<a class="code" href="namespacearmnn.xhtml#a280670a263dc4fd40491f6d0a2737f44">BindingPointInfo</a> <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a4b1fdcb1985af12dd1848a9ffa5d3271">ICaffeParser::CaffeParserImpl::GetNetworkOutputBindingInfo</a>(<span class="keyword">const</span> std::string&amp; name)<span class="keyword"> const</span></div><div class="line"><a name="l00328"></a><span class="lineno">  328</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l00329"></a><span class="lineno">  329</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#afb7e4da478bab76261963479baad5788">GetBindingInfo</a>(name, <span class="stringliteral">&quot;output&quot;</span>, <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a62d6d6cba9ed0d3ad63fffb40aec86b5">m_NetworkOutputsBindingInfo</a>);</div><div class="line"><a name="l00330"></a><span class="lineno">  330</span>&#160;}</div><div class="line"><a name="l00331"></a><span class="lineno">  331</span>&#160;</div><div class="line"><a name="l00332"></a><span class="lineno"><a class="line" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#afb7e4da478bab76261963479baad5788">  332</a></span>&#160;std::pair&lt;armnn::LayerBindingId, armnn::TensorInfo&gt; <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#afb7e4da478bab76261963479baad5788">ICaffeParser::CaffeParserImpl::GetBindingInfo</a>(</div><div class="line"><a name="l00333"></a><span class="lineno">  333</span>&#160;    <span class="keyword">const</span> std::string&amp; layerName,</div><div class="line"><a name="l00334"></a><span class="lineno">  334</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">char</span>* bindingPointDesc,</div><div class="line"><a name="l00335"></a><span class="lineno">  335</span>&#160;    <span class="keyword">const</span> std::unordered_map&lt;std::string, BindingPointInfo&gt;&amp; nameToBindingInfo)</div><div class="line"><a name="l00336"></a><span class="lineno">  336</span>&#160;{</div><div class="line"><a name="l00337"></a><span class="lineno">  337</span>&#160;    <span class="keyword">auto</span> it = nameToBindingInfo.find(layerName);</div><div class="line"><a name="l00338"></a><span class="lineno">  338</span>&#160;    <span class="keywordflow">if</span> (it == nameToBindingInfo.end())</div><div class="line"><a name="l00339"></a><span class="lineno">  339</span>&#160;    {</div><div class="line"><a name="l00340"></a><span class="lineno">  340</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="l00341"></a><span class="lineno">  341</span>&#160;            fmt::format(<span class="stringliteral">&quot;Unknown binding {} for layer &#39;{}&#39;. {}&quot;</span>,</div><div class="line"><a name="l00342"></a><span class="lineno">  342</span>&#160;                        bindingPointDesc,</div><div class="line"><a name="l00343"></a><span class="lineno">  343</span>&#160;                        layerName,</div><div class="line"><a name="l00344"></a><span class="lineno">  344</span>&#160;                        <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</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">return</span> it-&gt;second;</div><div class="line"><a name="l00347"></a><span class="lineno">  347</span>&#160;}</div><div class="line"><a name="l00348"></a><span class="lineno">  348</span>&#160;</div><div class="line"><a name="l00349"></a><span class="lineno"><a class="line" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a77e6c08b48c99fafa560805270503856">  349</a></span>&#160;<a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a77e6c08b48c99fafa560805270503856">ICaffeParser::CaffeParserImpl::BlobShapeToTensorInfo</a>(<span class="keyword">const</span> caffe::BlobShape&amp; blobShape)<span class="keyword"> const</span></div><div class="line"><a name="l00350"></a><span class="lineno">  350</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l00351"></a><span class="lineno">  351</span>&#160;    std::vector&lt;unsigned int&gt; shape;</div><div class="line"><a name="l00352"></a><span class="lineno">  352</span>&#160;    <span class="keywordflow">for</span> (<span class="keywordtype">int</span> j = 0; j &lt; blobShape.dim_size(); ++j)</div><div class="line"><a name="l00353"></a><span class="lineno">  353</span>&#160;    {</div><div class="line"><a name="l00354"></a><span class="lineno">  354</span>&#160;        shape.push_back(static_cast&lt;unsigned int&gt;(blobShape.dim(j)));</div><div class="line"><a name="l00355"></a><span class="lineno">  355</span>&#160;    }</div><div class="line"><a name="l00356"></a><span class="lineno">  356</span>&#160;</div><div class="line"><a name="l00357"></a><span class="lineno">  357</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a>(armnn::numeric_cast&lt;unsigned int&gt;(shape.size()), shape.data(), DataType::Float32);</div><div class="line"><a name="l00358"></a><span class="lineno">  358</span>&#160;}</div><div class="line"><a name="l00359"></a><span class="lineno">  359</span>&#160;</div><div class="line"><a name="l00360"></a><span class="lineno"><a class="line" href="namespacearmnn_caffe_parser.xhtml#af3fde7630e7c9df35cae9ed2b435dbed">  360</a></span>&#160;BlobShape <a class="code" href="namespacearmnn_caffe_parser.xhtml#af3fde7630e7c9df35cae9ed2b435dbed">TensorDescToBlobShape</a>(<span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a>&amp; desc)</div><div class="line"><a name="l00361"></a><span class="lineno">  361</span>&#160;{</div><div class="line"><a name="l00362"></a><span class="lineno">  362</span>&#160;    BlobShape ret;</div><div class="line"><a name="l00363"></a><span class="lineno">  363</span>&#160;    <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i = 0; i &lt; desc.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a157e27d41e9f6b21f0d3c025fa47dc24">GetNumDimensions</a>(); ++i)</div><div class="line"><a name="l00364"></a><span class="lineno">  364</span>&#160;    {</div><div class="line"><a name="l00365"></a><span class="lineno">  365</span>&#160;        ret.add_dim(i);</div><div class="line"><a name="l00366"></a><span class="lineno">  366</span>&#160;        ret.set_dim(armnn::numeric_cast&lt;int&gt;(i), desc.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a8b5d0f8a24e9d9238f412260a552acf8">GetShape</a>()[i]);</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">  368</span>&#160;</div><div class="line"><a name="l00369"></a><span class="lineno">  369</span>&#160;    <span class="keywordflow">return</span> ret;</div><div class="line"><a name="l00370"></a><span class="lineno">  370</span>&#160;}</div><div class="line"><a name="l00371"></a><span class="lineno">  371</span>&#160;</div><div class="line"><a name="l00372"></a><span class="lineno">  372</span>&#160;<span class="comment">// Note: can move to CaffeParser when/if we optimise the text/string format</span></div><div class="line"><a name="l00373"></a><span class="lineno">  373</span>&#160;<span class="comment">//       to load on a layer by layer basis</span></div><div class="line"><a name="l00374"></a><span class="lineno"><a class="line" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a2f8fbd66c1a39a06d61fcb6536387d64">  374</a></span>&#160;vector&lt;const LayerParameter*&gt; <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a2f8fbd66c1a39a06d61fcb6536387d64">ICaffeParser::CaffeParserImpl::GetInputs</a>(<span class="keyword">const</span> LayerParameter&amp; layerParam)</div><div class="line"><a name="l00375"></a><span class="lineno">  375</span>&#160;{</div><div class="line"><a name="l00376"></a><span class="lineno">  376</span>&#160;    std::vector&lt;const caffe::LayerParameter*&gt; ret;</div><div class="line"><a name="l00377"></a><span class="lineno">  377</span>&#160;    ret.reserve(armnn::numeric_cast&lt;size_t&gt;(layerParam.bottom_size()));</div><div class="line"><a name="l00378"></a><span class="lineno">  378</span>&#160;    <span class="keywordflow">for</span> (<span class="keywordtype">int</span> j = 0; j &lt; layerParam.bottom_size(); ++j)</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;        std::string inputName = layerParam.bottom(j);</div><div class="line"><a name="l00381"></a><span class="lineno">  381</span>&#160;        <span class="keyword">auto</span> inputIt = <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a1424f1bfbfc81d317b51053bbb315ef1">m_CaffeLayersByTopName</a>.find(inputName);</div><div class="line"><a name="l00382"></a><span class="lineno">  382</span>&#160;        <span class="keywordflow">if</span> (inputIt == <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a1424f1bfbfc81d317b51053bbb315ef1">m_CaffeLayersByTopName</a>.end())</div><div class="line"><a name="l00383"></a><span class="lineno">  383</span>&#160;        {</div><div class="line"><a name="l00384"></a><span class="lineno">  384</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="l00385"></a><span class="lineno">  385</span>&#160;                fmt::format(<span class="stringliteral">&quot;Can&#39;t find Caffe layer with top called &#39;{}&#39;, &quot;</span></div><div class="line"><a name="l00386"></a><span class="lineno">  386</span>&#160;                            <span class="stringliteral">&quot;which is listed as an input of &#39;{}&#39;. {}&quot;</span>,</div><div class="line"><a name="l00387"></a><span class="lineno">  387</span>&#160;                            inputName,</div><div class="line"><a name="l00388"></a><span class="lineno">  388</span>&#160;                            layerParam.name(),</div><div class="line"><a name="l00389"></a><span class="lineno">  389</span>&#160;                            <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l00390"></a><span class="lineno">  390</span>&#160;        }</div><div class="line"><a name="l00391"></a><span class="lineno">  391</span>&#160;        ret.push_back(inputIt-&gt;second);</div><div class="line"><a name="l00392"></a><span class="lineno">  392</span>&#160;    }</div><div class="line"><a name="l00393"></a><span class="lineno">  393</span>&#160;</div><div class="line"><a name="l00394"></a><span class="lineno">  394</span>&#160;    <span class="keywordflow">return</span> ret;</div><div class="line"><a name="l00395"></a><span class="lineno">  395</span>&#160;}</div><div class="line"><a name="l00396"></a><span class="lineno">  396</span>&#160;</div><div class="line"><a name="l00397"></a><span class="lineno"><a class="line" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a3a2636dd8414f2bb62c5fa097bdc9791">  397</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a3a2636dd8414f2bb62c5fa097bdc9791">ICaffeParser::CaffeParserImpl::ParseInputLayer</a>(<span class="keyword">const</span> LayerParameter&amp; layerParam)</div><div class="line"><a name="l00398"></a><span class="lineno">  398</span>&#160;{</div><div class="line"><a name="l00399"></a><span class="lineno">  399</span>&#160;    <a class="code" href="_assert_8hpp.xhtml#a5698be69cbd5dfe6c28fcd9867e8cbed">ARMNN_ASSERT</a>(layerParam.type() == <span class="stringliteral">&quot;Input&quot;</span>);</div><div class="line"><a name="l00400"></a><span class="lineno">  400</span>&#160;    ValidateNumInputsOutputs(layerParam, 0, 1);</div><div class="line"><a name="l00401"></a><span class="lineno">  401</span>&#160;</div><div class="line"><a name="l00402"></a><span class="lineno">  402</span>&#160;    <span class="keyword">const</span> InputParameter&amp; param = layerParam.input_param();</div><div class="line"><a name="l00403"></a><span class="lineno">  403</span>&#160;</div><div class="line"><a name="l00404"></a><span class="lineno">  404</span>&#160;    <span class="keyword">const</span> <a class="code" href="namespacearmnn.xhtml#ab8cf8f9fb6792e654c2d8d8382f6f01b">armnn::LayerBindingId</a> inputId = <a class="code" href="namespacearmnn.xhtml#a375ca3cff9f1b005d1412dc5f3cf5b6e">armnn::numeric_cast</a>&lt;<a class="code" href="namespacearmnn.xhtml#ab8cf8f9fb6792e654c2d8d8382f6f01b">armnn::LayerBindingId</a>&gt;(</div><div class="line"><a name="l00405"></a><span class="lineno">  405</span>&#160;        <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#ac62e2558c14e01605f2b4e1e21cdd1e8">m_NetworkInputsBindingInfo</a>.size());</div><div class="line"><a name="l00406"></a><span class="lineno">  406</span>&#160;    <a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml">armnn::IConnectableLayer</a>* <span class="keyword">const</span> inputLayer = <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a2db3ae8d422f17d455e0ba0cb6291d2a">m_Network</a>-&gt;AddInputLayer(inputId, layerParam.name().c_str());</div><div class="line"><a name="l00407"></a><span class="lineno">  407</span>&#160;</div><div class="line"><a name="l00408"></a><span class="lineno">  408</span>&#160;    <span class="comment">// Decides the tensor info for this input. This can be specified in the Caffe network but can also</span></div><div class="line"><a name="l00409"></a><span class="lineno">  409</span>&#160;    <span class="comment">// be overriden by user input (m_inputShapes).</span></div><div class="line"><a name="l00410"></a><span class="lineno">  410</span>&#160;    <a class="code" href="classarmnn_1_1_tensor_info.xhtml">armnn::TensorInfo</a> inputTensorInfo;</div><div class="line"><a name="l00411"></a><span class="lineno">  411</span>&#160;</div><div class="line"><a name="l00412"></a><span class="lineno">  412</span>&#160;    <span class="keyword">const</span> BlobShape* originalShape = param.shape_size() &gt; 0 &amp;&amp; param.shape(0).dim_size() &gt; 0 ?</div><div class="line"><a name="l00413"></a><span class="lineno">  413</span>&#160;        &amp;param.shape(0) : <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00414"></a><span class="lineno">  414</span>&#160;    <span class="keywordflow">if</span> (originalShape)</div><div class="line"><a name="l00415"></a><span class="lineno">  415</span>&#160;    {</div><div class="line"><a name="l00416"></a><span class="lineno">  416</span>&#160;        inputTensorInfo = <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a77e6c08b48c99fafa560805270503856">BlobShapeToTensorInfo</a>(*originalShape);</div><div class="line"><a name="l00417"></a><span class="lineno">  417</span>&#160;    }</div><div class="line"><a name="l00418"></a><span class="lineno">  418</span>&#160;</div><div class="line"><a name="l00419"></a><span class="lineno">  419</span>&#160;    <span class="keyword">auto</span> overrideIt = <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a76ea67f3f7d1d5835c5a92b65dc0854c">m_InputShapes</a>.find(layerParam.name());</div><div class="line"><a name="l00420"></a><span class="lineno">  420</span>&#160;    <span class="keywordflow">if</span> (overrideIt != <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a76ea67f3f7d1d5835c5a92b65dc0854c">m_InputShapes</a>.end())</div><div class="line"><a name="l00421"></a><span class="lineno">  421</span>&#160;    {</div><div class="line"><a name="l00422"></a><span class="lineno">  422</span>&#160;        <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_shape.xhtml">TensorShape</a>&amp; overrideShape = overrideIt-&gt;second;</div><div class="line"><a name="l00423"></a><span class="lineno">  423</span>&#160;        <span class="keywordflow">if</span> (originalShape &amp;&amp;</div><div class="line"><a name="l00424"></a><span class="lineno">  424</span>&#160;            (    originalShape-&gt;dim(1) != overrideShape[1]</div><div class="line"><a name="l00425"></a><span class="lineno">  425</span>&#160;              || originalShape-&gt;dim(2) != overrideShape[2]</div><div class="line"><a name="l00426"></a><span class="lineno">  426</span>&#160;              || originalShape-&gt;dim(3) != overrideShape[3]))</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;            <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_parse_exception.xhtml">ParseException</a>(</div><div class="line"><a name="l00429"></a><span class="lineno">  429</span>&#160;                fmt::format(<span class="stringliteral">&quot;Parsed input shape for &#39;{}&#39; is incompatible with the override provided. {}&quot;</span>,</div><div class="line"><a name="l00430"></a><span class="lineno">  430</span>&#160;                            layerParam.name(),</div><div class="line"><a name="l00431"></a><span class="lineno">  431</span>&#160;                            <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l00432"></a><span class="lineno">  432</span>&#160;        }</div><div class="line"><a name="l00433"></a><span class="lineno">  433</span>&#160;        inputTensorInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#abe8889e8150beef5fd204b2d87b49298">SetShape</a>(overrideShape);</div><div class="line"><a name="l00434"></a><span class="lineno">  434</span>&#160;    }</div><div class="line"><a name="l00435"></a><span class="lineno">  435</span>&#160;    <span class="keywordflow">else</span> <span class="keywordflow">if</span> (!originalShape)</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;        <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_parse_exception.xhtml">ParseException</a>(</div><div class="line"><a name="l00438"></a><span class="lineno">  438</span>&#160;            fmt::format(<span class="stringliteral">&quot;No input descriptor given for &#39;{}&#39; and no input shape found in caffe model. {}&quot;</span>,</div><div class="line"><a name="l00439"></a><span class="lineno">  439</span>&#160;                        layerParam.name(),</div><div class="line"><a name="l00440"></a><span class="lineno">  440</span>&#160;                        <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l00441"></a><span class="lineno">  441</span>&#160;    }</div><div class="line"><a name="l00442"></a><span class="lineno">  442</span>&#160;    <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a2a1112c66d08e3760ecccf39c7854a90">TrackInputBinding</a>(inputLayer, inputId, inputTensorInfo);</div><div class="line"><a name="l00443"></a><span class="lineno">  443</span>&#160;    inputLayer-&gt;GetOutputSlot(0).SetTensorInfo(inputTensorInfo);</div><div class="line"><a name="l00444"></a><span class="lineno">  444</span>&#160;    <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a0767b1c7ee9cbd014fd97c701a954caa">SetArmnnOutputSlotForCaffeTop</a>(layerParam.top(0), inputLayer-&gt;GetOutputSlot(0));</div><div class="line"><a name="l00445"></a><span class="lineno">  445</span>&#160;}</div><div class="line"><a name="l00446"></a><span class="lineno">  446</span>&#160;</div><div class="line"><a name="l00447"></a><span class="lineno"><a class="line" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a9fea304829fe514d664de515ca5c3918">  447</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a9fea304829fe514d664de515ca5c3918">ICaffeParser::CaffeParserImpl::AddConvLayerWithSplits</a>(<span class="keyword">const</span> caffe::LayerParameter&amp; layerParam,</div><div class="line"><a name="l00448"></a><span class="lineno">  448</span>&#160;                                                           <span class="keyword">const</span> <a class="code" href="structarmnn_1_1_convolution2d_descriptor.xhtml">armnn::Convolution2dDescriptor</a>&amp; desc,</div><div class="line"><a name="l00449"></a><span class="lineno">  449</span>&#160;                                                           <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> kernelW,</div><div class="line"><a name="l00450"></a><span class="lineno">  450</span>&#160;                                                           <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> kernelH)</div><div class="line"><a name="l00451"></a><span class="lineno">  451</span>&#160;{</div><div class="line"><a name="l00452"></a><span class="lineno">  452</span>&#160;    <a class="code" href="_assert_8hpp.xhtml#a5698be69cbd5dfe6c28fcd9867e8cbed">ARMNN_ASSERT</a>(layerParam.type() == <span class="stringliteral">&quot;Convolution&quot;</span>);</div><div class="line"><a name="l00453"></a><span class="lineno">  453</span>&#160;    ValidateNumInputsOutputs(layerParam, 1, 1);</div><div class="line"><a name="l00454"></a><span class="lineno">  454</span>&#160;</div><div class="line"><a name="l00455"></a><span class="lineno">  455</span>&#160;    ConvolutionParameter convParam = layerParam.convolution_param();</div><div class="line"><a name="l00456"></a><span class="lineno">  456</span>&#160;    BlobShape inputShape = <a class="code" href="namespacearmnn_caffe_parser.xhtml#af3fde7630e7c9df35cae9ed2b435dbed">TensorDescToBlobShape</a>(<a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a9650b8810d4e6734b255ca25d495fe06">GetArmnnOutputSlotForCaffeTop</a>(layerParam.bottom(0)).<a class="code" href="namespacearmnn_utils.xhtml#acee63cd08da47910fc166a1990988fa8">GetTensorInfo</a>());</div><div class="line"><a name="l00457"></a><span class="lineno">  457</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> numGroups = convParam.has_group() ? convParam.group() : 1;</div><div class="line"><a name="l00458"></a><span class="lineno">  458</span>&#160;</div><div class="line"><a name="l00459"></a><span class="lineno">  459</span>&#160;    <span class="comment">// asusme these were already verified by the caller ParseConvLayer() function</span></div><div class="line"><a name="l00460"></a><span class="lineno">  460</span>&#160;    <a class="code" href="_assert_8hpp.xhtml#a5698be69cbd5dfe6c28fcd9867e8cbed">ARMNN_ASSERT</a>(numGroups &lt; inputShape.dim(1));</div><div class="line"><a name="l00461"></a><span class="lineno">  461</span>&#160;    <a class="code" href="_assert_8hpp.xhtml#a5698be69cbd5dfe6c28fcd9867e8cbed">ARMNN_ASSERT</a>(numGroups &gt; 1);</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;    <span class="comment">// Handle grouping</span></div><div class="line"><a name="l00464"></a><span class="lineno">  464</span>&#160;    <a class="code" href="classarmnn_1_1_i_output_slot.xhtml">armnn::IOutputSlot</a>&amp; inputConnection = <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a9650b8810d4e6734b255ca25d495fe06">GetArmnnOutputSlotForCaffeTop</a>(layerParam.bottom(0));</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;    vector&lt;string&gt; convLayerNames(numGroups);</div><div class="line"><a name="l00467"></a><span class="lineno">  467</span>&#160;    vector&lt;armnn::IConnectableLayer*&gt; convLayers(numGroups);</div><div class="line"><a name="l00468"></a><span class="lineno">  468</span>&#160;    convLayerNames[0] = layerParam.name();</div><div class="line"><a name="l00469"></a><span class="lineno">  469</span>&#160;</div><div class="line"><a name="l00470"></a><span class="lineno">  470</span>&#160;    <span class="comment">// This convolution is to be applied to chunks of the input data so add a splitter layer</span></div><div class="line"><a name="l00471"></a><span class="lineno">  471</span>&#160;</div><div class="line"><a name="l00472"></a><span class="lineno">  472</span>&#160;    <span class="comment">// Redirect the convolution input to the splitter</span></div><div class="line"><a name="l00473"></a><span class="lineno">  473</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> splitterDimSizes[4] = {<span class="keyword">static_cast&lt;</span><span class="keywordtype">unsigned</span> <span class="keywordtype">int</span><span class="keyword">&gt;</span>(inputShape.dim(0)),</div><div class="line"><a name="l00474"></a><span class="lineno">  474</span>&#160;                                        static_cast&lt;unsigned int&gt;(inputShape.dim(1)),</div><div class="line"><a name="l00475"></a><span class="lineno">  475</span>&#160;                                        static_cast&lt;unsigned int&gt;(inputShape.dim(2)),</div><div class="line"><a name="l00476"></a><span class="lineno">  476</span>&#160;                                        static_cast&lt;unsigned int&gt;(inputShape.dim(3))};</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="comment">// Split dimension 1 of the splitter output shape and conv input shapes</span></div><div class="line"><a name="l00479"></a><span class="lineno">  479</span>&#160;    <span class="comment">// according to the number of groups</span></div><div class="line"><a name="l00480"></a><span class="lineno">  480</span>&#160;</div><div class="line"><a name="l00481"></a><span class="lineno">  481</span>&#160;    splitterDimSizes[1] /= numGroups;</div><div class="line"><a name="l00482"></a><span class="lineno">  482</span>&#160;    inputShape.set_dim(1, splitterDimSizes[1]);</div><div class="line"><a name="l00483"></a><span class="lineno">  483</span>&#160;</div><div class="line"><a name="l00484"></a><span class="lineno">  484</span>&#160;    <span class="comment">// This is used to describe how the input is to be split</span></div><div class="line"><a name="l00485"></a><span class="lineno">  485</span>&#160;    <a class="code" href="structarmnn_1_1_views_descriptor.xhtml">ViewsDescriptor</a> splitterDesc(numGroups);</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="comment">// Create an output node for each group, giving each a unique name</span></div><div class="line"><a name="l00488"></a><span class="lineno">  488</span>&#160;    <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> g = 0; g &lt; numGroups; ++g)</div><div class="line"><a name="l00489"></a><span class="lineno">  489</span>&#160;    {</div><div class="line"><a name="l00490"></a><span class="lineno">  490</span>&#160;        <span class="comment">// Work out the names of the splitter layers child convolutions</span></div><div class="line"><a name="l00491"></a><span class="lineno">  491</span>&#160;        stringstream ss;</div><div class="line"><a name="l00492"></a><span class="lineno">  492</span>&#160;        ss &lt;&lt; layerParam.name() &lt;&lt; <span class="stringliteral">&quot;_&quot;</span> &lt;&lt; g;</div><div class="line"><a name="l00493"></a><span class="lineno">  493</span>&#160;        convLayerNames[g] = ss.str();</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;        splitterDesc.<a class="code" href="structarmnn_1_1_views_descriptor.xhtml#a2b125117aa61f9baf3a9cb8658aa61a2">SetViewOriginCoord</a>(g, 1, splitterDimSizes[1] * g);</div><div class="line"><a name="l00496"></a><span class="lineno">  496</span>&#160;</div><div class="line"><a name="l00497"></a><span class="lineno">  497</span>&#160;        <span class="comment">// Set the size of the views.</span></div><div class="line"><a name="l00498"></a><span class="lineno">  498</span>&#160;        <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> dimIdx=0; dimIdx &lt; 4; dimIdx++)</div><div class="line"><a name="l00499"></a><span class="lineno">  499</span>&#160;        {</div><div class="line"><a name="l00500"></a><span class="lineno">  500</span>&#160;            splitterDesc.<a class="code" href="structarmnn_1_1_views_descriptor.xhtml#aae0893695f5803a3517985c7cb1ccb2e">SetViewSize</a>(g, dimIdx, splitterDimSizes[dimIdx]);</div><div class="line"><a name="l00501"></a><span class="lineno">  501</span>&#160;        }</div><div class="line"><a name="l00502"></a><span class="lineno">  502</span>&#160;    }</div><div class="line"><a name="l00503"></a><span class="lineno">  503</span>&#160;</div><div class="line"><a name="l00504"></a><span class="lineno">  504</span>&#160;    <span class="keyword">const</span> std::string splitterLayerName = std::string(<span class="stringliteral">&quot;splitter_&quot;</span>) + layerParam.bottom(0);</div><div class="line"><a name="l00505"></a><span class="lineno">  505</span>&#160;    <a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml">armnn::IConnectableLayer</a>* splitterLayer = <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a2db3ae8d422f17d455e0ba0cb6291d2a">m_Network</a>-&gt;AddSplitterLayer(splitterDesc, splitterLayerName.c_str());</div><div class="line"><a name="l00506"></a><span class="lineno">  506</span>&#160;</div><div class="line"><a name="l00507"></a><span class="lineno">  507</span>&#160;    inputConnection.<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#ac1835f8756a9f03c02fcf9664e3a0fce">Connect</a>(splitterLayer-&gt;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml#a6ec9e0eb66d7d6a01240492a0b18104c">GetInputSlot</a>(0));</div><div class="line"><a name="l00508"></a><span class="lineno">  508</span>&#160;    <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i = 0; i &lt; splitterLayer-&gt;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml#ac2dac3b61c94de52093616be4ab17f8d">GetNumOutputSlots</a>(); i++)</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;        splitterLayer-&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_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a77e6c08b48c99fafa560805270503856">BlobShapeToTensorInfo</a>(inputShape));</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="keywordtype">unsigned</span> <span class="keywordtype">int</span> numFilters = convParam.num_output();</div><div class="line"><a name="l00514"></a><span class="lineno">  514</span>&#160;</div><div class="line"><a name="l00515"></a><span class="lineno">  515</span>&#160;    <span class="comment">// Populates convolution output tensor descriptor dimensions.</span></div><div class="line"><a name="l00516"></a><span class="lineno">  516</span>&#160;    BlobShape outputShape;</div><div class="line"><a name="l00517"></a><span class="lineno">  517</span>&#160;    outputShape.add_dim(0);</div><div class="line"><a name="l00518"></a><span class="lineno">  518</span>&#160;    outputShape.set_dim(0, inputShape.dim(0));</div><div class="line"><a name="l00519"></a><span class="lineno">  519</span>&#160;    outputShape.add_dim(1);</div><div class="line"><a name="l00520"></a><span class="lineno">  520</span>&#160;    <span class="comment">// Ensures that dimension 1 of the convolution output is split according to the number of groups.</span></div><div class="line"><a name="l00521"></a><span class="lineno">  521</span>&#160;    outputShape.set_dim(1, numFilters / numGroups);</div><div class="line"><a name="l00522"></a><span class="lineno">  522</span>&#160;    outputShape.add_dim(2);</div><div class="line"><a name="l00523"></a><span class="lineno">  523</span>&#160;    outputShape.set_dim(</div><div class="line"><a name="l00524"></a><span class="lineno">  524</span>&#160;        2, (static_cast&lt;int&gt;(</div><div class="line"><a name="l00525"></a><span class="lineno">  525</span>&#160;                static_cast&lt;float&gt;(inputShape.dim(2) + 2 * desc.<a class="code" href="structarmnn_1_1_convolution2d_descriptor.xhtml#aa9e49717ebdb741e8c767741647fc618">m_PadBottom</a> - (desc.<a class="code" href="structarmnn_1_1_convolution2d_descriptor.xhtml#aa3c6a77a963a98ccb8ea7b8fd008a8c1">m_DilationX</a> * (kernelH - 1) + 1)) /</div><div class="line"><a name="l00526"></a><span class="lineno">  526</span>&#160;                static_cast&lt;float&gt;(desc.<a class="code" href="structarmnn_1_1_convolution2d_descriptor.xhtml#ac1fe174bbadfb39a2b636940c2e647c8">m_StrideY</a>)) + 1));</div><div class="line"><a name="l00527"></a><span class="lineno">  527</span>&#160;    outputShape.add_dim(3);</div><div class="line"><a name="l00528"></a><span class="lineno">  528</span>&#160;    outputShape.set_dim(</div><div class="line"><a name="l00529"></a><span class="lineno">  529</span>&#160;        3, (static_cast&lt;int&gt;(</div><div class="line"><a name="l00530"></a><span class="lineno">  530</span>&#160;                static_cast&lt;float&gt;(inputShape.dim(3) + 2 * desc.<a class="code" href="structarmnn_1_1_convolution2d_descriptor.xhtml#a002bc30e590d78cbb4f4d12171055ca7">m_PadRight</a> - (desc.<a class="code" href="structarmnn_1_1_convolution2d_descriptor.xhtml#a302b688d88dd73cde0fb1faef6679907">m_DilationY</a> * (kernelW - 1)  + 1)) /</div><div class="line"><a name="l00531"></a><span class="lineno">  531</span>&#160;                static_cast&lt;float&gt;(desc.<a class="code" href="structarmnn_1_1_convolution2d_descriptor.xhtml#afe6a3377c4531315354def9023c8fdda">m_StrideX</a>)) + 1));</div><div class="line"><a name="l00532"></a><span class="lineno">  532</span>&#160;</div><div class="line"><a name="l00533"></a><span class="lineno">  533</span>&#160;    <span class="comment">// Load the weight data for ALL groups</span></div><div class="line"><a name="l00534"></a><span class="lineno">  534</span>&#160;    vector&lt;float&gt; weightData(armnn::numeric_cast&lt;size_t&gt;(numGroups *</div><div class="line"><a name="l00535"></a><span class="lineno">  535</span>&#160;                                                         inputShape.dim(1) *  <span class="comment">// number of input channels</span></div><div class="line"><a name="l00536"></a><span class="lineno">  536</span>&#160;                                                         outputShape.dim(1) * <span class="comment">// number of output channels</span></div><div class="line"><a name="l00537"></a><span class="lineno">  537</span>&#160;                                                         kernelH *</div><div class="line"><a name="l00538"></a><span class="lineno">  538</span>&#160;                                                         kernelW));</div><div class="line"><a name="l00539"></a><span class="lineno">  539</span>&#160;    GetDataFromBlob(layerParam, weightData, 0);</div><div class="line"><a name="l00540"></a><span class="lineno">  540</span>&#160;</div><div class="line"><a name="l00541"></a><span class="lineno">  541</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> weightDimSizes[4] = {</div><div class="line"><a name="l00542"></a><span class="lineno">  542</span>&#160;        <span class="keyword">static_cast&lt;</span><span class="keywordtype">unsigned</span> <span class="keywordtype">int</span><span class="keyword">&gt;</span>(outputShape.dim(1)),</div><div class="line"><a name="l00543"></a><span class="lineno">  543</span>&#160;        static_cast&lt;unsigned int&gt;(inputShape.dim(1)),</div><div class="line"><a name="l00544"></a><span class="lineno">  544</span>&#160;        kernelH,</div><div class="line"><a name="l00545"></a><span class="lineno">  545</span>&#160;        kernelW};</div><div class="line"><a name="l00546"></a><span class="lineno">  546</span>&#160;</div><div class="line"><a name="l00547"></a><span class="lineno">  547</span>&#160;    <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> biasInfo;</div><div class="line"><a name="l00548"></a><span class="lineno">  548</span>&#160;    vector&lt;float&gt; biasData;</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">if</span> (desc.<a class="code" href="structarmnn_1_1_convolution2d_descriptor.xhtml#aea202e14d8874cefd9a0f778022b7e25">m_BiasEnabled</a>)</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;        biasData.resize(armnn::numeric_cast&lt;size_t&gt;(numGroups * outputShape.dim(1)), 1.f);</div><div class="line"><a name="l00553"></a><span class="lineno">  553</span>&#160;        GetDataFromBlob(layerParam, biasData, 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="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> biasDimSizes[1] = {<span class="keyword">static_cast&lt;</span><span class="keywordtype">unsigned</span> <span class="keywordtype">int</span><span class="keyword">&gt;</span>(outputShape.dim(1))};</div><div class="line"><a name="l00556"></a><span class="lineno">  556</span>&#160;        biasInfo = <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a>(1, biasDimSizes, DataType::Float32);</div><div class="line"><a name="l00557"></a><span class="lineno">  557</span>&#160;    }</div><div class="line"><a name="l00558"></a><span class="lineno">  558</span>&#160;</div><div class="line"><a name="l00559"></a><span class="lineno">  559</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> numWeightsPerGroup = <a class="code" href="namespacearmnn.xhtml#a375ca3cff9f1b005d1412dc5f3cf5b6e">armnn::numeric_cast</a>&lt;<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>&gt;(weightData.size()) / numGroups;</div><div class="line"><a name="l00560"></a><span class="lineno">  560</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> numBiasesPerGroup  = <a class="code" href="namespacearmnn.xhtml#a375ca3cff9f1b005d1412dc5f3cf5b6e">armnn::numeric_cast</a>&lt;<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>&gt;(biasData.size()) / numGroups;</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="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> g = 0; g &lt; numGroups; ++g)</div><div class="line"><a name="l00563"></a><span class="lineno">  563</span>&#160;    {</div><div class="line"><a name="l00564"></a><span class="lineno">  564</span>&#160;        <span class="comment">// Sets the slot index, group 0 should be connected to the 0th output of the splitter</span></div><div class="line"><a name="l00565"></a><span class="lineno">  565</span>&#160;        <span class="comment">// group 1 should be connected to the 1st output of the splitter.</span></div><div class="line"><a name="l00566"></a><span class="lineno">  566</span>&#160;</div><div class="line"><a name="l00567"></a><span class="lineno">  567</span>&#160;        <span class="comment">// Pulls out the weights for this group from that loaded from the model file earlier.</span></div><div class="line"><a name="l00568"></a><span class="lineno">  568</span>&#160;        <a class="code" href="classarmnn_1_1_const_tensor.xhtml">ConstTensor</a> weights(<a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a>(4, weightDimSizes, DataType::Float32),</div><div class="line"><a name="l00569"></a><span class="lineno">  569</span>&#160;                            weightData.data() + numWeightsPerGroup * g);</div><div class="line"><a name="l00570"></a><span class="lineno">  570</span>&#160;</div><div class="line"><a name="l00571"></a><span class="lineno">  571</span>&#160;        <a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml">IConnectableLayer</a>* convLayer = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00572"></a><span class="lineno">  572</span>&#160;        <a class="code" href="classarmnn_1_1_optional.xhtml">Optional&lt;ConstTensor&gt;</a> optionalBiases;</div><div class="line"><a name="l00573"></a><span class="lineno">  573</span>&#160;        <span class="keywordflow">if</span> (desc.<a class="code" href="structarmnn_1_1_convolution2d_descriptor.xhtml#aea202e14d8874cefd9a0f778022b7e25">m_BiasEnabled</a>)</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;            <span class="comment">// Pulls out the biases for this group from that loaded from the model file earlier.</span></div><div class="line"><a name="l00576"></a><span class="lineno">  576</span>&#160;            <a class="code" href="classarmnn_1_1_const_tensor.xhtml">ConstTensor</a> biases(biasInfo, biasData.data() + numBiasesPerGroup * g);</div><div class="line"><a name="l00577"></a><span class="lineno">  577</span>&#160;            optionalBiases = <a class="code" href="classarmnn_1_1_optional.xhtml">Optional&lt;ConstTensor&gt;</a>(biases);</div><div class="line"><a name="l00578"></a><span class="lineno">  578</span>&#160;        }</div><div class="line"><a name="l00579"></a><span class="lineno">  579</span>&#160;        convLayer = <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a2db3ae8d422f17d455e0ba0cb6291d2a">m_Network</a>-&gt;AddConvolution2dLayer(desc,</div><div class="line"><a name="l00580"></a><span class="lineno">  580</span>&#160;                                                     weights,</div><div class="line"><a name="l00581"></a><span class="lineno">  581</span>&#160;                                                     optionalBiases,</div><div class="line"><a name="l00582"></a><span class="lineno">  582</span>&#160;                                                     convLayerNames[g].c_str());</div><div class="line"><a name="l00583"></a><span class="lineno">  583</span>&#160;        convLayers[g] = convLayer;</div><div class="line"><a name="l00584"></a><span class="lineno">  584</span>&#160;</div><div class="line"><a name="l00585"></a><span class="lineno">  585</span>&#160;        <span class="comment">// If we have more than one group then the input to the nth convolution the splitter layer&#39;s nth output,</span></div><div class="line"><a name="l00586"></a><span class="lineno">  586</span>&#160;        <span class="comment">// otherwise it&#39;s the regular input to this layer.</span></div><div class="line"><a name="l00587"></a><span class="lineno">  587</span>&#160;        <a class="code" href="classarmnn_1_1_i_output_slot.xhtml">armnn::IOutputSlot</a>&amp; splitterInputConnection =</div><div class="line"><a name="l00588"></a><span class="lineno">  588</span>&#160;            splitterLayer ? splitterLayer-&gt;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml#a80ac4eda2e7f2757ec9dd96fc96dbd16">GetOutputSlot</a>(g) : inputConnection;</div><div class="line"><a name="l00589"></a><span class="lineno">  589</span>&#160;        splitterInputConnection.<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#ac1835f8756a9f03c02fcf9664e3a0fce">Connect</a>(convLayer-&gt;GetInputSlot(0));</div><div class="line"><a name="l00590"></a><span class="lineno">  590</span>&#160;        convLayer-&gt;GetOutputSlot(0).SetTensorInfo(<a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a77e6c08b48c99fafa560805270503856">BlobShapeToTensorInfo</a>(outputShape));</div><div class="line"><a name="l00591"></a><span class="lineno">  591</span>&#160;    }</div><div class="line"><a name="l00592"></a><span class="lineno">  592</span>&#160;</div><div class="line"><a name="l00593"></a><span class="lineno">  593</span>&#160;    <span class="comment">// If the convolution was performed in chunks, add a layer to concatenate the results</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">// The merge input shape matches that of the convolution output</span></div><div class="line"><a name="l00596"></a><span class="lineno">  596</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> concatDimSizes[4] = {<span class="keyword">static_cast&lt;</span><span class="keywordtype">unsigned</span> <span class="keywordtype">int</span><span class="keyword">&gt;</span>(outputShape.dim(0)),</div><div class="line"><a name="l00597"></a><span class="lineno">  597</span>&#160;                                      static_cast&lt;unsigned int&gt;(outputShape.dim(1)),</div><div class="line"><a name="l00598"></a><span class="lineno">  598</span>&#160;                                      static_cast&lt;unsigned int&gt;(outputShape.dim(2)),</div><div class="line"><a name="l00599"></a><span class="lineno">  599</span>&#160;                                      static_cast&lt;unsigned int&gt;(outputShape.dim(3))};</div><div class="line"><a name="l00600"></a><span class="lineno">  600</span>&#160;</div><div class="line"><a name="l00601"></a><span class="lineno">  601</span>&#160;    <span class="comment">// This is used to describe how the input is to be concatenated</span></div><div class="line"><a name="l00602"></a><span class="lineno">  602</span>&#160;    <a class="code" href="structarmnn_1_1_origins_descriptor.xhtml">OriginsDescriptor</a> concatDesc(numGroups);</div><div class="line"><a name="l00603"></a><span class="lineno">  603</span>&#160;</div><div class="line"><a name="l00604"></a><span class="lineno">  604</span>&#160;    <span class="comment">// Now create an input node for each group, using the name from</span></div><div class="line"><a name="l00605"></a><span class="lineno">  605</span>&#160;    <span class="comment">// the output of the corresponding convolution</span></div><div class="line"><a name="l00606"></a><span class="lineno">  606</span>&#160;    <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> g = 0; g &lt; numGroups; ++g)</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;        concatDesc.<a class="code" href="structarmnn_1_1_origins_descriptor.xhtml#a2b125117aa61f9baf3a9cb8658aa61a2">SetViewOriginCoord</a>(g, 1, concatDimSizes[1] * g);</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="comment">// Make sure the output from the concat is the correct size to hold the data for all groups</span></div><div class="line"><a name="l00612"></a><span class="lineno">  612</span>&#160;    concatDimSizes[1] *= numGroups;</div><div class="line"><a name="l00613"></a><span class="lineno">  613</span>&#160;    outputShape.set_dim(1, concatDimSizes[1]);</div><div class="line"><a name="l00614"></a><span class="lineno">  614</span>&#160;</div><div class="line"><a name="l00615"></a><span class="lineno">  615</span>&#160;    <span class="comment">// Finally add the concat layer</span></div><div class="line"><a name="l00616"></a><span class="lineno">  616</span>&#160;    <a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml">IConnectableLayer</a>* concatLayer = <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a2db3ae8d422f17d455e0ba0cb6291d2a">m_Network</a>-&gt;AddConcatLayer(concatDesc, layerParam.name().c_str());</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="keywordflow">if</span> (!concatLayer)</div><div class="line"><a name="l00619"></a><span class="lineno">  619</span>&#160;    {</div><div class="line"><a name="l00620"></a><span class="lineno">  620</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="l00621"></a><span class="lineno">  621</span>&#160;            fmt::format(<span class="stringliteral">&quot;Failed to create final concat layer for Split+Convolution+Concat. &quot;</span></div><div class="line"><a name="l00622"></a><span class="lineno">  622</span>&#160;                        <span class="stringliteral">&quot;Layer={} #groups={} #filters={} {}&quot;</span>,</div><div class="line"><a name="l00623"></a><span class="lineno">  623</span>&#160;                        layerParam.name(),</div><div class="line"><a name="l00624"></a><span class="lineno">  624</span>&#160;                        numGroups,</div><div class="line"><a name="l00625"></a><span class="lineno">  625</span>&#160;                        numFilters,</div><div class="line"><a name="l00626"></a><span class="lineno">  626</span>&#160;                        <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l00627"></a><span class="lineno">  627</span>&#160;    }</div><div class="line"><a name="l00628"></a><span class="lineno">  628</span>&#160;</div><div class="line"><a name="l00629"></a><span class="lineno">  629</span>&#160;    <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> g = 0; g &lt; numGroups; ++g)</div><div class="line"><a name="l00630"></a><span class="lineno">  630</span>&#160;    {</div><div class="line"><a name="l00631"></a><span class="lineno">  631</span>&#160;        convLayers[g]-&gt;GetOutputSlot(0).Connect(concatLayer-&gt;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml#a6ec9e0eb66d7d6a01240492a0b18104c">GetInputSlot</a>(g));</div><div class="line"><a name="l00632"></a><span class="lineno">  632</span>&#160;    }</div><div class="line"><a name="l00633"></a><span class="lineno">  633</span>&#160;    concatLayer-&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>(4, concatDimSizes, DataType::Float32));</div><div class="line"><a name="l00634"></a><span class="lineno">  634</span>&#160;    <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a0767b1c7ee9cbd014fd97c701a954caa">SetArmnnOutputSlotForCaffeTop</a>(layerParam.top(0), concatLayer-&gt;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml#a80ac4eda2e7f2757ec9dd96fc96dbd16">GetOutputSlot</a>(0));</div><div class="line"><a name="l00635"></a><span class="lineno">  635</span>&#160;}</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"><a class="line" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a77f532a6a82afeb6e79957726a9517a5">  637</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a77f532a6a82afeb6e79957726a9517a5">ICaffeParser::CaffeParserImpl::AddDeconvLayerWithSplits</a>(<span class="keyword">const</span> caffe::LayerParameter&amp; layerParam,</div><div class="line"><a name="l00638"></a><span class="lineno">  638</span>&#160;                                                             <span class="keyword">const</span> <a class="code" href="structarmnn_1_1_transpose_convolution2d_descriptor.xhtml">armnn::TransposeConvolution2dDescriptor</a>&amp; desc,</div><div class="line"><a name="l00639"></a><span class="lineno">  639</span>&#160;                                                             <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> kernelW,</div><div class="line"><a name="l00640"></a><span class="lineno">  640</span>&#160;                                                             <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> kernelH)</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="_assert_8hpp.xhtml#a5698be69cbd5dfe6c28fcd9867e8cbed">ARMNN_ASSERT</a>(layerParam.type() == <span class="stringliteral">&quot;Deconvolution&quot;</span>);</div><div class="line"><a name="l00643"></a><span class="lineno">  643</span>&#160;    ValidateNumInputsOutputs(layerParam, 1, 1);</div><div class="line"><a name="l00644"></a><span class="lineno">  644</span>&#160;</div><div class="line"><a name="l00645"></a><span class="lineno">  645</span>&#160;    ConvolutionParameter convParam = layerParam.convolution_param();</div><div class="line"><a name="l00646"></a><span class="lineno">  646</span>&#160;    BlobShape inputShape = <a class="code" href="namespacearmnn_caffe_parser.xhtml#af3fde7630e7c9df35cae9ed2b435dbed">TensorDescToBlobShape</a>(<a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a9650b8810d4e6734b255ca25d495fe06">GetArmnnOutputSlotForCaffeTop</a>(layerParam.bottom(0)).<a class="code" href="namespacearmnn_utils.xhtml#acee63cd08da47910fc166a1990988fa8">GetTensorInfo</a>());</div><div class="line"><a name="l00647"></a><span class="lineno">  647</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> numGroups = convParam.has_group() ? convParam.group() : 1;</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;    <span class="comment">// asusme these were already verified by the caller ParseDeconvLayer() function</span></div><div class="line"><a name="l00650"></a><span class="lineno">  650</span>&#160;    <a class="code" href="_assert_8hpp.xhtml#a5698be69cbd5dfe6c28fcd9867e8cbed">ARMNN_ASSERT</a>(numGroups &lt;= inputShape.dim(1));</div><div class="line"><a name="l00651"></a><span class="lineno">  651</span>&#160;    <a class="code" href="_assert_8hpp.xhtml#a5698be69cbd5dfe6c28fcd9867e8cbed">ARMNN_ASSERT</a>(numGroups &gt; 1);</div><div class="line"><a name="l00652"></a><span class="lineno">  652</span>&#160;</div><div class="line"><a name="l00653"></a><span class="lineno">  653</span>&#160;    <span class="comment">// Handle grouping</span></div><div class="line"><a name="l00654"></a><span class="lineno">  654</span>&#160;    <a class="code" href="classarmnn_1_1_i_output_slot.xhtml">armnn::IOutputSlot</a>&amp; inputConnection = <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a9650b8810d4e6734b255ca25d495fe06">GetArmnnOutputSlotForCaffeTop</a>(layerParam.bottom(0));</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;    vector&lt;string&gt; convLayerNames(numGroups);</div><div class="line"><a name="l00657"></a><span class="lineno">  657</span>&#160;    vector&lt;armnn::IConnectableLayer*&gt; convLayers(numGroups);</div><div class="line"><a name="l00658"></a><span class="lineno">  658</span>&#160;    convLayerNames[0] = layerParam.name();</div><div class="line"><a name="l00659"></a><span class="lineno">  659</span>&#160;</div><div class="line"><a name="l00660"></a><span class="lineno">  660</span>&#160;    <span class="comment">// This deconvolution is to be applied to chunks of the input data so add a splitter layer</span></div><div class="line"><a name="l00661"></a><span class="lineno">  661</span>&#160;</div><div class="line"><a name="l00662"></a><span class="lineno">  662</span>&#160;    <span class="comment">// Redirect the deconvolution input to the splitter</span></div><div class="line"><a name="l00663"></a><span class="lineno">  663</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> splitterDimSizes[4] = {<span class="keyword">static_cast&lt;</span><span class="keywordtype">unsigned</span> <span class="keywordtype">int</span><span class="keyword">&gt;</span>(inputShape.dim(0)),</div><div class="line"><a name="l00664"></a><span class="lineno">  664</span>&#160;                                        static_cast&lt;unsigned int&gt;(inputShape.dim(1)),</div><div class="line"><a name="l00665"></a><span class="lineno">  665</span>&#160;                                        static_cast&lt;unsigned int&gt;(inputShape.dim(2)),</div><div class="line"><a name="l00666"></a><span class="lineno">  666</span>&#160;                                        static_cast&lt;unsigned int&gt;(inputShape.dim(3))};</div><div class="line"><a name="l00667"></a><span class="lineno">  667</span>&#160;</div><div class="line"><a name="l00668"></a><span class="lineno">  668</span>&#160;    <span class="comment">// Split dimension 1 of the splitter output shape and deconv input shapes</span></div><div class="line"><a name="l00669"></a><span class="lineno">  669</span>&#160;    <span class="comment">// according to the number of groups</span></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;    splitterDimSizes[1] /= numGroups;</div><div class="line"><a name="l00672"></a><span class="lineno">  672</span>&#160;    inputShape.set_dim(1, splitterDimSizes[1]);</div><div class="line"><a name="l00673"></a><span class="lineno">  673</span>&#160;</div><div class="line"><a name="l00674"></a><span class="lineno">  674</span>&#160;    <span class="comment">// This is used to describe how the input is to be split</span></div><div class="line"><a name="l00675"></a><span class="lineno">  675</span>&#160;    <a class="code" href="structarmnn_1_1_views_descriptor.xhtml">ViewsDescriptor</a> splitterDesc(numGroups);</div><div class="line"><a name="l00676"></a><span class="lineno">  676</span>&#160;</div><div class="line"><a name="l00677"></a><span class="lineno">  677</span>&#160;    <span class="comment">// Create an output node for each group, giving each a unique name</span></div><div class="line"><a name="l00678"></a><span class="lineno">  678</span>&#160;    <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> g = 0; g &lt; numGroups; ++g)</div><div class="line"><a name="l00679"></a><span class="lineno">  679</span>&#160;    {</div><div class="line"><a name="l00680"></a><span class="lineno">  680</span>&#160;        <span class="comment">// Work out the names of the splitter layers child deconvolutions</span></div><div class="line"><a name="l00681"></a><span class="lineno">  681</span>&#160;        stringstream ss;</div><div class="line"><a name="l00682"></a><span class="lineno">  682</span>&#160;        ss &lt;&lt; layerParam.name() &lt;&lt; <span class="stringliteral">&quot;_&quot;</span> &lt;&lt; g;</div><div class="line"><a name="l00683"></a><span class="lineno">  683</span>&#160;        convLayerNames[g] = ss.str();</div><div class="line"><a name="l00684"></a><span class="lineno">  684</span>&#160;</div><div class="line"><a name="l00685"></a><span class="lineno">  685</span>&#160;        splitterDesc.<a class="code" href="structarmnn_1_1_views_descriptor.xhtml#a2b125117aa61f9baf3a9cb8658aa61a2">SetViewOriginCoord</a>(g, 1, splitterDimSizes[1] * g);</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">// Set the size of the views.</span></div><div class="line"><a name="l00688"></a><span class="lineno">  688</span>&#160;        <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> dimIdx=0; dimIdx &lt; 4; dimIdx++)</div><div class="line"><a name="l00689"></a><span class="lineno">  689</span>&#160;        {</div><div class="line"><a name="l00690"></a><span class="lineno">  690</span>&#160;            splitterDesc.<a class="code" href="structarmnn_1_1_views_descriptor.xhtml#aae0893695f5803a3517985c7cb1ccb2e">SetViewSize</a>(g, dimIdx, splitterDimSizes[dimIdx]);</div><div class="line"><a name="l00691"></a><span class="lineno">  691</span>&#160;        }</div><div class="line"><a name="l00692"></a><span class="lineno">  692</span>&#160;    }</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="keyword">const</span> std::string splitterLayerName = std::string(<span class="stringliteral">&quot;splitter_&quot;</span>) + layerParam.bottom(0);</div><div class="line"><a name="l00695"></a><span class="lineno">  695</span>&#160;    <a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml">armnn::IConnectableLayer</a>* splitterLayer = <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a2db3ae8d422f17d455e0ba0cb6291d2a">m_Network</a>-&gt;AddSplitterLayer(splitterDesc, splitterLayerName.c_str());</div><div class="line"><a name="l00696"></a><span class="lineno">  696</span>&#160;</div><div class="line"><a name="l00697"></a><span class="lineno">  697</span>&#160;    inputConnection.<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#ac1835f8756a9f03c02fcf9664e3a0fce">Connect</a>(splitterLayer-&gt;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml#a6ec9e0eb66d7d6a01240492a0b18104c">GetInputSlot</a>(0));</div><div class="line"><a name="l00698"></a><span class="lineno">  698</span>&#160;    <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i = 0; i &lt; splitterLayer-&gt;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml#ac2dac3b61c94de52093616be4ab17f8d">GetNumOutputSlots</a>(); i++)</div><div class="line"><a name="l00699"></a><span class="lineno">  699</span>&#160;    {</div><div class="line"><a name="l00700"></a><span class="lineno">  700</span>&#160;        splitterLayer-&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_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a77e6c08b48c99fafa560805270503856">BlobShapeToTensorInfo</a>(inputShape));</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;</div><div class="line"><a name="l00703"></a><span class="lineno">  703</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> numFilters = convParam.num_output();</div><div class="line"><a name="l00704"></a><span class="lineno">  704</span>&#160;</div><div class="line"><a name="l00705"></a><span class="lineno">  705</span>&#160;    <span class="comment">// Populates deconvolution output tensor descriptor dimensions.</span></div><div class="line"><a name="l00706"></a><span class="lineno">  706</span>&#160;    BlobShape outputShape;</div><div class="line"><a name="l00707"></a><span class="lineno">  707</span>&#160;    outputShape.add_dim(0);</div><div class="line"><a name="l00708"></a><span class="lineno">  708</span>&#160;    outputShape.set_dim(0, inputShape.dim(0));</div><div class="line"><a name="l00709"></a><span class="lineno">  709</span>&#160;    outputShape.add_dim(1);</div><div class="line"><a name="l00710"></a><span class="lineno">  710</span>&#160;    <span class="comment">// Ensures that dimension 1 of the deconvolution output is split according to the number of groups.</span></div><div class="line"><a name="l00711"></a><span class="lineno">  711</span>&#160;    outputShape.set_dim(1, numFilters / numGroups);</div><div class="line"><a name="l00712"></a><span class="lineno">  712</span>&#160;    outputShape.add_dim(2);</div><div class="line"><a name="l00713"></a><span class="lineno">  713</span>&#160;    outputShape.set_dim(</div><div class="line"><a name="l00714"></a><span class="lineno">  714</span>&#160;        2, (static_cast&lt;int&gt;(</div><div class="line"><a name="l00715"></a><span class="lineno">  715</span>&#160;                desc.<a class="code" href="structarmnn_1_1_transpose_convolution2d_descriptor.xhtml#ac1fe174bbadfb39a2b636940c2e647c8">m_StrideY</a> * (inputShape.dim(2) - 1) - 2 * desc.<a class="code" href="structarmnn_1_1_transpose_convolution2d_descriptor.xhtml#aa9e49717ebdb741e8c767741647fc618">m_PadBottom</a> + kernelH)));</div><div class="line"><a name="l00716"></a><span class="lineno">  716</span>&#160;    outputShape.add_dim(3);</div><div class="line"><a name="l00717"></a><span class="lineno">  717</span>&#160;    outputShape.set_dim(</div><div class="line"><a name="l00718"></a><span class="lineno">  718</span>&#160;        3, (static_cast&lt;int&gt;(</div><div class="line"><a name="l00719"></a><span class="lineno">  719</span>&#160;                desc.<a class="code" href="structarmnn_1_1_transpose_convolution2d_descriptor.xhtml#afe6a3377c4531315354def9023c8fdda">m_StrideX</a> * (inputShape.dim(3) - 1) - 2 * desc.<a class="code" href="structarmnn_1_1_transpose_convolution2d_descriptor.xhtml#a002bc30e590d78cbb4f4d12171055ca7">m_PadRight</a> + kernelW)));</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="comment">// Load the weight data for ALL groups</span></div><div class="line"><a name="l00722"></a><span class="lineno">  722</span>&#160;    vector&lt;float&gt; weightData(armnn::numeric_cast&lt;size_t&gt;(numGroups *</div><div class="line"><a name="l00723"></a><span class="lineno">  723</span>&#160;                                                         inputShape.dim(1) *  <span class="comment">// number of input channels</span></div><div class="line"><a name="l00724"></a><span class="lineno">  724</span>&#160;                                                         outputShape.dim(1) * <span class="comment">// number of output channels</span></div><div class="line"><a name="l00725"></a><span class="lineno">  725</span>&#160;                                                         kernelH *</div><div class="line"><a name="l00726"></a><span class="lineno">  726</span>&#160;                                                         kernelW));</div><div class="line"><a name="l00727"></a><span class="lineno">  727</span>&#160;    GetDataFromBlob(layerParam, weightData, 0);</div><div class="line"><a name="l00728"></a><span class="lineno">  728</span>&#160;</div><div class="line"><a name="l00729"></a><span class="lineno">  729</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> weightDimSizes[4] = {</div><div class="line"><a name="l00730"></a><span class="lineno">  730</span>&#160;        <span class="keyword">static_cast&lt;</span><span class="keywordtype">unsigned</span> <span class="keywordtype">int</span><span class="keyword">&gt;</span>(outputShape.dim(1)),</div><div class="line"><a name="l00731"></a><span class="lineno">  731</span>&#160;        static_cast&lt;unsigned int&gt;(inputShape.dim(1)),</div><div class="line"><a name="l00732"></a><span class="lineno">  732</span>&#160;        kernelH,</div><div class="line"><a name="l00733"></a><span class="lineno">  733</span>&#160;        kernelW};</div><div class="line"><a name="l00734"></a><span class="lineno">  734</span>&#160;</div><div class="line"><a name="l00735"></a><span class="lineno">  735</span>&#160;    <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> biasInfo;</div><div class="line"><a name="l00736"></a><span class="lineno">  736</span>&#160;    vector&lt;float&gt; biasData;</div><div class="line"><a name="l00737"></a><span class="lineno">  737</span>&#160;</div><div class="line"><a name="l00738"></a><span class="lineno">  738</span>&#160;    <span class="keywordflow">if</span> (desc.<a class="code" href="structarmnn_1_1_transpose_convolution2d_descriptor.xhtml#aea202e14d8874cefd9a0f778022b7e25">m_BiasEnabled</a>)</div><div class="line"><a name="l00739"></a><span class="lineno">  739</span>&#160;    {</div><div class="line"><a name="l00740"></a><span class="lineno">  740</span>&#160;        biasData.resize(armnn::numeric_cast&lt;size_t&gt;(numGroups * outputShape.dim(1)), 1.f);</div><div class="line"><a name="l00741"></a><span class="lineno">  741</span>&#160;        GetDataFromBlob(layerParam, biasData, 1);</div><div class="line"><a name="l00742"></a><span class="lineno">  742</span>&#160;</div><div class="line"><a name="l00743"></a><span class="lineno">  743</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> biasDimSizes[1] = {<span class="keyword">static_cast&lt;</span><span class="keywordtype">unsigned</span> <span class="keywordtype">int</span><span class="keyword">&gt;</span>(outputShape.dim(1))};</div><div class="line"><a name="l00744"></a><span class="lineno">  744</span>&#160;        biasInfo = <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a>(1, biasDimSizes, DataType::Float32);</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">  747</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> numWeightsPerGroup = <a class="code" href="namespacearmnn.xhtml#a375ca3cff9f1b005d1412dc5f3cf5b6e">armnn::numeric_cast</a>&lt;<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>&gt;(weightData.size()) / numGroups;</div><div class="line"><a name="l00748"></a><span class="lineno">  748</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> numBiasesPerGroup  = <a class="code" href="namespacearmnn.xhtml#a375ca3cff9f1b005d1412dc5f3cf5b6e">armnn::numeric_cast</a>&lt;<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>&gt;(biasData.size()) / numGroups;</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;    <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> g = 0; g &lt; numGroups; ++g)</div><div class="line"><a name="l00751"></a><span class="lineno">  751</span>&#160;    {</div><div class="line"><a name="l00752"></a><span class="lineno">  752</span>&#160;        <span class="comment">// Sets the slot index, group 0 should be connected to the 0th output of the splitter</span></div><div class="line"><a name="l00753"></a><span class="lineno">  753</span>&#160;        <span class="comment">// group 1 should be connected to the 1st output of the splitter.</span></div><div class="line"><a name="l00754"></a><span class="lineno">  754</span>&#160;</div><div class="line"><a name="l00755"></a><span class="lineno">  755</span>&#160;        <span class="comment">// Pulls out the weights for this group from that loaded from the model file earlier.</span></div><div class="line"><a name="l00756"></a><span class="lineno">  756</span>&#160;        <a class="code" href="classarmnn_1_1_const_tensor.xhtml">ConstTensor</a> weights(<a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a>(4, weightDimSizes, DataType::Float32),</div><div class="line"><a name="l00757"></a><span class="lineno">  757</span>&#160;                            weightData.data() + numWeightsPerGroup * g);</div><div class="line"><a name="l00758"></a><span class="lineno">  758</span>&#160;</div><div class="line"><a name="l00759"></a><span class="lineno">  759</span>&#160;        <a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml">IConnectableLayer</a>* deconvLayer = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00760"></a><span class="lineno">  760</span>&#160;        <a class="code" href="classarmnn_1_1_optional.xhtml">Optional&lt;ConstTensor&gt;</a> optionalBiases;</div><div class="line"><a name="l00761"></a><span class="lineno">  761</span>&#160;        <span class="keywordflow">if</span> (desc.<a class="code" href="structarmnn_1_1_transpose_convolution2d_descriptor.xhtml#aea202e14d8874cefd9a0f778022b7e25">m_BiasEnabled</a>)</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">// Pulls out the biases for this group from that loaded from the model file earlier.</span></div><div class="line"><a name="l00764"></a><span class="lineno">  764</span>&#160;            <a class="code" href="classarmnn_1_1_const_tensor.xhtml">ConstTensor</a> biases(biasInfo, biasData.data() + numBiasesPerGroup * g);</div><div class="line"><a name="l00765"></a><span class="lineno">  765</span>&#160;            optionalBiases = <a class="code" href="classarmnn_1_1_optional.xhtml">Optional&lt;ConstTensor&gt;</a>(biases);</div><div class="line"><a name="l00766"></a><span class="lineno">  766</span>&#160;        }</div><div class="line"><a name="l00767"></a><span class="lineno">  767</span>&#160;        deconvLayer = <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a2db3ae8d422f17d455e0ba0cb6291d2a">m_Network</a>-&gt;AddTransposeConvolution2dLayer(desc,</div><div class="line"><a name="l00768"></a><span class="lineno">  768</span>&#160;                                                     weights,</div><div class="line"><a name="l00769"></a><span class="lineno">  769</span>&#160;                                                     optionalBiases,</div><div class="line"><a name="l00770"></a><span class="lineno">  770</span>&#160;                                                     convLayerNames[g].c_str());</div><div class="line"><a name="l00771"></a><span class="lineno">  771</span>&#160;        convLayers[g] = deconvLayer;</div><div class="line"><a name="l00772"></a><span class="lineno">  772</span>&#160;</div><div class="line"><a name="l00773"></a><span class="lineno">  773</span>&#160;        <span class="comment">// If we have more than one group then the input to the nth deconvolution the splitter layer&#39;s nth output,</span></div><div class="line"><a name="l00774"></a><span class="lineno">  774</span>&#160;        <span class="comment">// otherwise it&#39;s the regular input to this layer.</span></div><div class="line"><a name="l00775"></a><span class="lineno">  775</span>&#160;        <a class="code" href="classarmnn_1_1_i_output_slot.xhtml">armnn::IOutputSlot</a>&amp; splitterInputConnection =</div><div class="line"><a name="l00776"></a><span class="lineno">  776</span>&#160;            splitterLayer ? splitterLayer-&gt;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml#a80ac4eda2e7f2757ec9dd96fc96dbd16">GetOutputSlot</a>(g) : inputConnection;</div><div class="line"><a name="l00777"></a><span class="lineno">  777</span>&#160;        splitterInputConnection.<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#ac1835f8756a9f03c02fcf9664e3a0fce">Connect</a>(deconvLayer-&gt;GetInputSlot(0));</div><div class="line"><a name="l00778"></a><span class="lineno">  778</span>&#160;        deconvLayer-&gt;GetOutputSlot(0).SetTensorInfo(<a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a77e6c08b48c99fafa560805270503856">BlobShapeToTensorInfo</a>(outputShape));</div><div class="line"><a name="l00779"></a><span class="lineno">  779</span>&#160;    }</div><div class="line"><a name="l00780"></a><span class="lineno">  780</span>&#160;</div><div class="line"><a name="l00781"></a><span class="lineno">  781</span>&#160;    <span class="comment">// If the deconvolution was performed in chunks, add a layer to concatenate the results</span></div><div class="line"><a name="l00782"></a><span class="lineno">  782</span>&#160;</div><div class="line"><a name="l00783"></a><span class="lineno">  783</span>&#160;    <span class="comment">// The merge input shape matches that of the deconvolution output</span></div><div class="line"><a name="l00784"></a><span class="lineno">  784</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> concatDimSizes[4] = {<span class="keyword">static_cast&lt;</span><span class="keywordtype">unsigned</span> <span class="keywordtype">int</span><span class="keyword">&gt;</span>(outputShape.dim(0)),</div><div class="line"><a name="l00785"></a><span class="lineno">  785</span>&#160;                                      static_cast&lt;unsigned int&gt;(outputShape.dim(1)),</div><div class="line"><a name="l00786"></a><span class="lineno">  786</span>&#160;                                      static_cast&lt;unsigned int&gt;(outputShape.dim(2)),</div><div class="line"><a name="l00787"></a><span class="lineno">  787</span>&#160;                                      static_cast&lt;unsigned int&gt;(outputShape.dim(3))};</div><div class="line"><a name="l00788"></a><span class="lineno">  788</span>&#160;</div><div class="line"><a name="l00789"></a><span class="lineno">  789</span>&#160;    <span class="comment">// This is used to describe how the input is to be concatenated</span></div><div class="line"><a name="l00790"></a><span class="lineno">  790</span>&#160;    <a class="code" href="structarmnn_1_1_origins_descriptor.xhtml">OriginsDescriptor</a> concatDesc(numGroups);</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="comment">// Now create an input node for each group, using the name from</span></div><div class="line"><a name="l00793"></a><span class="lineno">  793</span>&#160;    <span class="comment">// the output of the corresponding deconvolution</span></div><div class="line"><a name="l00794"></a><span class="lineno">  794</span>&#160;    <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> g = 0; g &lt; numGroups; ++g)</div><div class="line"><a name="l00795"></a><span class="lineno">  795</span>&#160;    {</div><div class="line"><a name="l00796"></a><span class="lineno">  796</span>&#160;        concatDesc.<a class="code" href="structarmnn_1_1_origins_descriptor.xhtml#a2b125117aa61f9baf3a9cb8658aa61a2">SetViewOriginCoord</a>(g, 1, concatDimSizes[1] * g);</div><div class="line"><a name="l00797"></a><span class="lineno">  797</span>&#160;    }</div><div class="line"><a name="l00798"></a><span class="lineno">  798</span>&#160;</div><div class="line"><a name="l00799"></a><span class="lineno">  799</span>&#160;    <span class="comment">// Make sure the output from the concat is the correct size to hold the data for all groups</span></div><div class="line"><a name="l00800"></a><span class="lineno">  800</span>&#160;    concatDimSizes[1] *= numGroups;</div><div class="line"><a name="l00801"></a><span class="lineno">  801</span>&#160;    outputShape.set_dim(1, concatDimSizes[1]);</div><div class="line"><a name="l00802"></a><span class="lineno">  802</span>&#160;</div><div class="line"><a name="l00803"></a><span class="lineno">  803</span>&#160;    <span class="comment">// Finally add the concat layer</span></div><div class="line"><a name="l00804"></a><span class="lineno">  804</span>&#160;    <a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml">IConnectableLayer</a>* concatLayer = <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a2db3ae8d422f17d455e0ba0cb6291d2a">m_Network</a>-&gt;AddConcatLayer(concatDesc, layerParam.name().c_str());</div><div class="line"><a name="l00805"></a><span class="lineno">  805</span>&#160;</div><div class="line"><a name="l00806"></a><span class="lineno">  806</span>&#160;    <span class="keywordflow">if</span> (!concatLayer)</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;        <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_parse_exception.xhtml">ParseException</a>(</div><div class="line"><a name="l00809"></a><span class="lineno">  809</span>&#160;            fmt::format(<span class="stringliteral">&quot;Failed to create final concat layer for Split+Deconvolution+Concat. &quot;</span></div><div class="line"><a name="l00810"></a><span class="lineno">  810</span>&#160;                        <span class="stringliteral">&quot;Layer={} #groups={} #filters={} {}&quot;</span>,</div><div class="line"><a name="l00811"></a><span class="lineno">  811</span>&#160;                        layerParam.name(),</div><div class="line"><a name="l00812"></a><span class="lineno">  812</span>&#160;                        numGroups,</div><div class="line"><a name="l00813"></a><span class="lineno">  813</span>&#160;                        numFilters,</div><div class="line"><a name="l00814"></a><span class="lineno">  814</span>&#160;                        <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l00815"></a><span class="lineno">  815</span>&#160;    }</div><div class="line"><a name="l00816"></a><span class="lineno">  816</span>&#160;</div><div class="line"><a name="l00817"></a><span class="lineno">  817</span>&#160;    <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> g = 0; g &lt; numGroups; ++g)</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;        convLayers[g]-&gt;GetOutputSlot(0).Connect(concatLayer-&gt;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml#a6ec9e0eb66d7d6a01240492a0b18104c">GetInputSlot</a>(g));</div><div class="line"><a name="l00820"></a><span class="lineno">  820</span>&#160;    }</div><div class="line"><a name="l00821"></a><span class="lineno">  821</span>&#160;    concatLayer-&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>(4, concatDimSizes, DataType::Float32));</div><div class="line"><a name="l00822"></a><span class="lineno">  822</span>&#160;    <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a0767b1c7ee9cbd014fd97c701a954caa">SetArmnnOutputSlotForCaffeTop</a>(layerParam.top(0), concatLayer-&gt;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml#a80ac4eda2e7f2757ec9dd96fc96dbd16">GetOutputSlot</a>(0));</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"><a class="line" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#adcb87456482d5df17ef09eca1a808091">  825</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#adcb87456482d5df17ef09eca1a808091">ICaffeParser::CaffeParserImpl::AddConvLayerWithDepthwiseConv</a>(<span class="keyword">const</span> caffe::LayerParameter&amp; layerParam,</div><div class="line"><a name="l00826"></a><span class="lineno">  826</span>&#160;                                                                  <span class="keyword">const</span> <a class="code" href="structarmnn_1_1_convolution2d_descriptor.xhtml">armnn::Convolution2dDescriptor</a>&amp; convDesc,</div><div class="line"><a name="l00827"></a><span class="lineno">  827</span>&#160;                                                                  <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> kernelW,</div><div class="line"><a name="l00828"></a><span class="lineno">  828</span>&#160;                                                                  <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> kernelH)</div><div class="line"><a name="l00829"></a><span class="lineno">  829</span>&#160;{</div><div class="line"><a name="l00830"></a><span class="lineno">  830</span>&#160;    <a class="code" href="_assert_8hpp.xhtml#a5698be69cbd5dfe6c28fcd9867e8cbed">ARMNN_ASSERT</a>(layerParam.type() == <span class="stringliteral">&quot;Convolution&quot;</span>);</div><div class="line"><a name="l00831"></a><span class="lineno">  831</span>&#160;    ValidateNumInputsOutputs(layerParam, 1, 1);</div><div class="line"><a name="l00832"></a><span class="lineno">  832</span>&#160;</div><div class="line"><a name="l00833"></a><span class="lineno">  833</span>&#160;    ConvolutionParameter convParam  = layerParam.convolution_param();</div><div class="line"><a name="l00834"></a><span class="lineno">  834</span>&#160;    BlobShape inputShape = <a class="code" href="namespacearmnn_caffe_parser.xhtml#af3fde7630e7c9df35cae9ed2b435dbed">TensorDescToBlobShape</a>(<a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a9650b8810d4e6734b255ca25d495fe06">GetArmnnOutputSlotForCaffeTop</a>(layerParam.bottom(0)).<a class="code" href="namespacearmnn_utils.xhtml#acee63cd08da47910fc166a1990988fa8">GetTensorInfo</a>());</div><div class="line"><a name="l00835"></a><span class="lineno">  835</span>&#160;</div><div class="line"><a name="l00836"></a><span class="lineno">  836</span>&#160;    <a class="code" href="structarmnn_1_1_depthwise_convolution2d_descriptor.xhtml">DepthwiseConvolution2dDescriptor</a> desc;</div><div class="line"><a name="l00837"></a><span class="lineno">  837</span>&#160;    desc.<a class="code" href="structarmnn_1_1_depthwise_convolution2d_descriptor.xhtml#ac18546ebbebbb32fe0a03baa9bf2c600">m_PadLeft</a>      = convDesc.<a class="code" href="structarmnn_1_1_convolution2d_descriptor.xhtml#ac18546ebbebbb32fe0a03baa9bf2c600">m_PadLeft</a>;</div><div class="line"><a name="l00838"></a><span class="lineno">  838</span>&#160;    desc.m_PadRight     = convDesc.<a class="code" href="structarmnn_1_1_convolution2d_descriptor.xhtml#a002bc30e590d78cbb4f4d12171055ca7">m_PadRight</a>;</div><div class="line"><a name="l00839"></a><span class="lineno">  839</span>&#160;    desc.m_PadTop       = convDesc.<a class="code" href="structarmnn_1_1_convolution2d_descriptor.xhtml#a56b51f56cef50cdfa554258eecdab046">m_PadTop</a>;</div><div class="line"><a name="l00840"></a><span class="lineno">  840</span>&#160;    desc.m_PadBottom    = convDesc.<a class="code" href="structarmnn_1_1_convolution2d_descriptor.xhtml#aa9e49717ebdb741e8c767741647fc618">m_PadBottom</a>;</div><div class="line"><a name="l00841"></a><span class="lineno">  841</span>&#160;    desc.m_StrideX      = convDesc.<a class="code" href="structarmnn_1_1_convolution2d_descriptor.xhtml#afe6a3377c4531315354def9023c8fdda">m_StrideX</a>;</div><div class="line"><a name="l00842"></a><span class="lineno">  842</span>&#160;    desc.m_StrideY      = convDesc.<a class="code" href="structarmnn_1_1_convolution2d_descriptor.xhtml#ac1fe174bbadfb39a2b636940c2e647c8">m_StrideY</a>;</div><div class="line"><a name="l00843"></a><span class="lineno">  843</span>&#160;    desc.m_DilationX    = convDesc.<a class="code" href="structarmnn_1_1_convolution2d_descriptor.xhtml#aa3c6a77a963a98ccb8ea7b8fd008a8c1">m_DilationX</a>;</div><div class="line"><a name="l00844"></a><span class="lineno">  844</span>&#160;    desc.m_DilationY    = convDesc.<a class="code" href="structarmnn_1_1_convolution2d_descriptor.xhtml#a302b688d88dd73cde0fb1faef6679907">m_DilationY</a>;</div><div class="line"><a name="l00845"></a><span class="lineno">  845</span>&#160;    desc.m_BiasEnabled  = convDesc.<a class="code" href="structarmnn_1_1_convolution2d_descriptor.xhtml#aea202e14d8874cefd9a0f778022b7e25">m_BiasEnabled</a>;</div><div class="line"><a name="l00846"></a><span class="lineno">  846</span>&#160;</div><div class="line"><a name="l00847"></a><span class="lineno">  847</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> numFilters = convParam.num_output();</div><div class="line"><a name="l00848"></a><span class="lineno">  848</span>&#160;</div><div class="line"><a name="l00849"></a><span class="lineno">  849</span>&#160;    BlobShape outputShape;</div><div class="line"><a name="l00850"></a><span class="lineno">  850</span>&#160;    outputShape.add_dim(0);</div><div class="line"><a name="l00851"></a><span class="lineno">  851</span>&#160;    outputShape.set_dim(0, inputShape.dim(0));</div><div class="line"><a name="l00852"></a><span class="lineno">  852</span>&#160;    outputShape.add_dim(1);</div><div class="line"><a name="l00853"></a><span class="lineno">  853</span>&#160;    outputShape.set_dim(1, numFilters);</div><div class="line"><a name="l00854"></a><span class="lineno">  854</span>&#160;    outputShape.add_dim(2);</div><div class="line"><a name="l00855"></a><span class="lineno">  855</span>&#160;    outputShape.set_dim(</div><div class="line"><a name="l00856"></a><span class="lineno">  856</span>&#160;        2, (static_cast&lt;int&gt;(</div><div class="line"><a name="l00857"></a><span class="lineno">  857</span>&#160;                static_cast&lt;float&gt;(inputShape.dim(2) + 2 * desc.m_PadBottom - (desc.m_DilationX * (kernelH - 1) + 1)) /</div><div class="line"><a name="l00858"></a><span class="lineno">  858</span>&#160;                static_cast&lt;float&gt;(desc.m_StrideY)) + 1));</div><div class="line"><a name="l00859"></a><span class="lineno">  859</span>&#160;    outputShape.add_dim(3);</div><div class="line"><a name="l00860"></a><span class="lineno">  860</span>&#160;    outputShape.set_dim(</div><div class="line"><a name="l00861"></a><span class="lineno">  861</span>&#160;        3, (static_cast&lt;int&gt;(</div><div class="line"><a name="l00862"></a><span class="lineno">  862</span>&#160;                static_cast&lt;float&gt;(inputShape.dim(3) + 2 * desc.m_PadRight - (desc.m_DilationY * (kernelW - 1) + 1)) /</div><div class="line"><a name="l00863"></a><span class="lineno">  863</span>&#160;                static_cast&lt;float&gt;(desc.m_StrideX)) + 1));</div><div class="line"><a name="l00864"></a><span class="lineno">  864</span>&#160;</div><div class="line"><a name="l00865"></a><span class="lineno">  865</span>&#160;    <span class="comment">// Load the weight data</span></div><div class="line"><a name="l00866"></a><span class="lineno">  866</span>&#160;    <span class="keywordtype">size_t</span> allWeightsSize = <a class="code" href="namespacearmnn.xhtml#a375ca3cff9f1b005d1412dc5f3cf5b6e">armnn::numeric_cast</a>&lt;<span class="keywordtype">size_t</span>&gt;(inputShape.dim(1) * kernelH * kernelW);</div><div class="line"><a name="l00867"></a><span class="lineno">  867</span>&#160;    vector&lt;float&gt; weightData(allWeightsSize);</div><div class="line"><a name="l00868"></a><span class="lineno">  868</span>&#160;</div><div class="line"><a name="l00869"></a><span class="lineno">  869</span>&#160;    GetDataFromBlob(layerParam, weightData, 0);</div><div class="line"><a name="l00870"></a><span class="lineno">  870</span>&#160;</div><div class="line"><a name="l00871"></a><span class="lineno">  871</span>&#160;    <span class="comment">// depth multiplier will be 1 for the depthwise convolution</span></div><div class="line"><a name="l00872"></a><span class="lineno">  872</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> weightDimSizes[4] = {</div><div class="line"><a name="l00873"></a><span class="lineno">  873</span>&#160;        <span class="keyword">static_cast&lt;</span><span class="keywordtype">unsigned</span> <span class="keywordtype">int</span><span class="keyword">&gt;</span>(1),                 <span class="comment">// depth multiplier</span></div><div class="line"><a name="l00874"></a><span class="lineno">  874</span>&#160;        static_cast&lt;unsigned int&gt;(inputShape.dim(1)), <span class="comment">// #channels</span></div><div class="line"><a name="l00875"></a><span class="lineno">  875</span>&#160;        kernelH,</div><div class="line"><a name="l00876"></a><span class="lineno">  876</span>&#160;        kernelW};</div><div class="line"><a name="l00877"></a><span class="lineno">  877</span>&#160;</div><div class="line"><a name="l00878"></a><span class="lineno">  878</span>&#160;    <a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml">armnn::IConnectableLayer</a>* returnLayer = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00879"></a><span class="lineno">  879</span>&#160;    <a class="code" href="classarmnn_1_1_const_tensor.xhtml">ConstTensor</a> weights(<a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a>(4, weightDimSizes, DataType::Float32), weightData.data());</div><div class="line"><a name="l00880"></a><span class="lineno">  880</span>&#160;    <a class="code" href="classarmnn_1_1_optional.xhtml">Optional&lt;ConstTensor&gt;</a> optionalBiases;</div><div class="line"><a name="l00881"></a><span class="lineno">  881</span>&#160;    vector&lt;float&gt; biasData;</div><div class="line"><a name="l00882"></a><span class="lineno">  882</span>&#160;    <span class="keywordflow">if</span> (desc.m_BiasEnabled)</div><div class="line"><a name="l00883"></a><span class="lineno">  883</span>&#160;    {</div><div class="line"><a name="l00884"></a><span class="lineno">  884</span>&#160;        <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> biasInfo;</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;        biasData.resize(armnn::numeric_cast&lt;size_t&gt;(outputShape.dim(1)), 1.f);</div><div class="line"><a name="l00887"></a><span class="lineno">  887</span>&#160;        GetDataFromBlob(layerParam, biasData, 1);</div><div class="line"><a name="l00888"></a><span class="lineno">  888</span>&#160;</div><div class="line"><a name="l00889"></a><span class="lineno">  889</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> biasDimSizes[1] = {<span class="keyword">static_cast&lt;</span><span class="keywordtype">unsigned</span> <span class="keywordtype">int</span><span class="keyword">&gt;</span>(outputShape.dim(1))};</div><div class="line"><a name="l00890"></a><span class="lineno">  890</span>&#160;        biasInfo = <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a>(1, biasDimSizes, DataType::Float32);</div><div class="line"><a name="l00891"></a><span class="lineno">  891</span>&#160;</div><div class="line"><a name="l00892"></a><span class="lineno">  892</span>&#160;        <a class="code" href="classarmnn_1_1_const_tensor.xhtml">ConstTensor</a> biases(biasInfo, biasData.data());</div><div class="line"><a name="l00893"></a><span class="lineno">  893</span>&#160;        optionalBiases = <a class="code" href="classarmnn_1_1_optional.xhtml">Optional&lt;ConstTensor&gt;</a>(biases);</div><div class="line"><a name="l00894"></a><span class="lineno">  894</span>&#160;    }</div><div class="line"><a name="l00895"></a><span class="lineno">  895</span>&#160;    returnLayer = <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a2db3ae8d422f17d455e0ba0cb6291d2a">m_Network</a>-&gt;AddDepthwiseConvolution2dLayer(desc,</div><div class="line"><a name="l00896"></a><span class="lineno">  896</span>&#160;                                                            weights,</div><div class="line"><a name="l00897"></a><span class="lineno">  897</span>&#160;                                                            optionalBiases,</div><div class="line"><a name="l00898"></a><span class="lineno">  898</span>&#160;                                                            layerParam.name().c_str());</div><div class="line"><a name="l00899"></a><span class="lineno">  899</span>&#160;</div><div class="line"><a name="l00900"></a><span class="lineno">  900</span>&#160;    <span class="keywordflow">if</span> (!returnLayer)</div><div class="line"><a name="l00901"></a><span class="lineno">  901</span>&#160;    {</div><div class="line"><a name="l00902"></a><span class="lineno">  902</span>&#160;        <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_parse_exception.xhtml">ParseException</a>(</div><div class="line"><a name="l00903"></a><span class="lineno">  903</span>&#160;            fmt::format(<span class="stringliteral">&quot;Failed to create depthwise convolution layer. &quot;</span></div><div class="line"><a name="l00904"></a><span class="lineno">  904</span>&#160;                        <span class="stringliteral">&quot;Layer={} #filters={} {}&quot;</span>,</div><div class="line"><a name="l00905"></a><span class="lineno">  905</span>&#160;                        layerParam.name(),</div><div class="line"><a name="l00906"></a><span class="lineno">  906</span>&#160;                        numFilters,</div><div class="line"><a name="l00907"></a><span class="lineno">  907</span>&#160;                        <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l00908"></a><span class="lineno">  908</span>&#160;    }</div><div class="line"><a name="l00909"></a><span class="lineno">  909</span>&#160;    <a class="code" href="classarmnn_1_1_i_output_slot.xhtml">armnn::IOutputSlot</a>&amp; inputConnection = <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a9650b8810d4e6734b255ca25d495fe06">GetArmnnOutputSlotForCaffeTop</a>(layerParam.bottom(0));</div><div class="line"><a name="l00910"></a><span class="lineno">  910</span>&#160;    inputConnection.<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#ac1835f8756a9f03c02fcf9664e3a0fce">Connect</a>(returnLayer-&gt;GetInputSlot(0));</div><div class="line"><a name="l00911"></a><span class="lineno">  911</span>&#160;    returnLayer-&gt;GetOutputSlot(0).SetTensorInfo(<a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a77e6c08b48c99fafa560805270503856">BlobShapeToTensorInfo</a>(outputShape));</div><div class="line"><a name="l00912"></a><span class="lineno">  912</span>&#160;    <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a0767b1c7ee9cbd014fd97c701a954caa">SetArmnnOutputSlotForCaffeTop</a>(layerParam.top(0), returnLayer-&gt;GetOutputSlot(0));</div><div class="line"><a name="l00913"></a><span class="lineno">  913</span>&#160;}</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"><a class="line" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a5cddc80538d5de7d36192e0fd2d09c63">  915</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a5cddc80538d5de7d36192e0fd2d09c63">ICaffeParser::CaffeParserImpl::ParseConvLayer</a>(<span class="keyword">const</span> LayerParameter&amp; layerParam)</div><div class="line"><a name="l00916"></a><span class="lineno">  916</span>&#160;{</div><div class="line"><a name="l00917"></a><span class="lineno">  917</span>&#160;    <span class="comment">// Ignored Caffe Parameters</span></div><div class="line"><a name="l00918"></a><span class="lineno">  918</span>&#160;    <span class="comment">// * Weight Filler</span></div><div class="line"><a name="l00919"></a><span class="lineno">  919</span>&#160;    <span class="comment">// * Bias Filler</span></div><div class="line"><a name="l00920"></a><span class="lineno">  920</span>&#160;    <span class="comment">// * Engine</span></div><div class="line"><a name="l00921"></a><span class="lineno">  921</span>&#160;    <span class="comment">// * Force nd_im2col</span></div><div class="line"><a name="l00922"></a><span class="lineno">  922</span>&#160;    <span class="comment">// * Axis</span></div><div class="line"><a name="l00923"></a><span class="lineno">  923</span>&#160;</div><div class="line"><a name="l00924"></a><span class="lineno">  924</span>&#160;    <span class="comment">// Not Available ArmNN Interface Parameters</span></div><div class="line"><a name="l00925"></a><span class="lineno">  925</span>&#160;    <span class="comment">// * Rounding policy;</span></div><div class="line"><a name="l00926"></a><span class="lineno">  926</span>&#160;</div><div class="line"><a name="l00927"></a><span class="lineno">  927</span>&#160;    <a class="code" href="_assert_8hpp.xhtml#a5698be69cbd5dfe6c28fcd9867e8cbed">ARMNN_ASSERT</a>(layerParam.type() == <span class="stringliteral">&quot;Convolution&quot;</span>);</div><div class="line"><a name="l00928"></a><span class="lineno">  928</span>&#160;    ValidateNumInputsOutputs(layerParam, 1, 1);</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;    ConvolutionParameter convParam = layerParam.convolution_param();</div><div class="line"><a name="l00931"></a><span class="lineno">  931</span>&#160;    BlobShape inputShape = <a class="code" href="namespacearmnn_caffe_parser.xhtml#af3fde7630e7c9df35cae9ed2b435dbed">TensorDescToBlobShape</a>(<a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a9650b8810d4e6734b255ca25d495fe06">GetArmnnOutputSlotForCaffeTop</a>(layerParam.bottom(0)).<a class="code" href="namespacearmnn_utils.xhtml#acee63cd08da47910fc166a1990988fa8">GetTensorInfo</a>());</div><div class="line"><a name="l00932"></a><span class="lineno">  932</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> numGroups = convParam.has_group() ? convParam.group() : 1;</div><div class="line"><a name="l00933"></a><span class="lineno">  933</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> numFilters = convParam.num_output();</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> <span class="keyword">auto</span> notFound = std::numeric_limits&lt;unsigned int&gt;::max();</div><div class="line"><a name="l00936"></a><span class="lineno">  936</span>&#160;</div><div class="line"><a name="l00937"></a><span class="lineno">  937</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> kernelH = <a class="code" href="_caffe_parser_8cpp.xhtml#a7553d91772274ed9b103824bbf7f75a5">GET_OPTIONAL_WITH_VECTOR_FALLBACK</a>(convParam, ConvolutionParameter,</div><div class="line"><a name="l00938"></a><span class="lineno">  938</span>&#160;                                                             kernel_h, kernel_size, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>, notFound);</div><div class="line"><a name="l00939"></a><span class="lineno">  939</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> kernelW = <a class="code" href="_caffe_parser_8cpp.xhtml#a7553d91772274ed9b103824bbf7f75a5">GET_OPTIONAL_WITH_VECTOR_FALLBACK</a>(convParam, ConvolutionParameter,</div><div class="line"><a name="l00940"></a><span class="lineno">  940</span>&#160;                                                             kernel_w, kernel_size, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>, notFound);</div><div class="line"><a name="l00941"></a><span class="lineno">  941</span>&#160;</div><div class="line"><a name="l00942"></a><span class="lineno">  942</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> strideH = <a class="code" href="_caffe_parser_8cpp.xhtml#a7553d91772274ed9b103824bbf7f75a5">GET_OPTIONAL_WITH_VECTOR_FALLBACK</a>(convParam, ConvolutionParameter,</div><div class="line"><a name="l00943"></a><span class="lineno">  943</span>&#160;                                                             stride_h, stride, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>, 1u);</div><div class="line"><a name="l00944"></a><span class="lineno">  944</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> strideW = <a class="code" href="_caffe_parser_8cpp.xhtml#a7553d91772274ed9b103824bbf7f75a5">GET_OPTIONAL_WITH_VECTOR_FALLBACK</a>(convParam, ConvolutionParameter,</div><div class="line"><a name="l00945"></a><span class="lineno">  945</span>&#160;                                                             stride_w, stride, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>, 1u);</div><div class="line"><a name="l00946"></a><span class="lineno">  946</span>&#160;</div><div class="line"><a name="l00947"></a><span class="lineno">  947</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> padH = <a class="code" href="_caffe_parser_8cpp.xhtml#a7553d91772274ed9b103824bbf7f75a5">GET_OPTIONAL_WITH_VECTOR_FALLBACK</a>(convParam, ConvolutionParameter,</div><div class="line"><a name="l00948"></a><span class="lineno">  948</span>&#160;                                                          pad_h, pad, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>, 0u);</div><div class="line"><a name="l00949"></a><span class="lineno">  949</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> padW = <a class="code" href="_caffe_parser_8cpp.xhtml#a7553d91772274ed9b103824bbf7f75a5">GET_OPTIONAL_WITH_VECTOR_FALLBACK</a>(convParam, ConvolutionParameter,</div><div class="line"><a name="l00950"></a><span class="lineno">  950</span>&#160;                                                          pad_w, pad, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>, 0u);</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">  952</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> dilationH = convParam.dilation_size() &gt; 0 ? convParam.dilation(0) : 1;</div><div class="line"><a name="l00953"></a><span class="lineno">  953</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> dilationW = convParam.dilation_size() &gt; 1 ? convParam.dilation(1) :</div><div class="line"><a name="l00954"></a><span class="lineno">  954</span>&#160;        convParam.dilation_size() &gt; 0 ? convParam.dilation(0) : 1;</div><div class="line"><a name="l00955"></a><span class="lineno">  955</span>&#160;</div><div class="line"><a name="l00956"></a><span class="lineno">  956</span>&#160;    <a class="code" href="structarmnn_1_1_convolution2d_descriptor.xhtml">Convolution2dDescriptor</a> convolution2dDescriptor;</div><div class="line"><a name="l00957"></a><span class="lineno">  957</span>&#160;    convolution2dDescriptor.<a class="code" href="structarmnn_1_1_convolution2d_descriptor.xhtml#ac18546ebbebbb32fe0a03baa9bf2c600">m_PadLeft</a>     = padW;</div><div class="line"><a name="l00958"></a><span class="lineno">  958</span>&#160;    convolution2dDescriptor.<a class="code" href="structarmnn_1_1_convolution2d_descriptor.xhtml#a002bc30e590d78cbb4f4d12171055ca7">m_PadRight</a>    = padW;</div><div class="line"><a name="l00959"></a><span class="lineno">  959</span>&#160;    convolution2dDescriptor.<a class="code" href="structarmnn_1_1_convolution2d_descriptor.xhtml#a56b51f56cef50cdfa554258eecdab046">m_PadTop</a>      = padH;</div><div class="line"><a name="l00960"></a><span class="lineno">  960</span>&#160;    convolution2dDescriptor.<a class="code" href="structarmnn_1_1_convolution2d_descriptor.xhtml#aa9e49717ebdb741e8c767741647fc618">m_PadBottom</a>   = padH;</div><div class="line"><a name="l00961"></a><span class="lineno">  961</span>&#160;    convolution2dDescriptor.<a class="code" href="structarmnn_1_1_convolution2d_descriptor.xhtml#afe6a3377c4531315354def9023c8fdda">m_StrideX</a>     = strideW;</div><div class="line"><a name="l00962"></a><span class="lineno">  962</span>&#160;    convolution2dDescriptor.<a class="code" href="structarmnn_1_1_convolution2d_descriptor.xhtml#ac1fe174bbadfb39a2b636940c2e647c8">m_StrideY</a>     = strideH;</div><div class="line"><a name="l00963"></a><span class="lineno">  963</span>&#160;    convolution2dDescriptor.<a class="code" href="structarmnn_1_1_convolution2d_descriptor.xhtml#aa3c6a77a963a98ccb8ea7b8fd008a8c1">m_DilationX</a>   = dilationW;</div><div class="line"><a name="l00964"></a><span class="lineno">  964</span>&#160;    convolution2dDescriptor.<a class="code" href="structarmnn_1_1_convolution2d_descriptor.xhtml#a302b688d88dd73cde0fb1faef6679907">m_DilationY</a>   = dilationH;</div><div class="line"><a name="l00965"></a><span class="lineno">  965</span>&#160;    convolution2dDescriptor.<a class="code" href="structarmnn_1_1_convolution2d_descriptor.xhtml#aea202e14d8874cefd9a0f778022b7e25">m_BiasEnabled</a> = convParam.has_bias_term() ? convParam.bias_term() : <span class="keyword">true</span>;</div><div class="line"><a name="l00966"></a><span class="lineno">  966</span>&#160;</div><div class="line"><a name="l00967"></a><span class="lineno">  967</span>&#160;    <span class="keywordflow">if</span> (numGroups &gt; numFilters)</div><div class="line"><a name="l00968"></a><span class="lineno">  968</span>&#160;    {</div><div class="line"><a name="l00969"></a><span class="lineno">  969</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="l00970"></a><span class="lineno">  970</span>&#160;            fmt::format(<span class="stringliteral">&quot;Error parsing Convolution: {}. &quot;</span></div><div class="line"><a name="l00971"></a><span class="lineno">  971</span>&#160;                        <span class="stringliteral">&quot;The &#39;group&#39;={} parameter cannot be larger than the &quot;</span></div><div class="line"><a name="l00972"></a><span class="lineno">  972</span>&#160;                        <span class="stringliteral">&quot;number of filters supplied =&#39;{}&#39;. {}&quot;</span>,</div><div class="line"><a name="l00973"></a><span class="lineno">  973</span>&#160;                        layerParam.name(),</div><div class="line"><a name="l00974"></a><span class="lineno">  974</span>&#160;                        numGroups,</div><div class="line"><a name="l00975"></a><span class="lineno">  975</span>&#160;                        numFilters,</div><div class="line"><a name="l00976"></a><span class="lineno">  976</span>&#160;                        <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l00977"></a><span class="lineno">  977</span>&#160;    }</div><div class="line"><a name="l00978"></a><span class="lineno">  978</span>&#160;</div><div class="line"><a name="l00979"></a><span class="lineno">  979</span>&#160;    <span class="keywordflow">if</span> (inputShape.dim_size() != 4)</div><div class="line"><a name="l00980"></a><span class="lineno">  980</span>&#160;    {</div><div class="line"><a name="l00981"></a><span class="lineno">  981</span>&#160;        <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_parse_exception.xhtml">ParseException</a>(</div><div class="line"><a name="l00982"></a><span class="lineno">  982</span>&#160;            fmt::format(<span class="stringliteral">&quot;Convolution input shape is expected to have 4 dimensions. &quot;</span></div><div class="line"><a name="l00983"></a><span class="lineno">  983</span>&#160;                        <span class="stringliteral">&quot;{}&#39;s input has only {}. {}&quot;</span>,</div><div class="line"><a name="l00984"></a><span class="lineno">  984</span>&#160;                        layerParam.name(),</div><div class="line"><a name="l00985"></a><span class="lineno">  985</span>&#160;                        inputShape.dim_size(),</div><div class="line"><a name="l00986"></a><span class="lineno">  986</span>&#160;                        <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l00987"></a><span class="lineno">  987</span>&#160;    }</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;    <span class="keywordflow">if</span> (numGroups &gt; 1)</div><div class="line"><a name="l00990"></a><span class="lineno">  990</span>&#160;    {</div><div class="line"><a name="l00991"></a><span class="lineno">  991</span>&#160;        <span class="keywordflow">if</span> (numGroups &gt; inputShape.dim(1))</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;            <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_parse_exception.xhtml">ParseException</a>(</div><div class="line"><a name="l00994"></a><span class="lineno">  994</span>&#160;                fmt::format(<span class="stringliteral">&quot;Error parsing Convolution: {}. &quot;</span></div><div class="line"><a name="l00995"></a><span class="lineno">  995</span>&#160;                            <span class="stringliteral">&quot;The &#39;group&#39;={} parameter cannot be larger than the &quot;</span></div><div class="line"><a name="l00996"></a><span class="lineno">  996</span>&#160;                            <span class="stringliteral">&quot;channel of the input shape={} (in NCHW format). {}&quot;</span>,</div><div class="line"><a name="l00997"></a><span class="lineno">  997</span>&#160;                            layerParam.name(),</div><div class="line"><a name="l00998"></a><span class="lineno">  998</span>&#160;                            numGroups,</div><div class="line"><a name="l00999"></a><span class="lineno">  999</span>&#160;                            inputShape.dim(1),</div><div class="line"><a name="l01000"></a><span class="lineno"> 1000</span>&#160;                            <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</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="keywordflow">else</span> <span class="keywordflow">if</span> (numGroups == inputShape.dim(1))</div><div class="line"><a name="l01003"></a><span class="lineno"> 1003</span>&#160;        {</div><div class="line"><a name="l01004"></a><span class="lineno"> 1004</span>&#160;            <span class="comment">// we use a depthwise convolution here, because the number of groups equals to the</span></div><div class="line"><a name="l01005"></a><span class="lineno"> 1005</span>&#160;            <span class="comment">// input channels</span></div><div class="line"><a name="l01006"></a><span class="lineno"> 1006</span>&#160;            <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#adcb87456482d5df17ef09eca1a808091">AddConvLayerWithDepthwiseConv</a>(layerParam, convolution2dDescriptor, kernelW, kernelH);</div><div class="line"><a name="l01007"></a><span class="lineno"> 1007</span>&#160;            <span class="keywordflow">return</span>;</div><div class="line"><a name="l01008"></a><span class="lineno"> 1008</span>&#160;        }</div><div class="line"><a name="l01009"></a><span class="lineno"> 1009</span>&#160;        <span class="keywordflow">else</span></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;            <span class="comment">// we split the input by channels into channels/groups separate convolutions</span></div><div class="line"><a name="l01012"></a><span class="lineno"> 1012</span>&#160;            <span class="comment">// and concatenate the results afterwards</span></div><div class="line"><a name="l01013"></a><span class="lineno"> 1013</span>&#160;            <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a9fea304829fe514d664de515ca5c3918">AddConvLayerWithSplits</a>(layerParam, convolution2dDescriptor, kernelW, kernelH);</div><div class="line"><a name="l01014"></a><span class="lineno"> 1014</span>&#160;            <span class="keywordflow">return</span>;</div><div class="line"><a name="l01015"></a><span class="lineno"> 1015</span>&#160;        }</div><div class="line"><a name="l01016"></a><span class="lineno"> 1016</span>&#160;    }</div><div class="line"><a name="l01017"></a><span class="lineno"> 1017</span>&#160;</div><div class="line"><a name="l01018"></a><span class="lineno"> 1018</span>&#160;    <span class="comment">// NOTE: at this point we only need to handle #group=1 case, all other cases should be</span></div><div class="line"><a name="l01019"></a><span class="lineno"> 1019</span>&#160;    <span class="comment">//       handled by the AddConvLayer* helpers</span></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;    <span class="comment">// Populate convolution output tensor descriptor dimensions</span></div><div class="line"><a name="l01022"></a><span class="lineno"> 1022</span>&#160;    BlobShape outputShape;</div><div class="line"><a name="l01023"></a><span class="lineno"> 1023</span>&#160;    outputShape.add_dim(0);</div><div class="line"><a name="l01024"></a><span class="lineno"> 1024</span>&#160;    outputShape.set_dim(0, inputShape.dim(0));</div><div class="line"><a name="l01025"></a><span class="lineno"> 1025</span>&#160;    outputShape.add_dim(1);</div><div class="line"><a name="l01026"></a><span class="lineno"> 1026</span>&#160;    outputShape.set_dim(1, numFilters);</div><div class="line"><a name="l01027"></a><span class="lineno"> 1027</span>&#160;    outputShape.add_dim(2);</div><div class="line"><a name="l01028"></a><span class="lineno"> 1028</span>&#160;    outputShape.set_dim(</div><div class="line"><a name="l01029"></a><span class="lineno"> 1029</span>&#160;        2, (static_cast&lt;int&gt;(</div><div class="line"><a name="l01030"></a><span class="lineno"> 1030</span>&#160;                static_cast&lt;float&gt;(inputShape.dim(2) + 2 * padH - (dilationH * (kernelH - 1) + 1)) /</div><div class="line"><a name="l01031"></a><span class="lineno"> 1031</span>&#160;                static_cast&lt;float&gt;(strideH)) + 1));</div><div class="line"><a name="l01032"></a><span class="lineno"> 1032</span>&#160;    outputShape.add_dim(3);</div><div class="line"><a name="l01033"></a><span class="lineno"> 1033</span>&#160;    outputShape.set_dim(</div><div class="line"><a name="l01034"></a><span class="lineno"> 1034</span>&#160;        3, (static_cast&lt;int&gt;(</div><div class="line"><a name="l01035"></a><span class="lineno"> 1035</span>&#160;                static_cast&lt;float&gt;(inputShape.dim(3) + 2 * padW - (dilationW * (kernelW - 1) + 1)) /</div><div class="line"><a name="l01036"></a><span class="lineno"> 1036</span>&#160;                static_cast&lt;float&gt;(strideW)) + 1));</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="comment">// Load the weight data for ALL groups</span></div><div class="line"><a name="l01039"></a><span class="lineno"> 1039</span>&#160;    vector&lt;float&gt; weightData(armnn::numeric_cast&lt;size_t&gt;(inputShape.dim(1) *</div><div class="line"><a name="l01040"></a><span class="lineno"> 1040</span>&#160;                                                         outputShape.dim(1) *</div><div class="line"><a name="l01041"></a><span class="lineno"> 1041</span>&#160;                                                         kernelH *</div><div class="line"><a name="l01042"></a><span class="lineno"> 1042</span>&#160;                                                         kernelW));</div><div class="line"><a name="l01043"></a><span class="lineno"> 1043</span>&#160;    GetDataFromBlob(layerParam, weightData, 0);</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">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> weightDimSizes[4] = {</div><div class="line"><a name="l01046"></a><span class="lineno"> 1046</span>&#160;        <span class="keyword">static_cast&lt;</span><span class="keywordtype">unsigned</span> <span class="keywordtype">int</span><span class="keyword">&gt;</span>(outputShape.dim(1)), <span class="comment">// output channels</span></div><div class="line"><a name="l01047"></a><span class="lineno"> 1047</span>&#160;        static_cast&lt;unsigned int&gt;(inputShape.dim(1)),  <span class="comment">// input channels</span></div><div class="line"><a name="l01048"></a><span class="lineno"> 1048</span>&#160;        kernelH,</div><div class="line"><a name="l01049"></a><span class="lineno"> 1049</span>&#160;        kernelW};</div><div class="line"><a name="l01050"></a><span class="lineno"> 1050</span>&#160;</div><div class="line"><a name="l01051"></a><span class="lineno"> 1051</span>&#160;    <a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml">armnn::IConnectableLayer</a>* returnLayer = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l01052"></a><span class="lineno"> 1052</span>&#160;</div><div class="line"><a name="l01053"></a><span class="lineno"> 1053</span>&#160;    <span class="comment">// Pull out the weights for this group from that loaded from the model file earlier</span></div><div class="line"><a name="l01054"></a><span class="lineno"> 1054</span>&#160;    <a class="code" href="classarmnn_1_1_const_tensor.xhtml">ConstTensor</a> weights(<a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a>(4, weightDimSizes, DataType::Float32), weightData.data());</div><div class="line"><a name="l01055"></a><span class="lineno"> 1055</span>&#160;    <a class="code" href="classarmnn_1_1_optional.xhtml">Optional&lt;ConstTensor&gt;</a> optionalBiases;</div><div class="line"><a name="l01056"></a><span class="lineno"> 1056</span>&#160;    vector&lt;float&gt; biasData;</div><div class="line"><a name="l01057"></a><span class="lineno"> 1057</span>&#160;    <span class="keywordflow">if</span> (convolution2dDescriptor.<a class="code" href="structarmnn_1_1_convolution2d_descriptor.xhtml#aea202e14d8874cefd9a0f778022b7e25">m_BiasEnabled</a>)</div><div class="line"><a name="l01058"></a><span class="lineno"> 1058</span>&#160;    {</div><div class="line"><a name="l01059"></a><span class="lineno"> 1059</span>&#160;        <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> biasInfo;</div><div class="line"><a name="l01060"></a><span class="lineno"> 1060</span>&#160;</div><div class="line"><a name="l01061"></a><span class="lineno"> 1061</span>&#160;        biasData.resize(armnn::numeric_cast&lt;size_t&gt;(outputShape.dim(1)), 1.f);</div><div class="line"><a name="l01062"></a><span class="lineno"> 1062</span>&#160;        GetDataFromBlob(layerParam, biasData, 1);</div><div class="line"><a name="l01063"></a><span class="lineno"> 1063</span>&#160;</div><div class="line"><a name="l01064"></a><span class="lineno"> 1064</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> biasDimSizes[1] = {<span class="keyword">static_cast&lt;</span><span class="keywordtype">unsigned</span> <span class="keywordtype">int</span><span class="keyword">&gt;</span>(outputShape.dim(1))};</div><div class="line"><a name="l01065"></a><span class="lineno"> 1065</span>&#160;        biasInfo = <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a>(1, biasDimSizes, DataType::Float32);</div><div class="line"><a name="l01066"></a><span class="lineno"> 1066</span>&#160;</div><div class="line"><a name="l01067"></a><span class="lineno"> 1067</span>&#160;        <span class="comment">// Pull out the biases for this group from that loaded from the model file earlier</span></div><div class="line"><a name="l01068"></a><span class="lineno"> 1068</span>&#160;        <a class="code" href="classarmnn_1_1_const_tensor.xhtml">ConstTensor</a> biases(biasInfo, biasData.data());</div><div class="line"><a name="l01069"></a><span class="lineno"> 1069</span>&#160;        optionalBiases = <a class="code" href="classarmnn_1_1_optional.xhtml">Optional&lt;ConstTensor&gt;</a>(biases);</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;    returnLayer = <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a2db3ae8d422f17d455e0ba0cb6291d2a">m_Network</a>-&gt;AddConvolution2dLayer(convolution2dDescriptor,</div><div class="line"><a name="l01072"></a><span class="lineno"> 1072</span>&#160;                                                   weights,</div><div class="line"><a name="l01073"></a><span class="lineno"> 1073</span>&#160;                                                   optionalBiases,</div><div class="line"><a name="l01074"></a><span class="lineno"> 1074</span>&#160;                                                   layerParam.name().c_str());</div><div class="line"><a name="l01075"></a><span class="lineno"> 1075</span>&#160;</div><div class="line"><a name="l01076"></a><span class="lineno"> 1076</span>&#160;    <a class="code" href="classarmnn_1_1_i_output_slot.xhtml">armnn::IOutputSlot</a>&amp; inputConnection = <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a9650b8810d4e6734b255ca25d495fe06">GetArmnnOutputSlotForCaffeTop</a>(layerParam.bottom(0));</div><div class="line"><a name="l01077"></a><span class="lineno"> 1077</span>&#160;    inputConnection.<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#ac1835f8756a9f03c02fcf9664e3a0fce">Connect</a>(returnLayer-&gt;GetInputSlot(0));</div><div class="line"><a name="l01078"></a><span class="lineno"> 1078</span>&#160;    returnLayer-&gt;GetOutputSlot(0).SetTensorInfo(<a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a77e6c08b48c99fafa560805270503856">BlobShapeToTensorInfo</a>(outputShape));</div><div class="line"><a name="l01079"></a><span class="lineno"> 1079</span>&#160;</div><div class="line"><a name="l01080"></a><span class="lineno"> 1080</span>&#160;    <span class="keywordflow">if</span> (!returnLayer)</div><div class="line"><a name="l01081"></a><span class="lineno"> 1081</span>&#160;    {</div><div class="line"><a name="l01082"></a><span class="lineno"> 1082</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="l01083"></a><span class="lineno"> 1083</span>&#160;            fmt::format(<span class="stringliteral">&quot;Failed to create Convolution layer. &quot;</span></div><div class="line"><a name="l01084"></a><span class="lineno"> 1084</span>&#160;                        <span class="stringliteral">&quot;Layer={} #groups={} #filters={} {}&quot;</span>,</div><div class="line"><a name="l01085"></a><span class="lineno"> 1085</span>&#160;                        layerParam.name(),</div><div class="line"><a name="l01086"></a><span class="lineno"> 1086</span>&#160;                        numGroups,</div><div class="line"><a name="l01087"></a><span class="lineno"> 1087</span>&#160;                        numFilters,</div><div class="line"><a name="l01088"></a><span class="lineno"> 1088</span>&#160;                        <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l01089"></a><span class="lineno"> 1089</span>&#160;    }</div><div class="line"><a name="l01090"></a><span class="lineno"> 1090</span>&#160;</div><div class="line"><a name="l01091"></a><span class="lineno"> 1091</span>&#160;    <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a0767b1c7ee9cbd014fd97c701a954caa">SetArmnnOutputSlotForCaffeTop</a>(layerParam.top(0), returnLayer-&gt;GetOutputSlot(0));</div><div class="line"><a name="l01092"></a><span class="lineno"> 1092</span>&#160;}</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"><a class="line" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#ac3f705f208b5ee9f540577524b2ad513"> 1094</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#ac3f705f208b5ee9f540577524b2ad513">ICaffeParser::CaffeParserImpl::ParseDeconvLayer</a>(<span class="keyword">const</span> LayerParameter&amp; layerParam)</div><div class="line"><a name="l01095"></a><span class="lineno"> 1095</span>&#160;{</div><div class="line"><a name="l01096"></a><span class="lineno"> 1096</span>&#160;    <span class="comment">// Ignored Caffe Parameters</span></div><div class="line"><a name="l01097"></a><span class="lineno"> 1097</span>&#160;    <span class="comment">// * Weight Filler</span></div><div class="line"><a name="l01098"></a><span class="lineno"> 1098</span>&#160;    <span class="comment">// * Bias Filler</span></div><div class="line"><a name="l01099"></a><span class="lineno"> 1099</span>&#160;    <span class="comment">// * Engine</span></div><div class="line"><a name="l01100"></a><span class="lineno"> 1100</span>&#160;    <span class="comment">// * Force nd_im2col</span></div><div class="line"><a name="l01101"></a><span class="lineno"> 1101</span>&#160;    <span class="comment">// * Axis</span></div><div class="line"><a name="l01102"></a><span class="lineno"> 1102</span>&#160;</div><div class="line"><a name="l01103"></a><span class="lineno"> 1103</span>&#160;    <span class="comment">// Not Available ArmNN Interface Parameters</span></div><div class="line"><a name="l01104"></a><span class="lineno"> 1104</span>&#160;    <span class="comment">// * Rounding policy;</span></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;    <a class="code" href="_assert_8hpp.xhtml#a5698be69cbd5dfe6c28fcd9867e8cbed">ARMNN_ASSERT</a>(layerParam.type() == <span class="stringliteral">&quot;Deconvolution&quot;</span>);</div><div class="line"><a name="l01107"></a><span class="lineno"> 1107</span>&#160;    ValidateNumInputsOutputs(layerParam, 1, 1);</div><div class="line"><a name="l01108"></a><span class="lineno"> 1108</span>&#160;</div><div class="line"><a name="l01109"></a><span class="lineno"> 1109</span>&#160;    ConvolutionParameter convParam = layerParam.convolution_param();</div><div class="line"><a name="l01110"></a><span class="lineno"> 1110</span>&#160;    BlobShape inputShape = <a class="code" href="namespacearmnn_caffe_parser.xhtml#af3fde7630e7c9df35cae9ed2b435dbed">TensorDescToBlobShape</a>(<a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a9650b8810d4e6734b255ca25d495fe06">GetArmnnOutputSlotForCaffeTop</a>(layerParam.bottom(0)).<a class="code" href="namespacearmnn_utils.xhtml#acee63cd08da47910fc166a1990988fa8">GetTensorInfo</a>());</div><div class="line"><a name="l01111"></a><span class="lineno"> 1111</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> numGroups = convParam.has_group() ? convParam.group() : 1;</div><div class="line"><a name="l01112"></a><span class="lineno"> 1112</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> numFilters = convParam.num_output();</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="keyword">const</span> <span class="keyword">auto</span> notFound = std::numeric_limits&lt;unsigned int&gt;::max();</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;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> kernelH = <a class="code" href="_caffe_parser_8cpp.xhtml#a7553d91772274ed9b103824bbf7f75a5">GET_OPTIONAL_WITH_VECTOR_FALLBACK</a>(convParam, ConvolutionParameter,</div><div class="line"><a name="l01117"></a><span class="lineno"> 1117</span>&#160;                                                             kernel_h, kernel_size, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>, notFound);</div><div class="line"><a name="l01118"></a><span class="lineno"> 1118</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> kernelW = <a class="code" href="_caffe_parser_8cpp.xhtml#a7553d91772274ed9b103824bbf7f75a5">GET_OPTIONAL_WITH_VECTOR_FALLBACK</a>(convParam, ConvolutionParameter,</div><div class="line"><a name="l01119"></a><span class="lineno"> 1119</span>&#160;                                                             kernel_w, kernel_size, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>, notFound);</div><div class="line"><a name="l01120"></a><span class="lineno"> 1120</span>&#160;</div><div class="line"><a name="l01121"></a><span class="lineno"> 1121</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> strideH = <a class="code" href="_caffe_parser_8cpp.xhtml#a7553d91772274ed9b103824bbf7f75a5">GET_OPTIONAL_WITH_VECTOR_FALLBACK</a>(convParam, ConvolutionParameter,</div><div class="line"><a name="l01122"></a><span class="lineno"> 1122</span>&#160;                                                             stride_h, stride, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>, 1u);</div><div class="line"><a name="l01123"></a><span class="lineno"> 1123</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> strideW = <a class="code" href="_caffe_parser_8cpp.xhtml#a7553d91772274ed9b103824bbf7f75a5">GET_OPTIONAL_WITH_VECTOR_FALLBACK</a>(convParam, ConvolutionParameter,</div><div class="line"><a name="l01124"></a><span class="lineno"> 1124</span>&#160;                                                             stride_w, stride, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>, 1u);</div><div class="line"><a name="l01125"></a><span class="lineno"> 1125</span>&#160;</div><div class="line"><a name="l01126"></a><span class="lineno"> 1126</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> padH = <a class="code" href="_caffe_parser_8cpp.xhtml#a7553d91772274ed9b103824bbf7f75a5">GET_OPTIONAL_WITH_VECTOR_FALLBACK</a>(convParam, ConvolutionParameter,</div><div class="line"><a name="l01127"></a><span class="lineno"> 1127</span>&#160;                                                          pad_h, pad, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>, 0u);</div><div class="line"><a name="l01128"></a><span class="lineno"> 1128</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> padW = <a class="code" href="_caffe_parser_8cpp.xhtml#a7553d91772274ed9b103824bbf7f75a5">GET_OPTIONAL_WITH_VECTOR_FALLBACK</a>(convParam, ConvolutionParameter,</div><div class="line"><a name="l01129"></a><span class="lineno"> 1129</span>&#160;                                                          pad_w, pad, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>, 0u);</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="keywordtype">unsigned</span> <span class="keywordtype">int</span> dilationH = convParam.dilation_size() &gt; 0 ? convParam.dilation(0) : 1;</div><div class="line"><a name="l01132"></a><span class="lineno"> 1132</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> dilationW = convParam.dilation_size() &gt; 1 ? convParam.dilation(1) :</div><div class="line"><a name="l01133"></a><span class="lineno"> 1133</span>&#160;        convParam.dilation_size() &gt; 0 ? convParam.dilation(0) : 1;</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;    <span class="keywordflow">if</span> (dilationH != 1 || dilationW != 1) {</div><div class="line"><a name="l01136"></a><span class="lineno"> 1136</span>&#160;        fmt::format(<span class="stringliteral">&quot;Dilated decnvolution is not supported. &quot;</span></div><div class="line"><a name="l01137"></a><span class="lineno"> 1137</span>&#160;                <span class="stringliteral">&quot;{}&#39;s input has dilation {} {}. {}&quot;</span>,</div><div class="line"><a name="l01138"></a><span class="lineno"> 1138</span>&#160;                layerParam.name(),</div><div class="line"><a name="l01139"></a><span class="lineno"> 1139</span>&#160;                dilationW, dilationH,</div><div class="line"><a name="l01140"></a><span class="lineno"> 1140</span>&#160;                <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString());</div><div class="line"><a name="l01141"></a><span class="lineno"> 1141</span>&#160;    }</div><div class="line"><a name="l01142"></a><span class="lineno"> 1142</span>&#160;</div><div class="line"><a name="l01143"></a><span class="lineno"> 1143</span>&#160;    <a class="code" href="structarmnn_1_1_transpose_convolution2d_descriptor.xhtml">TransposeConvolution2dDescriptor</a> deconvolution2dDescriptor;</div><div class="line"><a name="l01144"></a><span class="lineno"> 1144</span>&#160;    deconvolution2dDescriptor.<a class="code" href="structarmnn_1_1_transpose_convolution2d_descriptor.xhtml#ac18546ebbebbb32fe0a03baa9bf2c600">m_PadLeft</a>     = padW;</div><div class="line"><a name="l01145"></a><span class="lineno"> 1145</span>&#160;    deconvolution2dDescriptor.m_PadRight    = padW;</div><div class="line"><a name="l01146"></a><span class="lineno"> 1146</span>&#160;    deconvolution2dDescriptor.m_PadTop      = padH;</div><div class="line"><a name="l01147"></a><span class="lineno"> 1147</span>&#160;    deconvolution2dDescriptor.m_PadBottom   = padH;</div><div class="line"><a name="l01148"></a><span class="lineno"> 1148</span>&#160;    deconvolution2dDescriptor.m_StrideX     = strideW;</div><div class="line"><a name="l01149"></a><span class="lineno"> 1149</span>&#160;    deconvolution2dDescriptor.m_StrideY     = strideH;</div><div class="line"><a name="l01150"></a><span class="lineno"> 1150</span>&#160;    deconvolution2dDescriptor.m_BiasEnabled = convParam.has_bias_term() ? convParam.bias_term() : <span class="keyword">true</span>;</div><div class="line"><a name="l01151"></a><span class="lineno"> 1151</span>&#160;</div><div class="line"><a name="l01152"></a><span class="lineno"> 1152</span>&#160;    <span class="keywordflow">if</span> (numGroups &gt; numFilters)</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;Error parsing Deconvolution: {}. &quot;</span></div><div class="line"><a name="l01156"></a><span class="lineno"> 1156</span>&#160;                        <span class="stringliteral">&quot;The &#39;group&#39;={} parameter cannot be larger than the &quot;</span></div><div class="line"><a name="l01157"></a><span class="lineno"> 1157</span>&#160;                        <span class="stringliteral">&quot;number of filters supplied =&#39;{}&#39;. {}&quot;</span>,</div><div class="line"><a name="l01158"></a><span class="lineno"> 1158</span>&#160;                        layerParam.name(),</div><div class="line"><a name="l01159"></a><span class="lineno"> 1159</span>&#160;                        numGroups,</div><div class="line"><a name="l01160"></a><span class="lineno"> 1160</span>&#160;                        numFilters,</div><div class="line"><a name="l01161"></a><span class="lineno"> 1161</span>&#160;                        <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l01162"></a><span class="lineno"> 1162</span>&#160;    }</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="keywordflow">if</span> (inputShape.dim_size() != 4)</div><div class="line"><a name="l01165"></a><span class="lineno"> 1165</span>&#160;    {</div><div class="line"><a name="l01166"></a><span class="lineno"> 1166</span>&#160;        <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_parse_exception.xhtml">ParseException</a>(</div><div class="line"><a name="l01167"></a><span class="lineno"> 1167</span>&#160;            fmt::format(<span class="stringliteral">&quot;Deconvolution input shape is expected to have 4 dimensions. &quot;</span></div><div class="line"><a name="l01168"></a><span class="lineno"> 1168</span>&#160;                        <span class="stringliteral">&quot;{}&#39;s input has only {}. {}&quot;</span>,</div><div class="line"><a name="l01169"></a><span class="lineno"> 1169</span>&#160;                        layerParam.name(),</div><div class="line"><a name="l01170"></a><span class="lineno"> 1170</span>&#160;                        inputShape.dim_size(),</div><div class="line"><a name="l01171"></a><span class="lineno"> 1171</span>&#160;                        <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l01172"></a><span class="lineno"> 1172</span>&#160;    }</div><div class="line"><a name="l01173"></a><span class="lineno"> 1173</span>&#160;</div><div class="line"><a name="l01174"></a><span class="lineno"> 1174</span>&#160;    <span class="keywordflow">if</span> (numGroups &gt; 1)</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;        <span class="keywordflow">if</span> (numGroups &gt; inputShape.dim(1))</div><div class="line"><a name="l01177"></a><span class="lineno"> 1177</span>&#160;        {</div><div class="line"><a name="l01178"></a><span class="lineno"> 1178</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="l01179"></a><span class="lineno"> 1179</span>&#160;                fmt::format(<span class="stringliteral">&quot;Error parsing Deconvolution: {}. &quot;</span></div><div class="line"><a name="l01180"></a><span class="lineno"> 1180</span>&#160;                            <span class="stringliteral">&quot;The &#39;group&#39;={} parameter cannot be larger than the &quot;</span></div><div class="line"><a name="l01181"></a><span class="lineno"> 1181</span>&#160;                            <span class="stringliteral">&quot;channel of the input shape={} (in NCHW format). {}&quot;</span>,</div><div class="line"><a name="l01182"></a><span class="lineno"> 1182</span>&#160;                            layerParam.name(),</div><div class="line"><a name="l01183"></a><span class="lineno"> 1183</span>&#160;                            numGroups,</div><div class="line"><a name="l01184"></a><span class="lineno"> 1184</span>&#160;                            inputShape.dim(1),</div><div class="line"><a name="l01185"></a><span class="lineno"> 1185</span>&#160;                            <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</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">else</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="comment">// we split the input by channels into channels/groups separate convolutions</span></div><div class="line"><a name="l01190"></a><span class="lineno"> 1190</span>&#160;            <span class="comment">// and concatenate the results afterwards</span></div><div class="line"><a name="l01191"></a><span class="lineno"> 1191</span>&#160;            <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a77f532a6a82afeb6e79957726a9517a5">AddDeconvLayerWithSplits</a>(layerParam, deconvolution2dDescriptor, kernelW, kernelH);</div><div class="line"><a name="l01192"></a><span class="lineno"> 1192</span>&#160;            <span class="keywordflow">return</span>;</div><div class="line"><a name="l01193"></a><span class="lineno"> 1193</span>&#160;        }</div><div class="line"><a name="l01194"></a><span class="lineno"> 1194</span>&#160;    }</div><div class="line"><a name="l01195"></a><span class="lineno"> 1195</span>&#160;</div><div class="line"><a name="l01196"></a><span class="lineno"> 1196</span>&#160;    <span class="comment">// NOTE: at this point we only need to handle #group=1 case, all other cases should be</span></div><div class="line"><a name="l01197"></a><span class="lineno"> 1197</span>&#160;    <span class="comment">//       handled by the AddDeconvLayer* helpers</span></div><div class="line"><a name="l01198"></a><span class="lineno"> 1198</span>&#160;</div><div class="line"><a name="l01199"></a><span class="lineno"> 1199</span>&#160;    <span class="comment">// Populate deconvolution output tensor descriptor dimensions</span></div><div class="line"><a name="l01200"></a><span class="lineno"> 1200</span>&#160;    BlobShape outputShape;</div><div class="line"><a name="l01201"></a><span class="lineno"> 1201</span>&#160;    outputShape.add_dim(0);</div><div class="line"><a name="l01202"></a><span class="lineno"> 1202</span>&#160;    outputShape.set_dim(0, inputShape.dim(0));</div><div class="line"><a name="l01203"></a><span class="lineno"> 1203</span>&#160;    outputShape.add_dim(1);</div><div class="line"><a name="l01204"></a><span class="lineno"> 1204</span>&#160;    outputShape.set_dim(1, numFilters);</div><div class="line"><a name="l01205"></a><span class="lineno"> 1205</span>&#160;    outputShape.add_dim(2);</div><div class="line"><a name="l01206"></a><span class="lineno"> 1206</span>&#160;    outputShape.set_dim(</div><div class="line"><a name="l01207"></a><span class="lineno"> 1207</span>&#160;        2, (static_cast&lt;int&gt;(</div><div class="line"><a name="l01208"></a><span class="lineno"> 1208</span>&#160;                strideH * (inputShape.dim(2) - 1) - 2 * padH + (dilationH * (kernelH - 1) + 1))));</div><div class="line"><a name="l01209"></a><span class="lineno"> 1209</span>&#160;    outputShape.add_dim(3);</div><div class="line"><a name="l01210"></a><span class="lineno"> 1210</span>&#160;    outputShape.set_dim(</div><div class="line"><a name="l01211"></a><span class="lineno"> 1211</span>&#160;        3, (static_cast&lt;int&gt;(</div><div class="line"><a name="l01212"></a><span class="lineno"> 1212</span>&#160;                strideW * (inputShape.dim(3) - 1) - 2 * padW + (dilationW * (kernelW - 1) + 1))));</div><div class="line"><a name="l01213"></a><span class="lineno"> 1213</span>&#160;</div><div class="line"><a name="l01214"></a><span class="lineno"> 1214</span>&#160;    <span class="comment">// Load the weight data for ALL groups</span></div><div class="line"><a name="l01215"></a><span class="lineno"> 1215</span>&#160;    vector&lt;float&gt; weightData(armnn::numeric_cast&lt;size_t&gt;(inputShape.dim(1) *</div><div class="line"><a name="l01216"></a><span class="lineno"> 1216</span>&#160;                                                         outputShape.dim(1) *</div><div class="line"><a name="l01217"></a><span class="lineno"> 1217</span>&#160;                                                         kernelH *</div><div class="line"><a name="l01218"></a><span class="lineno"> 1218</span>&#160;                                                         kernelW));</div><div class="line"><a name="l01219"></a><span class="lineno"> 1219</span>&#160;    GetDataFromBlob(layerParam, weightData, 0);</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="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> weightDimSizes[4] = {</div><div class="line"><a name="l01222"></a><span class="lineno"> 1222</span>&#160;        <span class="keyword">static_cast&lt;</span><span class="keywordtype">unsigned</span> <span class="keywordtype">int</span><span class="keyword">&gt;</span>(outputShape.dim(1)), <span class="comment">// output channels</span></div><div class="line"><a name="l01223"></a><span class="lineno"> 1223</span>&#160;        static_cast&lt;unsigned int&gt;(inputShape.dim(1)),  <span class="comment">// input channels</span></div><div class="line"><a name="l01224"></a><span class="lineno"> 1224</span>&#160;        kernelH,</div><div class="line"><a name="l01225"></a><span class="lineno"> 1225</span>&#160;        kernelW};</div><div class="line"><a name="l01226"></a><span class="lineno"> 1226</span>&#160;</div><div class="line"><a name="l01227"></a><span class="lineno"> 1227</span>&#160;    <a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml">armnn::IConnectableLayer</a>* returnLayer = <span class="keyword">nullptr</span>;</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;    <span class="comment">// Pull out the weights for this group from that loaded from the model file earlier</span></div><div class="line"><a name="l01230"></a><span class="lineno"> 1230</span>&#160;    <a class="code" href="classarmnn_1_1_const_tensor.xhtml">ConstTensor</a> weights(<a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a>(4, weightDimSizes, DataType::Float32), weightData.data());</div><div class="line"><a name="l01231"></a><span class="lineno"> 1231</span>&#160;    <a class="code" href="classarmnn_1_1_optional.xhtml">Optional&lt;ConstTensor&gt;</a> optionalBiases;</div><div class="line"><a name="l01232"></a><span class="lineno"> 1232</span>&#160;    vector&lt;float&gt; biasData;</div><div class="line"><a name="l01233"></a><span class="lineno"> 1233</span>&#160;    <span class="keywordflow">if</span> (deconvolution2dDescriptor.m_BiasEnabled)</div><div class="line"><a name="l01234"></a><span class="lineno"> 1234</span>&#160;    {</div><div class="line"><a name="l01235"></a><span class="lineno"> 1235</span>&#160;        <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> biasInfo;</div><div class="line"><a name="l01236"></a><span class="lineno"> 1236</span>&#160;</div><div class="line"><a name="l01237"></a><span class="lineno"> 1237</span>&#160;        biasData.resize(armnn::numeric_cast&lt;size_t&gt;(outputShape.dim(1)), 1.f);</div><div class="line"><a name="l01238"></a><span class="lineno"> 1238</span>&#160;        GetDataFromBlob(layerParam, biasData, 1);</div><div class="line"><a name="l01239"></a><span class="lineno"> 1239</span>&#160;</div><div class="line"><a name="l01240"></a><span class="lineno"> 1240</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> biasDimSizes[1] = {<span class="keyword">static_cast&lt;</span><span class="keywordtype">unsigned</span> <span class="keywordtype">int</span><span class="keyword">&gt;</span>(outputShape.dim(1))};</div><div class="line"><a name="l01241"></a><span class="lineno"> 1241</span>&#160;        biasInfo = <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a>(1, biasDimSizes, DataType::Float32);</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;        <span class="comment">// Pull out the biases for this group from that loaded from the model file earlier</span></div><div class="line"><a name="l01244"></a><span class="lineno"> 1244</span>&#160;        <a class="code" href="classarmnn_1_1_const_tensor.xhtml">ConstTensor</a> biases(biasInfo, biasData.data());</div><div class="line"><a name="l01245"></a><span class="lineno"> 1245</span>&#160;        optionalBiases = <a class="code" href="classarmnn_1_1_optional.xhtml">Optional&lt;ConstTensor&gt;</a>(biases);</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;    returnLayer = <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a2db3ae8d422f17d455e0ba0cb6291d2a">m_Network</a>-&gt;AddTransposeConvolution2dLayer(deconvolution2dDescriptor,</div><div class="line"><a name="l01248"></a><span class="lineno"> 1248</span>&#160;                                                   weights,</div><div class="line"><a name="l01249"></a><span class="lineno"> 1249</span>&#160;                                                   optionalBiases,</div><div class="line"><a name="l01250"></a><span class="lineno"> 1250</span>&#160;                                                   layerParam.name().c_str());</div><div class="line"><a name="l01251"></a><span class="lineno"> 1251</span>&#160;</div><div class="line"><a name="l01252"></a><span class="lineno"> 1252</span>&#160;    <a class="code" href="classarmnn_1_1_i_output_slot.xhtml">armnn::IOutputSlot</a>&amp; inputConnection = <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a9650b8810d4e6734b255ca25d495fe06">GetArmnnOutputSlotForCaffeTop</a>(layerParam.bottom(0));</div><div class="line"><a name="l01253"></a><span class="lineno"> 1253</span>&#160;    inputConnection.<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#ac1835f8756a9f03c02fcf9664e3a0fce">Connect</a>(returnLayer-&gt;GetInputSlot(0));</div><div class="line"><a name="l01254"></a><span class="lineno"> 1254</span>&#160;    returnLayer-&gt;GetOutputSlot(0).SetTensorInfo(<a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a77e6c08b48c99fafa560805270503856">BlobShapeToTensorInfo</a>(outputShape));</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;    <span class="keywordflow">if</span> (!returnLayer)</div><div class="line"><a name="l01257"></a><span class="lineno"> 1257</span>&#160;    {</div><div class="line"><a name="l01258"></a><span class="lineno"> 1258</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="l01259"></a><span class="lineno"> 1259</span>&#160;            fmt::format(<span class="stringliteral">&quot;Failed to create Deconvolution layer. &quot;</span></div><div class="line"><a name="l01260"></a><span class="lineno"> 1260</span>&#160;                        <span class="stringliteral">&quot;Layer={} #groups={} #filters={} {}&quot;</span>,</div><div class="line"><a name="l01261"></a><span class="lineno"> 1261</span>&#160;                        layerParam.name(),</div><div class="line"><a name="l01262"></a><span class="lineno"> 1262</span>&#160;                        numGroups,</div><div class="line"><a name="l01263"></a><span class="lineno"> 1263</span>&#160;                        numFilters,</div><div class="line"><a name="l01264"></a><span class="lineno"> 1264</span>&#160;                        <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l01265"></a><span class="lineno"> 1265</span>&#160;    }</div><div class="line"><a name="l01266"></a><span class="lineno"> 1266</span>&#160;</div><div class="line"><a name="l01267"></a><span class="lineno"> 1267</span>&#160;    <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a0767b1c7ee9cbd014fd97c701a954caa">SetArmnnOutputSlotForCaffeTop</a>(layerParam.top(0), returnLayer-&gt;GetOutputSlot(0));</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;</div><div class="line"><a name="l01270"></a><span class="lineno"><a class="line" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#ab3329e4bcd8e42cd314f84c8260b06ad"> 1270</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#ab3329e4bcd8e42cd314f84c8260b06ad">ICaffeParser::CaffeParserImpl::ParsePoolingLayer</a>(<span class="keyword">const</span> LayerParameter&amp; layerParam)</div><div class="line"><a name="l01271"></a><span class="lineno"> 1271</span>&#160;{</div><div class="line"><a name="l01272"></a><span class="lineno"> 1272</span>&#160;    <span class="comment">// Ignored Caffe Parameters</span></div><div class="line"><a name="l01273"></a><span class="lineno"> 1273</span>&#160;    <span class="comment">//      Stochastic Pooling</span></div><div class="line"><a name="l01274"></a><span class="lineno"> 1274</span>&#160;    <span class="comment">//      Engine</span></div><div class="line"><a name="l01275"></a><span class="lineno"> 1275</span>&#160;</div><div class="line"><a name="l01276"></a><span class="lineno"> 1276</span>&#160;    ValidateNumInputsOutputs(layerParam, 1, 1);</div><div class="line"><a name="l01277"></a><span class="lineno"> 1277</span>&#160;    PoolingParameter param = layerParam.pooling_param();</div><div class="line"><a name="l01278"></a><span class="lineno"> 1278</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a>&amp; inputInfo = <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a9650b8810d4e6734b255ca25d495fe06">GetArmnnOutputSlotForCaffeTop</a>(layerParam.bottom(0)).<a class="code" href="namespacearmnn_utils.xhtml#acee63cd08da47910fc166a1990988fa8">GetTensorInfo</a>();</div><div class="line"><a name="l01279"></a><span class="lineno"> 1279</span>&#160;</div><div class="line"><a name="l01280"></a><span class="lineno"> 1280</span>&#160;    <span class="keyword">const</span> <span class="keyword">auto</span> notFound = std::numeric_limits&lt;unsigned int&gt;::max();</div><div class="line"><a name="l01281"></a><span class="lineno"> 1281</span>&#160;</div><div class="line"><a name="l01282"></a><span class="lineno"> 1282</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> kernel_h = <a class="code" href="_caffe_parser_8cpp.xhtml#a69f4a692d0095f6b19b0cd99cd75e465">GET_OPTIONAL_WITH_FALLBACK</a>(param, PoolingParameter,</div><div class="line"><a name="l01283"></a><span class="lineno"> 1283</span>&#160;                                                       kernel_h, kernel_size, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>, notFound);</div><div class="line"><a name="l01284"></a><span class="lineno"> 1284</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> kernel_w = <a class="code" href="_caffe_parser_8cpp.xhtml#a69f4a692d0095f6b19b0cd99cd75e465">GET_OPTIONAL_WITH_FALLBACK</a>(param, PoolingParameter,</div><div class="line"><a name="l01285"></a><span class="lineno"> 1285</span>&#160;                                                       kernel_w, kernel_size, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>, notFound);</div><div class="line"><a name="l01286"></a><span class="lineno"> 1286</span>&#160;</div><div class="line"><a name="l01287"></a><span class="lineno"> 1287</span>&#160;    <span class="keywordflow">if</span> ((kernel_h == notFound || kernel_w == notFound) &amp;&amp; param.has_global_pooling())</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;        kernel_h = inputInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a8b5d0f8a24e9d9238f412260a552acf8">GetShape</a>()[2];</div><div class="line"><a name="l01290"></a><span class="lineno"> 1290</span>&#160;        kernel_w = inputInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a8b5d0f8a24e9d9238f412260a552acf8">GetShape</a>()[3];</div><div class="line"><a name="l01291"></a><span class="lineno"> 1291</span>&#160;    }</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;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> stride_h = <a class="code" href="_caffe_parser_8cpp.xhtml#a69f4a692d0095f6b19b0cd99cd75e465">GET_OPTIONAL_WITH_FALLBACK</a>(param, PoolingParameter,</div><div class="line"><a name="l01294"></a><span class="lineno"> 1294</span>&#160;                                                       stride_h, stride, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>, notFound);</div><div class="line"><a name="l01295"></a><span class="lineno"> 1295</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> stride_w = <a class="code" href="_caffe_parser_8cpp.xhtml#a69f4a692d0095f6b19b0cd99cd75e465">GET_OPTIONAL_WITH_FALLBACK</a>(param, PoolingParameter,</div><div class="line"><a name="l01296"></a><span class="lineno"> 1296</span>&#160;                                                       stride_h, stride, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>, notFound);</div><div class="line"><a name="l01297"></a><span class="lineno"> 1297</span>&#160;</div><div class="line"><a name="l01298"></a><span class="lineno"> 1298</span>&#160;    <span class="keywordflow">if</span> ((stride_h == notFound || stride_w == notFound) &amp;&amp; param.has_global_pooling())</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;        stride_h = 1;</div><div class="line"><a name="l01301"></a><span class="lineno"> 1301</span>&#160;        stride_w = 1;</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;</div><div class="line"><a name="l01304"></a><span class="lineno"> 1304</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> pad_h = <a class="code" href="_caffe_parser_8cpp.xhtml#a69f4a692d0095f6b19b0cd99cd75e465">GET_OPTIONAL_WITH_FALLBACK</a>(param, PoolingParameter,</div><div class="line"><a name="l01305"></a><span class="lineno"> 1305</span>&#160;                                                    pad_h, pad, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>, 0u);</div><div class="line"><a name="l01306"></a><span class="lineno"> 1306</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> pad_w = <a class="code" href="_caffe_parser_8cpp.xhtml#a69f4a692d0095f6b19b0cd99cd75e465">GET_OPTIONAL_WITH_FALLBACK</a>(param, PoolingParameter,</div><div class="line"><a name="l01307"></a><span class="lineno"> 1307</span>&#160;                                                    pad_w, pad, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>, 0u);</div><div class="line"><a name="l01308"></a><span class="lineno"> 1308</span>&#160;</div><div class="line"><a name="l01309"></a><span class="lineno"> 1309</span>&#160;    <span class="comment">// Populate Weight and Bias Filter Descriptor</span></div><div class="line"><a name="l01310"></a><span class="lineno"> 1310</span>&#160;    <a class="code" href="structarmnn_1_1_pooling2d_descriptor.xhtml">Pooling2dDescriptor</a> pooling2dDescriptor;</div><div class="line"><a name="l01311"></a><span class="lineno"> 1311</span>&#160;    <span class="keywordflow">if</span> (param.has_pool())</div><div class="line"><a name="l01312"></a><span class="lineno"> 1312</span>&#160;    {</div><div class="line"><a name="l01313"></a><span class="lineno"> 1313</span>&#160;        PoolingParameter_PoolMethod p = param.pool();</div><div class="line"><a name="l01314"></a><span class="lineno"> 1314</span>&#160;        <span class="keywordflow">switch</span> (p)</div><div class="line"><a name="l01315"></a><span class="lineno"> 1315</span>&#160;        {</div><div class="line"><a name="l01316"></a><span class="lineno"> 1316</span>&#160;            <span class="keywordflow">case</span> PoolingParameter_PoolMethod_MAX:</div><div class="line"><a name="l01317"></a><span class="lineno"> 1317</span>&#160;            {</div><div class="line"><a name="l01318"></a><span class="lineno"> 1318</span>&#160;                pooling2dDescriptor.<a class="code" href="structarmnn_1_1_pooling2d_descriptor.xhtml#a0031997bf43bd2747656c31e4977793a">m_PoolType</a> = <a class="code" href="namespacearmnn.xhtml#a961bbfe1db71a848eff5a1f0ab775718a6a061313d22e51e0f25b7cd4dc065233">PoolingAlgorithm::Max</a>;</div><div class="line"><a name="l01319"></a><span class="lineno"> 1319</span>&#160;                <span class="keywordflow">break</span>;</div><div class="line"><a name="l01320"></a><span class="lineno"> 1320</span>&#160;            }</div><div class="line"><a name="l01321"></a><span class="lineno"> 1321</span>&#160;            <span class="keywordflow">case</span> PoolingParameter_PoolMethod_AVE:</div><div class="line"><a name="l01322"></a><span class="lineno"> 1322</span>&#160;            {</div><div class="line"><a name="l01323"></a><span class="lineno"> 1323</span>&#160;                pooling2dDescriptor.<a class="code" href="structarmnn_1_1_pooling2d_descriptor.xhtml#a0031997bf43bd2747656c31e4977793a">m_PoolType</a> = PoolingAlgorithm::Average;</div><div class="line"><a name="l01324"></a><span class="lineno"> 1324</span>&#160;                <span class="keywordflow">break</span>;</div><div class="line"><a name="l01325"></a><span class="lineno"> 1325</span>&#160;            }</div><div class="line"><a name="l01326"></a><span class="lineno"> 1326</span>&#160;            <span class="keywordflow">case</span> PoolingParameter_PoolMethod_STOCHASTIC:</div><div class="line"><a name="l01327"></a><span class="lineno"> 1327</span>&#160;            {</div><div class="line"><a name="l01328"></a><span class="lineno"> 1328</span>&#160;                <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_parse_exception.xhtml">ParseException</a>(</div><div class="line"><a name="l01329"></a><span class="lineno"> 1329</span>&#160;                    fmt::format(<span class="stringliteral">&quot;Pooling Layer: Stochastic Pooling Not Supported. Layer={} {}&quot;</span>,</div><div class="line"><a name="l01330"></a><span class="lineno"> 1330</span>&#160;                                layerParam.name(),</div><div class="line"><a name="l01331"></a><span class="lineno"> 1331</span>&#160;                                <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l01332"></a><span class="lineno"> 1332</span>&#160;            }</div><div class="line"><a name="l01333"></a><span class="lineno"> 1333</span>&#160;            <span class="keywordflow">default</span>:</div><div class="line"><a name="l01334"></a><span class="lineno"> 1334</span>&#160;            {</div><div class="line"><a name="l01335"></a><span class="lineno"> 1335</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="l01336"></a><span class="lineno"> 1336</span>&#160;                    fmt::format(<span class="stringliteral">&quot;Pooling Layer: unknown pooling method: {} for layer: {} {}&quot;</span>,</div><div class="line"><a name="l01337"></a><span class="lineno"> 1337</span>&#160;                                p,</div><div class="line"><a name="l01338"></a><span class="lineno"> 1338</span>&#160;                                layerParam.name(),</div><div class="line"><a name="l01339"></a><span class="lineno"> 1339</span>&#160;                                <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</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"> 1341</span>&#160;        }</div><div class="line"><a name="l01342"></a><span class="lineno"> 1342</span>&#160;    }</div><div class="line"><a name="l01343"></a><span class="lineno"> 1343</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l01344"></a><span class="lineno"> 1344</span>&#160;    {</div><div class="line"><a name="l01345"></a><span class="lineno"> 1345</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="l01346"></a><span class="lineno"> 1346</span>&#160;            fmt::format(<span class="stringliteral">&quot;No Pooling Method Defined for {} {}&quot;</span>,</div><div class="line"><a name="l01347"></a><span class="lineno"> 1347</span>&#160;                        layerParam.name(),</div><div class="line"><a name="l01348"></a><span class="lineno"> 1348</span>&#160;                        <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l01349"></a><span class="lineno"> 1349</span>&#160;    }</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;    pooling2dDescriptor.<a class="code" href="structarmnn_1_1_pooling2d_descriptor.xhtml#ac18546ebbebbb32fe0a03baa9bf2c600">m_PadLeft</a>     = pad_w;</div><div class="line"><a name="l01352"></a><span class="lineno"> 1352</span>&#160;    pooling2dDescriptor.<a class="code" href="structarmnn_1_1_pooling2d_descriptor.xhtml#a002bc30e590d78cbb4f4d12171055ca7">m_PadRight</a>    = pad_w;</div><div class="line"><a name="l01353"></a><span class="lineno"> 1353</span>&#160;    pooling2dDescriptor.<a class="code" href="structarmnn_1_1_pooling2d_descriptor.xhtml#a56b51f56cef50cdfa554258eecdab046">m_PadTop</a>      = pad_h;</div><div class="line"><a name="l01354"></a><span class="lineno"> 1354</span>&#160;    pooling2dDescriptor.<a class="code" href="structarmnn_1_1_pooling2d_descriptor.xhtml#aa9e49717ebdb741e8c767741647fc618">m_PadBottom</a>   = pad_h;</div><div class="line"><a name="l01355"></a><span class="lineno"> 1355</span>&#160;    pooling2dDescriptor.<a class="code" href="structarmnn_1_1_pooling2d_descriptor.xhtml#afe6a3377c4531315354def9023c8fdda">m_StrideX</a>     = stride_w;</div><div class="line"><a name="l01356"></a><span class="lineno"> 1356</span>&#160;    pooling2dDescriptor.<a class="code" href="structarmnn_1_1_pooling2d_descriptor.xhtml#ac1fe174bbadfb39a2b636940c2e647c8">m_StrideY</a>     = stride_h;</div><div class="line"><a name="l01357"></a><span class="lineno"> 1357</span>&#160;    pooling2dDescriptor.<a class="code" href="structarmnn_1_1_pooling2d_descriptor.xhtml#a6d8fb685cc1ff224f25aa127fcf62c86">m_PoolWidth</a>   = kernel_w;</div><div class="line"><a name="l01358"></a><span class="lineno"> 1358</span>&#160;    pooling2dDescriptor.<a class="code" href="structarmnn_1_1_pooling2d_descriptor.xhtml#a5699e8606c37d18c03910b242cd1b010">m_PoolHeight</a>  = kernel_h;</div><div class="line"><a name="l01359"></a><span class="lineno"> 1359</span>&#160;</div><div class="line"><a name="l01360"></a><span class="lineno"> 1360</span>&#160;    pooling2dDescriptor.<a class="code" href="structarmnn_1_1_pooling2d_descriptor.xhtml#affb5b68b3eba3ed45a06c7cde7781962">m_OutputShapeRounding</a> = OutputShapeRounding::Ceiling;</div><div class="line"><a name="l01361"></a><span class="lineno"> 1361</span>&#160;    pooling2dDescriptor.<a class="code" href="structarmnn_1_1_pooling2d_descriptor.xhtml#a8c29d6ea9b4186d69aad5961c910939c">m_PaddingMethod</a>  = PaddingMethod::IgnoreValue;</div><div class="line"><a name="l01362"></a><span class="lineno"> 1362</span>&#160;</div><div class="line"><a name="l01363"></a><span class="lineno"> 1363</span>&#160;    <a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml">armnn::IConnectableLayer</a>* poolingLayer = <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a2db3ae8d422f17d455e0ba0cb6291d2a">m_Network</a>-&gt;AddPooling2dLayer(pooling2dDescriptor,</div><div class="line"><a name="l01364"></a><span class="lineno"> 1364</span>&#160;        layerParam.name().c_str());</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="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> outputInfo(</div><div class="line"><a name="l01367"></a><span class="lineno"> 1367</span>&#160;        { inputInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a8b5d0f8a24e9d9238f412260a552acf8">GetShape</a>()[0],</div><div class="line"><a name="l01368"></a><span class="lineno"> 1368</span>&#160;          inputInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a8b5d0f8a24e9d9238f412260a552acf8">GetShape</a>()[1],</div><div class="line"><a name="l01369"></a><span class="lineno"> 1369</span>&#160;          <span class="keyword">static_cast&lt;</span><span class="keywordtype">unsigned</span> <span class="keywordtype">int</span><span class="keyword">&gt;</span>(ceil(</div><div class="line"><a name="l01370"></a><span class="lineno"> 1370</span>&#160;              static_cast&lt;float&gt;(inputInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a8b5d0f8a24e9d9238f412260a552acf8">GetShape</a>()[2] + 2 * pad_h - kernel_h) /</div><div class="line"><a name="l01371"></a><span class="lineno"> 1371</span>&#160;              armnn::numeric_cast&lt;float&gt;(stride_h))) + 1,</div><div class="line"><a name="l01372"></a><span class="lineno"> 1372</span>&#160;          <span class="keyword">static_cast&lt;</span><span class="keywordtype">unsigned</span> <span class="keywordtype">int</span><span class="keyword">&gt;</span>(ceil(</div><div class="line"><a name="l01373"></a><span class="lineno"> 1373</span>&#160;              static_cast&lt;float&gt;(inputInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a8b5d0f8a24e9d9238f412260a552acf8">GetShape</a>()[3] + 2 * pad_w - kernel_w) /</div><div class="line"><a name="l01374"></a><span class="lineno"> 1374</span>&#160;              armnn::numeric_cast&lt;float&gt;(stride_w))) + 1 },</div><div class="line"><a name="l01375"></a><span class="lineno"> 1375</span>&#160;        DataType::Float32);</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;    <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a9650b8810d4e6734b255ca25d495fe06">GetArmnnOutputSlotForCaffeTop</a>(layerParam.bottom(0)).<a class="code" href="_test_utils_8cpp.xhtml#a0b295acb179f15eb3fb862b32008f782">Connect</a>(poolingLayer-&gt;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml#a6ec9e0eb66d7d6a01240492a0b18104c">GetInputSlot</a>(0));</div><div class="line"><a name="l01378"></a><span class="lineno"> 1378</span>&#160;    poolingLayer-&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="l01379"></a><span class="lineno"> 1379</span>&#160;    <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a0767b1c7ee9cbd014fd97c701a954caa">SetArmnnOutputSlotForCaffeTop</a>(layerParam.top(0), poolingLayer-&gt;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml#a80ac4eda2e7f2757ec9dd96fc96dbd16">GetOutputSlot</a>(0));</div><div class="line"><a name="l01380"></a><span class="lineno"> 1380</span>&#160;}</div><div class="line"><a name="l01381"></a><span class="lineno"> 1381</span>&#160;</div><div class="line"><a name="l01382"></a><span class="lineno"><a class="line" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a5ce905b7412e68d588e08f4afc333aac"> 1382</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a5ce905b7412e68d588e08f4afc333aac">ICaffeParser::CaffeParserImpl::ParseArgmaxLayer</a>(<span class="keyword">const</span> LayerParameter&amp; layerParam)</div><div class="line"><a name="l01383"></a><span class="lineno"> 1383</span>&#160;{</div><div class="line"><a name="l01384"></a><span class="lineno"> 1384</span>&#160;    ValidateNumInputsOutputs(layerParam, 1, 1);</div><div class="line"><a name="l01385"></a><span class="lineno"> 1385</span>&#160;    ArgMaxParameter param = layerParam.argmax_param();</div><div class="line"><a name="l01386"></a><span class="lineno"> 1386</span>&#160;</div><div class="line"><a name="l01387"></a><span class="lineno"> 1387</span>&#160;    BlobShape inputShape = <a class="code" href="namespacearmnn_caffe_parser.xhtml#af3fde7630e7c9df35cae9ed2b435dbed">TensorDescToBlobShape</a>(<a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a9650b8810d4e6734b255ca25d495fe06">GetArmnnOutputSlotForCaffeTop</a>(layerParam.bottom(0)).<a class="code" href="namespacearmnn_utils.xhtml#acee63cd08da47910fc166a1990988fa8">GetTensorInfo</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="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> topK = param.has_top_k() ? param.top_k() : 1;</div><div class="line"><a name="l01390"></a><span class="lineno"> 1390</span>&#160;    <span class="keywordflow">if</span> (topK != 1) {</div><div class="line"><a name="l01391"></a><span class="lineno"> 1391</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="l01392"></a><span class="lineno"> 1392</span>&#160;                fmt::format(<span class="stringliteral">&quot;ArgMaxLayer: Only support top_k equals to 1. Layer={} {}&quot;</span>,</div><div class="line"><a name="l01393"></a><span class="lineno"> 1393</span>&#160;                    layerParam.name(),</div><div class="line"><a name="l01394"></a><span class="lineno"> 1394</span>&#160;                    <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l01395"></a><span class="lineno"> 1395</span>&#160;    }</div><div class="line"><a name="l01396"></a><span class="lineno"> 1396</span>&#160;</div><div class="line"><a name="l01397"></a><span class="lineno"> 1397</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> outMaxVal = param.has_out_max_val() ? param.out_max_val() : <span class="keyword">false</span>;</div><div class="line"><a name="l01398"></a><span class="lineno"> 1398</span>&#160;    <span class="keywordflow">if</span> (outMaxVal) {</div><div class="line"><a name="l01399"></a><span class="lineno"> 1399</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="l01400"></a><span class="lineno"> 1400</span>&#160;                fmt::format(<span class="stringliteral">&quot;ArgMaxLayer: Does not support out_max_val. Layer={} {}&quot;</span>,</div><div class="line"><a name="l01401"></a><span class="lineno"> 1401</span>&#160;                    layerParam.name(),</div><div class="line"><a name="l01402"></a><span class="lineno"> 1402</span>&#160;                    <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l01403"></a><span class="lineno"> 1403</span>&#160;    }</div><div class="line"><a name="l01404"></a><span class="lineno"> 1404</span>&#160;</div><div class="line"><a name="l01405"></a><span class="lineno"> 1405</span>&#160;    <span class="keywordtype">int</span> axis = param.has_axis() ? param.axis() : 1;</div><div class="line"><a name="l01406"></a><span class="lineno"> 1406</span>&#160;    <span class="keywordflow">if</span> (axis &lt; 0) {</div><div class="line"><a name="l01407"></a><span class="lineno"> 1407</span>&#160;        axis = inputShape.dim_size() - axis;</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="keywordflow">if</span> ((axis &lt; 0) || (axis &gt;= inputShape.dim_size())) {</div><div class="line"><a name="l01410"></a><span class="lineno"> 1410</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="l01411"></a><span class="lineno"> 1411</span>&#160;            fmt::format(<span class="stringliteral">&quot;ArgMaxLayer: Invalid axis value which outside range of input dims. &quot;</span></div><div class="line"><a name="l01412"></a><span class="lineno"> 1412</span>&#160;                        <span class="stringliteral">&quot;{}&#39;s input has input dim_size {}, requested axis: {}. {}&quot;</span>,</div><div class="line"><a name="l01413"></a><span class="lineno"> 1413</span>&#160;                        layerParam.name(),</div><div class="line"><a name="l01414"></a><span class="lineno"> 1414</span>&#160;                        inputShape.dim_size(),</div><div class="line"><a name="l01415"></a><span class="lineno"> 1415</span>&#160;                        axis,</div><div class="line"><a name="l01416"></a><span class="lineno"> 1416</span>&#160;                        <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</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;</div><div class="line"><a name="l01419"></a><span class="lineno"> 1419</span>&#160;    <a class="code" href="structarmnn_1_1_arg_min_max_descriptor.xhtml">ArgMinMaxDescriptor</a> desc;</div><div class="line"><a name="l01420"></a><span class="lineno"> 1420</span>&#160;    desc.<a class="code" href="structarmnn_1_1_arg_min_max_descriptor.xhtml#a214c3636fdf0ea5bac8edb42d0e6c7f0">m_Axis</a> = axis;</div><div class="line"><a name="l01421"></a><span class="lineno"> 1421</span>&#160;    desc.<a class="code" href="structarmnn_1_1_arg_min_max_descriptor.xhtml#abce784834696eb928c620f1fafe71a8d">m_Output_Type</a> = <a class="code" href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6accedffbc6e5308e33d3843e8bdc0dad7">armnn::DataType::Signed32</a>;</div><div class="line"><a name="l01422"></a><span class="lineno"> 1422</span>&#160;    desc.<a class="code" href="structarmnn_1_1_arg_min_max_descriptor.xhtml#ab1ae6f520bb1a4da191a0ae907477f23">m_Function</a> = <a class="code" href="namespacearmnn.xhtml#ae7e8cbf71db6a490789ca6dcaa8deeaea6a061313d22e51e0f25b7cd4dc065233">ArgMinMaxFunction::Max</a>;</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;    <a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml">armnn::IConnectableLayer</a>* argmaxLayer = <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a2db3ae8d422f17d455e0ba0cb6291d2a">m_Network</a>-&gt;AddArgMinMaxLayer(desc,</div><div class="line"><a name="l01425"></a><span class="lineno"> 1425</span>&#160;        layerParam.name().c_str());</div><div class="line"><a name="l01426"></a><span class="lineno"> 1426</span>&#160;</div><div class="line"><a name="l01427"></a><span class="lineno"> 1427</span>&#160;    <a class="code" href="classarmnn_1_1_tensor_shape.xhtml">TensorShape</a> outputShape(static_cast&lt;unsigned int&gt;(inputShape.dim_size() - 1));</div><div class="line"><a name="l01428"></a><span class="lineno"> 1428</span>&#160;    <span class="keywordtype">int</span> j = 0;</div><div class="line"><a name="l01429"></a><span class="lineno"> 1429</span>&#160;    <span class="comment">// remove the flatten axis</span></div><div class="line"><a name="l01430"></a><span class="lineno"> 1430</span>&#160;    <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; inputShape.dim_size(); ++i)</div><div class="line"><a name="l01431"></a><span class="lineno"> 1431</span>&#160;    {</div><div class="line"><a name="l01432"></a><span class="lineno"> 1432</span>&#160;        <span class="keywordflow">if</span> (i == axis) <span class="keywordflow">continue</span>;</div><div class="line"><a name="l01433"></a><span class="lineno"> 1433</span>&#160;        outputShape[<span class="keyword">static_cast&lt;</span><span class="keywordtype">unsigned</span> <span class="keywordtype">int</span><span class="keyword">&gt;</span>(j++)] = static_cast&lt;unsigned int&gt;(inputShape.dim(i));</div><div class="line"><a name="l01434"></a><span class="lineno"> 1434</span>&#160;    }</div><div class="line"><a name="l01435"></a><span class="lineno"> 1435</span>&#160;    <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> outputInfo(outputShape, DataType::Signed32);</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;    <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a9650b8810d4e6734b255ca25d495fe06">GetArmnnOutputSlotForCaffeTop</a>(layerParam.bottom(0)).<a class="code" href="_test_utils_8cpp.xhtml#a0b295acb179f15eb3fb862b32008f782">Connect</a>(argmaxLayer-&gt;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml#a6ec9e0eb66d7d6a01240492a0b18104c">GetInputSlot</a>(0));</div><div class="line"><a name="l01438"></a><span class="lineno"> 1438</span>&#160;    argmaxLayer-&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="l01439"></a><span class="lineno"> 1439</span>&#160;    <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a0767b1c7ee9cbd014fd97c701a954caa">SetArmnnOutputSlotForCaffeTop</a>(layerParam.top(0), argmaxLayer-&gt;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml#a80ac4eda2e7f2757ec9dd96fc96dbd16">GetOutputSlot</a>(0));</div><div class="line"><a name="l01440"></a><span class="lineno"> 1440</span>&#160;}</div><div class="line"><a name="l01441"></a><span class="lineno"> 1441</span>&#160;</div><div class="line"><a name="l01442"></a><span class="lineno"><a class="line" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a8449e66d395c0525561e3c67b100bafe"> 1442</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a8449e66d395c0525561e3c67b100bafe">ICaffeParser::CaffeParserImpl::ParseReluLayer</a>(<span class="keyword">const</span> LayerParameter&amp; layerParam)</div><div class="line"><a name="l01443"></a><span class="lineno"> 1443</span>&#160;{</div><div class="line"><a name="l01444"></a><span class="lineno"> 1444</span>&#160;    ValidateNumInputsOutputs(layerParam, 1, 1);</div><div class="line"><a name="l01445"></a><span class="lineno"> 1445</span>&#160;</div><div class="line"><a name="l01446"></a><span class="lineno"> 1446</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">string</span>&amp; name = layerParam.name();</div><div class="line"><a name="l01447"></a><span class="lineno"> 1447</span>&#160;    <span class="keyword">const</span> ReLUParameter&amp; param = layerParam.relu_param();</div><div class="line"><a name="l01448"></a><span class="lineno"> 1448</span>&#160;</div><div class="line"><a name="l01449"></a><span class="lineno"> 1449</span>&#160;    <a class="code" href="structarmnn_1_1_activation_descriptor.xhtml">ActivationDescriptor</a> activationDescriptor;</div><div class="line"><a name="l01450"></a><span class="lineno"> 1450</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">float</span> negativeSlope = param.negative_slope();</div><div class="line"><a name="l01451"></a><span class="lineno"> 1451</span>&#160;    <span class="keywordflow">if</span> (negativeSlope == 0.0f)</div><div class="line"><a name="l01452"></a><span class="lineno"> 1452</span>&#160;    {</div><div class="line"><a name="l01453"></a><span class="lineno"> 1453</span>&#160;        activationDescriptor.<a class="code" href="structarmnn_1_1_activation_descriptor.xhtml#af10fa7883e3579950f477bee92a64844">m_Function</a> = ActivationFunction::ReLu;</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;    <span class="keywordflow">else</span></div><div class="line"><a name="l01456"></a><span class="lineno"> 1456</span>&#160;    {</div><div class="line"><a name="l01457"></a><span class="lineno"> 1457</span>&#160;        activationDescriptor.<a class="code" href="structarmnn_1_1_activation_descriptor.xhtml#af10fa7883e3579950f477bee92a64844">m_Function</a> = ActivationFunction::LeakyReLu;</div><div class="line"><a name="l01458"></a><span class="lineno"> 1458</span>&#160;        activationDescriptor.<a class="code" href="structarmnn_1_1_activation_descriptor.xhtml#a017b2990003a014234f13e999dc7c689">m_A</a> = negativeSlope;</div><div class="line"><a name="l01459"></a><span class="lineno"> 1459</span>&#160;    }</div><div class="line"><a name="l01460"></a><span class="lineno"> 1460</span>&#160;</div><div class="line"><a name="l01461"></a><span class="lineno"> 1461</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a>&amp; inputInfo = <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a9650b8810d4e6734b255ca25d495fe06">GetArmnnOutputSlotForCaffeTop</a>(layerParam.bottom(0)).<a class="code" href="namespacearmnn_utils.xhtml#acee63cd08da47910fc166a1990988fa8">GetTensorInfo</a>();</div><div class="line"><a name="l01462"></a><span class="lineno"> 1462</span>&#160;    <a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml">IConnectableLayer</a>* <span class="keyword">const</span> activationLayer = <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a2db3ae8d422f17d455e0ba0cb6291d2a">m_Network</a>-&gt;AddActivationLayer(activationDescriptor, name.c_str());</div><div class="line"><a name="l01463"></a><span class="lineno"> 1463</span>&#160;    <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a9650b8810d4e6734b255ca25d495fe06">GetArmnnOutputSlotForCaffeTop</a>(layerParam.bottom(0)).<a class="code" href="_test_utils_8cpp.xhtml#a0b295acb179f15eb3fb862b32008f782">Connect</a>(activationLayer-&gt;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml#a6ec9e0eb66d7d6a01240492a0b18104c">GetInputSlot</a>(0));</div><div class="line"><a name="l01464"></a><span class="lineno"> 1464</span>&#160;    activationLayer-&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>(inputInfo);</div><div class="line"><a name="l01465"></a><span class="lineno"> 1465</span>&#160;    <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a0767b1c7ee9cbd014fd97c701a954caa">SetArmnnOutputSlotForCaffeTop</a>(layerParam.top(0), activationLayer-&gt;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml#a80ac4eda2e7f2757ec9dd96fc96dbd16">GetOutputSlot</a>(0));</div><div class="line"><a name="l01466"></a><span class="lineno"> 1466</span>&#160;}</div><div class="line"><a name="l01467"></a><span class="lineno"> 1467</span>&#160;</div><div class="line"><a name="l01468"></a><span class="lineno"><a class="line" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a7785119cfebd2b02ba3be888965e52ba"> 1468</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a7785119cfebd2b02ba3be888965e52ba">ICaffeParser::CaffeParserImpl::ParseLRNLayer</a>(<span class="keyword">const</span> LayerParameter&amp; layerParam)</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;    ValidateNumInputsOutputs(layerParam, 1, 1);</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;    LRNParameter param = layerParam.lrn_param();</div><div class="line"><a name="l01473"></a><span class="lineno"> 1473</span>&#160;</div><div class="line"><a name="l01474"></a><span class="lineno"> 1474</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a>&amp; inputInfo = <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a9650b8810d4e6734b255ca25d495fe06">GetArmnnOutputSlotForCaffeTop</a>(layerParam.bottom(0)).<a class="code" href="namespacearmnn_utils.xhtml#acee63cd08da47910fc166a1990988fa8">GetTensorInfo</a>();</div><div class="line"><a name="l01475"></a><span class="lineno"> 1475</span>&#160;</div><div class="line"><a name="l01476"></a><span class="lineno"> 1476</span>&#160;    <span class="comment">// Ignored BATCH NORMALIZATION Caffe Parameters.</span></div><div class="line"><a name="l01477"></a><span class="lineno"> 1477</span>&#160;    <span class="comment">// Ignored MVN Caffe Parameters.</span></div><div class="line"><a name="l01478"></a><span class="lineno"> 1478</span>&#160;    <span class="comment">// Ignored LRN Caffe Parameters.</span></div><div class="line"><a name="l01479"></a><span class="lineno"> 1479</span>&#160;    <span class="comment">//      Engine</span></div><div class="line"><a name="l01480"></a><span class="lineno"> 1480</span>&#160;</div><div class="line"><a name="l01481"></a><span class="lineno"> 1481</span>&#160;    <a class="code" href="structarmnn_1_1_normalization_descriptor.xhtml">NormalizationDescriptor</a> normalizationDescriptor;</div><div class="line"><a name="l01482"></a><span class="lineno"> 1482</span>&#160;    <span class="keywordflow">if</span> (param.has_norm_region())</div><div class="line"><a name="l01483"></a><span class="lineno"> 1483</span>&#160;    {</div><div class="line"><a name="l01484"></a><span class="lineno"> 1484</span>&#160;        LRNParameter_NormRegion n = param.norm_region();</div><div class="line"><a name="l01485"></a><span class="lineno"> 1485</span>&#160;        <span class="keywordflow">switch</span> (n)</div><div class="line"><a name="l01486"></a><span class="lineno"> 1486</span>&#160;        {</div><div class="line"><a name="l01487"></a><span class="lineno"> 1487</span>&#160;            <span class="keywordflow">case</span> LRNParameter_NormRegion_ACROSS_CHANNELS:</div><div class="line"><a name="l01488"></a><span class="lineno"> 1488</span>&#160;            {</div><div class="line"><a name="l01489"></a><span class="lineno"> 1489</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="l01490"></a><span class="lineno"> 1490</span>&#160;                <span class="keywordflow">break</span>;</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="keywordflow">case</span> LRNParameter_NormRegion_WITHIN_CHANNEL:</div><div class="line"><a name="l01493"></a><span class="lineno"> 1493</span>&#160;            {</div><div class="line"><a name="l01494"></a><span class="lineno"> 1494</span>&#160;                normalizationDescriptor.<a class="code" href="structarmnn_1_1_normalization_descriptor.xhtml#afe1f0f09d49ad2befc01f8789187b7dd">m_NormChannelType</a> = NormalizationAlgorithmChannel::Within;</div><div class="line"><a name="l01495"></a><span class="lineno"> 1495</span>&#160;                <span class="keywordflow">break</span>;</div><div class="line"><a name="l01496"></a><span class="lineno"> 1496</span>&#160;            }</div><div class="line"><a name="l01497"></a><span class="lineno"> 1497</span>&#160;            <span class="keywordflow">default</span>:</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="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_parse_exception.xhtml">ParseException</a>(</div><div class="line"><a name="l01500"></a><span class="lineno"> 1500</span>&#160;                    fmt::format(<span class="stringliteral">&quot;Unknown region {} for LRN layer {} {}&quot;</span>,</div><div class="line"><a name="l01501"></a><span class="lineno"> 1501</span>&#160;                                n,</div><div class="line"><a name="l01502"></a><span class="lineno"> 1502</span>&#160;                                layerParam.name(),</div><div class="line"><a name="l01503"></a><span class="lineno"> 1503</span>&#160;                                <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l01504"></a><span class="lineno"> 1504</span>&#160;            }</div><div class="line"><a name="l01505"></a><span class="lineno"> 1505</span>&#160;        }</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;    <span class="keywordflow">else</span></div><div class="line"><a name="l01508"></a><span class="lineno"> 1508</span>&#160;    {</div><div class="line"><a name="l01509"></a><span class="lineno"> 1509</span>&#160;        <span class="comment">// Caffe defaults to normalization across channels.</span></div><div class="line"><a name="l01510"></a><span class="lineno"> 1510</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="l01511"></a><span class="lineno"> 1511</span>&#160;    }</div><div class="line"><a name="l01512"></a><span class="lineno"> 1512</span>&#160;</div><div class="line"><a name="l01513"></a><span class="lineno"> 1513</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="l01514"></a><span class="lineno"> 1514</span>&#160;    <span class="keywordflow">if</span> (param.has_local_size())</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;        normalizationDescriptor.<a class="code" href="structarmnn_1_1_normalization_descriptor.xhtml#aa70c05f1aad12fbd9d9ec43ea4557b03">m_NormSize</a> = param.local_size();</div><div class="line"><a name="l01517"></a><span class="lineno"> 1517</span>&#160;    }</div><div class="line"><a name="l01518"></a><span class="lineno"> 1518</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l01519"></a><span class="lineno"> 1519</span>&#160;    {</div><div class="line"><a name="l01520"></a><span class="lineno"> 1520</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="l01521"></a><span class="lineno"> 1521</span>&#160;            fmt::format(<span class="stringliteral">&quot;local_size not defined for LRN layer {} {}&quot;</span>,</div><div class="line"><a name="l01522"></a><span class="lineno"> 1522</span>&#160;                        layerParam.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;    <span class="keywordflow">if</span> (param.has_alpha())</div><div class="line"><a name="l01527"></a><span class="lineno"> 1527</span>&#160;    {</div><div class="line"><a name="l01528"></a><span class="lineno"> 1528</span>&#160;        normalizationDescriptor.<a class="code" href="structarmnn_1_1_normalization_descriptor.xhtml#a174279be57d7596eeb04c6b7f7510f99">m_Alpha</a> = param.alpha();</div><div class="line"><a name="l01529"></a><span class="lineno"> 1529</span>&#160;        normalizationDescriptor.<a class="code" href="structarmnn_1_1_normalization_descriptor.xhtml#a174279be57d7596eeb04c6b7f7510f99">m_Alpha</a> /= <a class="code" href="namespacearmnn.xhtml#a375ca3cff9f1b005d1412dc5f3cf5b6e">armnn::numeric_cast</a>&lt;<span class="keywordtype">float</span>&gt;(param.local_size());</div><div class="line"><a name="l01530"></a><span class="lineno"> 1530</span>&#160;    }</div><div class="line"><a name="l01531"></a><span class="lineno"> 1531</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l01532"></a><span class="lineno"> 1532</span>&#160;    {</div><div class="line"><a name="l01533"></a><span class="lineno"> 1533</span>&#160;        <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_parse_exception.xhtml">ParseException</a>(</div><div class="line"><a name="l01534"></a><span class="lineno"> 1534</span>&#160;            fmt::format(<span class="stringliteral">&quot;Alpha not defined for LRN layer {} {}&quot;</span>,</div><div class="line"><a name="l01535"></a><span class="lineno"> 1535</span>&#160;                        layerParam.name(),</div><div class="line"><a name="l01536"></a><span class="lineno"> 1536</span>&#160;                        <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</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;    <span class="keywordflow">if</span> (param.has_beta())</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;        normalizationDescriptor.<a class="code" href="structarmnn_1_1_normalization_descriptor.xhtml#a8275d51ef9a584feb95726ea0522f6e5">m_Beta</a> = param.beta();</div><div class="line"><a name="l01541"></a><span class="lineno"> 1541</span>&#160;    }</div><div class="line"><a name="l01542"></a><span class="lineno"> 1542</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l01543"></a><span class="lineno"> 1543</span>&#160;    {</div><div class="line"><a name="l01544"></a><span class="lineno"> 1544</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="l01545"></a><span class="lineno"> 1545</span>&#160;            fmt::format(<span class="stringliteral">&quot;Beta not defined for LRN layer {} {}&quot;</span>,</div><div class="line"><a name="l01546"></a><span class="lineno"> 1546</span>&#160;                        layerParam.name(),</div><div class="line"><a name="l01547"></a><span class="lineno"> 1547</span>&#160;                        <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</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;</div><div class="line"><a name="l01550"></a><span class="lineno"> 1550</span>&#160;    <span class="keywordflow">if</span> (param.has_k())</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;        normalizationDescriptor.<a class="code" href="structarmnn_1_1_normalization_descriptor.xhtml#a8526ea7cf860d8e7f8340e9f9354f9f0">m_K</a> = param.k();</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;    <span class="keywordflow">else</span></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;        normalizationDescriptor.<a class="code" href="structarmnn_1_1_normalization_descriptor.xhtml#a8526ea7cf860d8e7f8340e9f9354f9f0">m_K</a> = 1;</div><div class="line"><a name="l01557"></a><span class="lineno"> 1557</span>&#160;    }</div><div class="line"><a name="l01558"></a><span class="lineno"> 1558</span>&#160;</div><div class="line"><a name="l01559"></a><span class="lineno"> 1559</span>&#160;    <a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml">IConnectableLayer</a>* <span class="keyword">const</span> normLayer = <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a2db3ae8d422f17d455e0ba0cb6291d2a">m_Network</a>-&gt;AddNormalizationLayer(normalizationDescriptor,</div><div class="line"><a name="l01560"></a><span class="lineno"> 1560</span>&#160;        layerParam.name().c_str());</div><div class="line"><a name="l01561"></a><span class="lineno"> 1561</span>&#160;    <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a9650b8810d4e6734b255ca25d495fe06">GetArmnnOutputSlotForCaffeTop</a>(layerParam.bottom(0)).<a class="code" href="_test_utils_8cpp.xhtml#a0b295acb179f15eb3fb862b32008f782">Connect</a>(normLayer-&gt;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml#a6ec9e0eb66d7d6a01240492a0b18104c">GetInputSlot</a>(0));</div><div class="line"><a name="l01562"></a><span class="lineno"> 1562</span>&#160;    normLayer-&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>(inputInfo);</div><div class="line"><a name="l01563"></a><span class="lineno"> 1563</span>&#160;</div><div class="line"><a name="l01564"></a><span class="lineno"> 1564</span>&#160;    <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a0767b1c7ee9cbd014fd97c701a954caa">SetArmnnOutputSlotForCaffeTop</a>(layerParam.top(0), normLayer-&gt;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml#a80ac4eda2e7f2757ec9dd96fc96dbd16">GetOutputSlot</a>(0));</div><div class="line"><a name="l01565"></a><span class="lineno"> 1565</span>&#160;}</div><div class="line"><a name="l01566"></a><span class="lineno"> 1566</span>&#160;</div><div class="line"><a name="l01567"></a><span class="lineno"><a class="line" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a34f6df4b84de1e269bcf02efeecc3892"> 1567</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a34f6df4b84de1e269bcf02efeecc3892">ICaffeParser::CaffeParserImpl::ParseInnerProductLayer</a>(<span class="keyword">const</span> LayerParameter&amp; layerParam)</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;    InnerProductParameter param = layerParam.inner_product_param();</div><div class="line"><a name="l01570"></a><span class="lineno"> 1570</span>&#160;</div><div class="line"><a name="l01571"></a><span class="lineno"> 1571</span>&#160;    ValidateNumInputsOutputs(layerParam, 1, 1);</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="keywordtype">unsigned</span> <span class="keywordtype">int</span> outputSize = param.num_output();</div><div class="line"><a name="l01574"></a><span class="lineno"> 1574</span>&#160;</div><div class="line"><a name="l01575"></a><span class="lineno"> 1575</span>&#160;    <span class="comment">// Ignored Caffe Parameters:</span></div><div class="line"><a name="l01576"></a><span class="lineno"> 1576</span>&#160;    <span class="comment">// Weight Filler</span></div><div class="line"><a name="l01577"></a><span class="lineno"> 1577</span>&#160;    <span class="comment">// Bias Filler</span></div><div class="line"><a name="l01578"></a><span class="lineno"> 1578</span>&#160;    <span class="comment">// Engine</span></div><div class="line"><a name="l01579"></a><span class="lineno"> 1579</span>&#160;    <span class="comment">// Axis</span></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;    <a class="code" href="structarmnn_1_1_fully_connected_descriptor.xhtml">FullyConnectedDescriptor</a> tensorFullyConnectedDescriptor;</div><div class="line"><a name="l01582"></a><span class="lineno"> 1582</span>&#160;</div><div class="line"><a name="l01583"></a><span class="lineno"> 1583</span>&#160;    <span class="keywordflow">if</span> (param.has_transpose())</div><div class="line"><a name="l01584"></a><span class="lineno"> 1584</span>&#160;    {</div><div class="line"><a name="l01585"></a><span class="lineno"> 1585</span>&#160;        <span class="comment">// If true, assumes transposed weights.</span></div><div class="line"><a name="l01586"></a><span class="lineno"> 1586</span>&#160;        tensorFullyConnectedDescriptor.<a class="code" href="structarmnn_1_1_fully_connected_descriptor.xhtml#a281fcaec86e17c97f7b8402633f6b55a">m_TransposeWeightMatrix</a> = param.transpose();</div><div class="line"><a name="l01587"></a><span class="lineno"> 1587</span>&#160;    }</div><div class="line"><a name="l01588"></a><span class="lineno"> 1588</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l01589"></a><span class="lineno"> 1589</span>&#160;    {</div><div class="line"><a name="l01590"></a><span class="lineno"> 1590</span>&#160;        <span class="comment">// Caffe defaults to transposed.</span></div><div class="line"><a name="l01591"></a><span class="lineno"> 1591</span>&#160;        tensorFullyConnectedDescriptor.<a class="code" href="structarmnn_1_1_fully_connected_descriptor.xhtml#a281fcaec86e17c97f7b8402633f6b55a">m_TransposeWeightMatrix</a> = <span class="keyword">true</span>;</div><div class="line"><a name="l01592"></a><span class="lineno"> 1592</span>&#160;    }</div><div class="line"><a name="l01593"></a><span class="lineno"> 1593</span>&#160;</div><div class="line"><a name="l01594"></a><span class="lineno"> 1594</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a>&amp; inputInfo = <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a9650b8810d4e6734b255ca25d495fe06">GetArmnnOutputSlotForCaffeTop</a>(layerParam.bottom(0)).<a class="code" href="namespacearmnn_utils.xhtml#acee63cd08da47910fc166a1990988fa8">GetTensorInfo</a>();</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;    <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> weightInfo;</div><div class="line"><a name="l01597"></a><span class="lineno"> 1597</span>&#160;    <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> biasInfo;</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;    <span class="comment">// Allows implicit flattening of extra dimensions.</span></div><div class="line"><a name="l01600"></a><span class="lineno"> 1600</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> inputSize = inputInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a8b5d0f8a24e9d9238f412260a552acf8">GetShape</a>()[1];</div><div class="line"><a name="l01601"></a><span class="lineno"> 1601</span>&#160;    <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i = 2; i &lt; inputInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a157e27d41e9f6b21f0d3c025fa47dc24">GetNumDimensions</a>(); ++i)</div><div class="line"><a name="l01602"></a><span class="lineno"> 1602</span>&#160;    {</div><div class="line"><a name="l01603"></a><span class="lineno"> 1603</span>&#160;        inputSize *= inputInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a8b5d0f8a24e9d9238f412260a552acf8">GetShape</a>()[i];</div><div class="line"><a name="l01604"></a><span class="lineno"> 1604</span>&#160;    }</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;    <span class="keyword">const</span> <span class="keywordtype">float</span>* weightDataPtr = GetArrayPtrFromBlob(layerParam, 0);</div><div class="line"><a name="l01607"></a><span class="lineno"> 1607</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> swTD[2] = { outputSize, inputSize };</div><div class="line"><a name="l01608"></a><span class="lineno"> 1608</span>&#160;    <a class="code" href="classarmnn_1_1_const_tensor.xhtml">ConstTensor</a> weights(<a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a>(2, swTD, DataType::Float32), weightDataPtr);</div><div class="line"><a name="l01609"></a><span class="lineno"> 1609</span>&#160;</div><div class="line"><a name="l01610"></a><span class="lineno"> 1610</span>&#160;    tensorFullyConnectedDescriptor.<a class="code" href="structarmnn_1_1_fully_connected_descriptor.xhtml#aea202e14d8874cefd9a0f778022b7e25">m_BiasEnabled</a> = <span class="keyword">true</span>;</div><div class="line"><a name="l01611"></a><span class="lineno"> 1611</span>&#160;    <span class="comment">// Todo: check whether bias enabled.</span></div><div class="line"><a name="l01612"></a><span class="lineno"> 1612</span>&#160;    <a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml">armnn::IConnectableLayer</a>* fullyConnectedLayer = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l01613"></a><span class="lineno"> 1613</span>&#160;    <span class="keywordflow">if</span> (tensorFullyConnectedDescriptor.<a class="code" href="structarmnn_1_1_fully_connected_descriptor.xhtml#aea202e14d8874cefd9a0f778022b7e25">m_BiasEnabled</a>)</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="comment">// BIAS VALUE</span></div><div class="line"><a name="l01616"></a><span class="lineno"> 1616</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">float</span>* biasDataPtr = GetArrayPtrFromBlob(layerParam, 1);</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"> 1618</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> sbTD[1] = { outputSize };</div><div class="line"><a name="l01619"></a><span class="lineno"> 1619</span>&#160;</div><div class="line"><a name="l01620"></a><span class="lineno"> 1620</span>&#160;        <a class="code" href="classarmnn_1_1_const_tensor.xhtml">ConstTensor</a> biases(<a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a>(1, sbTD, DataType::Float32), biasDataPtr);</div><div class="line"><a name="l01621"></a><span class="lineno"> 1621</span>&#160;</div><div class="line"><a name="l01622"></a><span class="lineno"> 1622</span>&#160;        fullyConnectedLayer = <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a2db3ae8d422f17d455e0ba0cb6291d2a">m_Network</a>-&gt;AddFullyConnectedLayer(tensorFullyConnectedDescriptor,</div><div class="line"><a name="l01623"></a><span class="lineno"> 1623</span>&#160;                                                                weights,</div><div class="line"><a name="l01624"></a><span class="lineno"> 1624</span>&#160;                                                                <a class="code" href="classarmnn_1_1_optional.xhtml">Optional&lt;ConstTensor&gt;</a>(biases),</div><div class="line"><a name="l01625"></a><span class="lineno"> 1625</span>&#160;                                                                layerParam.name().c_str());</div><div class="line"><a name="l01626"></a><span class="lineno"> 1626</span>&#160;    }</div><div class="line"><a name="l01627"></a><span class="lineno"> 1627</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l01628"></a><span class="lineno"> 1628</span>&#160;    {</div><div class="line"><a name="l01629"></a><span class="lineno"> 1629</span>&#160;        fullyConnectedLayer = <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a2db3ae8d422f17d455e0ba0cb6291d2a">m_Network</a>-&gt;AddFullyConnectedLayer(tensorFullyConnectedDescriptor,</div><div class="line"><a name="l01630"></a><span class="lineno"> 1630</span>&#160;                                                                weights,</div><div class="line"><a name="l01631"></a><span class="lineno"> 1631</span>&#160;                                                                <a class="code" href="structarmnn_1_1_empty_optional.xhtml">EmptyOptional</a>(),</div><div class="line"><a name="l01632"></a><span class="lineno"> 1632</span>&#160;                                                                layerParam.name().c_str());</div><div class="line"><a name="l01633"></a><span class="lineno"> 1633</span>&#160;    }</div><div class="line"><a name="l01634"></a><span class="lineno"> 1634</span>&#160;</div><div class="line"><a name="l01635"></a><span class="lineno"> 1635</span>&#160;    <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> outputInfo({ inputInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a8b5d0f8a24e9d9238f412260a552acf8">GetShape</a>()[0], outputSize }, DataType::Float32);</div><div class="line"><a name="l01636"></a><span class="lineno"> 1636</span>&#160;    <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a9650b8810d4e6734b255ca25d495fe06">GetArmnnOutputSlotForCaffeTop</a>(layerParam.bottom(0)).<a class="code" href="_test_utils_8cpp.xhtml#a0b295acb179f15eb3fb862b32008f782">Connect</a>(fullyConnectedLayer-&gt;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml#a6ec9e0eb66d7d6a01240492a0b18104c">GetInputSlot</a>(0));</div><div class="line"><a name="l01637"></a><span class="lineno"> 1637</span>&#160;    fullyConnectedLayer-&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="l01638"></a><span class="lineno"> 1638</span>&#160;    <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a0767b1c7ee9cbd014fd97c701a954caa">SetArmnnOutputSlotForCaffeTop</a>(layerParam.top(0), fullyConnectedLayer-&gt;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml#a80ac4eda2e7f2757ec9dd96fc96dbd16">GetOutputSlot</a>(0));</div><div class="line"><a name="l01639"></a><span class="lineno"> 1639</span>&#160;}</div><div class="line"><a name="l01640"></a><span class="lineno"> 1640</span>&#160;</div><div class="line"><a name="l01641"></a><span class="lineno"><a class="line" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a1c0594bf03dfbb44029465d3466127b3"> 1641</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a1c0594bf03dfbb44029465d3466127b3">ICaffeParser::CaffeParserImpl::ParseSoftmaxLayer</a>(<span class="keyword">const</span> LayerParameter&amp; layerParam)</div><div class="line"><a name="l01642"></a><span class="lineno"> 1642</span>&#160;{</div><div class="line"><a name="l01643"></a><span class="lineno"> 1643</span>&#160;    ValidateNumInputsOutputs(layerParam, 1, 1);</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;    SoftmaxParameter param = layerParam.softmax_param();</div><div class="line"><a name="l01646"></a><span class="lineno"> 1646</span>&#160;</div><div class="line"><a name="l01647"></a><span class="lineno"> 1647</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a>&amp; inputInfo = <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a9650b8810d4e6734b255ca25d495fe06">GetArmnnOutputSlotForCaffeTop</a>(layerParam.bottom(0)).<a class="code" href="namespacearmnn_utils.xhtml#acee63cd08da47910fc166a1990988fa8">GetTensorInfo</a>();</div><div class="line"><a name="l01648"></a><span class="lineno"> 1648</span>&#160;</div><div class="line"><a name="l01649"></a><span class="lineno"> 1649</span>&#160;    <span class="comment">// Ignored Caffe Parameters:</span></div><div class="line"><a name="l01650"></a><span class="lineno"> 1650</span>&#160;    <span class="comment">//      axis</span></div><div class="line"><a name="l01651"></a><span class="lineno"> 1651</span>&#160;    <span class="comment">//      Engine</span></div><div class="line"><a name="l01652"></a><span class="lineno"> 1652</span>&#160;</div><div class="line"><a name="l01653"></a><span class="lineno"> 1653</span>&#160;    <a class="code" href="structarmnn_1_1_softmax_descriptor.xhtml">armnn::SoftmaxDescriptor</a> softmaxDescriptor;</div><div class="line"><a name="l01654"></a><span class="lineno"> 1654</span>&#160;    softmaxDescriptor.<a class="code" href="structarmnn_1_1_softmax_descriptor.xhtml#a214c3636fdf0ea5bac8edb42d0e6c7f0">m_Axis</a> = 1;</div><div class="line"><a name="l01655"></a><span class="lineno"> 1655</span>&#160;    <a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml">armnn::IConnectableLayer</a>* <span class="keyword">const</span> softmaxLayer = <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a2db3ae8d422f17d455e0ba0cb6291d2a">m_Network</a>-&gt;AddSoftmaxLayer(</div><div class="line"><a name="l01656"></a><span class="lineno"> 1656</span>&#160;        softmaxDescriptor,</div><div class="line"><a name="l01657"></a><span class="lineno"> 1657</span>&#160;        layerParam.name().c_str());</div><div class="line"><a name="l01658"></a><span class="lineno"> 1658</span>&#160;    <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a9650b8810d4e6734b255ca25d495fe06">GetArmnnOutputSlotForCaffeTop</a>(layerParam.bottom(0)).<a class="code" href="_test_utils_8cpp.xhtml#a0b295acb179f15eb3fb862b32008f782">Connect</a>(softmaxLayer-&gt;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml#a6ec9e0eb66d7d6a01240492a0b18104c">GetInputSlot</a>(0));</div><div class="line"><a name="l01659"></a><span class="lineno"> 1659</span>&#160;    softmaxLayer-&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>(inputInfo);</div><div class="line"><a name="l01660"></a><span class="lineno"> 1660</span>&#160;    <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a0767b1c7ee9cbd014fd97c701a954caa">SetArmnnOutputSlotForCaffeTop</a>(layerParam.top(0), softmaxLayer-&gt;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml#a80ac4eda2e7f2757ec9dd96fc96dbd16">GetOutputSlot</a>(0));</div><div class="line"><a name="l01661"></a><span class="lineno"> 1661</span>&#160;}</div><div class="line"><a name="l01662"></a><span class="lineno"> 1662</span>&#160;</div><div class="line"><a name="l01663"></a><span class="lineno"><a class="line" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a99a846a21b3a6ec97cc1d4344b91df36"> 1663</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a99a846a21b3a6ec97cc1d4344b91df36">ICaffeParser::CaffeParserImpl::ParseEltwiseLayer</a>(<span class="keyword">const</span> LayerParameter&amp; layerParam)</div><div class="line"><a name="l01664"></a><span class="lineno"> 1664</span>&#160;{</div><div class="line"><a name="l01665"></a><span class="lineno"> 1665</span>&#160;    ValidateNumInputsOutputs(layerParam, 2, 1);</div><div class="line"><a name="l01666"></a><span class="lineno"> 1666</span>&#160;</div><div class="line"><a name="l01667"></a><span class="lineno"> 1667</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a>&amp; inputInfo = <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a9650b8810d4e6734b255ca25d495fe06">GetArmnnOutputSlotForCaffeTop</a>(layerParam.bottom(0)).<a class="code" href="namespacearmnn_utils.xhtml#acee63cd08da47910fc166a1990988fa8">GetTensorInfo</a>();</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;    <span class="comment">// Ignored Caffe Parameters:</span></div><div class="line"><a name="l01670"></a><span class="lineno"> 1670</span>&#160;    <span class="comment">//      coeff</span></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;    EltwiseParameter_EltwiseOp operation = EltwiseParameter_EltwiseOp_SUM; <span class="comment">// Defaults to sum as per caffe.</span></div><div class="line"><a name="l01673"></a><span class="lineno"> 1673</span>&#160;</div><div class="line"><a name="l01674"></a><span class="lineno"> 1674</span>&#160;    <span class="keywordflow">if</span> (layerParam.has_eltwise_param() &amp;&amp; layerParam.eltwise_param().has_operation())</div><div class="line"><a name="l01675"></a><span class="lineno"> 1675</span>&#160;    {</div><div class="line"><a name="l01676"></a><span class="lineno"> 1676</span>&#160;        operation = layerParam.eltwise_param().operation();</div><div class="line"><a name="l01677"></a><span class="lineno"> 1677</span>&#160;    }</div><div class="line"><a name="l01678"></a><span class="lineno"> 1678</span>&#160;</div><div class="line"><a name="l01679"></a><span class="lineno"> 1679</span>&#160;    <a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml">armnn::IConnectableLayer</a>* newLayer = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l01680"></a><span class="lineno"> 1680</span>&#160;    <span class="keywordflow">switch</span> (operation)</div><div class="line"><a name="l01681"></a><span class="lineno"> 1681</span>&#160;    {</div><div class="line"><a name="l01682"></a><span class="lineno"> 1682</span>&#160;        <span class="keywordflow">case</span> EltwiseParameter_EltwiseOp_SUM:</div><div class="line"><a name="l01683"></a><span class="lineno"> 1683</span>&#160;        {</div><div class="line"><a name="l01684"></a><span class="lineno"> 1684</span>&#160;            newLayer = <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a2db3ae8d422f17d455e0ba0cb6291d2a">m_Network</a>-&gt;AddAdditionLayer(layerParam.name().c_str());</div><div class="line"><a name="l01685"></a><span class="lineno"> 1685</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l01686"></a><span class="lineno"> 1686</span>&#160;        }</div><div class="line"><a name="l01687"></a><span class="lineno"> 1687</span>&#160;        <span class="keywordflow">case</span> EltwiseParameter_EltwiseOp_PROD:</div><div class="line"><a name="l01688"></a><span class="lineno"> 1688</span>&#160;        {</div><div class="line"><a name="l01689"></a><span class="lineno"> 1689</span>&#160;            newLayer = <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a2db3ae8d422f17d455e0ba0cb6291d2a">m_Network</a>-&gt;AddMultiplicationLayer(layerParam.name().c_str());</div><div class="line"><a name="l01690"></a><span class="lineno"> 1690</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l01691"></a><span class="lineno"> 1691</span>&#160;        }</div><div class="line"><a name="l01692"></a><span class="lineno"> 1692</span>&#160;        <span class="keywordflow">default</span>:</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;            <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_parse_exception.xhtml">ParseException</a>(</div><div class="line"><a name="l01695"></a><span class="lineno"> 1695</span>&#160;                fmt::format(<span class="stringliteral">&quot;Unsupported operation {} in Eltwise layer {} {}&quot;</span>,</div><div class="line"><a name="l01696"></a><span class="lineno"> 1696</span>&#160;                            operation,</div><div class="line"><a name="l01697"></a><span class="lineno"> 1697</span>&#160;                            layerParam.name(),</div><div class="line"><a name="l01698"></a><span class="lineno"> 1698</span>&#160;                            <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l01699"></a><span class="lineno"> 1699</span>&#160;        }</div><div class="line"><a name="l01700"></a><span class="lineno"> 1700</span>&#160;    }</div><div class="line"><a name="l01701"></a><span class="lineno"> 1701</span>&#160;</div><div class="line"><a name="l01702"></a><span class="lineno"> 1702</span>&#160;    <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a9650b8810d4e6734b255ca25d495fe06">GetArmnnOutputSlotForCaffeTop</a>(layerParam.bottom(0)).<a class="code" href="_test_utils_8cpp.xhtml#a0b295acb179f15eb3fb862b32008f782">Connect</a>(newLayer-&gt;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml#a6ec9e0eb66d7d6a01240492a0b18104c">GetInputSlot</a>(0));</div><div class="line"><a name="l01703"></a><span class="lineno"> 1703</span>&#160;    <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a9650b8810d4e6734b255ca25d495fe06">GetArmnnOutputSlotForCaffeTop</a>(layerParam.bottom(1)).<a class="code" href="_test_utils_8cpp.xhtml#a0b295acb179f15eb3fb862b32008f782">Connect</a>(newLayer-&gt;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml#a6ec9e0eb66d7d6a01240492a0b18104c">GetInputSlot</a>(1));</div><div class="line"><a name="l01704"></a><span class="lineno"> 1704</span>&#160;    newLayer-&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>(inputInfo);</div><div class="line"><a name="l01705"></a><span class="lineno"> 1705</span>&#160;    <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a0767b1c7ee9cbd014fd97c701a954caa">SetArmnnOutputSlotForCaffeTop</a>(layerParam.top(0), newLayer-&gt;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml#a80ac4eda2e7f2757ec9dd96fc96dbd16">GetOutputSlot</a>(0));</div><div class="line"><a name="l01706"></a><span class="lineno"> 1706</span>&#160;}</div><div class="line"><a name="l01707"></a><span class="lineno"> 1707</span>&#160;</div><div class="line"><a name="l01708"></a><span class="lineno"><a class="line" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#aa0f0ff1cae05c1a0d7cc11b498714312"> 1708</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#aa0f0ff1cae05c1a0d7cc11b498714312">ICaffeParser::CaffeParserImpl::ParseConcatLayer</a>(<span class="keyword">const</span> LayerParameter&amp; layerParam)</div><div class="line"><a name="l01709"></a><span class="lineno"> 1709</span>&#160;{</div><div class="line"><a name="l01710"></a><span class="lineno"> 1710</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>(layerParam.bottom_size());</div><div class="line"><a name="l01711"></a><span class="lineno"> 1711</span>&#160;    <span class="comment">// We assume concat happens along the channel dimension, which is 1 in (0, 1, 2, 3).</span></div><div class="line"><a name="l01712"></a><span class="lineno"> 1712</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> concatDim = 1;</div><div class="line"><a name="l01713"></a><span class="lineno"> 1713</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> numOfDims = 4;</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="comment">// we only consider 4-D tensor here</span></div><div class="line"><a name="l01716"></a><span class="lineno"> 1716</span>&#160;    <a class="code" href="structarmnn_1_1_origins_descriptor.xhtml">OriginsDescriptor</a> concatDescriptor(static_cast&lt;uint32_t&gt;(numInputs), numOfDims);</div><div class="line"><a name="l01717"></a><span class="lineno"> 1717</span>&#160;    std::vector&lt;unsigned int&gt;mergeDimSizes(numOfDims, 0u);</div><div class="line"><a name="l01718"></a><span class="lineno"> 1718</span>&#160;</div><div class="line"><a name="l01719"></a><span class="lineno"> 1719</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> mergeDim = 0;</div><div class="line"><a name="l01720"></a><span class="lineno"> 1720</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="l01721"></a><span class="lineno"> 1721</span>&#160;    {</div><div class="line"><a name="l01722"></a><span class="lineno"> 1722</span>&#160;        <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a>&amp; inputInfo = <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a9650b8810d4e6734b255ca25d495fe06">GetArmnnOutputSlotForCaffeTop</a>(</div><div class="line"><a name="l01723"></a><span class="lineno"> 1723</span>&#160;            layerParam.bottom(armnn::numeric_cast&lt;int&gt;(viewIndex))).<a class="code" href="namespacearmnn_utils.xhtml#acee63cd08da47910fc166a1990988fa8">GetTensorInfo</a>();</div><div class="line"><a name="l01724"></a><span class="lineno"> 1724</span>&#160;        <span class="comment">// Checks whether the dimensions of the input tensors are actually 4.</span></div><div class="line"><a name="l01725"></a><span class="lineno"> 1725</span>&#160;        <span class="keywordflow">if</span> (inputInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a157e27d41e9f6b21f0d3c025fa47dc24">GetNumDimensions</a>()!=4)</div><div class="line"><a name="l01726"></a><span class="lineno"> 1726</span>&#160;        {</div><div class="line"><a name="l01727"></a><span class="lineno"> 1727</span>&#160;            <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_parse_exception.xhtml">ParseException</a>(</div><div class="line"><a name="l01728"></a><span class="lineno"> 1728</span>&#160;                fmt::format(<span class="stringliteral">&quot;The number of dimensions for input tensors of &quot;</span></div><div class="line"><a name="l01729"></a><span class="lineno"> 1729</span>&#160;                            <span class="stringliteral">&quot;the concatenation op should be 4. Inputs of {} has &quot;</span></div><div class="line"><a name="l01730"></a><span class="lineno"> 1730</span>&#160;                            <span class="stringliteral">&quot;{} dimensions. {}&quot;</span>,</div><div class="line"><a name="l01731"></a><span class="lineno"> 1731</span>&#160;                            layerParam.name(),</div><div class="line"><a name="l01732"></a><span class="lineno"> 1732</span>&#160;                            inputInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a157e27d41e9f6b21f0d3c025fa47dc24">GetNumDimensions</a>(),</div><div class="line"><a name="l01733"></a><span class="lineno"> 1733</span>&#160;                            <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l01734"></a><span class="lineno"> 1734</span>&#160;        }</div><div class="line"><a name="l01735"></a><span class="lineno"> 1735</span>&#160;</div><div class="line"><a name="l01736"></a><span class="lineno"> 1736</span>&#160;        mergeDimSizes[0] = inputInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a8b5d0f8a24e9d9238f412260a552acf8">GetShape</a>()[0];</div><div class="line"><a name="l01737"></a><span class="lineno"> 1737</span>&#160;        mergeDimSizes[1] = inputInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a8b5d0f8a24e9d9238f412260a552acf8">GetShape</a>()[1];</div><div class="line"><a name="l01738"></a><span class="lineno"> 1738</span>&#160;        mergeDimSizes[2] = inputInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a8b5d0f8a24e9d9238f412260a552acf8">GetShape</a>()[2];</div><div class="line"><a name="l01739"></a><span class="lineno"> 1739</span>&#160;        mergeDimSizes[3] = inputInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a8b5d0f8a24e9d9238f412260a552acf8">GetShape</a>()[3];</div><div class="line"><a name="l01740"></a><span class="lineno"> 1740</span>&#160;</div><div class="line"><a name="l01741"></a><span class="lineno"> 1741</span>&#160;        <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> j = 0; j &lt; concatDim; ++j)</div><div class="line"><a name="l01742"></a><span class="lineno"> 1742</span>&#160;        {</div><div class="line"><a name="l01743"></a><span class="lineno"> 1743</span>&#160;            concatDescriptor.<a class="code" href="structarmnn_1_1_origins_descriptor.xhtml#a2b125117aa61f9baf3a9cb8658aa61a2">SetViewOriginCoord</a>(viewIndex, j, 0);</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;</div><div class="line"><a name="l01746"></a><span class="lineno"> 1746</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="l01747"></a><span class="lineno"> 1747</span>&#160;        mergeDim += mergeDimSizes[concatDim];</div><div class="line"><a name="l01748"></a><span class="lineno"> 1748</span>&#160;</div><div class="line"><a name="l01749"></a><span class="lineno"> 1749</span>&#160;        <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> j = concatDim+1; j &lt; numOfDims; ++j)</div><div class="line"><a name="l01750"></a><span class="lineno"> 1750</span>&#160;        {</div><div class="line"><a name="l01751"></a><span class="lineno"> 1751</span>&#160;            concatDescriptor.<a class="code" href="structarmnn_1_1_origins_descriptor.xhtml#a2b125117aa61f9baf3a9cb8658aa61a2">SetViewOriginCoord</a>(viewIndex, j, 0);</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;    mergeDimSizes[concatDim] = mergeDim;</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;    <a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml">armnn::IConnectableLayer</a>* concatlayer = <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a2db3ae8d422f17d455e0ba0cb6291d2a">m_Network</a>-&gt;AddConcatLayer(concatDescriptor, layerParam.name().c_str());</div><div class="line"><a name="l01757"></a><span class="lineno"> 1757</span>&#160;    <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i = 0; i &lt; numInputs; ++i)</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"> 1759</span>&#160;        <a class="code" href="classarmnn_1_1_i_output_slot.xhtml">armnn::IOutputSlot</a>&amp; outputSlot = <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a9650b8810d4e6734b255ca25d495fe06">GetArmnnOutputSlotForCaffeTop</a>(layerParam.bottom(armnn::numeric_cast&lt;int&gt;(i)));</div><div class="line"><a name="l01760"></a><span class="lineno"> 1760</span>&#160;        outputSlot.<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#ac1835f8756a9f03c02fcf9664e3a0fce">Connect</a>(concatlayer-&gt;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml#a6ec9e0eb66d7d6a01240492a0b18104c">GetInputSlot</a>(i));</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;</div><div class="line"><a name="l01763"></a><span class="lineno"> 1763</span>&#160;    concatlayer-&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>(numOfDims, mergeDimSizes.data(), DataType::Float32));</div><div class="line"><a name="l01764"></a><span class="lineno"> 1764</span>&#160;    <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a0767b1c7ee9cbd014fd97c701a954caa">SetArmnnOutputSlotForCaffeTop</a>(layerParam.top(0), concatlayer-&gt;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml#a80ac4eda2e7f2757ec9dd96fc96dbd16">GetOutputSlot</a>(0));</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;</div><div class="line"><a name="l01767"></a><span class="lineno"><a class="line" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a940483591995bb812cfcd1595dba83c3"> 1767</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a940483591995bb812cfcd1595dba83c3">ICaffeParser::CaffeParserImpl::ParseBatchNormLayer</a>(<span class="keyword">const</span> LayerParameter&amp; layerParam)</div><div class="line"><a name="l01768"></a><span class="lineno"> 1768</span>&#160;{</div><div class="line"><a name="l01769"></a><span class="lineno"> 1769</span>&#160;    ValidateNumInputsOutputs(layerParam, 1, 1);</div><div class="line"><a name="l01770"></a><span class="lineno"> 1770</span>&#160;</div><div class="line"><a name="l01771"></a><span class="lineno"> 1771</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a>&amp; inputInfo = <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a9650b8810d4e6734b255ca25d495fe06">GetArmnnOutputSlotForCaffeTop</a>(layerParam.bottom(0)).<a class="code" href="namespacearmnn_utils.xhtml#acee63cd08da47910fc166a1990988fa8">GetTensorInfo</a>();</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="keywordtype">string</span> name = layerParam.name();</div><div class="line"><a name="l01774"></a><span class="lineno"> 1774</span>&#160;</div><div class="line"><a name="l01775"></a><span class="lineno"> 1775</span>&#160;    BatchNormParameter param = layerParam.batch_norm_param();</div><div class="line"><a name="l01776"></a><span class="lineno"> 1776</span>&#160;    <span class="comment">// If use_global_stats is not explicitly set in the model, assume it to be true (its default value</span></div><div class="line"><a name="l01777"></a><span class="lineno"> 1777</span>&#160;    <span class="comment">// when the network is in the testing phase).</span></div><div class="line"><a name="l01778"></a><span class="lineno"> 1778</span>&#160;    <span class="keywordflow">if</span> (param.has_use_global_stats())</div><div class="line"><a name="l01779"></a><span class="lineno"> 1779</span>&#160;    {</div><div class="line"><a name="l01780"></a><span class="lineno"> 1780</span>&#160;        <span class="keywordflow">if</span> (!param.use_global_stats())</div><div class="line"><a name="l01781"></a><span class="lineno"> 1781</span>&#160;        {</div><div class="line"><a name="l01782"></a><span class="lineno"> 1782</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="l01783"></a><span class="lineno"> 1783</span>&#160;                fmt::format(<span class="stringliteral">&quot;Error parsing Batch Norm layer &#39;{}&#39;: &quot;</span></div><div class="line"><a name="l01784"></a><span class="lineno"> 1784</span>&#160;                            <span class="stringliteral">&quot;Parameter &#39;use_global_stats&#39; is set to false, which is &quot;</span></div><div class="line"><a name="l01785"></a><span class="lineno"> 1785</span>&#160;                            <span class="stringliteral">&quot;unsupported (value used for training). {}&quot;</span>,</div><div class="line"><a name="l01786"></a><span class="lineno"> 1786</span>&#160;                            name,</div><div class="line"><a name="l01787"></a><span class="lineno"> 1787</span>&#160;                            <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l01788"></a><span class="lineno"> 1788</span>&#160;        }</div><div class="line"><a name="l01789"></a><span class="lineno"> 1789</span>&#160;    }</div><div class="line"><a name="l01790"></a><span class="lineno"> 1790</span>&#160;</div><div class="line"><a name="l01791"></a><span class="lineno"> 1791</span>&#160;    <a class="code" href="structarmnn_1_1_batch_normalization_descriptor.xhtml">BatchNormalizationDescriptor</a> desc;</div><div class="line"><a name="l01792"></a><span class="lineno"> 1792</span>&#160;    desc.<a class="code" href="structarmnn_1_1_batch_normalization_descriptor.xhtml#a11c821c7524251004a72ed13c510853c">m_Eps</a> = param.eps();</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;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channels = inputInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a8b5d0f8a24e9d9238f412260a552acf8">GetShape</a>()[1];</div><div class="line"><a name="l01795"></a><span class="lineno"> 1795</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> shape[]  = {channels};</div><div class="line"><a name="l01796"></a><span class="lineno"> 1796</span>&#160;</div><div class="line"><a name="l01797"></a><span class="lineno"> 1797</span>&#160;    vector&lt;float&gt; meanData(channels);</div><div class="line"><a name="l01798"></a><span class="lineno"> 1798</span>&#160;    GetDataFromBlob(layerParam, meanData, 0);</div><div class="line"><a name="l01799"></a><span class="lineno"> 1799</span>&#160;</div><div class="line"><a name="l01800"></a><span class="lineno"> 1800</span>&#160;    vector&lt;float&gt; varianceData(channels);</div><div class="line"><a name="l01801"></a><span class="lineno"> 1801</span>&#160;    GetDataFromBlob(layerParam, varianceData, 1);</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="comment">// Reads moving average factor and applies scaling (if required).</span></div><div class="line"><a name="l01804"></a><span class="lineno"> 1804</span>&#160;    <span class="keyword">const</span> BlobProto&amp; blob = layerParam.blobs(armnn::numeric_cast&lt;int&gt;(2));</div><div class="line"><a name="l01805"></a><span class="lineno"> 1805</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">float</span> movingAverageFactor = blob.data(armnn::numeric_cast&lt;int&gt;(0));</div><div class="line"><a name="l01806"></a><span class="lineno"> 1806</span>&#160;    <span class="keywordflow">if</span>(movingAverageFactor != 0.0f)</div><div class="line"><a name="l01807"></a><span class="lineno"> 1807</span>&#160;    {</div><div class="line"><a name="l01808"></a><span class="lineno"> 1808</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">float</span> scaleFactor = 1.0f / movingAverageFactor;</div><div class="line"><a name="l01809"></a><span class="lineno"> 1809</span>&#160;        <span class="keyword">auto</span> scaleFunction = [scaleFactor](<span class="keywordtype">float</span> f) -&gt; <span class="keywordtype">float</span> { <span class="keywordflow">return</span> f * scaleFactor; };</div><div class="line"><a name="l01810"></a><span class="lineno"> 1810</span>&#160;</div><div class="line"><a name="l01811"></a><span class="lineno"> 1811</span>&#160;        std::transform(varianceData.begin(), varianceData.end(), varianceData.begin(), scaleFunction);</div><div class="line"><a name="l01812"></a><span class="lineno"> 1812</span>&#160;        std::transform(meanData.begin(), meanData.end(), meanData.begin(), scaleFunction);</div><div class="line"><a name="l01813"></a><span class="lineno"> 1813</span>&#160;    }</div><div class="line"><a name="l01814"></a><span class="lineno"> 1814</span>&#160;</div><div class="line"><a name="l01815"></a><span class="lineno"> 1815</span>&#160;    <span class="comment">// Identifies scale operation.</span></div><div class="line"><a name="l01816"></a><span class="lineno"> 1816</span>&#160;    vector&lt;float&gt; betaData(channels, 0.0f);</div><div class="line"><a name="l01817"></a><span class="lineno"> 1817</span>&#160;    vector&lt;float&gt; gammaData(channels, 1.0f);</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;    <a class="code" href="classarmnn_1_1_const_tensor.xhtml">ConstTensor</a> mean(<a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a>(1, shape, <a class="code" href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6a166495adc0d0f53bee6baecc577f5204">armnn::DataType::Float32</a>), meanData);</div><div class="line"><a name="l01820"></a><span class="lineno"> 1820</span>&#160;    <a class="code" href="classarmnn_1_1_const_tensor.xhtml">ConstTensor</a> variance(<a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a>(1, shape, <a class="code" href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6a166495adc0d0f53bee6baecc577f5204">armnn::DataType::Float32</a>), varianceData);</div><div class="line"><a name="l01821"></a><span class="lineno"> 1821</span>&#160;    <a class="code" href="classarmnn_1_1_const_tensor.xhtml">ConstTensor</a> beta(<a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a>(1, shape, <a class="code" href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6a166495adc0d0f53bee6baecc577f5204">armnn::DataType::Float32</a>), betaData);</div><div class="line"><a name="l01822"></a><span class="lineno"> 1822</span>&#160;    <a class="code" href="classarmnn_1_1_const_tensor.xhtml">ConstTensor</a> gamma(<a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a>(1, shape, <a class="code" href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6a166495adc0d0f53bee6baecc577f5204">armnn::DataType::Float32</a>), gammaData);</div><div class="line"><a name="l01823"></a><span class="lineno"> 1823</span>&#160;</div><div class="line"><a name="l01824"></a><span class="lineno"> 1824</span>&#160;    <a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml">armnn::IConnectableLayer</a>* <span class="keyword">const</span> batchNormLayer = <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a2db3ae8d422f17d455e0ba0cb6291d2a">m_Network</a>-&gt;AddBatchNormalizationLayer(desc,</div><div class="line"><a name="l01825"></a><span class="lineno"> 1825</span>&#160;        mean, variance, beta, gamma, name.c_str());</div><div class="line"><a name="l01826"></a><span class="lineno"> 1826</span>&#160;    <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a9650b8810d4e6734b255ca25d495fe06">GetArmnnOutputSlotForCaffeTop</a>(layerParam.bottom(0)).<a class="code" href="_test_utils_8cpp.xhtml#a0b295acb179f15eb3fb862b32008f782">Connect</a>(batchNormLayer-&gt;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml#a6ec9e0eb66d7d6a01240492a0b18104c">GetInputSlot</a>(0));</div><div class="line"><a name="l01827"></a><span class="lineno"> 1827</span>&#160;    batchNormLayer-&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>(inputInfo);</div><div class="line"><a name="l01828"></a><span class="lineno"> 1828</span>&#160;    <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a0767b1c7ee9cbd014fd97c701a954caa">SetArmnnOutputSlotForCaffeTop</a>(layerParam.top(0), batchNormLayer-&gt;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml#a80ac4eda2e7f2757ec9dd96fc96dbd16">GetOutputSlot</a>(0));</div><div class="line"><a name="l01829"></a><span class="lineno"> 1829</span>&#160;}</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"><a class="line" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a95799625a4aae0ed73838cbfa3530c1b"> 1831</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a95799625a4aae0ed73838cbfa3530c1b">ICaffeParser::CaffeParserImpl::ParseScaleLayer</a>(<span class="keyword">const</span> LayerParameter&amp; layerParam)</div><div class="line"><a name="l01832"></a><span class="lineno"> 1832</span>&#160;{</div><div class="line"><a name="l01833"></a><span class="lineno"> 1833</span>&#160;    <span class="comment">// Current unoptimal solution: add a batchnormalization layer with 0 mean and 1 variance.</span></div><div class="line"><a name="l01834"></a><span class="lineno"> 1834</span>&#160;    ValidateNumInputsOutputs(layerParam, 1, 1);</div><div class="line"><a name="l01835"></a><span class="lineno"> 1835</span>&#160;</div><div class="line"><a name="l01836"></a><span class="lineno"> 1836</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a>&amp; inputInfo = <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a9650b8810d4e6734b255ca25d495fe06">GetArmnnOutputSlotForCaffeTop</a>(layerParam.bottom(0)).<a class="code" href="namespacearmnn_utils.xhtml#acee63cd08da47910fc166a1990988fa8">GetTensorInfo</a>();</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="keywordtype">string</span> name = layerParam.name();</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;    ScaleParameter param = layerParam.scale_param();</div><div class="line"><a name="l01841"></a><span class="lineno"> 1841</span>&#160;    <span class="keywordflow">if</span> (param.axis() != 1)</div><div class="line"><a name="l01842"></a><span class="lineno"> 1842</span>&#160;    {</div><div class="line"><a name="l01843"></a><span class="lineno"> 1843</span>&#160;        <span class="comment">// Would have to use something other than BatchNormalizationLayer in this case</span></div><div class="line"><a name="l01844"></a><span class="lineno"> 1844</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="l01845"></a><span class="lineno"> 1845</span>&#160;            fmt::format(<span class="stringliteral">&quot;Loading Scale Layer: Only axis 1 is supported currently. &quot;</span></div><div class="line"><a name="l01846"></a><span class="lineno"> 1846</span>&#160;                        <span class="stringliteral">&quot;Layer={} Axis={} {}&quot;</span>,</div><div class="line"><a name="l01847"></a><span class="lineno"> 1847</span>&#160;                        layerParam.name(),</div><div class="line"><a name="l01848"></a><span class="lineno"> 1848</span>&#160;                        param.axis(),</div><div class="line"><a name="l01849"></a><span class="lineno"> 1849</span>&#160;                        <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l01850"></a><span class="lineno"> 1850</span>&#160;    }</div><div class="line"><a name="l01851"></a><span class="lineno"> 1851</span>&#160;</div><div class="line"><a name="l01852"></a><span class="lineno"> 1852</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>     channels = inputInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a8b5d0f8a24e9d9238f412260a552acf8">GetShape</a>()[1];</div><div class="line"><a name="l01853"></a><span class="lineno"> 1853</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>     shape[]  = {channels};</div><div class="line"><a name="l01854"></a><span class="lineno"> 1854</span>&#160;</div><div class="line"><a name="l01855"></a><span class="lineno"> 1855</span>&#160;    <a class="code" href="structarmnn_1_1_batch_normalization_descriptor.xhtml">BatchNormalizationDescriptor</a> desc;</div><div class="line"><a name="l01856"></a><span class="lineno"> 1856</span>&#160;    desc.<a class="code" href="structarmnn_1_1_batch_normalization_descriptor.xhtml#a11c821c7524251004a72ed13c510853c">m_Eps</a> = 0.0f; <span class="comment">// Don&#39;t need epsilon if variance is 1.</span></div><div class="line"><a name="l01857"></a><span class="lineno"> 1857</span>&#160;    vector&lt;float&gt; meanData(channels, 0.0f);</div><div class="line"><a name="l01858"></a><span class="lineno"> 1858</span>&#160;    vector&lt;float&gt; varianceData(channels, 1.0f);</div><div class="line"><a name="l01859"></a><span class="lineno"> 1859</span>&#160;    vector&lt;float&gt; betaData(channels, 0.0f);</div><div class="line"><a name="l01860"></a><span class="lineno"> 1860</span>&#160;    vector&lt;float&gt; gammaData(channels);</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;    GetDataFromBlob(layerParam, gammaData, 0);</div><div class="line"><a name="l01863"></a><span class="lineno"> 1863</span>&#160;</div><div class="line"><a name="l01864"></a><span class="lineno"> 1864</span>&#160;    <span class="keywordflow">if</span>(param.has_bias_term())</div><div class="line"><a name="l01865"></a><span class="lineno"> 1865</span>&#160;    {</div><div class="line"><a name="l01866"></a><span class="lineno"> 1866</span>&#160;        GetDataFromBlob(layerParam, betaData, 1);</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"> 1868</span>&#160;</div><div class="line"><a name="l01869"></a><span class="lineno"> 1869</span>&#160;    <a class="code" href="classarmnn_1_1_const_tensor.xhtml">ConstTensor</a> mean(<a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a>(1, shape, <a class="code" href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6a166495adc0d0f53bee6baecc577f5204">armnn::DataType::Float32</a>), meanData);</div><div class="line"><a name="l01870"></a><span class="lineno"> 1870</span>&#160;    <a class="code" href="classarmnn_1_1_const_tensor.xhtml">ConstTensor</a> variance(<a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a>(1, shape, <a class="code" href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6a166495adc0d0f53bee6baecc577f5204">armnn::DataType::Float32</a>), varianceData);</div><div class="line"><a name="l01871"></a><span class="lineno"> 1871</span>&#160;    <a class="code" href="classarmnn_1_1_const_tensor.xhtml">ConstTensor</a> beta(<a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a>(1, shape, <a class="code" href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6a166495adc0d0f53bee6baecc577f5204">armnn::DataType::Float32</a>), betaData);</div><div class="line"><a name="l01872"></a><span class="lineno"> 1872</span>&#160;    <a class="code" href="classarmnn_1_1_const_tensor.xhtml">ConstTensor</a> gamma(<a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a>(1, shape, <a class="code" href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6a166495adc0d0f53bee6baecc577f5204">armnn::DataType::Float32</a>), gammaData);</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;    <a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml">armnn::IConnectableLayer</a>* <span class="keyword">const</span> batchNormLayer = <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a2db3ae8d422f17d455e0ba0cb6291d2a">m_Network</a>-&gt;AddBatchNormalizationLayer(desc,</div><div class="line"><a name="l01875"></a><span class="lineno"> 1875</span>&#160;        mean, variance, beta, gamma, name.c_str());</div><div class="line"><a name="l01876"></a><span class="lineno"> 1876</span>&#160;    <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a9650b8810d4e6734b255ca25d495fe06">GetArmnnOutputSlotForCaffeTop</a>(layerParam.bottom(0)).<a class="code" href="_test_utils_8cpp.xhtml#a0b295acb179f15eb3fb862b32008f782">Connect</a>(batchNormLayer-&gt;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml#a6ec9e0eb66d7d6a01240492a0b18104c">GetInputSlot</a>(0));</div><div class="line"><a name="l01877"></a><span class="lineno"> 1877</span>&#160;    batchNormLayer-&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>(inputInfo);</div><div class="line"><a name="l01878"></a><span class="lineno"> 1878</span>&#160;    <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a0767b1c7ee9cbd014fd97c701a954caa">SetArmnnOutputSlotForCaffeTop</a>(layerParam.top(0), batchNormLayer-&gt;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml#a80ac4eda2e7f2757ec9dd96fc96dbd16">GetOutputSlot</a>(0));</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;</div><div class="line"><a name="l01881"></a><span class="lineno"><a class="line" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a3311e9dc3436fe83ef22c5f530fd3234"> 1881</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a3311e9dc3436fe83ef22c5f530fd3234">ICaffeParser::CaffeParserImpl::ParseSplitLayer</a>(<span class="keyword">const</span> caffe::LayerParameter&amp; layerParam)</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="comment">// Used in caffe to duplicate memory - not necessary in armnn.</span></div><div class="line"><a name="l01884"></a><span class="lineno"> 1884</span>&#160;    <span class="keywordflow">if</span> (layerParam.bottom_size() != 1)</div><div class="line"><a name="l01885"></a><span class="lineno"> 1885</span>&#160;    {</div><div class="line"><a name="l01886"></a><span class="lineno"> 1886</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="l01887"></a><span class="lineno"> 1887</span>&#160;            fmt::format(<span class="stringliteral">&quot;Split layer &#39;{}&#39; should have exactly 1 bottom. &quot;</span></div><div class="line"><a name="l01888"></a><span class="lineno"> 1888</span>&#160;                        <span class="stringliteral">&quot;#bottoms={} {}&quot;</span>,</div><div class="line"><a name="l01889"></a><span class="lineno"> 1889</span>&#160;                        layerParam.name(),</div><div class="line"><a name="l01890"></a><span class="lineno"> 1890</span>&#160;                        layerParam.bottom_size(),</div><div class="line"><a name="l01891"></a><span class="lineno"> 1891</span>&#160;                        <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</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;    <a class="code" href="classarmnn_1_1_i_output_slot.xhtml">armnn::IOutputSlot</a>&amp; outputSlot = <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a9650b8810d4e6734b255ca25d495fe06">GetArmnnOutputSlotForCaffeTop</a>(layerParam.bottom(0));</div><div class="line"><a name="l01894"></a><span class="lineno"> 1894</span>&#160;    <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; layerParam.top_size(); i++)</div><div class="line"><a name="l01895"></a><span class="lineno"> 1895</span>&#160;    {</div><div class="line"><a name="l01896"></a><span class="lineno"> 1896</span>&#160;        <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a0767b1c7ee9cbd014fd97c701a954caa">SetArmnnOutputSlotForCaffeTop</a>(layerParam.top(i), outputSlot);</div><div class="line"><a name="l01897"></a><span class="lineno"> 1897</span>&#160;    }</div><div class="line"><a name="l01898"></a><span class="lineno"> 1898</span>&#160;}</div><div class="line"><a name="l01899"></a><span class="lineno"> 1899</span>&#160;</div><div class="line"><a name="l01900"></a><span class="lineno"><a class="line" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#aa4c22681675806fa2c5fbf403d49c628"> 1900</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#aa4c22681675806fa2c5fbf403d49c628">ICaffeParser::CaffeParserImpl::ParseDropoutLayer</a>(<span class="keyword">const</span> caffe::LayerParameter&amp; layerParam)</div><div class="line"><a name="l01901"></a><span class="lineno"> 1901</span>&#160;{</div><div class="line"><a name="l01902"></a><span class="lineno"> 1902</span>&#160;    <span class="comment">// Ignored for inference, so patch the single input to its single output.</span></div><div class="line"><a name="l01903"></a><span class="lineno"> 1903</span>&#160;    <span class="keywordflow">if</span> (layerParam.bottom_size() != 1 || layerParam.top_size() != 1)</div><div class="line"><a name="l01904"></a><span class="lineno"> 1904</span>&#160;    {</div><div class="line"><a name="l01905"></a><span class="lineno"> 1905</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="l01906"></a><span class="lineno"> 1906</span>&#160;            fmt::format(<span class="stringliteral">&quot;Dropout layer &#39;{}&#39; should have exactly 1 bottom and 1 top. &quot;</span></div><div class="line"><a name="l01907"></a><span class="lineno"> 1907</span>&#160;                        <span class="stringliteral">&quot;#bottoms={} #tops={} {}&quot;</span>,</div><div class="line"><a name="l01908"></a><span class="lineno"> 1908</span>&#160;                        layerParam.name(),</div><div class="line"><a name="l01909"></a><span class="lineno"> 1909</span>&#160;                        layerParam.bottom_size(),</div><div class="line"><a name="l01910"></a><span class="lineno"> 1910</span>&#160;                        layerParam.top_size(),</div><div class="line"><a name="l01911"></a><span class="lineno"> 1911</span>&#160;                        <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</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;    <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a0767b1c7ee9cbd014fd97c701a954caa">SetArmnnOutputSlotForCaffeTop</a>(layerParam.top(0), <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a9650b8810d4e6734b255ca25d495fe06">GetArmnnOutputSlotForCaffeTop</a>(layerParam.bottom(0)));</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;</div><div class="line"><a name="l01916"></a><span class="lineno"><a class="line" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a2a1112c66d08e3760ecccf39c7854a90"> 1916</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a2a1112c66d08e3760ecccf39c7854a90">ICaffeParser::CaffeParserImpl::TrackInputBinding</a>(<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml">armnn::IConnectableLayer</a>* layer,</div><div class="line"><a name="l01917"></a><span class="lineno"> 1917</span>&#160;    <a class="code" href="namespacearmnn.xhtml#ab8cf8f9fb6792e654c2d8d8382f6f01b">armnn::LayerBindingId</a> <span class="keywordtype">id</span>,</div><div class="line"><a name="l01918"></a><span class="lineno"> 1918</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_info.xhtml">armnn::TensorInfo</a>&amp; tensorInfo)</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="keywordflow">return</span> <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a5f5e6255b21fdf458d3733bbdcdc4af5">TrackBindingPoint</a>(layer, <span class="keywordtype">id</span>, tensorInfo, layer-&gt;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml#afcc1c3a20bd2860e0ddd21674389246f">GetName</a>(), <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#ac62e2558c14e01605f2b4e1e21cdd1e8">m_NetworkInputsBindingInfo</a>);</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;</div><div class="line"><a name="l01923"></a><span class="lineno"><a class="line" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a0c98e07875a82c71c65bbb53eb347561"> 1923</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a0c98e07875a82c71c65bbb53eb347561">ICaffeParser::CaffeParserImpl::TrackOutputBinding</a>(<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml">armnn::IConnectableLayer</a>* layer,</div><div class="line"><a name="l01924"></a><span class="lineno"> 1924</span>&#160;    <a class="code" href="namespacearmnn.xhtml#ab8cf8f9fb6792e654c2d8d8382f6f01b">armnn::LayerBindingId</a> <span class="keywordtype">id</span>,</div><div class="line"><a name="l01925"></a><span class="lineno"> 1925</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_info.xhtml">armnn::TensorInfo</a>&amp; tensorInfo)</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;    <span class="keywordflow">return</span> <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a5f5e6255b21fdf458d3733bbdcdc4af5">TrackBindingPoint</a>(layer, <span class="keywordtype">id</span>, tensorInfo, layer-&gt;<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml#afcc1c3a20bd2860e0ddd21674389246f">GetName</a>(), <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a62d6d6cba9ed0d3ad63fffb40aec86b5">m_NetworkOutputsBindingInfo</a>);</div><div class="line"><a name="l01928"></a><span class="lineno"> 1928</span>&#160;}</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"><a class="line" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a5f5e6255b21fdf458d3733bbdcdc4af5"> 1930</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a5f5e6255b21fdf458d3733bbdcdc4af5">ICaffeParser::CaffeParserImpl::TrackBindingPoint</a>(<a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml">armnn::IConnectableLayer</a>* layer,</div><div class="line"><a name="l01931"></a><span class="lineno"> 1931</span>&#160;    <a class="code" href="namespacearmnn.xhtml#ab8cf8f9fb6792e654c2d8d8382f6f01b">armnn::LayerBindingId</a> <span class="keywordtype">id</span>,</div><div class="line"><a name="l01932"></a><span class="lineno"> 1932</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_info.xhtml">armnn::TensorInfo</a>&amp; tensorInfo,</div><div class="line"><a name="l01933"></a><span class="lineno"> 1933</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">char</span>* bindingPointDesc,</div><div class="line"><a name="l01934"></a><span class="lineno"> 1934</span>&#160;    std::unordered_map&lt;std::string, BindingPointInfo&gt;&amp; nameToBindingInfo)</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;    <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="l01937"></a><span class="lineno"> 1937</span>&#160;    <span class="keyword">auto</span> it = nameToBindingInfo.find(layerName);</div><div class="line"><a name="l01938"></a><span class="lineno"> 1938</span>&#160;    <span class="keywordflow">if</span> (it == nameToBindingInfo.end())</div><div class="line"><a name="l01939"></a><span class="lineno"> 1939</span>&#160;    {</div><div class="line"><a name="l01940"></a><span class="lineno"> 1940</span>&#160;        nameToBindingInfo[layerName] = std::make_pair(<span class="keywordtype">id</span>, tensorInfo);</div><div class="line"><a name="l01941"></a><span class="lineno"> 1941</span>&#160;    }</div><div class="line"><a name="l01942"></a><span class="lineno"> 1942</span>&#160;    <span class="keywordflow">else</span></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">throw</span> <a class="code" href="classarmnn_1_1_parse_exception.xhtml">ParseException</a>(</div><div class="line"><a name="l01945"></a><span class="lineno"> 1945</span>&#160;            fmt::format(<span class="stringliteral">&quot;Id {} used by more than one {} layer {}&quot;</span>,</div><div class="line"><a name="l01946"></a><span class="lineno"> 1946</span>&#160;                        <span class="keywordtype">id</span>,</div><div class="line"><a name="l01947"></a><span class="lineno"> 1947</span>&#160;                        bindingPointDesc,</div><div class="line"><a name="l01948"></a><span class="lineno"> 1948</span>&#160;                        <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</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;}</div><div class="line"><a name="l01951"></a><span class="lineno"> 1951</span>&#160;</div><div class="line"><a name="l01952"></a><span class="lineno"><a class="line" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a9650b8810d4e6734b255ca25d495fe06"> 1952</a></span>&#160;<a class="code" href="classarmnn_1_1_i_output_slot.xhtml">armnn::IOutputSlot</a>&amp; <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a9650b8810d4e6734b255ca25d495fe06">ICaffeParser::CaffeParserImpl::GetArmnnOutputSlotForCaffeTop</a>(<span class="keyword">const</span> std::string&amp; caffeTopName)<span class="keyword"> const</span></div><div class="line"><a name="l01953"></a><span class="lineno"> 1953</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l01954"></a><span class="lineno"> 1954</span>&#160;    <span class="keyword">auto</span> it = <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a9c99d40a72e6f0c6e4ad92d21e44edca">m_ArmnnOutputSlotForCaffeTop</a>.find(caffeTopName);</div><div class="line"><a name="l01955"></a><span class="lineno"> 1955</span>&#160;    <span class="keywordflow">if</span> (it != <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a9c99d40a72e6f0c6e4ad92d21e44edca">m_ArmnnOutputSlotForCaffeTop</a>.end())</div><div class="line"><a name="l01956"></a><span class="lineno"> 1956</span>&#160;    {</div><div class="line"><a name="l01957"></a><span class="lineno"> 1957</span>&#160;        <span class="keywordflow">return</span> *it-&gt;second;</div><div class="line"><a name="l01958"></a><span class="lineno"> 1958</span>&#160;    }</div><div class="line"><a name="l01959"></a><span class="lineno"> 1959</span>&#160;    <span class="keywordflow">else</span></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"> 1961</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="l01962"></a><span class="lineno"> 1962</span>&#160;            fmt::format(<span class="stringliteral">&quot;Could not find armnn output slot for Caffe top &#39;{}&#39; {}&quot;</span>,</div><div class="line"><a name="l01963"></a><span class="lineno"> 1963</span>&#160;                        caffeTopName,</div><div class="line"><a name="l01964"></a><span class="lineno"> 1964</span>&#160;                        <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l01965"></a><span class="lineno"> 1965</span>&#160;    }</div><div class="line"><a name="l01966"></a><span class="lineno"> 1966</span>&#160;}</div><div class="line"><a name="l01967"></a><span class="lineno"> 1967</span>&#160;</div><div class="line"><a name="l01968"></a><span class="lineno"><a class="line" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a0767b1c7ee9cbd014fd97c701a954caa"> 1968</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a0767b1c7ee9cbd014fd97c701a954caa">ICaffeParser::CaffeParserImpl::SetArmnnOutputSlotForCaffeTop</a>(</div><div class="line"><a name="l01969"></a><span class="lineno"> 1969</span>&#160;    <span class="keyword">const</span> std::string&amp; caffeTopName, <a class="code" href="classarmnn_1_1_i_output_slot.xhtml">armnn::IOutputSlot</a>&amp; armnnOutputSlot)</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="keyword">auto</span> it = <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a9c99d40a72e6f0c6e4ad92d21e44edca">m_ArmnnOutputSlotForCaffeTop</a>.find(caffeTopName);</div><div class="line"><a name="l01972"></a><span class="lineno"> 1972</span>&#160;    <span class="keywordflow">if</span> (it == <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a9c99d40a72e6f0c6e4ad92d21e44edca">m_ArmnnOutputSlotForCaffeTop</a>.end())</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"> 1974</span>&#160;        <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a9c99d40a72e6f0c6e4ad92d21e44edca">m_ArmnnOutputSlotForCaffeTop</a>[caffeTopName] = &amp;armnnOutputSlot;</div><div class="line"><a name="l01975"></a><span class="lineno"> 1975</span>&#160;    }</div><div class="line"><a name="l01976"></a><span class="lineno"> 1976</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l01977"></a><span class="lineno"> 1977</span>&#160;    {</div><div class="line"><a name="l01978"></a><span class="lineno"> 1978</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="l01979"></a><span class="lineno"> 1979</span>&#160;            fmt::format(<span class="stringliteral">&quot;Attempting to add duplicate entry for Caffe top &#39;{}&#39; {}&quot;</span>,</div><div class="line"><a name="l01980"></a><span class="lineno"> 1980</span>&#160;                        caffeTopName,</div><div class="line"><a name="l01981"></a><span class="lineno"> 1981</span>&#160;                        <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</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;}</div><div class="line"><a name="l01984"></a><span class="lineno"> 1984</span>&#160;</div><div class="line"><a name="l01985"></a><span class="lineno"> 1985</span>&#160;<span class="comment">// Note: can move to CaffeParser when/if we optimise the text/string format</span></div><div class="line"><a name="l01986"></a><span class="lineno"> 1986</span>&#160;<span class="comment">//       to load on a layer by layer basis</span></div><div class="line"><a name="l01987"></a><span class="lineno"><a class="line" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a89631aa06b5c628c46674c202b40dbc5"> 1987</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a89631aa06b5c628c46674c202b40dbc5">ICaffeParser::CaffeParserImpl::ResolveInPlaceLayers</a>(caffe::NetParameter&amp; netParameter)</div><div class="line"><a name="l01988"></a><span class="lineno"> 1988</span>&#160;{</div><div class="line"><a name="l01989"></a><span class="lineno"> 1989</span>&#160;    <span class="comment">// Finds layers with the same top.</span></div><div class="line"><a name="l01990"></a><span class="lineno"> 1990</span>&#160;    std::map&lt;std::string, std::vector&lt;caffe::LayerParameter*&gt;&gt; layersByTop;</div><div class="line"><a name="l01991"></a><span class="lineno"> 1991</span>&#160;    <span class="keywordflow">for</span> (<span class="keywordtype">int</span> layerIdx = 0; layerIdx &lt; netParameter.layer_size(); ++layerIdx)</div><div class="line"><a name="l01992"></a><span class="lineno"> 1992</span>&#160;    {</div><div class="line"><a name="l01993"></a><span class="lineno"> 1993</span>&#160;        caffe::LayerParameter&amp; layer = *netParameter.mutable_layer(layerIdx);</div><div class="line"><a name="l01994"></a><span class="lineno"> 1994</span>&#160;        std::string name = layer.name();</div><div class="line"><a name="l01995"></a><span class="lineno"> 1995</span>&#160;        <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; layer.top_size(); ++i)</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;            layersByTop[layer.top(i)].push_back(&amp;layer);</div><div class="line"><a name="l01998"></a><span class="lineno"> 1998</span>&#160;        }</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;</div><div class="line"><a name="l02001"></a><span class="lineno"> 2001</span>&#160;    <span class="comment">// For each set of layers with the same top, resolves them to a linear chain rather than in-place layers.</span></div><div class="line"><a name="l02002"></a><span class="lineno"> 2002</span>&#160;    <span class="comment">// Note that for &#39;regular&#39; layers, there will be a single layer in each group and so this will be a no-op.</span></div><div class="line"><a name="l02003"></a><span class="lineno"> 2003</span>&#160;    <span class="keywordflow">for</span> (<span class="keyword">auto</span> layersWithSameTopIt : layersByTop)</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;        <span class="keyword">const</span> std::string&amp; top = layersWithSameTopIt.first;</div><div class="line"><a name="l02006"></a><span class="lineno"> 2006</span>&#160;        <span class="keyword">const</span> std::vector&lt;caffe::LayerParameter*&gt;&amp; layersWithSameTop = layersWithSameTopIt.second;</div><div class="line"><a name="l02007"></a><span class="lineno"> 2007</span>&#160;</div><div class="line"><a name="l02008"></a><span class="lineno"> 2008</span>&#160;        <span class="comment">// Chains the layers together in the order that they are listed in the prototxt (hopefully this is correct).</span></div><div class="line"><a name="l02009"></a><span class="lineno"> 2009</span>&#160;        <span class="comment">// Note that the last layer will not have its top modified so that other layers will continue to reference it.</span></div><div class="line"><a name="l02010"></a><span class="lineno"> 2010</span>&#160;        <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> layerIdx = 0; layerIdx &lt; layersWithSameTop.size() - 1; ++layerIdx)</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;            caffe::LayerParameter&amp; layer1 = *layersWithSameTop[layerIdx];</div><div class="line"><a name="l02013"></a><span class="lineno"> 2013</span>&#160;            caffe::LayerParameter&amp; layer2 = *layersWithSameTop[layerIdx+1];</div><div class="line"><a name="l02014"></a><span class="lineno"> 2014</span>&#160;            <span class="keywordflow">if</span> (layer1.top_size() != 1)</div><div class="line"><a name="l02015"></a><span class="lineno"> 2015</span>&#160;            {</div><div class="line"><a name="l02016"></a><span class="lineno"> 2016</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="l02017"></a><span class="lineno"> 2017</span>&#160;                    fmt::format(<span class="stringliteral">&quot;Node &#39;{}&#39; is an in-place layer but doesn&#39;t have exactly one &quot;</span></div><div class="line"><a name="l02018"></a><span class="lineno"> 2018</span>&#160;                                <span class="stringliteral">&quot;top. It has {} instead. {}&quot;</span>,</div><div class="line"><a name="l02019"></a><span class="lineno"> 2019</span>&#160;                                layer1.name(),</div><div class="line"><a name="l02020"></a><span class="lineno"> 2020</span>&#160;                                layer1.top_size(),</div><div class="line"><a name="l02021"></a><span class="lineno"> 2021</span>&#160;                                <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l02022"></a><span class="lineno"> 2022</span>&#160;            }</div><div class="line"><a name="l02023"></a><span class="lineno"> 2023</span>&#160;            std::string newTop = layer1.name() + <span class="stringliteral">&quot;_top&quot;</span>;</div><div class="line"><a name="l02024"></a><span class="lineno"> 2024</span>&#160;            layer1.set_top(0, newTop);</div><div class="line"><a name="l02025"></a><span class="lineno"> 2025</span>&#160;            <span class="keywordflow">if</span> (layer2.bottom_size() != 1 || layer2.bottom(0) != top)</div><div class="line"><a name="l02026"></a><span class="lineno"> 2026</span>&#160;            {</div><div class="line"><a name="l02027"></a><span class="lineno"> 2027</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="l02028"></a><span class="lineno"> 2028</span>&#160;                    fmt::format(<span class="stringliteral">&quot;Node &#39;{}&#39; is an in-place layer but &quot;</span></div><div class="line"><a name="l02029"></a><span class="lineno"> 2029</span>&#160;                                <span class="stringliteral">&quot;doesn&#39;t have exactly one bottom, or it doesn&#39;t match its top. &quot;</span></div><div class="line"><a name="l02030"></a><span class="lineno"> 2030</span>&#160;                                <span class="stringliteral">&quot;#bottoms={}, first bottom is {}, top is {} {}&quot;</span>,</div><div class="line"><a name="l02031"></a><span class="lineno"> 2031</span>&#160;                                layer2.name(),</div><div class="line"><a name="l02032"></a><span class="lineno"> 2032</span>&#160;                                layer2.bottom(0),</div><div class="line"><a name="l02033"></a><span class="lineno"> 2033</span>&#160;                                top,</div><div class="line"><a name="l02034"></a><span class="lineno"> 2034</span>&#160;                                <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l02035"></a><span class="lineno"> 2035</span>&#160;            }</div><div class="line"><a name="l02036"></a><span class="lineno"> 2036</span>&#160;            layer2.set_bottom(0, newTop);</div><div class="line"><a name="l02037"></a><span class="lineno"> 2037</span>&#160;        }</div><div class="line"><a name="l02038"></a><span class="lineno"> 2038</span>&#160;    }</div><div class="line"><a name="l02039"></a><span class="lineno"> 2039</span>&#160;}</div><div class="line"><a name="l02040"></a><span class="lineno"> 2040</span>&#160;</div><div class="line"><a name="l02041"></a><span class="lineno"> 2041</span>&#160;<span class="comment">// Note: can move to CaffeParser when/if we optimise the text/string format</span></div><div class="line"><a name="l02042"></a><span class="lineno"> 2042</span>&#160;<span class="comment">//       to load on a layer by layer basis</span></div><div class="line"><a name="l02043"></a><span class="lineno"><a class="line" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a9c5eed5d48d21a8b7e3bcd2cab519217"> 2043</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a9c5eed5d48d21a8b7e3bcd2cab519217">ICaffeParser::CaffeParserImpl::LoadNetParam</a>(NetParameter&amp; netParameter)</div><div class="line"><a name="l02044"></a><span class="lineno"> 2044</span>&#160;{</div><div class="line"><a name="l02045"></a><span class="lineno"> 2045</span>&#160;    <span class="comment">// Caffe models sometimes have an implicit input layer.</span></div><div class="line"><a name="l02046"></a><span class="lineno"> 2046</span>&#160;    <span class="comment">// In that case, add an explicit one.</span></div><div class="line"><a name="l02047"></a><span class="lineno"> 2047</span>&#160;    <span class="keywordflow">if</span> (netParameter.input_size() &gt; 0)</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;        LayerParameter* newLayer = netParameter.add_layer();</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;        newLayer-&gt;set_type(<span class="stringliteral">&quot;Input&quot;</span>);</div><div class="line"><a name="l02052"></a><span class="lineno"> 2052</span>&#160;        newLayer-&gt;set_name(netParameter.input(0));</div><div class="line"><a name="l02053"></a><span class="lineno"> 2053</span>&#160;        newLayer-&gt;add_top(netParameter.input(0));</div><div class="line"><a name="l02054"></a><span class="lineno"> 2054</span>&#160;</div><div class="line"><a name="l02055"></a><span class="lineno"> 2055</span>&#160;        InputParameter* inputParam = newLayer-&gt;mutable_input_param();</div><div class="line"><a name="l02056"></a><span class="lineno"> 2056</span>&#160;        BlobShape* shape = inputParam-&gt;add_shape();</div><div class="line"><a name="l02057"></a><span class="lineno"> 2057</span>&#160;</div><div class="line"><a name="l02058"></a><span class="lineno"> 2058</span>&#160;        <span class="keywordtype">int</span> dim_size = netParameter.input_dim_size();</div><div class="line"><a name="l02059"></a><span class="lineno"> 2059</span>&#160;        <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; dim_size; ++i)</div><div class="line"><a name="l02060"></a><span class="lineno"> 2060</span>&#160;        {</div><div class="line"><a name="l02061"></a><span class="lineno"> 2061</span>&#160;            shape-&gt;add_dim(netParameter.input_dim(i));</div><div class="line"><a name="l02062"></a><span class="lineno"> 2062</span>&#160;        }</div><div class="line"><a name="l02063"></a><span class="lineno"> 2063</span>&#160;    }</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">// Replaces in-place layers with regular ones to make the rest of the parsing easier.</span></div><div class="line"><a name="l02066"></a><span class="lineno"> 2066</span>&#160;    <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a89631aa06b5c628c46674c202b40dbc5">ResolveInPlaceLayers</a>(netParameter);</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="comment">// Creates a lookup of Caffe layers by name.</span></div><div class="line"><a name="l02069"></a><span class="lineno"> 2069</span>&#160;    <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; netParameter.layer_size(); ++i)</div><div class="line"><a name="l02070"></a><span class="lineno"> 2070</span>&#160;    {</div><div class="line"><a name="l02071"></a><span class="lineno"> 2071</span>&#160;        <span class="keyword">const</span> caffe::LayerParameter&amp; layer = netParameter.layer(i);</div><div class="line"><a name="l02072"></a><span class="lineno"> 2072</span>&#160;        <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; layer.top_size(); ++i)</div><div class="line"><a name="l02073"></a><span class="lineno"> 2073</span>&#160;        {</div><div class="line"><a name="l02074"></a><span class="lineno"> 2074</span>&#160;            <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a1424f1bfbfc81d317b51053bbb315ef1">m_CaffeLayersByTopName</a>[layer.top(i)] = &amp;layer;</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;</div><div class="line"><a name="l02078"></a><span class="lineno"> 2078</span>&#160;    <span class="comment">// Finds the output layers the user requested.</span></div><div class="line"><a name="l02079"></a><span class="lineno"> 2079</span>&#160;    std::vector&lt;const caffe::LayerParameter*&gt; targetLayers;</div><div class="line"><a name="l02080"></a><span class="lineno"> 2080</span>&#160;    <span class="keywordflow">for</span> (<span class="keyword">const</span> std::string&amp; requestedOutputName : <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a86cb41745deebd9b0ccf157d97d4d9ca">m_RequestedOutputs</a>)</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;        <span class="keyword">auto</span> nodeIt = <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a1424f1bfbfc81d317b51053bbb315ef1">m_CaffeLayersByTopName</a>.find(requestedOutputName);</div><div class="line"><a name="l02083"></a><span class="lineno"> 2083</span>&#160;        <span class="keywordflow">if</span> (nodeIt == <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a1424f1bfbfc81d317b51053bbb315ef1">m_CaffeLayersByTopName</a>.end())</div><div class="line"><a name="l02084"></a><span class="lineno"> 2084</span>&#160;        {</div><div class="line"><a name="l02085"></a><span class="lineno"> 2085</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="l02086"></a><span class="lineno"> 2086</span>&#160;                fmt::format(<span class="stringliteral">&quot;Couldn&#39;t find requested output layer &#39;{}&#39; in graph {}&quot;</span>,</div><div class="line"><a name="l02087"></a><span class="lineno"> 2087</span>&#160;                            requestedOutputName,</div><div class="line"><a name="l02088"></a><span class="lineno"> 2088</span>&#160;                            <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l02089"></a><span class="lineno"> 2089</span>&#160;        }</div><div class="line"><a name="l02090"></a><span class="lineno"> 2090</span>&#160;        targetLayers.push_back(nodeIt-&gt;second);</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;    <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="l02094"></a><span class="lineno"> 2094</span>&#160;    std::vector&lt;const caffe::LayerParameter*&gt; sortedNodes;</div><div class="line"><a name="l02095"></a><span class="lineno"> 2095</span>&#160;    <span class="keywordflow">if</span> (!armnnUtils::GraphTopologicalSort&lt;const caffe::LayerParameter*&gt;(</div><div class="line"><a name="l02096"></a><span class="lineno"> 2096</span>&#160;        targetLayers,</div><div class="line"><a name="l02097"></a><span class="lineno"> 2097</span>&#160;        [<span class="keyword">this</span>](<span class="keyword">const</span> caffe::LayerParameter* node)</div><div class="line"><a name="l02098"></a><span class="lineno"> 2098</span>&#160;        {</div><div class="line"><a name="l02099"></a><span class="lineno"> 2099</span>&#160;            <span class="keywordflow">return</span> <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a2f8fbd66c1a39a06d61fcb6536387d64">GetInputs</a>(*node);</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"> 2101</span>&#160;        sortedNodes))</div><div class="line"><a name="l02102"></a><span class="lineno"> 2102</span>&#160;    {</div><div class="line"><a name="l02103"></a><span class="lineno"> 2103</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="l02104"></a><span class="lineno"> 2104</span>&#160;            fmt::format(<span class="stringliteral">&quot;Cycle detected in graph. #nodes: {} {}&quot;</span>,</div><div class="line"><a name="l02105"></a><span class="lineno"> 2105</span>&#160;                        sortedNodes.size(),</div><div class="line"><a name="l02106"></a><span class="lineno"> 2106</span>&#160;                        <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l02107"></a><span class="lineno"> 2107</span>&#160;    }</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="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="l02110"></a><span class="lineno"> 2110</span>&#160;    <span class="keywordflow">for</span> (<span class="keyword">const</span> caffe::LayerParameter* current : sortedNodes)</div><div class="line"><a name="l02111"></a><span class="lineno"> 2111</span>&#160;    {</div><div class="line"><a name="l02112"></a><span class="lineno"> 2112</span>&#160;        <span class="keyword">auto</span> it = <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a6fb0cd80a09cf767309175fb138d203b">ms_CaffeLayerNameToParsingFunctions</a>.find(current-&gt;type());</div><div class="line"><a name="l02113"></a><span class="lineno"> 2113</span>&#160;        <span class="keywordflow">if</span> (it == <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a6fb0cd80a09cf767309175fb138d203b">ms_CaffeLayerNameToParsingFunctions</a>.end())</div><div class="line"><a name="l02114"></a><span class="lineno"> 2114</span>&#160;        {</div><div class="line"><a name="l02115"></a><span class="lineno"> 2115</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="l02116"></a><span class="lineno"> 2116</span>&#160;                fmt::format(<span class="stringliteral">&quot;Unsupported layer type: &#39;{}&#39; for layer {} {}&quot;</span>,</div><div class="line"><a name="l02117"></a><span class="lineno"> 2117</span>&#160;                            current-&gt;type(),</div><div class="line"><a name="l02118"></a><span class="lineno"> 2118</span>&#160;                            current-&gt;name(),</div><div class="line"><a name="l02119"></a><span class="lineno"> 2119</span>&#160;                            <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</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">auto</span> func = it-&gt;second;</div><div class="line"><a name="l02122"></a><span class="lineno"> 2122</span>&#160;        (this-&gt;*func)(*current);</div><div class="line"><a name="l02123"></a><span class="lineno"> 2123</span>&#160;    }</div><div class="line"><a name="l02124"></a><span class="lineno"> 2124</span>&#160;</div><div class="line"><a name="l02125"></a><span class="lineno"> 2125</span>&#160;    <span class="comment">// Adds ArmNN output layers connected to each requested output.</span></div><div class="line"><a name="l02126"></a><span class="lineno"> 2126</span>&#160;    <span class="keywordflow">for</span> (<span class="keyword">const</span> std::string&amp; requestedOutput : m_RequestedOutputs)</div><div class="line"><a name="l02127"></a><span class="lineno"> 2127</span>&#160;    {</div><div class="line"><a name="l02128"></a><span class="lineno"> 2128</span>&#160;        <a class="code" href="classarmnn_1_1_i_output_slot.xhtml">armnn::IOutputSlot</a>&amp; outputSlot = <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a9650b8810d4e6734b255ca25d495fe06">GetArmnnOutputSlotForCaffeTop</a>(requestedOutput);</div><div class="line"><a name="l02129"></a><span class="lineno"> 2129</span>&#160;</div><div class="line"><a name="l02130"></a><span class="lineno"> 2130</span>&#160;        <span class="keyword">const</span> <a class="code" href="namespacearmnn.xhtml#ab8cf8f9fb6792e654c2d8d8382f6f01b">armnn::LayerBindingId</a> outputId = <a class="code" href="namespacearmnn.xhtml#a375ca3cff9f1b005d1412dc5f3cf5b6e">armnn::numeric_cast</a>&lt;<a class="code" href="namespacearmnn.xhtml#ab8cf8f9fb6792e654c2d8d8382f6f01b">armnn::LayerBindingId</a>&gt;(</div><div class="line"><a name="l02131"></a><span class="lineno"> 2131</span>&#160;            <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a62d6d6cba9ed0d3ad63fffb40aec86b5">m_NetworkOutputsBindingInfo</a>.size());</div><div class="line"><a name="l02132"></a><span class="lineno"> 2132</span>&#160;        <a class="code" href="classarmnn_1_1_i_connectable_layer.xhtml">armnn::IConnectableLayer</a>* <span class="keyword">const</span> outputLayer = <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a2db3ae8d422f17d455e0ba0cb6291d2a">m_Network</a>-&gt;AddOutputLayer(outputId, requestedOutput.c_str());</div><div class="line"><a name="l02133"></a><span class="lineno"> 2133</span>&#160;        outputSlot.<a class="code" href="classarmnn_1_1_i_output_slot.xhtml#ac1835f8756a9f03c02fcf9664e3a0fce">Connect</a>(outputLayer-&gt;GetInputSlot(0));</div><div class="line"><a name="l02134"></a><span class="lineno"> 2134</span>&#160;</div><div class="line"><a name="l02135"></a><span class="lineno"> 2135</span>&#160;        <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a0c98e07875a82c71c65bbb53eb347561">TrackOutputBinding</a>(outputLayer, outputId, outputLayer-&gt;GetInputSlot(0).GetConnection()-&gt;GetTensorInfo());</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;}</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"><a class="line" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#ac915fb2df2772be3179e97b1e8287a2d"> 2139</a></span>&#160;<a class="code" href="namespacearmnn.xhtml#ace74f6f9feb95a964a49d79458232703">INetworkPtr</a> <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#ac915fb2df2772be3179e97b1e8287a2d">ICaffeParser::CaffeParserImpl::CreateNetworkFromTextFile</a>(<span class="keyword">const</span> <span class="keywordtype">char</span>* graphFile,</div><div class="line"><a name="l02140"></a><span class="lineno"> 2140</span>&#160;    <span class="keyword">const</span> std::map&lt;std::string, armnn::TensorShape&gt;&amp; inputShapes,</div><div class="line"><a name="l02141"></a><span class="lineno"> 2141</span>&#160;    <span class="keyword">const</span> std::vector&lt;std::string&gt;&amp; requestedOutputs)</div><div class="line"><a name="l02142"></a><span class="lineno"> 2142</span>&#160;{</div><div class="line"><a name="l02143"></a><span class="lineno"> 2143</span>&#160;    FILE* fd = fopen(graphFile, <span class="stringliteral">&quot;r&quot;</span>);</div><div class="line"><a name="l02144"></a><span class="lineno"> 2144</span>&#160;</div><div class="line"><a name="l02145"></a><span class="lineno"> 2145</span>&#160;    <span class="keywordflow">if</span> (fd == <span class="keyword">nullptr</span>)</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"> 2147</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="l02148"></a><span class="lineno"> 2148</span>&#160;            fmt::format(<span class="stringliteral">&quot;Failed to open graph file: {} {}&quot;</span>,</div><div class="line"><a name="l02149"></a><span class="lineno"> 2149</span>&#160;                        graphFile,</div><div class="line"><a name="l02150"></a><span class="lineno"> 2150</span>&#160;                        <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l02151"></a><span class="lineno"> 2151</span>&#160;    }</div><div class="line"><a name="l02152"></a><span class="lineno"> 2152</span>&#160;</div><div class="line"><a name="l02153"></a><span class="lineno"> 2153</span>&#160;    <span class="comment">// Parses the file into a message.</span></div><div class="line"><a name="l02154"></a><span class="lineno"> 2154</span>&#160;    NetParameter netParam;</div><div class="line"><a name="l02155"></a><span class="lineno"> 2155</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="l02156"></a><span class="lineno"> 2156</span>&#160;    <span class="keywordtype">bool</span>         success = google::protobuf::TextFormat::Parse(input, &amp;netParam);</div><div class="line"><a name="l02157"></a><span class="lineno"> 2157</span>&#160;    <span class="keyword">delete</span> input;</div><div class="line"><a name="l02158"></a><span class="lineno"> 2158</span>&#160;    fclose(fd);</div><div class="line"><a name="l02159"></a><span class="lineno"> 2159</span>&#160;</div><div class="line"><a name="l02160"></a><span class="lineno"> 2160</span>&#160;    <span class="keywordflow">if</span> (!success)</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="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_parse_exception.xhtml">ParseException</a>(</div><div class="line"><a name="l02163"></a><span class="lineno"> 2163</span>&#160;            fmt::format(<span class="stringliteral">&quot;Failed to parse graph file: {} {}&quot;</span>,</div><div class="line"><a name="l02164"></a><span class="lineno"> 2164</span>&#160;                        graphFile,</div><div class="line"><a name="l02165"></a><span class="lineno"> 2165</span>&#160;                        <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l02166"></a><span class="lineno"> 2166</span>&#160;    }</div><div class="line"><a name="l02167"></a><span class="lineno"> 2167</span>&#160;</div><div class="line"><a name="l02168"></a><span class="lineno"> 2168</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#ab0bb4b8a290f1c8acd3c3a0d9a6e9783">CreateNetworkFromNetParameter</a>(netParam, inputShapes, requestedOutputs);</div><div class="line"><a name="l02169"></a><span class="lineno"> 2169</span>&#160;}</div><div class="line"><a name="l02170"></a><span class="lineno"> 2170</span>&#160;</div><div class="line"><a name="l02171"></a><span class="lineno"><a class="line" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a7e393f41f2330006fdf00f2840c6dd28"> 2171</a></span>&#160;<a class="code" href="namespacearmnn.xhtml#ace74f6f9feb95a964a49d79458232703">INetworkPtr</a> <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a7e393f41f2330006fdf00f2840c6dd28">ICaffeParser::CaffeParserImpl::CreateNetworkFromString</a>(<span class="keyword">const</span> <span class="keywordtype">char</span>* protoText,</div><div class="line"><a name="l02172"></a><span class="lineno"> 2172</span>&#160;    <span class="keyword">const</span> std::map&lt;std::string, armnn::TensorShape&gt;&amp; inputShapes,</div><div class="line"><a name="l02173"></a><span class="lineno"> 2173</span>&#160;    <span class="keyword">const</span> std::vector&lt;std::string&gt;&amp; requestedOutputs)</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;    <span class="comment">// Parses the string into a message.</span></div><div class="line"><a name="l02176"></a><span class="lineno"> 2176</span>&#160;    NetParameter netParam;</div><div class="line"><a name="l02177"></a><span class="lineno"> 2177</span>&#160;    <span class="keywordtype">bool</span>         success = google::protobuf::TextFormat::ParseFromString(protoText, &amp;netParam);</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="keywordflow">if</span> (!success)</div><div class="line"><a name="l02180"></a><span class="lineno"> 2180</span>&#160;    {</div><div class="line"><a name="l02181"></a><span class="lineno"> 2181</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="l02182"></a><span class="lineno"> 2182</span>&#160;            fmt::format(<span class="stringliteral">&quot;Failed to parse graph string {}&quot;</span>,</div><div class="line"><a name="l02183"></a><span class="lineno"> 2183</span>&#160;                        <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l02184"></a><span class="lineno"> 2184</span>&#160;    }</div><div class="line"><a name="l02185"></a><span class="lineno"> 2185</span>&#160;</div><div class="line"><a name="l02186"></a><span class="lineno"> 2186</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#ab0bb4b8a290f1c8acd3c3a0d9a6e9783">CreateNetworkFromNetParameter</a>(netParam, inputShapes, requestedOutputs);</div><div class="line"><a name="l02187"></a><span class="lineno"> 2187</span>&#160;}</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"><a class="line" href="classarmnn_caffe_parser_1_1_caffe_parser.xhtml#afb0edadd00c78430efbdc02844ef379a"> 2189</a></span>&#160;<a class="code" href="namespacearmnn.xhtml#ace74f6f9feb95a964a49d79458232703">INetworkPtr</a> <a class="code" href="classarmnn_caffe_parser_1_1_caffe_parser.xhtml#afb0edadd00c78430efbdc02844ef379a">CaffeParser::CreateNetworkFromBinaryFile</a>(<span class="keyword">const</span> <span class="keywordtype">char</span>* graphFile,</div><div class="line"><a name="l02190"></a><span class="lineno"> 2190</span>&#160;    <span class="keyword">const</span> std::map&lt;std::string, armnn::TensorShape&gt;&amp; inputShapes,</div><div class="line"><a name="l02191"></a><span class="lineno"> 2191</span>&#160;    <span class="keyword">const</span> std::vector&lt;std::string&gt;&amp; requestedOutputs)</div><div class="line"><a name="l02192"></a><span class="lineno"> 2192</span>&#160;{</div><div class="line"><a name="l02193"></a><span class="lineno"> 2193</span>&#160;    FILE* fd = fopen(graphFile, <span class="stringliteral">&quot;rb&quot;</span>);</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"> 2195</span>&#160;    <span class="keywordflow">if</span> (fd == <span class="keyword">nullptr</span>)</div><div class="line"><a name="l02196"></a><span class="lineno"> 2196</span>&#160;    {</div><div class="line"><a name="l02197"></a><span class="lineno"> 2197</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="l02198"></a><span class="lineno"> 2198</span>&#160;            fmt::format(<span class="stringliteral">&quot;Failed to open graph file at: {} {}&quot;</span>,</div><div class="line"><a name="l02199"></a><span class="lineno"> 2199</span>&#160;                        graphFile,</div><div class="line"><a name="l02200"></a><span class="lineno"> 2200</span>&#160;                        <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l02201"></a><span class="lineno"> 2201</span>&#160;    }</div><div class="line"><a name="l02202"></a><span class="lineno"> 2202</span>&#160;</div><div class="line"><a name="l02203"></a><span class="lineno"> 2203</span>&#160;    <span class="comment">// Parses the file into a message.</span></div><div class="line"><a name="l02204"></a><span class="lineno"> 2204</span>&#160;    NetParameter netParam;</div><div class="line"><a name="l02205"></a><span class="lineno"> 2205</span>&#160;</div><div class="line"><a name="l02206"></a><span class="lineno"> 2206</span>&#160;    FileInputStream  inStream(fileno(fd));</div><div class="line"><a name="l02207"></a><span class="lineno"> 2207</span>&#160;    CodedInputStream codedStream(&amp;inStream);</div><div class="line"><a name="l02208"></a><span class="lineno"> 2208</span>&#160;    codedStream.SetTotalBytesLimit(INT_MAX);</div><div class="line"><a name="l02209"></a><span class="lineno"> 2209</span>&#160;    <span class="keywordtype">bool</span> success = netParam.ParseFromCodedStream(&amp;codedStream);</div><div class="line"><a name="l02210"></a><span class="lineno"> 2210</span>&#160;    fclose(fd);</div><div class="line"><a name="l02211"></a><span class="lineno"> 2211</span>&#160;</div><div class="line"><a name="l02212"></a><span class="lineno"> 2212</span>&#160;    <span class="keywordflow">if</span> (!success)</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;        <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_parse_exception.xhtml">ParseException</a>(</div><div class="line"><a name="l02215"></a><span class="lineno"> 2215</span>&#160;            fmt::format(<span class="stringliteral">&quot;Failed to parse protobuf file: {} {}&quot;</span>,</div><div class="line"><a name="l02216"></a><span class="lineno"> 2216</span>&#160;                        graphFile,</div><div class="line"><a name="l02217"></a><span class="lineno"> 2217</span>&#160;                        <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>().AsString()));</div><div class="line"><a name="l02218"></a><span class="lineno"> 2218</span>&#160;    }</div><div class="line"><a name="l02219"></a><span class="lineno"> 2219</span>&#160;</div><div class="line"><a name="l02220"></a><span class="lineno"> 2220</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#ab0bb4b8a290f1c8acd3c3a0d9a6e9783">CreateNetworkFromNetParameter</a>(netParam, inputShapes, requestedOutputs);</div><div class="line"><a name="l02221"></a><span class="lineno"> 2221</span>&#160;}</div><div class="line"><a name="l02222"></a><span class="lineno"> 2222</span>&#160;</div><div class="line"><a name="l02223"></a><span class="lineno"> 2223</span>&#160;<span class="comment">// Note: can move to CaffeParser when/if we optimise the text/string format</span></div><div class="line"><a name="l02224"></a><span class="lineno"> 2224</span>&#160;<span class="comment">//       to load on a layer by layer basis</span></div><div class="line"><a name="l02225"></a><span class="lineno"><a class="line" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#ab0bb4b8a290f1c8acd3c3a0d9a6e9783"> 2225</a></span>&#160;<a class="code" href="namespacearmnn.xhtml#ace74f6f9feb95a964a49d79458232703">INetworkPtr</a> <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#ab0bb4b8a290f1c8acd3c3a0d9a6e9783">ICaffeParser::CaffeParserImpl::CreateNetworkFromNetParameter</a>(NetParameter&amp; netParam,</div><div class="line"><a name="l02226"></a><span class="lineno"> 2226</span>&#160;    <span class="keyword">const</span> std::map&lt;std::string, armnn::TensorShape&gt;&amp; inputShapes,</div><div class="line"><a name="l02227"></a><span class="lineno"> 2227</span>&#160;    <span class="keyword">const</span> std::vector&lt;std::string&gt;&amp; requestedOutputs)</div><div class="line"><a name="l02228"></a><span class="lineno"> 2228</span>&#160;{</div><div class="line"><a name="l02229"></a><span class="lineno"> 2229</span>&#160;    <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#ac62e2558c14e01605f2b4e1e21cdd1e8">m_NetworkInputsBindingInfo</a>.clear();</div><div class="line"><a name="l02230"></a><span class="lineno"> 2230</span>&#160;    <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a62d6d6cba9ed0d3ad63fffb40aec86b5">m_NetworkOutputsBindingInfo</a>.clear();</div><div class="line"><a name="l02231"></a><span class="lineno"> 2231</span>&#160;</div><div class="line"><a name="l02232"></a><span class="lineno"> 2232</span>&#160;    <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a2db3ae8d422f17d455e0ba0cb6291d2a">m_Network</a> = <a class="code" href="classarmnn_1_1_i_network.xhtml#a464f0ff87b1aabf71febaa71321dd40b">INetwork::Create</a>();</div><div class="line"><a name="l02233"></a><span class="lineno"> 2233</span>&#160;</div><div class="line"><a name="l02234"></a><span class="lineno"> 2234</span>&#160;    <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a76ea67f3f7d1d5835c5a92b65dc0854c">m_InputShapes</a> = inputShapes;</div><div class="line"><a name="l02235"></a><span class="lineno"> 2235</span>&#160;    <span class="keywordflow">if</span> (requestedOutputs.size() == 0)</div><div class="line"><a name="l02236"></a><span class="lineno"> 2236</span>&#160;    {</div><div class="line"><a name="l02237"></a><span class="lineno"> 2237</span>&#160;        <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_parse_exception.xhtml">ParseException</a>(<span class="stringliteral">&quot;requestedOutputs must have at least one entry&quot;</span>);</div><div class="line"><a name="l02238"></a><span class="lineno"> 2238</span>&#160;    }</div><div class="line"><a name="l02239"></a><span class="lineno"> 2239</span>&#160;    <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a86cb41745deebd9b0ccf157d97d4d9ca">m_RequestedOutputs</a> = requestedOutputs;</div><div class="line"><a name="l02240"></a><span class="lineno"> 2240</span>&#160;</div><div class="line"><a name="l02241"></a><span class="lineno"> 2241</span>&#160;    <span class="keywordflow">try</span></div><div class="line"><a name="l02242"></a><span class="lineno"> 2242</span>&#160;    {</div><div class="line"><a name="l02243"></a><span class="lineno"> 2243</span>&#160;        <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a9c5eed5d48d21a8b7e3bcd2cab519217">LoadNetParam</a>(netParam);</div><div class="line"><a name="l02244"></a><span class="lineno"> 2244</span>&#160;    }</div><div class="line"><a name="l02245"></a><span class="lineno"> 2245</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="l02246"></a><span class="lineno"> 2246</span>&#160;    {</div><div class="line"><a name="l02247"></a><span class="lineno"> 2247</span>&#160;        <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#ae89a123aad1c66a76c398b7af216aae4">Cleanup</a>();</div><div class="line"><a name="l02248"></a><span class="lineno"> 2248</span>&#160;        <span class="keywordflow">throw</span> e;</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;</div><div class="line"><a name="l02251"></a><span class="lineno"> 2251</span>&#160;    <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#ae89a123aad1c66a76c398b7af216aae4">Cleanup</a>();</div><div class="line"><a name="l02252"></a><span class="lineno"> 2252</span>&#160;</div><div class="line"><a name="l02253"></a><span class="lineno"> 2253</span>&#160;    <span class="keywordflow">return</span> move(<a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a2db3ae8d422f17d455e0ba0cb6291d2a">m_Network</a>);</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;</div><div class="line"><a name="l02256"></a><span class="lineno"><a class="line" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#aa09a8bb02eed50715082d8b7fccd2f8d"> 2256</a></span>&#160;<span class="keyword">const</span> std::string <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#aa09a8bb02eed50715082d8b7fccd2f8d">ICaffeParser::CaffeParserImpl::GetVersion</a>()</div><div class="line"><a name="l02257"></a><span class="lineno"> 2257</span>&#160;{</div><div class="line"><a name="l02258"></a><span class="lineno"> 2258</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="include_2armnn_caffe_parser_2_version_8hpp.xhtml#af3d53d50a9ddd493c4b40e44a82e2b44">CAFFE_PARSER_VERSION</a>;</div><div class="line"><a name="l02259"></a><span class="lineno"> 2259</span>&#160;}</div><div class="line"><a name="l02260"></a><span class="lineno"> 2260</span>&#160;</div><div class="line"><a name="l02261"></a><span class="lineno"><a class="line" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#ae89a123aad1c66a76c398b7af216aae4"> 2261</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#ae89a123aad1c66a76c398b7af216aae4">ICaffeParser::CaffeParserImpl::Cleanup</a>() {</div><div class="line"><a name="l02262"></a><span class="lineno"> 2262</span>&#160;    <span class="comment">// cleanup, in case we reuse this parser</span></div><div class="line"><a name="l02263"></a><span class="lineno"> 2263</span>&#160;    <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a76ea67f3f7d1d5835c5a92b65dc0854c">m_InputShapes</a>.clear();</div><div class="line"><a name="l02264"></a><span class="lineno"> 2264</span>&#160;    <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a86cb41745deebd9b0ccf157d97d4d9ca">m_RequestedOutputs</a>.clear();</div><div class="line"><a name="l02265"></a><span class="lineno"> 2265</span>&#160;    <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a9c99d40a72e6f0c6e4ad92d21e44edca">m_ArmnnOutputSlotForCaffeTop</a>.clear();</div><div class="line"><a name="l02266"></a><span class="lineno"> 2266</span>&#160;    <span class="comment">// NOTE: when we get the text/string format</span></div><div class="line"><a name="l02267"></a><span class="lineno"> 2267</span>&#160;    <span class="comment">//       optimised for memory then this data structure can</span></div><div class="line"><a name="l02268"></a><span class="lineno"> 2268</span>&#160;    <span class="comment">//       also move to the CaffeParser class</span></div><div class="line"><a name="l02269"></a><span class="lineno"> 2269</span>&#160;    <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a1424f1bfbfc81d317b51053bbb315ef1">m_CaffeLayersByTopName</a>.clear();</div><div class="line"><a name="l02270"></a><span class="lineno"> 2270</span>&#160;}</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;}</div><div class="ttc" id="structarmnn_1_1_convolution2d_descriptor_xhtml_aa9e49717ebdb741e8c767741647fc618"><div class="ttname"><a href="structarmnn_1_1_convolution2d_descriptor.xhtml#aa9e49717ebdb741e8c767741647fc618">armnn::Convolution2dDescriptor::m_PadBottom</a></div><div class="ttdeci">uint32_t m_PadBottom</div><div class="ttdoc">Padding bottom value in the height dimension. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l00444">Descriptors.hpp:444</a></div></div>
<div class="ttc" id="structarmnn_1_1_convolution2d_descriptor_xhtml_aea202e14d8874cefd9a0f778022b7e25"><div class="ttname"><a href="structarmnn_1_1_convolution2d_descriptor.xhtml#aea202e14d8874cefd9a0f778022b7e25">armnn::Convolution2dDescriptor::m_BiasEnabled</a></div><div class="ttdeci">bool m_BiasEnabled</div><div class="ttdoc">Enable/disable bias. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l00454">Descriptors.hpp:454</a></div></div>
<div class="ttc" id="classarmnn_1_1_i_connectable_layer_xhtml_ac2dac3b61c94de52093616be4ab17f8d"><div class="ttname"><a href="classarmnn_1_1_i_connectable_layer.xhtml#ac2dac3b61c94de52093616be4ab17f8d">armnn::IConnectableLayer::GetNumOutputSlots</a></div><div class="ttdeci">virtual unsigned int GetNumOutputSlots() const =0</div><div class="ttdoc">Returns the number of connectable output slots. </div></div>
<div class="ttc" id="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl_xhtml_a3311e9dc3436fe83ef22c5f530fd3234"><div class="ttname"><a href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a3311e9dc3436fe83ef22c5f530fd3234">armnnCaffeParser::ICaffeParser::CaffeParserImpl::ParseSplitLayer</a></div><div class="ttdeci">void ParseSplitLayer(const caffe::LayerParameter &amp;layerParam)</div><div class="ttdef"><b>Definition:</b> <a href="_caffe_parser_8cpp_source.xhtml#l01881">CaffeParser.cpp:1881</a></div></div>
<div class="ttc" id="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl_xhtml_adcb87456482d5df17ef09eca1a808091"><div class="ttname"><a href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#adcb87456482d5df17ef09eca1a808091">armnnCaffeParser::ICaffeParser::CaffeParserImpl::AddConvLayerWithDepthwiseConv</a></div><div class="ttdeci">void AddConvLayerWithDepthwiseConv(const caffe::LayerParameter &amp;layerParam, const armnn::Convolution2dDescriptor &amp;desc, unsigned int kernelW, unsigned int kernelH)</div><div class="ttdef"><b>Definition:</b> <a href="_caffe_parser_8cpp_source.xhtml#l00825">CaffeParser.cpp:825</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="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="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl_xhtml_a77f532a6a82afeb6e79957726a9517a5"><div class="ttname"><a href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a77f532a6a82afeb6e79957726a9517a5">armnnCaffeParser::ICaffeParser::CaffeParserImpl::AddDeconvLayerWithSplits</a></div><div class="ttdeci">void AddDeconvLayerWithSplits(const caffe::LayerParameter &amp;layerParam, const armnn::TransposeConvolution2dDescriptor &amp;desc, unsigned int kernelW, unsigned int kernelH)</div><div class="ttdef"><b>Definition:</b> <a href="_caffe_parser_8cpp_source.xhtml#l00637">CaffeParser.cpp:637</a></div></div>
<div class="ttc" id="structarmnn_1_1_pooling2d_descriptor_xhtml_aa9e49717ebdb741e8c767741647fc618"><div class="ttname"><a href="structarmnn_1_1_pooling2d_descriptor.xhtml#aa9e49717ebdb741e8c767741647fc618">armnn::Pooling2dDescriptor::m_PadBottom</a></div><div class="ttdeci">uint32_t m_PadBottom</div><div class="ttdoc">Padding bottom value in the height dimension. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l00371">Descriptors.hpp:371</a></div></div>
<div class="ttc" id="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl_xhtml_a76ea67f3f7d1d5835c5a92b65dc0854c"><div class="ttname"><a href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a76ea67f3f7d1d5835c5a92b65dc0854c">armnnCaffeParser::ICaffeParser::CaffeParserImpl::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="_caffe_parser_8hpp_source.xhtml#l00144">CaffeParser.hpp:144</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="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl_xhtml_a7785119cfebd2b02ba3be888965e52ba"><div class="ttname"><a href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a7785119cfebd2b02ba3be888965e52ba">armnnCaffeParser::ICaffeParser::CaffeParserImpl::ParseLRNLayer</a></div><div class="ttdeci">void ParseLRNLayer(const caffe::LayerParameter &amp;layerParam)</div><div class="ttdef"><b>Definition:</b> <a href="_caffe_parser_8cpp_source.xhtml#l01468">CaffeParser.cpp:1468</a></div></div>
<div class="ttc" id="structarmnn_1_1_softmax_descriptor_xhtml_a214c3636fdf0ea5bac8edb42d0e6c7f0"><div class="ttname"><a href="structarmnn_1_1_softmax_descriptor.xhtml#a214c3636fdf0ea5bac8edb42d0e6c7f0">armnn::SoftmaxDescriptor::m_Axis</a></div><div class="ttdeci">int m_Axis</div><div class="ttdoc">Scalar, defaulted to the last index (-1), specifying the dimension the activation will be performed o...</div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l00154">Descriptors.hpp:154</a></div></div>
<div class="ttc" id="structarmnn_1_1_transpose_convolution2d_descriptor_xhtml"><div class="ttname"><a href="structarmnn_1_1_transpose_convolution2d_descriptor.xhtml">armnn::TransposeConvolution2dDescriptor</a></div><div class="ttdoc">A TransposeConvolution2dDescriptor for the TransposeConvolution2dLayer. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l01213">Descriptors.hpp:1213</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="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl_xhtml_a4b1fdcb1985af12dd1848a9ffa5d3271"><div class="ttname"><a href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a4b1fdcb1985af12dd1848a9ffa5d3271">armnnCaffeParser::ICaffeParser::CaffeParserImpl::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="_caffe_parser_8cpp_source.xhtml#l00327">CaffeParser.cpp:327</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="_utils_8hpp_xhtml"><div class="ttname"><a href="_utils_8hpp.xhtml">Utils.hpp</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="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl_xhtml_a7e393f41f2330006fdf00f2840c6dd28"><div class="ttname"><a href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a7e393f41f2330006fdf00f2840c6dd28">armnnCaffeParser::ICaffeParser::CaffeParserImpl::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="_caffe_parser_8cpp_source.xhtml#l02171">CaffeParser.cpp:2171</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="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl_xhtml_ac915fb2df2772be3179e97b1e8287a2d"><div class="ttname"><a href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#ac915fb2df2772be3179e97b1e8287a2d">armnnCaffeParser::ICaffeParser::CaffeParserImpl::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 disk. </div><div class="ttdef"><b>Definition:</b> <a href="_caffe_parser_8cpp_source.xhtml#l02139">CaffeParser.cpp:2139</a></div></div>
<div class="ttc" id="structarmnn_1_1_fully_connected_descriptor_xhtml_a281fcaec86e17c97f7b8402633f6b55a"><div class="ttname"><a href="structarmnn_1_1_fully_connected_descriptor.xhtml#a281fcaec86e17c97f7b8402633f6b55a">armnn::FullyConnectedDescriptor::m_TransposeWeightMatrix</a></div><div class="ttdeci">bool m_TransposeWeightMatrix</div><div class="ttdoc">Enable/disable transpose weight matrix. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l00404">Descriptors.hpp:404</a></div></div>
<div class="ttc" id="namespacegoogle_1_1protobuf_1_1io_xhtml"><div class="ttname"><a href="namespacegoogle_1_1protobuf_1_1io.xhtml">io</a></div></div>
<div class="ttc" id="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl_xhtml_a95799625a4aae0ed73838cbfa3530c1b"><div class="ttname"><a href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a95799625a4aae0ed73838cbfa3530c1b">armnnCaffeParser::ICaffeParser::CaffeParserImpl::ParseScaleLayer</a></div><div class="ttdeci">void ParseScaleLayer(const caffe::LayerParameter &amp;layerParam)</div><div class="ttdef"><b>Definition:</b> <a href="_caffe_parser_8cpp_source.xhtml#l01831">CaffeParser.cpp:1831</a></div></div>
<div class="ttc" id="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl_xhtml_afb7e4da478bab76261963479baad5788"><div class="ttname"><a href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#afb7e4da478bab76261963479baad5788">armnnCaffeParser::ICaffeParser::CaffeParserImpl::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;bindingInfos)</div><div class="ttdef"><b>Definition:</b> <a href="_caffe_parser_8cpp_source.xhtml#l00332">CaffeParser.cpp:332</a></div></div>
<div class="ttc" id="structarmnn_1_1_pooling2d_descriptor_xhtml_a6d8fb685cc1ff224f25aa127fcf62c86"><div class="ttname"><a href="structarmnn_1_1_pooling2d_descriptor.xhtml#a6d8fb685cc1ff224f25aa127fcf62c86">armnn::Pooling2dDescriptor::m_PoolWidth</a></div><div class="ttdeci">uint32_t m_PoolWidth</div><div class="ttdoc">Pooling width value. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l00373">Descriptors.hpp:373</a></div></div>
<div class="ttc" id="structarmnn_1_1_convolution2d_descriptor_xhtml"><div class="ttname"><a href="structarmnn_1_1_convolution2d_descriptor.xhtml">armnn::Convolution2dDescriptor</a></div><div class="ttdoc">A Convolution2dDescriptor for the Convolution2dLayer. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l00408">Descriptors.hpp:408</a></div></div>
<div class="ttc" id="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_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_1_1_transpose_convolution2d_descriptor_xhtml_aea202e14d8874cefd9a0f778022b7e25"><div class="ttname"><a href="structarmnn_1_1_transpose_convolution2d_descriptor.xhtml#aea202e14d8874cefd9a0f778022b7e25">armnn::TransposeConvolution2dDescriptor::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#l01254">Descriptors.hpp:1254</a></div></div>
<div class="ttc" id="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl_xhtml_aa4c22681675806fa2c5fbf403d49c628"><div class="ttname"><a href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#aa4c22681675806fa2c5fbf403d49c628">armnnCaffeParser::ICaffeParser::CaffeParserImpl::ParseDropoutLayer</a></div><div class="ttdeci">void ParseDropoutLayer(const caffe::LayerParameter &amp;layerParam)</div><div class="ttdef"><b>Definition:</b> <a href="_caffe_parser_8cpp_source.xhtml#l01900">CaffeParser.cpp:1900</a></div></div>
<div class="ttc" id="classarmnn_caffe_parser_1_1_caffe_parser_xhtml_a82fc903eb5648250a6d82371a94772a3"><div class="ttname"><a href="classarmnn_caffe_parser_1_1_caffe_parser.xhtml#a82fc903eb5648250a6d82371a94772a3">armnnCaffeParser::CaffeParser::CaffeParser</a></div><div class="ttdeci">CaffeParser()</div><div class="ttdef"><b>Definition:</b> <a href="_caffe_parser_8cpp_source.xhtml#l00316">CaffeParser.cpp:316</a></div></div>
<div class="ttc" id="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl_xhtml_a0c98e07875a82c71c65bbb53eb347561"><div class="ttname"><a href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a0c98e07875a82c71c65bbb53eb347561">armnnCaffeParser::ICaffeParser::CaffeParserImpl::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="_caffe_parser_8cpp_source.xhtml#l01923">CaffeParser.cpp:1923</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_arg_min_max_descriptor_xhtml_ab1ae6f520bb1a4da191a0ae907477f23"><div class="ttname"><a href="structarmnn_1_1_arg_min_max_descriptor.xhtml#ab1ae6f520bb1a4da191a0ae907477f23">armnn::ArgMinMaxDescriptor::m_Function</a></div><div class="ttdeci">ArgMinMaxFunction m_Function</div><div class="ttdoc">Specify if the function is to find Min or Max. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l00070">Descriptors.hpp:70</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_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl_xhtml_a86cb41745deebd9b0ccf157d97d4d9ca"><div class="ttname"><a href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a86cb41745deebd9b0ccf157d97d4d9ca">armnnCaffeParser::ICaffeParser::CaffeParserImpl::m_RequestedOutputs</a></div><div class="ttdeci">std::vector&lt; std::string &gt; m_RequestedOutputs</div><div class="ttdef"><b>Definition:</b> <a href="_caffe_parser_8hpp_source.xhtml#l00149">CaffeParser.hpp:149</a></div></div>
<div class="ttc" id="include_2armnn_caffe_parser_2_version_8hpp_xhtml_af3d53d50a9ddd493c4b40e44a82e2b44"><div class="ttname"><a href="include_2armnn_caffe_parser_2_version_8hpp.xhtml#af3d53d50a9ddd493c4b40e44a82e2b44">CAFFE_PARSER_VERSION</a></div><div class="ttdeci">#define CAFFE_PARSER_VERSION</div><div class="ttdoc">CAFFE_PARSER_VERSION: &quot;X.Y.Z&quot; where: X = Major version number Y = Minor version number Z = Patch vers...</div><div class="ttdef"><b>Definition:</b> <a href="include_2armnn_caffe_parser_2_version_8hpp_source.xhtml#l00025">Version.hpp:25</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="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="structarmnn_1_1_transpose_convolution2d_descriptor_xhtml_aa9e49717ebdb741e8c767741647fc618"><div class="ttname"><a href="structarmnn_1_1_transpose_convolution2d_descriptor.xhtml#aa9e49717ebdb741e8c767741647fc618">armnn::TransposeConvolution2dDescriptor::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#l01248">Descriptors.hpp:1248</a></div></div>
<div class="ttc" id="namespacearmnn_caffe_parser_xhtml"><div class="ttname"><a href="namespacearmnn_caffe_parser.xhtml">armnnCaffeParser</a></div><div class="ttdoc">Caffe networks are loaded from protobuf files (binary or text) using the protobuf library and the gen...</div><div class="ttdef"><b>Definition:</b> <a href="_i_caffe_parser_8hpp_source.xhtml#l00016">ICaffeParser.hpp:16</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="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl_xhtml_aa09a8bb02eed50715082d8b7fccd2f8d"><div class="ttname"><a href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#aa09a8bb02eed50715082d8b7fccd2f8d">armnnCaffeParser::ICaffeParser::CaffeParserImpl::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="_caffe_parser_8cpp_source.xhtml#l02256">CaffeParser.cpp:2256</a></div></div>
<div class="ttc" id="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl_xhtml_aa0f0ff1cae05c1a0d7cc11b498714312"><div class="ttname"><a href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#aa0f0ff1cae05c1a0d7cc11b498714312">armnnCaffeParser::ICaffeParser::CaffeParserImpl::ParseConcatLayer</a></div><div class="ttdeci">void ParseConcatLayer(const caffe::LayerParameter &amp;layerParam)</div><div class="ttdef"><b>Definition:</b> <a href="_caffe_parser_8cpp_source.xhtml#l01708">CaffeParser.cpp:1708</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="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl_xhtml_a9c5eed5d48d21a8b7e3bcd2cab519217"><div class="ttname"><a href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a9c5eed5d48d21a8b7e3bcd2cab519217">armnnCaffeParser::ICaffeParser::CaffeParserImpl::LoadNetParam</a></div><div class="ttdeci">void LoadNetParam(caffe::NetParameter &amp;netParameter)</div><div class="ttdoc">does the actual conversion from caffe::NetParameter to armnn::INetwork </div><div class="ttdef"><b>Definition:</b> <a href="_caffe_parser_8cpp_source.xhtml#l02043">CaffeParser.cpp:2043</a></div></div>
<div class="ttc" id="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl_xhtml_a5f5e6255b21fdf458d3733bbdcdc4af5"><div class="ttname"><a href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a5f5e6255b21fdf458d3733bbdcdc4af5">armnnCaffeParser::ICaffeParser::CaffeParserImpl::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="_caffe_parser_8cpp_source.xhtml#l01930">CaffeParser.cpp:1930</a></div></div>
<div class="ttc" id="structarmnn_1_1_pooling2d_descriptor_xhtml_afe6a3377c4531315354def9023c8fdda"><div class="ttname"><a href="structarmnn_1_1_pooling2d_descriptor.xhtml#afe6a3377c4531315354def9023c8fdda">armnn::Pooling2dDescriptor::m_StrideX</a></div><div class="ttdeci">uint32_t m_StrideX</div><div class="ttdoc">Stride value when proceeding through input for the width dimension. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l00377">Descriptors.hpp:377</a></div></div>
<div class="ttc" id="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl_xhtml_ab0bb4b8a290f1c8acd3c3a0d9a6e9783"><div class="ttname"><a href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#ab0bb4b8a290f1c8acd3c3a0d9a6e9783">armnnCaffeParser::ICaffeParser::CaffeParserImpl::CreateNetworkFromNetParameter</a></div><div class="ttdeci">armnn::INetworkPtr CreateNetworkFromNetParameter(caffe::NetParameter &amp;netParam, 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 NetParameter loaded into memory from one of the other CreateNetwork*. </div><div class="ttdef"><b>Definition:</b> <a href="_caffe_parser_8cpp_source.xhtml#l02225">CaffeParser.cpp:2225</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_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_caffe_parser_1_1_i_caffe_parser_xhtml_add49602ee9cd2bd16c1c4ccd25555d8e"><div class="ttname"><a href="classarmnn_caffe_parser_1_1_i_caffe_parser.xhtml#add49602ee9cd2bd16c1c4ccd25555d8e">armnnCaffeParser::ICaffeParser::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="_caffe_parser_8cpp_source.xhtml#l00085">CaffeParser.cpp:85</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="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl_xhtml_a5ce905b7412e68d588e08f4afc333aac"><div class="ttname"><a href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a5ce905b7412e68d588e08f4afc333aac">armnnCaffeParser::ICaffeParser::CaffeParserImpl::ParseArgmaxLayer</a></div><div class="ttdeci">void ParseArgmaxLayer(const caffe::LayerParameter &amp;layerParam)</div><div class="ttdef"><b>Definition:</b> <a href="_caffe_parser_8cpp_source.xhtml#l01382">CaffeParser.cpp:1382</a></div></div>
<div class="ttc" id="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl_xhtml_a62d6d6cba9ed0d3ad63fffb40aec86b5"><div class="ttname"><a href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a62d6d6cba9ed0d3ad63fffb40aec86b5">armnnCaffeParser::ICaffeParser::CaffeParserImpl::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 infos </div><div class="ttdef"><b>Definition:</b> <a href="_caffe_parser_8hpp_source.xhtml#l00140">CaffeParser.hpp:140</a></div></div>
<div class="ttc" id="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl_xhtml_a9fea304829fe514d664de515ca5c3918"><div class="ttname"><a href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a9fea304829fe514d664de515ca5c3918">armnnCaffeParser::ICaffeParser::CaffeParserImpl::AddConvLayerWithSplits</a></div><div class="ttdeci">void AddConvLayerWithSplits(const caffe::LayerParameter &amp;layerParam, const armnn::Convolution2dDescriptor &amp;desc, unsigned int kernelW, unsigned int kernelH)</div><div class="ttdoc">ParseConv may use these helpers depending on the group parameter. </div><div class="ttdef"><b>Definition:</b> <a href="_caffe_parser_8cpp_source.xhtml#l00447">CaffeParser.cpp:447</a></div></div>
<div class="ttc" id="classarmnn_caffe_parser_1_1_i_caffe_parser_xhtml"><div class="ttname"><a href="classarmnn_caffe_parser_1_1_i_caffe_parser.xhtml">armnnCaffeParser::ICaffeParser</a></div><div class="ttdef"><b>Definition:</b> <a href="_i_caffe_parser_8hpp_source.xhtml#l00024">ICaffeParser.hpp:24</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="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl_xhtml_a8b053a6c449d0814cc831c916c126668"><div class="ttname"><a href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a8b053a6c449d0814cc831c916c126668">armnnCaffeParser::ICaffeParser::CaffeParserImpl::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="_caffe_parser_8cpp_source.xhtml#l00322">CaffeParser.cpp:322</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="namespacestd_xhtml"><div class="ttname"><a href="namespacestd.xhtml">std</a></div><div class="ttdef"><b>Definition:</b> <a href="_backend_id_8hpp_source.xhtml#l00147">BackendId.hpp:147</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="_verification_helpers_8hpp_xhtml"><div class="ttname"><a href="_verification_helpers_8hpp.xhtml">VerificationHelpers.hpp</a></div></div>
<div class="ttc" id="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl_xhtml_a9650b8810d4e6734b255ca25d495fe06"><div class="ttname"><a href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a9650b8810d4e6734b255ca25d495fe06">armnnCaffeParser::ICaffeParser::CaffeParserImpl::GetArmnnOutputSlotForCaffeTop</a></div><div class="ttdeci">armnn::IOutputSlot &amp; GetArmnnOutputSlotForCaffeTop(const std::string &amp;caffeTopName) const</div><div class="ttdoc">Retrieves the Armnn IOutputSlot representing the given Caffe top. </div><div class="ttdef"><b>Definition:</b> <a href="_caffe_parser_8cpp_source.xhtml#l01952">CaffeParser.cpp:1952</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_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="namespacearmnn_xhtml_ae7e8cbf71db6a490789ca6dcaa8deeaea6a061313d22e51e0f25b7cd4dc065233"><div class="ttname"><a href="namespacearmnn.xhtml#ae7e8cbf71db6a490789ca6dcaa8deeaea6a061313d22e51e0f25b7cd4dc065233">armnn::ArgMinMaxFunction::Max</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_1_1_arg_min_max_descriptor_xhtml"><div class="ttname"><a href="structarmnn_1_1_arg_min_max_descriptor.xhtml">armnn::ArgMinMaxDescriptor</a></div><div class="ttdoc">An ArgMinMaxDescriptor for ArgMinMaxLayer. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l00056">Descriptors.hpp:56</a></div></div>
<div class="ttc" id="_caffe_parser_8hpp_xhtml"><div class="ttname"><a href="_caffe_parser_8hpp.xhtml">CaffeParser.hpp</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="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl_xhtml_a6fb0cd80a09cf767309175fb138d203b"><div class="ttname"><a href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a6fb0cd80a09cf767309175fb138d203b">armnnCaffeParser::ICaffeParser::CaffeParserImpl::ms_CaffeLayerNameToParsingFunctions</a></div><div class="ttdeci">static const std::map&lt; std::string, OperationParsingFunction &gt; ms_CaffeLayerNameToParsingFunctions</div><div class="ttdoc">Maps Caffe layer names to parsing member functions. </div><div class="ttdef"><b>Definition:</b> <a href="_caffe_parser_8hpp_source.xhtml#l00134">CaffeParser.hpp:134</a></div></div>
<div class="ttc" id="structarmnn_1_1_fully_connected_descriptor_xhtml_aea202e14d8874cefd9a0f778022b7e25"><div class="ttname"><a href="structarmnn_1_1_fully_connected_descriptor.xhtml#aea202e14d8874cefd9a0f778022b7e25">armnn::FullyConnectedDescriptor::m_BiasEnabled</a></div><div class="ttdeci">bool m_BiasEnabled</div><div class="ttdoc">Enable/disable bias. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l00402">Descriptors.hpp:402</a></div></div>
<div class="ttc" id="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl_xhtml_ac62e2558c14e01605f2b4e1e21cdd1e8"><div class="ttname"><a href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#ac62e2558c14e01605f2b4e1e21cdd1e8">armnnCaffeParser::ICaffeParser::CaffeParserImpl::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 infos </div><div class="ttdef"><b>Definition:</b> <a href="_caffe_parser_8hpp_source.xhtml#l00137">CaffeParser.hpp:137</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="_record_by_record_caffe_parser_8hpp_xhtml"><div class="ttname"><a href="_record_by_record_caffe_parser_8hpp.xhtml">RecordByRecordCaffeParser.hpp</a></div></div>
<div class="ttc" id="classarmnn_caffe_parser_1_1_caffe_parser_xhtml_afb0edadd00c78430efbdc02844ef379a"><div class="ttname"><a href="classarmnn_caffe_parser_1_1_caffe_parser.xhtml#afb0edadd00c78430efbdc02844ef379a">armnnCaffeParser::CaffeParser::CreateNetworkFromBinaryFile</a></div><div class="ttdeci">virtual 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) override</div><div class="ttdoc">Create the network from a protobuf binary file on disk. </div><div class="ttdef"><b>Definition:</b> <a href="_caffe_parser_8cpp_source.xhtml#l02189">CaffeParser.cpp:2189</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="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl_xhtml_a8449e66d395c0525561e3c67b100bafe"><div class="ttname"><a href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a8449e66d395c0525561e3c67b100bafe">armnnCaffeParser::ICaffeParser::CaffeParserImpl::ParseReluLayer</a></div><div class="ttdeci">void ParseReluLayer(const caffe::LayerParameter &amp;layerParam)</div><div class="ttdef"><b>Definition:</b> <a href="_caffe_parser_8cpp_source.xhtml#l01442">CaffeParser.cpp:1442</a></div></div>
<div class="ttc" id="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl_xhtml_a1c0594bf03dfbb44029465d3466127b3"><div class="ttname"><a href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a1c0594bf03dfbb44029465d3466127b3">armnnCaffeParser::ICaffeParser::CaffeParserImpl::ParseSoftmaxLayer</a></div><div class="ttdeci">void ParseSoftmaxLayer(const caffe::LayerParameter &amp;layerParam)</div><div class="ttdef"><b>Definition:</b> <a href="_caffe_parser_8cpp_source.xhtml#l01641">CaffeParser.cpp:1641</a></div></div>
<div class="ttc" id="_caffe_parser_8cpp_xhtml_a69f4a692d0095f6b19b0cd99cd75e465"><div class="ttname"><a href="_caffe_parser_8cpp.xhtml#a69f4a692d0095f6b19b0cd99cd75e465">GET_OPTIONAL_WITH_FALLBACK</a></div><div class="ttdeci">#define GET_OPTIONAL_WITH_FALLBACK(PARAM, PARAM_TYPE, OPTIONAL_VALUE, FALLBACK_VALUE, VALUE_TYPE, DEFAULT_VALUE)</div><div class="ttdef"><b>Definition:</b> <a href="_caffe_parser_8cpp_source.xhtml#l00257">CaffeParser.cpp:257</a></div></div>
<div class="ttc" id="namespacearmnn_caffe_parser_xhtml_a33c76910f1980ffaa41c22e0151cce2a"><div class="ttname"><a href="namespacearmnn_caffe_parser.xhtml#a33c76910f1980ffaa41c22e0151cce2a">armnnCaffeParser::ICaffeParserPtr</a></div><div class="ttdeci">std::unique_ptr&lt; ICaffeParser, void(*)(ICaffeParser *parser)&gt; ICaffeParserPtr</div><div class="ttdef"><b>Definition:</b> <a href="_i_caffe_parser_8hpp_source.xhtml#l00022">ICaffeParser.hpp:22</a></div></div>
<div class="ttc" id="structarmnn_1_1_activation_descriptor_xhtml"><div class="ttname"><a href="structarmnn_1_1_activation_descriptor.xhtml">armnn::ActivationDescriptor</a></div><div class="ttdoc">An ActivationDescriptor for the ActivationLayer. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l00025">Descriptors.hpp:25</a></div></div>
<div class="ttc" id="classarmnn_1_1_invalid_argument_exception_xhtml"><div class="ttname"><a href="classarmnn_1_1_invalid_argument_exception.xhtml">armnn::InvalidArgumentException</a></div><div class="ttdef"><b>Definition:</b> <a href="_exceptions_8hpp_source.xhtml#l00080">Exceptions.hpp:80</a></div></div>
<div class="ttc" id="_exceptions_8hpp_xhtml_aa3be76aec4ce713822a5ea1ecbb7bc61"><div class="ttname"><a href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a></div><div class="ttdeci">#define CHECK_LOCATION()</div><div class="ttdef"><b>Definition:</b> <a href="_exceptions_8hpp_source.xhtml#l00197">Exceptions.hpp:197</a></div></div>
<div class="ttc" id="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl_xhtml_a940483591995bb812cfcd1595dba83c3"><div class="ttname"><a href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a940483591995bb812cfcd1595dba83c3">armnnCaffeParser::ICaffeParser::CaffeParserImpl::ParseBatchNormLayer</a></div><div class="ttdeci">void ParseBatchNormLayer(const caffe::LayerParameter &amp;layerParam)</div><div class="ttdef"><b>Definition:</b> <a href="_caffe_parser_8cpp_source.xhtml#l01767">CaffeParser.cpp:1767</a></div></div>
<div class="ttc" id="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl_xhtml_a34f6df4b84de1e269bcf02efeecc3892"><div class="ttname"><a href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a34f6df4b84de1e269bcf02efeecc3892">armnnCaffeParser::ICaffeParser::CaffeParserImpl::ParseInnerProductLayer</a></div><div class="ttdeci">void ParseInnerProductLayer(const caffe::LayerParameter &amp;layerParam)</div><div class="ttdef"><b>Definition:</b> <a href="_caffe_parser_8cpp_source.xhtml#l01567">CaffeParser.cpp:1567</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="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl_xhtml_a89631aa06b5c628c46674c202b40dbc5"><div class="ttname"><a href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a89631aa06b5c628c46674c202b40dbc5">armnnCaffeParser::ICaffeParser::CaffeParserImpl::ResolveInPlaceLayers</a></div><div class="ttdeci">void ResolveInPlaceLayers(caffe::NetParameter &amp;netParameter)</div><div class="ttdoc">Modifies the Caffe network to replace &quot;in-place&quot; layers (whose top() and bottom() are both the same) ...</div><div class="ttdef"><b>Definition:</b> <a href="_caffe_parser_8cpp_source.xhtml#l01987">CaffeParser.cpp:1987</a></div></div>
<div class="ttc" id="namespacecaffe_xhtml"><div class="ttname"><a href="namespacecaffe.xhtml">caffe</a></div><div class="ttdef"><b>Definition:</b> <a href="_caffe_parser_8hpp_source.xhtml#l00016">CaffeParser.hpp:16</a></div></div>
<div class="ttc" id="_i_network_8hpp_xhtml"><div class="ttname"><a href="_i_network_8hpp.xhtml">INetwork.hpp</a></div></div>
<div class="ttc" id="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl_xhtml_a0767b1c7ee9cbd014fd97c701a954caa"><div class="ttname"><a href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a0767b1c7ee9cbd014fd97c701a954caa">armnnCaffeParser::ICaffeParser::CaffeParserImpl::SetArmnnOutputSlotForCaffeTop</a></div><div class="ttdeci">void SetArmnnOutputSlotForCaffeTop(const std::string &amp;caffeTopName, armnn::IOutputSlot &amp;armnnOutputSlot)</div><div class="ttdef"><b>Definition:</b> <a href="_caffe_parser_8cpp_source.xhtml#l01968">CaffeParser.cpp:1968</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="structarmnn_1_1_activation_descriptor_xhtml_a017b2990003a014234f13e999dc7c689"><div class="ttname"><a href="structarmnn_1_1_activation_descriptor.xhtml#a017b2990003a014234f13e999dc7c689">armnn::ActivationDescriptor::m_A</a></div><div class="ttdeci">float m_A</div><div class="ttdoc">Alpha upper bound value used by the activation functions. (BoundedReLu, Linear, TanH, Elu). </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l00050">Descriptors.hpp:50</a></div></div>
<div class="ttc" id="structarmnn_1_1_convolution2d_descriptor_xhtml_aa3c6a77a963a98ccb8ea7b8fd008a8c1"><div class="ttname"><a href="structarmnn_1_1_convolution2d_descriptor.xhtml#aa3c6a77a963a98ccb8ea7b8fd008a8c1">armnn::Convolution2dDescriptor::m_DilationX</a></div><div class="ttdeci">uint32_t m_DilationX</div><div class="ttdoc">Dilation along x axis. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l00450">Descriptors.hpp:450</a></div></div>
<div class="ttc" id="_assert_8hpp_xhtml"><div class="ttname"><a href="_assert_8hpp.xhtml">Assert.hpp</a></div></div>
<div class="ttc" id="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl_xhtml_ab3329e4bcd8e42cd314f84c8260b06ad"><div class="ttname"><a href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#ab3329e4bcd8e42cd314f84c8260b06ad">armnnCaffeParser::ICaffeParser::CaffeParserImpl::ParsePoolingLayer</a></div><div class="ttdeci">void ParsePoolingLayer(const caffe::LayerParameter &amp;layerParam)</div><div class="ttdef"><b>Definition:</b> <a href="_caffe_parser_8cpp_source.xhtml#l01270">CaffeParser.cpp:1270</a></div></div>
<div class="ttc" id="structarmnn_1_1_transpose_convolution2d_descriptor_xhtml_ac18546ebbebbb32fe0a03baa9bf2c600"><div class="ttname"><a href="structarmnn_1_1_transpose_convolution2d_descriptor.xhtml#ac18546ebbebbb32fe0a03baa9bf2c600">armnn::TransposeConvolution2dDescriptor::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#l01242">Descriptors.hpp:1242</a></div></div>
<div class="ttc" id="structarmnn_1_1_empty_optional_xhtml"><div class="ttname"><a href="structarmnn_1_1_empty_optional.xhtml">armnn::EmptyOptional</a></div><div class="ttdoc">EmptyOptional is used to initialize the Optional class in case we want to have default value for an O...</div><div class="ttdef"><b>Definition:</b> <a href="_optional_8hpp_source.xhtml#l00032">Optional.hpp:32</a></div></div>
<div class="ttc" id="classarmnn_1_1_parse_exception_xhtml"><div class="ttname"><a href="classarmnn_1_1_parse_exception.xhtml">armnn::ParseException</a></div><div class="ttdef"><b>Definition:</b> <a href="_exceptions_8hpp_source.xhtml#l00092">Exceptions.hpp:92</a></div></div>
<div class="ttc" id="namespacearmnn_xhtml_a280670a263dc4fd40491f6d0a2737f44"><div class="ttname"><a href="namespacearmnn.xhtml#a280670a263dc4fd40491f6d0a2737f44">armnn::BindingPointInfo</a></div><div class="ttdeci">std::pair&lt; armnn::LayerBindingId, armnn::TensorInfo &gt; BindingPointInfo</div><div class="ttdef"><b>Definition:</b> <a href="_tensor_8hpp_source.xhtml#l00261">Tensor.hpp:261</a></div></div>
<div class="ttc" id="structarmnn_1_1_transpose_convolution2d_descriptor_xhtml_afe6a3377c4531315354def9023c8fdda"><div class="ttname"><a href="structarmnn_1_1_transpose_convolution2d_descriptor.xhtml#afe6a3377c4531315354def9023c8fdda">armnn::TransposeConvolution2dDescriptor::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#l01250">Descriptors.hpp:1250</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_transpose_convolution2d_descriptor_xhtml_ac1fe174bbadfb39a2b636940c2e647c8"><div class="ttname"><a href="structarmnn_1_1_transpose_convolution2d_descriptor.xhtml#ac1fe174bbadfb39a2b636940c2e647c8">armnn::TransposeConvolution2dDescriptor::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#l01252">Descriptors.hpp:1252</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="_exceptions_8hpp_xhtml"><div class="ttname"><a href="_exceptions_8hpp.xhtml">Exceptions.hpp</a></div></div>
<div class="ttc" id="structarmnn_1_1_pooling2d_descriptor_xhtml_affb5b68b3eba3ed45a06c7cde7781962"><div class="ttname"><a href="structarmnn_1_1_pooling2d_descriptor.xhtml#affb5b68b3eba3ed45a06c7cde7781962">armnn::Pooling2dDescriptor::m_OutputShapeRounding</a></div><div class="ttdeci">OutputShapeRounding m_OutputShapeRounding</div><div class="ttdoc">The rounding method for the output shape. (Floor, Ceiling). </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l00381">Descriptors.hpp:381</a></div></div>
<div class="ttc" id="classarmnn_1_1_i_connectable_layer_xhtml_a6ec9e0eb66d7d6a01240492a0b18104c"><div class="ttname"><a href="classarmnn_1_1_i_connectable_layer.xhtml#a6ec9e0eb66d7d6a01240492a0b18104c">armnn::IConnectableLayer::GetInputSlot</a></div><div class="ttdeci">virtual const IInputSlot &amp; GetInputSlot(unsigned int index) const =0</div><div class="ttdoc">Get a const input slot handle by slot index. </div></div>
<div class="ttc" id="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl_xhtml_a4ddfa6cb51f928114a8151b8f455f115"><div class="ttname"><a href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a4ddfa6cb51f928114a8151b8f455f115">armnnCaffeParser::ICaffeParser::CaffeParserImpl::CaffeParserImpl</a></div><div class="ttdeci">CaffeParserImpl()</div><div class="ttdef"><b>Definition:</b> <a href="_caffe_parser_8cpp_source.xhtml#l00310">CaffeParser.cpp:310</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_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="include_2armnn_caffe_parser_2_version_8hpp_xhtml"><div class="ttname"><a href="include_2armnn_caffe_parser_2_version_8hpp.xhtml">Version.hpp</a></div></div>
<div class="ttc" id="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl_xhtml_a99a846a21b3a6ec97cc1d4344b91df36"><div class="ttname"><a href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a99a846a21b3a6ec97cc1d4344b91df36">armnnCaffeParser::ICaffeParser::CaffeParserImpl::ParseEltwiseLayer</a></div><div class="ttdeci">void ParseEltwiseLayer(const caffe::LayerParameter &amp;layerParam)</div><div class="ttdef"><b>Definition:</b> <a href="_caffe_parser_8cpp_source.xhtml#l01663">CaffeParser.cpp:1663</a></div></div>
<div class="ttc" id="structarmnn_1_1_transpose_convolution2d_descriptor_xhtml_a002bc30e590d78cbb4f4d12171055ca7"><div class="ttname"><a href="structarmnn_1_1_transpose_convolution2d_descriptor.xhtml#a002bc30e590d78cbb4f4d12171055ca7">armnn::TransposeConvolution2dDescriptor::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#l01244">Descriptors.hpp:1244</a></div></div>
<div class="ttc" id="namespacearmnn_xhtml_a961bbfe1db71a848eff5a1f0ab775718a6a061313d22e51e0f25b7cd4dc065233"><div class="ttname"><a href="namespacearmnn.xhtml#a961bbfe1db71a848eff5a1f0ab775718a6a061313d22e51e0f25b7cd4dc065233">armnn::PoolingAlgorithm::Max</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_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="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl_xhtml_a2db3ae8d422f17d455e0ba0cb6291d2a"><div class="ttname"><a href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a2db3ae8d422f17d455e0ba0cb6291d2a">armnnCaffeParser::ICaffeParser::CaffeParserImpl::m_Network</a></div><div class="ttdeci">armnn::INetworkPtr m_Network</div><div class="ttdef"><b>Definition:</b> <a href="_caffe_parser_8hpp_source.xhtml#l00142">CaffeParser.hpp:142</a></div></div>
<div class="ttc" id="structarmnn_1_1_arg_min_max_descriptor_xhtml_a214c3636fdf0ea5bac8edb42d0e6c7f0"><div class="ttname"><a href="structarmnn_1_1_arg_min_max_descriptor.xhtml#a214c3636fdf0ea5bac8edb42d0e6c7f0">armnn::ArgMinMaxDescriptor::m_Axis</a></div><div class="ttdeci">int m_Axis</div><div class="ttdoc">Axis to reduce across the input tensor. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l00072">Descriptors.hpp:72</a></div></div>
<div class="ttc" id="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl_xhtml_a9c99d40a72e6f0c6e4ad92d21e44edca"><div class="ttname"><a href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a9c99d40a72e6f0c6e4ad92d21e44edca">armnnCaffeParser::ICaffeParser::CaffeParserImpl::m_ArmnnOutputSlotForCaffeTop</a></div><div class="ttdeci">std::unordered_map&lt; std::string, armnn::IOutputSlot * &gt; m_ArmnnOutputSlotForCaffeTop</div><div class="ttdoc">As we add armnn layers we store the armnn IOutputSlot which corresponds to the Caffe tops...</div><div class="ttdef"><b>Definition:</b> <a href="_caffe_parser_8hpp_source.xhtml#l00147">CaffeParser.hpp:147</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="_caffe_parser_8cpp_xhtml_a7553d91772274ed9b103824bbf7f75a5"><div class="ttname"><a href="_caffe_parser_8cpp.xhtml#a7553d91772274ed9b103824bbf7f75a5">GET_OPTIONAL_WITH_VECTOR_FALLBACK</a></div><div class="ttdeci">#define GET_OPTIONAL_WITH_VECTOR_FALLBACK(PARAM, PARAM_TYPE, OPTIONAL_VALUE, FALLBACK_VECTOR, VALUE_TYPE, DEFAULT_VALUE)</div><div class="ttdef"><b>Definition:</b> <a href="_caffe_parser_8cpp_source.xhtml#l00225">CaffeParser.cpp:225</a></div></div>
<div class="ttc" id="_test_utils_8cpp_xhtml_a0b295acb179f15eb3fb862b32008f782"><div class="ttname"><a href="_test_utils_8cpp.xhtml#a0b295acb179f15eb3fb862b32008f782">Connect</a></div><div class="ttdeci">void Connect(armnn::IConnectableLayer *from, armnn::IConnectableLayer *to, const armnn::TensorInfo &amp;tensorInfo, unsigned int fromIndex, unsigned int toIndex)</div><div class="ttdef"><b>Definition:</b> <a href="_test_utils_8cpp_source.xhtml#l00012">TestUtils.cpp:12</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="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="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl_xhtml_a2a1112c66d08e3760ecccf39c7854a90"><div class="ttname"><a href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a2a1112c66d08e3760ecccf39c7854a90">armnnCaffeParser::ICaffeParser::CaffeParserImpl::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="_caffe_parser_8cpp_source.xhtml#l01916">CaffeParser.cpp:1916</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="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl_xhtml_ae89a123aad1c66a76c398b7af216aae4"><div class="ttname"><a href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#ae89a123aad1c66a76c398b7af216aae4">armnnCaffeParser::ICaffeParser::CaffeParserImpl::Cleanup</a></div><div class="ttdeci">void Cleanup()</div><div class="ttdef"><b>Definition:</b> <a href="_caffe_parser_8cpp_source.xhtml#l02261">CaffeParser.cpp:2261</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="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl_xhtml_a77e6c08b48c99fafa560805270503856"><div class="ttname"><a href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a77e6c08b48c99fafa560805270503856">armnnCaffeParser::ICaffeParser::CaffeParserImpl::BlobShapeToTensorInfo</a></div><div class="ttdeci">armnn::TensorInfo BlobShapeToTensorInfo(const caffe::BlobShape &amp;blobShape) const</div><div class="ttdoc">Converts Caffe&amp;#39;s protobuf tensor shape format to ArmNN&amp;#39;s. </div><div class="ttdef"><b>Definition:</b> <a href="_caffe_parser_8cpp_source.xhtml#l00349">CaffeParser.cpp:349</a></div></div>
<div class="ttc" id="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl_xhtml_a2f8fbd66c1a39a06d61fcb6536387d64"><div class="ttname"><a href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a2f8fbd66c1a39a06d61fcb6536387d64">armnnCaffeParser::ICaffeParser::CaffeParserImpl::GetInputs</a></div><div class="ttdeci">std::vector&lt; const caffe::LayerParameter * &gt; GetInputs(const caffe::LayerParameter &amp;layerParam)</div><div class="ttdoc">Find the Caffe layers listed as inputs (bottoms) for a given layer. </div><div class="ttdef"><b>Definition:</b> <a href="_caffe_parser_8cpp_source.xhtml#l00374">CaffeParser.cpp:374</a></div></div>
<div class="ttc" id="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl_xhtml_a5cddc80538d5de7d36192e0fd2d09c63"><div class="ttname"><a href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a5cddc80538d5de7d36192e0fd2d09c63">armnnCaffeParser::ICaffeParser::CaffeParserImpl::ParseConvLayer</a></div><div class="ttdeci">void ParseConvLayer(const caffe::LayerParameter &amp;layerParam)</div><div class="ttdef"><b>Definition:</b> <a href="_caffe_parser_8cpp_source.xhtml#l00915">CaffeParser.cpp:915</a></div></div>
<div class="ttc" id="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl_xhtml_a3a2636dd8414f2bb62c5fa097bdc9791"><div class="ttname"><a href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a3a2636dd8414f2bb62c5fa097bdc9791">armnnCaffeParser::ICaffeParser::CaffeParserImpl::ParseInputLayer</a></div><div class="ttdeci">void ParseInputLayer(const caffe::LayerParameter &amp;layerParam)</div><div class="ttdoc">Adds an armnn layer to m_Network given a Caffe LayerParameter of the correct type and is responsible ...</div><div class="ttdef"><b>Definition:</b> <a href="_caffe_parser_8cpp_source.xhtml#l00397">CaffeParser.cpp:397</a></div></div>
<div class="ttc" id="classarmnn_1_1_i_network_xhtml_a464f0ff87b1aabf71febaa71321dd40b"><div class="ttname"><a href="classarmnn_1_1_i_network.xhtml#a464f0ff87b1aabf71febaa71321dd40b">armnn::INetwork::Create</a></div><div class="ttdeci">static INetworkPtr Create(NetworkOptions networkOptions={})</div><div class="ttdef"><b>Definition:</b> <a href="_network_8cpp_source.xhtml#l00510">Network.cpp:510</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_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="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_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_arg_min_max_descriptor_xhtml_abce784834696eb928c620f1fafe71a8d"><div class="ttname"><a href="structarmnn_1_1_arg_min_max_descriptor.xhtml#abce784834696eb928c620f1fafe71a8d">armnn::ArgMinMaxDescriptor::m_Output_Type</a></div><div class="ttdeci">armnn::DataType m_Output_Type</div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l00074">Descriptors.hpp:74</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="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl_xhtml_ac3f705f208b5ee9f540577524b2ad513"><div class="ttname"><a href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#ac3f705f208b5ee9f540577524b2ad513">armnnCaffeParser::ICaffeParser::CaffeParserImpl::ParseDeconvLayer</a></div><div class="ttdeci">void ParseDeconvLayer(const caffe::LayerParameter &amp;layerParam)</div><div class="ttdef"><b>Definition:</b> <a href="_caffe_parser_8cpp_source.xhtml#l01094">CaffeParser.cpp:1094</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="namespacearmnn_caffe_parser_xhtml_af3fde7630e7c9df35cae9ed2b435dbed"><div class="ttname"><a href="namespacearmnn_caffe_parser.xhtml#af3fde7630e7c9df35cae9ed2b435dbed">armnnCaffeParser::TensorDescToBlobShape</a></div><div class="ttdeci">BlobShape TensorDescToBlobShape(const TensorInfo &amp;desc)</div><div class="ttdef"><b>Definition:</b> <a href="_caffe_parser_8cpp_source.xhtml#l00360">CaffeParser.cpp:360</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="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl_xhtml_a1424f1bfbfc81d317b51053bbb315ef1"><div class="ttname"><a href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a1424f1bfbfc81d317b51053bbb315ef1">armnnCaffeParser::ICaffeParser::CaffeParserImpl::m_CaffeLayersByTopName</a></div><div class="ttdeci">std::map&lt; std::string, const caffe::LayerParameter * &gt; m_CaffeLayersByTopName</div><div class="ttdef"><b>Definition:</b> <a href="_caffe_parser_8hpp_source.xhtml#l00155">CaffeParser.hpp:155</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_04760fd1fb320650b591e359d321263b.xhtml">armnnCaffeParser</a></li><li class="navelem"><a class="el" href="_caffe_parser_8cpp.xhtml">CaffeParser.cpp</a></li>
    <li class="footer">Generated on Thu Feb 25 2021 17:27:29 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>