aboutsummaryrefslogtreecommitdiff
path: root/21.02/_optimize_subgraph_view_tests_8cpp_source.xhtml
blob: 30851a803d0be04f942e7c16729a27c192eeada0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
<!-- 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/backends/backendsCommon/test/OptimizeSubgraphViewTests.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('_optimize_subgraph_view_tests_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">OptimizeSubgraphViewTests.cpp</div>  </div>
</div><!--header-->
<div class="contents">
<a href="_optimize_subgraph_view_tests_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="_common_test_utils_8hpp.xhtml">CommonTestUtils.hpp</a>&quot;</span></div><div class="line"><a name="l00007"></a><span class="lineno">    7</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="_mock_backend_8hpp.xhtml">MockBackend.hpp</a>&quot;</span></div><div class="line"><a name="l00008"></a><span class="lineno">    8</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="_mock_backend_id_8hpp.xhtml">MockBackendId.hpp</a>&quot;</span></div><div class="line"><a name="l00009"></a><span class="lineno">    9</span>&#160;</div><div class="line"><a name="l00010"></a><span class="lineno">   10</span>&#160;<span class="preprocessor">#include &lt;<a class="code" href="_graph_8hpp.xhtml">Graph.hpp</a>&gt;</span></div><div class="line"><a name="l00011"></a><span class="lineno">   11</span>&#160;<span class="preprocessor">#include &lt;<a class="code" href="_network_8hpp.xhtml">Network.hpp</a>&gt;</span></div><div class="line"><a name="l00012"></a><span class="lineno">   12</span>&#160;</div><div class="line"><a name="l00013"></a><span class="lineno">   13</span>&#160;<span class="preprocessor">#include &lt;<a class="code" href="_backend_registry_8hpp.xhtml">armnn/BackendRegistry.hpp</a>&gt;</span></div><div class="line"><a name="l00014"></a><span class="lineno">   14</span>&#160;</div><div class="line"><a name="l00015"></a><span class="lineno">   15</span>&#160;<span class="preprocessor">#include &lt;boost/test/unit_test.hpp&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;<span class="preprocessor">#include &lt;unordered_map&gt;</span></div><div class="line"><a name="l00018"></a><span class="lineno">   18</span>&#160;</div><div class="line"><a name="l00019"></a><span class="lineno">   19</span>&#160;<span class="keyword">using namespace </span><a class="code" href="namespacearmnn.xhtml">armnn</a>;</div><div class="line"><a name="l00020"></a><span class="lineno">   20</span>&#160;</div><div class="line"><a name="l00021"></a><span class="lineno">   21</span>&#160;<span class="keyword">namespace</span></div><div class="line"><a name="l00022"></a><span class="lineno">   22</span>&#160;{</div><div class="line"><a name="l00023"></a><span class="lineno">   23</span>&#160;</div><div class="line"><a name="l00024"></a><span class="lineno">   24</span>&#160;<span class="comment">// The expected number of layers, input and output slots in a subgraph after a test</span></div><div class="line"><a name="l00025"></a><span class="lineno">   25</span>&#160;<span class="keyword">struct </span>ExpectedSubgraphSize</div><div class="line"><a name="l00026"></a><span class="lineno">   26</span>&#160;{</div><div class="line"><a name="l00027"></a><span class="lineno">   27</span>&#160;    <span class="keywordtype">size_t</span> m_NumInputSlots  = 0;</div><div class="line"><a name="l00028"></a><span class="lineno">   28</span>&#160;    <span class="keywordtype">size_t</span> m_NumOutputSlots = 0;</div><div class="line"><a name="l00029"></a><span class="lineno">   29</span>&#160;    <span class="keywordtype">size_t</span> m_NumLayers      = 0;</div><div class="line"><a name="l00030"></a><span class="lineno">   30</span>&#160;};</div><div class="line"><a name="l00031"></a><span class="lineno">   31</span>&#160;</div><div class="line"><a name="l00032"></a><span class="lineno">   32</span>&#160;<span class="comment">// Keep the layers organized by layer name</span></div><div class="line"><a name="l00033"></a><span class="lineno">   33</span>&#160;<span class="keyword">using</span> LayerNameToLayerMap = std::unordered_map&lt;std::string, Layer*&gt;;</div><div class="line"><a name="l00034"></a><span class="lineno">   34</span>&#160;</div><div class="line"><a name="l00035"></a><span class="lineno">   35</span>&#160;<span class="comment">// Used to convert input and output slots from reference type (as stored in graphs) to</span></div><div class="line"><a name="l00036"></a><span class="lineno">   36</span>&#160;<span class="comment">// pointer type (as stored in subgraphs)</span></div><div class="line"><a name="l00037"></a><span class="lineno">   37</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">typename</span> SlotType&gt;</div><div class="line"><a name="l00038"></a><span class="lineno">   38</span>&#160;SlotType* ConvertReferenceTypeToPointerType(<span class="keyword">const</span> SlotType&amp; input)</div><div class="line"><a name="l00039"></a><span class="lineno">   39</span>&#160;{</div><div class="line"><a name="l00040"></a><span class="lineno">   40</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">const_cast&lt;</span>SlotType*<span class="keyword">&gt;</span>(&amp;input);</div><div class="line"><a name="l00041"></a><span class="lineno">   41</span>&#160;}</div><div class="line"><a name="l00042"></a><span class="lineno">   42</span>&#160;</div><div class="line"><a name="l00043"></a><span class="lineno">   43</span>&#160;<span class="comment">// Used to convert input and output slots from reference type (as stored in graphs) to</span></div><div class="line"><a name="l00044"></a><span class="lineno">   44</span>&#160;<span class="comment">// pointer type (as stored in subgraphs), array version</span></div><div class="line"><a name="l00045"></a><span class="lineno">   45</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">typename</span> SlotType&gt;</div><div class="line"><a name="l00046"></a><span class="lineno">   46</span>&#160;std::vector&lt;SlotType*&gt; ConvertReferenceTypeToPointerType(<span class="keyword">const</span> std::vector&lt;SlotType&gt;&amp; input)</div><div class="line"><a name="l00047"></a><span class="lineno">   47</span>&#160;{</div><div class="line"><a name="l00048"></a><span class="lineno">   48</span>&#160;    std::vector&lt;SlotType*&gt; output;</div><div class="line"><a name="l00049"></a><span class="lineno">   49</span>&#160;    std::transform(input.begin(),</div><div class="line"><a name="l00050"></a><span class="lineno">   50</span>&#160;                   input.end(),</div><div class="line"><a name="l00051"></a><span class="lineno">   51</span>&#160;                   std::back_inserter(output),</div><div class="line"><a name="l00052"></a><span class="lineno">   52</span>&#160;                   [](<span class="keyword">const</span> SlotType&amp; inputItem)</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;        <span class="keywordflow">return</span> ConvertReferenceTypeToPointerType(inputItem);</div><div class="line"><a name="l00055"></a><span class="lineno">   55</span>&#160;    });</div><div class="line"><a name="l00056"></a><span class="lineno">   56</span>&#160;</div><div class="line"><a name="l00057"></a><span class="lineno">   57</span>&#160;    <span class="keywordflow">return</span> output;</div><div class="line"><a name="l00058"></a><span class="lineno">   58</span>&#160;}</div><div class="line"><a name="l00059"></a><span class="lineno">   59</span>&#160;</div><div class="line"><a name="l00060"></a><span class="lineno">   60</span>&#160;<span class="comment">// Convenience function to add an input layer to a graph</span></div><div class="line"><a name="l00061"></a><span class="lineno">   61</span>&#160;<a class="code" href="classarmnn_1_1_layer.xhtml">Layer</a>* AddInputLayer(<a class="code" href="classarmnn_1_1_graph.xhtml">Graph</a>&amp; graph,</div><div class="line"><a name="l00062"></a><span class="lineno">   62</span>&#160;                     <span class="keyword">const</span> std::string&amp; layerName,</div><div class="line"><a name="l00063"></a><span class="lineno">   63</span>&#160;                     <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a>&amp; inputInfo,</div><div class="line"><a name="l00064"></a><span class="lineno">   64</span>&#160;                     <a class="code" href="namespacearmnn.xhtml#ab8cf8f9fb6792e654c2d8d8382f6f01b">LayerBindingId</a> inputId = 0)</div><div class="line"><a name="l00065"></a><span class="lineno">   65</span>&#160;{</div><div class="line"><a name="l00066"></a><span class="lineno">   66</span>&#160;    <a class="code" href="classarmnn_1_1_layer.xhtml">Layer</a>* <span class="keyword">const</span> inputLayer = graph.<a class="code" href="classarmnn_1_1_graph.xhtml#a7563c5b899e7d0ada08fd0fdb202f205">AddLayer</a>&lt;<a class="code" href="classarmnn_1_1_input_layer.xhtml">InputLayer</a>&gt;(inputId, layerName.c_str());</div><div class="line"><a name="l00067"></a><span class="lineno">   67</span>&#160;    BOOST_TEST(inputLayer);</div><div class="line"><a name="l00068"></a><span class="lineno">   68</span>&#160;    inputLayer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#a0e36688a43c35668d8db5257274c68fe">GetOutputSlot</a>(0).<a class="code" href="classarmnn_1_1_output_slot.xhtml#a7e5c5771d741dd5473989047a9314728">SetTensorInfo</a>(inputInfo);</div><div class="line"><a name="l00069"></a><span class="lineno">   69</span>&#160;    <span class="keywordflow">return</span> inputLayer;</div><div class="line"><a name="l00070"></a><span class="lineno">   70</span>&#160;}</div><div class="line"><a name="l00071"></a><span class="lineno">   71</span>&#160;</div><div class="line"><a name="l00072"></a><span class="lineno">   72</span>&#160;<span class="comment">// Convenience function to add an output layer to a graph</span></div><div class="line"><a name="l00073"></a><span class="lineno">   73</span>&#160;<a class="code" href="classarmnn_1_1_layer.xhtml">Layer</a>* AddOutputLayer(<a class="code" href="classarmnn_1_1_graph.xhtml">Graph</a>&amp; graph,</div><div class="line"><a name="l00074"></a><span class="lineno">   74</span>&#160;                      <span class="keyword">const</span> std::string&amp; layerName)</div><div class="line"><a name="l00075"></a><span class="lineno">   75</span>&#160;{</div><div class="line"><a name="l00076"></a><span class="lineno">   76</span>&#160;    <a class="code" href="classarmnn_1_1_layer.xhtml">Layer</a>* <span class="keyword">const</span> outputLayer = graph.<a class="code" href="classarmnn_1_1_graph.xhtml#a7563c5b899e7d0ada08fd0fdb202f205">AddLayer</a>&lt;<a class="code" href="classarmnn_1_1_output_layer.xhtml">OutputLayer</a>&gt;(0, layerName.c_str());</div><div class="line"><a name="l00077"></a><span class="lineno">   77</span>&#160;    BOOST_TEST(outputLayer);</div><div class="line"><a name="l00078"></a><span class="lineno">   78</span>&#160;    <span class="keywordflow">return</span> outputLayer;</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;</div><div class="line"><a name="l00081"></a><span class="lineno">   81</span>&#160;<span class="comment">// Convenience function to add a convolution layer to a graph</span></div><div class="line"><a name="l00082"></a><span class="lineno">   82</span>&#160;<a class="code" href="classarmnn_1_1_convolution2d_layer.xhtml">Convolution2dLayer</a>* AddConvolutionLayer(<a class="code" href="classarmnn_1_1_graph.xhtml">Graph</a>&amp; graph,</div><div class="line"><a name="l00083"></a><span class="lineno">   83</span>&#160;                                        LayerNameToLayerMap&amp; layersInGraph,</div><div class="line"><a name="l00084"></a><span class="lineno">   84</span>&#160;                                        <span class="keyword">const</span> <a class="code" href="structarmnn_1_1_convolution2d_descriptor.xhtml">Convolution2dDescriptor</a>&amp; convolutionDescriptor,</div><div class="line"><a name="l00085"></a><span class="lineno">   85</span>&#160;                                        <span class="keyword">const</span> std::string&amp; layerName,</div><div class="line"><a name="l00086"></a><span class="lineno">   86</span>&#160;                                        <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a>&amp; weightInfo,</div><div class="line"><a name="l00087"></a><span class="lineno">   87</span>&#160;                                        <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a>&amp; biasInfo,</div><div class="line"><a name="l00088"></a><span class="lineno">   88</span>&#160;                                        <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a>&amp; outputInfo)</div><div class="line"><a name="l00089"></a><span class="lineno">   89</span>&#160;{</div><div class="line"><a name="l00090"></a><span class="lineno">   90</span>&#160;    <a class="code" href="classarmnn_1_1_convolution2d_layer.xhtml">Convolution2dLayer</a>* <span class="keyword">const</span> convLayer = graph.<a class="code" href="classarmnn_1_1_graph.xhtml#a7563c5b899e7d0ada08fd0fdb202f205">AddLayer</a>&lt;<a class="code" href="classarmnn_1_1_convolution2d_layer.xhtml">Convolution2dLayer</a>&gt;(convolutionDescriptor, layerName.c_str());</div><div class="line"><a name="l00091"></a><span class="lineno">   91</span>&#160;    BOOST_TEST(convLayer);</div><div class="line"><a name="l00092"></a><span class="lineno">   92</span>&#160;    <a class="code" href="_common_test_utils_8hpp.xhtml#acacca57727df8ccf5c5597e6026da814">SetWeightAndBias</a>(convLayer, weightInfo, biasInfo);</div><div class="line"><a name="l00093"></a><span class="lineno">   93</span>&#160;    convLayer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#a0e36688a43c35668d8db5257274c68fe">GetOutputSlot</a>(0).<a class="code" href="classarmnn_1_1_output_slot.xhtml#a7e5c5771d741dd5473989047a9314728">SetTensorInfo</a>(outputInfo);</div><div class="line"><a name="l00094"></a><span class="lineno">   94</span>&#160;    layersInGraph.insert(std::make_pair(convLayer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#a7ddf0cf6f620d59c10e63495ace795d0">GetName</a>(), convLayer));</div><div class="line"><a name="l00095"></a><span class="lineno">   95</span>&#160;    <span class="keywordflow">return</span> convLayer;</div><div class="line"><a name="l00096"></a><span class="lineno">   96</span>&#160;}</div><div class="line"><a name="l00097"></a><span class="lineno">   97</span>&#160;</div><div class="line"><a name="l00098"></a><span class="lineno">   98</span>&#160;<span class="comment">// Convenience function to add a pooling layer to a graph</span></div><div class="line"><a name="l00099"></a><span class="lineno">   99</span>&#160;<a class="code" href="classarmnn_1_1_pooling2d_layer.xhtml">Pooling2dLayer</a>* AddPoolingLayer(<a class="code" href="classarmnn_1_1_graph.xhtml">Graph</a>&amp; graph,</div><div class="line"><a name="l00100"></a><span class="lineno">  100</span>&#160;                                LayerNameToLayerMap&amp; layersInGraph,</div><div class="line"><a name="l00101"></a><span class="lineno">  101</span>&#160;                                <span class="keyword">const</span> <a class="code" href="structarmnn_1_1_pooling2d_descriptor.xhtml">Pooling2dDescriptor</a>&amp; poolingDescriptor,</div><div class="line"><a name="l00102"></a><span class="lineno">  102</span>&#160;                                <span class="keyword">const</span> std::string&amp; layerName,</div><div class="line"><a name="l00103"></a><span class="lineno">  103</span>&#160;                                <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a>&amp; outputInfo)</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;    <a class="code" href="classarmnn_1_1_pooling2d_layer.xhtml">Pooling2dLayer</a>* <span class="keyword">const</span> poolingLayer = graph.<a class="code" href="classarmnn_1_1_graph.xhtml#a7563c5b899e7d0ada08fd0fdb202f205">AddLayer</a>&lt;<a class="code" href="classarmnn_1_1_pooling2d_layer.xhtml">Pooling2dLayer</a>&gt;(poolingDescriptor, layerName.c_str());</div><div class="line"><a name="l00106"></a><span class="lineno">  106</span>&#160;    BOOST_TEST(poolingLayer);</div><div class="line"><a name="l00107"></a><span class="lineno">  107</span>&#160;    poolingLayer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#a0e36688a43c35668d8db5257274c68fe">GetOutputSlot</a>(0).<a class="code" href="classarmnn_1_1_output_slot.xhtml#a7e5c5771d741dd5473989047a9314728">SetTensorInfo</a>(outputInfo);</div><div class="line"><a name="l00108"></a><span class="lineno">  108</span>&#160;    layersInGraph.insert(std::make_pair(poolingLayer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#a7ddf0cf6f620d59c10e63495ace795d0">GetName</a>(), poolingLayer));</div><div class="line"><a name="l00109"></a><span class="lineno">  109</span>&#160;    <span class="keywordflow">return</span> poolingLayer;</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;</div><div class="line"><a name="l00112"></a><span class="lineno">  112</span>&#160;<span class="comment">// Convenience function to add an addition layer to a graph</span></div><div class="line"><a name="l00113"></a><span class="lineno">  113</span>&#160;<a class="code" href="classarmnn_1_1_addition_layer.xhtml">AdditionLayer</a>* AddAdditionaLayer(<a class="code" href="classarmnn_1_1_graph.xhtml">Graph</a>&amp; graph,</div><div class="line"><a name="l00114"></a><span class="lineno">  114</span>&#160;                                 LayerNameToLayerMap&amp; layersInGraph,</div><div class="line"><a name="l00115"></a><span class="lineno">  115</span>&#160;                                 <span class="keyword">const</span> std::string&amp; layerName,</div><div class="line"><a name="l00116"></a><span class="lineno">  116</span>&#160;                                 <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a>&amp; outputInfo)</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;    <a class="code" href="classarmnn_1_1_addition_layer.xhtml">AdditionLayer</a>* <span class="keyword">const</span> additionLayer = graph.<a class="code" href="classarmnn_1_1_graph.xhtml#a7563c5b899e7d0ada08fd0fdb202f205">AddLayer</a>&lt;<a class="code" href="classarmnn_1_1_addition_layer.xhtml">AdditionLayer</a>&gt;(layerName.c_str());</div><div class="line"><a name="l00119"></a><span class="lineno">  119</span>&#160;    BOOST_TEST(additionLayer);</div><div class="line"><a name="l00120"></a><span class="lineno">  120</span>&#160;    additionLayer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#a0e36688a43c35668d8db5257274c68fe">GetOutputSlot</a>(0).<a class="code" href="classarmnn_1_1_output_slot.xhtml#a7e5c5771d741dd5473989047a9314728">SetTensorInfo</a>(outputInfo);</div><div class="line"><a name="l00121"></a><span class="lineno">  121</span>&#160;    layersInGraph.insert(std::make_pair(additionLayer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#a7ddf0cf6f620d59c10e63495ace795d0">GetName</a>(), additionLayer));</div><div class="line"><a name="l00122"></a><span class="lineno">  122</span>&#160;    <span class="keywordflow">return</span> additionLayer;</div><div class="line"><a name="l00123"></a><span class="lineno">  123</span>&#160;}</div><div class="line"><a name="l00124"></a><span class="lineno">  124</span>&#160;</div><div class="line"><a name="l00125"></a><span class="lineno">  125</span>&#160;<span class="comment">// Convenience function to check that the given substitution matches the specified expected values</span></div><div class="line"><a name="l00126"></a><span class="lineno">  126</span>&#160;<span class="keywordtype">void</span> CheckSubstitution(<span class="keyword">const</span> <a class="code" href="structarmnn_1_1_optimization_views_1_1_substitution_pair.xhtml">OptimizationViews::SubstitutionPair</a>&amp; substitution,</div><div class="line"><a name="l00127"></a><span class="lineno">  127</span>&#160;                       <span class="keyword">const</span> ExpectedSubgraphSize&amp; expectedSubstitutableSubgraphSize,</div><div class="line"><a name="l00128"></a><span class="lineno">  128</span>&#160;                       <span class="keyword">const</span> ExpectedSubgraphSize&amp; expectedReplacementSubgraphSize,</div><div class="line"><a name="l00129"></a><span class="lineno">  129</span>&#160;                       <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_subgraph_view.xhtml#a5cc65e15002dbc33a5c8a7d6680e9a9d">SubgraphView::InputSlots</a>&amp; expectedSubstitutableInputSlots,</div><div class="line"><a name="l00130"></a><span class="lineno">  130</span>&#160;                       <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_subgraph_view.xhtml#a78293334750ec5279eb9c96d56deaf08">SubgraphView::OutputSlots</a>&amp; expectedSubstitutableOutputSlots,</div><div class="line"><a name="l00131"></a><span class="lineno">  131</span>&#160;                       <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_subgraph_view.xhtml#a74798938fdaeae75c8adfa4a7439e7f9">SubgraphView::Layers</a>&amp; expectedSubstitutableLayers)</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="keyword">const</span> <a class="code" href="classarmnn_1_1_subgraph_view.xhtml">SubgraphView</a>&amp;              substitutableSubgraph            = substitution.<a class="code" href="structarmnn_1_1_optimization_views_1_1_substitution_pair.xhtml#aa5e6108bf6fefef2d1affa6d89d23d3c">m_SubstitutableSubgraph</a>;</div><div class="line"><a name="l00134"></a><span class="lineno">  134</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_subgraph_view.xhtml#a5cc65e15002dbc33a5c8a7d6680e9a9d">SubgraphView::InputSlots</a>&amp;  substitutableSubgraphInputSlots  = substitutableSubgraph.<a class="code" href="classarmnn_1_1_subgraph_view.xhtml#a0b066a26219bcae83ca3e1d7f60fb123">GetInputSlots</a>();</div><div class="line"><a name="l00135"></a><span class="lineno">  135</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_subgraph_view.xhtml#a78293334750ec5279eb9c96d56deaf08">SubgraphView::OutputSlots</a>&amp; substitutableSubgraphOutputSlots = substitutableSubgraph.<a class="code" href="classarmnn_1_1_subgraph_view.xhtml#a4b924dd808b6a155518d552c7ef3728f">GetOutputSlots</a>();</div><div class="line"><a name="l00136"></a><span class="lineno">  136</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_subgraph_view.xhtml#a74798938fdaeae75c8adfa4a7439e7f9">SubgraphView::Layers</a>&amp;      substitutableSubgraphLayers      = substitutableSubgraph.<a class="code" href="classarmnn_1_1_subgraph_view.xhtml#ac8ac9809196ec980b8472fbc8367697a">GetLayers</a>();</div><div class="line"><a name="l00137"></a><span class="lineno">  137</span>&#160;</div><div class="line"><a name="l00138"></a><span class="lineno">  138</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_subgraph_view.xhtml">SubgraphView</a>&amp;              replacementSubgraph            = substitution.<a class="code" href="structarmnn_1_1_optimization_views_1_1_substitution_pair.xhtml#a02ba9897455deabc6626270fd88d6f4f">m_ReplacementSubgraph</a>;</div><div class="line"><a name="l00139"></a><span class="lineno">  139</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_subgraph_view.xhtml#a5cc65e15002dbc33a5c8a7d6680e9a9d">SubgraphView::InputSlots</a>&amp;  replacementSubgraphInputSlots  = replacementSubgraph.<a class="code" href="classarmnn_1_1_subgraph_view.xhtml#a0b066a26219bcae83ca3e1d7f60fb123">GetInputSlots</a>();</div><div class="line"><a name="l00140"></a><span class="lineno">  140</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_subgraph_view.xhtml#a78293334750ec5279eb9c96d56deaf08">SubgraphView::OutputSlots</a>&amp; replacementSubgraphOutputSlots = replacementSubgraph.<a class="code" href="classarmnn_1_1_subgraph_view.xhtml#a4b924dd808b6a155518d552c7ef3728f">GetOutputSlots</a>();</div><div class="line"><a name="l00141"></a><span class="lineno">  141</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_subgraph_view.xhtml#a74798938fdaeae75c8adfa4a7439e7f9">SubgraphView::Layers</a>&amp;      replacementSubgraphLayers      = replacementSubgraph.<a class="code" href="classarmnn_1_1_subgraph_view.xhtml#ac8ac9809196ec980b8472fbc8367697a">GetLayers</a>();</div><div class="line"><a name="l00142"></a><span class="lineno">  142</span>&#160;</div><div class="line"><a name="l00143"></a><span class="lineno">  143</span>&#160;    BOOST_TEST(substitutableSubgraphInputSlots.size()  == expectedSubstitutableSubgraphSize.m_NumInputSlots);</div><div class="line"><a name="l00144"></a><span class="lineno">  144</span>&#160;    BOOST_TEST(substitutableSubgraphOutputSlots.size() == expectedSubstitutableSubgraphSize.m_NumOutputSlots);</div><div class="line"><a name="l00145"></a><span class="lineno">  145</span>&#160;    BOOST_TEST(substitutableSubgraphLayers.size()      == expectedSubstitutableSubgraphSize.m_NumLayers);</div><div class="line"><a name="l00146"></a><span class="lineno">  146</span>&#160;</div><div class="line"><a name="l00147"></a><span class="lineno">  147</span>&#160;    BOOST_TEST(<a class="code" href="_common_test_utils_8hpp.xhtml#a551d3e8e273f6ff0f4fc4b0b56e1895d">AreEqual</a>(substitutableSubgraphInputSlots,  expectedSubstitutableInputSlots));</div><div class="line"><a name="l00148"></a><span class="lineno">  148</span>&#160;    BOOST_TEST(<a class="code" href="_common_test_utils_8hpp.xhtml#a551d3e8e273f6ff0f4fc4b0b56e1895d">AreEqual</a>(substitutableSubgraphOutputSlots, expectedSubstitutableOutputSlots));</div><div class="line"><a name="l00149"></a><span class="lineno">  149</span>&#160;    BOOST_TEST(<a class="code" href="_common_test_utils_8hpp.xhtml#a551d3e8e273f6ff0f4fc4b0b56e1895d">AreEqual</a>(substitutableSubgraphLayers,      expectedSubstitutableLayers));</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;    BOOST_TEST(replacementSubgraphInputSlots.size()  == expectedReplacementSubgraphSize.m_NumInputSlots);</div><div class="line"><a name="l00152"></a><span class="lineno">  152</span>&#160;    BOOST_TEST(replacementSubgraphOutputSlots.size() == expectedReplacementSubgraphSize.m_NumOutputSlots);</div><div class="line"><a name="l00153"></a><span class="lineno">  153</span>&#160;    BOOST_TEST(replacementSubgraphLayers.size()      == expectedReplacementSubgraphSize.m_NumLayers);</div><div class="line"><a name="l00154"></a><span class="lineno">  154</span>&#160;</div><div class="line"><a name="l00155"></a><span class="lineno">  155</span>&#160;    BOOST_TEST(!<a class="code" href="_common_test_utils_8hpp.xhtml#a551d3e8e273f6ff0f4fc4b0b56e1895d">AreEqual</a>(replacementSubgraphInputSlots,  expectedSubstitutableInputSlots));</div><div class="line"><a name="l00156"></a><span class="lineno">  156</span>&#160;    BOOST_TEST(!<a class="code" href="_common_test_utils_8hpp.xhtml#a551d3e8e273f6ff0f4fc4b0b56e1895d">AreEqual</a>(replacementSubgraphOutputSlots, expectedSubstitutableOutputSlots));</div><div class="line"><a name="l00157"></a><span class="lineno">  157</span>&#160;    BOOST_TEST(!<a class="code" href="_common_test_utils_8hpp.xhtml#a551d3e8e273f6ff0f4fc4b0b56e1895d">AreEqual</a>(replacementSubgraphLayers,      expectedSubstitutableLayers));</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;    BOOST_TEST(std::all_of(replacementSubgraphLayers.begin(),</div><div class="line"><a name="l00160"></a><span class="lineno">  160</span>&#160;                           replacementSubgraphLayers.end(),</div><div class="line"><a name="l00161"></a><span class="lineno">  161</span>&#160;                           [](<span class="keyword">const</span> <a class="code" href="classarmnn_1_1_layer.xhtml">Layer</a>* layer)</div><div class="line"><a name="l00162"></a><span class="lineno">  162</span>&#160;    {</div><div class="line"><a name="l00163"></a><span class="lineno">  163</span>&#160;        <span class="keywordflow">return</span> layer-&gt;GetType() == <a class="code" href="namespacearmnn.xhtml#a56943a0946e5f15e5e58054b8e7a04a4a1ba143ebe524d46181a4b53470693278">LayerType::PreCompiled</a>;</div><div class="line"><a name="l00164"></a><span class="lineno">  164</span>&#160;    }));</div><div class="line"><a name="l00165"></a><span class="lineno">  165</span>&#160;}</div><div class="line"><a name="l00166"></a><span class="lineno">  166</span>&#160;</div><div class="line"><a name="l00167"></a><span class="lineno">  167</span>&#160;<span class="comment">// Convenience function to check that the given failed subgraph matches the specified expected values</span></div><div class="line"><a name="l00168"></a><span class="lineno">  168</span>&#160;<span class="keywordtype">void</span> CheckFailedSubgraph(<span class="keyword">const</span> <a class="code" href="classarmnn_1_1_subgraph_view.xhtml">SubgraphView</a>&amp; failedSubgraph,</div><div class="line"><a name="l00169"></a><span class="lineno">  169</span>&#160;                         <span class="keyword">const</span> ExpectedSubgraphSize&amp; expectedFailedSubgraphSize,</div><div class="line"><a name="l00170"></a><span class="lineno">  170</span>&#160;                         <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_subgraph_view.xhtml#a5cc65e15002dbc33a5c8a7d6680e9a9d">SubgraphView::InputSlots</a>&amp; expectedFailedInputSlots,</div><div class="line"><a name="l00171"></a><span class="lineno">  171</span>&#160;                         <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_subgraph_view.xhtml#a78293334750ec5279eb9c96d56deaf08">SubgraphView::OutputSlots</a>&amp; expectedFailedOutputSlots,</div><div class="line"><a name="l00172"></a><span class="lineno">  172</span>&#160;                         <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_subgraph_view.xhtml#a74798938fdaeae75c8adfa4a7439e7f9">SubgraphView::Layers</a>&amp; expectedFailedLayers)</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;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_subgraph_view.xhtml#a5cc65e15002dbc33a5c8a7d6680e9a9d">SubgraphView::InputSlots</a>&amp;  failedSubgraphInputSlots  = failedSubgraph.<a class="code" href="classarmnn_1_1_subgraph_view.xhtml#a0b066a26219bcae83ca3e1d7f60fb123">GetInputSlots</a>();</div><div class="line"><a name="l00175"></a><span class="lineno">  175</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_subgraph_view.xhtml#a78293334750ec5279eb9c96d56deaf08">SubgraphView::OutputSlots</a>&amp; failedSubgraphOutputSlots = failedSubgraph.<a class="code" href="classarmnn_1_1_subgraph_view.xhtml#a4b924dd808b6a155518d552c7ef3728f">GetOutputSlots</a>();</div><div class="line"><a name="l00176"></a><span class="lineno">  176</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_subgraph_view.xhtml#a74798938fdaeae75c8adfa4a7439e7f9">SubgraphView::Layers</a>&amp;      failedSubgraphLayers      = failedSubgraph.<a class="code" href="classarmnn_1_1_subgraph_view.xhtml#ac8ac9809196ec980b8472fbc8367697a">GetLayers</a>();</div><div class="line"><a name="l00177"></a><span class="lineno">  177</span>&#160;</div><div class="line"><a name="l00178"></a><span class="lineno">  178</span>&#160;    BOOST_TEST(failedSubgraphInputSlots.size()  == expectedFailedSubgraphSize.m_NumInputSlots);</div><div class="line"><a name="l00179"></a><span class="lineno">  179</span>&#160;    BOOST_TEST(failedSubgraphOutputSlots.size() == expectedFailedSubgraphSize.m_NumOutputSlots);</div><div class="line"><a name="l00180"></a><span class="lineno">  180</span>&#160;    BOOST_TEST(failedSubgraphLayers.size()      == expectedFailedSubgraphSize.m_NumLayers);</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;    BOOST_TEST(<a class="code" href="_common_test_utils_8hpp.xhtml#a551d3e8e273f6ff0f4fc4b0b56e1895d">AreEqual</a>(failedSubgraphInputSlots,  expectedFailedInputSlots));</div><div class="line"><a name="l00183"></a><span class="lineno">  183</span>&#160;    BOOST_TEST(<a class="code" href="_common_test_utils_8hpp.xhtml#a551d3e8e273f6ff0f4fc4b0b56e1895d">AreEqual</a>(failedSubgraphOutputSlots, expectedFailedOutputSlots));</div><div class="line"><a name="l00184"></a><span class="lineno">  184</span>&#160;    BOOST_TEST(<a class="code" href="_common_test_utils_8hpp.xhtml#a551d3e8e273f6ff0f4fc4b0b56e1895d">AreEqual</a>(failedSubgraphLayers,      expectedFailedLayers));</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;</div><div class="line"><a name="l00187"></a><span class="lineno">  187</span>&#160;<span class="comment">// Convenience function to check that the given untouched subgraph matches the specified expected values</span></div><div class="line"><a name="l00188"></a><span class="lineno">  188</span>&#160;<span class="keywordtype">void</span> CheckUntouchedSubgraph(<span class="keyword">const</span> <a class="code" href="classarmnn_1_1_subgraph_view.xhtml">SubgraphView</a>&amp; untouchedSubgraph,</div><div class="line"><a name="l00189"></a><span class="lineno">  189</span>&#160;                            <span class="keyword">const</span> ExpectedSubgraphSize&amp; expectedUntouchedSubgraphSize,</div><div class="line"><a name="l00190"></a><span class="lineno">  190</span>&#160;                            <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_subgraph_view.xhtml#a5cc65e15002dbc33a5c8a7d6680e9a9d">SubgraphView::InputSlots</a>&amp; expectedUntouchedInputSlots,</div><div class="line"><a name="l00191"></a><span class="lineno">  191</span>&#160;                            <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_subgraph_view.xhtml#a78293334750ec5279eb9c96d56deaf08">SubgraphView::OutputSlots</a>&amp; expectedUntouchedOutputSlots,</div><div class="line"><a name="l00192"></a><span class="lineno">  192</span>&#160;                            <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_subgraph_view.xhtml#a74798938fdaeae75c8adfa4a7439e7f9">SubgraphView::Layers</a>&amp; expectedUntouchedLayers)</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> <a class="code" href="classarmnn_1_1_subgraph_view.xhtml#a5cc65e15002dbc33a5c8a7d6680e9a9d">SubgraphView::InputSlots</a>&amp;  untouchedSubgraphInputSlots  = untouchedSubgraph.<a class="code" href="classarmnn_1_1_subgraph_view.xhtml#a0b066a26219bcae83ca3e1d7f60fb123">GetInputSlots</a>();</div><div class="line"><a name="l00195"></a><span class="lineno">  195</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_subgraph_view.xhtml#a78293334750ec5279eb9c96d56deaf08">SubgraphView::OutputSlots</a>&amp; untouchedSubgraphOutputSlots = untouchedSubgraph.<a class="code" href="classarmnn_1_1_subgraph_view.xhtml#a4b924dd808b6a155518d552c7ef3728f">GetOutputSlots</a>();</div><div class="line"><a name="l00196"></a><span class="lineno">  196</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_subgraph_view.xhtml#a74798938fdaeae75c8adfa4a7439e7f9">SubgraphView::Layers</a>&amp;      untouchedSubgraphLayers      = untouchedSubgraph.<a class="code" href="classarmnn_1_1_subgraph_view.xhtml#ac8ac9809196ec980b8472fbc8367697a">GetLayers</a>();</div><div class="line"><a name="l00197"></a><span class="lineno">  197</span>&#160;</div><div class="line"><a name="l00198"></a><span class="lineno">  198</span>&#160;    BOOST_TEST(untouchedSubgraphInputSlots.size()  == expectedUntouchedSubgraphSize.m_NumInputSlots);</div><div class="line"><a name="l00199"></a><span class="lineno">  199</span>&#160;    BOOST_TEST(untouchedSubgraphOutputSlots.size() == expectedUntouchedSubgraphSize.m_NumOutputSlots);</div><div class="line"><a name="l00200"></a><span class="lineno">  200</span>&#160;    BOOST_TEST(untouchedSubgraphLayers.size()      == expectedUntouchedSubgraphSize.m_NumLayers);</div><div class="line"><a name="l00201"></a><span class="lineno">  201</span>&#160;</div><div class="line"><a name="l00202"></a><span class="lineno">  202</span>&#160;    BOOST_TEST(<a class="code" href="_common_test_utils_8hpp.xhtml#a551d3e8e273f6ff0f4fc4b0b56e1895d">AreEqual</a>(untouchedSubgraphInputSlots,  expectedUntouchedInputSlots));</div><div class="line"><a name="l00203"></a><span class="lineno">  203</span>&#160;    BOOST_TEST(<a class="code" href="_common_test_utils_8hpp.xhtml#a551d3e8e273f6ff0f4fc4b0b56e1895d">AreEqual</a>(untouchedSubgraphOutputSlots, expectedUntouchedOutputSlots));</div><div class="line"><a name="l00204"></a><span class="lineno">  204</span>&#160;    BOOST_TEST(<a class="code" href="_common_test_utils_8hpp.xhtml#a551d3e8e273f6ff0f4fc4b0b56e1895d">AreEqual</a>(untouchedSubgraphLayers,      expectedUntouchedLayers));</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;</div><div class="line"><a name="l00207"></a><span class="lineno">  207</span>&#160;<span class="comment">// Creates a subgraph containing only a single unsupported layer (only convolutions are unsupported by the mock backend)</span></div><div class="line"><a name="l00208"></a><span class="lineno">  208</span>&#160;<a class="code" href="classarmnn_1_1_subgraph_view.xhtml#a4684a457c7786484375f06e9ab2d2265">SubgraphView::SubgraphViewPtr</a> BuildFullyUnsupportedSubgraph1(<a class="code" href="classarmnn_1_1_graph.xhtml">Graph</a>&amp; graph, LayerNameToLayerMap&amp; layersInGraph)</div><div class="line"><a name="l00209"></a><span class="lineno">  209</span>&#160;{</div><div class="line"><a name="l00210"></a><span class="lineno">  210</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> inputInfo ({  1, 16, 16, 16 }, <a class="code" href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6a0a3f57c876f5a230244c38e1453a8a6e">DataType::QAsymmU8</a>, 1.0f, 0);</div><div class="line"><a name="l00211"></a><span class="lineno">  211</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> outputInfo({  1, 16, 16, 16 }, <a class="code" href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6a0a3f57c876f5a230244c38e1453a8a6e">DataType::QAsymmU8</a>, 1.0f, 0);</div><div class="line"><a name="l00212"></a><span class="lineno">  212</span>&#160;</div><div class="line"><a name="l00213"></a><span class="lineno">  213</span>&#160;    <a class="code" href="structarmnn_1_1_pooling2d_descriptor.xhtml">Pooling2dDescriptor</a> poolingDescriptor;</div><div class="line"><a name="l00214"></a><span class="lineno">  214</span>&#160;    poolingDescriptor.m_PoolType      = <a class="code" href="namespacearmnn.xhtml#a961bbfe1db71a848eff5a1f0ab775718ab1897515d548a960afe49ecf66a29021">armnn::PoolingAlgorithm::Average</a>;</div><div class="line"><a name="l00215"></a><span class="lineno">  215</span>&#160;    poolingDescriptor.m_PoolWidth     = 2;</div><div class="line"><a name="l00216"></a><span class="lineno">  216</span>&#160;    poolingDescriptor.m_PoolHeight    = 2;</div><div class="line"><a name="l00217"></a><span class="lineno">  217</span>&#160;    poolingDescriptor.m_StrideX       = 2;</div><div class="line"><a name="l00218"></a><span class="lineno">  218</span>&#160;    poolingDescriptor.m_StrideY       = 2;</div><div class="line"><a name="l00219"></a><span class="lineno">  219</span>&#160;    poolingDescriptor.m_PadLeft       = 1;</div><div class="line"><a name="l00220"></a><span class="lineno">  220</span>&#160;    poolingDescriptor.m_PadRight      = 1;</div><div class="line"><a name="l00221"></a><span class="lineno">  221</span>&#160;    poolingDescriptor.m_PadTop        = 1;</div><div class="line"><a name="l00222"></a><span class="lineno">  222</span>&#160;    poolingDescriptor.m_PadBottom     = 1;</div><div class="line"><a name="l00223"></a><span class="lineno">  223</span>&#160;    poolingDescriptor.m_PaddingMethod = <a class="code" href="namespacearmnn.xhtml#a3888429b6ebc79f9a7df549e5e4d9a2fa843f2812f595e7ec7c5036e89fde02d6">armnn::PaddingMethod::Exclude</a>;</div><div class="line"><a name="l00224"></a><span class="lineno">  224</span>&#160;    poolingDescriptor.m_DataLayout    = <a class="code" href="namespacearmnn.xhtml#ad1d5cce2d9e9a5d61c243e5c989112e0ad066db54b89b0912e7e7c6da51e2da51">DataLayout::NHWC</a>;</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;    <span class="comment">// Construct the graph</span></div><div class="line"><a name="l00227"></a><span class="lineno">  227</span>&#160;    <a class="code" href="classarmnn_1_1_layer.xhtml">Layer</a>* <span class="keyword">const</span> inputLayer = AddInputLayer(graph, <span class="stringliteral">&quot;input layer&quot;</span>, inputInfo);</div><div class="line"><a name="l00228"></a><span class="lineno">  228</span>&#160;    <a class="code" href="classarmnn_1_1_pooling2d_layer.xhtml">Pooling2dLayer</a>* <span class="keyword">const</span> poolingLayer = AddPoolingLayer(graph, layersInGraph, poolingDescriptor,</div><div class="line"><a name="l00229"></a><span class="lineno">  229</span>&#160;                                                         <span class="stringliteral">&quot;pooling layer&quot;</span>, outputInfo);</div><div class="line"><a name="l00230"></a><span class="lineno">  230</span>&#160;    <a class="code" href="classarmnn_1_1_layer.xhtml">Layer</a>* <span class="keyword">const</span> outputLayer = AddOutputLayer(graph, <span class="stringliteral">&quot;output layer&quot;</span>);</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;    <span class="comment">// Connect the network</span></div><div class="line"><a name="l00233"></a><span class="lineno">  233</span>&#160;    inputLayer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#a0e36688a43c35668d8db5257274c68fe">GetOutputSlot</a>(0).<a class="code" href="classarmnn_1_1_output_slot.xhtml#adcfb97035799ea4c043f9ef370714815">Connect</a>(poolingLayer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#acf8b8e23bf647836592982f97088d375">GetInputSlot</a>(0));</div><div class="line"><a name="l00234"></a><span class="lineno">  234</span>&#160;    poolingLayer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#a0e36688a43c35668d8db5257274c68fe">GetOutputSlot</a>(0).<a class="code" href="classarmnn_1_1_output_slot.xhtml#adcfb97035799ea4c043f9ef370714815">Connect</a>(outputLayer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#acf8b8e23bf647836592982f97088d375">GetInputSlot</a>(0));</div><div class="line"><a name="l00235"></a><span class="lineno">  235</span>&#160;</div><div class="line"><a name="l00236"></a><span class="lineno">  236</span>&#160;    <span class="comment">// Create the subgraph view for the whole network</span></div><div class="line"><a name="l00237"></a><span class="lineno">  237</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="_common_test_utils_8cpp.xhtml#a3ed487c53d08c08186837be90030a855">CreateSubgraphViewFrom</a>(<a class="code" href="_common_test_utils_8cpp.xhtml#a9892eac8f1b8ed9cea0baf643fb6d951">CreateInputsFrom</a>({poolingLayer}),</div><div class="line"><a name="l00238"></a><span class="lineno">  238</span>&#160;                                  <a class="code" href="_common_test_utils_8cpp.xhtml#ae405c72b6d52a1bf4b3471032e76e3f0">CreateOutputsFrom</a>({poolingLayer}),</div><div class="line"><a name="l00239"></a><span class="lineno">  239</span>&#160;                                  {poolingLayer});</div><div class="line"><a name="l00240"></a><span class="lineno">  240</span>&#160;}</div><div class="line"><a name="l00241"></a><span class="lineno">  241</span>&#160;</div><div class="line"><a name="l00242"></a><span class="lineno">  242</span>&#160;<span class="comment">// Creates a subgraph containing only unsupported layers (only convolutions are unsupported by the mock backend)</span></div><div class="line"><a name="l00243"></a><span class="lineno">  243</span>&#160;<a class="code" href="classarmnn_1_1_subgraph_view.xhtml#a4684a457c7786484375f06e9ab2d2265">SubgraphView::SubgraphViewPtr</a> BuildFullyUnsupportedSubgraph2(<a class="code" href="classarmnn_1_1_graph.xhtml">Graph</a>&amp; graph, LayerNameToLayerMap&amp; layersInGraph)</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;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> inputInfo ({  1, 16, 16, 16 }, <a class="code" href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6a0a3f57c876f5a230244c38e1453a8a6e">DataType::QAsymmU8</a>, 1.0f, 0);</div><div class="line"><a name="l00246"></a><span class="lineno">  246</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> outputInfo({  1, 16, 16, 16 }, <a class="code" href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6a0a3f57c876f5a230244c38e1453a8a6e">DataType::QAsymmU8</a>, 1.0f, 0);</div><div class="line"><a name="l00247"></a><span class="lineno">  247</span>&#160;</div><div class="line"><a name="l00248"></a><span class="lineno">  248</span>&#160;    <a class="code" href="structarmnn_1_1_pooling2d_descriptor.xhtml">Pooling2dDescriptor</a> poolingDescriptor;</div><div class="line"><a name="l00249"></a><span class="lineno">  249</span>&#160;    poolingDescriptor.<a class="code" href="structarmnn_1_1_pooling2d_descriptor.xhtml#a0031997bf43bd2747656c31e4977793a">m_PoolType</a>      = <a class="code" href="namespacearmnn.xhtml#a961bbfe1db71a848eff5a1f0ab775718ab1897515d548a960afe49ecf66a29021">armnn::PoolingAlgorithm::Average</a>;</div><div class="line"><a name="l00250"></a><span class="lineno">  250</span>&#160;    poolingDescriptor.m_PoolWidth     = 2;</div><div class="line"><a name="l00251"></a><span class="lineno">  251</span>&#160;    poolingDescriptor.m_PoolHeight    = 2;</div><div class="line"><a name="l00252"></a><span class="lineno">  252</span>&#160;    poolingDescriptor.m_StrideX       = 2;</div><div class="line"><a name="l00253"></a><span class="lineno">  253</span>&#160;    poolingDescriptor.m_StrideY       = 2;</div><div class="line"><a name="l00254"></a><span class="lineno">  254</span>&#160;    poolingDescriptor.m_PadLeft       = 1;</div><div class="line"><a name="l00255"></a><span class="lineno">  255</span>&#160;    poolingDescriptor.m_PadRight      = 1;</div><div class="line"><a name="l00256"></a><span class="lineno">  256</span>&#160;    poolingDescriptor.m_PadTop        = 1;</div><div class="line"><a name="l00257"></a><span class="lineno">  257</span>&#160;    poolingDescriptor.m_PadBottom     = 1;</div><div class="line"><a name="l00258"></a><span class="lineno">  258</span>&#160;    poolingDescriptor.m_PaddingMethod = <a class="code" href="namespacearmnn.xhtml#a3888429b6ebc79f9a7df549e5e4d9a2fa843f2812f595e7ec7c5036e89fde02d6">armnn::PaddingMethod::Exclude</a>;</div><div class="line"><a name="l00259"></a><span class="lineno">  259</span>&#160;    poolingDescriptor.m_DataLayout    = <a class="code" href="namespacearmnn.xhtml#ad1d5cce2d9e9a5d61c243e5c989112e0ad066db54b89b0912e7e7c6da51e2da51">DataLayout::NHWC</a>;</div><div class="line"><a name="l00260"></a><span class="lineno">  260</span>&#160;</div><div class="line"><a name="l00261"></a><span class="lineno">  261</span>&#160;    <span class="comment">// Construct the graph</span></div><div class="line"><a name="l00262"></a><span class="lineno">  262</span>&#160;    <a class="code" href="classarmnn_1_1_layer.xhtml">Layer</a>* <span class="keyword">const</span> inputLayer = AddInputLayer(graph, <span class="stringliteral">&quot;input layer&quot;</span>, inputInfo);</div><div class="line"><a name="l00263"></a><span class="lineno">  263</span>&#160;    <a class="code" href="classarmnn_1_1_pooling2d_layer.xhtml">Pooling2dLayer</a>* <span class="keyword">const</span> pooling1Layer = AddPoolingLayer(graph, layersInGraph, poolingDescriptor,</div><div class="line"><a name="l00264"></a><span class="lineno">  264</span>&#160;                                                          <span class="stringliteral">&quot;pooling1 layer&quot;</span>, outputInfo);</div><div class="line"><a name="l00265"></a><span class="lineno">  265</span>&#160;    <a class="code" href="classarmnn_1_1_pooling2d_layer.xhtml">Pooling2dLayer</a>* <span class="keyword">const</span> pooling2Layer = AddPoolingLayer(graph, layersInGraph, poolingDescriptor,</div><div class="line"><a name="l00266"></a><span class="lineno">  266</span>&#160;                                                          <span class="stringliteral">&quot;pooling2 layer&quot;</span>, outputInfo);</div><div class="line"><a name="l00267"></a><span class="lineno">  267</span>&#160;    <a class="code" href="classarmnn_1_1_pooling2d_layer.xhtml">Pooling2dLayer</a>* <span class="keyword">const</span> pooling3Layer = AddPoolingLayer(graph, layersInGraph, poolingDescriptor,</div><div class="line"><a name="l00268"></a><span class="lineno">  268</span>&#160;                                                          <span class="stringliteral">&quot;pooling3 layer&quot;</span>, outputInfo);</div><div class="line"><a name="l00269"></a><span class="lineno">  269</span>&#160;    <a class="code" href="classarmnn_1_1_layer.xhtml">Layer</a>* <span class="keyword">const</span> outputLayer = AddOutputLayer(graph, <span class="stringliteral">&quot;output layer&quot;</span>);</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="comment">// Connect the network</span></div><div class="line"><a name="l00272"></a><span class="lineno">  272</span>&#160;    inputLayer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#a0e36688a43c35668d8db5257274c68fe">GetOutputSlot</a>(0).<a class="code" href="classarmnn_1_1_output_slot.xhtml#adcfb97035799ea4c043f9ef370714815">Connect</a>(pooling1Layer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#acf8b8e23bf647836592982f97088d375">GetInputSlot</a>(0));</div><div class="line"><a name="l00273"></a><span class="lineno">  273</span>&#160;    pooling1Layer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#a0e36688a43c35668d8db5257274c68fe">GetOutputSlot</a>(0).<a class="code" href="classarmnn_1_1_output_slot.xhtml#adcfb97035799ea4c043f9ef370714815">Connect</a>(pooling2Layer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#acf8b8e23bf647836592982f97088d375">GetInputSlot</a>(0));</div><div class="line"><a name="l00274"></a><span class="lineno">  274</span>&#160;    pooling2Layer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#a0e36688a43c35668d8db5257274c68fe">GetOutputSlot</a>(0).<a class="code" href="classarmnn_1_1_output_slot.xhtml#adcfb97035799ea4c043f9ef370714815">Connect</a>(pooling3Layer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#acf8b8e23bf647836592982f97088d375">GetInputSlot</a>(0));</div><div class="line"><a name="l00275"></a><span class="lineno">  275</span>&#160;    pooling3Layer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#a0e36688a43c35668d8db5257274c68fe">GetOutputSlot</a>(0).<a class="code" href="classarmnn_1_1_output_slot.xhtml#adcfb97035799ea4c043f9ef370714815">Connect</a>(outputLayer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#acf8b8e23bf647836592982f97088d375">GetInputSlot</a>(0));</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;    <span class="comment">// Create the subgraph view for the whole network</span></div><div class="line"><a name="l00278"></a><span class="lineno">  278</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="_common_test_utils_8cpp.xhtml#a3ed487c53d08c08186837be90030a855">CreateSubgraphViewFrom</a>(<a class="code" href="_common_test_utils_8cpp.xhtml#a9892eac8f1b8ed9cea0baf643fb6d951">CreateInputsFrom</a>({pooling1Layer}),</div><div class="line"><a name="l00279"></a><span class="lineno">  279</span>&#160;                                  <a class="code" href="_common_test_utils_8cpp.xhtml#ae405c72b6d52a1bf4b3471032e76e3f0">CreateOutputsFrom</a>({pooling3Layer}),</div><div class="line"><a name="l00280"></a><span class="lineno">  280</span>&#160;                                  {pooling1Layer,</div><div class="line"><a name="l00281"></a><span class="lineno">  281</span>&#160;                                   pooling2Layer,</div><div class="line"><a name="l00282"></a><span class="lineno">  282</span>&#160;                                   pooling3Layer});</div><div class="line"><a name="l00283"></a><span class="lineno">  283</span>&#160;}</div><div class="line"><a name="l00284"></a><span class="lineno">  284</span>&#160;</div><div class="line"><a name="l00285"></a><span class="lineno">  285</span>&#160;<span class="comment">// Creates a simple subgraph with only one convolution layer, supported by the mock backend</span></div><div class="line"><a name="l00286"></a><span class="lineno">  286</span>&#160;<a class="code" href="classarmnn_1_1_subgraph_view.xhtml#a4684a457c7786484375f06e9ab2d2265">SubgraphView::SubgraphViewPtr</a> BuildFullyOptimizableSubgraph1(<a class="code" href="classarmnn_1_1_graph.xhtml">Graph</a>&amp; graph, LayerNameToLayerMap&amp; layersInGraph)</div><div class="line"><a name="l00287"></a><span class="lineno">  287</span>&#160;{</div><div class="line"><a name="l00288"></a><span class="lineno">  288</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> inputInfo ({  1, 16, 16, 16 }, <a class="code" href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6a0a3f57c876f5a230244c38e1453a8a6e">DataType::QAsymmU8</a>, 1.0f, 0);</div><div class="line"><a name="l00289"></a><span class="lineno">  289</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> outputInfo({  1, 16, 16, 16 }, <a class="code" href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6a0a3f57c876f5a230244c38e1453a8a6e">DataType::QAsymmU8</a>, 1.0f, 0);</div><div class="line"><a name="l00290"></a><span class="lineno">  290</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> weightInfo({ 16,  1,  1, 16 }, <a class="code" href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6a0a3f57c876f5a230244c38e1453a8a6e">DataType::QAsymmU8</a>, 0.9f, 0);</div><div class="line"><a name="l00291"></a><span class="lineno">  291</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> biasInfo  ({  1,  1,  1, 16 }, <a class="code" href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6accedffbc6e5308e33d3843e8bdc0dad7">DataType::Signed32</a>,        0.9f, 0);</div><div class="line"><a name="l00292"></a><span class="lineno">  292</span>&#160;</div><div class="line"><a name="l00293"></a><span class="lineno">  293</span>&#160;    <a class="code" href="structarmnn_1_1_convolution2d_descriptor.xhtml">Convolution2dDescriptor</a> convolutionDescriptor;</div><div class="line"><a name="l00294"></a><span class="lineno">  294</span>&#160;    convolutionDescriptor.m_StrideX     = 1;</div><div class="line"><a name="l00295"></a><span class="lineno">  295</span>&#160;    convolutionDescriptor.m_StrideY     = 1;</div><div class="line"><a name="l00296"></a><span class="lineno">  296</span>&#160;    convolutionDescriptor.m_BiasEnabled = <span class="keyword">true</span>;</div><div class="line"><a name="l00297"></a><span class="lineno">  297</span>&#160;    convolutionDescriptor.m_DataLayout  = <a class="code" href="namespacearmnn.xhtml#ad1d5cce2d9e9a5d61c243e5c989112e0ad066db54b89b0912e7e7c6da51e2da51">DataLayout::NHWC</a>;</div><div class="line"><a name="l00298"></a><span class="lineno">  298</span>&#160;</div><div class="line"><a name="l00299"></a><span class="lineno">  299</span>&#160;    <span class="comment">// Construct the graph</span></div><div class="line"><a name="l00300"></a><span class="lineno">  300</span>&#160;    <a class="code" href="classarmnn_1_1_layer.xhtml">Layer</a>* <span class="keyword">const</span> inputLayer = AddInputLayer(graph, <span class="stringliteral">&quot;input layer&quot;</span>, inputInfo);</div><div class="line"><a name="l00301"></a><span class="lineno">  301</span>&#160;    <a class="code" href="classarmnn_1_1_convolution2d_layer.xhtml">Convolution2dLayer</a>* <span class="keyword">const</span> convLayer = AddConvolutionLayer(graph, layersInGraph, convolutionDescriptor,</div><div class="line"><a name="l00302"></a><span class="lineno">  302</span>&#160;                                                              <span class="stringliteral">&quot;conv layer&quot;</span>, weightInfo, biasInfo, outputInfo);</div><div class="line"><a name="l00303"></a><span class="lineno">  303</span>&#160;    <a class="code" href="classarmnn_1_1_layer.xhtml">Layer</a>* <span class="keyword">const</span> outputLayer = AddOutputLayer(graph, <span class="stringliteral">&quot;output layer&quot;</span>);</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;    <span class="comment">// Connect the network</span></div><div class="line"><a name="l00306"></a><span class="lineno">  306</span>&#160;    inputLayer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#a0e36688a43c35668d8db5257274c68fe">GetOutputSlot</a>(0).<a class="code" href="classarmnn_1_1_output_slot.xhtml#adcfb97035799ea4c043f9ef370714815">Connect</a>(convLayer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#acf8b8e23bf647836592982f97088d375">GetInputSlot</a>(0));</div><div class="line"><a name="l00307"></a><span class="lineno">  307</span>&#160;    convLayer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#a0e36688a43c35668d8db5257274c68fe">GetOutputSlot</a>(0).<a class="code" href="classarmnn_1_1_output_slot.xhtml#adcfb97035799ea4c043f9ef370714815">Connect</a>(outputLayer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#acf8b8e23bf647836592982f97088d375">GetInputSlot</a>(0));</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="comment">// Create the subgraph view for the whole network</span></div><div class="line"><a name="l00310"></a><span class="lineno">  310</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="_common_test_utils_8cpp.xhtml#a3ed487c53d08c08186837be90030a855">CreateSubgraphViewFrom</a>(<a class="code" href="_common_test_utils_8cpp.xhtml#a9892eac8f1b8ed9cea0baf643fb6d951">CreateInputsFrom</a>({convLayer}),</div><div class="line"><a name="l00311"></a><span class="lineno">  311</span>&#160;                                  <a class="code" href="_common_test_utils_8cpp.xhtml#ae405c72b6d52a1bf4b3471032e76e3f0">CreateOutputsFrom</a>({convLayer}),</div><div class="line"><a name="l00312"></a><span class="lineno">  312</span>&#160;                                  {convLayer});</div><div class="line"><a name="l00313"></a><span class="lineno">  313</span>&#160;}</div><div class="line"><a name="l00314"></a><span class="lineno">  314</span>&#160;</div><div class="line"><a name="l00315"></a><span class="lineno">  315</span>&#160;<span class="comment">// Creates a subgraph with five convolutions layers, all supported by the mock backend</span></div><div class="line"><a name="l00316"></a><span class="lineno">  316</span>&#160;<a class="code" href="classarmnn_1_1_subgraph_view.xhtml#a4684a457c7786484375f06e9ab2d2265">SubgraphView::SubgraphViewPtr</a> BuildFullyOptimizableSubgraph2(<a class="code" href="classarmnn_1_1_graph.xhtml">Graph</a>&amp; graph, LayerNameToLayerMap&amp; layersInGraph)</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="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> inputInfo ({  1, 16, 16, 16 }, <a class="code" href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6a0a3f57c876f5a230244c38e1453a8a6e">DataType::QAsymmU8</a>, 1.0f, 0);</div><div class="line"><a name="l00319"></a><span class="lineno">  319</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> outputInfo({  1, 16, 16, 16 }, <a class="code" href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6a0a3f57c876f5a230244c38e1453a8a6e">DataType::QAsymmU8</a>, 1.0f, 0);</div><div class="line"><a name="l00320"></a><span class="lineno">  320</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> weightInfo({ 16,  1,  1, 16 }, <a class="code" href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6a0a3f57c876f5a230244c38e1453a8a6e">DataType::QAsymmU8</a>, 0.9f, 0);</div><div class="line"><a name="l00321"></a><span class="lineno">  321</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> biasInfo  ({  1,  1,  1, 16 }, <a class="code" href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6accedffbc6e5308e33d3843e8bdc0dad7">DataType::Signed32</a>,        0.9f, 0);</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;    <a class="code" href="structarmnn_1_1_convolution2d_descriptor.xhtml">Convolution2dDescriptor</a> convolutionDescriptor;</div><div class="line"><a name="l00324"></a><span class="lineno">  324</span>&#160;    convolutionDescriptor.<a class="code" href="structarmnn_1_1_convolution2d_descriptor.xhtml#afe6a3377c4531315354def9023c8fdda">m_StrideX</a>     = 1;</div><div class="line"><a name="l00325"></a><span class="lineno">  325</span>&#160;    convolutionDescriptor.m_StrideY     = 1;</div><div class="line"><a name="l00326"></a><span class="lineno">  326</span>&#160;    convolutionDescriptor.m_BiasEnabled = <span class="keyword">true</span>;</div><div class="line"><a name="l00327"></a><span class="lineno">  327</span>&#160;    convolutionDescriptor.m_DataLayout  = <a class="code" href="namespacearmnn.xhtml#ad1d5cce2d9e9a5d61c243e5c989112e0ad066db54b89b0912e7e7c6da51e2da51">DataLayout::NHWC</a>;</div><div class="line"><a name="l00328"></a><span class="lineno">  328</span>&#160;</div><div class="line"><a name="l00329"></a><span class="lineno">  329</span>&#160;    <span class="comment">// Construct the graph</span></div><div class="line"><a name="l00330"></a><span class="lineno">  330</span>&#160;    <a class="code" href="classarmnn_1_1_layer.xhtml">Layer</a>* <span class="keyword">const</span> inputLayer = AddInputLayer(graph, <span class="stringliteral">&quot;input layer&quot;</span>, inputInfo);</div><div class="line"><a name="l00331"></a><span class="lineno">  331</span>&#160;    <a class="code" href="classarmnn_1_1_convolution2d_layer.xhtml">Convolution2dLayer</a>* <span class="keyword">const</span> conv1Layer = AddConvolutionLayer(graph, layersInGraph, convolutionDescriptor,</div><div class="line"><a name="l00332"></a><span class="lineno">  332</span>&#160;                                                               <span class="stringliteral">&quot;conv1 layer&quot;</span>, weightInfo, biasInfo, outputInfo);</div><div class="line"><a name="l00333"></a><span class="lineno">  333</span>&#160;    <a class="code" href="classarmnn_1_1_convolution2d_layer.xhtml">Convolution2dLayer</a>* <span class="keyword">const</span> conv2Layer = AddConvolutionLayer(graph, layersInGraph, convolutionDescriptor,</div><div class="line"><a name="l00334"></a><span class="lineno">  334</span>&#160;                                                               <span class="stringliteral">&quot;conv2 layer&quot;</span>, weightInfo, biasInfo, outputInfo);</div><div class="line"><a name="l00335"></a><span class="lineno">  335</span>&#160;    <a class="code" href="classarmnn_1_1_convolution2d_layer.xhtml">Convolution2dLayer</a>* <span class="keyword">const</span> conv3Layer = AddConvolutionLayer(graph, layersInGraph, convolutionDescriptor,</div><div class="line"><a name="l00336"></a><span class="lineno">  336</span>&#160;                                                               <span class="stringliteral">&quot;conv3 layer&quot;</span>, weightInfo, biasInfo, outputInfo);</div><div class="line"><a name="l00337"></a><span class="lineno">  337</span>&#160;    <a class="code" href="classarmnn_1_1_convolution2d_layer.xhtml">Convolution2dLayer</a>* <span class="keyword">const</span> conv4Layer = AddConvolutionLayer(graph, layersInGraph, convolutionDescriptor,</div><div class="line"><a name="l00338"></a><span class="lineno">  338</span>&#160;                                                               <span class="stringliteral">&quot;conv4 layer&quot;</span>, weightInfo, biasInfo, outputInfo);</div><div class="line"><a name="l00339"></a><span class="lineno">  339</span>&#160;    <a class="code" href="classarmnn_1_1_convolution2d_layer.xhtml">Convolution2dLayer</a>* <span class="keyword">const</span> conv5Layer = AddConvolutionLayer(graph, layersInGraph, convolutionDescriptor,</div><div class="line"><a name="l00340"></a><span class="lineno">  340</span>&#160;                                                               <span class="stringliteral">&quot;conv5 layer&quot;</span>, weightInfo, biasInfo, outputInfo);</div><div class="line"><a name="l00341"></a><span class="lineno">  341</span>&#160;    <a class="code" href="classarmnn_1_1_layer.xhtml">Layer</a>* <span class="keyword">const</span> outputLayer = AddOutputLayer(graph, <span class="stringliteral">&quot;output layer&quot;</span>);</div><div class="line"><a name="l00342"></a><span class="lineno">  342</span>&#160;</div><div class="line"><a name="l00343"></a><span class="lineno">  343</span>&#160;    <span class="comment">// Connect the network</span></div><div class="line"><a name="l00344"></a><span class="lineno">  344</span>&#160;    inputLayer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#a0e36688a43c35668d8db5257274c68fe">GetOutputSlot</a>(0).<a class="code" href="classarmnn_1_1_output_slot.xhtml#adcfb97035799ea4c043f9ef370714815">Connect</a>(conv1Layer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#acf8b8e23bf647836592982f97088d375">GetInputSlot</a>(0));</div><div class="line"><a name="l00345"></a><span class="lineno">  345</span>&#160;    conv1Layer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#a0e36688a43c35668d8db5257274c68fe">GetOutputSlot</a>(0).<a class="code" href="classarmnn_1_1_output_slot.xhtml#adcfb97035799ea4c043f9ef370714815">Connect</a>(conv2Layer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#acf8b8e23bf647836592982f97088d375">GetInputSlot</a>(0));</div><div class="line"><a name="l00346"></a><span class="lineno">  346</span>&#160;    conv2Layer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#a0e36688a43c35668d8db5257274c68fe">GetOutputSlot</a>(0).<a class="code" href="classarmnn_1_1_output_slot.xhtml#adcfb97035799ea4c043f9ef370714815">Connect</a>(conv3Layer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#acf8b8e23bf647836592982f97088d375">GetInputSlot</a>(0));</div><div class="line"><a name="l00347"></a><span class="lineno">  347</span>&#160;    conv3Layer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#a0e36688a43c35668d8db5257274c68fe">GetOutputSlot</a>(0).<a class="code" href="classarmnn_1_1_output_slot.xhtml#adcfb97035799ea4c043f9ef370714815">Connect</a>(conv4Layer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#acf8b8e23bf647836592982f97088d375">GetInputSlot</a>(0));</div><div class="line"><a name="l00348"></a><span class="lineno">  348</span>&#160;    conv4Layer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#a0e36688a43c35668d8db5257274c68fe">GetOutputSlot</a>(0).<a class="code" href="classarmnn_1_1_output_slot.xhtml#adcfb97035799ea4c043f9ef370714815">Connect</a>(conv5Layer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#acf8b8e23bf647836592982f97088d375">GetInputSlot</a>(0));</div><div class="line"><a name="l00349"></a><span class="lineno">  349</span>&#160;    conv5Layer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#a0e36688a43c35668d8db5257274c68fe">GetOutputSlot</a>(0).<a class="code" href="classarmnn_1_1_output_slot.xhtml#adcfb97035799ea4c043f9ef370714815">Connect</a>(outputLayer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#acf8b8e23bf647836592982f97088d375">GetInputSlot</a>(0));</div><div class="line"><a name="l00350"></a><span class="lineno">  350</span>&#160;</div><div class="line"><a name="l00351"></a><span class="lineno">  351</span>&#160;    <span class="comment">// Create the subgraph view for the whole network</span></div><div class="line"><a name="l00352"></a><span class="lineno">  352</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="_common_test_utils_8cpp.xhtml#a3ed487c53d08c08186837be90030a855">CreateSubgraphViewFrom</a>(<a class="code" href="_common_test_utils_8cpp.xhtml#a9892eac8f1b8ed9cea0baf643fb6d951">CreateInputsFrom</a>({conv1Layer}),</div><div class="line"><a name="l00353"></a><span class="lineno">  353</span>&#160;                                  <a class="code" href="_common_test_utils_8cpp.xhtml#ae405c72b6d52a1bf4b3471032e76e3f0">CreateOutputsFrom</a>({conv5Layer}),</div><div class="line"><a name="l00354"></a><span class="lineno">  354</span>&#160;                                  {conv1Layer,</div><div class="line"><a name="l00355"></a><span class="lineno">  355</span>&#160;                                   conv2Layer,</div><div class="line"><a name="l00356"></a><span class="lineno">  356</span>&#160;                                   conv3Layer,</div><div class="line"><a name="l00357"></a><span class="lineno">  357</span>&#160;                                   conv4Layer,</div><div class="line"><a name="l00358"></a><span class="lineno">  358</span>&#160;                                   conv5Layer});</div><div class="line"><a name="l00359"></a><span class="lineno">  359</span>&#160;}</div><div class="line"><a name="l00360"></a><span class="lineno">  360</span>&#160;</div><div class="line"><a name="l00361"></a><span class="lineno">  361</span>&#160;<span class="comment">// Creates a subgraph with both supported and unsupported layers</span></div><div class="line"><a name="l00362"></a><span class="lineno">  362</span>&#160;<span class="comment">// (only convolutions are unsupported by the mock backend)</span></div><div class="line"><a name="l00363"></a><span class="lineno">  363</span>&#160;<a class="code" href="classarmnn_1_1_subgraph_view.xhtml#a4684a457c7786484375f06e9ab2d2265">SubgraphView::SubgraphViewPtr</a> BuildPartiallySupportedSubgraph(<a class="code" href="classarmnn_1_1_graph.xhtml">Graph</a>&amp; graph, LayerNameToLayerMap&amp; layersInGraph)</div><div class="line"><a name="l00364"></a><span class="lineno">  364</span>&#160;{</div><div class="line"><a name="l00365"></a><span class="lineno">  365</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> inputInfo ({  1, 16, 16, 16 }, <a class="code" href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6a0a3f57c876f5a230244c38e1453a8a6e">DataType::QAsymmU8</a>, 1.0f, 0);</div><div class="line"><a name="l00366"></a><span class="lineno">  366</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> outputInfo({  1, 16, 16, 16 }, <a class="code" href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6a0a3f57c876f5a230244c38e1453a8a6e">DataType::QAsymmU8</a>, 1.0f, 0);</div><div class="line"><a name="l00367"></a><span class="lineno">  367</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> weightInfo({ 16,  1,  1, 16 }, <a class="code" href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6a0a3f57c876f5a230244c38e1453a8a6e">DataType::QAsymmU8</a>, 0.9f, 0);</div><div class="line"><a name="l00368"></a><span class="lineno">  368</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> biasInfo  ({  1,  1,  1, 16 }, <a class="code" href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6accedffbc6e5308e33d3843e8bdc0dad7">DataType::Signed32</a>,        0.9f, 0);</div><div class="line"><a name="l00369"></a><span class="lineno">  369</span>&#160;</div><div class="line"><a name="l00370"></a><span class="lineno">  370</span>&#160;    <a class="code" href="structarmnn_1_1_convolution2d_descriptor.xhtml">Convolution2dDescriptor</a> convolutionDescriptor;</div><div class="line"><a name="l00371"></a><span class="lineno">  371</span>&#160;    convolutionDescriptor.<a class="code" href="structarmnn_1_1_convolution2d_descriptor.xhtml#afe6a3377c4531315354def9023c8fdda">m_StrideX</a>     = 1;</div><div class="line"><a name="l00372"></a><span class="lineno">  372</span>&#160;    convolutionDescriptor.m_StrideY     = 1;</div><div class="line"><a name="l00373"></a><span class="lineno">  373</span>&#160;    convolutionDescriptor.m_BiasEnabled = <span class="keyword">true</span>;</div><div class="line"><a name="l00374"></a><span class="lineno">  374</span>&#160;    convolutionDescriptor.m_DataLayout  = <a class="code" href="namespacearmnn.xhtml#ad1d5cce2d9e9a5d61c243e5c989112e0ad066db54b89b0912e7e7c6da51e2da51">DataLayout::NHWC</a>;</div><div class="line"><a name="l00375"></a><span class="lineno">  375</span>&#160;</div><div class="line"><a name="l00376"></a><span class="lineno">  376</span>&#160;    <a class="code" href="structarmnn_1_1_pooling2d_descriptor.xhtml">Pooling2dDescriptor</a> poolingDescriptor;</div><div class="line"><a name="l00377"></a><span class="lineno">  377</span>&#160;    poolingDescriptor.<a class="code" href="structarmnn_1_1_pooling2d_descriptor.xhtml#a0031997bf43bd2747656c31e4977793a">m_PoolType</a>      = <a class="code" href="namespacearmnn.xhtml#a961bbfe1db71a848eff5a1f0ab775718ab1897515d548a960afe49ecf66a29021">armnn::PoolingAlgorithm::Average</a>;</div><div class="line"><a name="l00378"></a><span class="lineno">  378</span>&#160;    poolingDescriptor.<a class="code" href="structarmnn_1_1_pooling2d_descriptor.xhtml#a6d8fb685cc1ff224f25aa127fcf62c86">m_PoolWidth</a>     = 2;</div><div class="line"><a name="l00379"></a><span class="lineno">  379</span>&#160;    poolingDescriptor.<a class="code" href="structarmnn_1_1_pooling2d_descriptor.xhtml#a5699e8606c37d18c03910b242cd1b010">m_PoolHeight</a>    = 2;</div><div class="line"><a name="l00380"></a><span class="lineno">  380</span>&#160;    poolingDescriptor.<a class="code" href="structarmnn_1_1_pooling2d_descriptor.xhtml#afe6a3377c4531315354def9023c8fdda">m_StrideX</a>       = 2;</div><div class="line"><a name="l00381"></a><span class="lineno">  381</span>&#160;    poolingDescriptor.<a class="code" href="structarmnn_1_1_pooling2d_descriptor.xhtml#ac1fe174bbadfb39a2b636940c2e647c8">m_StrideY</a>       = 2;</div><div class="line"><a name="l00382"></a><span class="lineno">  382</span>&#160;    poolingDescriptor.<a class="code" href="structarmnn_1_1_pooling2d_descriptor.xhtml#ac18546ebbebbb32fe0a03baa9bf2c600">m_PadLeft</a>       = 1;</div><div class="line"><a name="l00383"></a><span class="lineno">  383</span>&#160;    poolingDescriptor.<a class="code" href="structarmnn_1_1_pooling2d_descriptor.xhtml#a002bc30e590d78cbb4f4d12171055ca7">m_PadRight</a>      = 1;</div><div class="line"><a name="l00384"></a><span class="lineno">  384</span>&#160;    poolingDescriptor.<a class="code" href="structarmnn_1_1_pooling2d_descriptor.xhtml#a56b51f56cef50cdfa554258eecdab046">m_PadTop</a>        = 1;</div><div class="line"><a name="l00385"></a><span class="lineno">  385</span>&#160;    poolingDescriptor.<a class="code" href="structarmnn_1_1_pooling2d_descriptor.xhtml#aa9e49717ebdb741e8c767741647fc618">m_PadBottom</a>     = 1;</div><div class="line"><a name="l00386"></a><span class="lineno">  386</span>&#160;    poolingDescriptor.<a class="code" href="structarmnn_1_1_pooling2d_descriptor.xhtml#a8c29d6ea9b4186d69aad5961c910939c">m_PaddingMethod</a> = <a class="code" href="namespacearmnn.xhtml#a3888429b6ebc79f9a7df549e5e4d9a2fa843f2812f595e7ec7c5036e89fde02d6">armnn::PaddingMethod::Exclude</a>;</div><div class="line"><a name="l00387"></a><span class="lineno">  387</span>&#160;    poolingDescriptor.<a class="code" href="structarmnn_1_1_pooling2d_descriptor.xhtml#a6089e1ca91914015777ea780a513131a">m_DataLayout</a>    = <a class="code" href="namespacearmnn.xhtml#ad1d5cce2d9e9a5d61c243e5c989112e0ad066db54b89b0912e7e7c6da51e2da51">DataLayout::NHWC</a>;</div><div class="line"><a name="l00388"></a><span class="lineno">  388</span>&#160;</div><div class="line"><a name="l00389"></a><span class="lineno">  389</span>&#160;    <span class="comment">// Construct the graph</span></div><div class="line"><a name="l00390"></a><span class="lineno">  390</span>&#160;    <a class="code" href="classarmnn_1_1_layer.xhtml">Layer</a>* <span class="keyword">const</span> inputLayer = AddInputLayer(graph, <span class="stringliteral">&quot;input layer&quot;</span>, inputInfo);</div><div class="line"><a name="l00391"></a><span class="lineno">  391</span>&#160;    <a class="code" href="classarmnn_1_1_convolution2d_layer.xhtml">Convolution2dLayer</a>* <span class="keyword">const</span> conv1Layer = AddConvolutionLayer(graph, layersInGraph, convolutionDescriptor,</div><div class="line"><a name="l00392"></a><span class="lineno">  392</span>&#160;                                                               <span class="stringliteral">&quot;conv1 layer&quot;</span>, weightInfo, biasInfo, outputInfo);</div><div class="line"><a name="l00393"></a><span class="lineno">  393</span>&#160;    <a class="code" href="classarmnn_1_1_pooling2d_layer.xhtml">Pooling2dLayer</a>* <span class="keyword">const</span> pooling1Layer = AddPoolingLayer(graph, layersInGraph, poolingDescriptor,</div><div class="line"><a name="l00394"></a><span class="lineno">  394</span>&#160;                                                          <span class="stringliteral">&quot;pooling1 layer&quot;</span>, outputInfo);</div><div class="line"><a name="l00395"></a><span class="lineno">  395</span>&#160;    <a class="code" href="classarmnn_1_1_pooling2d_layer.xhtml">Pooling2dLayer</a>* <span class="keyword">const</span> pooling2Layer = AddPoolingLayer(graph, layersInGraph, poolingDescriptor,</div><div class="line"><a name="l00396"></a><span class="lineno">  396</span>&#160;                                                          <span class="stringliteral">&quot;pooling2 layer&quot;</span>, outputInfo);</div><div class="line"><a name="l00397"></a><span class="lineno">  397</span>&#160;    <a class="code" href="classarmnn_1_1_convolution2d_layer.xhtml">Convolution2dLayer</a>* <span class="keyword">const</span> conv2Layer = AddConvolutionLayer(graph, layersInGraph, convolutionDescriptor,</div><div class="line"><a name="l00398"></a><span class="lineno">  398</span>&#160;                                                               <span class="stringliteral">&quot;conv2 layer&quot;</span>, weightInfo, biasInfo, outputInfo);</div><div class="line"><a name="l00399"></a><span class="lineno">  399</span>&#160;    <a class="code" href="classarmnn_1_1_pooling2d_layer.xhtml">Pooling2dLayer</a>* <span class="keyword">const</span> pooling3Layer = AddPoolingLayer(graph, layersInGraph, poolingDescriptor,</div><div class="line"><a name="l00400"></a><span class="lineno">  400</span>&#160;                                                          <span class="stringliteral">&quot;pooling3 layer&quot;</span>, outputInfo);</div><div class="line"><a name="l00401"></a><span class="lineno">  401</span>&#160;    <a class="code" href="classarmnn_1_1_layer.xhtml">Layer</a>* <span class="keyword">const</span> outputLayer = AddOutputLayer(graph, <span class="stringliteral">&quot;output layer&quot;</span>);</div><div class="line"><a name="l00402"></a><span class="lineno">  402</span>&#160;</div><div class="line"><a name="l00403"></a><span class="lineno">  403</span>&#160;    <span class="comment">// Connect the network</span></div><div class="line"><a name="l00404"></a><span class="lineno">  404</span>&#160;    inputLayer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#a0e36688a43c35668d8db5257274c68fe">GetOutputSlot</a>(0).<a class="code" href="classarmnn_1_1_output_slot.xhtml#adcfb97035799ea4c043f9ef370714815">Connect</a>(conv1Layer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#acf8b8e23bf647836592982f97088d375">GetInputSlot</a>(0));</div><div class="line"><a name="l00405"></a><span class="lineno">  405</span>&#160;    conv1Layer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#a0e36688a43c35668d8db5257274c68fe">GetOutputSlot</a>(0).<a class="code" href="classarmnn_1_1_output_slot.xhtml#adcfb97035799ea4c043f9ef370714815">Connect</a>(pooling1Layer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#acf8b8e23bf647836592982f97088d375">GetInputSlot</a>(0));</div><div class="line"><a name="l00406"></a><span class="lineno">  406</span>&#160;    pooling1Layer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#a0e36688a43c35668d8db5257274c68fe">GetOutputSlot</a>(0).<a class="code" href="classarmnn_1_1_output_slot.xhtml#adcfb97035799ea4c043f9ef370714815">Connect</a>(pooling2Layer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#acf8b8e23bf647836592982f97088d375">GetInputSlot</a>(0));</div><div class="line"><a name="l00407"></a><span class="lineno">  407</span>&#160;    pooling2Layer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#a0e36688a43c35668d8db5257274c68fe">GetOutputSlot</a>(0).<a class="code" href="classarmnn_1_1_output_slot.xhtml#adcfb97035799ea4c043f9ef370714815">Connect</a>(conv2Layer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#acf8b8e23bf647836592982f97088d375">GetInputSlot</a>(0));</div><div class="line"><a name="l00408"></a><span class="lineno">  408</span>&#160;    conv2Layer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#a0e36688a43c35668d8db5257274c68fe">GetOutputSlot</a>(0).<a class="code" href="classarmnn_1_1_output_slot.xhtml#adcfb97035799ea4c043f9ef370714815">Connect</a>(pooling3Layer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#acf8b8e23bf647836592982f97088d375">GetInputSlot</a>(0));</div><div class="line"><a name="l00409"></a><span class="lineno">  409</span>&#160;    pooling3Layer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#a0e36688a43c35668d8db5257274c68fe">GetOutputSlot</a>(0).<a class="code" href="classarmnn_1_1_output_slot.xhtml#adcfb97035799ea4c043f9ef370714815">Connect</a>(outputLayer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#acf8b8e23bf647836592982f97088d375">GetInputSlot</a>(0));</div><div class="line"><a name="l00410"></a><span class="lineno">  410</span>&#160;</div><div class="line"><a name="l00411"></a><span class="lineno">  411</span>&#160;    <span class="comment">// Create the subgraph view for the whole network</span></div><div class="line"><a name="l00412"></a><span class="lineno">  412</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="_common_test_utils_8cpp.xhtml#a3ed487c53d08c08186837be90030a855">CreateSubgraphViewFrom</a>(<a class="code" href="_common_test_utils_8cpp.xhtml#a9892eac8f1b8ed9cea0baf643fb6d951">CreateInputsFrom</a>({conv1Layer}),</div><div class="line"><a name="l00413"></a><span class="lineno">  413</span>&#160;                                  <a class="code" href="_common_test_utils_8cpp.xhtml#ae405c72b6d52a1bf4b3471032e76e3f0">CreateOutputsFrom</a>({pooling3Layer}),</div><div class="line"><a name="l00414"></a><span class="lineno">  414</span>&#160;                                  {conv1Layer,</div><div class="line"><a name="l00415"></a><span class="lineno">  415</span>&#160;                                   pooling1Layer,</div><div class="line"><a name="l00416"></a><span class="lineno">  416</span>&#160;                                   pooling2Layer,</div><div class="line"><a name="l00417"></a><span class="lineno">  417</span>&#160;                                   conv2Layer,</div><div class="line"><a name="l00418"></a><span class="lineno">  418</span>&#160;                                   pooling3Layer});</div><div class="line"><a name="l00419"></a><span class="lineno">  419</span>&#160;}</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="comment">// Creates a subgraph with only unoptimizable layers (&quot;unoptimizable&quot; is added to the layer&#39;s name)</span></div><div class="line"><a name="l00422"></a><span class="lineno">  422</span>&#160;<a class="code" href="classarmnn_1_1_subgraph_view.xhtml#a4684a457c7786484375f06e9ab2d2265">SubgraphView::SubgraphViewPtr</a> BuildFullyUnoptimizableSubgraph1(<a class="code" href="classarmnn_1_1_graph.xhtml">Graph</a>&amp; graph, LayerNameToLayerMap&amp; layersInGraph)</div><div class="line"><a name="l00423"></a><span class="lineno">  423</span>&#160;{</div><div class="line"><a name="l00424"></a><span class="lineno">  424</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> inputInfo ({  1, 16, 16, 16 }, <a class="code" href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6a0a3f57c876f5a230244c38e1453a8a6e">DataType::QAsymmU8</a>, 1.0f, 0);</div><div class="line"><a name="l00425"></a><span class="lineno">  425</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> outputInfo({  1, 16, 16, 16 }, <a class="code" href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6a0a3f57c876f5a230244c38e1453a8a6e">DataType::QAsymmU8</a>, 1.0f, 0);</div><div class="line"><a name="l00426"></a><span class="lineno">  426</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> weightInfo({ 16,  1,  1, 16 }, <a class="code" href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6a0a3f57c876f5a230244c38e1453a8a6e">DataType::QAsymmU8</a>, 0.9f, 0);</div><div class="line"><a name="l00427"></a><span class="lineno">  427</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> biasInfo  ({  1,  1,  1, 16 }, <a class="code" href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6accedffbc6e5308e33d3843e8bdc0dad7">DataType::Signed32</a>,        0.9f, 0);</div><div class="line"><a name="l00428"></a><span class="lineno">  428</span>&#160;</div><div class="line"><a name="l00429"></a><span class="lineno">  429</span>&#160;    <a class="code" href="structarmnn_1_1_convolution2d_descriptor.xhtml">Convolution2dDescriptor</a> convolutionDescriptor;</div><div class="line"><a name="l00430"></a><span class="lineno">  430</span>&#160;    convolutionDescriptor.<a class="code" href="structarmnn_1_1_convolution2d_descriptor.xhtml#afe6a3377c4531315354def9023c8fdda">m_StrideX</a>     = 1;</div><div class="line"><a name="l00431"></a><span class="lineno">  431</span>&#160;    convolutionDescriptor.m_StrideY     = 1;</div><div class="line"><a name="l00432"></a><span class="lineno">  432</span>&#160;    convolutionDescriptor.m_BiasEnabled = <span class="keyword">true</span>;</div><div class="line"><a name="l00433"></a><span class="lineno">  433</span>&#160;    convolutionDescriptor.m_DataLayout  = <a class="code" href="namespacearmnn.xhtml#ad1d5cce2d9e9a5d61c243e5c989112e0ad066db54b89b0912e7e7c6da51e2da51">DataLayout::NHWC</a>;</div><div class="line"><a name="l00434"></a><span class="lineno">  434</span>&#160;</div><div class="line"><a name="l00435"></a><span class="lineno">  435</span>&#160;    <span class="comment">// Construct the graph</span></div><div class="line"><a name="l00436"></a><span class="lineno">  436</span>&#160;    <a class="code" href="classarmnn_1_1_layer.xhtml">Layer</a>* <span class="keyword">const</span> inputLayer = AddInputLayer(graph, <span class="stringliteral">&quot;input layer&quot;</span>, inputInfo);</div><div class="line"><a name="l00437"></a><span class="lineno">  437</span>&#160;    <a class="code" href="classarmnn_1_1_convolution2d_layer.xhtml">Convolution2dLayer</a>* <span class="keyword">const</span> convLayer = AddConvolutionLayer(graph, layersInGraph, convolutionDescriptor,</div><div class="line"><a name="l00438"></a><span class="lineno">  438</span>&#160;                                                               <span class="stringliteral">&quot;conv layer unoptimizable&quot;</span>, weightInfo, biasInfo,</div><div class="line"><a name="l00439"></a><span class="lineno">  439</span>&#160;                                                               outputInfo);</div><div class="line"><a name="l00440"></a><span class="lineno">  440</span>&#160;    <a class="code" href="classarmnn_1_1_layer.xhtml">Layer</a>* <span class="keyword">const</span> outputLayer = AddOutputLayer(graph, <span class="stringliteral">&quot;output layer&quot;</span>);</div><div class="line"><a name="l00441"></a><span class="lineno">  441</span>&#160;</div><div class="line"><a name="l00442"></a><span class="lineno">  442</span>&#160;    <span class="comment">// Connect the network</span></div><div class="line"><a name="l00443"></a><span class="lineno">  443</span>&#160;    inputLayer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#a0e36688a43c35668d8db5257274c68fe">GetOutputSlot</a>(0).<a class="code" href="classarmnn_1_1_output_slot.xhtml#adcfb97035799ea4c043f9ef370714815">Connect</a>(convLayer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#acf8b8e23bf647836592982f97088d375">GetInputSlot</a>(0));</div><div class="line"><a name="l00444"></a><span class="lineno">  444</span>&#160;    convLayer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#a0e36688a43c35668d8db5257274c68fe">GetOutputSlot</a>(0).<a class="code" href="classarmnn_1_1_output_slot.xhtml#adcfb97035799ea4c043f9ef370714815">Connect</a>(outputLayer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#acf8b8e23bf647836592982f97088d375">GetInputSlot</a>(0));</div><div class="line"><a name="l00445"></a><span class="lineno">  445</span>&#160;</div><div class="line"><a name="l00446"></a><span class="lineno">  446</span>&#160;    <span class="comment">// Create the subgraph view for the whole network</span></div><div class="line"><a name="l00447"></a><span class="lineno">  447</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="_common_test_utils_8cpp.xhtml#a3ed487c53d08c08186837be90030a855">CreateSubgraphViewFrom</a>(<a class="code" href="_common_test_utils_8cpp.xhtml#a9892eac8f1b8ed9cea0baf643fb6d951">CreateInputsFrom</a>({convLayer}),</div><div class="line"><a name="l00448"></a><span class="lineno">  448</span>&#160;                                  <a class="code" href="_common_test_utils_8cpp.xhtml#ae405c72b6d52a1bf4b3471032e76e3f0">CreateOutputsFrom</a>({convLayer}),</div><div class="line"><a name="l00449"></a><span class="lineno">  449</span>&#160;                                  {convLayer});</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;</div><div class="line"><a name="l00452"></a><span class="lineno">  452</span>&#160;<span class="comment">// Creates a subgraph with some unoptimizable layers (&quot;unoptimizable&quot; is added to the layer&#39;s name)</span></div><div class="line"><a name="l00453"></a><span class="lineno">  453</span>&#160;<a class="code" href="classarmnn_1_1_subgraph_view.xhtml#a4684a457c7786484375f06e9ab2d2265">SubgraphView::SubgraphViewPtr</a> BuildPartiallyOptimizableSubgraph1(<a class="code" href="classarmnn_1_1_graph.xhtml">Graph</a>&amp; graph, LayerNameToLayerMap&amp; layersInGraph)</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;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> inputInfo ({  1, 16, 16, 16 }, <a class="code" href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6a0a3f57c876f5a230244c38e1453a8a6e">DataType::QAsymmU8</a>, 1.0f, 0);</div><div class="line"><a name="l00456"></a><span class="lineno">  456</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> outputInfo({  1, 16, 16, 16 }, <a class="code" href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6a0a3f57c876f5a230244c38e1453a8a6e">DataType::QAsymmU8</a>, 1.0f, 0);</div><div class="line"><a name="l00457"></a><span class="lineno">  457</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> weightInfo({ 16,  1,  1, 16 }, <a class="code" href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6a0a3f57c876f5a230244c38e1453a8a6e">DataType::QAsymmU8</a>, 0.9f, 0);</div><div class="line"><a name="l00458"></a><span class="lineno">  458</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> biasInfo  ({  1,  1,  1, 16 }, <a class="code" href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6accedffbc6e5308e33d3843e8bdc0dad7">DataType::Signed32</a>,        0.9f, 0);</div><div class="line"><a name="l00459"></a><span class="lineno">  459</span>&#160;</div><div class="line"><a name="l00460"></a><span class="lineno">  460</span>&#160;    <a class="code" href="structarmnn_1_1_convolution2d_descriptor.xhtml">Convolution2dDescriptor</a> convolutionDescriptor;</div><div class="line"><a name="l00461"></a><span class="lineno">  461</span>&#160;    convolutionDescriptor.<a class="code" href="structarmnn_1_1_convolution2d_descriptor.xhtml#afe6a3377c4531315354def9023c8fdda">m_StrideX</a>     = 1;</div><div class="line"><a name="l00462"></a><span class="lineno">  462</span>&#160;    convolutionDescriptor.m_StrideY     = 1;</div><div class="line"><a name="l00463"></a><span class="lineno">  463</span>&#160;    convolutionDescriptor.m_BiasEnabled = <span class="keyword">true</span>;</div><div class="line"><a name="l00464"></a><span class="lineno">  464</span>&#160;    convolutionDescriptor.m_DataLayout  = <a class="code" href="namespacearmnn.xhtml#ad1d5cce2d9e9a5d61c243e5c989112e0ad066db54b89b0912e7e7c6da51e2da51">DataLayout::NHWC</a>;</div><div class="line"><a name="l00465"></a><span class="lineno">  465</span>&#160;</div><div class="line"><a name="l00466"></a><span class="lineno">  466</span>&#160;    <span class="comment">// Construct the graph</span></div><div class="line"><a name="l00467"></a><span class="lineno">  467</span>&#160;    <a class="code" href="classarmnn_1_1_layer.xhtml">Layer</a>* <span class="keyword">const</span> inputLayer = AddInputLayer(graph, <span class="stringliteral">&quot;input layer&quot;</span>, inputInfo);</div><div class="line"><a name="l00468"></a><span class="lineno">  468</span>&#160;    <a class="code" href="classarmnn_1_1_convolution2d_layer.xhtml">Convolution2dLayer</a>* <span class="keyword">const</span> conv1Layer = AddConvolutionLayer(graph, layersInGraph, convolutionDescriptor,</div><div class="line"><a name="l00469"></a><span class="lineno">  469</span>&#160;                                                               <span class="stringliteral">&quot;conv1 layer&quot;</span>, weightInfo, biasInfo, outputInfo);</div><div class="line"><a name="l00470"></a><span class="lineno">  470</span>&#160;    <a class="code" href="classarmnn_1_1_convolution2d_layer.xhtml">Convolution2dLayer</a>* <span class="keyword">const</span> conv2Layer = AddConvolutionLayer(graph, layersInGraph, convolutionDescriptor,</div><div class="line"><a name="l00471"></a><span class="lineno">  471</span>&#160;                                                               <span class="stringliteral">&quot;conv2 layer unoptimizable&quot;</span>, weightInfo, biasInfo,</div><div class="line"><a name="l00472"></a><span class="lineno">  472</span>&#160;                                                               outputInfo);</div><div class="line"><a name="l00473"></a><span class="lineno">  473</span>&#160;    <a class="code" href="classarmnn_1_1_convolution2d_layer.xhtml">Convolution2dLayer</a>* <span class="keyword">const</span> conv3Layer = AddConvolutionLayer(graph, layersInGraph, convolutionDescriptor,</div><div class="line"><a name="l00474"></a><span class="lineno">  474</span>&#160;                                                               <span class="stringliteral">&quot;conv3 layer&quot;</span>, weightInfo, biasInfo, outputInfo);</div><div class="line"><a name="l00475"></a><span class="lineno">  475</span>&#160;    <a class="code" href="classarmnn_1_1_convolution2d_layer.xhtml">Convolution2dLayer</a>* <span class="keyword">const</span> conv4Layer = AddConvolutionLayer(graph, layersInGraph, convolutionDescriptor,</div><div class="line"><a name="l00476"></a><span class="lineno">  476</span>&#160;                                                               <span class="stringliteral">&quot;conv4 layer unoptimizable&quot;</span>, weightInfo, biasInfo,</div><div class="line"><a name="l00477"></a><span class="lineno">  477</span>&#160;                                                               outputInfo);</div><div class="line"><a name="l00478"></a><span class="lineno">  478</span>&#160;    <a class="code" href="classarmnn_1_1_convolution2d_layer.xhtml">Convolution2dLayer</a>* <span class="keyword">const</span> conv5Layer = AddConvolutionLayer(graph, layersInGraph, convolutionDescriptor,</div><div class="line"><a name="l00479"></a><span class="lineno">  479</span>&#160;                                                               <span class="stringliteral">&quot;conv5 layer&quot;</span>, weightInfo, biasInfo, outputInfo);</div><div class="line"><a name="l00480"></a><span class="lineno">  480</span>&#160;    <a class="code" href="classarmnn_1_1_layer.xhtml">Layer</a>* <span class="keyword">const</span> outputLayer = AddOutputLayer(graph, <span class="stringliteral">&quot;output layer&quot;</span>);</div><div class="line"><a name="l00481"></a><span class="lineno">  481</span>&#160;</div><div class="line"><a name="l00482"></a><span class="lineno">  482</span>&#160;    <span class="comment">// Connect the network</span></div><div class="line"><a name="l00483"></a><span class="lineno">  483</span>&#160;    inputLayer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#a0e36688a43c35668d8db5257274c68fe">GetOutputSlot</a>(0).<a class="code" href="classarmnn_1_1_output_slot.xhtml#adcfb97035799ea4c043f9ef370714815">Connect</a>(conv1Layer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#acf8b8e23bf647836592982f97088d375">GetInputSlot</a>(0));</div><div class="line"><a name="l00484"></a><span class="lineno">  484</span>&#160;    conv1Layer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#a0e36688a43c35668d8db5257274c68fe">GetOutputSlot</a>(0).<a class="code" href="classarmnn_1_1_output_slot.xhtml#adcfb97035799ea4c043f9ef370714815">Connect</a>(conv2Layer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#acf8b8e23bf647836592982f97088d375">GetInputSlot</a>(0));</div><div class="line"><a name="l00485"></a><span class="lineno">  485</span>&#160;    conv2Layer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#a0e36688a43c35668d8db5257274c68fe">GetOutputSlot</a>(0).<a class="code" href="classarmnn_1_1_output_slot.xhtml#adcfb97035799ea4c043f9ef370714815">Connect</a>(conv3Layer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#acf8b8e23bf647836592982f97088d375">GetInputSlot</a>(0));</div><div class="line"><a name="l00486"></a><span class="lineno">  486</span>&#160;    conv3Layer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#a0e36688a43c35668d8db5257274c68fe">GetOutputSlot</a>(0).<a class="code" href="classarmnn_1_1_output_slot.xhtml#adcfb97035799ea4c043f9ef370714815">Connect</a>(conv4Layer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#acf8b8e23bf647836592982f97088d375">GetInputSlot</a>(0));</div><div class="line"><a name="l00487"></a><span class="lineno">  487</span>&#160;    conv4Layer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#a0e36688a43c35668d8db5257274c68fe">GetOutputSlot</a>(0).<a class="code" href="classarmnn_1_1_output_slot.xhtml#adcfb97035799ea4c043f9ef370714815">Connect</a>(conv5Layer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#acf8b8e23bf647836592982f97088d375">GetInputSlot</a>(0));</div><div class="line"><a name="l00488"></a><span class="lineno">  488</span>&#160;    conv5Layer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#a0e36688a43c35668d8db5257274c68fe">GetOutputSlot</a>(0).<a class="code" href="classarmnn_1_1_output_slot.xhtml#adcfb97035799ea4c043f9ef370714815">Connect</a>(outputLayer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#acf8b8e23bf647836592982f97088d375">GetInputSlot</a>(0));</div><div class="line"><a name="l00489"></a><span class="lineno">  489</span>&#160;</div><div class="line"><a name="l00490"></a><span class="lineno">  490</span>&#160;    <span class="comment">// Create the subgraph view for the whole network</span></div><div class="line"><a name="l00491"></a><span class="lineno">  491</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="_common_test_utils_8cpp.xhtml#a3ed487c53d08c08186837be90030a855">CreateSubgraphViewFrom</a>(<a class="code" href="_common_test_utils_8cpp.xhtml#a9892eac8f1b8ed9cea0baf643fb6d951">CreateInputsFrom</a>({conv1Layer}),</div><div class="line"><a name="l00492"></a><span class="lineno">  492</span>&#160;                                  <a class="code" href="_common_test_utils_8cpp.xhtml#ae405c72b6d52a1bf4b3471032e76e3f0">CreateOutputsFrom</a>({conv5Layer}),</div><div class="line"><a name="l00493"></a><span class="lineno">  493</span>&#160;                                  {conv1Layer,</div><div class="line"><a name="l00494"></a><span class="lineno">  494</span>&#160;                                   conv2Layer,</div><div class="line"><a name="l00495"></a><span class="lineno">  495</span>&#160;                                   conv3Layer,</div><div class="line"><a name="l00496"></a><span class="lineno">  496</span>&#160;                                   conv4Layer,</div><div class="line"><a name="l00497"></a><span class="lineno">  497</span>&#160;                                   conv5Layer});</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;</div><div class="line"><a name="l00500"></a><span class="lineno">  500</span>&#160;<span class="comment">// Creates a subgraph with some input unoptimizable layers (&quot;unoptimizable&quot; is added to the layer&#39;s name),</span></div><div class="line"><a name="l00501"></a><span class="lineno">  501</span>&#160;<span class="comment">// this is meant to test input slots coming from different layers</span></div><div class="line"><a name="l00502"></a><span class="lineno">  502</span>&#160;<a class="code" href="classarmnn_1_1_subgraph_view.xhtml#a4684a457c7786484375f06e9ab2d2265">SubgraphView::SubgraphViewPtr</a> BuildPartiallyOptimizableSubgraph2(<a class="code" href="classarmnn_1_1_graph.xhtml">Graph</a>&amp; graph, LayerNameToLayerMap&amp; layersInGraph)</div><div class="line"><a name="l00503"></a><span class="lineno">  503</span>&#160;{</div><div class="line"><a name="l00504"></a><span class="lineno">  504</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> inputInfo ({  1, 16, 16, 16 }, <a class="code" href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6a0a3f57c876f5a230244c38e1453a8a6e">DataType::QAsymmU8</a>, 1.0f, 0);</div><div class="line"><a name="l00505"></a><span class="lineno">  505</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> outputInfo({  1, 16, 16, 16 }, <a class="code" href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6a0a3f57c876f5a230244c38e1453a8a6e">DataType::QAsymmU8</a>, 1.0f, 0);</div><div class="line"><a name="l00506"></a><span class="lineno">  506</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> weightInfo({ 16,  1,  1, 16 }, <a class="code" href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6a0a3f57c876f5a230244c38e1453a8a6e">DataType::QAsymmU8</a>, 0.9f, 0);</div><div class="line"><a name="l00507"></a><span class="lineno">  507</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> biasInfo  ({  1,  1,  1, 16 }, <a class="code" href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6accedffbc6e5308e33d3843e8bdc0dad7">DataType::Signed32</a>,        0.9f, 0);</div><div class="line"><a name="l00508"></a><span class="lineno">  508</span>&#160;</div><div class="line"><a name="l00509"></a><span class="lineno">  509</span>&#160;    <a class="code" href="structarmnn_1_1_convolution2d_descriptor.xhtml">Convolution2dDescriptor</a> convolutionDescriptor;</div><div class="line"><a name="l00510"></a><span class="lineno">  510</span>&#160;    convolutionDescriptor.<a class="code" href="structarmnn_1_1_convolution2d_descriptor.xhtml#afe6a3377c4531315354def9023c8fdda">m_StrideX</a>     = 1;</div><div class="line"><a name="l00511"></a><span class="lineno">  511</span>&#160;    convolutionDescriptor.m_StrideY     = 1;</div><div class="line"><a name="l00512"></a><span class="lineno">  512</span>&#160;    convolutionDescriptor.m_BiasEnabled = <span class="keyword">true</span>;</div><div class="line"><a name="l00513"></a><span class="lineno">  513</span>&#160;    convolutionDescriptor.m_DataLayout  = <a class="code" href="namespacearmnn.xhtml#ad1d5cce2d9e9a5d61c243e5c989112e0ad066db54b89b0912e7e7c6da51e2da51">DataLayout::NHWC</a>;</div><div class="line"><a name="l00514"></a><span class="lineno">  514</span>&#160;</div><div class="line"><a name="l00515"></a><span class="lineno">  515</span>&#160;    <span class="comment">// Construct the graph</span></div><div class="line"><a name="l00516"></a><span class="lineno">  516</span>&#160;    <a class="code" href="classarmnn_1_1_layer.xhtml">Layer</a>* <span class="keyword">const</span> input1Layer = AddInputLayer(graph, <span class="stringliteral">&quot;input1 layer&quot;</span>, inputInfo, 0);</div><div class="line"><a name="l00517"></a><span class="lineno">  517</span>&#160;    <a class="code" href="classarmnn_1_1_layer.xhtml">Layer</a>* <span class="keyword">const</span> input2Layer = AddInputLayer(graph, <span class="stringliteral">&quot;input2 layer&quot;</span>, inputInfo, 1);</div><div class="line"><a name="l00518"></a><span class="lineno">  518</span>&#160;    <a class="code" href="classarmnn_1_1_convolution2d_layer.xhtml">Convolution2dLayer</a>* <span class="keyword">const</span> conv1Layer = AddConvolutionLayer(graph, layersInGraph, convolutionDescriptor,</div><div class="line"><a name="l00519"></a><span class="lineno">  519</span>&#160;                                                               <span class="stringliteral">&quot;conv1 layer&quot;</span>, weightInfo, biasInfo, outputInfo);</div><div class="line"><a name="l00520"></a><span class="lineno">  520</span>&#160;    <a class="code" href="classarmnn_1_1_convolution2d_layer.xhtml">Convolution2dLayer</a>* <span class="keyword">const</span> conv2Layer = AddConvolutionLayer(graph, layersInGraph, convolutionDescriptor,</div><div class="line"><a name="l00521"></a><span class="lineno">  521</span>&#160;                                                               <span class="stringliteral">&quot;conv2 layer unoptimizable&quot;</span>, weightInfo, biasInfo,</div><div class="line"><a name="l00522"></a><span class="lineno">  522</span>&#160;                                                               outputInfo);</div><div class="line"><a name="l00523"></a><span class="lineno">  523</span>&#160;    <a class="code" href="classarmnn_1_1_convolution2d_layer.xhtml">Convolution2dLayer</a>* <span class="keyword">const</span> conv3Layer = AddConvolutionLayer(graph, layersInGraph, convolutionDescriptor,</div><div class="line"><a name="l00524"></a><span class="lineno">  524</span>&#160;                                                               <span class="stringliteral">&quot;conv3 layer&quot;</span>, weightInfo, biasInfo, outputInfo);</div><div class="line"><a name="l00525"></a><span class="lineno">  525</span>&#160;    <a class="code" href="classarmnn_1_1_addition_layer.xhtml">AdditionLayer</a>* <span class="keyword">const</span> addLayer = AddAdditionaLayer(graph, layersInGraph, <span class="stringliteral">&quot;add layer&quot;</span>, outputInfo);</div><div class="line"><a name="l00526"></a><span class="lineno">  526</span>&#160;    <a class="code" href="classarmnn_1_1_layer.xhtml">Layer</a>* <span class="keyword">const</span> outputLayer = AddOutputLayer(graph, <span class="stringliteral">&quot;output layer&quot;</span>);</div><div class="line"><a name="l00527"></a><span class="lineno">  527</span>&#160;</div><div class="line"><a name="l00528"></a><span class="lineno">  528</span>&#160;    <span class="comment">// Connect the network</span></div><div class="line"><a name="l00529"></a><span class="lineno">  529</span>&#160;    input1Layer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#a0e36688a43c35668d8db5257274c68fe">GetOutputSlot</a>(0).<a class="code" href="classarmnn_1_1_output_slot.xhtml#adcfb97035799ea4c043f9ef370714815">Connect</a>(conv1Layer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#acf8b8e23bf647836592982f97088d375">GetInputSlot</a>(0));</div><div class="line"><a name="l00530"></a><span class="lineno">  530</span>&#160;    input2Layer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#a0e36688a43c35668d8db5257274c68fe">GetOutputSlot</a>(0).<a class="code" href="classarmnn_1_1_output_slot.xhtml#adcfb97035799ea4c043f9ef370714815">Connect</a>(conv2Layer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#acf8b8e23bf647836592982f97088d375">GetInputSlot</a>(0));</div><div class="line"><a name="l00531"></a><span class="lineno">  531</span>&#160;    conv1Layer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#a0e36688a43c35668d8db5257274c68fe">GetOutputSlot</a>(0).<a class="code" href="classarmnn_1_1_output_slot.xhtml#adcfb97035799ea4c043f9ef370714815">Connect</a>(addLayer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#acf8b8e23bf647836592982f97088d375">GetInputSlot</a>(0));</div><div class="line"><a name="l00532"></a><span class="lineno">  532</span>&#160;    conv2Layer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#a0e36688a43c35668d8db5257274c68fe">GetOutputSlot</a>(0).<a class="code" href="classarmnn_1_1_output_slot.xhtml#adcfb97035799ea4c043f9ef370714815">Connect</a>(conv3Layer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#acf8b8e23bf647836592982f97088d375">GetInputSlot</a>(0));</div><div class="line"><a name="l00533"></a><span class="lineno">  533</span>&#160;    conv3Layer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#a0e36688a43c35668d8db5257274c68fe">GetOutputSlot</a>(0).<a class="code" href="classarmnn_1_1_output_slot.xhtml#adcfb97035799ea4c043f9ef370714815">Connect</a>(addLayer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#acf8b8e23bf647836592982f97088d375">GetInputSlot</a>(1));</div><div class="line"><a name="l00534"></a><span class="lineno">  534</span>&#160;    addLayer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#a0e36688a43c35668d8db5257274c68fe">GetOutputSlot</a>(0).<a class="code" href="classarmnn_1_1_output_slot.xhtml#adcfb97035799ea4c043f9ef370714815">Connect</a>(outputLayer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#acf8b8e23bf647836592982f97088d375">GetInputSlot</a>(0));</div><div class="line"><a name="l00535"></a><span class="lineno">  535</span>&#160;</div><div class="line"><a name="l00536"></a><span class="lineno">  536</span>&#160;    <span class="comment">// Create the subgraph view for the whole network</span></div><div class="line"><a name="l00537"></a><span class="lineno">  537</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="_common_test_utils_8cpp.xhtml#a3ed487c53d08c08186837be90030a855">CreateSubgraphViewFrom</a>(<a class="code" href="_common_test_utils_8cpp.xhtml#a9892eac8f1b8ed9cea0baf643fb6d951">CreateInputsFrom</a>({conv1Layer,</div><div class="line"><a name="l00538"></a><span class="lineno">  538</span>&#160;                                                    conv2Layer}),</div><div class="line"><a name="l00539"></a><span class="lineno">  539</span>&#160;                                  <a class="code" href="_common_test_utils_8cpp.xhtml#ae405c72b6d52a1bf4b3471032e76e3f0">CreateOutputsFrom</a>({addLayer}),</div><div class="line"><a name="l00540"></a><span class="lineno">  540</span>&#160;                                  {conv1Layer,</div><div class="line"><a name="l00541"></a><span class="lineno">  541</span>&#160;                                   conv2Layer,</div><div class="line"><a name="l00542"></a><span class="lineno">  542</span>&#160;                                   conv3Layer,</div><div class="line"><a name="l00543"></a><span class="lineno">  543</span>&#160;                                   addLayer});</div><div class="line"><a name="l00544"></a><span class="lineno">  544</span>&#160;}</div><div class="line"><a name="l00545"></a><span class="lineno">  545</span>&#160;</div><div class="line"><a name="l00546"></a><span class="lineno">  546</span>&#160;<span class="comment">// The input subgraph contains only a single unsupported layer (only convolutions are unsupported by the mock backend)</span></div><div class="line"><a name="l00547"></a><span class="lineno">  547</span>&#160;<span class="keywordtype">void</span> FullyUnsupporteSubgraphTestImpl1()</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;    <a class="code" href="classarmnn_1_1_graph.xhtml">Graph</a> graph;</div><div class="line"><a name="l00550"></a><span class="lineno">  550</span>&#160;    LayerNameToLayerMap layersInGraph;</div><div class="line"><a name="l00551"></a><span class="lineno">  551</span>&#160;</div><div class="line"><a name="l00552"></a><span class="lineno">  552</span>&#160;    <span class="comment">// Create an unsupported subgraph</span></div><div class="line"><a name="l00553"></a><span class="lineno">  553</span>&#160;    <a class="code" href="classarmnn_1_1_subgraph_view.xhtml#a4684a457c7786484375f06e9ab2d2265">SubgraphView::SubgraphViewPtr</a> subgraphPtr = BuildFullyUnsupportedSubgraph1(graph, layersInGraph);</div><div class="line"><a name="l00554"></a><span class="lineno">  554</span>&#160;    BOOST_TEST((subgraphPtr != <span class="keyword">nullptr</span>));</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="keyword">const</span> <a class="code" href="classarmnn_1_1_subgraph_view.xhtml#a5cc65e15002dbc33a5c8a7d6680e9a9d">SubgraphView::InputSlots</a>&amp;  subgraphInputSlots  = subgraphPtr-&gt;GetInputSlots();</div><div class="line"><a name="l00557"></a><span class="lineno">  557</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_subgraph_view.xhtml#a78293334750ec5279eb9c96d56deaf08">SubgraphView::OutputSlots</a>&amp; subgraphOutputSlots = subgraphPtr-&gt;GetOutputSlots();</div><div class="line"><a name="l00558"></a><span class="lineno">  558</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_subgraph_view.xhtml#a74798938fdaeae75c8adfa4a7439e7f9">SubgraphView::Layers</a>&amp;      subgraphLayers      = subgraphPtr-&gt;GetLayers();</div><div class="line"><a name="l00559"></a><span class="lineno">  559</span>&#160;</div><div class="line"><a name="l00560"></a><span class="lineno">  560</span>&#160;    BOOST_TEST(subgraphInputSlots.size()  == 1);</div><div class="line"><a name="l00561"></a><span class="lineno">  561</span>&#160;    BOOST_TEST(subgraphOutputSlots.size() == 1);</div><div class="line"><a name="l00562"></a><span class="lineno">  562</span>&#160;    BOOST_TEST(subgraphLayers.size()      == 1);</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;    BOOST_TEST(<a class="code" href="_common_test_utils_8hpp.xhtml#a5fa64e793b38cf9074e6fcdb2c9c7293">Contains</a>(layersInGraph, <span class="stringliteral">&quot;pooling layer&quot;</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="comment">// Create a mock backend object</span></div><div class="line"><a name="l00567"></a><span class="lineno">  567</span>&#160;    <a class="code" href="classarmnn_1_1_mock_backend_initialiser.xhtml">MockBackendInitialiser</a> initialiser; <span class="comment">// Register the Mock Backend</span></div><div class="line"><a name="l00568"></a><span class="lineno">  568</span>&#160;    <span class="keyword">auto</span> backendObjPtr = <a class="code" href="_common_test_utils_8cpp.xhtml#a7a4090354279f08b1e27244bab25aa86">CreateBackendObject</a>(<a class="code" href="namespacearmnn.xhtml#a17955517b0d148f7ffdbffe8b46e41e0">MockBackendId</a>());</div><div class="line"><a name="l00569"></a><span class="lineno">  569</span>&#160;    BOOST_TEST((backendObjPtr != <span class="keyword">nullptr</span>));</div><div class="line"><a name="l00570"></a><span class="lineno">  570</span>&#160;</div><div class="line"><a name="l00571"></a><span class="lineno">  571</span>&#160;    <span class="comment">// Optimize the subgraph</span></div><div class="line"><a name="l00572"></a><span class="lineno">  572</span>&#160;    <a class="code" href="classarmnn_1_1_optimization_views.xhtml">OptimizationViews</a> optimizationViews;</div><div class="line"><a name="l00573"></a><span class="lineno">  573</span>&#160;</div><div class="line"><a name="l00574"></a><span class="lineno">  574</span>&#160;    <span class="comment">// Check that the optimization is carried out correctly, but no optimization is performed</span></div><div class="line"><a name="l00575"></a><span class="lineno">  575</span>&#160;    BOOST_CHECK_NO_THROW(optimizationViews = backendObjPtr-&gt;OptimizeSubgraphView(*subgraphPtr));</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="comment">// =======================================================================</span></div><div class="line"><a name="l00578"></a><span class="lineno">  578</span>&#160;    <span class="comment">// The expected results are:</span></div><div class="line"><a name="l00579"></a><span class="lineno">  579</span>&#160;    <span class="comment">//  - No substitutions</span></div><div class="line"><a name="l00580"></a><span class="lineno">  580</span>&#160;    <span class="comment">//  - Exactly one failed subgraph, corresponding to the whole original one</span></div><div class="line"><a name="l00581"></a><span class="lineno">  581</span>&#160;    <span class="comment">//  - No untouched subgraphs</span></div><div class="line"><a name="l00582"></a><span class="lineno">  582</span>&#160;    <span class="comment">// =======================================================================</span></div><div class="line"><a name="l00583"></a><span class="lineno">  583</span>&#160;</div><div class="line"><a name="l00584"></a><span class="lineno">  584</span>&#160;    <span class="comment">// -----------------------</span></div><div class="line"><a name="l00585"></a><span class="lineno">  585</span>&#160;    <span class="comment">// Check the substitutions</span></div><div class="line"><a name="l00586"></a><span class="lineno">  586</span>&#160;    <span class="comment">// -----------------------</span></div><div class="line"><a name="l00587"></a><span class="lineno">  587</span>&#160;</div><div class="line"><a name="l00588"></a><span class="lineno">  588</span>&#160;    BOOST_TEST(optimizationViews.<a class="code" href="classarmnn_1_1_optimization_views.xhtml#a9a1555f25af4a0ae2c0a1fc0ed9aded8">GetSubstitutions</a>().empty());</div><div class="line"><a name="l00589"></a><span class="lineno">  589</span>&#160;</div><div class="line"><a name="l00590"></a><span class="lineno">  590</span>&#160;    <span class="comment">// --------------------------</span></div><div class="line"><a name="l00591"></a><span class="lineno">  591</span>&#160;    <span class="comment">// Check the failed subgraphs</span></div><div class="line"><a name="l00592"></a><span class="lineno">  592</span>&#160;    <span class="comment">// --------------------------</span></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="keyword">const</span> <a class="code" href="classarmnn_1_1_optimization_views.xhtml#a4a2c55491ad3a0a6a98a884b3e3fe6d7">OptimizationViews::Subgraphs</a>&amp; failedSubgraphs = optimizationViews.<a class="code" href="classarmnn_1_1_optimization_views.xhtml#ad5fee4381bf82ffa37658dddf4d1fa01">GetFailedSubgraphs</a>();</div><div class="line"><a name="l00595"></a><span class="lineno">  595</span>&#160;    BOOST_TEST(failedSubgraphs.size() == 1);</div><div class="line"><a name="l00596"></a><span class="lineno">  596</span>&#160;</div><div class="line"><a name="l00597"></a><span class="lineno">  597</span>&#160;    CheckFailedSubgraph(failedSubgraphs.at(0),</div><div class="line"><a name="l00598"></a><span class="lineno">  598</span>&#160;                        { subgraphInputSlots.size(), subgraphOutputSlots.size(), subgraphLayers.size() },</div><div class="line"><a name="l00599"></a><span class="lineno">  599</span>&#160;                        subgraphInputSlots,</div><div class="line"><a name="l00600"></a><span class="lineno">  600</span>&#160;                        subgraphOutputSlots,</div><div class="line"><a name="l00601"></a><span class="lineno">  601</span>&#160;                        subgraphLayers);</div><div class="line"><a name="l00602"></a><span class="lineno">  602</span>&#160;</div><div class="line"><a name="l00603"></a><span class="lineno">  603</span>&#160;    <span class="comment">// -----------------------------</span></div><div class="line"><a name="l00604"></a><span class="lineno">  604</span>&#160;    <span class="comment">// Check the untouched subgraphs</span></div><div class="line"><a name="l00605"></a><span class="lineno">  605</span>&#160;    <span class="comment">// -----------------------------</span></div><div class="line"><a name="l00606"></a><span class="lineno">  606</span>&#160;</div><div class="line"><a name="l00607"></a><span class="lineno">  607</span>&#160;    BOOST_TEST(optimizationViews.<a class="code" href="classarmnn_1_1_optimization_views.xhtml#a3b4dae097ce086ce94079d09cce18703">GetUntouchedSubgraphs</a>().empty());</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;</div><div class="line"><a name="l00610"></a><span class="lineno">  610</span>&#160;<span class="comment">// The input subgraph contains only unsupported layers (only convolutions are unsupported by the mock backend)</span></div><div class="line"><a name="l00611"></a><span class="lineno">  611</span>&#160;<span class="keywordtype">void</span> FullyUnsupporteSubgraphTestImpl2()</div><div class="line"><a name="l00612"></a><span class="lineno">  612</span>&#160;{</div><div class="line"><a name="l00613"></a><span class="lineno">  613</span>&#160;    <a class="code" href="classarmnn_1_1_graph.xhtml">Graph</a> graph;</div><div class="line"><a name="l00614"></a><span class="lineno">  614</span>&#160;    LayerNameToLayerMap layersInGraph;</div><div class="line"><a name="l00615"></a><span class="lineno">  615</span>&#160;</div><div class="line"><a name="l00616"></a><span class="lineno">  616</span>&#160;    <span class="comment">// Create an unsupported subgraph</span></div><div class="line"><a name="l00617"></a><span class="lineno">  617</span>&#160;    <a class="code" href="classarmnn_1_1_subgraph_view.xhtml#a4684a457c7786484375f06e9ab2d2265">SubgraphView::SubgraphViewPtr</a> subgraphPtr = BuildFullyUnsupportedSubgraph2(graph, layersInGraph);</div><div class="line"><a name="l00618"></a><span class="lineno">  618</span>&#160;    BOOST_TEST((subgraphPtr != <span class="keyword">nullptr</span>));</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="keyword">const</span> <a class="code" href="classarmnn_1_1_subgraph_view.xhtml#a5cc65e15002dbc33a5c8a7d6680e9a9d">SubgraphView::InputSlots</a>&amp;  subgraphInputSlots  = subgraphPtr-&gt;GetInputSlots();</div><div class="line"><a name="l00621"></a><span class="lineno">  621</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_subgraph_view.xhtml#a78293334750ec5279eb9c96d56deaf08">SubgraphView::OutputSlots</a>&amp; subgraphOutputSlots = subgraphPtr-&gt;GetOutputSlots();</div><div class="line"><a name="l00622"></a><span class="lineno">  622</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_subgraph_view.xhtml#a74798938fdaeae75c8adfa4a7439e7f9">SubgraphView::Layers</a>&amp;      subgraphLayers      = subgraphPtr-&gt;GetLayers();</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;    BOOST_TEST(subgraphInputSlots.size()  == 1);</div><div class="line"><a name="l00625"></a><span class="lineno">  625</span>&#160;    BOOST_TEST(subgraphOutputSlots.size() == 1);</div><div class="line"><a name="l00626"></a><span class="lineno">  626</span>&#160;    BOOST_TEST(subgraphLayers.size()      == 3);</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;    BOOST_TEST(<a class="code" href="_common_test_utils_8hpp.xhtml#a5fa64e793b38cf9074e6fcdb2c9c7293">Contains</a>(layersInGraph, <span class="stringliteral">&quot;pooling1 layer&quot;</span>));</div><div class="line"><a name="l00629"></a><span class="lineno">  629</span>&#160;    BOOST_TEST(<a class="code" href="_common_test_utils_8hpp.xhtml#a5fa64e793b38cf9074e6fcdb2c9c7293">Contains</a>(layersInGraph, <span class="stringliteral">&quot;pooling2 layer&quot;</span>));</div><div class="line"><a name="l00630"></a><span class="lineno">  630</span>&#160;    BOOST_TEST(<a class="code" href="_common_test_utils_8hpp.xhtml#a5fa64e793b38cf9074e6fcdb2c9c7293">Contains</a>(layersInGraph, <span class="stringliteral">&quot;pooling3 layer&quot;</span>));</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;    <span class="comment">// Create a mock backend object</span></div><div class="line"><a name="l00633"></a><span class="lineno">  633</span>&#160;    <a class="code" href="classarmnn_1_1_mock_backend_initialiser.xhtml">MockBackendInitialiser</a> initialiser; <span class="comment">// Register the Mock Backend</span></div><div class="line"><a name="l00634"></a><span class="lineno">  634</span>&#160;    <span class="keyword">auto</span> backendObjPtr = <a class="code" href="_common_test_utils_8cpp.xhtml#a7a4090354279f08b1e27244bab25aa86">CreateBackendObject</a>(<a class="code" href="namespacearmnn.xhtml#a17955517b0d148f7ffdbffe8b46e41e0">MockBackendId</a>());</div><div class="line"><a name="l00635"></a><span class="lineno">  635</span>&#160;    BOOST_TEST((backendObjPtr != <span class="keyword">nullptr</span>));</div><div class="line"><a name="l00636"></a><span class="lineno">  636</span>&#160;</div><div class="line"><a name="l00637"></a><span class="lineno">  637</span>&#160;    <span class="comment">// Optimize the subgraph</span></div><div class="line"><a name="l00638"></a><span class="lineno">  638</span>&#160;    <a class="code" href="classarmnn_1_1_optimization_views.xhtml">OptimizationViews</a> optimizationViews;</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="comment">// Check that the optimization is carried out correctly, but no optimization is performed</span></div><div class="line"><a name="l00641"></a><span class="lineno">  641</span>&#160;    BOOST_CHECK_NO_THROW(optimizationViews = backendObjPtr-&gt;OptimizeSubgraphView(*subgraphPtr));</div><div class="line"><a name="l00642"></a><span class="lineno">  642</span>&#160;</div><div class="line"><a name="l00643"></a><span class="lineno">  643</span>&#160;    <span class="comment">// =======================================================================</span></div><div class="line"><a name="l00644"></a><span class="lineno">  644</span>&#160;    <span class="comment">// The expected results are:</span></div><div class="line"><a name="l00645"></a><span class="lineno">  645</span>&#160;    <span class="comment">//  - No substitutions</span></div><div class="line"><a name="l00646"></a><span class="lineno">  646</span>&#160;    <span class="comment">//  - Exactly one failed subgraph, corresponding to the whole original one</span></div><div class="line"><a name="l00647"></a><span class="lineno">  647</span>&#160;    <span class="comment">//  - No untouched subgraphs</span></div><div class="line"><a name="l00648"></a><span class="lineno">  648</span>&#160;    <span class="comment">// =======================================================================</span></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;    <span class="comment">// -----------------------</span></div><div class="line"><a name="l00651"></a><span class="lineno">  651</span>&#160;    <span class="comment">// Check the substitutions</span></div><div class="line"><a name="l00652"></a><span class="lineno">  652</span>&#160;    <span class="comment">// -----------------------</span></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;    BOOST_TEST(optimizationViews.<a class="code" href="classarmnn_1_1_optimization_views.xhtml#a9a1555f25af4a0ae2c0a1fc0ed9aded8">GetSubstitutions</a>().empty());</div><div class="line"><a name="l00655"></a><span class="lineno">  655</span>&#160;</div><div class="line"><a name="l00656"></a><span class="lineno">  656</span>&#160;    <span class="comment">// --------------------------</span></div><div class="line"><a name="l00657"></a><span class="lineno">  657</span>&#160;    <span class="comment">// Check the failed subgraphs</span></div><div class="line"><a name="l00658"></a><span class="lineno">  658</span>&#160;    <span class="comment">// --------------------------</span></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="keyword">const</span> <a class="code" href="classarmnn_1_1_optimization_views.xhtml#a4a2c55491ad3a0a6a98a884b3e3fe6d7">OptimizationViews::Subgraphs</a>&amp; failedSubgraphs = optimizationViews.<a class="code" href="classarmnn_1_1_optimization_views.xhtml#ad5fee4381bf82ffa37658dddf4d1fa01">GetFailedSubgraphs</a>();</div><div class="line"><a name="l00661"></a><span class="lineno">  661</span>&#160;    BOOST_TEST(failedSubgraphs.size() == 1);</div><div class="line"><a name="l00662"></a><span class="lineno">  662</span>&#160;</div><div class="line"><a name="l00663"></a><span class="lineno">  663</span>&#160;    std::vector&lt;Layer*&gt; expectedFailedLayers{ layersInGraph.at(<span class="stringliteral">&quot;pooling1 layer&quot;</span>),</div><div class="line"><a name="l00664"></a><span class="lineno">  664</span>&#160;                                              layersInGraph.at(<span class="stringliteral">&quot;pooling2 layer&quot;</span>),</div><div class="line"><a name="l00665"></a><span class="lineno">  665</span>&#160;                                              layersInGraph.at(<span class="stringliteral">&quot;pooling3 layer&quot;</span>) };</div><div class="line"><a name="l00666"></a><span class="lineno">  666</span>&#160;</div><div class="line"><a name="l00667"></a><span class="lineno">  667</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_subgraph_view.xhtml">SubgraphView</a>&amp; failedSubgraph = failedSubgraphs.at(0);</div><div class="line"><a name="l00668"></a><span class="lineno">  668</span>&#160;</div><div class="line"><a name="l00669"></a><span class="lineno">  669</span>&#160;    CheckFailedSubgraph(failedSubgraph,</div><div class="line"><a name="l00670"></a><span class="lineno">  670</span>&#160;                        { subgraphInputSlots.size(), subgraphOutputSlots.size(), subgraphLayers.size() },</div><div class="line"><a name="l00671"></a><span class="lineno">  671</span>&#160;                        subgraphInputSlots,</div><div class="line"><a name="l00672"></a><span class="lineno">  672</span>&#160;                        subgraphOutputSlots,</div><div class="line"><a name="l00673"></a><span class="lineno">  673</span>&#160;                        subgraphLayers);</div><div class="line"><a name="l00674"></a><span class="lineno">  674</span>&#160;</div><div class="line"><a name="l00675"></a><span class="lineno">  675</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_subgraph_view.xhtml#a74798938fdaeae75c8adfa4a7439e7f9">SubgraphView::Layers</a>&amp; failedSubgraphLayers = failedSubgraph.<a class="code" href="classarmnn_1_1_subgraph_view.xhtml#ac8ac9809196ec980b8472fbc8367697a">GetLayers</a>();</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;    BOOST_TEST(failedSubgraphLayers.front() + 0, expectedFailedLayers.at(0));</div><div class="line"><a name="l00678"></a><span class="lineno">  678</span>&#160;    BOOST_TEST(failedSubgraphLayers.front() + 1, expectedFailedLayers.at(1));</div><div class="line"><a name="l00679"></a><span class="lineno">  679</span>&#160;    BOOST_TEST(failedSubgraphLayers.front() + 2, expectedFailedLayers.at(2));</div><div class="line"><a name="l00680"></a><span class="lineno">  680</span>&#160;</div><div class="line"><a name="l00681"></a><span class="lineno">  681</span>&#160;    <span class="comment">// -----------------------------</span></div><div class="line"><a name="l00682"></a><span class="lineno">  682</span>&#160;    <span class="comment">// Check the untouched subgraphs</span></div><div class="line"><a name="l00683"></a><span class="lineno">  683</span>&#160;    <span class="comment">// -----------------------------</span></div><div class="line"><a name="l00684"></a><span class="lineno">  684</span>&#160;</div><div class="line"><a name="l00685"></a><span class="lineno">  685</span>&#160;    BOOST_TEST(optimizationViews.<a class="code" href="classarmnn_1_1_optimization_views.xhtml#a3b4dae097ce086ce94079d09cce18703">GetUntouchedSubgraphs</a>().empty());</div><div class="line"><a name="l00686"></a><span class="lineno">  686</span>&#160;}</div><div class="line"><a name="l00687"></a><span class="lineno">  687</span>&#160;</div><div class="line"><a name="l00688"></a><span class="lineno">  688</span>&#160;<span class="comment">// A simple case with only one layer (convolution) to optimize, supported by the mock backend</span></div><div class="line"><a name="l00689"></a><span class="lineno">  689</span>&#160;<span class="keywordtype">void</span> FullyOptimizableSubgraphTestImpl1()</div><div class="line"><a name="l00690"></a><span class="lineno">  690</span>&#160;{</div><div class="line"><a name="l00691"></a><span class="lineno">  691</span>&#160;    <a class="code" href="classarmnn_1_1_graph.xhtml">Graph</a> graph;</div><div class="line"><a name="l00692"></a><span class="lineno">  692</span>&#160;    LayerNameToLayerMap layersInGraph;</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="comment">// Create a fully optimizable subgraph</span></div><div class="line"><a name="l00695"></a><span class="lineno">  695</span>&#160;    <a class="code" href="classarmnn_1_1_subgraph_view_selector.xhtml#a4684a457c7786484375f06e9ab2d2265">SubgraphViewSelector::SubgraphViewPtr</a> subgraphPtr = BuildFullyOptimizableSubgraph1(graph, layersInGraph);</div><div class="line"><a name="l00696"></a><span class="lineno">  696</span>&#160;    BOOST_TEST((subgraphPtr != <span class="keyword">nullptr</span>));</div><div class="line"><a name="l00697"></a><span class="lineno">  697</span>&#160;</div><div class="line"><a name="l00698"></a><span class="lineno">  698</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_subgraph_view.xhtml#a5cc65e15002dbc33a5c8a7d6680e9a9d">SubgraphView::InputSlots</a>&amp;  subgraphInputSlots  = subgraphPtr-&gt;GetInputSlots();</div><div class="line"><a name="l00699"></a><span class="lineno">  699</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_subgraph_view.xhtml#a78293334750ec5279eb9c96d56deaf08">SubgraphView::OutputSlots</a>&amp; subgraphOutputSlots = subgraphPtr-&gt;GetOutputSlots();</div><div class="line"><a name="l00700"></a><span class="lineno">  700</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_subgraph_view.xhtml#a74798938fdaeae75c8adfa4a7439e7f9">SubgraphView::Layers</a>&amp;      subgraphLayers      = subgraphPtr-&gt;GetLayers();</div><div class="line"><a name="l00701"></a><span class="lineno">  701</span>&#160;</div><div class="line"><a name="l00702"></a><span class="lineno">  702</span>&#160;    BOOST_TEST(subgraphInputSlots.size()  == 1);</div><div class="line"><a name="l00703"></a><span class="lineno">  703</span>&#160;    BOOST_TEST(subgraphOutputSlots.size() == 1);</div><div class="line"><a name="l00704"></a><span class="lineno">  704</span>&#160;    BOOST_TEST(subgraphLayers.size()      == 1);</div><div class="line"><a name="l00705"></a><span class="lineno">  705</span>&#160;</div><div class="line"><a name="l00706"></a><span class="lineno">  706</span>&#160;    BOOST_TEST(<a class="code" href="_common_test_utils_8hpp.xhtml#a5fa64e793b38cf9074e6fcdb2c9c7293">Contains</a>(layersInGraph, <span class="stringliteral">&quot;conv layer&quot;</span>));</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="comment">// Create a mock backend object</span></div><div class="line"><a name="l00709"></a><span class="lineno">  709</span>&#160;    <a class="code" href="classarmnn_1_1_mock_backend_initialiser.xhtml">MockBackendInitialiser</a> initialiser; <span class="comment">// Register the Mock Backend</span></div><div class="line"><a name="l00710"></a><span class="lineno">  710</span>&#160;    <span class="keyword">auto</span> backendObjPtr = <a class="code" href="_common_test_utils_8cpp.xhtml#a7a4090354279f08b1e27244bab25aa86">CreateBackendObject</a>(<a class="code" href="namespacearmnn.xhtml#a17955517b0d148f7ffdbffe8b46e41e0">MockBackendId</a>());</div><div class="line"><a name="l00711"></a><span class="lineno">  711</span>&#160;    BOOST_TEST((backendObjPtr != <span class="keyword">nullptr</span>));</div><div class="line"><a name="l00712"></a><span class="lineno">  712</span>&#160;</div><div class="line"><a name="l00713"></a><span class="lineno">  713</span>&#160;    <span class="comment">// Optimize the subgraph</span></div><div class="line"><a name="l00714"></a><span class="lineno">  714</span>&#160;    <a class="code" href="classarmnn_1_1_optimization_views.xhtml">OptimizationViews</a> optimizationViews;</div><div class="line"><a name="l00715"></a><span class="lineno">  715</span>&#160;</div><div class="line"><a name="l00716"></a><span class="lineno">  716</span>&#160;    <span class="comment">// Check that the optimization is carried out correctly</span></div><div class="line"><a name="l00717"></a><span class="lineno">  717</span>&#160;    BOOST_CHECK_NO_THROW(optimizationViews = backendObjPtr-&gt;OptimizeSubgraphView(*subgraphPtr));</div><div class="line"><a name="l00718"></a><span class="lineno">  718</span>&#160;</div><div class="line"><a name="l00719"></a><span class="lineno">  719</span>&#160;    <span class="comment">// ===========================================================================================</span></div><div class="line"><a name="l00720"></a><span class="lineno">  720</span>&#160;    <span class="comment">// The expected results are:</span></div><div class="line"><a name="l00721"></a><span class="lineno">  721</span>&#160;    <span class="comment">//  - Exactly one substitution, mapping the whole input subgraph to a new replacement subgraph</span></div><div class="line"><a name="l00722"></a><span class="lineno">  722</span>&#160;    <span class="comment">//  - No failed subgraphs</span></div><div class="line"><a name="l00723"></a><span class="lineno">  723</span>&#160;    <span class="comment">//  - No untouched subgraphs</span></div><div class="line"><a name="l00724"></a><span class="lineno">  724</span>&#160;    <span class="comment">// ===========================================================================================</span></div><div class="line"><a name="l00725"></a><span class="lineno">  725</span>&#160;</div><div class="line"><a name="l00726"></a><span class="lineno">  726</span>&#160;    <span class="comment">// -----------------------</span></div><div class="line"><a name="l00727"></a><span class="lineno">  727</span>&#160;    <span class="comment">// Check the substitutions</span></div><div class="line"><a name="l00728"></a><span class="lineno">  728</span>&#160;    <span class="comment">// -----------------------</span></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="keyword">const</span> <a class="code" href="classarmnn_1_1_optimization_views.xhtml#a5831f7597baa44356221647c45a14f78">OptimizationViews::Substitutions</a>&amp; substitutions = optimizationViews.<a class="code" href="classarmnn_1_1_optimization_views.xhtml#a9a1555f25af4a0ae2c0a1fc0ed9aded8">GetSubstitutions</a>();</div><div class="line"><a name="l00731"></a><span class="lineno">  731</span>&#160;    BOOST_TEST(substitutions.size() == 1);</div><div class="line"><a name="l00732"></a><span class="lineno">  732</span>&#160;</div><div class="line"><a name="l00733"></a><span class="lineno">  733</span>&#160;    CheckSubstitution(substitutions.at(0),</div><div class="line"><a name="l00734"></a><span class="lineno">  734</span>&#160;                      { subgraphInputSlots.size(), subgraphOutputSlots.size(), subgraphLayers.size() },</div><div class="line"><a name="l00735"></a><span class="lineno">  735</span>&#160;                      { subgraphInputSlots.size(), subgraphOutputSlots.size(), 1 },</div><div class="line"><a name="l00736"></a><span class="lineno">  736</span>&#160;                      subgraphInputSlots,</div><div class="line"><a name="l00737"></a><span class="lineno">  737</span>&#160;                      subgraphOutputSlots,</div><div class="line"><a name="l00738"></a><span class="lineno">  738</span>&#160;                      subgraphLayers);</div><div class="line"><a name="l00739"></a><span class="lineno">  739</span>&#160;</div><div class="line"><a name="l00740"></a><span class="lineno">  740</span>&#160;    <span class="comment">// --------------------------</span></div><div class="line"><a name="l00741"></a><span class="lineno">  741</span>&#160;    <span class="comment">// Check the failed subgraphs</span></div><div class="line"><a name="l00742"></a><span class="lineno">  742</span>&#160;    <span class="comment">// --------------------------</span></div><div class="line"><a name="l00743"></a><span class="lineno">  743</span>&#160;</div><div class="line"><a name="l00744"></a><span class="lineno">  744</span>&#160;    BOOST_TEST(optimizationViews.<a class="code" href="classarmnn_1_1_optimization_views.xhtml#ad5fee4381bf82ffa37658dddf4d1fa01">GetFailedSubgraphs</a>().empty());</div><div class="line"><a name="l00745"></a><span class="lineno">  745</span>&#160;</div><div class="line"><a name="l00746"></a><span class="lineno">  746</span>&#160;    <span class="comment">// -----------------------------</span></div><div class="line"><a name="l00747"></a><span class="lineno">  747</span>&#160;    <span class="comment">// Check the untouched subgraphs</span></div><div class="line"><a name="l00748"></a><span class="lineno">  748</span>&#160;    <span class="comment">// -----------------------------</span></div><div class="line"><a name="l00749"></a><span class="lineno">  749</span>&#160;</div><div class="line"><a name="l00750"></a><span class="lineno">  750</span>&#160;    BOOST_TEST(optimizationViews.<a class="code" href="classarmnn_1_1_optimization_views.xhtml#a3b4dae097ce086ce94079d09cce18703">GetUntouchedSubgraphs</a>().empty());</div><div class="line"><a name="l00751"></a><span class="lineno">  751</span>&#160;}</div><div class="line"><a name="l00752"></a><span class="lineno">  752</span>&#160;</div><div class="line"><a name="l00753"></a><span class="lineno">  753</span>&#160;<span class="comment">// A case with five layers (all convolutions) to optimize, all supported by the mock backend</span></div><div class="line"><a name="l00754"></a><span class="lineno">  754</span>&#160;<span class="keywordtype">void</span> FullyOptimizableSubgraphTestImpl2()</div><div class="line"><a name="l00755"></a><span class="lineno">  755</span>&#160;{</div><div class="line"><a name="l00756"></a><span class="lineno">  756</span>&#160;    <a class="code" href="classarmnn_1_1_graph.xhtml">Graph</a> graph;</div><div class="line"><a name="l00757"></a><span class="lineno">  757</span>&#160;    LayerNameToLayerMap layersInGraph;</div><div class="line"><a name="l00758"></a><span class="lineno">  758</span>&#160;</div><div class="line"><a name="l00759"></a><span class="lineno">  759</span>&#160;    <span class="comment">// Create a fully optimizable subgraph</span></div><div class="line"><a name="l00760"></a><span class="lineno">  760</span>&#160;    <a class="code" href="classarmnn_1_1_subgraph_view_selector.xhtml#a4684a457c7786484375f06e9ab2d2265">SubgraphViewSelector::SubgraphViewPtr</a> subgraphPtr = BuildFullyOptimizableSubgraph2(graph, layersInGraph);</div><div class="line"><a name="l00761"></a><span class="lineno">  761</span>&#160;    BOOST_TEST((subgraphPtr != <span class="keyword">nullptr</span>));</div><div class="line"><a name="l00762"></a><span class="lineno">  762</span>&#160;</div><div class="line"><a name="l00763"></a><span class="lineno">  763</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_subgraph_view.xhtml#a5cc65e15002dbc33a5c8a7d6680e9a9d">SubgraphView::InputSlots</a>&amp;  subgraphInputSlots  = subgraphPtr-&gt;GetInputSlots();</div><div class="line"><a name="l00764"></a><span class="lineno">  764</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_subgraph_view.xhtml#a78293334750ec5279eb9c96d56deaf08">SubgraphView::OutputSlots</a>&amp; subgraphOutputSlots = subgraphPtr-&gt;GetOutputSlots();</div><div class="line"><a name="l00765"></a><span class="lineno">  765</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_subgraph_view.xhtml#a74798938fdaeae75c8adfa4a7439e7f9">SubgraphView::Layers</a>&amp;      subgraphLayers      = subgraphPtr-&gt;GetLayers();</div><div class="line"><a name="l00766"></a><span class="lineno">  766</span>&#160;</div><div class="line"><a name="l00767"></a><span class="lineno">  767</span>&#160;    BOOST_TEST(subgraphPtr-&gt;GetInputSlots().size()  == 1);</div><div class="line"><a name="l00768"></a><span class="lineno">  768</span>&#160;    BOOST_TEST(subgraphPtr-&gt;GetOutputSlots().size() == 1);</div><div class="line"><a name="l00769"></a><span class="lineno">  769</span>&#160;    BOOST_TEST(subgraphPtr-&gt;GetLayers().size()      == 5);</div><div class="line"><a name="l00770"></a><span class="lineno">  770</span>&#160;</div><div class="line"><a name="l00771"></a><span class="lineno">  771</span>&#160;    BOOST_TEST(<a class="code" href="_common_test_utils_8hpp.xhtml#a5fa64e793b38cf9074e6fcdb2c9c7293">Contains</a>(layersInGraph, <span class="stringliteral">&quot;conv1 layer&quot;</span>));</div><div class="line"><a name="l00772"></a><span class="lineno">  772</span>&#160;    BOOST_TEST(<a class="code" href="_common_test_utils_8hpp.xhtml#a5fa64e793b38cf9074e6fcdb2c9c7293">Contains</a>(layersInGraph, <span class="stringliteral">&quot;conv2 layer&quot;</span>));</div><div class="line"><a name="l00773"></a><span class="lineno">  773</span>&#160;    BOOST_TEST(<a class="code" href="_common_test_utils_8hpp.xhtml#a5fa64e793b38cf9074e6fcdb2c9c7293">Contains</a>(layersInGraph, <span class="stringliteral">&quot;conv3 layer&quot;</span>));</div><div class="line"><a name="l00774"></a><span class="lineno">  774</span>&#160;    BOOST_TEST(<a class="code" href="_common_test_utils_8hpp.xhtml#a5fa64e793b38cf9074e6fcdb2c9c7293">Contains</a>(layersInGraph, <span class="stringliteral">&quot;conv4 layer&quot;</span>));</div><div class="line"><a name="l00775"></a><span class="lineno">  775</span>&#160;    BOOST_TEST(<a class="code" href="_common_test_utils_8hpp.xhtml#a5fa64e793b38cf9074e6fcdb2c9c7293">Contains</a>(layersInGraph, <span class="stringliteral">&quot;conv5 layer&quot;</span>));</div><div class="line"><a name="l00776"></a><span class="lineno">  776</span>&#160;</div><div class="line"><a name="l00777"></a><span class="lineno">  777</span>&#160;    <span class="comment">// Create a mock backend object</span></div><div class="line"><a name="l00778"></a><span class="lineno">  778</span>&#160;    <a class="code" href="classarmnn_1_1_mock_backend_initialiser.xhtml">MockBackendInitialiser</a> initialiser; <span class="comment">// Register the Mock Backend</span></div><div class="line"><a name="l00779"></a><span class="lineno">  779</span>&#160;    <span class="keyword">auto</span> backendObjPtr = <a class="code" href="_common_test_utils_8cpp.xhtml#a7a4090354279f08b1e27244bab25aa86">CreateBackendObject</a>(<a class="code" href="namespacearmnn.xhtml#a17955517b0d148f7ffdbffe8b46e41e0">MockBackendId</a>());</div><div class="line"><a name="l00780"></a><span class="lineno">  780</span>&#160;    BOOST_TEST((backendObjPtr != <span class="keyword">nullptr</span>));</div><div class="line"><a name="l00781"></a><span class="lineno">  781</span>&#160;</div><div class="line"><a name="l00782"></a><span class="lineno">  782</span>&#160;    <span class="comment">// Optimize the subgraph</span></div><div class="line"><a name="l00783"></a><span class="lineno">  783</span>&#160;    <a class="code" href="classarmnn_1_1_optimization_views.xhtml">OptimizationViews</a> optimizationViews;</div><div class="line"><a name="l00784"></a><span class="lineno">  784</span>&#160;</div><div class="line"><a name="l00785"></a><span class="lineno">  785</span>&#160;    <span class="comment">// Check that the optimization is carried out correctly</span></div><div class="line"><a name="l00786"></a><span class="lineno">  786</span>&#160;    BOOST_CHECK_NO_THROW(optimizationViews = backendObjPtr-&gt;OptimizeSubgraphView(*subgraphPtr));</div><div class="line"><a name="l00787"></a><span class="lineno">  787</span>&#160;</div><div class="line"><a name="l00788"></a><span class="lineno">  788</span>&#160;    <span class="comment">// ===========================================================================================</span></div><div class="line"><a name="l00789"></a><span class="lineno">  789</span>&#160;    <span class="comment">// The expected results are:</span></div><div class="line"><a name="l00790"></a><span class="lineno">  790</span>&#160;    <span class="comment">//  - Exactly one substitution, mapping the whole input subgraph to a new replacement subgraph</span></div><div class="line"><a name="l00791"></a><span class="lineno">  791</span>&#160;    <span class="comment">//  - No failed subgraphs</span></div><div class="line"><a name="l00792"></a><span class="lineno">  792</span>&#160;    <span class="comment">//  - No untouched subgraphs</span></div><div class="line"><a name="l00793"></a><span class="lineno">  793</span>&#160;    <span class="comment">// ===========================================================================================</span></div><div class="line"><a name="l00794"></a><span class="lineno">  794</span>&#160;</div><div class="line"><a name="l00795"></a><span class="lineno">  795</span>&#160;    <span class="comment">// -----------------------</span></div><div class="line"><a name="l00796"></a><span class="lineno">  796</span>&#160;    <span class="comment">// Check the substitutions</span></div><div class="line"><a name="l00797"></a><span class="lineno">  797</span>&#160;    <span class="comment">// -----------------------</span></div><div class="line"><a name="l00798"></a><span class="lineno">  798</span>&#160;</div><div class="line"><a name="l00799"></a><span class="lineno">  799</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_optimization_views.xhtml#a5831f7597baa44356221647c45a14f78">OptimizationViews::Substitutions</a>&amp; substitutions = optimizationViews.<a class="code" href="classarmnn_1_1_optimization_views.xhtml#a9a1555f25af4a0ae2c0a1fc0ed9aded8">GetSubstitutions</a>();</div><div class="line"><a name="l00800"></a><span class="lineno">  800</span>&#160;    BOOST_TEST(substitutions.size() == 1);</div><div class="line"><a name="l00801"></a><span class="lineno">  801</span>&#160;</div><div class="line"><a name="l00802"></a><span class="lineno">  802</span>&#160;    std::list&lt;Layer*&gt; expectedSubstitutableLayers{ layersInGraph.at(<span class="stringliteral">&quot;conv1 layer&quot;</span>),</div><div class="line"><a name="l00803"></a><span class="lineno">  803</span>&#160;                                                   layersInGraph.at(<span class="stringliteral">&quot;conv2 layer&quot;</span>),</div><div class="line"><a name="l00804"></a><span class="lineno">  804</span>&#160;                                                   layersInGraph.at(<span class="stringliteral">&quot;conv3 layer&quot;</span>),</div><div class="line"><a name="l00805"></a><span class="lineno">  805</span>&#160;                                                   layersInGraph.at(<span class="stringliteral">&quot;conv4 layer&quot;</span>),</div><div class="line"><a name="l00806"></a><span class="lineno">  806</span>&#160;                                                   layersInGraph.at(<span class="stringliteral">&quot;conv5 layer&quot;</span>) };</div><div class="line"><a name="l00807"></a><span class="lineno">  807</span>&#160;</div><div class="line"><a name="l00808"></a><span class="lineno">  808</span>&#160;    <span class="keyword">const</span> <a class="code" href="structarmnn_1_1_optimization_views_1_1_substitution_pair.xhtml">OptimizationViews::SubstitutionPair</a>&amp; substitution = substitutions.at(0);</div><div class="line"><a name="l00809"></a><span class="lineno">  809</span>&#160;</div><div class="line"><a name="l00810"></a><span class="lineno">  810</span>&#160;    CheckSubstitution(substitution,</div><div class="line"><a name="l00811"></a><span class="lineno">  811</span>&#160;                      { subgraphInputSlots.size(), subgraphOutputSlots.size(), subgraphLayers.size() },</div><div class="line"><a name="l00812"></a><span class="lineno">  812</span>&#160;                      { subgraphInputSlots.size(), subgraphOutputSlots.size(), 1 },</div><div class="line"><a name="l00813"></a><span class="lineno">  813</span>&#160;                      subgraphInputSlots,</div><div class="line"><a name="l00814"></a><span class="lineno">  814</span>&#160;                      subgraphOutputSlots,</div><div class="line"><a name="l00815"></a><span class="lineno">  815</span>&#160;                      expectedSubstitutableLayers);</div><div class="line"><a name="l00816"></a><span class="lineno">  816</span>&#160;</div><div class="line"><a name="l00817"></a><span class="lineno">  817</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_subgraph_view.xhtml#a74798938fdaeae75c8adfa4a7439e7f9">SubgraphView::Layers</a>&amp; substitutableSubgraphLayers = substitution.<a class="code" href="structarmnn_1_1_optimization_views_1_1_substitution_pair.xhtml#aa5e6108bf6fefef2d1affa6d89d23d3c">m_SubstitutableSubgraph</a>.<a class="code" href="classarmnn_1_1_subgraph_view.xhtml#ac8ac9809196ec980b8472fbc8367697a">GetLayers</a>();</div><div class="line"><a name="l00818"></a><span class="lineno">  818</span>&#160;</div><div class="line"><a name="l00819"></a><span class="lineno">  819</span>&#160;    BOOST_TEST(substitutableSubgraphLayers.front() + 0, expectedSubstitutableLayers.front() + 0);</div><div class="line"><a name="l00820"></a><span class="lineno">  820</span>&#160;    BOOST_TEST(substitutableSubgraphLayers.front() + 1, expectedSubstitutableLayers.front() + 1);</div><div class="line"><a name="l00821"></a><span class="lineno">  821</span>&#160;    BOOST_TEST(substitutableSubgraphLayers.front() + 2, expectedSubstitutableLayers.front() + 2);</div><div class="line"><a name="l00822"></a><span class="lineno">  822</span>&#160;    BOOST_TEST(substitutableSubgraphLayers.front() + 3, expectedSubstitutableLayers.front() + 3);</div><div class="line"><a name="l00823"></a><span class="lineno">  823</span>&#160;    BOOST_TEST(substitutableSubgraphLayers.front() + 4, expectedSubstitutableLayers.front() + 4);</div><div class="line"><a name="l00824"></a><span class="lineno">  824</span>&#160;</div><div class="line"><a name="l00825"></a><span class="lineno">  825</span>&#160;    <span class="comment">// --------------------------</span></div><div class="line"><a name="l00826"></a><span class="lineno">  826</span>&#160;    <span class="comment">// Check the failed subgraphs</span></div><div class="line"><a name="l00827"></a><span class="lineno">  827</span>&#160;    <span class="comment">// --------------------------</span></div><div class="line"><a name="l00828"></a><span class="lineno">  828</span>&#160;</div><div class="line"><a name="l00829"></a><span class="lineno">  829</span>&#160;    BOOST_TEST(optimizationViews.<a class="code" href="classarmnn_1_1_optimization_views.xhtml#ad5fee4381bf82ffa37658dddf4d1fa01">GetFailedSubgraphs</a>().empty());</div><div class="line"><a name="l00830"></a><span class="lineno">  830</span>&#160;</div><div class="line"><a name="l00831"></a><span class="lineno">  831</span>&#160;    <span class="comment">// -----------------------------</span></div><div class="line"><a name="l00832"></a><span class="lineno">  832</span>&#160;    <span class="comment">// Check the untouched subgraphs</span></div><div class="line"><a name="l00833"></a><span class="lineno">  833</span>&#160;    <span class="comment">// -----------------------------</span></div><div class="line"><a name="l00834"></a><span class="lineno">  834</span>&#160;</div><div class="line"><a name="l00835"></a><span class="lineno">  835</span>&#160;    BOOST_TEST(optimizationViews.<a class="code" href="classarmnn_1_1_optimization_views.xhtml#a3b4dae097ce086ce94079d09cce18703">GetUntouchedSubgraphs</a>().empty());</div><div class="line"><a name="l00836"></a><span class="lineno">  836</span>&#160;}</div><div class="line"><a name="l00837"></a><span class="lineno">  837</span>&#160;</div><div class="line"><a name="l00838"></a><span class="lineno">  838</span>&#160;<span class="comment">// The input subgraph contaions both supported and unsupported layers</span></div><div class="line"><a name="l00839"></a><span class="lineno">  839</span>&#160;<span class="comment">// (but only convolutions are unsupported by the mock backend)</span></div><div class="line"><a name="l00840"></a><span class="lineno">  840</span>&#160;<span class="keywordtype">void</span> PartiallySupportedSubgraphTestImpl()</div><div class="line"><a name="l00841"></a><span class="lineno">  841</span>&#160;{</div><div class="line"><a name="l00842"></a><span class="lineno">  842</span>&#160;    <a class="code" href="classarmnn_1_1_graph.xhtml">Graph</a> graph;</div><div class="line"><a name="l00843"></a><span class="lineno">  843</span>&#160;    LayerNameToLayerMap layersInGraph;</div><div class="line"><a name="l00844"></a><span class="lineno">  844</span>&#160;</div><div class="line"><a name="l00845"></a><span class="lineno">  845</span>&#160;    <span class="comment">// Create a fully optimizable subgraph</span></div><div class="line"><a name="l00846"></a><span class="lineno">  846</span>&#160;    <a class="code" href="classarmnn_1_1_subgraph_view_selector.xhtml#a4684a457c7786484375f06e9ab2d2265">SubgraphViewSelector::SubgraphViewPtr</a> subgraphPtr = BuildPartiallySupportedSubgraph(graph, layersInGraph);</div><div class="line"><a name="l00847"></a><span class="lineno">  847</span>&#160;    BOOST_TEST((subgraphPtr != <span class="keyword">nullptr</span>));</div><div class="line"><a name="l00848"></a><span class="lineno">  848</span>&#160;</div><div class="line"><a name="l00849"></a><span class="lineno">  849</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_subgraph_view.xhtml#a5cc65e15002dbc33a5c8a7d6680e9a9d">SubgraphView::InputSlots</a>&amp;  subgraphInputSlots  = subgraphPtr-&gt;GetInputSlots();</div><div class="line"><a name="l00850"></a><span class="lineno">  850</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_subgraph_view.xhtml#a78293334750ec5279eb9c96d56deaf08">SubgraphView::OutputSlots</a>&amp; subgraphOutputSlots = subgraphPtr-&gt;GetOutputSlots();</div><div class="line"><a name="l00851"></a><span class="lineno">  851</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_subgraph_view.xhtml#a74798938fdaeae75c8adfa4a7439e7f9">SubgraphView::Layers</a>&amp;      subgraphLayers      = subgraphPtr-&gt;GetLayers();</div><div class="line"><a name="l00852"></a><span class="lineno">  852</span>&#160;</div><div class="line"><a name="l00853"></a><span class="lineno">  853</span>&#160;    BOOST_TEST(subgraphInputSlots.size()  == 1);</div><div class="line"><a name="l00854"></a><span class="lineno">  854</span>&#160;    BOOST_TEST(subgraphOutputSlots.size() == 1);</div><div class="line"><a name="l00855"></a><span class="lineno">  855</span>&#160;    BOOST_TEST(subgraphLayers.size()      == 5);</div><div class="line"><a name="l00856"></a><span class="lineno">  856</span>&#160;</div><div class="line"><a name="l00857"></a><span class="lineno">  857</span>&#160;    BOOST_TEST(<a class="code" href="_common_test_utils_8hpp.xhtml#a5fa64e793b38cf9074e6fcdb2c9c7293">Contains</a>(layersInGraph, <span class="stringliteral">&quot;conv1 layer&quot;</span>));</div><div class="line"><a name="l00858"></a><span class="lineno">  858</span>&#160;    BOOST_TEST(<a class="code" href="_common_test_utils_8hpp.xhtml#a5fa64e793b38cf9074e6fcdb2c9c7293">Contains</a>(layersInGraph, <span class="stringliteral">&quot;pooling1 layer&quot;</span>));</div><div class="line"><a name="l00859"></a><span class="lineno">  859</span>&#160;    BOOST_TEST(<a class="code" href="_common_test_utils_8hpp.xhtml#a5fa64e793b38cf9074e6fcdb2c9c7293">Contains</a>(layersInGraph, <span class="stringliteral">&quot;pooling2 layer&quot;</span>));</div><div class="line"><a name="l00860"></a><span class="lineno">  860</span>&#160;    BOOST_TEST(<a class="code" href="_common_test_utils_8hpp.xhtml#a5fa64e793b38cf9074e6fcdb2c9c7293">Contains</a>(layersInGraph, <span class="stringliteral">&quot;conv2 layer&quot;</span>));</div><div class="line"><a name="l00861"></a><span class="lineno">  861</span>&#160;    BOOST_TEST(<a class="code" href="_common_test_utils_8hpp.xhtml#a5fa64e793b38cf9074e6fcdb2c9c7293">Contains</a>(layersInGraph, <span class="stringliteral">&quot;pooling3 layer&quot;</span>));</div><div class="line"><a name="l00862"></a><span class="lineno">  862</span>&#160;</div><div class="line"><a name="l00863"></a><span class="lineno">  863</span>&#160;    <span class="comment">// Create a mock backend object</span></div><div class="line"><a name="l00864"></a><span class="lineno">  864</span>&#160;    <a class="code" href="classarmnn_1_1_mock_backend_initialiser.xhtml">MockBackendInitialiser</a> initialiser; <span class="comment">// Register the Mock Backend</span></div><div class="line"><a name="l00865"></a><span class="lineno">  865</span>&#160;    <span class="keyword">auto</span> backendObjPtr = <a class="code" href="_common_test_utils_8cpp.xhtml#a7a4090354279f08b1e27244bab25aa86">CreateBackendObject</a>(<a class="code" href="namespacearmnn.xhtml#a17955517b0d148f7ffdbffe8b46e41e0">MockBackendId</a>());</div><div class="line"><a name="l00866"></a><span class="lineno">  866</span>&#160;    BOOST_TEST((backendObjPtr != <span class="keyword">nullptr</span>));</div><div class="line"><a name="l00867"></a><span class="lineno">  867</span>&#160;</div><div class="line"><a name="l00868"></a><span class="lineno">  868</span>&#160;    <span class="comment">// Optimize the subgraph</span></div><div class="line"><a name="l00869"></a><span class="lineno">  869</span>&#160;    <a class="code" href="classarmnn_1_1_optimization_views.xhtml">OptimizationViews</a> optimizationViews;</div><div class="line"><a name="l00870"></a><span class="lineno">  870</span>&#160;</div><div class="line"><a name="l00871"></a><span class="lineno">  871</span>&#160;    <span class="comment">// Check that the optimization is carried out correctly</span></div><div class="line"><a name="l00872"></a><span class="lineno">  872</span>&#160;    BOOST_CHECK_NO_THROW(optimizationViews = backendObjPtr-&gt;OptimizeSubgraphView(*subgraphPtr));</div><div class="line"><a name="l00873"></a><span class="lineno">  873</span>&#160;</div><div class="line"><a name="l00874"></a><span class="lineno">  874</span>&#160;    <span class="comment">// ========================================================================</span></div><div class="line"><a name="l00875"></a><span class="lineno">  875</span>&#160;    <span class="comment">// The expected results are:</span></div><div class="line"><a name="l00876"></a><span class="lineno">  876</span>&#160;    <span class="comment">//  - Exactly two substitution, corresponding to the supported layers</span></div><div class="line"><a name="l00877"></a><span class="lineno">  877</span>&#160;    <span class="comment">//  - Exactly two failed subgraphs, corresponding to the unsupported layers</span></div><div class="line"><a name="l00878"></a><span class="lineno">  878</span>&#160;    <span class="comment">//  - No untouched subgraphs</span></div><div class="line"><a name="l00879"></a><span class="lineno">  879</span>&#160;    <span class="comment">// ========================================================================</span></div><div class="line"><a name="l00880"></a><span class="lineno">  880</span>&#160;</div><div class="line"><a name="l00881"></a><span class="lineno">  881</span>&#160;    <span class="comment">// -----------------------</span></div><div class="line"><a name="l00882"></a><span class="lineno">  882</span>&#160;    <span class="comment">// Check the substitutions</span></div><div class="line"><a name="l00883"></a><span class="lineno">  883</span>&#160;    <span class="comment">// -----------------------</span></div><div class="line"><a name="l00884"></a><span class="lineno">  884</span>&#160;</div><div class="line"><a name="l00885"></a><span class="lineno">  885</span>&#160;    <a class="code" href="classarmnn_1_1_optimization_views.xhtml#a5831f7597baa44356221647c45a14f78">OptimizationViews::Substitutions</a> substitutions = optimizationViews.<a class="code" href="classarmnn_1_1_optimization_views.xhtml#a9a1555f25af4a0ae2c0a1fc0ed9aded8">GetSubstitutions</a>();</div><div class="line"><a name="l00886"></a><span class="lineno">  886</span>&#160;    BOOST_TEST(substitutions.size() == 2);</div><div class="line"><a name="l00887"></a><span class="lineno">  887</span>&#160;    <span class="comment">// Sort into a consistent order</span></div><div class="line"><a name="l00888"></a><span class="lineno">  888</span>&#160;    std::sort(substitutions.begin(), substitutions.end(), [](<span class="keyword">auto</span> s1, <span class="keyword">auto</span> s2) {</div><div class="line"><a name="l00889"></a><span class="lineno">  889</span>&#160;        <span class="keywordflow">return</span> strcmp(s1.m_SubstitutableSubgraph.GetLayers().front()-&gt;GetName(),</div><div class="line"><a name="l00890"></a><span class="lineno">  890</span>&#160;                      s2.m_SubstitutableSubgraph.GetLayers().front()-&gt;GetName()) &lt; 0;</div><div class="line"><a name="l00891"></a><span class="lineno">  891</span>&#160;    });</div><div class="line"><a name="l00892"></a><span class="lineno">  892</span>&#160;</div><div class="line"><a name="l00893"></a><span class="lineno">  893</span>&#160;    std::vector&lt;ExpectedSubgraphSize&gt; expectedSubstitutableSubgraphSizes{ { 1, 1, 1 },</div><div class="line"><a name="l00894"></a><span class="lineno">  894</span>&#160;                                                                          { 1, 1, 1 } };</div><div class="line"><a name="l00895"></a><span class="lineno">  895</span>&#160;    std::vector&lt;ExpectedSubgraphSize&gt; expectedReplacementSubgraphSizes{ { 1, 1, 1 },</div><div class="line"><a name="l00896"></a><span class="lineno">  896</span>&#160;                                                                        { 1, 1, 1 } };</div><div class="line"><a name="l00897"></a><span class="lineno">  897</span>&#160;    std::vector&lt;SubgraphView::InputSlots&gt; expectedSubstitutableInputSlots</div><div class="line"><a name="l00898"></a><span class="lineno">  898</span>&#160;    {</div><div class="line"><a name="l00899"></a><span class="lineno">  899</span>&#160;        ConvertReferenceTypeToPointerType(layersInGraph.at(<span class="stringliteral">&quot;conv1 layer&quot;</span>)-&gt;GetInputSlots()),</div><div class="line"><a name="l00900"></a><span class="lineno">  900</span>&#160;        ConvertReferenceTypeToPointerType(layersInGraph.at(<span class="stringliteral">&quot;conv2 layer&quot;</span>)-&gt;GetInputSlots())</div><div class="line"><a name="l00901"></a><span class="lineno">  901</span>&#160;    };</div><div class="line"><a name="l00902"></a><span class="lineno">  902</span>&#160;    std::vector&lt;SubgraphView::OutputSlots&gt; expectedSubstitutableOutputSlots</div><div class="line"><a name="l00903"></a><span class="lineno">  903</span>&#160;    {</div><div class="line"><a name="l00904"></a><span class="lineno">  904</span>&#160;        ConvertReferenceTypeToPointerType(layersInGraph.at(<span class="stringliteral">&quot;conv1 layer&quot;</span>)-&gt;GetOutputSlots()),</div><div class="line"><a name="l00905"></a><span class="lineno">  905</span>&#160;        ConvertReferenceTypeToPointerType(layersInGraph.at(<span class="stringliteral">&quot;conv2 layer&quot;</span>)-&gt;GetOutputSlots())</div><div class="line"><a name="l00906"></a><span class="lineno">  906</span>&#160;    };</div><div class="line"><a name="l00907"></a><span class="lineno">  907</span>&#160;    std::vector&lt;SubgraphView::Layers&gt; expectedSubstitutableLayers</div><div class="line"><a name="l00908"></a><span class="lineno">  908</span>&#160;    {</div><div class="line"><a name="l00909"></a><span class="lineno">  909</span>&#160;        { layersInGraph.at(<span class="stringliteral">&quot;conv1 layer&quot;</span>) },</div><div class="line"><a name="l00910"></a><span class="lineno">  910</span>&#160;        { layersInGraph.at(<span class="stringliteral">&quot;conv2 layer&quot;</span>) }</div><div class="line"><a name="l00911"></a><span class="lineno">  911</span>&#160;    };</div><div class="line"><a name="l00912"></a><span class="lineno">  912</span>&#160;</div><div class="line"><a name="l00913"></a><span class="lineno">  913</span>&#160;    <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> substitutionIndex = 0; substitutionIndex &lt; substitutions.size(); substitutionIndex++)</div><div class="line"><a name="l00914"></a><span class="lineno">  914</span>&#160;    {</div><div class="line"><a name="l00915"></a><span class="lineno">  915</span>&#160;        CheckSubstitution(substitutions.at(substitutionIndex),</div><div class="line"><a name="l00916"></a><span class="lineno">  916</span>&#160;                          expectedSubstitutableSubgraphSizes.at(substitutionIndex),</div><div class="line"><a name="l00917"></a><span class="lineno">  917</span>&#160;                          expectedReplacementSubgraphSizes.at(substitutionIndex),</div><div class="line"><a name="l00918"></a><span class="lineno">  918</span>&#160;                          expectedSubstitutableInputSlots.at(substitutionIndex),</div><div class="line"><a name="l00919"></a><span class="lineno">  919</span>&#160;                          expectedSubstitutableOutputSlots.at(substitutionIndex),</div><div class="line"><a name="l00920"></a><span class="lineno">  920</span>&#160;                          expectedSubstitutableLayers.at(substitutionIndex));</div><div class="line"><a name="l00921"></a><span class="lineno">  921</span>&#160;    }</div><div class="line"><a name="l00922"></a><span class="lineno">  922</span>&#160;</div><div class="line"><a name="l00923"></a><span class="lineno">  923</span>&#160;    <span class="comment">// --------------------------</span></div><div class="line"><a name="l00924"></a><span class="lineno">  924</span>&#160;    <span class="comment">// Check the failed subgraphs</span></div><div class="line"><a name="l00925"></a><span class="lineno">  925</span>&#160;    <span class="comment">// --------------------------</span></div><div class="line"><a name="l00926"></a><span class="lineno">  926</span>&#160;</div><div class="line"><a name="l00927"></a><span class="lineno">  927</span>&#160;    <a class="code" href="classarmnn_1_1_optimization_views.xhtml#a4a2c55491ad3a0a6a98a884b3e3fe6d7">OptimizationViews::Subgraphs</a> failedSubgraphs = optimizationViews.<a class="code" href="classarmnn_1_1_optimization_views.xhtml#ad5fee4381bf82ffa37658dddf4d1fa01">GetFailedSubgraphs</a>();</div><div class="line"><a name="l00928"></a><span class="lineno">  928</span>&#160;    BOOST_TEST(failedSubgraphs.size() == 2);</div><div class="line"><a name="l00929"></a><span class="lineno">  929</span>&#160;    <span class="comment">// Sort into a consistent order</span></div><div class="line"><a name="l00930"></a><span class="lineno">  930</span>&#160;    std::sort(failedSubgraphs.begin(), failedSubgraphs.end(), [](<span class="keyword">auto</span> s1, <span class="keyword">auto</span> s2) {</div><div class="line"><a name="l00931"></a><span class="lineno">  931</span>&#160;        <span class="keywordflow">return</span> strcmp(s1.GetLayers().front()-&gt;GetName(), s2.GetLayers().front()-&gt;GetName()) &lt; 0;</div><div class="line"><a name="l00932"></a><span class="lineno">  932</span>&#160;    });</div><div class="line"><a name="l00933"></a><span class="lineno">  933</span>&#160;</div><div class="line"><a name="l00934"></a><span class="lineno">  934</span>&#160;    std::vector&lt;ExpectedSubgraphSize&gt; expectedFailedSubgraphSizes{ { 1, 1, 2 },</div><div class="line"><a name="l00935"></a><span class="lineno">  935</span>&#160;                                                                   { 1, 1, 1 } };</div><div class="line"><a name="l00936"></a><span class="lineno">  936</span>&#160;    std::vector&lt;SubgraphView::InputSlots&gt; expectedFailedInputSlots</div><div class="line"><a name="l00937"></a><span class="lineno">  937</span>&#160;    {</div><div class="line"><a name="l00938"></a><span class="lineno">  938</span>&#160;        ConvertReferenceTypeToPointerType(layersInGraph.at(<span class="stringliteral">&quot;pooling1 layer&quot;</span>)-&gt;GetInputSlots()),</div><div class="line"><a name="l00939"></a><span class="lineno">  939</span>&#160;        ConvertReferenceTypeToPointerType(layersInGraph.at(<span class="stringliteral">&quot;pooling3 layer&quot;</span>)-&gt;GetInputSlots())</div><div class="line"><a name="l00940"></a><span class="lineno">  940</span>&#160;    };</div><div class="line"><a name="l00941"></a><span class="lineno">  941</span>&#160;    std::vector&lt;SubgraphView::OutputSlots&gt; expectedFailedOutputSlots</div><div class="line"><a name="l00942"></a><span class="lineno">  942</span>&#160;    {</div><div class="line"><a name="l00943"></a><span class="lineno">  943</span>&#160;        ConvertReferenceTypeToPointerType(layersInGraph.at(<span class="stringliteral">&quot;pooling2 layer&quot;</span>)-&gt;GetOutputSlots()),</div><div class="line"><a name="l00944"></a><span class="lineno">  944</span>&#160;        ConvertReferenceTypeToPointerType(layersInGraph.at(<span class="stringliteral">&quot;pooling3 layer&quot;</span>)-&gt;GetOutputSlots())</div><div class="line"><a name="l00945"></a><span class="lineno">  945</span>&#160;    };</div><div class="line"><a name="l00946"></a><span class="lineno">  946</span>&#160;    std::vector&lt;SubgraphView::Layers&gt; expectedFailedLayers</div><div class="line"><a name="l00947"></a><span class="lineno">  947</span>&#160;    {</div><div class="line"><a name="l00948"></a><span class="lineno">  948</span>&#160;        { layersInGraph.at(<span class="stringliteral">&quot;pooling1 layer&quot;</span>),</div><div class="line"><a name="l00949"></a><span class="lineno">  949</span>&#160;          layersInGraph.at(<span class="stringliteral">&quot;pooling2 layer&quot;</span>) },</div><div class="line"><a name="l00950"></a><span class="lineno">  950</span>&#160;        { layersInGraph.at(<span class="stringliteral">&quot;pooling3 layer&quot;</span>) }</div><div class="line"><a name="l00951"></a><span class="lineno">  951</span>&#160;    };</div><div class="line"><a name="l00952"></a><span class="lineno">  952</span>&#160;</div><div class="line"><a name="l00953"></a><span class="lineno">  953</span>&#160;    <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> failedIndex = 0; failedIndex &lt; failedSubgraphs.size(); failedIndex++)</div><div class="line"><a name="l00954"></a><span class="lineno">  954</span>&#160;    {</div><div class="line"><a name="l00955"></a><span class="lineno">  955</span>&#160;        CheckFailedSubgraph(failedSubgraphs.at(failedIndex),</div><div class="line"><a name="l00956"></a><span class="lineno">  956</span>&#160;                            expectedFailedSubgraphSizes.at(failedIndex),</div><div class="line"><a name="l00957"></a><span class="lineno">  957</span>&#160;                            expectedFailedInputSlots.at(failedIndex),</div><div class="line"><a name="l00958"></a><span class="lineno">  958</span>&#160;                            expectedFailedOutputSlots.at(failedIndex),</div><div class="line"><a name="l00959"></a><span class="lineno">  959</span>&#160;                            expectedFailedLayers.at(failedIndex));</div><div class="line"><a name="l00960"></a><span class="lineno">  960</span>&#160;    }</div><div class="line"><a name="l00961"></a><span class="lineno">  961</span>&#160;</div><div class="line"><a name="l00962"></a><span class="lineno">  962</span>&#160;    <span class="comment">// -----------------------------</span></div><div class="line"><a name="l00963"></a><span class="lineno">  963</span>&#160;    <span class="comment">// Check the untouched subgraphs</span></div><div class="line"><a name="l00964"></a><span class="lineno">  964</span>&#160;    <span class="comment">// -----------------------------</span></div><div class="line"><a name="l00965"></a><span class="lineno">  965</span>&#160;</div><div class="line"><a name="l00966"></a><span class="lineno">  966</span>&#160;    BOOST_TEST(optimizationViews.<a class="code" href="classarmnn_1_1_optimization_views.xhtml#a3b4dae097ce086ce94079d09cce18703">GetUntouchedSubgraphs</a>().empty());</div><div class="line"><a name="l00967"></a><span class="lineno">  967</span>&#160;}</div><div class="line"><a name="l00968"></a><span class="lineno">  968</span>&#160;</div><div class="line"><a name="l00969"></a><span class="lineno">  969</span>&#160;<span class="comment">// The input subgraph contains only unoptimizable layers (&quot;unoptimizable&quot; is added to the layer&#39;s name)</span></div><div class="line"><a name="l00970"></a><span class="lineno">  970</span>&#160;<span class="keywordtype">void</span> FullyUnoptimizableSubgraphTestImpl1()</div><div class="line"><a name="l00971"></a><span class="lineno">  971</span>&#160;{</div><div class="line"><a name="l00972"></a><span class="lineno">  972</span>&#160;    <a class="code" href="classarmnn_1_1_graph.xhtml">Graph</a> graph;</div><div class="line"><a name="l00973"></a><span class="lineno">  973</span>&#160;    LayerNameToLayerMap layersInGraph;</div><div class="line"><a name="l00974"></a><span class="lineno">  974</span>&#160;</div><div class="line"><a name="l00975"></a><span class="lineno">  975</span>&#160;    <span class="comment">// Create a fully optimizable subgraph</span></div><div class="line"><a name="l00976"></a><span class="lineno">  976</span>&#160;    <a class="code" href="classarmnn_1_1_subgraph_view_selector.xhtml#a4684a457c7786484375f06e9ab2d2265">SubgraphViewSelector::SubgraphViewPtr</a> subgraphPtr = BuildFullyUnoptimizableSubgraph1(graph, layersInGraph);</div><div class="line"><a name="l00977"></a><span class="lineno">  977</span>&#160;    BOOST_TEST((subgraphPtr != <span class="keyword">nullptr</span>));</div><div class="line"><a name="l00978"></a><span class="lineno">  978</span>&#160;</div><div class="line"><a name="l00979"></a><span class="lineno">  979</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_subgraph_view.xhtml#a5cc65e15002dbc33a5c8a7d6680e9a9d">SubgraphView::InputSlots</a>&amp;  subgraphInputSlots  = subgraphPtr-&gt;GetInputSlots();</div><div class="line"><a name="l00980"></a><span class="lineno">  980</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_subgraph_view.xhtml#a78293334750ec5279eb9c96d56deaf08">SubgraphView::OutputSlots</a>&amp; subgraphOutputSlots = subgraphPtr-&gt;GetOutputSlots();</div><div class="line"><a name="l00981"></a><span class="lineno">  981</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_subgraph_view.xhtml#a74798938fdaeae75c8adfa4a7439e7f9">SubgraphView::Layers</a>&amp;      subgraphLayers      = subgraphPtr-&gt;GetLayers();</div><div class="line"><a name="l00982"></a><span class="lineno">  982</span>&#160;</div><div class="line"><a name="l00983"></a><span class="lineno">  983</span>&#160;    BOOST_TEST(subgraphInputSlots.size()  == 1);</div><div class="line"><a name="l00984"></a><span class="lineno">  984</span>&#160;    BOOST_TEST(subgraphOutputSlots.size() == 1);</div><div class="line"><a name="l00985"></a><span class="lineno">  985</span>&#160;    BOOST_TEST(subgraphLayers.size()      == 1);</div><div class="line"><a name="l00986"></a><span class="lineno">  986</span>&#160;</div><div class="line"><a name="l00987"></a><span class="lineno">  987</span>&#160;    BOOST_TEST(<a class="code" href="_common_test_utils_8hpp.xhtml#a5fa64e793b38cf9074e6fcdb2c9c7293">Contains</a>(layersInGraph, <span class="stringliteral">&quot;conv layer unoptimizable&quot;</span>));</div><div class="line"><a name="l00988"></a><span class="lineno">  988</span>&#160;</div><div class="line"><a name="l00989"></a><span class="lineno">  989</span>&#160;    <span class="comment">// Create a mock backend object</span></div><div class="line"><a name="l00990"></a><span class="lineno">  990</span>&#160;    <a class="code" href="classarmnn_1_1_mock_backend_initialiser.xhtml">MockBackendInitialiser</a> initialiser; <span class="comment">// Register the Mock Backend</span></div><div class="line"><a name="l00991"></a><span class="lineno">  991</span>&#160;    <span class="keyword">auto</span> backendObjPtr = <a class="code" href="_common_test_utils_8cpp.xhtml#a7a4090354279f08b1e27244bab25aa86">CreateBackendObject</a>(<a class="code" href="namespacearmnn.xhtml#a17955517b0d148f7ffdbffe8b46e41e0">MockBackendId</a>());</div><div class="line"><a name="l00992"></a><span class="lineno">  992</span>&#160;    BOOST_TEST((backendObjPtr != <span class="keyword">nullptr</span>));</div><div class="line"><a name="l00993"></a><span class="lineno">  993</span>&#160;</div><div class="line"><a name="l00994"></a><span class="lineno">  994</span>&#160;    <span class="comment">// Optimize the subgraph</span></div><div class="line"><a name="l00995"></a><span class="lineno">  995</span>&#160;    <a class="code" href="classarmnn_1_1_optimization_views.xhtml">OptimizationViews</a> optimizationViews;</div><div class="line"><a name="l00996"></a><span class="lineno">  996</span>&#160;</div><div class="line"><a name="l00997"></a><span class="lineno">  997</span>&#160;    <span class="comment">// Check that the optimization is carried out correctly</span></div><div class="line"><a name="l00998"></a><span class="lineno">  998</span>&#160;    BOOST_CHECK_NO_THROW(optimizationViews = backendObjPtr-&gt;OptimizeSubgraphView(*subgraphPtr));</div><div class="line"><a name="l00999"></a><span class="lineno">  999</span>&#160;</div><div class="line"><a name="l01000"></a><span class="lineno"> 1000</span>&#160;    <span class="comment">// ============================================================================</span></div><div class="line"><a name="l01001"></a><span class="lineno"> 1001</span>&#160;    <span class="comment">// The expected results are:</span></div><div class="line"><a name="l01002"></a><span class="lineno"> 1002</span>&#160;    <span class="comment">//  - No substitutions</span></div><div class="line"><a name="l01003"></a><span class="lineno"> 1003</span>&#160;    <span class="comment">//  - No failed subgraphs</span></div><div class="line"><a name="l01004"></a><span class="lineno"> 1004</span>&#160;    <span class="comment">//  - Exactly one untouched subgraph, corresponding to the whole input subgraph</span></div><div class="line"><a name="l01005"></a><span class="lineno"> 1005</span>&#160;    <span class="comment">// ============================================================================</span></div><div class="line"><a name="l01006"></a><span class="lineno"> 1006</span>&#160;</div><div class="line"><a name="l01007"></a><span class="lineno"> 1007</span>&#160;    <span class="comment">// -----------------------</span></div><div class="line"><a name="l01008"></a><span class="lineno"> 1008</span>&#160;    <span class="comment">// Check the substitutions</span></div><div class="line"><a name="l01009"></a><span class="lineno"> 1009</span>&#160;    <span class="comment">// -----------------------</span></div><div class="line"><a name="l01010"></a><span class="lineno"> 1010</span>&#160;</div><div class="line"><a name="l01011"></a><span class="lineno"> 1011</span>&#160;    BOOST_TEST(optimizationViews.<a class="code" href="classarmnn_1_1_optimization_views.xhtml#a9a1555f25af4a0ae2c0a1fc0ed9aded8">GetSubstitutions</a>().empty());</div><div class="line"><a name="l01012"></a><span class="lineno"> 1012</span>&#160;</div><div class="line"><a name="l01013"></a><span class="lineno"> 1013</span>&#160;    <span class="comment">// --------------------------</span></div><div class="line"><a name="l01014"></a><span class="lineno"> 1014</span>&#160;    <span class="comment">// Check the failed subgraphs</span></div><div class="line"><a name="l01015"></a><span class="lineno"> 1015</span>&#160;    <span class="comment">// --------------------------</span></div><div class="line"><a name="l01016"></a><span class="lineno"> 1016</span>&#160;</div><div class="line"><a name="l01017"></a><span class="lineno"> 1017</span>&#160;    BOOST_TEST(optimizationViews.<a class="code" href="classarmnn_1_1_optimization_views.xhtml#ad5fee4381bf82ffa37658dddf4d1fa01">GetFailedSubgraphs</a>().empty());</div><div class="line"><a name="l01018"></a><span class="lineno"> 1018</span>&#160;</div><div class="line"><a name="l01019"></a><span class="lineno"> 1019</span>&#160;    <span class="comment">// -----------------------------</span></div><div class="line"><a name="l01020"></a><span class="lineno"> 1020</span>&#160;    <span class="comment">// Check the untouched subgraphs</span></div><div class="line"><a name="l01021"></a><span class="lineno"> 1021</span>&#160;    <span class="comment">// -----------------------------</span></div><div class="line"><a name="l01022"></a><span class="lineno"> 1022</span>&#160;</div><div class="line"><a name="l01023"></a><span class="lineno"> 1023</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_optimization_views.xhtml#a4a2c55491ad3a0a6a98a884b3e3fe6d7">OptimizationViews::Subgraphs</a>&amp; untouchedSubgraphs = optimizationViews.<a class="code" href="classarmnn_1_1_optimization_views.xhtml#a3b4dae097ce086ce94079d09cce18703">GetUntouchedSubgraphs</a>();</div><div class="line"><a name="l01024"></a><span class="lineno"> 1024</span>&#160;    BOOST_TEST(untouchedSubgraphs.size() == 1);</div><div class="line"><a name="l01025"></a><span class="lineno"> 1025</span>&#160;</div><div class="line"><a name="l01026"></a><span class="lineno"> 1026</span>&#160;    CheckUntouchedSubgraph(untouchedSubgraphs.at(0),</div><div class="line"><a name="l01027"></a><span class="lineno"> 1027</span>&#160;                           { subgraphInputSlots.size(), subgraphOutputSlots.size(), subgraphLayers.size() },</div><div class="line"><a name="l01028"></a><span class="lineno"> 1028</span>&#160;                           subgraphInputSlots,</div><div class="line"><a name="l01029"></a><span class="lineno"> 1029</span>&#160;                           subgraphOutputSlots,</div><div class="line"><a name="l01030"></a><span class="lineno"> 1030</span>&#160;                           subgraphLayers);</div><div class="line"><a name="l01031"></a><span class="lineno"> 1031</span>&#160;}</div><div class="line"><a name="l01032"></a><span class="lineno"> 1032</span>&#160;</div><div class="line"><a name="l01033"></a><span class="lineno"> 1033</span>&#160;<span class="comment">// The input subgraph contains some unoptimizable layers (&quot;unoptimizable&quot; is added to the layer&#39;s name)</span></div><div class="line"><a name="l01034"></a><span class="lineno"> 1034</span>&#160;<span class="keywordtype">void</span> PartiallyOptimizableSubgraphTestImpl1()</div><div class="line"><a name="l01035"></a><span class="lineno"> 1035</span>&#160;{</div><div class="line"><a name="l01036"></a><span class="lineno"> 1036</span>&#160;    <a class="code" href="classarmnn_1_1_graph.xhtml">Graph</a> graph;</div><div class="line"><a name="l01037"></a><span class="lineno"> 1037</span>&#160;    LayerNameToLayerMap layersInGraph;</div><div class="line"><a name="l01038"></a><span class="lineno"> 1038</span>&#160;</div><div class="line"><a name="l01039"></a><span class="lineno"> 1039</span>&#160;    <span class="comment">// Create a fully optimizable subgraph</span></div><div class="line"><a name="l01040"></a><span class="lineno"> 1040</span>&#160;    <a class="code" href="classarmnn_1_1_subgraph_view_selector.xhtml#a4684a457c7786484375f06e9ab2d2265">SubgraphViewSelector::SubgraphViewPtr</a> subgraphPtr = BuildPartiallyOptimizableSubgraph1(graph, layersInGraph);</div><div class="line"><a name="l01041"></a><span class="lineno"> 1041</span>&#160;    BOOST_TEST((subgraphPtr != <span class="keyword">nullptr</span>));</div><div class="line"><a name="l01042"></a><span class="lineno"> 1042</span>&#160;</div><div class="line"><a name="l01043"></a><span class="lineno"> 1043</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_subgraph_view.xhtml#a5cc65e15002dbc33a5c8a7d6680e9a9d">SubgraphView::InputSlots</a>&amp;  subgraphInputSlots  = subgraphPtr-&gt;GetInputSlots();</div><div class="line"><a name="l01044"></a><span class="lineno"> 1044</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_subgraph_view.xhtml#a78293334750ec5279eb9c96d56deaf08">SubgraphView::OutputSlots</a>&amp; subgraphOutputSlots = subgraphPtr-&gt;GetOutputSlots();</div><div class="line"><a name="l01045"></a><span class="lineno"> 1045</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_subgraph_view.xhtml#a74798938fdaeae75c8adfa4a7439e7f9">SubgraphView::Layers</a>&amp;      subgraphLayers      = subgraphPtr-&gt;GetLayers();</div><div class="line"><a name="l01046"></a><span class="lineno"> 1046</span>&#160;</div><div class="line"><a name="l01047"></a><span class="lineno"> 1047</span>&#160;    BOOST_TEST(subgraphInputSlots.size()  == 1);</div><div class="line"><a name="l01048"></a><span class="lineno"> 1048</span>&#160;    BOOST_TEST(subgraphOutputSlots.size() == 1);</div><div class="line"><a name="l01049"></a><span class="lineno"> 1049</span>&#160;    BOOST_TEST(subgraphLayers.size()      == 5);</div><div class="line"><a name="l01050"></a><span class="lineno"> 1050</span>&#160;</div><div class="line"><a name="l01051"></a><span class="lineno"> 1051</span>&#160;    BOOST_TEST(<a class="code" href="_common_test_utils_8hpp.xhtml#a5fa64e793b38cf9074e6fcdb2c9c7293">Contains</a>(layersInGraph, <span class="stringliteral">&quot;conv1 layer&quot;</span>));</div><div class="line"><a name="l01052"></a><span class="lineno"> 1052</span>&#160;    BOOST_TEST(<a class="code" href="_common_test_utils_8hpp.xhtml#a5fa64e793b38cf9074e6fcdb2c9c7293">Contains</a>(layersInGraph, <span class="stringliteral">&quot;conv2 layer unoptimizable&quot;</span>));</div><div class="line"><a name="l01053"></a><span class="lineno"> 1053</span>&#160;    BOOST_TEST(<a class="code" href="_common_test_utils_8hpp.xhtml#a5fa64e793b38cf9074e6fcdb2c9c7293">Contains</a>(layersInGraph, <span class="stringliteral">&quot;conv3 layer&quot;</span>));</div><div class="line"><a name="l01054"></a><span class="lineno"> 1054</span>&#160;    BOOST_TEST(<a class="code" href="_common_test_utils_8hpp.xhtml#a5fa64e793b38cf9074e6fcdb2c9c7293">Contains</a>(layersInGraph, <span class="stringliteral">&quot;conv4 layer unoptimizable&quot;</span>));</div><div class="line"><a name="l01055"></a><span class="lineno"> 1055</span>&#160;    BOOST_TEST(<a class="code" href="_common_test_utils_8hpp.xhtml#a5fa64e793b38cf9074e6fcdb2c9c7293">Contains</a>(layersInGraph, <span class="stringliteral">&quot;conv5 layer&quot;</span>));</div><div class="line"><a name="l01056"></a><span class="lineno"> 1056</span>&#160;</div><div class="line"><a name="l01057"></a><span class="lineno"> 1057</span>&#160;    <span class="comment">// Create a mock backend object</span></div><div class="line"><a name="l01058"></a><span class="lineno"> 1058</span>&#160;    <a class="code" href="classarmnn_1_1_mock_backend_initialiser.xhtml">MockBackendInitialiser</a> initialiser; <span class="comment">// Register the Mock Backend</span></div><div class="line"><a name="l01059"></a><span class="lineno"> 1059</span>&#160;    <span class="keyword">auto</span> backendObjPtr = <a class="code" href="_common_test_utils_8cpp.xhtml#a7a4090354279f08b1e27244bab25aa86">CreateBackendObject</a>(<a class="code" href="namespacearmnn.xhtml#a17955517b0d148f7ffdbffe8b46e41e0">MockBackendId</a>());</div><div class="line"><a name="l01060"></a><span class="lineno"> 1060</span>&#160;    BOOST_TEST((backendObjPtr != <span class="keyword">nullptr</span>));</div><div class="line"><a name="l01061"></a><span class="lineno"> 1061</span>&#160;</div><div class="line"><a name="l01062"></a><span class="lineno"> 1062</span>&#160;    <span class="comment">// Optimize the subgraph</span></div><div class="line"><a name="l01063"></a><span class="lineno"> 1063</span>&#160;    <a class="code" href="classarmnn_1_1_optimization_views.xhtml">OptimizationViews</a> optimizationViews;</div><div class="line"><a name="l01064"></a><span class="lineno"> 1064</span>&#160;</div><div class="line"><a name="l01065"></a><span class="lineno"> 1065</span>&#160;    <span class="comment">// Check that the optimization is carried out correctly</span></div><div class="line"><a name="l01066"></a><span class="lineno"> 1066</span>&#160;    BOOST_CHECK_NO_THROW(optimizationViews = backendObjPtr-&gt;OptimizeSubgraphView(*subgraphPtr));</div><div class="line"><a name="l01067"></a><span class="lineno"> 1067</span>&#160;</div><div class="line"><a name="l01068"></a><span class="lineno"> 1068</span>&#160;    <span class="comment">// ===============================================================================</span></div><div class="line"><a name="l01069"></a><span class="lineno"> 1069</span>&#160;    <span class="comment">// The expected results are:</span></div><div class="line"><a name="l01070"></a><span class="lineno"> 1070</span>&#160;    <span class="comment">//  - Exactly three substitutions, corresponding to the optimizable layers</span></div><div class="line"><a name="l01071"></a><span class="lineno"> 1071</span>&#160;    <span class="comment">//  - No failed subgraphs</span></div><div class="line"><a name="l01072"></a><span class="lineno"> 1072</span>&#160;    <span class="comment">//  - Exactly two untouched subgraphs, corresponding to the non-optimizable layers</span></div><div class="line"><a name="l01073"></a><span class="lineno"> 1073</span>&#160;    <span class="comment">// ===============================================================================</span></div><div class="line"><a name="l01074"></a><span class="lineno"> 1074</span>&#160;</div><div class="line"><a name="l01075"></a><span class="lineno"> 1075</span>&#160;    <span class="comment">// -----------------------</span></div><div class="line"><a name="l01076"></a><span class="lineno"> 1076</span>&#160;    <span class="comment">// Check the substitutions</span></div><div class="line"><a name="l01077"></a><span class="lineno"> 1077</span>&#160;    <span class="comment">// -----------------------</span></div><div class="line"><a name="l01078"></a><span class="lineno"> 1078</span>&#160;</div><div class="line"><a name="l01079"></a><span class="lineno"> 1079</span>&#160;    <a class="code" href="classarmnn_1_1_optimization_views.xhtml#a5831f7597baa44356221647c45a14f78">OptimizationViews::Substitutions</a> substitutions = optimizationViews.<a class="code" href="classarmnn_1_1_optimization_views.xhtml#a9a1555f25af4a0ae2c0a1fc0ed9aded8">GetSubstitutions</a>();</div><div class="line"><a name="l01080"></a><span class="lineno"> 1080</span>&#160;    BOOST_TEST(substitutions.size() == 3);</div><div class="line"><a name="l01081"></a><span class="lineno"> 1081</span>&#160;    <span class="comment">// Sort into a consistent order</span></div><div class="line"><a name="l01082"></a><span class="lineno"> 1082</span>&#160;    std::sort(substitutions.begin(), substitutions.end(),</div><div class="line"><a name="l01083"></a><span class="lineno"> 1083</span>&#160;        [](<span class="keyword">auto</span> s1, <span class="keyword">auto</span> s2) { <span class="keywordflow">return</span> strcmp(s1.m_SubstitutableSubgraph.GetLayers().front()-&gt;GetName(),</div><div class="line"><a name="l01084"></a><span class="lineno"> 1084</span>&#160;                                             s2.m_SubstitutableSubgraph.GetLayers().front()-&gt;GetName()) &lt; 0; });</div><div class="line"><a name="l01085"></a><span class="lineno"> 1085</span>&#160;</div><div class="line"><a name="l01086"></a><span class="lineno"> 1086</span>&#160;    std::vector&lt;ExpectedSubgraphSize&gt; expectedSubstitutableSubgraphSizes{ { 1, 1, 1 },</div><div class="line"><a name="l01087"></a><span class="lineno"> 1087</span>&#160;                                                                          { 1, 1, 1 },</div><div class="line"><a name="l01088"></a><span class="lineno"> 1088</span>&#160;                                                                          { 1, 1, 1 } };</div><div class="line"><a name="l01089"></a><span class="lineno"> 1089</span>&#160;    std::vector&lt;ExpectedSubgraphSize&gt; expectedReplacementSubgraphSizes{ { 1, 1, 1 },</div><div class="line"><a name="l01090"></a><span class="lineno"> 1090</span>&#160;                                                                        { 1, 1, 1 },</div><div class="line"><a name="l01091"></a><span class="lineno"> 1091</span>&#160;                                                                        { 1, 1, 1 } };</div><div class="line"><a name="l01092"></a><span class="lineno"> 1092</span>&#160;    std::vector&lt;SubgraphView::InputSlots&gt; expectedSubstitutableInputSlots</div><div class="line"><a name="l01093"></a><span class="lineno"> 1093</span>&#160;    {</div><div class="line"><a name="l01094"></a><span class="lineno"> 1094</span>&#160;        ConvertReferenceTypeToPointerType(layersInGraph.at(<span class="stringliteral">&quot;conv1 layer&quot;</span>)-&gt;GetInputSlots()),</div><div class="line"><a name="l01095"></a><span class="lineno"> 1095</span>&#160;        ConvertReferenceTypeToPointerType(layersInGraph.at(<span class="stringliteral">&quot;conv3 layer&quot;</span>)-&gt;GetInputSlots()),</div><div class="line"><a name="l01096"></a><span class="lineno"> 1096</span>&#160;        ConvertReferenceTypeToPointerType(layersInGraph.at(<span class="stringliteral">&quot;conv5 layer&quot;</span>)-&gt;GetInputSlots())</div><div class="line"><a name="l01097"></a><span class="lineno"> 1097</span>&#160;    };</div><div class="line"><a name="l01098"></a><span class="lineno"> 1098</span>&#160;    std::vector&lt;SubgraphView::OutputSlots&gt; expectedSubstitutableOutputSlots</div><div class="line"><a name="l01099"></a><span class="lineno"> 1099</span>&#160;    {</div><div class="line"><a name="l01100"></a><span class="lineno"> 1100</span>&#160;        ConvertReferenceTypeToPointerType(layersInGraph.at(<span class="stringliteral">&quot;conv1 layer&quot;</span>)-&gt;GetOutputSlots()),</div><div class="line"><a name="l01101"></a><span class="lineno"> 1101</span>&#160;        ConvertReferenceTypeToPointerType(layersInGraph.at(<span class="stringliteral">&quot;conv3 layer&quot;</span>)-&gt;GetOutputSlots()),</div><div class="line"><a name="l01102"></a><span class="lineno"> 1102</span>&#160;        ConvertReferenceTypeToPointerType(layersInGraph.at(<span class="stringliteral">&quot;conv5 layer&quot;</span>)-&gt;GetOutputSlots())</div><div class="line"><a name="l01103"></a><span class="lineno"> 1103</span>&#160;    };</div><div class="line"><a name="l01104"></a><span class="lineno"> 1104</span>&#160;    std::vector&lt;SubgraphView::Layers&gt; expectedSubstitutableLayers</div><div class="line"><a name="l01105"></a><span class="lineno"> 1105</span>&#160;    {</div><div class="line"><a name="l01106"></a><span class="lineno"> 1106</span>&#160;        { layersInGraph.at(<span class="stringliteral">&quot;conv1 layer&quot;</span>) },</div><div class="line"><a name="l01107"></a><span class="lineno"> 1107</span>&#160;        { layersInGraph.at(<span class="stringliteral">&quot;conv3 layer&quot;</span>) },</div><div class="line"><a name="l01108"></a><span class="lineno"> 1108</span>&#160;        { layersInGraph.at(<span class="stringliteral">&quot;conv5 layer&quot;</span>) }</div><div class="line"><a name="l01109"></a><span class="lineno"> 1109</span>&#160;    };</div><div class="line"><a name="l01110"></a><span class="lineno"> 1110</span>&#160;</div><div class="line"><a name="l01111"></a><span class="lineno"> 1111</span>&#160;    <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> substitutionIndex = 0; substitutionIndex &lt; substitutions.size(); substitutionIndex++)</div><div class="line"><a name="l01112"></a><span class="lineno"> 1112</span>&#160;    {</div><div class="line"><a name="l01113"></a><span class="lineno"> 1113</span>&#160;        CheckSubstitution(substitutions.at(substitutionIndex),</div><div class="line"><a name="l01114"></a><span class="lineno"> 1114</span>&#160;                          expectedSubstitutableSubgraphSizes.at(substitutionIndex),</div><div class="line"><a name="l01115"></a><span class="lineno"> 1115</span>&#160;                          expectedReplacementSubgraphSizes.at(substitutionIndex),</div><div class="line"><a name="l01116"></a><span class="lineno"> 1116</span>&#160;                          expectedSubstitutableInputSlots.at(substitutionIndex),</div><div class="line"><a name="l01117"></a><span class="lineno"> 1117</span>&#160;                          expectedSubstitutableOutputSlots.at(substitutionIndex),</div><div class="line"><a name="l01118"></a><span class="lineno"> 1118</span>&#160;                          expectedSubstitutableLayers.at(substitutionIndex));</div><div class="line"><a name="l01119"></a><span class="lineno"> 1119</span>&#160;    }</div><div class="line"><a name="l01120"></a><span class="lineno"> 1120</span>&#160;</div><div class="line"><a name="l01121"></a><span class="lineno"> 1121</span>&#160;    <span class="comment">// --------------------------</span></div><div class="line"><a name="l01122"></a><span class="lineno"> 1122</span>&#160;    <span class="comment">// Check the failed subgraphs</span></div><div class="line"><a name="l01123"></a><span class="lineno"> 1123</span>&#160;    <span class="comment">// --------------------------</span></div><div class="line"><a name="l01124"></a><span class="lineno"> 1124</span>&#160;</div><div class="line"><a name="l01125"></a><span class="lineno"> 1125</span>&#160;    BOOST_TEST(optimizationViews.<a class="code" href="classarmnn_1_1_optimization_views.xhtml#ad5fee4381bf82ffa37658dddf4d1fa01">GetFailedSubgraphs</a>().empty());</div><div class="line"><a name="l01126"></a><span class="lineno"> 1126</span>&#160;</div><div class="line"><a name="l01127"></a><span class="lineno"> 1127</span>&#160;    <span class="comment">// -----------------------------</span></div><div class="line"><a name="l01128"></a><span class="lineno"> 1128</span>&#160;    <span class="comment">// Check the untouched subgraphs</span></div><div class="line"><a name="l01129"></a><span class="lineno"> 1129</span>&#160;    <span class="comment">// -----------------------------</span></div><div class="line"><a name="l01130"></a><span class="lineno"> 1130</span>&#160;</div><div class="line"><a name="l01131"></a><span class="lineno"> 1131</span>&#160;    <a class="code" href="classarmnn_1_1_optimization_views.xhtml#a4a2c55491ad3a0a6a98a884b3e3fe6d7">OptimizationViews::Subgraphs</a> untouchedSubgraphs = optimizationViews.<a class="code" href="classarmnn_1_1_optimization_views.xhtml#a3b4dae097ce086ce94079d09cce18703">GetUntouchedSubgraphs</a>();</div><div class="line"><a name="l01132"></a><span class="lineno"> 1132</span>&#160;    BOOST_TEST(untouchedSubgraphs.size() == 2);</div><div class="line"><a name="l01133"></a><span class="lineno"> 1133</span>&#160;    <span class="comment">// Sort into a consistent order</span></div><div class="line"><a name="l01134"></a><span class="lineno"> 1134</span>&#160;    std::sort(untouchedSubgraphs.begin(), untouchedSubgraphs.end(), [](<span class="keyword">auto</span> s1, <span class="keyword">auto</span> s2) {</div><div class="line"><a name="l01135"></a><span class="lineno"> 1135</span>&#160;        <span class="keywordflow">return</span> strcmp(s1.GetLayers().front()-&gt;GetName(), s2.GetLayers().front()-&gt;GetName()) &lt; 0;</div><div class="line"><a name="l01136"></a><span class="lineno"> 1136</span>&#160;    });</div><div class="line"><a name="l01137"></a><span class="lineno"> 1137</span>&#160;</div><div class="line"><a name="l01138"></a><span class="lineno"> 1138</span>&#160;    std::vector&lt;ExpectedSubgraphSize&gt; expectedUntouchedSubgraphSizes{ { 1, 1, 1 },</div><div class="line"><a name="l01139"></a><span class="lineno"> 1139</span>&#160;                                                                      { 1, 1, 1 } };</div><div class="line"><a name="l01140"></a><span class="lineno"> 1140</span>&#160;    std::vector&lt;SubgraphView::InputSlots&gt; expectedUntouchedInputSlots</div><div class="line"><a name="l01141"></a><span class="lineno"> 1141</span>&#160;    {</div><div class="line"><a name="l01142"></a><span class="lineno"> 1142</span>&#160;        ConvertReferenceTypeToPointerType(layersInGraph.at(<span class="stringliteral">&quot;conv2 layer unoptimizable&quot;</span>)-&gt;GetInputSlots()),</div><div class="line"><a name="l01143"></a><span class="lineno"> 1143</span>&#160;        ConvertReferenceTypeToPointerType(layersInGraph.at(<span class="stringliteral">&quot;conv4 layer unoptimizable&quot;</span>)-&gt;GetInputSlots())</div><div class="line"><a name="l01144"></a><span class="lineno"> 1144</span>&#160;    };</div><div class="line"><a name="l01145"></a><span class="lineno"> 1145</span>&#160;    std::vector&lt;SubgraphView::OutputSlots&gt; expectedUntouchedOutputSlots</div><div class="line"><a name="l01146"></a><span class="lineno"> 1146</span>&#160;    {</div><div class="line"><a name="l01147"></a><span class="lineno"> 1147</span>&#160;        ConvertReferenceTypeToPointerType(layersInGraph.at(<span class="stringliteral">&quot;conv2 layer unoptimizable&quot;</span>)-&gt;GetOutputSlots()),</div><div class="line"><a name="l01148"></a><span class="lineno"> 1148</span>&#160;        ConvertReferenceTypeToPointerType(layersInGraph.at(<span class="stringliteral">&quot;conv4 layer unoptimizable&quot;</span>)-&gt;GetOutputSlots())</div><div class="line"><a name="l01149"></a><span class="lineno"> 1149</span>&#160;    };</div><div class="line"><a name="l01150"></a><span class="lineno"> 1150</span>&#160;    std::vector&lt;SubgraphView::Layers&gt; expectedUntouchedLayers</div><div class="line"><a name="l01151"></a><span class="lineno"> 1151</span>&#160;    {</div><div class="line"><a name="l01152"></a><span class="lineno"> 1152</span>&#160;        { layersInGraph.at(<span class="stringliteral">&quot;conv2 layer unoptimizable&quot;</span>) },</div><div class="line"><a name="l01153"></a><span class="lineno"> 1153</span>&#160;        { layersInGraph.at(<span class="stringliteral">&quot;conv4 layer unoptimizable&quot;</span>) }</div><div class="line"><a name="l01154"></a><span class="lineno"> 1154</span>&#160;    };</div><div class="line"><a name="l01155"></a><span class="lineno"> 1155</span>&#160;</div><div class="line"><a name="l01156"></a><span class="lineno"> 1156</span>&#160;    <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> untouchedIndex = 0; untouchedIndex &lt; untouchedSubgraphs.size(); untouchedIndex++)</div><div class="line"><a name="l01157"></a><span class="lineno"> 1157</span>&#160;    {</div><div class="line"><a name="l01158"></a><span class="lineno"> 1158</span>&#160;        CheckUntouchedSubgraph(untouchedSubgraphs.at(untouchedIndex),</div><div class="line"><a name="l01159"></a><span class="lineno"> 1159</span>&#160;                               expectedUntouchedSubgraphSizes.at(untouchedIndex),</div><div class="line"><a name="l01160"></a><span class="lineno"> 1160</span>&#160;                               expectedUntouchedInputSlots.at(untouchedIndex),</div><div class="line"><a name="l01161"></a><span class="lineno"> 1161</span>&#160;                               expectedUntouchedOutputSlots.at(untouchedIndex),</div><div class="line"><a name="l01162"></a><span class="lineno"> 1162</span>&#160;                               expectedUntouchedLayers.at(untouchedIndex));</div><div class="line"><a name="l01163"></a><span class="lineno"> 1163</span>&#160;    }</div><div class="line"><a name="l01164"></a><span class="lineno"> 1164</span>&#160;}</div><div class="line"><a name="l01165"></a><span class="lineno"> 1165</span>&#160;</div><div class="line"><a name="l01166"></a><span class="lineno"> 1166</span>&#160;<span class="comment">// The input subgraph contains some unoptimizable layers (&quot;unoptimizable&quot; is added to the layer&#39;s name),</span></div><div class="line"><a name="l01167"></a><span class="lineno"> 1167</span>&#160;<span class="comment">// this is meant to test input slots coming from different layers</span></div><div class="line"><a name="l01168"></a><span class="lineno"> 1168</span>&#160;<span class="keywordtype">void</span> PartiallyOptimizableSubgraphTestImpl2()</div><div class="line"><a name="l01169"></a><span class="lineno"> 1169</span>&#160;{</div><div class="line"><a name="l01170"></a><span class="lineno"> 1170</span>&#160;    <a class="code" href="classarmnn_1_1_graph.xhtml">Graph</a> graph;</div><div class="line"><a name="l01171"></a><span class="lineno"> 1171</span>&#160;    LayerNameToLayerMap layersInGraph;</div><div class="line"><a name="l01172"></a><span class="lineno"> 1172</span>&#160;</div><div class="line"><a name="l01173"></a><span class="lineno"> 1173</span>&#160;    <span class="comment">// Create a partially optimizable subgraph</span></div><div class="line"><a name="l01174"></a><span class="lineno"> 1174</span>&#160;    <a class="code" href="classarmnn_1_1_subgraph_view_selector.xhtml#a4684a457c7786484375f06e9ab2d2265">SubgraphViewSelector::SubgraphViewPtr</a> subgraphPtr = BuildPartiallyOptimizableSubgraph2(graph, layersInGraph);</div><div class="line"><a name="l01175"></a><span class="lineno"> 1175</span>&#160;    BOOST_TEST((subgraphPtr != <span class="keyword">nullptr</span>));</div><div class="line"><a name="l01176"></a><span class="lineno"> 1176</span>&#160;</div><div class="line"><a name="l01177"></a><span class="lineno"> 1177</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_subgraph_view.xhtml#a5cc65e15002dbc33a5c8a7d6680e9a9d">SubgraphView::InputSlots</a>&amp;  subgraphInputSlots  = subgraphPtr-&gt;GetInputSlots();</div><div class="line"><a name="l01178"></a><span class="lineno"> 1178</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_subgraph_view.xhtml#a78293334750ec5279eb9c96d56deaf08">SubgraphView::OutputSlots</a>&amp; subgraphOutputSlots = subgraphPtr-&gt;GetOutputSlots();</div><div class="line"><a name="l01179"></a><span class="lineno"> 1179</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_subgraph_view.xhtml#a74798938fdaeae75c8adfa4a7439e7f9">SubgraphView::Layers</a>&amp;      subgraphLayers      = subgraphPtr-&gt;GetLayers();</div><div class="line"><a name="l01180"></a><span class="lineno"> 1180</span>&#160;</div><div class="line"><a name="l01181"></a><span class="lineno"> 1181</span>&#160;    BOOST_TEST(subgraphInputSlots.size()  == 2);</div><div class="line"><a name="l01182"></a><span class="lineno"> 1182</span>&#160;    BOOST_TEST(subgraphOutputSlots.size() == 1);</div><div class="line"><a name="l01183"></a><span class="lineno"> 1183</span>&#160;    BOOST_TEST(subgraphLayers.size()      == 4);</div><div class="line"><a name="l01184"></a><span class="lineno"> 1184</span>&#160;</div><div class="line"><a name="l01185"></a><span class="lineno"> 1185</span>&#160;    BOOST_TEST(<a class="code" href="_common_test_utils_8hpp.xhtml#a5fa64e793b38cf9074e6fcdb2c9c7293">Contains</a>(layersInGraph, <span class="stringliteral">&quot;conv1 layer&quot;</span>));</div><div class="line"><a name="l01186"></a><span class="lineno"> 1186</span>&#160;    BOOST_TEST(<a class="code" href="_common_test_utils_8hpp.xhtml#a5fa64e793b38cf9074e6fcdb2c9c7293">Contains</a>(layersInGraph, <span class="stringliteral">&quot;conv2 layer unoptimizable&quot;</span>));</div><div class="line"><a name="l01187"></a><span class="lineno"> 1187</span>&#160;    BOOST_TEST(<a class="code" href="_common_test_utils_8hpp.xhtml#a5fa64e793b38cf9074e6fcdb2c9c7293">Contains</a>(layersInGraph, <span class="stringliteral">&quot;conv3 layer&quot;</span>));</div><div class="line"><a name="l01188"></a><span class="lineno"> 1188</span>&#160;    BOOST_TEST(<a class="code" href="_common_test_utils_8hpp.xhtml#a5fa64e793b38cf9074e6fcdb2c9c7293">Contains</a>(layersInGraph, <span class="stringliteral">&quot;add layer&quot;</span>));</div><div class="line"><a name="l01189"></a><span class="lineno"> 1189</span>&#160;</div><div class="line"><a name="l01190"></a><span class="lineno"> 1190</span>&#160;    <span class="comment">// Create a mock backend object</span></div><div class="line"><a name="l01191"></a><span class="lineno"> 1191</span>&#160;    <a class="code" href="classarmnn_1_1_mock_backend_initialiser.xhtml">MockBackendInitialiser</a> initialiser; <span class="comment">// Register the Mock Backend</span></div><div class="line"><a name="l01192"></a><span class="lineno"> 1192</span>&#160;    <span class="keyword">auto</span> backendObjPtr = <a class="code" href="_common_test_utils_8cpp.xhtml#a7a4090354279f08b1e27244bab25aa86">CreateBackendObject</a>(<a class="code" href="namespacearmnn.xhtml#a17955517b0d148f7ffdbffe8b46e41e0">MockBackendId</a>());</div><div class="line"><a name="l01193"></a><span class="lineno"> 1193</span>&#160;    BOOST_TEST((backendObjPtr != <span class="keyword">nullptr</span>));</div><div class="line"><a name="l01194"></a><span class="lineno"> 1194</span>&#160;</div><div class="line"><a name="l01195"></a><span class="lineno"> 1195</span>&#160;    <span class="comment">// Optimize the subgraph</span></div><div class="line"><a name="l01196"></a><span class="lineno"> 1196</span>&#160;    <a class="code" href="classarmnn_1_1_optimization_views.xhtml">OptimizationViews</a> optimizationViews;</div><div class="line"><a name="l01197"></a><span class="lineno"> 1197</span>&#160;</div><div class="line"><a name="l01198"></a><span class="lineno"> 1198</span>&#160;    <span class="comment">// Check that the optimization is carried out correctly</span></div><div class="line"><a name="l01199"></a><span class="lineno"> 1199</span>&#160;    BOOST_CHECK_NO_THROW(optimizationViews = backendObjPtr-&gt;OptimizeSubgraphView(*subgraphPtr));</div><div class="line"><a name="l01200"></a><span class="lineno"> 1200</span>&#160;</div><div class="line"><a name="l01201"></a><span class="lineno"> 1201</span>&#160;    <span class="comment">// ==============================================================================</span></div><div class="line"><a name="l01202"></a><span class="lineno"> 1202</span>&#160;    <span class="comment">// The expected results are:</span></div><div class="line"><a name="l01203"></a><span class="lineno"> 1203</span>&#160;    <span class="comment">//  - Exactly one substitution, corresponding to the optimizable layers</span></div><div class="line"><a name="l01204"></a><span class="lineno"> 1204</span>&#160;    <span class="comment">//  - No failed subgraphs</span></div><div class="line"><a name="l01205"></a><span class="lineno"> 1205</span>&#160;    <span class="comment">//  - Exactly two untouched subgraphs, corresponding to the non-optimizable layer</span></div><div class="line"><a name="l01206"></a><span class="lineno"> 1206</span>&#160;    <span class="comment">// ==============================================================================</span></div><div class="line"><a name="l01207"></a><span class="lineno"> 1207</span>&#160;</div><div class="line"><a name="l01208"></a><span class="lineno"> 1208</span>&#160;    <span class="comment">// -----------------------</span></div><div class="line"><a name="l01209"></a><span class="lineno"> 1209</span>&#160;    <span class="comment">// Check the substitutions</span></div><div class="line"><a name="l01210"></a><span class="lineno"> 1210</span>&#160;    <span class="comment">// -----------------------</span></div><div class="line"><a name="l01211"></a><span class="lineno"> 1211</span>&#160;</div><div class="line"><a name="l01212"></a><span class="lineno"> 1212</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_optimization_views.xhtml#a5831f7597baa44356221647c45a14f78">OptimizationViews::Substitutions</a>&amp; substitutions = optimizationViews.<a class="code" href="classarmnn_1_1_optimization_views.xhtml#a9a1555f25af4a0ae2c0a1fc0ed9aded8">GetSubstitutions</a>();</div><div class="line"><a name="l01213"></a><span class="lineno"> 1213</span>&#160;    BOOST_TEST(substitutions.size() == 1);</div><div class="line"><a name="l01214"></a><span class="lineno"> 1214</span>&#160;</div><div class="line"><a name="l01215"></a><span class="lineno"> 1215</span>&#160;    ExpectedSubgraphSize expectedSubstitutableSubgraphSizes{ 2, 1, 3 };</div><div class="line"><a name="l01216"></a><span class="lineno"> 1216</span>&#160;    ExpectedSubgraphSize expectedReplacementSubgraphSizes{ 2, 1, 1 };</div><div class="line"><a name="l01217"></a><span class="lineno"> 1217</span>&#160;</div><div class="line"><a name="l01218"></a><span class="lineno"> 1218</span>&#160;    <a class="code" href="classarmnn_1_1_subgraph_view.xhtml#a5cc65e15002dbc33a5c8a7d6680e9a9d">SubgraphView::InputSlots</a> expectedSubstitutableInputSlots = {</div><div class="line"><a name="l01219"></a><span class="lineno"> 1219</span>&#160;        ConvertReferenceTypeToPointerType(layersInGraph.at(<span class="stringliteral">&quot;conv1 layer&quot;</span>)-&gt;GetInputSlots()[0]),</div><div class="line"><a name="l01220"></a><span class="lineno"> 1220</span>&#160;        ConvertReferenceTypeToPointerType(layersInGraph.at(<span class="stringliteral">&quot;conv3 layer&quot;</span>)-&gt;GetInputSlots()[0])</div><div class="line"><a name="l01221"></a><span class="lineno"> 1221</span>&#160;    };</div><div class="line"><a name="l01222"></a><span class="lineno"> 1222</span>&#160;    <a class="code" href="classarmnn_1_1_subgraph_view.xhtml#a78293334750ec5279eb9c96d56deaf08">SubgraphView::OutputSlots</a> expectedSubstitutableOutputSlots =</div><div class="line"><a name="l01223"></a><span class="lineno"> 1223</span>&#160;    {</div><div class="line"><a name="l01224"></a><span class="lineno"> 1224</span>&#160;        ConvertReferenceTypeToPointerType(layersInGraph.at(<span class="stringliteral">&quot;add layer&quot;</span>)-&gt;GetOutputSlots()[0])</div><div class="line"><a name="l01225"></a><span class="lineno"> 1225</span>&#160;    };</div><div class="line"><a name="l01226"></a><span class="lineno"> 1226</span>&#160;    <a class="code" href="classarmnn_1_1_subgraph_view.xhtml#a74798938fdaeae75c8adfa4a7439e7f9">SubgraphView::Layers</a> expectedSubstitutableLayers</div><div class="line"><a name="l01227"></a><span class="lineno"> 1227</span>&#160;    {</div><div class="line"><a name="l01228"></a><span class="lineno"> 1228</span>&#160;        layersInGraph.at(<span class="stringliteral">&quot;conv1 layer&quot;</span>),</div><div class="line"><a name="l01229"></a><span class="lineno"> 1229</span>&#160;        layersInGraph.at(<span class="stringliteral">&quot;conv3 layer&quot;</span>),</div><div class="line"><a name="l01230"></a><span class="lineno"> 1230</span>&#160;        layersInGraph.at(<span class="stringliteral">&quot;add layer&quot;</span>)</div><div class="line"><a name="l01231"></a><span class="lineno"> 1231</span>&#160;    };</div><div class="line"><a name="l01232"></a><span class="lineno"> 1232</span>&#160;</div><div class="line"><a name="l01233"></a><span class="lineno"> 1233</span>&#160;    CheckSubstitution(substitutions[0],</div><div class="line"><a name="l01234"></a><span class="lineno"> 1234</span>&#160;                      expectedSubstitutableSubgraphSizes,</div><div class="line"><a name="l01235"></a><span class="lineno"> 1235</span>&#160;                      expectedReplacementSubgraphSizes,</div><div class="line"><a name="l01236"></a><span class="lineno"> 1236</span>&#160;                      expectedSubstitutableInputSlots,</div><div class="line"><a name="l01237"></a><span class="lineno"> 1237</span>&#160;                      expectedSubstitutableOutputSlots,</div><div class="line"><a name="l01238"></a><span class="lineno"> 1238</span>&#160;                      expectedSubstitutableLayers);</div><div class="line"><a name="l01239"></a><span class="lineno"> 1239</span>&#160;</div><div class="line"><a name="l01240"></a><span class="lineno"> 1240</span>&#160;    <span class="comment">// --------------------------</span></div><div class="line"><a name="l01241"></a><span class="lineno"> 1241</span>&#160;    <span class="comment">// Check the failed subgraphs</span></div><div class="line"><a name="l01242"></a><span class="lineno"> 1242</span>&#160;    <span class="comment">// --------------------------</span></div><div class="line"><a name="l01243"></a><span class="lineno"> 1243</span>&#160;</div><div class="line"><a name="l01244"></a><span class="lineno"> 1244</span>&#160;    BOOST_TEST(optimizationViews.<a class="code" href="classarmnn_1_1_optimization_views.xhtml#ad5fee4381bf82ffa37658dddf4d1fa01">GetFailedSubgraphs</a>().empty());</div><div class="line"><a name="l01245"></a><span class="lineno"> 1245</span>&#160;</div><div class="line"><a name="l01246"></a><span class="lineno"> 1246</span>&#160;    <span class="comment">// -----------------------------</span></div><div class="line"><a name="l01247"></a><span class="lineno"> 1247</span>&#160;    <span class="comment">// Check the untouched subgraphs</span></div><div class="line"><a name="l01248"></a><span class="lineno"> 1248</span>&#160;    <span class="comment">// -----------------------------</span></div><div class="line"><a name="l01249"></a><span class="lineno"> 1249</span>&#160;</div><div class="line"><a name="l01250"></a><span class="lineno"> 1250</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_optimization_views.xhtml#a4a2c55491ad3a0a6a98a884b3e3fe6d7">OptimizationViews::Subgraphs</a>&amp; untouchedSubgraphs = optimizationViews.<a class="code" href="classarmnn_1_1_optimization_views.xhtml#a3b4dae097ce086ce94079d09cce18703">GetUntouchedSubgraphs</a>();</div><div class="line"><a name="l01251"></a><span class="lineno"> 1251</span>&#160;    BOOST_TEST(untouchedSubgraphs.size() == 1);</div><div class="line"><a name="l01252"></a><span class="lineno"> 1252</span>&#160;</div><div class="line"><a name="l01253"></a><span class="lineno"> 1253</span>&#160;    std::vector&lt;ExpectedSubgraphSize&gt; expectedUntouchedSubgraphSizes{ { 1, 1, 1 } };</div><div class="line"><a name="l01254"></a><span class="lineno"> 1254</span>&#160;    std::vector&lt;SubgraphView::InputSlots&gt; expectedUntouchedInputSlots</div><div class="line"><a name="l01255"></a><span class="lineno"> 1255</span>&#160;    {</div><div class="line"><a name="l01256"></a><span class="lineno"> 1256</span>&#160;        ConvertReferenceTypeToPointerType(layersInGraph.at(<span class="stringliteral">&quot;conv2 layer unoptimizable&quot;</span>)-&gt;GetInputSlots())</div><div class="line"><a name="l01257"></a><span class="lineno"> 1257</span>&#160;    };</div><div class="line"><a name="l01258"></a><span class="lineno"> 1258</span>&#160;    std::vector&lt;SubgraphView::OutputSlots&gt; expectedUntouchedOutputSlots</div><div class="line"><a name="l01259"></a><span class="lineno"> 1259</span>&#160;    {</div><div class="line"><a name="l01260"></a><span class="lineno"> 1260</span>&#160;        ConvertReferenceTypeToPointerType(layersInGraph.at(<span class="stringliteral">&quot;conv2 layer unoptimizable&quot;</span>)-&gt;GetOutputSlots())</div><div class="line"><a name="l01261"></a><span class="lineno"> 1261</span>&#160;    };</div><div class="line"><a name="l01262"></a><span class="lineno"> 1262</span>&#160;    std::vector&lt;SubgraphView::Layers&gt; expectedUntouchedLayers</div><div class="line"><a name="l01263"></a><span class="lineno"> 1263</span>&#160;    {</div><div class="line"><a name="l01264"></a><span class="lineno"> 1264</span>&#160;        { layersInGraph.at(<span class="stringliteral">&quot;conv2 layer unoptimizable&quot;</span>) }</div><div class="line"><a name="l01265"></a><span class="lineno"> 1265</span>&#160;    };</div><div class="line"><a name="l01266"></a><span class="lineno"> 1266</span>&#160;</div><div class="line"><a name="l01267"></a><span class="lineno"> 1267</span>&#160;    <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> untouchedIndex = 0; untouchedIndex &lt; untouchedSubgraphs.size(); untouchedIndex++)</div><div class="line"><a name="l01268"></a><span class="lineno"> 1268</span>&#160;    {</div><div class="line"><a name="l01269"></a><span class="lineno"> 1269</span>&#160;        CheckUntouchedSubgraph(untouchedSubgraphs.at(untouchedIndex),</div><div class="line"><a name="l01270"></a><span class="lineno"> 1270</span>&#160;                               expectedUntouchedSubgraphSizes.at(untouchedIndex),</div><div class="line"><a name="l01271"></a><span class="lineno"> 1271</span>&#160;                               expectedUntouchedInputSlots.at(untouchedIndex),</div><div class="line"><a name="l01272"></a><span class="lineno"> 1272</span>&#160;                               expectedUntouchedOutputSlots.at(untouchedIndex),</div><div class="line"><a name="l01273"></a><span class="lineno"> 1273</span>&#160;                               expectedUntouchedLayers.at(untouchedIndex));</div><div class="line"><a name="l01274"></a><span class="lineno"> 1274</span>&#160;    }</div><div class="line"><a name="l01275"></a><span class="lineno"> 1275</span>&#160;}</div><div class="line"><a name="l01276"></a><span class="lineno"> 1276</span>&#160;</div><div class="line"><a name="l01277"></a><span class="lineno"> 1277</span>&#160;} <span class="comment">// Anonymous namespace</span></div><div class="line"><a name="l01278"></a><span class="lineno"> 1278</span>&#160;</div><div class="line"><a name="l01279"></a><span class="lineno"> 1279</span>&#160;<a class="code" href="_output_shape_of_squeeze_8cpp.xhtml#ae3a6cb217a792718f2bd0e8f45e3ca9e">BOOST_AUTO_TEST_SUITE</a>(OptimizeSubGraph)</div><div class="line"><a name="l01280"></a><span class="lineno"> 1280</span>&#160;</div><div class="line"><a name="l01281"></a><span class="lineno"><a class="line" href="_optimize_subgraph_view_tests_8cpp.xhtml#a5ffebf96245c8aa1cd5b2fbe994e1e10"> 1281</a></span>&#160;<a class="code" href="namespacearmnn.xhtml#a10d15f3df1ab52b3b915a4be1dbf386b">BOOST_AUTO_TEST_CASE</a>(FullyUnsupportedSubgraph1)     { FullyUnsupporteSubgraphTestImpl1();      }</div><div class="line"><a name="l01282"></a><span class="lineno"><a class="line" href="_optimize_subgraph_view_tests_8cpp.xhtml#a9e6d23c8556595aae331380519e7445a"> 1282</a></span>&#160;<a class="code" href="namespacearmnn.xhtml#a10d15f3df1ab52b3b915a4be1dbf386b">BOOST_AUTO_TEST_CASE</a>(FullyUnsupportedSubgraph2)     { FullyUnsupporteSubgraphTestImpl2();      }</div><div class="line"><a name="l01283"></a><span class="lineno"><a class="line" href="_optimize_subgraph_view_tests_8cpp.xhtml#a579d155442271297fb19f02547e105a2"> 1283</a></span>&#160;<a class="code" href="namespacearmnn.xhtml#a10d15f3df1ab52b3b915a4be1dbf386b">BOOST_AUTO_TEST_CASE</a>(FullyOptimizableSubgraph1)     { FullyOptimizableSubgraphTestImpl1();     }</div><div class="line"><a name="l01284"></a><span class="lineno"><a class="line" href="_optimize_subgraph_view_tests_8cpp.xhtml#ae535ac8aafd0a4a990dba5d56cbbb5a3"> 1284</a></span>&#160;<a class="code" href="namespacearmnn.xhtml#a10d15f3df1ab52b3b915a4be1dbf386b">BOOST_AUTO_TEST_CASE</a>(FullyOptimizableSubgraph2)     { FullyOptimizableSubgraphTestImpl2();     }</div><div class="line"><a name="l01285"></a><span class="lineno"><a class="line" href="_optimize_subgraph_view_tests_8cpp.xhtml#a92f746ad4c195a8ceded6a0ea2a5f9a5"> 1285</a></span>&#160;<a class="code" href="namespacearmnn.xhtml#a10d15f3df1ab52b3b915a4be1dbf386b">BOOST_AUTO_TEST_CASE</a>(PartiallySupportedSubgraph)    { PartiallySupportedSubgraphTestImpl();    }</div><div class="line"><a name="l01286"></a><span class="lineno"><a class="line" href="_optimize_subgraph_view_tests_8cpp.xhtml#a3e51cd780865d9d354025d433dfbab59"> 1286</a></span>&#160;<a class="code" href="namespacearmnn.xhtml#a10d15f3df1ab52b3b915a4be1dbf386b">BOOST_AUTO_TEST_CASE</a>(FullyUnoptimizableSubgraph)    { FullyUnoptimizableSubgraphTestImpl1();   }</div><div class="line"><a name="l01287"></a><span class="lineno"><a class="line" href="_optimize_subgraph_view_tests_8cpp.xhtml#a44e188e5411c4179670da6b821216667"> 1287</a></span>&#160;<a class="code" href="namespacearmnn.xhtml#a10d15f3df1ab52b3b915a4be1dbf386b">BOOST_AUTO_TEST_CASE</a>(PartiallyOptimizableSubgraph1) { PartiallyOptimizableSubgraphTestImpl1(); }</div><div class="line"><a name="l01288"></a><span class="lineno"><a class="line" href="_optimize_subgraph_view_tests_8cpp.xhtml#a9772d0a847e798740a4e8ed3478b652c"> 1288</a></span>&#160;<a class="code" href="namespacearmnn.xhtml#a10d15f3df1ab52b3b915a4be1dbf386b">BOOST_AUTO_TEST_CASE</a>(PartiallyOptimizableSubgraph2) { PartiallyOptimizableSubgraphTestImpl2(); }</div><div class="line"><a name="l01289"></a><span class="lineno"> 1289</span>&#160;</div><div class="line"><a name="l01290"></a><span class="lineno"> 1290</span>&#160;<a class="code" href="_profiler_tests_8cpp.xhtml#af7f71af5c6c124222dd1c42c5df892f4">BOOST_AUTO_TEST_SUITE_END</a>()</div><div class="ttc" id="_output_shape_of_squeeze_8cpp_xhtml_ae3a6cb217a792718f2bd0e8f45e3ca9e"><div class="ttname"><a href="_output_shape_of_squeeze_8cpp.xhtml#ae3a6cb217a792718f2bd0e8f45e3ca9e">BOOST_AUTO_TEST_SUITE</a></div><div class="ttdeci">BOOST_AUTO_TEST_SUITE(TensorflowLiteParser)</div></div>
<div class="ttc" id="structarmnn_1_1_pooling2d_descriptor_xhtml_aa9e49717ebdb741e8c767741647fc618"><div class="ttname"><a href="structarmnn_1_1_pooling2d_descriptor.xhtml#aa9e49717ebdb741e8c767741647fc618">armnn::Pooling2dDescriptor::m_PadBottom</a></div><div class="ttdeci">uint32_t m_PadBottom</div><div class="ttdoc">Padding bottom value in the height dimension. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l00371">Descriptors.hpp:371</a></div></div>
<div class="ttc" id="structarmnn_1_1_pooling2d_descriptor_xhtml_ac18546ebbebbb32fe0a03baa9bf2c600"><div class="ttname"><a href="structarmnn_1_1_pooling2d_descriptor.xhtml#ac18546ebbebbb32fe0a03baa9bf2c600">armnn::Pooling2dDescriptor::m_PadLeft</a></div><div class="ttdeci">uint32_t m_PadLeft</div><div class="ttdoc">Padding left value in the width dimension. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l00365">Descriptors.hpp:365</a></div></div>
<div class="ttc" id="classarmnn_1_1_tensor_info_xhtml"><div class="ttname"><a href="classarmnn_1_1_tensor_info.xhtml">armnn::TensorInfo</a></div><div class="ttdef"><b>Definition:</b> <a href="_tensor_8hpp_source.xhtml#l00152">Tensor.hpp:152</a></div></div>
<div class="ttc" id="classarmnn_1_1_graph_xhtml_a7563c5b899e7d0ada08fd0fdb202f205"><div class="ttname"><a href="classarmnn_1_1_graph.xhtml#a7563c5b899e7d0ada08fd0fdb202f205">armnn::Graph::AddLayer</a></div><div class="ttdeci">LayerT * AddLayer(Args &amp;&amp;... args)</div><div class="ttdoc">Adds a new layer, of type LayerType, to the graph constructed with the arguments passed. </div><div class="ttdef"><b>Definition:</b> <a href="_graph_8hpp_source.xhtml#l00402">Graph.hpp:402</a></div></div>
<div class="ttc" id="_common_test_utils_8hpp_xhtml_a551d3e8e273f6ff0f4fc4b0b56e1895d"><div class="ttname"><a href="_common_test_utils_8hpp.xhtml#a551d3e8e273f6ff0f4fc4b0b56e1895d">AreEqual</a></div><div class="ttdeci">bool AreEqual(const CollectionType &amp;lhs, const CollectionType &amp;rhs)</div><div class="ttdef"><b>Definition:</b> <a href="_common_test_utils_8hpp_source.xhtml#l00026">CommonTestUtils.hpp:26</a></div></div>
<div class="ttc" id="structarmnn_1_1_pooling2d_descriptor_xhtml_a6d8fb685cc1ff224f25aa127fcf62c86"><div class="ttname"><a href="structarmnn_1_1_pooling2d_descriptor.xhtml#a6d8fb685cc1ff224f25aa127fcf62c86">armnn::Pooling2dDescriptor::m_PoolWidth</a></div><div class="ttdeci">uint32_t m_PoolWidth</div><div class="ttdoc">Pooling width value. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l00373">Descriptors.hpp:373</a></div></div>
<div class="ttc" id="structarmnn_1_1_convolution2d_descriptor_xhtml"><div class="ttname"><a href="structarmnn_1_1_convolution2d_descriptor.xhtml">armnn::Convolution2dDescriptor</a></div><div class="ttdoc">A Convolution2dDescriptor for the Convolution2dLayer. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l00408">Descriptors.hpp:408</a></div></div>
<div class="ttc" id="namespacearmnn_xhtml_ad8ed01ff3ff33333d8e19db4d2818bb6accedffbc6e5308e33d3843e8bdc0dad7"><div class="ttname"><a href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6accedffbc6e5308e33d3843e8bdc0dad7">armnn::DataType::Signed32</a></div></div>
<div class="ttc" id="_mock_backend_8hpp_xhtml"><div class="ttname"><a href="_mock_backend_8hpp.xhtml">MockBackend.hpp</a></div></div>
<div class="ttc" id="classarmnn_1_1_output_slot_xhtml_adcfb97035799ea4c043f9ef370714815"><div class="ttname"><a href="classarmnn_1_1_output_slot.xhtml#adcfb97035799ea4c043f9ef370714815">armnn::OutputSlot::Connect</a></div><div class="ttdeci">int Connect(InputSlot &amp;destination)</div><div class="ttdef"><b>Definition:</b> <a href="_layer_8cpp_source.xhtml#l00083">Layer.cpp:83</a></div></div>
<div class="ttc" id="classarmnn_1_1_subgraph_view_xhtml_a78293334750ec5279eb9c96d56deaf08"><div class="ttname"><a href="classarmnn_1_1_subgraph_view.xhtml#a78293334750ec5279eb9c96d56deaf08">armnn::SubgraphView::OutputSlots</a></div><div class="ttdeci">std::vector&lt; OutputSlot * &gt; OutputSlots</div><div class="ttdef"><b>Definition:</b> <a href="_subgraph_view_8hpp_source.xhtml#l00039">SubgraphView.hpp:39</a></div></div>
<div class="ttc" id="namespacearmnn_xhtml_a3888429b6ebc79f9a7df549e5e4d9a2fa843f2812f595e7ec7c5036e89fde02d6"><div class="ttname"><a href="namespacearmnn.xhtml#a3888429b6ebc79f9a7df549e5e4d9a2fa843f2812f595e7ec7c5036e89fde02d6">armnn::PaddingMethod::Exclude</a></div><div class="ttdoc">The padding fields don&amp;#39;t count and are ignored. </div></div>
<div class="ttc" id="structarmnn_1_1_pooling2d_descriptor_xhtml_a8c29d6ea9b4186d69aad5961c910939c"><div class="ttname"><a href="structarmnn_1_1_pooling2d_descriptor.xhtml#a8c29d6ea9b4186d69aad5961c910939c">armnn::Pooling2dDescriptor::m_PaddingMethod</a></div><div class="ttdeci">PaddingMethod m_PaddingMethod</div><div class="ttdoc">The padding method to be used. (Exclude, IgnoreValue). </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l00383">Descriptors.hpp:383</a></div></div>
<div class="ttc" id="namespacearmnn_xhtml_a17955517b0d148f7ffdbffe8b46e41e0"><div class="ttname"><a href="namespacearmnn.xhtml#a17955517b0d148f7ffdbffe8b46e41e0">armnn::MockBackendId</a></div><div class="ttdeci">constexpr const char * MockBackendId()</div><div class="ttdef"><b>Definition:</b> <a href="_mock_backend_id_8hpp_source.xhtml#l00011">MockBackendId.hpp:11</a></div></div>
<div class="ttc" id="classarmnn_1_1_optimization_views_xhtml"><div class="ttname"><a href="classarmnn_1_1_optimization_views.xhtml">armnn::OptimizationViews</a></div><div class="ttdef"><b>Definition:</b> <a href="include_2armnn_2backends_2_optimization_views_8hpp_source.xhtml#l00013">OptimizationViews.hpp:13</a></div></div>
<div class="ttc" id="structarmnn_1_1_pooling2d_descriptor_xhtml_a56b51f56cef50cdfa554258eecdab046"><div class="ttname"><a href="structarmnn_1_1_pooling2d_descriptor.xhtml#a56b51f56cef50cdfa554258eecdab046">armnn::Pooling2dDescriptor::m_PadTop</a></div><div class="ttdeci">uint32_t m_PadTop</div><div class="ttdoc">Padding top value in the height dimension. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l00369">Descriptors.hpp:369</a></div></div>
<div class="ttc" id="classarmnn_1_1_optimization_views_xhtml_a4a2c55491ad3a0a6a98a884b3e3fe6d7"><div class="ttname"><a href="classarmnn_1_1_optimization_views.xhtml#a4a2c55491ad3a0a6a98a884b3e3fe6d7">armnn::OptimizationViews::Subgraphs</a></div><div class="ttdeci">std::vector&lt; SubgraphView &gt; Subgraphs</div><div class="ttdef"><b>Definition:</b> <a href="include_2armnn_2backends_2_optimization_views_8hpp_source.xhtml#l00031">OptimizationViews.hpp:31</a></div></div>
<div class="ttc" id="classarmnn_1_1_optimization_views_xhtml_a5831f7597baa44356221647c45a14f78"><div class="ttname"><a href="classarmnn_1_1_optimization_views.xhtml#a5831f7597baa44356221647c45a14f78">armnn::OptimizationViews::Substitutions</a></div><div class="ttdeci">std::vector&lt; SubstitutionPair &gt; Substitutions</div><div class="ttdef"><b>Definition:</b> <a href="include_2armnn_2backends_2_optimization_views_8hpp_source.xhtml#l00032">OptimizationViews.hpp:32</a></div></div>
<div class="ttc" id="namespacearmnn_xhtml"><div class="ttname"><a href="namespacearmnn.xhtml">armnn</a></div><div class="ttdoc">Copyright (c) 2021 ARM Limited and Contributors. </div><div class="ttdef"><b>Definition:</b> <a href="01__00__software__tools_8dox_source.xhtml#l00006">01_00_software_tools.dox:6</a></div></div>
<div class="ttc" id="structarmnn_1_1_optimization_views_1_1_substitution_pair_xhtml_aa5e6108bf6fefef2d1affa6d89d23d3c"><div class="ttname"><a href="structarmnn_1_1_optimization_views_1_1_substitution_pair.xhtml#aa5e6108bf6fefef2d1affa6d89d23d3c">armnn::OptimizationViews::SubstitutionPair::m_SubstitutableSubgraph</a></div><div class="ttdeci">SubgraphView m_SubstitutableSubgraph</div><div class="ttdoc">Subgraph of Layers from the original graph which should be replaced. </div><div class="ttdef"><b>Definition:</b> <a href="include_2armnn_2backends_2_optimization_views_8hpp_source.xhtml#l00025">OptimizationViews.hpp:25</a></div></div>
<div class="ttc" id="_backend_registry_8hpp_xhtml"><div class="ttname"><a href="_backend_registry_8hpp.xhtml">BackendRegistry.hpp</a></div></div>
<div class="ttc" id="structarmnn_1_1_pooling2d_descriptor_xhtml_afe6a3377c4531315354def9023c8fdda"><div class="ttname"><a href="structarmnn_1_1_pooling2d_descriptor.xhtml#afe6a3377c4531315354def9023c8fdda">armnn::Pooling2dDescriptor::m_StrideX</a></div><div class="ttdeci">uint32_t m_StrideX</div><div class="ttdoc">Stride value when proceeding through input for the width dimension. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l00377">Descriptors.hpp:377</a></div></div>
<div class="ttc" id="classarmnn_1_1_mock_backend_initialiser_xhtml"><div class="ttname"><a href="classarmnn_1_1_mock_backend_initialiser.xhtml">armnn::MockBackendInitialiser</a></div><div class="ttdef"><b>Definition:</b> <a href="_mock_backend_8hpp_source.xhtml#l00022">MockBackend.hpp:22</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="_common_test_utils_8hpp_xhtml"><div class="ttname"><a href="_common_test_utils_8hpp.xhtml">CommonTestUtils.hpp</a></div></div>
<div class="ttc" id="classarmnn_1_1_subgraph_view_xhtml"><div class="ttname"><a href="classarmnn_1_1_subgraph_view.xhtml">armnn::SubgraphView</a></div><div class="ttdoc">The SubgraphView class represents a subgraph of a Graph. </div><div class="ttdef"><b>Definition:</b> <a href="_subgraph_view_8hpp_source.xhtml#l00023">SubgraphView.hpp:23</a></div></div>
<div class="ttc" id="structarmnn_1_1_pooling2d_descriptor_xhtml_a5699e8606c37d18c03910b242cd1b010"><div class="ttname"><a href="structarmnn_1_1_pooling2d_descriptor.xhtml#a5699e8606c37d18c03910b242cd1b010">armnn::Pooling2dDescriptor::m_PoolHeight</a></div><div class="ttdeci">uint32_t m_PoolHeight</div><div class="ttdoc">Pooling height value. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l00375">Descriptors.hpp:375</a></div></div>
<div class="ttc" id="classarmnn_1_1_layer_xhtml_acf8b8e23bf647836592982f97088d375"><div class="ttname"><a href="classarmnn_1_1_layer.xhtml#acf8b8e23bf647836592982f97088d375">armnn::Layer::GetInputSlot</a></div><div class="ttdeci">const InputSlot &amp; GetInputSlot(unsigned int index) const override</div><div class="ttdoc">Get a const input slot handle by slot index. </div><div class="ttdef"><b>Definition:</b> <a href="_layer_8hpp_source.xhtml#l00316">Layer.hpp:316</a></div></div>
<div class="ttc" id="structarmnn_1_1_convolution2d_descriptor_xhtml_afe6a3377c4531315354def9023c8fdda"><div class="ttname"><a href="structarmnn_1_1_convolution2d_descriptor.xhtml#afe6a3377c4531315354def9023c8fdda">armnn::Convolution2dDescriptor::m_StrideX</a></div><div class="ttdeci">uint32_t m_StrideX</div><div class="ttdoc">Stride value when proceeding through input for the width dimension. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l00446">Descriptors.hpp:446</a></div></div>
<div class="ttc" id="classarmnn_1_1_output_layer_xhtml"><div class="ttname"><a href="classarmnn_1_1_output_layer.xhtml">armnn::OutputLayer</a></div><div class="ttdoc">A layer user-provided data can be bound to (e.g. inputs, outputs). </div><div class="ttdef"><b>Definition:</b> <a href="_output_layer_8hpp_source.xhtml#l00013">OutputLayer.hpp:13</a></div></div>
<div class="ttc" id="classarmnn_1_1_subgraph_view_xhtml_a4684a457c7786484375f06e9ab2d2265"><div class="ttname"><a href="classarmnn_1_1_subgraph_view.xhtml#a4684a457c7786484375f06e9ab2d2265">armnn::SubgraphView::SubgraphViewPtr</a></div><div class="ttdeci">std::unique_ptr&lt; SubgraphView &gt; SubgraphViewPtr</div><div class="ttdef"><b>Definition:</b> <a href="_subgraph_view_8hpp_source.xhtml#l00037">SubgraphView.hpp:37</a></div></div>
<div class="ttc" id="structarmnn_1_1_optimization_views_1_1_substitution_pair_xhtml"><div class="ttname"><a href="structarmnn_1_1_optimization_views_1_1_substitution_pair.xhtml">armnn::OptimizationViews::SubstitutionPair</a></div><div class="ttdef"><b>Definition:</b> <a href="include_2armnn_2backends_2_optimization_views_8hpp_source.xhtml#l00022">OptimizationViews.hpp:22</a></div></div>
<div class="ttc" id="structarmnn_1_1_pooling2d_descriptor_xhtml_a002bc30e590d78cbb4f4d12171055ca7"><div class="ttname"><a href="structarmnn_1_1_pooling2d_descriptor.xhtml#a002bc30e590d78cbb4f4d12171055ca7">armnn::Pooling2dDescriptor::m_PadRight</a></div><div class="ttdeci">uint32_t m_PadRight</div><div class="ttdoc">Padding right value in the width dimension. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l00367">Descriptors.hpp:367</a></div></div>
<div class="ttc" id="_graph_8hpp_xhtml"><div class="ttname"><a href="_graph_8hpp.xhtml">Graph.hpp</a></div></div>
<div class="ttc" id="_common_test_utils_8cpp_xhtml_a9892eac8f1b8ed9cea0baf643fb6d951"><div class="ttname"><a href="_common_test_utils_8cpp.xhtml#a9892eac8f1b8ed9cea0baf643fb6d951">CreateInputsFrom</a></div><div class="ttdeci">SubgraphView::InputSlots CreateInputsFrom(const std::vector&lt; Layer *&gt; &amp;layers)</div><div class="ttdef"><b>Definition:</b> <a href="_common_test_utils_8cpp_source.xhtml#l00012">CommonTestUtils.cpp:12</a></div></div>
<div class="ttc" id="_common_test_utils_8hpp_xhtml_a5fa64e793b38cf9074e6fcdb2c9c7293"><div class="ttname"><a href="_common_test_utils_8hpp.xhtml#a5fa64e793b38cf9074e6fcdb2c9c7293">Contains</a></div><div class="ttdeci">bool Contains(const CollectionType &amp;collection, const typename CollectionType::value_type &amp;item)</div><div class="ttdef"><b>Definition:</b> <a href="_common_test_utils_8hpp_source.xhtml#l00043">CommonTestUtils.hpp:43</a></div></div>
<div class="ttc" id="namespacearmnn_xhtml_ad8ed01ff3ff33333d8e19db4d2818bb6a0a3f57c876f5a230244c38e1453a8a6e"><div class="ttname"><a href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6a0a3f57c876f5a230244c38e1453a8a6e">armnn::DataType::QAsymmU8</a></div></div>
<div class="ttc" id="classarmnn_1_1_optimization_views_xhtml_a3b4dae097ce086ce94079d09cce18703"><div class="ttname"><a href="classarmnn_1_1_optimization_views.xhtml#a3b4dae097ce086ce94079d09cce18703">armnn::OptimizationViews::GetUntouchedSubgraphs</a></div><div class="ttdeci">const Subgraphs &amp; GetUntouchedSubgraphs() const</div><div class="ttdef"><b>Definition:</b> <a href="include_2armnn_2backends_2_optimization_views_8hpp_source.xhtml#l00051">OptimizationViews.hpp:51</a></div></div>
<div class="ttc" id="classarmnn_1_1_optimization_views_xhtml_ad5fee4381bf82ffa37658dddf4d1fa01"><div class="ttname"><a href="classarmnn_1_1_optimization_views.xhtml#ad5fee4381bf82ffa37658dddf4d1fa01">armnn::OptimizationViews::GetFailedSubgraphs</a></div><div class="ttdeci">const Subgraphs &amp; GetFailedSubgraphs() const</div><div class="ttdef"><b>Definition:</b> <a href="include_2armnn_2backends_2_optimization_views_8hpp_source.xhtml#l00050">OptimizationViews.hpp:50</a></div></div>
<div class="ttc" id="namespacearmnn_xhtml_a961bbfe1db71a848eff5a1f0ab775718ab1897515d548a960afe49ecf66a29021"><div class="ttname"><a href="namespacearmnn.xhtml#a961bbfe1db71a848eff5a1f0ab775718ab1897515d548a960afe49ecf66a29021">armnn::PoolingAlgorithm::Average</a></div></div>
<div class="ttc" id="structarmnn_1_1_optimization_views_1_1_substitution_pair_xhtml_a02ba9897455deabc6626270fd88d6f4f"><div class="ttname"><a href="structarmnn_1_1_optimization_views_1_1_substitution_pair.xhtml#a02ba9897455deabc6626270fd88d6f4f">armnn::OptimizationViews::SubstitutionPair::m_ReplacementSubgraph</a></div><div class="ttdeci">SubgraphView m_ReplacementSubgraph</div><div class="ttdoc">A subgraph of new layers which will replace layers in m_SubstitutableSubgraph. </div><div class="ttdef"><b>Definition:</b> <a href="include_2armnn_2backends_2_optimization_views_8hpp_source.xhtml#l00028">OptimizationViews.hpp:28</a></div></div>
<div class="ttc" id="namespacearmnn_xhtml_a56943a0946e5f15e5e58054b8e7a04a4a1ba143ebe524d46181a4b53470693278"><div class="ttname"><a href="namespacearmnn.xhtml#a56943a0946e5f15e5e58054b8e7a04a4a1ba143ebe524d46181a4b53470693278">armnn::LayerType::PreCompiled</a></div></div>
<div class="ttc" id="namespacearmnn_xhtml_a10d15f3df1ab52b3b915a4be1dbf386b"><div class="ttname"><a href="namespacearmnn.xhtml#a10d15f3df1ab52b3b915a4be1dbf386b">armnn::BOOST_AUTO_TEST_CASE</a></div><div class="ttdeci">BOOST_AUTO_TEST_CASE(CheckConvolution2dLayer)</div><div class="ttdef"><b>Definition:</b> <a href="_const_tensor_layer_visitor_8cpp_source.xhtml#l00268">ConstTensorLayerVisitor.cpp:268</a></div></div>
<div class="ttc" id="classarmnn_1_1_graph_xhtml"><div class="ttname"><a href="classarmnn_1_1_graph.xhtml">armnn::Graph</a></div><div class="ttdef"><b>Definition:</b> <a href="_graph_8hpp_source.xhtml#l00029">Graph.hpp:29</a></div></div>
<div class="ttc" id="classarmnn_1_1_pooling2d_layer_xhtml"><div class="ttname"><a href="classarmnn_1_1_pooling2d_layer.xhtml">armnn::Pooling2dLayer</a></div><div class="ttdoc">This layer represents a pooling 2d operation. </div><div class="ttdef"><b>Definition:</b> <a href="_pooling2d_layer_8hpp_source.xhtml#l00013">Pooling2dLayer.hpp:13</a></div></div>
<div class="ttc" id="classarmnn_1_1_subgraph_view_xhtml_a5cc65e15002dbc33a5c8a7d6680e9a9d"><div class="ttname"><a href="classarmnn_1_1_subgraph_view.xhtml#a5cc65e15002dbc33a5c8a7d6680e9a9d">armnn::SubgraphView::InputSlots</a></div><div class="ttdeci">std::vector&lt; InputSlot * &gt; InputSlots</div><div class="ttdef"><b>Definition:</b> <a href="_subgraph_view_8hpp_source.xhtml#l00038">SubgraphView.hpp:38</a></div></div>
<div class="ttc" id="structarmnn_1_1_pooling2d_descriptor_xhtml_a6089e1ca91914015777ea780a513131a"><div class="ttname"><a href="structarmnn_1_1_pooling2d_descriptor.xhtml#a6089e1ca91914015777ea780a513131a">armnn::Pooling2dDescriptor::m_DataLayout</a></div><div class="ttdeci">DataLayout m_DataLayout</div><div class="ttdoc">The data layout to be used (NCHW, NHWC). </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l00385">Descriptors.hpp:385</a></div></div>
<div class="ttc" id="classarmnn_1_1_addition_layer_xhtml"><div class="ttname"><a href="classarmnn_1_1_addition_layer.xhtml">armnn::AdditionLayer</a></div><div class="ttdoc">This layer represents an addition operation. </div><div class="ttdef"><b>Definition:</b> <a href="_addition_layer_8hpp_source.xhtml#l00013">AdditionLayer.hpp:13</a></div></div>
<div class="ttc" id="classarmnn_1_1_subgraph_view_xhtml_a0b066a26219bcae83ca3e1d7f60fb123"><div class="ttname"><a href="classarmnn_1_1_subgraph_view.xhtml#a0b066a26219bcae83ca3e1d7f60fb123">armnn::SubgraphView::GetInputSlots</a></div><div class="ttdeci">const InputSlots &amp; GetInputSlots() const</div><div class="ttdef"><b>Definition:</b> <a href="_subgraph_view_8cpp_source.xhtml#l00124">SubgraphView.cpp:124</a></div></div>
<div class="ttc" id="classarmnn_1_1_optimization_views_xhtml_a9a1555f25af4a0ae2c0a1fc0ed9aded8"><div class="ttname"><a href="classarmnn_1_1_optimization_views.xhtml#a9a1555f25af4a0ae2c0a1fc0ed9aded8">armnn::OptimizationViews::GetSubstitutions</a></div><div class="ttdeci">const Substitutions &amp; GetSubstitutions() const</div><div class="ttdef"><b>Definition:</b> <a href="include_2armnn_2backends_2_optimization_views_8hpp_source.xhtml#l00049">OptimizationViews.hpp:49</a></div></div>
<div class="ttc" id="classarmnn_1_1_subgraph_view_selector_xhtml_a4684a457c7786484375f06e9ab2d2265"><div class="ttname"><a href="classarmnn_1_1_subgraph_view_selector.xhtml#a4684a457c7786484375f06e9ab2d2265">armnn::SubgraphViewSelector::SubgraphViewPtr</a></div><div class="ttdeci">std::unique_ptr&lt; SubgraphView &gt; SubgraphViewPtr</div><div class="ttdef"><b>Definition:</b> <a href="_subgraph_view_selector_8hpp_source.xhtml#l00024">SubgraphViewSelector.hpp:24</a></div></div>
<div class="ttc" id="_profiler_tests_8cpp_xhtml_af7f71af5c6c124222dd1c42c5df892f4"><div class="ttname"><a href="_profiler_tests_8cpp.xhtml#af7f71af5c6c124222dd1c42c5df892f4">BOOST_AUTO_TEST_SUITE_END</a></div><div class="ttdeci">BOOST_AUTO_TEST_SUITE_END()</div></div>
<div class="ttc" id="_common_test_utils_8cpp_xhtml_a3ed487c53d08c08186837be90030a855"><div class="ttname"><a href="_common_test_utils_8cpp.xhtml#a3ed487c53d08c08186837be90030a855">CreateSubgraphViewFrom</a></div><div class="ttdeci">SubgraphView::SubgraphViewPtr CreateSubgraphViewFrom(SubgraphView::InputSlots &amp;&amp;inputs, SubgraphView::OutputSlots &amp;&amp;outputs, SubgraphView::Layers &amp;&amp;layers)</div><div class="ttdef"><b>Definition:</b> <a href="_common_test_utils_8cpp_source.xhtml#l00038">CommonTestUtils.cpp:38</a></div></div>
<div class="ttc" id="_common_test_utils_8cpp_xhtml_ae405c72b6d52a1bf4b3471032e76e3f0"><div class="ttname"><a href="_common_test_utils_8cpp.xhtml#ae405c72b6d52a1bf4b3471032e76e3f0">CreateOutputsFrom</a></div><div class="ttdeci">SubgraphView::OutputSlots CreateOutputsFrom(const std::vector&lt; Layer *&gt; &amp;layers)</div><div class="ttdef"><b>Definition:</b> <a href="_common_test_utils_8cpp_source.xhtml#l00025">CommonTestUtils.cpp:25</a></div></div>
<div class="ttc" id="structarmnn_1_1_pooling2d_descriptor_xhtml_a0031997bf43bd2747656c31e4977793a"><div class="ttname"><a href="structarmnn_1_1_pooling2d_descriptor.xhtml#a0031997bf43bd2747656c31e4977793a">armnn::Pooling2dDescriptor::m_PoolType</a></div><div class="ttdeci">PoolingAlgorithm m_PoolType</div><div class="ttdoc">The pooling algorithm to use (Max. Average, L2). </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l00363">Descriptors.hpp:363</a></div></div>
<div class="ttc" id="classarmnn_1_1_subgraph_view_xhtml_a4b924dd808b6a155518d552c7ef3728f"><div class="ttname"><a href="classarmnn_1_1_subgraph_view.xhtml#a4b924dd808b6a155518d552c7ef3728f">armnn::SubgraphView::GetOutputSlots</a></div><div class="ttdeci">const OutputSlots &amp; GetOutputSlots() const</div><div class="ttdef"><b>Definition:</b> <a href="_subgraph_view_8cpp_source.xhtml#l00129">SubgraphView.cpp:129</a></div></div>
<div class="ttc" id="_common_test_utils_8hpp_xhtml_acacca57727df8ccf5c5597e6026da814"><div class="ttname"><a href="_common_test_utils_8hpp.xhtml#acacca57727df8ccf5c5597e6026da814">SetWeightAndBias</a></div><div class="ttdeci">void SetWeightAndBias(ConvolutionLayer *layer, const armnn::TensorInfo &amp;weightInfo, const armnn::TensorInfo &amp;biasInfo)</div><div class="ttdef"><b>Definition:</b> <a href="_common_test_utils_8hpp_source.xhtml#l00073">CommonTestUtils.hpp:73</a></div></div>
<div class="ttc" id="classarmnn_1_1_input_layer_xhtml"><div class="ttname"><a href="classarmnn_1_1_input_layer.xhtml">armnn::InputLayer</a></div><div class="ttdoc">A layer user-provided data can be bound to (e.g. inputs, outputs). </div><div class="ttdef"><b>Definition:</b> <a href="_input_layer_8hpp_source.xhtml#l00013">InputLayer.hpp:13</a></div></div>
<div class="ttc" id="_network_8hpp_xhtml"><div class="ttname"><a href="_network_8hpp.xhtml">Network.hpp</a></div></div>
<div class="ttc" id="classarmnn_1_1_output_slot_xhtml_a7e5c5771d741dd5473989047a9314728"><div class="ttname"><a href="classarmnn_1_1_output_slot.xhtml#a7e5c5771d741dd5473989047a9314728">armnn::OutputSlot::SetTensorInfo</a></div><div class="ttdeci">void SetTensorInfo(const TensorInfo &amp;tensorInfo) override</div><div class="ttdef"><b>Definition:</b> <a href="_layer_8cpp_source.xhtml#l00058">Layer.cpp:58</a></div></div>
<div class="ttc" id="_common_test_utils_8cpp_xhtml_a7a4090354279f08b1e27244bab25aa86"><div class="ttname"><a href="_common_test_utils_8cpp.xhtml#a7a4090354279f08b1e27244bab25aa86">CreateBackendObject</a></div><div class="ttdeci">armnn::IBackendInternalUniquePtr CreateBackendObject(const armnn::BackendId &amp;backendId)</div><div class="ttdef"><b>Definition:</b> <a href="_common_test_utils_8cpp_source.xhtml#l00045">CommonTestUtils.cpp:45</a></div></div>
<div class="ttc" id="classarmnn_1_1_subgraph_view_xhtml_ac8ac9809196ec980b8472fbc8367697a"><div class="ttname"><a href="classarmnn_1_1_subgraph_view.xhtml#ac8ac9809196ec980b8472fbc8367697a">armnn::SubgraphView::GetLayers</a></div><div class="ttdeci">const Layers &amp; GetLayers() const</div><div class="ttdef"><b>Definition:</b> <a href="_subgraph_view_8cpp_source.xhtml#l00164">SubgraphView.cpp:164</a></div></div>
<div class="ttc" id="classarmnn_1_1_layer_xhtml_a0e36688a43c35668d8db5257274c68fe"><div class="ttname"><a href="classarmnn_1_1_layer.xhtml#a0e36688a43c35668d8db5257274c68fe">armnn::Layer::GetOutputSlot</a></div><div class="ttdeci">const OutputSlot &amp; GetOutputSlot(unsigned int index=0) const override</div><div class="ttdoc">Get the const output slot handle by slot index. </div><div class="ttdef"><b>Definition:</b> <a href="_layer_8hpp_source.xhtml#l00318">Layer.hpp:318</a></div></div>
<div class="ttc" id="classarmnn_1_1_layer_xhtml_a7ddf0cf6f620d59c10e63495ace795d0"><div class="ttname"><a href="classarmnn_1_1_layer.xhtml#a7ddf0cf6f620d59c10e63495ace795d0">armnn::Layer::GetName</a></div><div class="ttdeci">const char * GetName() const override</div><div class="ttdoc">Returns the name of the layer. </div><div class="ttdef"><b>Definition:</b> <a href="_layer_8hpp_source.xhtml#l00311">Layer.hpp:311</a></div></div>
<div class="ttc" id="classarmnn_1_1_convolution2d_layer_xhtml"><div class="ttname"><a href="classarmnn_1_1_convolution2d_layer.xhtml">armnn::Convolution2dLayer</a></div><div class="ttdoc">This layer represents a convolution 2d operation. </div><div class="ttdef"><b>Definition:</b> <a href="_convolution2d_layer_8hpp_source.xhtml#l00015">Convolution2dLayer.hpp:15</a></div></div>
<div class="ttc" id="structarmnn_1_1_pooling2d_descriptor_xhtml"><div class="ttname"><a href="structarmnn_1_1_pooling2d_descriptor.xhtml">armnn::Pooling2dDescriptor</a></div><div class="ttdoc">A Pooling2dDescriptor for the Pooling2dLayer. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l00329">Descriptors.hpp:329</a></div></div>
<div class="ttc" id="classarmnn_1_1_subgraph_view_xhtml_a74798938fdaeae75c8adfa4a7439e7f9"><div class="ttname"><a href="classarmnn_1_1_subgraph_view.xhtml#a74798938fdaeae75c8adfa4a7439e7f9">armnn::SubgraphView::Layers</a></div><div class="ttdeci">std::list&lt; Layer * &gt; Layers</div><div class="ttdef"><b>Definition:</b> <a href="_subgraph_view_8hpp_source.xhtml#l00040">SubgraphView.hpp:40</a></div></div>
<div class="ttc" id="_mock_backend_id_8hpp_xhtml"><div class="ttname"><a href="_mock_backend_id_8hpp.xhtml">MockBackendId.hpp</a></div></div>
<div class="ttc" id="structarmnn_1_1_pooling2d_descriptor_xhtml_ac1fe174bbadfb39a2b636940c2e647c8"><div class="ttname"><a href="structarmnn_1_1_pooling2d_descriptor.xhtml#ac1fe174bbadfb39a2b636940c2e647c8">armnn::Pooling2dDescriptor::m_StrideY</a></div><div class="ttdeci">uint32_t m_StrideY</div><div class="ttdoc">Stride value when proceeding through input for the height dimension. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.xhtml#l00379">Descriptors.hpp:379</a></div></div>
<div class="ttc" id="classarmnn_1_1_layer_xhtml"><div class="ttname"><a href="classarmnn_1_1_layer.xhtml">armnn::Layer</a></div><div class="ttdef"><b>Definition:</b> <a href="_layer_8hpp_source.xhtml#l00210">Layer.hpp:210</a></div></div>
<div class="ttc" id="namespacearmnn_xhtml_ad1d5cce2d9e9a5d61c243e5c989112e0ad066db54b89b0912e7e7c6da51e2da51"><div class="ttname"><a href="namespacearmnn.xhtml#ad1d5cce2d9e9a5d61c243e5c989112e0ad066db54b89b0912e7e7c6da51e2da51">armnn::DataLayout::NHWC</a></div></div>
</div><!-- 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_0f3cdec46afbc61a1ded8e1687c9c9a0.xhtml">backends</a></li><li class="navelem"><a class="el" href="dir_797a213d7d01b98ef12d53b0820ea64e.xhtml">backendsCommon</a></li><li class="navelem"><a class="el" href="dir_28bfe507f7e135bdae07c2a6b7f66696.xhtml">test</a></li><li class="navelem"><a class="el" href="_optimize_subgraph_view_tests_8cpp.xhtml">OptimizeSubgraphViewTests.cpp</a></li>
    <li class="footer">Generated on Thu Feb 25 2021 17:27:51 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>