aboutsummaryrefslogtreecommitdiff
path: root/21.02/_record_by_record_caffe_parser_8cpp_source.xhtml
blob: 48fb125ca3c80ee0eb7e9423fc04ba1722a6dc3f (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
<!-- 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/RecordByRecordCaffeParser.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('_record_by_record_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">RecordByRecordCaffeParser.cpp</div>  </div>
</div><!--header-->
<div class="contents">
<a href="_record_by_record_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;</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="_exceptions_8hpp.xhtml">armnn/Exceptions.hpp</a>&quot;</span></div><div class="line"><a name="l00009"></a><span class="lineno">    9</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="l00010"></a><span class="lineno">   10</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="l00011"></a><span class="lineno">   11</span>&#160;</div><div class="line"><a name="l00012"></a><span class="lineno">   12</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="l00013"></a><span class="lineno">   13</span>&#160;</div><div class="line"><a name="l00014"></a><span class="lineno">   14</span>&#160;<span class="comment">// Caffe</span></div><div class="line"><a name="l00015"></a><span class="lineno">   15</span>&#160;<span class="preprocessor">#include &lt;google/protobuf/wire_format.h&gt;</span></div><div class="line"><a name="l00016"></a><span class="lineno">   16</span>&#160;</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="comment">//#include &lt;stdio.h&gt;</span></div><div class="line"><a name="l00019"></a><span class="lineno">   19</span>&#160;<span class="preprocessor">#include &lt;limits.h&gt;</span></div><div class="line"><a name="l00020"></a><span class="lineno">   20</span>&#160;<span class="preprocessor">#include &lt;sstream&gt;</span></div><div class="line"><a name="l00021"></a><span class="lineno">   21</span>&#160;<span class="comment">//#include &lt;iostream&gt;</span></div><div class="line"><a name="l00022"></a><span class="lineno">   22</span>&#160;<span class="preprocessor">#include &lt;fstream&gt;</span></div><div class="line"><a name="l00023"></a><span class="lineno">   23</span>&#160;</div><div class="line"><a name="l00024"></a><span class="lineno">   24</span>&#160;<span class="keyword">namespace </span><a class="code" href="namespacearmnn_caffe_parser.xhtml">armnnCaffeParser</a></div><div class="line"><a name="l00025"></a><span class="lineno">   25</span>&#160;{</div><div class="line"><a name="l00026"></a><span class="lineno">   26</span>&#160;<span class="comment">// class which holds information on the absolute position in the stream</span></div><div class="line"><a name="l00027"></a><span class="lineno">   27</span>&#160;<span class="comment">// of the data and the length of the data record.</span></div><div class="line"><a name="l00028"></a><span class="lineno">   28</span>&#160;<span class="keyword">class </span>VarLenDataInfo</div><div class="line"><a name="l00029"></a><span class="lineno">   29</span>&#160;{</div><div class="line"><a name="l00030"></a><span class="lineno">   30</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l00031"></a><span class="lineno">   31</span>&#160;    VarLenDataInfo(std::streamoff positionOfData, <span class="keywordtype">size_t</span> sizeOfData) :</div><div class="line"><a name="l00032"></a><span class="lineno">   32</span>&#160;        m_PositionOfData(positionOfData), m_SizeOfData(sizeOfData) {}</div><div class="line"><a name="l00033"></a><span class="lineno">   33</span>&#160;</div><div class="line"><a name="l00034"></a><span class="lineno">   34</span>&#160;    VarLenDataInfo(<span class="keyword">const</span> VarLenDataInfo&amp; x) :</div><div class="line"><a name="l00035"></a><span class="lineno">   35</span>&#160;        m_PositionOfData(x.PositionOfData()), m_SizeOfData (x.SizeOfData()) {}</div><div class="line"><a name="l00036"></a><span class="lineno">   36</span>&#160;</div><div class="line"><a name="l00037"></a><span class="lineno">   37</span>&#160;    VarLenDataInfo&amp; operator=(<span class="keyword">const</span> VarLenDataInfo&amp; x)</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="comment">// handle self assignment</span></div><div class="line"><a name="l00040"></a><span class="lineno">   40</span>&#160;        <span class="keywordflow">if</span> (<span class="keyword">this</span> == &amp;x) {</div><div class="line"><a name="l00041"></a><span class="lineno">   41</span>&#160;            <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l00042"></a><span class="lineno">   42</span>&#160;        }</div><div class="line"><a name="l00043"></a><span class="lineno">   43</span>&#160;        m_PositionOfData = x.PositionOfData(); m_SizeOfData = x.SizeOfData(); <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l00044"></a><span class="lineno">   44</span>&#160;    }</div><div class="line"><a name="l00045"></a><span class="lineno">   45</span>&#160;</div><div class="line"><a name="l00046"></a><span class="lineno">   46</span>&#160;    std::streamoff PositionOfData()<span class="keyword"> const </span>{<span class="keywordflow">return</span> m_PositionOfData;}</div><div class="line"><a name="l00047"></a><span class="lineno">   47</span>&#160;    <span class="keywordtype">size_t</span> SizeOfData()<span class="keyword"> const </span>{<span class="keywordflow">return</span> m_SizeOfData;}</div><div class="line"><a name="l00048"></a><span class="lineno">   48</span>&#160;</div><div class="line"><a name="l00049"></a><span class="lineno">   49</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l00050"></a><span class="lineno">   50</span>&#160;    std::streamoff m_PositionOfData;</div><div class="line"><a name="l00051"></a><span class="lineno">   51</span>&#160;    <span class="keywordtype">size_t</span> m_SizeOfData;</div><div class="line"><a name="l00052"></a><span class="lineno">   52</span>&#160;</div><div class="line"><a name="l00053"></a><span class="lineno">   53</span>&#160;};</div><div class="line"><a name="l00054"></a><span class="lineno">   54</span>&#160;</div><div class="line"><a name="l00055"></a><span class="lineno">   55</span>&#160;<span class="comment">// class which holds enough information on a LayerParameter in the Caffe protobuf</span></div><div class="line"><a name="l00056"></a><span class="lineno">   56</span>&#160;<span class="comment">// format to allow it to be resolved for in place layering and sorted topologically</span></div><div class="line"><a name="l00057"></a><span class="lineno">   57</span>&#160;<span class="comment">// prior to the entire record being parsed into memory.</span></div><div class="line"><a name="l00058"></a><span class="lineno">   58</span>&#160;<span class="comment">//</span></div><div class="line"><a name="l00059"></a><span class="lineno">   59</span>&#160;<span class="comment">// NOTE: function naming follows that of the protobuf classes these proxies are standing in for</span></div><div class="line"><a name="l00060"></a><span class="lineno">   60</span>&#160;<span class="keyword">class </span>LayerParameterInfo : <span class="keyword">public</span> VarLenDataInfo</div><div class="line"><a name="l00061"></a><span class="lineno">   61</span>&#160;{</div><div class="line"><a name="l00062"></a><span class="lineno">   62</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l00063"></a><span class="lineno">   63</span>&#160;    <span class="keyword">static</span> <span class="keyword">const</span> std::string INPUT;</div><div class="line"><a name="l00064"></a><span class="lineno">   64</span>&#160;    LayerParameterInfo(<span class="keyword">const</span> VarLenDataInfo&amp; varLenDataInfo) :</div><div class="line"><a name="l00065"></a><span class="lineno">   65</span>&#160;        VarLenDataInfo(varLenDataInfo.PositionOfData(), varLenDataInfo.SizeOfData()),</div><div class="line"><a name="l00066"></a><span class="lineno">   66</span>&#160;        m_newTops(<a class="code" href="_cl_layer_tests_8cpp.xhtml#a2289f9e7fac0ce47801448e873b04303">false</a>), m_newBottoms(<a class="code" href="_cl_layer_tests_8cpp.xhtml#a2289f9e7fac0ce47801448e873b04303">false</a>) {}</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;    LayerParameterInfo(std::streamoff positionOfData, <span class="keywordtype">size_t</span> sizeOfData) :</div><div class="line"><a name="l00069"></a><span class="lineno">   69</span>&#160;        VarLenDataInfo(positionOfData, sizeOfData), m_newTops(<a class="code" href="_cl_layer_tests_8cpp.xhtml#a2289f9e7fac0ce47801448e873b04303">false</a>), m_newBottoms(<a class="code" href="_cl_layer_tests_8cpp.xhtml#a2289f9e7fac0ce47801448e873b04303">false</a>) {}</div><div class="line"><a name="l00070"></a><span class="lineno">   70</span>&#160;</div><div class="line"><a name="l00071"></a><span class="lineno">   71</span>&#160;    LayerParameterInfo(<span class="keyword">const</span> LayerParameterInfo&amp; x) :</div><div class="line"><a name="l00072"></a><span class="lineno">   72</span>&#160;        VarLenDataInfo(x.PositionOfData(), x.SizeOfData()),</div><div class="line"><a name="l00073"></a><span class="lineno">   73</span>&#160;        m_name(x.m_name),</div><div class="line"><a name="l00074"></a><span class="lineno">   74</span>&#160;        m_type(x.m_type),</div><div class="line"><a name="l00075"></a><span class="lineno">   75</span>&#160;        m_tops(x.m_tops),</div><div class="line"><a name="l00076"></a><span class="lineno">   76</span>&#160;        m_bottoms(x.m_bottoms),</div><div class="line"><a name="l00077"></a><span class="lineno">   77</span>&#160;        m_newTops(x.m_newTops),</div><div class="line"><a name="l00078"></a><span class="lineno">   78</span>&#160;        m_newBottoms(x.m_newBottoms) {}</div><div class="line"><a name="l00079"></a><span class="lineno">   79</span>&#160;</div><div class="line"><a name="l00080"></a><span class="lineno">   80</span>&#160;    LayerParameterInfo&amp; operator=(<span class="keyword">const</span> LayerParameterInfo&amp; x)</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="keywordflow">if</span> (<span class="keyword">this</span> == &amp;x) {</div><div class="line"><a name="l00083"></a><span class="lineno">   83</span>&#160;            <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l00084"></a><span class="lineno">   84</span>&#160;        }</div><div class="line"><a name="l00085"></a><span class="lineno">   85</span>&#160;        VarLenDataInfo::operator=(x);</div><div class="line"><a name="l00086"></a><span class="lineno">   86</span>&#160;        m_name = x.m_name;</div><div class="line"><a name="l00087"></a><span class="lineno">   87</span>&#160;        m_type = x.m_type;</div><div class="line"><a name="l00088"></a><span class="lineno">   88</span>&#160;        m_tops = x.m_tops;</div><div class="line"><a name="l00089"></a><span class="lineno">   89</span>&#160;        m_bottoms = x.m_bottoms;</div><div class="line"><a name="l00090"></a><span class="lineno">   90</span>&#160;        m_newTops = x.m_newTops;</div><div class="line"><a name="l00091"></a><span class="lineno">   91</span>&#160;        m_newBottoms = x.m_newBottoms;</div><div class="line"><a name="l00092"></a><span class="lineno">   92</span>&#160;        <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l00093"></a><span class="lineno">   93</span>&#160;    }</div><div class="line"><a name="l00094"></a><span class="lineno">   94</span>&#160;</div><div class="line"><a name="l00095"></a><span class="lineno">   95</span>&#160;    <span class="keyword">const</span> std::string name()<span class="keyword"> const </span>{<span class="keywordflow">return</span> m_name;}</div><div class="line"><a name="l00096"></a><span class="lineno">   96</span>&#160;    <span class="keywordtype">void</span> set_name(<span class="keyword">const</span> std::unique_ptr&lt;<span class="keywordtype">char</span>[]&gt;&amp; theName, <span class="keywordtype">size_t</span> length)</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;        m_name = std::string(theName.get(), length);</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;    <span class="keywordtype">void</span> set_name(<span class="keyword">const</span> std::string&amp; theName) {m_name = theName;}</div><div class="line"><a name="l00101"></a><span class="lineno">  101</span>&#160;</div><div class="line"><a name="l00102"></a><span class="lineno">  102</span>&#160;    <span class="keyword">const</span> std::string type()<span class="keyword"> const </span>{<span class="keywordflow">return</span> m_type;}</div><div class="line"><a name="l00103"></a><span class="lineno">  103</span>&#160;    <span class="keywordtype">void</span> set_type(<span class="keyword">const</span> std::unique_ptr&lt;<span class="keywordtype">char</span>[]&gt;&amp; theType, <span class="keywordtype">size_t</span> length)</div><div class="line"><a name="l00104"></a><span class="lineno">  104</span>&#160;    {</div><div class="line"><a name="l00105"></a><span class="lineno">  105</span>&#160;        m_type = std::string(theType.get(), length);</div><div class="line"><a name="l00106"></a><span class="lineno">  106</span>&#160;    }</div><div class="line"><a name="l00107"></a><span class="lineno">  107</span>&#160;    <span class="keywordtype">void</span> set_type(<span class="keyword">const</span> std::string&amp; theType) {m_type = theType;}</div><div class="line"><a name="l00108"></a><span class="lineno">  108</span>&#160;</div><div class="line"><a name="l00109"></a><span class="lineno">  109</span>&#160;    <span class="keywordtype">void</span> add_top(<span class="keyword">const</span> std::unique_ptr&lt;<span class="keywordtype">char</span>[]&gt;&amp; top, <span class="keywordtype">size_t</span> length)</div><div class="line"><a name="l00110"></a><span class="lineno">  110</span>&#160;    {</div><div class="line"><a name="l00111"></a><span class="lineno">  111</span>&#160;        std::string topName(top.get(), length);</div><div class="line"><a name="l00112"></a><span class="lineno">  112</span>&#160;        m_tops.push_back(topName);</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">  114</span>&#160;    <span class="keywordtype">void</span> add_top(<span class="keyword">const</span> std::string&amp; topName)</div><div class="line"><a name="l00115"></a><span class="lineno">  115</span>&#160;    {</div><div class="line"><a name="l00116"></a><span class="lineno">  116</span>&#160;        m_tops.push_back(topName);</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;    <span class="keyword">const</span> std::string top(<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> i)<span class="keyword"> const </span>{<span class="keywordflow">return</span> m_tops[i];}</div><div class="line"><a name="l00119"></a><span class="lineno">  119</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> top_size()<span class="keyword"> const </span>{<span class="keywordflow">return</span> m_tops.size();}</div><div class="line"><a name="l00120"></a><span class="lineno">  120</span>&#160;    <span class="keywordtype">void</span> set_top(<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> i, <span class="keyword">const</span> std::string&amp; newName) {m_tops[i] = newName; m_newTops = <span class="keyword">true</span>;}</div><div class="line"><a name="l00121"></a><span class="lineno">  121</span>&#160;    <span class="keywordtype">bool</span> new_tops()<span class="keyword"> const </span>{<span class="keywordflow">return</span> m_newTops;}</div><div class="line"><a name="l00122"></a><span class="lineno">  122</span>&#160;</div><div class="line"><a name="l00123"></a><span class="lineno">  123</span>&#160;    <span class="keywordtype">void</span> add_bottom(<span class="keyword">const</span> std::unique_ptr&lt;<span class="keywordtype">char</span>[]&gt;&amp; bottom, <span class="keywordtype">size_t</span> length)</div><div class="line"><a name="l00124"></a><span class="lineno">  124</span>&#160;    {</div><div class="line"><a name="l00125"></a><span class="lineno">  125</span>&#160;        std::string bottomName(bottom.get(), length);</div><div class="line"><a name="l00126"></a><span class="lineno">  126</span>&#160;        m_bottoms.push_back(bottomName);</div><div class="line"><a name="l00127"></a><span class="lineno">  127</span>&#160;    }</div><div class="line"><a name="l00128"></a><span class="lineno">  128</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> bottom_size()<span class="keyword"> const </span>{<span class="keywordflow">return</span> m_bottoms.size();}</div><div class="line"><a name="l00129"></a><span class="lineno">  129</span>&#160;    <span class="keyword">const</span> std::string bottom(<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> i)<span class="keyword"> const </span>{<span class="keywordflow">return</span> m_bottoms[i];}</div><div class="line"><a name="l00130"></a><span class="lineno">  130</span>&#160;    <span class="keywordtype">void</span> set_bottom(<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> i, <span class="keyword">const</span> std::string&amp; newName) {m_bottoms[i] = newName; m_newBottoms = <span class="keyword">true</span>;}</div><div class="line"><a name="l00131"></a><span class="lineno">  131</span>&#160;    <span class="keywordtype">bool</span> new_bottoms()<span class="keyword"> const </span>{<span class="keywordflow">return</span> m_newBottoms;}</div><div class="line"><a name="l00132"></a><span class="lineno">  132</span>&#160;</div><div class="line"><a name="l00133"></a><span class="lineno">  133</span>&#160;    <span class="comment">// if the position and size of the data is zero and the type is &quot;Input&quot; then this is an &#39;Implicit Input Layer&#39;</span></div><div class="line"><a name="l00134"></a><span class="lineno">  134</span>&#160;    <span class="comment">// and needs to be handled differently from ordinary layers.</span></div><div class="line"><a name="l00135"></a><span class="lineno">  135</span>&#160;    <span class="keywordtype">bool</span> isImplicitInputLayer()<span class="keyword"> const</span></div><div class="line"><a name="l00136"></a><span class="lineno">  136</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l00137"></a><span class="lineno">  137</span>&#160;        <span class="keywordflow">if</span> ((PositionOfData() == 0) &amp;&amp; (SizeOfData() == 0) &amp;&amp; INPUT.compare(type()) == 0)</div><div class="line"><a name="l00138"></a><span class="lineno">  138</span>&#160;        {<span class="keywordflow">return</span> <span class="keyword">true</span>;} <span class="keywordflow">else</span> {<span class="keywordflow">return</span> <span class="keyword">false</span>;}</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="keyword">private</span>:</div><div class="line"><a name="l00142"></a><span class="lineno">  142</span>&#160;    std::string m_name;</div><div class="line"><a name="l00143"></a><span class="lineno">  143</span>&#160;    std::string m_type;</div><div class="line"><a name="l00144"></a><span class="lineno">  144</span>&#160;    std::vector&lt;std::string&gt; m_tops;</div><div class="line"><a name="l00145"></a><span class="lineno">  145</span>&#160;    std::vector&lt;std::string&gt; m_bottoms;</div><div class="line"><a name="l00146"></a><span class="lineno">  146</span>&#160;    <span class="comment">// mark the layers whose topology was changed</span></div><div class="line"><a name="l00147"></a><span class="lineno">  147</span>&#160;    <span class="comment">// by the ResolveInPlaceLayers method.</span></div><div class="line"><a name="l00148"></a><span class="lineno">  148</span>&#160;    <span class="keywordtype">bool</span> m_newTops;</div><div class="line"><a name="l00149"></a><span class="lineno">  149</span>&#160;    <span class="keywordtype">bool</span> m_newBottoms;</div><div class="line"><a name="l00150"></a><span class="lineno">  150</span>&#160;};</div><div class="line"><a name="l00151"></a><span class="lineno">  151</span>&#160;</div><div class="line"><a name="l00152"></a><span class="lineno">  152</span>&#160;<span class="comment">// class which holds the field type (wire type) and field id (id from the .proto schema)</span></div><div class="line"><a name="l00153"></a><span class="lineno">  153</span>&#160;<span class="comment">// read from the protobuf messages as per the binary encoding described in</span></div><div class="line"><a name="l00154"></a><span class="lineno">  154</span>&#160;<span class="comment">// https://developers.google.com/protocol-buffers/docs/encoding</span></div><div class="line"><a name="l00155"></a><span class="lineno">  155</span>&#160;<span class="comment">//</span></div><div class="line"><a name="l00156"></a><span class="lineno">  156</span>&#160;<span class="comment">// NOTE: function naming follows that of the protobuf classes these proxies are standing in for</span></div><div class="line"><a name="l00157"></a><span class="lineno">  157</span>&#160;<span class="keyword">class </span>ProtobufFieldInfo</div><div class="line"><a name="l00158"></a><span class="lineno">  158</span>&#160;{</div><div class="line"><a name="l00159"></a><span class="lineno">  159</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l00160"></a><span class="lineno">  160</span>&#160;    ProtobufFieldInfo(<span class="keywordtype">int</span> field_type, <span class="keywordtype">int</span> field_id) :</div><div class="line"><a name="l00161"></a><span class="lineno">  161</span>&#160;        m_eof(<a class="code" href="_cl_layer_tests_8cpp.xhtml#a2289f9e7fac0ce47801448e873b04303">false</a>), m_field_type(field_type), m_field_id(field_id) {}</div><div class="line"><a name="l00162"></a><span class="lineno">  162</span>&#160;    ProtobufFieldInfo() : m_eof(<a class="code" href="_cl_layer_tests_8cpp.xhtml#a88d84cc49602ca19491dea9c998035fe">true</a>), m_field_type(0), m_field_id(0) {}</div><div class="line"><a name="l00163"></a><span class="lineno">  163</span>&#160;</div><div class="line"><a name="l00164"></a><span class="lineno">  164</span>&#160;    <span class="keywordtype">bool</span> eof() {<span class="keywordflow">return</span> m_eof;}</div><div class="line"><a name="l00165"></a><span class="lineno">  165</span>&#160;    <span class="keywordtype">int</span> field_type() {<span class="keywordflow">return</span> m_field_type;}</div><div class="line"><a name="l00166"></a><span class="lineno">  166</span>&#160;    <span class="keywordtype">int</span> field_id() {<span class="keywordflow">return</span> m_field_id;}</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="keyword">private</span>:</div><div class="line"><a name="l00169"></a><span class="lineno">  169</span>&#160;    <span class="keywordtype">bool</span> m_eof;</div><div class="line"><a name="l00170"></a><span class="lineno">  170</span>&#160;    <span class="keywordtype">int</span> m_field_type;</div><div class="line"><a name="l00171"></a><span class="lineno">  171</span>&#160;    <span class="keywordtype">int</span> m_field_id;</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="comment">// There are some NetParameter level data which are required</span></div><div class="line"><a name="l00176"></a><span class="lineno">  176</span>&#160;<span class="comment">// to correctly processes some Caffe models. Specifically those which</span></div><div class="line"><a name="l00177"></a><span class="lineno">  177</span>&#160;<span class="comment">// have &#39;implicit&#39; input layers. Also it is nice to have the name of the model.</span></div><div class="line"><a name="l00178"></a><span class="lineno">  178</span>&#160;<span class="comment">//</span></div><div class="line"><a name="l00179"></a><span class="lineno">  179</span>&#160;<span class="comment">// NOTE: function naming follows that of the protobuf classes these proxies are standing in for</span></div><div class="line"><a name="l00180"></a><span class="lineno">  180</span>&#160;<span class="keyword">class </span>NetParameterInfo</div><div class="line"><a name="l00181"></a><span class="lineno">  181</span>&#160;{</div><div class="line"><a name="l00182"></a><span class="lineno">  182</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l00183"></a><span class="lineno">  183</span>&#160;    <span class="keyword">const</span> std::string name()<span class="keyword"> const </span>{<span class="keywordflow">return</span> m_name;}</div><div class="line"><a name="l00184"></a><span class="lineno">  184</span>&#160;    <span class="keywordtype">void</span> set_name(<span class="keyword">const</span> std::unique_ptr&lt;<span class="keywordtype">char</span>[]&gt;&amp;  theName, <span class="keywordtype">size_t</span> length)</div><div class="line"><a name="l00185"></a><span class="lineno">  185</span>&#160;    {</div><div class="line"><a name="l00186"></a><span class="lineno">  186</span>&#160;        m_name = std::string(theName.get(), length);</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;</div><div class="line"><a name="l00189"></a><span class="lineno">  189</span>&#160;    <span class="keywordtype">void</span> add_input(<span class="keyword">const</span> std::unique_ptr&lt;<span class="keywordtype">char</span>[]&gt;&amp;  input, <span class="keywordtype">size_t</span> length)</div><div class="line"><a name="l00190"></a><span class="lineno">  190</span>&#160;    {</div><div class="line"><a name="l00191"></a><span class="lineno">  191</span>&#160;        std::string inputName(input.get(), length);</div><div class="line"><a name="l00192"></a><span class="lineno">  192</span>&#160;        m_inputs.push_back(inputName);</div><div class="line"><a name="l00193"></a><span class="lineno">  193</span>&#160;    }</div><div class="line"><a name="l00194"></a><span class="lineno">  194</span>&#160;    <span class="keyword">const</span> std::string input(<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> i)<span class="keyword"> const </span>{<span class="keywordflow">return</span> m_inputs[i];}</div><div class="line"><a name="l00195"></a><span class="lineno">  195</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> input_size()<span class="keyword"> const </span>{<span class="keywordflow">return</span> m_inputs.size();}</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">void</span> add_input_dimension(<span class="keywordtype">int</span> input_dimension) {</div><div class="line"><a name="l00198"></a><span class="lineno">  198</span>&#160;        m_input_dimensions.push_back(input_dimension);</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="keywordtype">int</span> input_dimension(<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> i)<span class="keyword"> const </span>{<span class="keywordflow">return</span> m_input_dimensions[i];}</div><div class="line"><a name="l00201"></a><span class="lineno">  201</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> input_dimensions_size()<span class="keyword"> const </span>{<span class="keywordflow">return</span> m_input_dimensions.size();}</div><div class="line"><a name="l00202"></a><span class="lineno">  202</span>&#160;</div><div class="line"><a name="l00203"></a><span class="lineno">  203</span>&#160;    <span class="keywordtype">void</span> add_blob_shape(caffe::BlobShape shape) {</div><div class="line"><a name="l00204"></a><span class="lineno">  204</span>&#160;        m_blob_shapes.push_back(shape);</div><div class="line"><a name="l00205"></a><span class="lineno">  205</span>&#160;    }</div><div class="line"><a name="l00206"></a><span class="lineno">  206</span>&#160;    <span class="keyword">const</span> caffe::BlobShape blob_shape(<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> i)<span class="keyword"> const </span>{<span class="keywordflow">return</span> m_blob_shapes[i];}</div><div class="line"><a name="l00207"></a><span class="lineno">  207</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> blob_shapes_size()<span class="keyword"> const </span>{<span class="keywordflow">return</span> m_blob_shapes.size();}</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;<span class="keyword">private</span>:</div><div class="line"><a name="l00210"></a><span class="lineno">  210</span>&#160;    std::string m_name;</div><div class="line"><a name="l00211"></a><span class="lineno">  211</span>&#160;    std::vector&lt;std::string&gt; m_inputs;</div><div class="line"><a name="l00212"></a><span class="lineno">  212</span>&#160;    std::vector&lt;int&gt; m_input_dimensions;</div><div class="line"><a name="l00213"></a><span class="lineno">  213</span>&#160;    std::vector&lt;caffe::BlobShape&gt; m_blob_shapes;</div><div class="line"><a name="l00214"></a><span class="lineno">  214</span>&#160;</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;</div><div class="line"><a name="l00217"></a><span class="lineno">  217</span>&#160;}; <span class="comment">// namespace armnnCaffeParser</span></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="keyword">using namespace </span><a class="code" href="namespacearmnn_caffe_parser.xhtml">armnnCaffeParser</a>;</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="comment">// Initialise the class const</span></div><div class="line"><a name="l00222"></a><span class="lineno">  222</span>&#160;<span class="keyword">const</span> std::string LayerParameterInfo::INPUT = <span class="stringliteral">&quot;Input&quot;</span>;</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;<span class="keyword">namespace</span></div><div class="line"><a name="l00225"></a><span class="lineno">  225</span>&#160;{</div><div class="line"><a name="l00226"></a><span class="lineno">  226</span>&#160;</div><div class="line"><a name="l00227"></a><span class="lineno">  227</span>&#160;ProtobufFieldInfo readFieldInfo(std::ifstream&amp; ifs)</div><div class="line"><a name="l00228"></a><span class="lineno">  228</span>&#160;{</div><div class="line"><a name="l00229"></a><span class="lineno">  229</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> first_byte = <span class="keyword">static_cast&lt;</span><span class="keywordtype">unsigned</span> <span class="keywordtype">char</span><span class="keyword">&gt;</span>(ifs.get());</div><div class="line"><a name="l00230"></a><span class="lineno">  230</span>&#160;    <span class="keywordflow">if</span> (!ifs.good())</div><div class="line"><a name="l00231"></a><span class="lineno">  231</span>&#160;    {</div><div class="line"><a name="l00232"></a><span class="lineno">  232</span>&#160;        ProtobufFieldInfo eof;</div><div class="line"><a name="l00233"></a><span class="lineno">  233</span>&#160;        <span class="keywordflow">return</span> eof;</div><div class="line"><a name="l00234"></a><span class="lineno">  234</span>&#160;    }</div><div class="line"><a name="l00235"></a><span class="lineno">  235</span>&#160;    <span class="keywordtype">int</span> field_type = first_byte&amp;7;</div><div class="line"><a name="l00236"></a><span class="lineno">  236</span>&#160;    <span class="keywordtype">int</span> field_id = first_byte&gt;&gt;3;</div><div class="line"><a name="l00237"></a><span class="lineno">  237</span>&#160;    <span class="keywordflow">if</span> ((field_id &amp; 16) == 16)</div><div class="line"><a name="l00238"></a><span class="lineno">  238</span>&#160;    {</div><div class="line"><a name="l00239"></a><span class="lineno">  239</span>&#160;        <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> second_byte = <span class="keyword">static_cast&lt;</span><span class="keywordtype">unsigned</span> <span class="keywordtype">char</span><span class="keyword">&gt;</span>(ifs.get());</div><div class="line"><a name="l00240"></a><span class="lineno">  240</span>&#160;        <span class="keywordflow">if</span> (!ifs.good())</div><div class="line"><a name="l00241"></a><span class="lineno">  241</span>&#160;        {</div><div class="line"><a name="l00242"></a><span class="lineno">  242</span>&#160;            ProtobufFieldInfo eof;</div><div class="line"><a name="l00243"></a><span class="lineno">  243</span>&#160;            <span class="keywordflow">return</span> eof;</div><div class="line"><a name="l00244"></a><span class="lineno">  244</span>&#160;        }</div><div class="line"><a name="l00245"></a><span class="lineno">  245</span>&#160;        field_id = (field_id-16) + ((second_byte&amp;127)&lt;&lt;4);</div><div class="line"><a name="l00246"></a><span class="lineno">  246</span>&#160;    }</div><div class="line"><a name="l00247"></a><span class="lineno">  247</span>&#160;    ProtobufFieldInfo fieldInfo(field_type, field_id);</div><div class="line"><a name="l00248"></a><span class="lineno">  248</span>&#160;    <span class="keywordflow">return</span> fieldInfo;</div><div class="line"><a name="l00249"></a><span class="lineno">  249</span>&#160;}</div><div class="line"><a name="l00250"></a><span class="lineno">  250</span>&#160;</div><div class="line"><a name="l00251"></a><span class="lineno">  251</span>&#160;<span class="keyword">const</span> <span class="keyword">static</span> <span class="keywordtype">int</span> MAX_NUM_BYTES = 5;</div><div class="line"><a name="l00252"></a><span class="lineno">  252</span>&#160;</div><div class="line"><a name="l00253"></a><span class="lineno">  253</span>&#160;<span class="keywordtype">int</span> ReadBase128(std::ifstream&amp; ifs)</div><div class="line"><a name="l00254"></a><span class="lineno">  254</span>&#160;{</div><div class="line"><a name="l00255"></a><span class="lineno">  255</span>&#160;    <span class="keywordtype">int</span> result = 0;</div><div class="line"><a name="l00256"></a><span class="lineno">  256</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> shift_by = 0;</div><div class="line"><a name="l00257"></a><span class="lineno">  257</span>&#160;    <span class="keywordtype">int</span> bytesRead = 0;</div><div class="line"><a name="l00258"></a><span class="lineno">  258</span>&#160;    <span class="keywordflow">while</span> (<span class="keyword">true</span>)</div><div class="line"><a name="l00259"></a><span class="lineno">  259</span>&#160;    {</div><div class="line"><a name="l00260"></a><span class="lineno">  260</span>&#160;        <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> a_byte = <span class="keyword">static_cast&lt;</span><span class="keywordtype">unsigned</span> <span class="keywordtype">char</span><span class="keyword">&gt;</span>(ifs.get());</div><div class="line"><a name="l00261"></a><span class="lineno">  261</span>&#160;        ++bytesRead;</div><div class="line"><a name="l00262"></a><span class="lineno">  262</span>&#160;        <span class="keywordflow">if</span> (bytesRead &gt; MAX_NUM_BYTES)</div><div class="line"><a name="l00263"></a><span class="lineno">  263</span>&#160;        {</div><div class="line"><a name="l00264"></a><span class="lineno">  264</span>&#160;            <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_parse_exception.xhtml">armnn::ParseException</a>(</div><div class="line"><a name="l00265"></a><span class="lineno">  265</span>&#160;                <span class="stringliteral">&quot;ReadBase128 exceeded the maximum number of bytes expected for an integer representation&quot;</span>);</div><div class="line"><a name="l00266"></a><span class="lineno">  266</span>&#160;        }</div><div class="line"><a name="l00267"></a><span class="lineno">  267</span>&#160;        result += (a_byte &amp; 127) &lt;&lt; shift_by;</div><div class="line"><a name="l00268"></a><span class="lineno">  268</span>&#160;        shift_by += 7;</div><div class="line"><a name="l00269"></a><span class="lineno">  269</span>&#160;        <span class="keywordflow">if</span> ((a_byte &amp; 128) != 128)</div><div class="line"><a name="l00270"></a><span class="lineno">  270</span>&#160;        {</div><div class="line"><a name="l00271"></a><span class="lineno">  271</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l00272"></a><span class="lineno">  272</span>&#160;        }</div><div class="line"><a name="l00273"></a><span class="lineno">  273</span>&#160;    }</div><div class="line"><a name="l00274"></a><span class="lineno">  274</span>&#160;    <span class="keywordflow">return</span> result;</div><div class="line"><a name="l00275"></a><span class="lineno">  275</span>&#160;}</div><div class="line"><a name="l00276"></a><span class="lineno">  276</span>&#160;</div><div class="line"><a name="l00277"></a><span class="lineno">  277</span>&#160;</div><div class="line"><a name="l00278"></a><span class="lineno">  278</span>&#160;std::unique_ptr&lt;char[]&gt; AllocateBuffer(std::ifstream&amp; ifs, VarLenDataInfo&amp; dataInfo)</div><div class="line"><a name="l00279"></a><span class="lineno">  279</span>&#160;{</div><div class="line"><a name="l00280"></a><span class="lineno">  280</span>&#160;    std::unique_ptr&lt;char[]&gt; ptr(<span class="keyword">new</span> <span class="keywordtype">char</span>[dataInfo.SizeOfData()]);</div><div class="line"><a name="l00281"></a><span class="lineno">  281</span>&#160;    ifs.clear();</div><div class="line"><a name="l00282"></a><span class="lineno">  282</span>&#160;    ifs.seekg(dataInfo.PositionOfData(), std::ios_base::beg);</div><div class="line"><a name="l00283"></a><span class="lineno">  283</span>&#160;    ifs.read(ptr.get(), <a class="code" href="namespacearmnn.xhtml#a375ca3cff9f1b005d1412dc5f3cf5b6e">armnn::numeric_cast</a>&lt;std::streamsize&gt;(dataInfo.SizeOfData()));</div><div class="line"><a name="l00284"></a><span class="lineno">  284</span>&#160;    <span class="keywordflow">return</span> ptr;</div><div class="line"><a name="l00285"></a><span class="lineno">  285</span>&#160;}</div><div class="line"><a name="l00286"></a><span class="lineno">  286</span>&#160;</div><div class="line"><a name="l00287"></a><span class="lineno">  287</span>&#160;VarLenDataInfo CreateVarLenDataInfo(std::streamoff bufferStart, std::streamoff endOfLayer) {</div><div class="line"><a name="l00288"></a><span class="lineno">  288</span>&#160;    std::streamoff sizeOfLayer = endOfLayer - bufferStart;</div><div class="line"><a name="l00289"></a><span class="lineno">  289</span>&#160;    <span class="keywordflow">if</span> (sizeOfLayer &lt; 0)</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;        std::stringstream ss;</div><div class="line"><a name="l00292"></a><span class="lineno">  292</span>&#160;        ss &lt;&lt; <span class="stringliteral">&quot;error when determining buffer size, negative value [&quot;</span> &lt;&lt; sizeOfLayer &lt;&lt; <span class="stringliteral">&quot;]&quot;</span>;</div><div class="line"><a name="l00293"></a><span class="lineno">  293</span>&#160;        <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_parse_exception.xhtml">armnn::ParseException</a>(ss.str());</div><div class="line"><a name="l00294"></a><span class="lineno">  294</span>&#160;    }</div><div class="line"><a name="l00295"></a><span class="lineno">  295</span>&#160;    <span class="comment">// NOTE: as some of the data being read in will be translated into strings (names of layers etc)</span></div><div class="line"><a name="l00296"></a><span class="lineno">  296</span>&#160;    <span class="comment">//       the maximum size we can deal with is the upper size limit of a string i.e. size_t</span></div><div class="line"><a name="l00297"></a><span class="lineno">  297</span>&#160;    <span class="comment">// on the platform in which I am currently compiling std::streamoff is signed long int and</span></div><div class="line"><a name="l00298"></a><span class="lineno">  298</span>&#160;    <span class="comment">// size_t is unsigned long int so there is no way this error condition can fire but this stuff</span></div><div class="line"><a name="l00299"></a><span class="lineno">  299</span>&#160;    <span class="comment">// is supposed to be portable so the check remains in place</span></div><div class="line"><a name="l00300"></a><span class="lineno">  300</span>&#160;    <span class="keywordflow">if</span> (armnn::numeric_cast&lt;size_t&gt;(sizeOfLayer) &gt; SIZE_MAX) {</div><div class="line"><a name="l00301"></a><span class="lineno">  301</span>&#160;        std::stringstream ss;</div><div class="line"><a name="l00302"></a><span class="lineno">  302</span>&#160;        ss &lt;&lt; <span class="stringliteral">&quot;layer is greater than &quot;</span> &lt;&lt; SIZE_MAX &lt;&lt; <span class="stringliteral">&quot; in size cannot process. layer size = [&quot;</span> &lt;&lt; sizeOfLayer &lt;&lt; <span class="stringliteral">&quot;]&quot;</span>;</div><div class="line"><a name="l00303"></a><span class="lineno">  303</span>&#160;        <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_parse_exception.xhtml">armnn::ParseException</a>(ss.str());</div><div class="line"><a name="l00304"></a><span class="lineno">  304</span>&#160;    }</div><div class="line"><a name="l00305"></a><span class="lineno">  305</span>&#160;    LayerParameterInfo <a class="code" href="namespacearmnn.xhtml#a4dc0adc6737b5944e7671bee71788407acaf9b6b99962bf5c2264824231d7a40c">info</a>(bufferStart, armnn::numeric_cast&lt;size_t&gt;(sizeOfLayer));</div><div class="line"><a name="l00306"></a><span class="lineno">  306</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="namespacearmnn.xhtml#a4dc0adc6737b5944e7671bee71788407acaf9b6b99962bf5c2264824231d7a40c">info</a>;</div><div class="line"><a name="l00307"></a><span class="lineno">  307</span>&#160;}</div><div class="line"><a name="l00308"></a><span class="lineno">  308</span>&#160;</div><div class="line"><a name="l00309"></a><span class="lineno">  309</span>&#160;<span class="keywordtype">void</span> ReadTopologicalInfoForLayerParameter(LayerParameterInfo&amp; layerInfo, std::ifstream&amp; ifs)</div><div class="line"><a name="l00310"></a><span class="lineno">  310</span>&#160;{</div><div class="line"><a name="l00311"></a><span class="lineno">  311</span>&#160;    <span class="comment">// position the file pointer to the start of the layer data</span></div><div class="line"><a name="l00312"></a><span class="lineno">  312</span>&#160;    ifs.clear();</div><div class="line"><a name="l00313"></a><span class="lineno">  313</span>&#160;    ifs.seekg(layerInfo.PositionOfData(), std::ios_base::beg);</div><div class="line"><a name="l00314"></a><span class="lineno">  314</span>&#160;    std::streamoff endOfLayer = layerInfo.PositionOfData() +</div><div class="line"><a name="l00315"></a><span class="lineno">  315</span>&#160;        <a class="code" href="namespacearmnn.xhtml#a375ca3cff9f1b005d1412dc5f3cf5b6e">armnn::numeric_cast</a>&lt;std::streamoff&gt;(layerInfo.SizeOfData());</div><div class="line"><a name="l00316"></a><span class="lineno">  316</span>&#160;    <span class="keywordflow">while</span>(<span class="keyword">true</span>)</div><div class="line"><a name="l00317"></a><span class="lineno">  317</span>&#160;    {</div><div class="line"><a name="l00318"></a><span class="lineno">  318</span>&#160;        <span class="comment">// check to see if we have reached the end of the record</span></div><div class="line"><a name="l00319"></a><span class="lineno">  319</span>&#160;        std::streamoff currentPosition = ifs.tellg();</div><div class="line"><a name="l00320"></a><span class="lineno">  320</span>&#160;        <span class="keywordflow">if</span> (currentPosition &gt;= endOfLayer) {</div><div class="line"><a name="l00321"></a><span class="lineno">  321</span>&#160;            <span class="keywordflow">return</span>;</div><div class="line"><a name="l00322"></a><span class="lineno">  322</span>&#160;        }</div><div class="line"><a name="l00323"></a><span class="lineno">  323</span>&#160;        <span class="comment">// read the information for the next field.</span></div><div class="line"><a name="l00324"></a><span class="lineno">  324</span>&#160;        ProtobufFieldInfo fieldInfo = readFieldInfo(ifs);</div><div class="line"><a name="l00325"></a><span class="lineno">  325</span>&#160;        <span class="keywordflow">if</span> (fieldInfo.eof())</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">  327</span>&#160;            <span class="keywordflow">return</span>;</div><div class="line"><a name="l00328"></a><span class="lineno">  328</span>&#160;            <span class="comment">// TODO: figure out whether this is an error condition or not...</span></div><div class="line"><a name="l00329"></a><span class="lineno">  329</span>&#160;            <span class="comment">//throw armnn::ParseException(&quot;failed to read field from LayerParameter data&quot;);</span></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;        <span class="comment">// process the field</span></div><div class="line"><a name="l00332"></a><span class="lineno">  332</span>&#160;        <span class="keywordflow">switch</span> (fieldInfo.field_type())</div><div class="line"><a name="l00333"></a><span class="lineno">  333</span>&#160;        {</div><div class="line"><a name="l00334"></a><span class="lineno">  334</span>&#160;            <span class="keywordflow">case</span> 0:</div><div class="line"><a name="l00335"></a><span class="lineno">  335</span>&#160;            {</div><div class="line"><a name="l00336"></a><span class="lineno">  336</span>&#160;                ReadBase128(ifs);</div><div class="line"><a name="l00337"></a><span class="lineno">  337</span>&#160;                <span class="keywordflow">break</span>;</div><div class="line"><a name="l00338"></a><span class="lineno">  338</span>&#160;            }</div><div class="line"><a name="l00339"></a><span class="lineno">  339</span>&#160;            <span class="keywordflow">case</span> 2:</div><div class="line"><a name="l00340"></a><span class="lineno">  340</span>&#160;            {</div><div class="line"><a name="l00341"></a><span class="lineno">  341</span>&#160;                <span class="keywordtype">int</span> size = ReadBase128(ifs);</div><div class="line"><a name="l00342"></a><span class="lineno">  342</span>&#160;                std::streamoff posStartOfData = ifs.tellg();</div><div class="line"><a name="l00343"></a><span class="lineno">  343</span>&#160;                VarLenDataInfo dataInfo(posStartOfData, armnn::numeric_cast&lt;size_t&gt;(size));</div><div class="line"><a name="l00344"></a><span class="lineno">  344</span>&#160;                <span class="comment">//optional string name = 1; // the layer name</span></div><div class="line"><a name="l00345"></a><span class="lineno">  345</span>&#160;                <span class="comment">//optional string type = 2; // the layer type</span></div><div class="line"><a name="l00346"></a><span class="lineno">  346</span>&#160;                <span class="comment">//repeated string bottom = 3; // the name of each bottom blob</span></div><div class="line"><a name="l00347"></a><span class="lineno">  347</span>&#160;                <span class="comment">//repeated string top = 4; // the name of each top blob</span></div><div class="line"><a name="l00348"></a><span class="lineno">  348</span>&#160;                <span class="keywordflow">if</span> (fieldInfo.field_id() == 1)</div><div class="line"><a name="l00349"></a><span class="lineno">  349</span>&#160;                {</div><div class="line"><a name="l00350"></a><span class="lineno">  350</span>&#160;                    <span class="comment">// read and set the name of the layer</span></div><div class="line"><a name="l00351"></a><span class="lineno">  351</span>&#160;                    <span class="keyword">auto</span> layerName = AllocateBuffer(ifs, dataInfo);</div><div class="line"><a name="l00352"></a><span class="lineno">  352</span>&#160;                    layerInfo.set_name(layerName, dataInfo.SizeOfData());</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;                <span class="keywordflow">else</span> <span class="keywordflow">if</span> (fieldInfo.field_id() == 2)</div><div class="line"><a name="l00355"></a><span class="lineno">  355</span>&#160;                {</div><div class="line"><a name="l00356"></a><span class="lineno">  356</span>&#160;                    <span class="comment">// read and set the type of the layer</span></div><div class="line"><a name="l00357"></a><span class="lineno">  357</span>&#160;                    <span class="keyword">auto</span> layerType = AllocateBuffer(ifs, dataInfo);</div><div class="line"><a name="l00358"></a><span class="lineno">  358</span>&#160;                    layerInfo.set_type(layerType, dataInfo.SizeOfData());</div><div class="line"><a name="l00359"></a><span class="lineno">  359</span>&#160;                }</div><div class="line"><a name="l00360"></a><span class="lineno">  360</span>&#160;                <span class="keywordflow">else</span> <span class="keywordflow">if</span> (fieldInfo.field_id() == 3)</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;                    <span class="comment">// read and add a bottom to the layer</span></div><div class="line"><a name="l00363"></a><span class="lineno">  363</span>&#160;                    <span class="keyword">auto</span> bottom = AllocateBuffer(ifs, dataInfo);</div><div class="line"><a name="l00364"></a><span class="lineno">  364</span>&#160;                    layerInfo.add_bottom(bottom, dataInfo.SizeOfData());</div><div class="line"><a name="l00365"></a><span class="lineno">  365</span>&#160;                }</div><div class="line"><a name="l00366"></a><span class="lineno">  366</span>&#160;                <span class="keywordflow">else</span> <span class="keywordflow">if</span> (fieldInfo.field_id() == 4)</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;                    <span class="comment">// read and add a top to the layer</span></div><div class="line"><a name="l00369"></a><span class="lineno">  369</span>&#160;                    <span class="keyword">auto</span> top = AllocateBuffer(ifs, dataInfo);</div><div class="line"><a name="l00370"></a><span class="lineno">  370</span>&#160;                    layerInfo.add_top(top, dataInfo.SizeOfData());</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="keywordflow">else</span></div><div class="line"><a name="l00373"></a><span class="lineno">  373</span>&#160;                {</div><div class="line"><a name="l00374"></a><span class="lineno">  374</span>&#160;                    ifs.seekg(size, std::ios_base::cur);</div><div class="line"><a name="l00375"></a><span class="lineno">  375</span>&#160;                    <span class="keywordflow">if</span> (!ifs.good())</div><div class="line"><a name="l00376"></a><span class="lineno">  376</span>&#160;                    {</div><div class="line"><a name="l00377"></a><span class="lineno">  377</span>&#160;                        <span class="comment">// TODO: error out?</span></div><div class="line"><a name="l00378"></a><span class="lineno">  378</span>&#160;                        <span class="keywordflow">return</span>;</div><div class="line"><a name="l00379"></a><span class="lineno">  379</span>&#160;                    }</div><div class="line"><a name="l00380"></a><span class="lineno">  380</span>&#160;                }</div><div class="line"><a name="l00381"></a><span class="lineno">  381</span>&#160;                <span class="keywordflow">break</span>;</div><div class="line"><a name="l00382"></a><span class="lineno">  382</span>&#160;            }</div><div class="line"><a name="l00383"></a><span class="lineno">  383</span>&#160;            <span class="keywordflow">case</span> 1:</div><div class="line"><a name="l00384"></a><span class="lineno">  384</span>&#160;            {</div><div class="line"><a name="l00385"></a><span class="lineno">  385</span>&#160;                <span class="comment">// 64 bit</span></div><div class="line"><a name="l00386"></a><span class="lineno">  386</span>&#160;                <span class="comment">// advance by eight bytes</span></div><div class="line"><a name="l00387"></a><span class="lineno">  387</span>&#160;                ifs.seekg(8, std::ios_base::cur);</div><div class="line"><a name="l00388"></a><span class="lineno">  388</span>&#160;                <span class="keywordflow">if</span> (!ifs.good())</div><div class="line"><a name="l00389"></a><span class="lineno">  389</span>&#160;                {</div><div class="line"><a name="l00390"></a><span class="lineno">  390</span>&#160;                    <span class="comment">// TODO: error out?</span></div><div class="line"><a name="l00391"></a><span class="lineno">  391</span>&#160;                    <span class="keywordflow">return</span>;</div><div class="line"><a name="l00392"></a><span class="lineno">  392</span>&#160;                }</div><div class="line"><a name="l00393"></a><span class="lineno">  393</span>&#160;                <span class="keywordflow">break</span>;</div><div class="line"><a name="l00394"></a><span class="lineno">  394</span>&#160;            }</div><div class="line"><a name="l00395"></a><span class="lineno">  395</span>&#160;            <span class="keywordflow">case</span> 5:</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">  397</span>&#160;                <span class="comment">// 32 bit</span></div><div class="line"><a name="l00398"></a><span class="lineno">  398</span>&#160;                <span class="comment">// advance by four bytes</span></div><div class="line"><a name="l00399"></a><span class="lineno">  399</span>&#160;                ifs.seekg(4, std::ios_base::cur);</div><div class="line"><a name="l00400"></a><span class="lineno">  400</span>&#160;                <span class="keywordflow">if</span> (!ifs.good())</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="comment">// TODO: error out?</span></div><div class="line"><a name="l00403"></a><span class="lineno">  403</span>&#160;                    <span class="keywordflow">return</span>;</div><div class="line"><a name="l00404"></a><span class="lineno">  404</span>&#160;                }</div><div class="line"><a name="l00405"></a><span class="lineno">  405</span>&#160;                <span class="keywordflow">break</span>;</div><div class="line"><a name="l00406"></a><span class="lineno">  406</span>&#160;            }</div><div class="line"><a name="l00407"></a><span class="lineno">  407</span>&#160;            <span class="keywordflow">default</span>:</div><div class="line"><a name="l00408"></a><span class="lineno">  408</span>&#160;            {</div><div class="line"><a name="l00409"></a><span class="lineno">  409</span>&#160;                <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_parse_exception.xhtml">armnn::ParseException</a>(<span class="stringliteral">&quot;Encounted an unknown field type&quot;</span>);</div><div class="line"><a name="l00410"></a><span class="lineno">  410</span>&#160;                <span class="keywordflow">break</span>;</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;        }</div><div class="line"><a name="l00413"></a><span class="lineno">  413</span>&#160;    }</div><div class="line"><a name="l00414"></a><span class="lineno">  414</span>&#160;}</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;<span class="keywordtype">void</span> ResolveInPlaceLayers(std::vector&lt;LayerParameterInfo&gt;&amp; layerInfo)</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;    std::map&lt;std::string, std::vector&lt;LayerParameterInfo*&gt;&gt; layersByTop;</div><div class="line"><a name="l00419"></a><span class="lineno">  419</span>&#160;    <span class="keywordflow">for</span> (<span class="keyword">auto</span>&amp; info : layerInfo)</div><div class="line"><a name="l00420"></a><span class="lineno">  420</span>&#160;    {</div><div class="line"><a name="l00421"></a><span class="lineno">  421</span>&#160;        <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> i = 0; i &lt; <a class="code" href="namespacearmnn.xhtml#a4dc0adc6737b5944e7671bee71788407acaf9b6b99962bf5c2264824231d7a40c">info</a>.top_size(); ++i)</div><div class="line"><a name="l00422"></a><span class="lineno">  422</span>&#160;        {</div><div class="line"><a name="l00423"></a><span class="lineno">  423</span>&#160;            layersByTop[<a class="code" href="namespacearmnn.xhtml#a4dc0adc6737b5944e7671bee71788407acaf9b6b99962bf5c2264824231d7a40c">info</a>.top(i)].push_back(&amp;info);</div><div class="line"><a name="l00424"></a><span class="lineno">  424</span>&#160;        }</div><div class="line"><a name="l00425"></a><span class="lineno">  425</span>&#160;    }</div><div class="line"><a name="l00426"></a><span class="lineno">  426</span>&#160;    <span class="comment">// For each set of layers with the same top, resolve them to a linear chain rather than in-place layers.</span></div><div class="line"><a name="l00427"></a><span class="lineno">  427</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="l00428"></a><span class="lineno">  428</span>&#160;    <span class="keywordflow">for</span> (<span class="keyword">auto</span>&amp; layersWithSameTopIterator : layersByTop)</div><div class="line"><a name="l00429"></a><span class="lineno">  429</span>&#160;    {</div><div class="line"><a name="l00430"></a><span class="lineno">  430</span>&#160;        <span class="keyword">const</span> std::string&amp; top = layersWithSameTopIterator.first;</div><div class="line"><a name="l00431"></a><span class="lineno">  431</span>&#160;        <span class="keyword">const</span> std::vector&lt;LayerParameterInfo*&gt; layersWithSameTop = layersWithSameTopIterator.second;</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;        <span class="comment">// Chain the layers together in the order that they are listed in the prototxt (hopefully this is correct).</span></div><div class="line"><a name="l00434"></a><span class="lineno">  434</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="l00435"></a><span class="lineno">  435</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="l00436"></a><span class="lineno">  436</span>&#160;        {</div><div class="line"><a name="l00437"></a><span class="lineno">  437</span>&#160;            LayerParameterInfo* layer1 = layersWithSameTop[layerIdx];</div><div class="line"><a name="l00438"></a><span class="lineno">  438</span>&#160;            LayerParameterInfo* layer2 = layersWithSameTop[layerIdx + 1];</div><div class="line"><a name="l00439"></a><span class="lineno">  439</span>&#160;            <span class="keywordflow">if</span> (layer1-&gt;top_size() != 1)</div><div class="line"><a name="l00440"></a><span class="lineno">  440</span>&#160;            {</div><div class="line"><a name="l00441"></a><span class="lineno">  441</span>&#160;                <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_parse_exception.xhtml">armnn::ParseException</a>(<span class="stringliteral">&quot;Node &#39;&quot;</span> + layer1-&gt;name() + <span class="stringliteral">&quot;&#39; is an in-place layer but &quot;</span></div><div class="line"><a name="l00442"></a><span class="lineno">  442</span>&#160;                                                                        <span class="stringliteral">&quot;doesn&#39;t have exactly one top.&quot;</span>);</div><div class="line"><a name="l00443"></a><span class="lineno">  443</span>&#160;            }</div><div class="line"><a name="l00444"></a><span class="lineno">  444</span>&#160;            std::string newTop = layer1-&gt;name() + <span class="stringliteral">&quot;_top&quot;</span>;</div><div class="line"><a name="l00445"></a><span class="lineno">  445</span>&#160;            layer1-&gt;set_top(0, newTop);</div><div class="line"><a name="l00446"></a><span class="lineno">  446</span>&#160;            <span class="keywordflow">if</span> (layer2-&gt;bottom_size() != 1 || layer2-&gt;bottom(0) != top)</div><div class="line"><a name="l00447"></a><span class="lineno">  447</span>&#160;            {</div><div class="line"><a name="l00448"></a><span class="lineno">  448</span>&#160;                <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_parse_exception.xhtml">armnn::ParseException</a>(<span class="stringliteral">&quot;Node &#39;&quot;</span> + layer2-&gt;name() + <span class="stringliteral">&quot;&#39; is an in-place layer but &quot;</span></div><div class="line"><a name="l00449"></a><span class="lineno">  449</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="l00450"></a><span class="lineno">  450</span>&#160;            }</div><div class="line"><a name="l00451"></a><span class="lineno">  451</span>&#160;            layer2-&gt;set_bottom(0, newTop);</div><div class="line"><a name="l00452"></a><span class="lineno">  452</span>&#160;</div><div class="line"><a name="l00453"></a><span class="lineno">  453</span>&#160;        }</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;}</div><div class="line"><a name="l00456"></a><span class="lineno">  456</span>&#160;</div><div class="line"><a name="l00457"></a><span class="lineno">  457</span>&#160;} <span class="comment">// anonymous namespace, can&#39;t be seen outside this source file</span></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"><a class="line" href="classarmnn_caffe_parser_1_1_record_by_record_caffe_parser.xhtml#a9f5ad3c6d406bd00bd4ce3b85eb32324">  459</a></span>&#160;<a class="code" href="classarmnn_caffe_parser_1_1_record_by_record_caffe_parser.xhtml#a9f5ad3c6d406bd00bd4ce3b85eb32324">RecordByRecordCaffeParser::RecordByRecordCaffeParser</a>() : CaffeParserImpl()</div><div class="line"><a name="l00460"></a><span class="lineno">  460</span>&#160;{}</div><div class="line"><a name="l00461"></a><span class="lineno">  461</span>&#160;</div><div class="line"><a name="l00462"></a><span class="lineno"><a class="line" href="classarmnn_caffe_parser_1_1_record_by_record_caffe_parser.xhtml#a2af73acd4a0513a5942d7c255babce1c">  462</a></span>&#160;<a class="code" href="namespacearmnn.xhtml#ace74f6f9feb95a964a49d79458232703">armnn::INetworkPtr</a> <a class="code" href="classarmnn_caffe_parser_1_1_record_by_record_caffe_parser.xhtml#a2af73acd4a0513a5942d7c255babce1c">RecordByRecordCaffeParser::CreateNetworkFromBinaryFile</a>(</div><div class="line"><a name="l00463"></a><span class="lineno">  463</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">char</span>* graphFile,</div><div class="line"><a name="l00464"></a><span class="lineno">  464</span>&#160;    <span class="keyword">const</span> std::map&lt;std::string, armnn::TensorShape&gt;&amp; inputShapes,</div><div class="line"><a name="l00465"></a><span class="lineno">  465</span>&#160;    <span class="keyword">const</span> std::vector&lt;std::string&gt;&amp; requestedOutputs)</div><div class="line"><a name="l00466"></a><span class="lineno">  466</span>&#160;{</div><div class="line"><a name="l00467"></a><span class="lineno">  467</span>&#160;</div><div class="line"><a name="l00468"></a><span class="lineno">  468</span>&#160;    <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="l00469"></a><span class="lineno">  469</span>&#160;    <span class="keywordflow">if</span> (requestedOutputs.size() == 0)</div><div class="line"><a name="l00470"></a><span class="lineno">  470</span>&#160;    {</div><div class="line"><a name="l00471"></a><span class="lineno">  471</span>&#160;        <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_parse_exception.xhtml">armnn::ParseException</a>(<span class="stringliteral">&quot;requestedOutputs must have at least one entry&quot;</span>);</div><div class="line"><a name="l00472"></a><span class="lineno">  472</span>&#160;    }</div><div class="line"><a name="l00473"></a><span class="lineno">  473</span>&#160;    m_RequestedOutputs = requestedOutputs;</div><div class="line"><a name="l00474"></a><span class="lineno">  474</span>&#160;</div><div class="line"><a name="l00475"></a><span class="lineno">  475</span>&#160;    std::ifstream ifs(graphFile, std::ifstream::in|std::ifstream::binary);</div><div class="line"><a name="l00476"></a><span class="lineno">  476</span>&#160;    <span class="keywordflow">if</span> (ifs.fail())</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="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_file_not_found_exception.xhtml">armnn::FileNotFoundException</a>(<span class="stringliteral">&quot;Failed to open graph file &#39;&quot;</span> + std::string(graphFile) + <span class="stringliteral">&quot;&#39;&quot;</span>);</div><div class="line"><a name="l00479"></a><span class="lineno">  479</span>&#160;    }</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;    std::vector&lt;LayerParameterInfo&gt; layerInfo;</div><div class="line"><a name="l00482"></a><span class="lineno">  482</span>&#160;    NetParameterInfo netParameterInfo;</div><div class="line"><a name="l00483"></a><span class="lineno">  483</span>&#160;    <span class="keywordflow">while</span>(<span class="keyword">true</span>)</div><div class="line"><a name="l00484"></a><span class="lineno">  484</span>&#160;    {</div><div class="line"><a name="l00485"></a><span class="lineno">  485</span>&#160;        ProtobufFieldInfo fieldInfo = readFieldInfo(ifs);</div><div class="line"><a name="l00486"></a><span class="lineno">  486</span>&#160;        <span class="keywordflow">if</span> (fieldInfo.eof())</div><div class="line"><a name="l00487"></a><span class="lineno">  487</span>&#160;        {</div><div class="line"><a name="l00488"></a><span class="lineno">  488</span>&#160;            <span class="keywordflow">break</span>;</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="keywordflow">switch</span>(fieldInfo.field_type())</div><div class="line"><a name="l00491"></a><span class="lineno">  491</span>&#160;        {</div><div class="line"><a name="l00492"></a><span class="lineno">  492</span>&#160;            <span class="keywordflow">case</span> 0:</div><div class="line"><a name="l00493"></a><span class="lineno">  493</span>&#160;            {</div><div class="line"><a name="l00494"></a><span class="lineno">  494</span>&#160;                ReadBase128(ifs);</div><div class="line"><a name="l00495"></a><span class="lineno">  495</span>&#160;                <span class="keywordflow">break</span>;</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="keywordflow">case</span> 2:</div><div class="line"><a name="l00498"></a><span class="lineno">  498</span>&#160;            {</div><div class="line"><a name="l00499"></a><span class="lineno">  499</span>&#160;                <span class="comment">// The values of interest from the caffe.proto schema are:</span></div><div class="line"><a name="l00500"></a><span class="lineno">  500</span>&#160;                <span class="comment">// optional string name = 1; // consider giving the network a name</span></div><div class="line"><a name="l00501"></a><span class="lineno">  501</span>&#160;                <span class="comment">// DEPRECATED. See InputParameter. The input blobs to the network.</span></div><div class="line"><a name="l00502"></a><span class="lineno">  502</span>&#160;                <span class="comment">// repeated string input = 3;</span></div><div class="line"><a name="l00503"></a><span class="lineno">  503</span>&#160;                <span class="comment">// DEPRECATED. See InputParameter. The shape of the input blobs.</span></div><div class="line"><a name="l00504"></a><span class="lineno">  504</span>&#160;                <span class="comment">// repeated BlobShape input_shape = 8;</span></div><div class="line"><a name="l00505"></a><span class="lineno">  505</span>&#160;</div><div class="line"><a name="l00506"></a><span class="lineno">  506</span>&#160;                <span class="comment">// 4D input dimensions -- deprecated.  Use &quot;input_shape&quot; instead.</span></div><div class="line"><a name="l00507"></a><span class="lineno">  507</span>&#160;                <span class="comment">// If specified, for each input blob there should be four</span></div><div class="line"><a name="l00508"></a><span class="lineno">  508</span>&#160;                <span class="comment">// values specifying the num, channels, height and width of the input blob.</span></div><div class="line"><a name="l00509"></a><span class="lineno">  509</span>&#160;                <span class="comment">// Thus, there should be a total of (4 * #input) numbers.</span></div><div class="line"><a name="l00510"></a><span class="lineno">  510</span>&#160;                <span class="comment">// repeated int32 input_dim = 4;</span></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;                <span class="comment">// The layers that make up the net.  Each of their configurations, including</span></div><div class="line"><a name="l00513"></a><span class="lineno">  513</span>&#160;                <span class="comment">// connectivity and behavior, is specified as a LayerParameter.</span></div><div class="line"><a name="l00514"></a><span class="lineno">  514</span>&#160;                <span class="comment">// repeated LayerParameter layer = 100;  // ID 100 so layers are printed last.</span></div><div class="line"><a name="l00515"></a><span class="lineno">  515</span>&#160;</div><div class="line"><a name="l00516"></a><span class="lineno">  516</span>&#160;                <span class="comment">// The first four will (if present) be read into the NetParameterInfo</span></div><div class="line"><a name="l00517"></a><span class="lineno">  517</span>&#160;                <span class="comment">// the LayerParameters will be read into the LayerParameterInfo vector.</span></div><div class="line"><a name="l00518"></a><span class="lineno">  518</span>&#160;</div><div class="line"><a name="l00519"></a><span class="lineno">  519</span>&#160;                <span class="keywordtype">int</span> size = ReadBase128(ifs);</div><div class="line"><a name="l00520"></a><span class="lineno">  520</span>&#160;                std::streamoff posStartOfData = ifs.tellg();</div><div class="line"><a name="l00521"></a><span class="lineno">  521</span>&#160;                ifs.seekg(size, std::ios_base::cur);</div><div class="line"><a name="l00522"></a><span class="lineno">  522</span>&#160;                <span class="keywordflow">if</span>(!ifs.good())</div><div class="line"><a name="l00523"></a><span class="lineno">  523</span>&#160;                {</div><div class="line"><a name="l00524"></a><span class="lineno">  524</span>&#160;                    <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_parse_exception.xhtml">armnn::ParseException</a>(<span class="stringliteral">&quot;failed to seek ahead in binary caffe file&quot;</span>);</div><div class="line"><a name="l00525"></a><span class="lineno">  525</span>&#160;                }</div><div class="line"><a name="l00526"></a><span class="lineno">  526</span>&#160;                std::streamoff endOfLayer = ifs.tellg();</div><div class="line"><a name="l00527"></a><span class="lineno">  527</span>&#160;                <span class="keywordflow">if</span> (fieldInfo.field_id() == 1)</div><div class="line"><a name="l00528"></a><span class="lineno">  528</span>&#160;                {</div><div class="line"><a name="l00529"></a><span class="lineno">  529</span>&#160;                    VarLenDataInfo dataInfo = CreateVarLenDataInfo(posStartOfData, endOfLayer);</div><div class="line"><a name="l00530"></a><span class="lineno">  530</span>&#160;                    <span class="keyword">auto</span> graphName = AllocateBuffer(ifs, dataInfo);</div><div class="line"><a name="l00531"></a><span class="lineno">  531</span>&#160;                    netParameterInfo.set_name(graphName, dataInfo.SizeOfData());</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="keywordflow">if</span> (fieldInfo.field_id() == 3)</div><div class="line"><a name="l00534"></a><span class="lineno">  534</span>&#160;                {</div><div class="line"><a name="l00535"></a><span class="lineno">  535</span>&#160;                    VarLenDataInfo dataInfo = CreateVarLenDataInfo(posStartOfData, endOfLayer);</div><div class="line"><a name="l00536"></a><span class="lineno">  536</span>&#160;                    <span class="keyword">auto</span> inputName = AllocateBuffer(ifs, dataInfo);</div><div class="line"><a name="l00537"></a><span class="lineno">  537</span>&#160;                    netParameterInfo.add_input(inputName, dataInfo.SizeOfData());</div><div class="line"><a name="l00538"></a><span class="lineno">  538</span>&#160;                }</div><div class="line"><a name="l00539"></a><span class="lineno">  539</span>&#160;                <span class="keywordflow">if</span> (fieldInfo.field_id() == 8)</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;                    VarLenDataInfo dataInfo = CreateVarLenDataInfo(posStartOfData, endOfLayer);</div><div class="line"><a name="l00542"></a><span class="lineno">  542</span>&#160;                    <span class="keyword">auto</span> inputShape = AllocateBuffer(ifs, dataInfo);</div><div class="line"><a name="l00543"></a><span class="lineno">  543</span>&#160;                    caffe::BlobShape blobShape;</div><div class="line"><a name="l00544"></a><span class="lineno">  544</span>&#160;                    <span class="keywordtype">bool</span> bRet = blobShape.ParseFromArray(inputShape.get(), <span class="keyword">static_cast&lt;</span><span class="keywordtype">int</span><span class="keyword">&gt;</span>(dataInfo.SizeOfData()));</div><div class="line"><a name="l00545"></a><span class="lineno">  545</span>&#160;                    <span class="keywordflow">if</span> (!bRet)</div><div class="line"><a name="l00546"></a><span class="lineno">  546</span>&#160;                    {</div><div class="line"><a name="l00547"></a><span class="lineno">  547</span>&#160;                        <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_parse_exception.xhtml">armnn::ParseException</a>(<span class="stringliteral">&quot;Failed to parse input shape&quot;</span>);</div><div class="line"><a name="l00548"></a><span class="lineno">  548</span>&#160;                    }</div><div class="line"><a name="l00549"></a><span class="lineno">  549</span>&#160;                    netParameterInfo.add_blob_shape(blobShape);</div><div class="line"><a name="l00550"></a><span class="lineno">  550</span>&#160;                }</div><div class="line"><a name="l00551"></a><span class="lineno">  551</span>&#160;                <span class="keywordflow">if</span> (fieldInfo.field_id() == 4)</div><div class="line"><a name="l00552"></a><span class="lineno">  552</span>&#160;                {</div><div class="line"><a name="l00553"></a><span class="lineno">  553</span>&#160;                    <span class="keywordtype">int</span> input_dim = ReadBase128(ifs);</div><div class="line"><a name="l00554"></a><span class="lineno">  554</span>&#160;                    netParameterInfo.add_input_dimension(input_dim);</div><div class="line"><a name="l00555"></a><span class="lineno">  555</span>&#160;                }</div><div class="line"><a name="l00556"></a><span class="lineno">  556</span>&#160;                <span class="keywordflow">if</span> (fieldInfo.field_id() == 100)</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;                    LayerParameterInfo <a class="code" href="namespacearmnn.xhtml#a4dc0adc6737b5944e7671bee71788407acaf9b6b99962bf5c2264824231d7a40c">info</a>(CreateVarLenDataInfo(posStartOfData, endOfLayer));</div><div class="line"><a name="l00559"></a><span class="lineno">  559</span>&#160;                    ReadTopologicalInfoForLayerParameter(info, ifs);</div><div class="line"><a name="l00560"></a><span class="lineno">  560</span>&#160;                    layerInfo.push_back(info);</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">break</span>;</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="keywordflow">default</span>:</div><div class="line"><a name="l00565"></a><span class="lineno">  565</span>&#160;            {</div><div class="line"><a name="l00566"></a><span class="lineno">  566</span>&#160;                <span class="keywordflow">break</span>;</div><div class="line"><a name="l00567"></a><span class="lineno">  567</span>&#160;            }</div><div class="line"><a name="l00568"></a><span class="lineno">  568</span>&#160;        }</div><div class="line"><a name="l00569"></a><span class="lineno">  569</span>&#160;    }</div><div class="line"><a name="l00570"></a><span class="lineno">  570</span>&#160;    std::vector&lt;const LayerParameterInfo*&gt; sortedNodes;</div><div class="line"><a name="l00571"></a><span class="lineno">  571</span>&#160;    ProcessLayers(netParameterInfo, layerInfo, m_RequestedOutputs, sortedNodes);</div><div class="line"><a name="l00572"></a><span class="lineno">  572</span>&#160;    <a class="code" href="namespacearmnn.xhtml#ace74f6f9feb95a964a49d79458232703">armnn::INetworkPtr</a> networkPtr = LoadLayers(ifs, sortedNodes, netParameterInfo);</div><div class="line"><a name="l00573"></a><span class="lineno">  573</span>&#160;    <span class="keywordflow">return</span> networkPtr;</div><div class="line"><a name="l00574"></a><span class="lineno">  574</span>&#160;</div><div class="line"><a name="l00575"></a><span class="lineno">  575</span>&#160;}</div><div class="line"><a name="l00576"></a><span class="lineno">  576</span>&#160;</div><div class="line"><a name="l00577"></a><span class="lineno">  577</span>&#160;<span class="keywordtype">void</span> RecordByRecordCaffeParser::ProcessLayers(</div><div class="line"><a name="l00578"></a><span class="lineno">  578</span>&#160;    <span class="keyword">const</span> NetParameterInfo&amp; netParameterInfo,</div><div class="line"><a name="l00579"></a><span class="lineno">  579</span>&#160;    std::vector&lt;LayerParameterInfo&gt;&amp; layerInfo,</div><div class="line"><a name="l00580"></a><span class="lineno">  580</span>&#160;    <span class="keyword">const</span> std::vector&lt;std::string&gt;&amp; m_RequestedOutputs,</div><div class="line"><a name="l00581"></a><span class="lineno">  581</span>&#160;    std::vector&lt;const LayerParameterInfo*&gt;&amp; sortedNodes)</div><div class="line"><a name="l00582"></a><span class="lineno">  582</span>&#160;{</div><div class="line"><a name="l00583"></a><span class="lineno">  583</span>&#160;    <span class="comment">// if there is an implicit input layer add it to the layerInfo list</span></div><div class="line"><a name="l00584"></a><span class="lineno">  584</span>&#160;    <span class="keywordflow">if</span> (netParameterInfo.input_size() &gt; 0)</div><div class="line"><a name="l00585"></a><span class="lineno">  585</span>&#160;    {</div><div class="line"><a name="l00586"></a><span class="lineno">  586</span>&#160;        LayerParameterInfo implicitInputLayer(0, 0);</div><div class="line"><a name="l00587"></a><span class="lineno">  587</span>&#160;        implicitInputLayer.set_type(LayerParameterInfo::INPUT);</div><div class="line"><a name="l00588"></a><span class="lineno">  588</span>&#160;        implicitInputLayer.set_name(netParameterInfo.input(0));</div><div class="line"><a name="l00589"></a><span class="lineno">  589</span>&#160;        implicitInputLayer.add_top(netParameterInfo.input(0));</div><div class="line"><a name="l00590"></a><span class="lineno">  590</span>&#160;        layerInfo.push_back(implicitInputLayer);</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;    <a class="code" href="classarmnn_caffe_parser_1_1_i_caffe_parser_1_1_caffe_parser_impl.xhtml#a89631aa06b5c628c46674c202b40dbc5">::ResolveInPlaceLayers</a>(layerInfo);</div><div class="line"><a name="l00593"></a><span class="lineno">  593</span>&#160;</div><div class="line"><a name="l00594"></a><span class="lineno">  594</span>&#160;    <span class="keywordflow">for</span> (LayerParameterInfo&amp; <a class="code" href="namespacearmnn.xhtml#a4dc0adc6737b5944e7671bee71788407acaf9b6b99962bf5c2264824231d7a40c">info</a> : layerInfo)</div><div class="line"><a name="l00595"></a><span class="lineno">  595</span>&#160;    {</div><div class="line"><a name="l00596"></a><span class="lineno">  596</span>&#160;        <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> i = 0; i &lt; <a class="code" href="namespacearmnn.xhtml#a4dc0adc6737b5944e7671bee71788407acaf9b6b99962bf5c2264824231d7a40c">info</a>.top_size(); ++i)</div><div class="line"><a name="l00597"></a><span class="lineno">  597</span>&#160;        {</div><div class="line"><a name="l00598"></a><span class="lineno">  598</span>&#160;            m_CaffeLayersByTopName[<a class="code" href="namespacearmnn.xhtml#a4dc0adc6737b5944e7671bee71788407acaf9b6b99962bf5c2264824231d7a40c">info</a>.top(i)] = &amp;<a class="code" href="namespacearmnn.xhtml#a4dc0adc6737b5944e7671bee71788407acaf9b6b99962bf5c2264824231d7a40c">info</a>;</div><div class="line"><a name="l00599"></a><span class="lineno">  599</span>&#160;        }</div><div class="line"><a name="l00600"></a><span class="lineno">  600</span>&#160;    }</div><div class="line"><a name="l00601"></a><span class="lineno">  601</span>&#160;</div><div class="line"><a name="l00602"></a><span class="lineno">  602</span>&#160;    <span class="comment">// Find the output layers the user requested</span></div><div class="line"><a name="l00603"></a><span class="lineno">  603</span>&#160;    std::vector&lt;const LayerParameterInfo*&gt; targetLayers;</div><div class="line"><a name="l00604"></a><span class="lineno">  604</span>&#160;    <span class="keywordflow">for</span> (<span class="keyword">const</span> std::string&amp; requestedOutputName : m_RequestedOutputs)</div><div class="line"><a name="l00605"></a><span class="lineno">  605</span>&#160;    {</div><div class="line"><a name="l00606"></a><span class="lineno">  606</span>&#160;        <span class="keyword">auto</span> nodeIt = m_CaffeLayersByTopName.find(requestedOutputName);</div><div class="line"><a name="l00607"></a><span class="lineno">  607</span>&#160;        <span class="keywordflow">if</span> (nodeIt == m_CaffeLayersByTopName.end())</div><div class="line"><a name="l00608"></a><span class="lineno">  608</span>&#160;        {</div><div class="line"><a name="l00609"></a><span class="lineno">  609</span>&#160;            <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_parse_exception.xhtml">armnn::ParseException</a>(</div><div class="line"><a name="l00610"></a><span class="lineno">  610</span>&#160;                <span class="stringliteral">&quot;Couldn&#39;t find requested output layer &#39;&quot;</span> + requestedOutputName + <span class="stringliteral">&quot;&#39; in graph&quot;</span>);</div><div class="line"><a name="l00611"></a><span class="lineno">  611</span>&#160;        }</div><div class="line"><a name="l00612"></a><span class="lineno">  612</span>&#160;        targetLayers.push_back(nodeIt-&gt;second);</div><div class="line"><a name="l00613"></a><span class="lineno">  613</span>&#160;    }</div><div class="line"><a name="l00614"></a><span class="lineno">  614</span>&#160;</div><div class="line"><a name="l00615"></a><span class="lineno">  615</span>&#160;    <span class="comment">// Sort them into a linear ordering such that all inputs of a node are before the node itself</span></div><div class="line"><a name="l00616"></a><span class="lineno">  616</span>&#160;    <span class="keywordflow">if</span> (!armnnUtils::GraphTopologicalSort&lt;const LayerParameterInfo*&gt;(</div><div class="line"><a name="l00617"></a><span class="lineno">  617</span>&#160;        targetLayers,</div><div class="line"><a name="l00618"></a><span class="lineno">  618</span>&#160;        [<span class="keyword">this</span>](<span class="keyword">const</span> LayerParameterInfo* node)</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">return</span> GetInputs(*node);</div><div class="line"><a name="l00621"></a><span class="lineno">  621</span>&#160;            },</div><div class="line"><a name="l00622"></a><span class="lineno">  622</span>&#160;        sortedNodes))</div><div class="line"><a name="l00623"></a><span class="lineno">  623</span>&#160;    {</div><div class="line"><a name="l00624"></a><span class="lineno">  624</span>&#160;        <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_parse_exception.xhtml">armnn::ParseException</a>(<span class="stringliteral">&quot;Cycle detected in graph&quot;</span>);</div><div class="line"><a name="l00625"></a><span class="lineno">  625</span>&#160;    }</div><div class="line"><a name="l00626"></a><span class="lineno">  626</span>&#160;}</div><div class="line"><a name="l00627"></a><span class="lineno">  627</span>&#160;</div><div class="line"><a name="l00628"></a><span class="lineno">  628</span>&#160;</div><div class="line"><a name="l00629"></a><span class="lineno">  629</span>&#160;std::vector&lt;const LayerParameterInfo*&gt; RecordByRecordCaffeParser::GetInputs(</div><div class="line"><a name="l00630"></a><span class="lineno">  630</span>&#160;    <span class="keyword">const</span> LayerParameterInfo&amp; layerParam)</div><div class="line"><a name="l00631"></a><span class="lineno">  631</span>&#160;{</div><div class="line"><a name="l00632"></a><span class="lineno">  632</span>&#160;    std::vector&lt;const LayerParameterInfo*&gt; ret;</div><div class="line"><a name="l00633"></a><span class="lineno">  633</span>&#160;    ret.reserve(layerParam.bottom_size());</div><div class="line"><a name="l00634"></a><span class="lineno">  634</span>&#160;    <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> j = 0; j &lt; layerParam.bottom_size(); ++j)</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;        std::string inputName = layerParam.bottom(j);</div><div class="line"><a name="l00637"></a><span class="lineno">  637</span>&#160;        <span class="keyword">auto</span> inputIt = m_CaffeLayersByTopName.find(inputName);</div><div class="line"><a name="l00638"></a><span class="lineno">  638</span>&#160;        <span class="keywordflow">if</span> (inputIt == m_CaffeLayersByTopName.end())</div><div class="line"><a name="l00639"></a><span class="lineno">  639</span>&#160;        {</div><div class="line"><a name="l00640"></a><span class="lineno">  640</span>&#160;            <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_parse_exception.xhtml">armnn::ParseException</a>(</div><div class="line"><a name="l00641"></a><span class="lineno">  641</span>&#160;                <span class="stringliteral">&quot;Can&#39;t find Caffe layer with top called &#39;&quot;</span> + inputName + <span class="stringliteral">&quot;&#39;, which is listed as an input of &#39;&quot;</span> +</div><div class="line"><a name="l00642"></a><span class="lineno">  642</span>&#160;                layerParam.name() + <span class="stringliteral">&quot;&#39;&quot;</span>);</div><div class="line"><a name="l00643"></a><span class="lineno">  643</span>&#160;        }</div><div class="line"><a name="l00644"></a><span class="lineno">  644</span>&#160;        ret.push_back(inputIt-&gt;second);</div><div class="line"><a name="l00645"></a><span class="lineno">  645</span>&#160;    }</div><div class="line"><a name="l00646"></a><span class="lineno">  646</span>&#160;</div><div class="line"><a name="l00647"></a><span class="lineno">  647</span>&#160;    <span class="keywordflow">return</span> ret;</div><div class="line"><a name="l00648"></a><span class="lineno">  648</span>&#160;}</div><div class="line"><a name="l00649"></a><span class="lineno">  649</span>&#160;</div><div class="line"><a name="l00650"></a><span class="lineno">  650</span>&#160;<a class="code" href="namespacearmnn.xhtml#ace74f6f9feb95a964a49d79458232703">armnn::INetworkPtr</a> RecordByRecordCaffeParser::LoadLayers(std::ifstream&amp; ifs,</div><div class="line"><a name="l00651"></a><span class="lineno">  651</span>&#160;                                                         std::vector&lt;const LayerParameterInfo *&gt;&amp; sortedNodes,</div><div class="line"><a name="l00652"></a><span class="lineno">  652</span>&#160;                                                         <span class="keyword">const</span> NetParameterInfo&amp; netParameterInfo)</div><div class="line"><a name="l00653"></a><span class="lineno">  653</span>&#160;{</div><div class="line"><a name="l00654"></a><span class="lineno">  654</span>&#160;</div><div class="line"><a name="l00655"></a><span class="lineno">  655</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="l00656"></a><span class="lineno">  656</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="l00657"></a><span class="lineno">  657</span>&#160;</div><div class="line"><a name="l00658"></a><span class="lineno">  658</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">armnn::INetwork::Create</a>();</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="keywordflow">for</span> (<span class="keyword">auto</span> <a class="code" href="namespacearmnn.xhtml#a4dc0adc6737b5944e7671bee71788407acaf9b6b99962bf5c2264824231d7a40c">info</a> : sortedNodes)</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;        caffe::LayerParameter layer;</div><div class="line"><a name="l00663"></a><span class="lineno">  663</span>&#160;        <span class="keywordflow">if</span> (<a class="code" href="namespacearmnn.xhtml#a4dc0adc6737b5944e7671bee71788407acaf9b6b99962bf5c2264824231d7a40c">info</a>-&gt;isImplicitInputLayer())</div><div class="line"><a name="l00664"></a><span class="lineno">  664</span>&#160;        {</div><div class="line"><a name="l00665"></a><span class="lineno">  665</span>&#160;            <span class="comment">// create the matching Layer Parameter programatically from the data in the</span></div><div class="line"><a name="l00666"></a><span class="lineno">  666</span>&#160;            <span class="comment">// net parameter info which has been passed in...</span></div><div class="line"><a name="l00667"></a><span class="lineno">  667</span>&#160;            layer.set_type(LayerParameterInfo::INPUT);</div><div class="line"><a name="l00668"></a><span class="lineno">  668</span>&#160;            layer.set_name(netParameterInfo.input(0));</div><div class="line"><a name="l00669"></a><span class="lineno">  669</span>&#160;            layer.add_top(netParameterInfo.input(0));</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;            caffe::InputParameter* inputParam = layer.mutable_input_param();</div><div class="line"><a name="l00672"></a><span class="lineno">  672</span>&#160;            caffe::BlobShape* shape = inputParam-&gt;add_shape();</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="keywordtype">long</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> dim_size = netParameterInfo.input_dimensions_size();</div><div class="line"><a name="l00675"></a><span class="lineno">  675</span>&#160;            <span class="keywordflow">for</span> (<span class="keywordtype">long</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i = 0; i &lt; dim_size; ++i)</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;                shape-&gt;add_dim(netParameterInfo.input_dimension(i));</div><div class="line"><a name="l00678"></a><span class="lineno">  678</span>&#160;            }</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="keywordflow">else</span></div><div class="line"><a name="l00681"></a><span class="lineno">  681</span>&#160;        {</div><div class="line"><a name="l00682"></a><span class="lineno">  682</span>&#160;            <span class="keywordtype">char</span> *buffer = <span class="keyword">new</span> <span class="keywordtype">char</span>[<a class="code" href="namespacearmnn.xhtml#a4dc0adc6737b5944e7671bee71788407acaf9b6b99962bf5c2264824231d7a40c">info</a>-&gt;SizeOfData()];</div><div class="line"><a name="l00683"></a><span class="lineno">  683</span>&#160;            ifs.clear();</div><div class="line"><a name="l00684"></a><span class="lineno">  684</span>&#160;            ifs.seekg(<a class="code" href="namespacearmnn.xhtml#a4dc0adc6737b5944e7671bee71788407acaf9b6b99962bf5c2264824231d7a40c">info</a>-&gt;PositionOfData(), std::ios_base::beg);</div><div class="line"><a name="l00685"></a><span class="lineno">  685</span>&#160;            ifs.read(buffer, armnn::numeric_cast&lt;std::streamsize&gt;(<a class="code" href="namespacearmnn.xhtml#a4dc0adc6737b5944e7671bee71788407acaf9b6b99962bf5c2264824231d7a40c">info</a>-&gt;SizeOfData()));</div><div class="line"><a name="l00686"></a><span class="lineno">  686</span>&#160;            <span class="keywordtype">bool</span> bRet = layer.ParseFromArray(buffer, static_cast&lt;int&gt;(<a class="code" href="namespacearmnn.xhtml#a4dc0adc6737b5944e7671bee71788407acaf9b6b99962bf5c2264824231d7a40c">info</a>-&gt;SizeOfData()));</div><div class="line"><a name="l00687"></a><span class="lineno">  687</span>&#160;            <span class="keyword">delete</span>[] buffer;</div><div class="line"><a name="l00688"></a><span class="lineno">  688</span>&#160;            <span class="keywordflow">if</span> (!bRet)</div><div class="line"><a name="l00689"></a><span class="lineno">  689</span>&#160;            {</div><div class="line"><a name="l00690"></a><span class="lineno">  690</span>&#160;                <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_parse_exception.xhtml">armnn::ParseException</a>(<span class="stringliteral">&quot;Failed to parse layer [&quot;</span> + <a class="code" href="namespacearmnn.xhtml#a4dc0adc6737b5944e7671bee71788407acaf9b6b99962bf5c2264824231d7a40c">info</a>-&gt;name() + <span class="stringliteral">&quot;]&quot;</span>);</div><div class="line"><a name="l00691"></a><span class="lineno">  691</span>&#160;            }</div><div class="line"><a name="l00692"></a><span class="lineno">  692</span>&#160;        }</div><div class="line"><a name="l00693"></a><span class="lineno">  693</span>&#160;</div><div class="line"><a name="l00694"></a><span class="lineno">  694</span>&#160;        <span class="keywordflow">if</span> (<a class="code" href="namespacearmnn.xhtml#a4dc0adc6737b5944e7671bee71788407acaf9b6b99962bf5c2264824231d7a40c">info</a>-&gt;new_tops())</div><div class="line"><a name="l00695"></a><span class="lineno">  695</span>&#160;        {</div><div class="line"><a name="l00696"></a><span class="lineno">  696</span>&#160;            <span class="comment">//update the tops</span></div><div class="line"><a name="l00697"></a><span class="lineno">  697</span>&#160;            layer.set_top(0, <a class="code" href="namespacearmnn.xhtml#a4dc0adc6737b5944e7671bee71788407acaf9b6b99962bf5c2264824231d7a40c">info</a>-&gt;top(0));</div><div class="line"><a name="l00698"></a><span class="lineno">  698</span>&#160;        }</div><div class="line"><a name="l00699"></a><span class="lineno">  699</span>&#160;        <span class="keywordflow">if</span> (<a class="code" href="namespacearmnn.xhtml#a4dc0adc6737b5944e7671bee71788407acaf9b6b99962bf5c2264824231d7a40c">info</a>-&gt;new_bottoms())</div><div class="line"><a name="l00700"></a><span class="lineno">  700</span>&#160;        {</div><div class="line"><a name="l00701"></a><span class="lineno">  701</span>&#160;            <span class="comment">//update the bottoms</span></div><div class="line"><a name="l00702"></a><span class="lineno">  702</span>&#160;            layer.set_bottom(0, <a class="code" href="namespacearmnn.xhtml#a4dc0adc6737b5944e7671bee71788407acaf9b6b99962bf5c2264824231d7a40c">info</a>-&gt;bottom(0));</div><div class="line"><a name="l00703"></a><span class="lineno">  703</span>&#160;        }</div><div class="line"><a name="l00704"></a><span class="lineno">  704</span>&#160;</div><div class="line"><a name="l00705"></a><span class="lineno">  705</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(layer.type());</div><div class="line"><a name="l00706"></a><span class="lineno">  706</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="l00707"></a><span class="lineno">  707</span>&#160;        {</div><div class="line"><a name="l00708"></a><span class="lineno">  708</span>&#160;            <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_parse_exception.xhtml">armnn::ParseException</a>(<span class="stringliteral">&quot;Unsupported layer type &#39;&quot;</span> + layer.type() + <span class="stringliteral">&quot;&#39;&quot;</span>);</div><div class="line"><a name="l00709"></a><span class="lineno">  709</span>&#160;        }</div><div class="line"><a name="l00710"></a><span class="lineno">  710</span>&#160;        <span class="keyword">auto</span> func = it-&gt;second;</div><div class="line"><a name="l00711"></a><span class="lineno">  711</span>&#160;        (this-&gt;*func)(layer);</div><div class="line"><a name="l00712"></a><span class="lineno">  712</span>&#160;    }</div><div class="line"><a name="l00713"></a><span class="lineno">  713</span>&#160;    ifs.close();</div><div class="line"><a name="l00714"></a><span class="lineno">  714</span>&#160;</div><div class="line"><a name="l00715"></a><span class="lineno">  715</span>&#160;    <span class="comment">// Add ArmNN output layers connected to each requested output</span></div><div class="line"><a name="l00716"></a><span class="lineno">  716</span>&#160;    <span class="keywordflow">for</span> (<span class="keyword">const</span> std::string&amp; requestedOutput : m_RequestedOutputs)</div><div class="line"><a name="l00717"></a><span class="lineno">  717</span>&#160;    {</div><div class="line"><a name="l00718"></a><span class="lineno">  718</span>&#160;        <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="l00719"></a><span class="lineno">  719</span>&#160;</div><div class="line"><a name="l00720"></a><span class="lineno">  720</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="l00721"></a><span class="lineno">  721</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="l00722"></a><span class="lineno">  722</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="l00723"></a><span class="lineno">  723</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="l00724"></a><span class="lineno">  724</span>&#160;</div><div class="line"><a name="l00725"></a><span class="lineno">  725</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="l00726"></a><span class="lineno">  726</span>&#160;    }</div><div class="line"><a name="l00727"></a><span class="lineno">  727</span>&#160;</div><div class="line"><a name="l00728"></a><span class="lineno">  728</span>&#160;    <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="l00729"></a><span class="lineno">  729</span>&#160;</div><div class="line"><a name="l00730"></a><span class="lineno">  730</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="l00731"></a><span class="lineno">  731</span>&#160;}</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_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="_utils_8hpp_xhtml"><div class="ttname"><a href="_utils_8hpp.xhtml">Utils.hpp</a></div></div>
<div class="ttc" id="_cl_layer_tests_8cpp_xhtml_a2289f9e7fac0ce47801448e873b04303"><div class="ttname"><a href="_cl_layer_tests_8cpp.xhtml#a2289f9e7fac0ce47801448e873b04303">false</a></div><div class="ttdeci">DataLayout::NCHW false</div><div class="ttdef"><b>Definition:</b> <a href="_cl_layer_tests_8cpp_source.xhtml#l00135">ClLayerTests.cpp:135</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="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="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="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="_numeric_cast_8hpp_xhtml"><div class="ttname"><a href="_numeric_cast_8hpp.xhtml">NumericCast.hpp</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_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="classarmnn_caffe_parser_1_1_record_by_record_caffe_parser_xhtml_a9f5ad3c6d406bd00bd4ce3b85eb32324"><div class="ttname"><a href="classarmnn_caffe_parser_1_1_record_by_record_caffe_parser.xhtml#a9f5ad3c6d406bd00bd4ce3b85eb32324">armnnCaffeParser::RecordByRecordCaffeParser::RecordByRecordCaffeParser</a></div><div class="ttdeci">RecordByRecordCaffeParser()</div><div class="ttdef"><b>Definition:</b> <a href="_record_by_record_caffe_parser_8cpp_source.xhtml#l00459">RecordByRecordCaffeParser.cpp:459</a></div></div>
<div class="ttc" id="classarmnn_1_1_i_output_slot_xhtml"><div class="ttname"><a href="classarmnn_1_1_i_output_slot.xhtml">armnn::IOutputSlot</a></div><div class="ttdoc">An output connection slot for a layer. </div><div class="ttdef"><b>Definition:</b> <a href="_i_network_8hpp_source.xhtml#l00038">INetwork.hpp:38</a></div></div>
<div class="ttc" id="classarmnn_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="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="_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="_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_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="classarmnn_caffe_parser_1_1_record_by_record_caffe_parser_xhtml_a2af73acd4a0513a5942d7c255babce1c"><div class="ttname"><a href="classarmnn_caffe_parser_1_1_record_by_record_caffe_parser.xhtml#a2af73acd4a0513a5942d7c255babce1c">armnnCaffeParser::RecordByRecordCaffeParser::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="_record_by_record_caffe_parser_8cpp_source.xhtml#l00462">RecordByRecordCaffeParser.cpp:462</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_a4dc0adc6737b5944e7671bee71788407acaf9b6b99962bf5c2264824231d7a40c"><div class="ttname"><a href="namespacearmnn.xhtml#a4dc0adc6737b5944e7671bee71788407acaf9b6b99962bf5c2264824231d7a40c">armnn::BoostLogSeverityMapping::info</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="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="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="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_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="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="_cl_layer_tests_8cpp_xhtml_a88d84cc49602ca19491dea9c998035fe"><div class="ttname"><a href="_cl_layer_tests_8cpp.xhtml#a88d84cc49602ca19491dea9c998035fe">true</a></div><div class="ttdeci">DataLayout::NCHW DataLayout::NCHW DataLayout::NHWC DataLayout::NHWC true</div><div class="ttdef"><b>Definition:</b> <a href="_cl_layer_tests_8cpp_source.xhtml#l00212">ClLayerTests.cpp:212</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="_record_by_record_caffe_parser_8cpp.xhtml">RecordByRecordCaffeParser.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>