aboutsummaryrefslogtreecommitdiff
path: root/Documentation/_concat_layer_8cpp_source.html
blob: 2e0c551bd6fc4ad499a3879bec2a56aad7d08b25 (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
<!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="viewport" content="width=device-width, initial-scale=1"/>
<title>ArmNN: src/armnn/layers/ConcatLayer.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>
<link href="doxygen.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;">
  <td id="projectalign" style="padding-left: 0.5em;">
   <div id="projectname">ArmNN
   &#160;<span id="projectnumber">NotReleased</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('_concat_layer_8cpp_source.html','');});
</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">ConcatLayer.cpp</div>  </div>
</div><!--header-->
<div class="contents">
<a href="_concat_layer_8cpp.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno">    1</span>&#160;<span class="comment">//</span></div><div class="line"><a name="l00002"></a><span class="lineno">    2</span>&#160;<span class="comment">// Copyright © 2017 Arm Ltd. All rights reserved.</span></div><div class="line"><a name="l00003"></a><span class="lineno">    3</span>&#160;<span class="comment">// SPDX-License-Identifier: MIT</span></div><div class="line"><a name="l00004"></a><span class="lineno">    4</span>&#160;<span class="comment">//</span></div><div class="line"><a name="l00005"></a><span class="lineno">    5</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="_concat_layer_8hpp.html">ConcatLayer.hpp</a>&quot;</span></div><div class="line"><a name="l00006"></a><span class="lineno">    6</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="_layer_clone_base_8hpp.html">LayerCloneBase.hpp</a>&quot;</span></div><div class="line"><a name="l00007"></a><span class="lineno">    7</span>&#160;</div><div class="line"><a name="l00008"></a><span class="lineno">    8</span>&#160;<span class="preprocessor">#include &lt;<a class="code" href="_types_utils_8hpp.html">armnn/TypesUtils.hpp</a>&gt;</span></div><div class="line"><a name="l00009"></a><span class="lineno">    9</span>&#160;<span class="preprocessor">#include &lt;<a class="code" href="_workload_data_8hpp.html">backendsCommon/WorkloadData.hpp</a>&gt;</span></div><div class="line"><a name="l00010"></a><span class="lineno">   10</span>&#160;<span class="preprocessor">#include &lt;<a class="code" href="_workload_factory_8hpp.html">backendsCommon/WorkloadFactory.hpp</a>&gt;</span></div><div class="line"><a name="l00011"></a><span class="lineno">   11</span>&#160;</div><div class="line"><a name="l00012"></a><span class="lineno">   12</span>&#160;<span class="preprocessor">#include &lt;queue&gt;</span></div><div class="line"><a name="l00013"></a><span class="lineno">   13</span>&#160;</div><div class="line"><a name="l00014"></a><span class="lineno">   14</span>&#160;<span class="keyword">namespace </span><a class="code" href="namespacearmnn.html">armnn</a></div><div class="line"><a name="l00015"></a><span class="lineno">   15</span>&#160;{</div><div class="line"><a name="l00016"></a><span class="lineno">   16</span>&#160;</div><div class="line"><a name="l00017"></a><span class="lineno"><a class="line" href="classarmnn_1_1_concat_layer.html#abaa77c3ba53847ec462c2aaa1cfe3aa2">   17</a></span>&#160;<a class="code" href="classarmnn_1_1_concat_layer.html#abaa77c3ba53847ec462c2aaa1cfe3aa2">ConcatLayer::ConcatLayer</a>(<span class="keyword">const</span> <a class="code" href="structarmnn_1_1_origins_descriptor.html">OriginsDescriptor</a>&amp; param, <span class="keyword">const</span> <span class="keywordtype">char</span>* name)</div><div class="line"><a name="l00018"></a><span class="lineno">   18</span>&#160;    : <a class="code" href="classarmnn_1_1_layer_with_parameters.html">LayerWithParameters</a>(param.GetNumViews(), 1, <a class="code" href="namespacearmnn.html#a56943a0946e5f15e5e58054b8e7a04a4">LayerType</a>::<a class="code" href="namespacearmnn.html#a56943a0946e5f15e5e58054b8e7a04a4ae20f0f2826a6549809f050b86274567f">Concat</a>, param, name)</div><div class="line"><a name="l00019"></a><span class="lineno">   19</span>&#160;{</div><div class="line"><a name="l00020"></a><span class="lineno">   20</span>&#160;}</div><div class="line"><a name="l00021"></a><span class="lineno">   21</span>&#160;</div><div class="line"><a name="l00022"></a><span class="lineno"><a class="line" href="classarmnn_1_1_concat_layer.html#adfa912d0c4c6c00f1af2cbfa799572b7">   22</a></span>&#160;std::unique_ptr&lt;IWorkload&gt; <a class="code" href="classarmnn_1_1_concat_layer.html#adfa912d0c4c6c00f1af2cbfa799572b7">ConcatLayer::CreateWorkload</a>(<span class="keyword">const</span> <a class="code" href="classarmnn_1_1_i_workload_factory.html">IWorkloadFactory</a>&amp; factory)<span class="keyword"> const</span></div><div class="line"><a name="l00023"></a><span class="lineno">   23</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l00024"></a><span class="lineno">   24</span>&#160;    <a class="code" href="structarmnn_1_1_concat_queue_descriptor.html">ConcatQueueDescriptor</a> descriptor;</div><div class="line"><a name="l00025"></a><span class="lineno">   25</span>&#160;</div><div class="line"><a name="l00026"></a><span class="lineno">   26</span>&#160;    <span class="comment">// Copies the view origins to the descriptor.</span></div><div class="line"><a name="l00027"></a><span class="lineno">   27</span>&#160;    descriptor.<a class="code" href="structarmnn_1_1_concat_queue_descriptor.html#ab1794eb3e74c9700cd3d500fc06dc2e5">m_ViewOrigins</a>.reserve(<a class="code" href="classarmnn_1_1_layer_with_parameters.html#ad32ac22bc72e28dfd6b466d143c8e262">m_Param</a>.<a class="code" href="structarmnn_1_1_origins_descriptor.html#a35546e7b56e6e972a495b48748478ede">GetNumViews</a>());</div><div class="line"><a name="l00028"></a><span class="lineno">   28</span>&#160;    <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i = 0; i &lt; <a class="code" href="classarmnn_1_1_layer_with_parameters.html#ad32ac22bc72e28dfd6b466d143c8e262">m_Param</a>.<a class="code" href="structarmnn_1_1_origins_descriptor.html#a35546e7b56e6e972a495b48748478ede">GetNumViews</a>(); ++i)</div><div class="line"><a name="l00029"></a><span class="lineno">   29</span>&#160;    {</div><div class="line"><a name="l00030"></a><span class="lineno">   30</span>&#160;        descriptor.<a class="code" href="structarmnn_1_1_concat_queue_descriptor.html#ab1794eb3e74c9700cd3d500fc06dc2e5">m_ViewOrigins</a>.emplace_back(</div><div class="line"><a name="l00031"></a><span class="lineno">   31</span>&#160;            std::vector&lt;unsigned int&gt;(<a class="code" href="classarmnn_1_1_layer_with_parameters.html#ad32ac22bc72e28dfd6b466d143c8e262">m_Param</a>.<a class="code" href="structarmnn_1_1_origins_descriptor.html#ab78e6fe963508c1ac5c00d04bb3361a3">GetViewOrigin</a>(i), <a class="code" href="classarmnn_1_1_layer_with_parameters.html#ad32ac22bc72e28dfd6b466d143c8e262">m_Param</a>.<a class="code" href="structarmnn_1_1_origins_descriptor.html#ab78e6fe963508c1ac5c00d04bb3361a3">GetViewOrigin</a>(i) + <a class="code" href="classarmnn_1_1_layer_with_parameters.html#ad32ac22bc72e28dfd6b466d143c8e262">m_Param</a>.<a class="code" href="structarmnn_1_1_origins_descriptor.html#a78e8266be865fdd92cadd04d6e25ae1f">GetNumDimensions</a>()));</div><div class="line"><a name="l00032"></a><span class="lineno">   32</span>&#160;    }</div><div class="line"><a name="l00033"></a><span class="lineno">   33</span>&#160;</div><div class="line"><a name="l00034"></a><span class="lineno">   34</span>&#160;    <span class="keywordflow">return</span> factory.<a class="code" href="classarmnn_1_1_i_workload_factory.html#a32bb8d6cf5fc028bf501252767c08b21">CreateConcat</a>(descriptor, <a class="code" href="classarmnn_1_1_layer_with_parameters.html#a30a858b2b26d651a066537e499fbf40d">PrepInfoAndDesc</a>(descriptor));</div><div class="line"><a name="l00035"></a><span class="lineno">   35</span>&#160;}</div><div class="line"><a name="l00036"></a><span class="lineno">   36</span>&#160;</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> FactoryType&gt;</div><div class="line"><a name="l00038"></a><span class="lineno">   38</span>&#160;<span class="keywordtype">void</span> ConcatLayer::CreateTensors(<span class="keyword">const</span> <a class="code" href="_cl_layer_tests_8cpp.html#a255d08081b372809a176b588529296aa">FactoryType</a>&amp; factory)</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="comment">//If sub tensors are supported then the concat</span></div><div class="line"><a name="l00041"></a><span class="lineno">   41</span>&#160;    <span class="comment">//just needs to make sure that the outputs of the prev layer</span></div><div class="line"><a name="l00042"></a><span class="lineno">   42</span>&#160;    <span class="comment">//are made subtensors of the output of the concat layer.</span></div><div class="line"><a name="l00043"></a><span class="lineno">   43</span>&#160;    <a class="code" href="classarmnn_1_1_layer.html#aa44d91037bba52ba0dec6577509ade3b">m_OutputHandlers</a>[0].CreateTensorHandles(factory);</div><div class="line"><a name="l00044"></a><span class="lineno">   44</span>&#160;</div><div class="line"><a name="l00045"></a><span class="lineno">   45</span>&#160;    <span class="keywordflow">if</span> (factory.SupportsSubTensors())</div><div class="line"><a name="l00046"></a><span class="lineno">   46</span>&#160;    {</div><div class="line"><a name="l00047"></a><span class="lineno">   47</span>&#160;        <a class="code" href="classarmnn_1_1_i_tensor_handle_factory.html#a32f4aa6a7089d877af08928139c2c277">ITensorHandleFactory::FactoryId</a> factoryId = <a class="code" href="classarmnn_1_1_layer.html#a0e36688a43c35668d8db5257274c68fe">GetOutputSlot</a>(0).<a class="code" href="classarmnn_1_1_output_slot.html#af303cf872a3f95e29992e45224e4cf8e">GetTensorHandleFactoryId</a>();</div><div class="line"><a name="l00048"></a><span class="lineno">   48</span>&#160;</div><div class="line"><a name="l00049"></a><span class="lineno">   49</span>&#160;        std::queue&lt;ConcatLayer*&gt; m_ConcatLayers;</div><div class="line"><a name="l00050"></a><span class="lineno">   50</span>&#160;</div><div class="line"><a name="l00051"></a><span class="lineno">   51</span>&#160;        m_ConcatLayers.push(<span class="keyword">this</span>);</div><div class="line"><a name="l00052"></a><span class="lineno">   52</span>&#160;        <span class="keywordflow">while</span> (!m_ConcatLayers.empty())</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;            <a class="code" href="classarmnn_1_1_concat_layer.html">ConcatLayer</a>* currentLayer = m_ConcatLayers.front();</div><div class="line"><a name="l00055"></a><span class="lineno">   55</span>&#160;            <a class="code" href="classarmnn_1_1_i_tensor_handle.html">ITensorHandle</a>* parentTensor = currentLayer-&gt;<a class="code" href="classarmnn_1_1_layer.html#af2c0edc7ea62a8baaec4d3d9b2b09256">GetOutputHandler</a>(0).<a class="code" href="classarmnn_1_1_output_handler.html#afe3429ac30b180c11f01ea0f9f546f0e">GetData</a>();</div><div class="line"><a name="l00056"></a><span class="lineno">   56</span>&#160;            <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_info.html">TensorInfo</a>&amp; parentInfo = currentLayer-&gt;<a class="code" href="classarmnn_1_1_layer.html#af2c0edc7ea62a8baaec4d3d9b2b09256">GetOutputHandler</a>(0).<a class="code" href="classarmnn_1_1_output_handler.html#a66e8f43a5b42b500871ed96e15419567">GetTensorInfo</a>();</div><div class="line"><a name="l00057"></a><span class="lineno">   57</span>&#160;            m_ConcatLayers.pop();</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;            <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> numInputSlots = currentLayer-&gt;<a class="code" href="classarmnn_1_1_layer.html#abc0660dc440c8a285b456c9ef6383c26">GetNumInputSlots</a>();</div><div class="line"><a name="l00060"></a><span class="lineno">   60</span>&#160;</div><div class="line"><a name="l00061"></a><span class="lineno">   61</span>&#160;            <span class="comment">// First go through all the input slots and verify that we can sub-tensor all the inputs.</span></div><div class="line"><a name="l00062"></a><span class="lineno">   62</span>&#160;            std::vector&lt;std::unique_ptr&lt;ITensorHandle&gt;&gt; subTensors(0);</div><div class="line"><a name="l00063"></a><span class="lineno">   63</span>&#160;            subTensors.reserve(numInputSlots);</div><div class="line"><a name="l00064"></a><span class="lineno">   64</span>&#160;            <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i = 0; i &lt; numInputSlots; ++i)</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_output_slot.html">OutputSlot</a>* slot = currentLayer-&gt;<a class="code" href="classarmnn_1_1_layer.html#acf8b8e23bf647836592982f97088d375">GetInputSlot</a>(i).<a class="code" href="classarmnn_1_1_input_slot.html#a9effd325a6d512a3f8ff4bd207d53255">GetConnectedOutputSlot</a>();</div><div class="line"><a name="l00067"></a><span class="lineno">   67</span>&#160;                <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_info.html">TensorInfo</a>&amp; <a class="code" href="namespacearmnn.html#a4dc0adc6737b5944e7671bee71788407acaf9b6b99962bf5c2264824231d7a40c">info</a> = slot-&gt;<a class="code" href="classarmnn_1_1_output_slot.html#ada2ad7d1caeeb4ef6195c8925fad6a65">GetTensorInfo</a>();</div><div class="line"><a name="l00068"></a><span class="lineno">   68</span>&#160;</div><div class="line"><a name="l00069"></a><span class="lineno">   69</span>&#160;                <span class="keyword">auto</span> CreateSubTensor = [&amp;]()</div><div class="line"><a name="l00070"></a><span class="lineno">   70</span>&#160;                {</div><div class="line"><a name="l00071"></a><span class="lineno">   71</span>&#160;                    <span class="comment">// Make sure:</span></div><div class="line"><a name="l00072"></a><span class="lineno">   72</span>&#160;                    <span class="comment">// 1) quantization parameters are in the same space</span></div><div class="line"><a name="l00073"></a><span class="lineno">   73</span>&#160;                    <span class="comment">// 2) the same TensorHandleFactory is used for input and Concat layer output</span></div><div class="line"><a name="l00074"></a><span class="lineno">   74</span>&#160;                    <span class="comment">// 3) the input does not come from a Constant layer or input layer</span></div><div class="line"><a name="l00075"></a><span class="lineno">   75</span>&#160;                    <span class="comment">// 4) the input is only read by this concat layer</span></div><div class="line"><a name="l00076"></a><span class="lineno">   76</span>&#160;                    <span class="keywordflow">if</span> (slot &amp;&amp;</div><div class="line"><a name="l00077"></a><span class="lineno">   77</span>&#160;                        parentInfo.<a class="code" href="classarmnn_1_1_tensor_info.html#a22f377fc4e10dc1773a3f979061e85f1">IsTypeSpaceMatch</a>(info) &amp;&amp; <span class="comment">//(1)</span></div><div class="line"><a name="l00078"></a><span class="lineno">   78</span>&#160;                        factoryId == slot-&gt;<a class="code" href="classarmnn_1_1_output_slot.html#af303cf872a3f95e29992e45224e4cf8e">GetTensorHandleFactoryId</a>() &amp;&amp; <span class="comment">//(2)</span></div><div class="line"><a name="l00079"></a><span class="lineno">   79</span>&#160;                        slot-&gt;<a class="code" href="classarmnn_1_1_output_slot.html#a7ddaf04177053a536f0e7be83a642bc6">GetOwningLayer</a>().<a class="code" href="classarmnn_1_1_layer.html#aaef29472862381822654ab6cbf7cba2a">GetType</a>() != <a class="code" href="namespacearmnn.html#a56943a0946e5f15e5e58054b8e7a04a4acb17869fe51048b5a5c4c6106551a255">LayerType::Constant</a> &amp;&amp; <span class="comment">//(3)</span></div><div class="line"><a name="l00080"></a><span class="lineno">   80</span>&#160;                        slot-&gt;<a class="code" href="classarmnn_1_1_output_slot.html#a7ddaf04177053a536f0e7be83a642bc6">GetOwningLayer</a>().<a class="code" href="classarmnn_1_1_layer.html#aaef29472862381822654ab6cbf7cba2a">GetType</a>() != <a class="code" href="namespacearmnn.html#a56943a0946e5f15e5e58054b8e7a04a4a324118a6721dd6b8a9b9f4e327df2bf5">LayerType::Input</a> &amp;&amp; <span class="comment">//(3)</span></div><div class="line"><a name="l00081"></a><span class="lineno">   81</span>&#160;                        slot-&gt;<a class="code" href="classarmnn_1_1_output_slot.html#a25b0119c02aece1d341b99953d169c0f">GetNumConnections</a>() == 1) <span class="comment">//(4)</span></div><div class="line"><a name="l00082"></a><span class="lineno">   82</span>&#160;                    {</div><div class="line"><a name="l00083"></a><span class="lineno">   83</span>&#160;                        <span class="keywordflow">return</span> factory.CreateSubTensorHandle(*parentTensor,</div><div class="line"><a name="l00084"></a><span class="lineno">   84</span>&#160;                                                             info.<a class="code" href="classarmnn_1_1_tensor_info.html#a8b5d0f8a24e9d9238f412260a552acf8">GetShape</a>(),</div><div class="line"><a name="l00085"></a><span class="lineno">   85</span>&#160;                                                             currentLayer-&gt;<a class="code" href="classarmnn_1_1_layer_with_parameters.html#ad32ac22bc72e28dfd6b466d143c8e262">m_Param</a>.<a class="code" href="structarmnn_1_1_origins_descriptor.html#ab78e6fe963508c1ac5c00d04bb3361a3">GetViewOrigin</a>(i));</div><div class="line"><a name="l00086"></a><span class="lineno">   86</span>&#160;                    }</div><div class="line"><a name="l00087"></a><span class="lineno">   87</span>&#160;                    <span class="keywordflow">return</span> std::unique_ptr&lt;ITensorHandle&gt;();</div><div class="line"><a name="l00088"></a><span class="lineno">   88</span>&#160;                };</div><div class="line"><a name="l00089"></a><span class="lineno">   89</span>&#160;</div><div class="line"><a name="l00090"></a><span class="lineno">   90</span>&#160;                <span class="keyword">auto</span> subTensor = CreateSubTensor();</div><div class="line"><a name="l00091"></a><span class="lineno">   91</span>&#160;                <span class="keywordflow">if</span> (!subTensor)</div><div class="line"><a name="l00092"></a><span class="lineno">   92</span>&#160;                {</div><div class="line"><a name="l00093"></a><span class="lineno">   93</span>&#160;                    <span class="keywordflow">break</span>; <span class="comment">//Failed to create a valid sub-tensor, so stop trying with the rest of the inputs.</span></div><div class="line"><a name="l00094"></a><span class="lineno">   94</span>&#160;                }</div><div class="line"><a name="l00095"></a><span class="lineno">   95</span>&#160;                <span class="keywordflow">else</span></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;                    subTensors.push_back(std::move(subTensor)); <span class="comment">// store the valid sub-tensor.</span></div><div class="line"><a name="l00098"></a><span class="lineno">   98</span>&#160;                }</div><div class="line"><a name="l00099"></a><span class="lineno">   99</span>&#160;            }</div><div class="line"><a name="l00100"></a><span class="lineno">  100</span>&#160;</div><div class="line"><a name="l00101"></a><span class="lineno">  101</span>&#160;            <span class="comment">// Ensure that ALL inputs can be substituted with valid sub-tensors</span></div><div class="line"><a name="l00102"></a><span class="lineno">  102</span>&#160;            <span class="keywordflow">if</span> (subTensors.size() &lt; numInputSlots)</div><div class="line"><a name="l00103"></a><span class="lineno">  103</span>&#160;            {</div><div class="line"><a name="l00104"></a><span class="lineno">  104</span>&#160;                <span class="keywordflow">continue</span>; <span class="comment">// Don&#39;t optimize this Concat layer with sub-tensors</span></div><div class="line"><a name="l00105"></a><span class="lineno">  105</span>&#160;            }</div><div class="line"><a name="l00106"></a><span class="lineno">  106</span>&#160;</div><div class="line"><a name="l00107"></a><span class="lineno">  107</span>&#160;            <span class="comment">// Substitute input tensors with sub-tensors by replacing the output tensors on the connected layers.</span></div><div class="line"><a name="l00108"></a><span class="lineno">  108</span>&#160;            <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i=0;</div><div class="line"><a name="l00109"></a><span class="lineno">  109</span>&#160;            <span class="keywordflow">for</span> (<span class="keyword">auto</span>&amp; subTensor : subTensors)</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;                <a class="code" href="classarmnn_1_1_output_slot.html">OutputSlot</a>* slot = currentLayer-&gt;<a class="code" href="classarmnn_1_1_layer.html#acf8b8e23bf647836592982f97088d375">GetInputSlot</a>(i).<a class="code" href="classarmnn_1_1_input_slot.html#a9effd325a6d512a3f8ff4bd207d53255">GetConnectedOutputSlot</a>();</div><div class="line"><a name="l00112"></a><span class="lineno">  112</span>&#160;                <a class="code" href="classarmnn_1_1_output_handler.html">OutputHandler</a>&amp; outputHandler = slot-&gt;<a class="code" href="classarmnn_1_1_output_slot.html#ab00cd1d8962a1927d0302901cb8410d7">GetOutputHandler</a>();</div><div class="line"><a name="l00113"></a><span class="lineno">  113</span>&#160;</div><div class="line"><a name="l00114"></a><span class="lineno">  114</span>&#160;                BOOST_ASSERT_MSG(subTensor, <span class="stringliteral">&quot;ConcatLayer: Expected a valid sub-tensor for substitution.&quot;</span>);</div><div class="line"><a name="l00115"></a><span class="lineno">  115</span>&#160;                outputHandler.<a class="code" href="classarmnn_1_1_output_handler.html#a714596a278cb512fb2368c9293118455">SetData</a>(std::move(subTensor));</div><div class="line"><a name="l00116"></a><span class="lineno">  116</span>&#160;</div><div class="line"><a name="l00117"></a><span class="lineno">  117</span>&#160;                <a class="code" href="classarmnn_1_1_layer.html">Layer</a>&amp; inputLayer = slot-&gt;<a class="code" href="classarmnn_1_1_output_slot.html#a7ddaf04177053a536f0e7be83a642bc6">GetOwningLayer</a>();</div><div class="line"><a name="l00118"></a><span class="lineno">  118</span>&#160;                <span class="keywordflow">if</span> (inputLayer.<a class="code" href="classarmnn_1_1_layer.html#aaef29472862381822654ab6cbf7cba2a">GetType</a>() == <a class="code" href="namespacearmnn.html#a56943a0946e5f15e5e58054b8e7a04a4ae20f0f2826a6549809f050b86274567f">LayerType::Concat</a>)</div><div class="line"><a name="l00119"></a><span class="lineno">  119</span>&#160;                {</div><div class="line"><a name="l00120"></a><span class="lineno">  120</span>&#160;                    <span class="comment">// Continue with the substitution if the connected inputs are also concat layers</span></div><div class="line"><a name="l00121"></a><span class="lineno">  121</span>&#160;                    m_ConcatLayers.push(boost::polymorphic_downcast&lt;ConcatLayer*&gt;(&amp;inputLayer));</div><div class="line"><a name="l00122"></a><span class="lineno">  122</span>&#160;                }</div><div class="line"><a name="l00123"></a><span class="lineno">  123</span>&#160;                ++i;</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;        }</div><div class="line"><a name="l00126"></a><span class="lineno">  126</span>&#160;    }</div><div class="line"><a name="l00127"></a><span class="lineno">  127</span>&#160;}</div><div class="line"><a name="l00128"></a><span class="lineno">  128</span>&#160;</div><div class="line"><a name="l00129"></a><span class="lineno"><a class="line" href="classarmnn_1_1_concat_layer.html#a7763728321afb4eb0d1d00323c3e9121">  129</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classarmnn_1_1_concat_layer.html#a7763728321afb4eb0d1d00323c3e9121">ConcatLayer::CreateTensorHandles</a>(<span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_handle_factory_registry.html">TensorHandleFactoryRegistry</a>&amp; registry,</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_i_workload_factory.html">IWorkloadFactory</a>&amp; workloadFactory,</div><div class="line"><a name="l00131"></a><span class="lineno">  131</span>&#160;                                      <span class="keyword">const</span> <span class="keywordtype">bool</span> IsMemoryManaged)</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;    boost::ignore_unused(IsMemoryManaged);</div><div class="line"><a name="l00134"></a><span class="lineno">  134</span>&#160;    <a class="code" href="classarmnn_1_1_output_slot.html">OutputSlot</a>&amp; slot = <a class="code" href="classarmnn_1_1_layer.html#a0e36688a43c35668d8db5257274c68fe">GetOutputSlot</a>(0);</div><div class="line"><a name="l00135"></a><span class="lineno">  135</span>&#160;    <a class="code" href="classarmnn_1_1_i_tensor_handle_factory.html#a32f4aa6a7089d877af08928139c2c277">ITensorHandleFactory::FactoryId</a> factoryId = slot.<a class="code" href="classarmnn_1_1_output_slot.html#af303cf872a3f95e29992e45224e4cf8e">GetTensorHandleFactoryId</a>();</div><div class="line"><a name="l00136"></a><span class="lineno">  136</span>&#160;</div><div class="line"><a name="l00137"></a><span class="lineno">  137</span>&#160;    <span class="keywordflow">if</span> (factoryId == <a class="code" href="classarmnn_1_1_i_tensor_handle_factory.html#a9c95f90eb40e31f629e0e2947b8bc6f9">ITensorHandleFactory::LegacyFactoryId</a>)</div><div class="line"><a name="l00138"></a><span class="lineno">  138</span>&#160;    {</div><div class="line"><a name="l00139"></a><span class="lineno">  139</span>&#160;        CreateTensors(workloadFactory);</div><div class="line"><a name="l00140"></a><span class="lineno">  140</span>&#160;    }</div><div class="line"><a name="l00141"></a><span class="lineno">  141</span>&#160;    <span class="keywordflow">else</span></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;        <a class="code" href="classarmnn_1_1_i_tensor_handle_factory.html">ITensorHandleFactory</a>* handleFactory = registry.<a class="code" href="classarmnn_1_1_tensor_handle_factory_registry.html#ae5ecc42140a12c855554a4a621fc8456">GetFactory</a>(factoryId);</div><div class="line"><a name="l00144"></a><span class="lineno">  144</span>&#160;        BOOST_ASSERT(handleFactory);</div><div class="line"><a name="l00145"></a><span class="lineno">  145</span>&#160;        CreateTensors(*handleFactory);</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;}</div><div class="line"><a name="l00148"></a><span class="lineno">  148</span>&#160;</div><div class="line"><a name="l00149"></a><span class="lineno"><a class="line" href="classarmnn_1_1_concat_layer.html#aabac24cc08de52926e6bed5ffdc48dd8">  149</a></span>&#160;<a class="code" href="classarmnn_1_1_concat_layer.html">ConcatLayer</a>* <a class="code" href="classarmnn_1_1_concat_layer.html#aabac24cc08de52926e6bed5ffdc48dd8">ConcatLayer::Clone</a>(<a class="code" href="classarmnn_1_1_graph.html">Graph</a>&amp; graph)<span class="keyword"> const</span></div><div class="line"><a name="l00150"></a><span class="lineno">  150</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l00151"></a><span class="lineno">  151</span>&#160;    <span class="keywordflow">return</span> CloneBase&lt;ConcatLayer&gt;(graph, <a class="code" href="classarmnn_1_1_layer_with_parameters.html#ad32ac22bc72e28dfd6b466d143c8e262">m_Param</a>, <a class="code" href="classarmnn_1_1_layer.html#a7ddf0cf6f620d59c10e63495ace795d0">GetName</a>());</div><div class="line"><a name="l00152"></a><span class="lineno">  152</span>&#160;}</div><div class="line"><a name="l00153"></a><span class="lineno">  153</span>&#160;</div><div class="line"><a name="l00154"></a><span class="lineno"><a class="line" href="classarmnn_1_1_concat_layer.html#a65ca562c882ad619684445a1402f415a">  154</a></span>&#160;std::vector&lt;TensorShape&gt; <a class="code" href="classarmnn_1_1_concat_layer.html#a65ca562c882ad619684445a1402f415a">ConcatLayer::InferOutputShapes</a>(<span class="keyword">const</span> std::vector&lt;TensorShape&gt;&amp; inputShapes)<span class="keyword"> const</span></div><div class="line"><a name="l00155"></a><span class="lineno">  155</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l00156"></a><span class="lineno">  156</span>&#160;    BOOST_ASSERT(inputShapes.size() == <a class="code" href="classarmnn_1_1_layer_with_parameters.html#ad32ac22bc72e28dfd6b466d143c8e262">m_Param</a>.<a class="code" href="structarmnn_1_1_origins_descriptor.html#a35546e7b56e6e972a495b48748478ede">GetNumViews</a>());</div><div class="line"><a name="l00157"></a><span class="lineno">  157</span>&#160;</div><div class="line"><a name="l00158"></a><span class="lineno">  158</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> numDims = <a class="code" href="classarmnn_1_1_layer_with_parameters.html#ad32ac22bc72e28dfd6b466d143c8e262">m_Param</a>.<a class="code" href="structarmnn_1_1_origins_descriptor.html#a78e8266be865fdd92cadd04d6e25ae1f">GetNumDimensions</a>();</div><div class="line"><a name="l00159"></a><span class="lineno">  159</span>&#160;    <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i=0; i&lt; inputShapes.size(); i++)</div><div class="line"><a name="l00160"></a><span class="lineno">  160</span>&#160;    {</div><div class="line"><a name="l00161"></a><span class="lineno">  161</span>&#160;        <span class="keyword">auto</span>&amp; inputShape = inputShapes[i];</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;        ConditionalThrowIfNotEqual&lt;LayerValidationException&gt;(</div><div class="line"><a name="l00164"></a><span class="lineno">  164</span>&#160;            <span class="stringliteral">&quot;ConcatLayer: Num Dimensions must match all inputs.&quot;</span>,</div><div class="line"><a name="l00165"></a><span class="lineno">  165</span>&#160;            numDims,</div><div class="line"><a name="l00166"></a><span class="lineno">  166</span>&#160;            inputShape.GetNumDimensions());</div><div class="line"><a name="l00167"></a><span class="lineno">  167</span>&#160;    }</div><div class="line"><a name="l00168"></a><span class="lineno">  168</span>&#160;</div><div class="line"><a name="l00169"></a><span class="lineno">  169</span>&#160;    <span class="comment">// Finds the bounding box (extents) of all the views.</span></div><div class="line"><a name="l00170"></a><span class="lineno">  170</span>&#160;    std::vector&lt;unsigned int&gt; extentMin(numDims);</div><div class="line"><a name="l00171"></a><span class="lineno">  171</span>&#160;    std::vector&lt;unsigned int&gt; extentMax(numDims);</div><div class="line"><a name="l00172"></a><span class="lineno">  172</span>&#160;    <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i = 0; i &lt; inputShapes.size(); i++)</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> uint32_t* origin = <a class="code" href="classarmnn_1_1_layer_with_parameters.html#ad32ac22bc72e28dfd6b466d143c8e262">m_Param</a>.<a class="code" href="structarmnn_1_1_origins_descriptor.html#ab78e6fe963508c1ac5c00d04bb3361a3">GetViewOrigin</a>(i);</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_tensor_shape.html">armnn::TensorShape</a>&amp; shape = inputShapes[i];</div><div class="line"><a name="l00176"></a><span class="lineno">  176</span>&#160;        <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> d = 0; d &lt; numDims; d++)</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;            extentMin[d] = std::min(extentMin[d], origin[d]);</div><div class="line"><a name="l00179"></a><span class="lineno">  179</span>&#160;            extentMax[d] = std::max(extentMax[d], origin[d] + shape[d]);</div><div class="line"><a name="l00180"></a><span class="lineno">  180</span>&#160;        }</div><div class="line"><a name="l00181"></a><span class="lineno">  181</span>&#160;    }</div><div class="line"><a name="l00182"></a><span class="lineno">  182</span>&#160;</div><div class="line"><a name="l00183"></a><span class="lineno">  183</span>&#160;    <span class="comment">// Checks that the bounding box starts at the origin.</span></div><div class="line"><a name="l00184"></a><span class="lineno">  184</span>&#160;    <span class="keywordflow">if</span> (!std::all_of(extentMin.begin(), extentMin.end(), [](<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> s) { <span class="keywordflow">return</span> s == 0; }))</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;        <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_layer_validation_exception.html">LayerValidationException</a>(<span class="stringliteral">&quot;ConcatLayer: there is no view that starts at the origin&quot;</span>);</div><div class="line"><a name="l00187"></a><span class="lineno">  187</span>&#160;    }</div><div class="line"><a name="l00188"></a><span class="lineno">  188</span>&#160;</div><div class="line"><a name="l00189"></a><span class="lineno">  189</span>&#160;    <span class="comment">// Checks that there are no overlaps of views (this would lead to undefined output at those locations).</span></div><div class="line"><a name="l00190"></a><span class="lineno">  190</span>&#160;    <span class="comment">// Checks each pair of views against each other</span></div><div class="line"><a name="l00191"></a><span class="lineno">  191</span>&#160;    <span class="comment">// (and doesn&#39;t bother to check against self, or check the same pair both ways round).</span></div><div class="line"><a name="l00192"></a><span class="lineno">  192</span>&#160;    <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> a = 0; a &lt; inputShapes.size(); a++)</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> uint32_t* aOrigin = <a class="code" href="classarmnn_1_1_layer_with_parameters.html#ad32ac22bc72e28dfd6b466d143c8e262">m_Param</a>.<a class="code" href="structarmnn_1_1_origins_descriptor.html#ab78e6fe963508c1ac5c00d04bb3361a3">GetViewOrigin</a>(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_tensor_shape.html">armnn::TensorShape</a>&amp; aShape = inputShapes[a];</div><div class="line"><a name="l00196"></a><span class="lineno">  196</span>&#160;        <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> b = 0; b &lt; a; b++)</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;            <span class="keyword">const</span> uint32_t* bOrigin = <a class="code" href="classarmnn_1_1_layer_with_parameters.html#ad32ac22bc72e28dfd6b466d143c8e262">m_Param</a>.<a class="code" href="structarmnn_1_1_origins_descriptor.html#ab78e6fe963508c1ac5c00d04bb3361a3">GetViewOrigin</a>(b);</div><div class="line"><a name="l00199"></a><span class="lineno">  199</span>&#160;            <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_shape.html">armnn::TensorShape</a>&amp; bShape = inputShapes[b];</div><div class="line"><a name="l00200"></a><span class="lineno">  200</span>&#160;</div><div class="line"><a name="l00201"></a><span class="lineno">  201</span>&#160;            <span class="keywordtype">bool</span> allAxesOverlap = <span class="keyword">true</span>;</div><div class="line"><a name="l00202"></a><span class="lineno">  202</span>&#160;            <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> d = 0; d &lt; numDims &amp;&amp; allAxesOverlap; d++)</div><div class="line"><a name="l00203"></a><span class="lineno">  203</span>&#160;            {</div><div class="line"><a name="l00204"></a><span class="lineno">  204</span>&#160;                <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> a1 = aOrigin[d];</div><div class="line"><a name="l00205"></a><span class="lineno">  205</span>&#160;                <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> a2 = aOrigin[d] + aShape[d];</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="keywordtype">unsigned</span> <span class="keywordtype">int</span> b1 = bOrigin[d];</div><div class="line"><a name="l00208"></a><span class="lineno">  208</span>&#160;                <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> b2 = bOrigin[d] + bShape[d];</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="keywordflow">if</span> (a2 &lt;= b1 || b2 &lt;= a1)</div><div class="line"><a name="l00211"></a><span class="lineno">  211</span>&#160;                {</div><div class="line"><a name="l00212"></a><span class="lineno">  212</span>&#160;                    allAxesOverlap = <span class="keyword">false</span>;</div><div class="line"><a name="l00213"></a><span class="lineno">  213</span>&#160;                }</div><div class="line"><a name="l00214"></a><span class="lineno">  214</span>&#160;            }</div><div class="line"><a name="l00215"></a><span class="lineno">  215</span>&#160;            <span class="keywordflow">if</span> (allAxesOverlap)</div><div class="line"><a name="l00216"></a><span class="lineno">  216</span>&#160;            {</div><div class="line"><a name="l00217"></a><span class="lineno">  217</span>&#160;                <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_layer_validation_exception.html">LayerValidationException</a>(<span class="stringliteral">&quot;ConcatLayer: Some views overlap.&quot;</span>);</div><div class="line"><a name="l00218"></a><span class="lineno">  218</span>&#160;            }</div><div class="line"><a name="l00219"></a><span class="lineno">  219</span>&#160;        }</div><div class="line"><a name="l00220"></a><span class="lineno">  220</span>&#160;    }</div><div class="line"><a name="l00221"></a><span class="lineno">  221</span>&#160;</div><div class="line"><a name="l00222"></a><span class="lineno">  222</span>&#160;    <span class="comment">// Checks that there are no &quot;holes&quot;, i.e. regions of the output which is not covered by a view.</span></div><div class="line"><a name="l00223"></a><span class="lineno">  223</span>&#160;    <span class="comment">// Because we already checked that there are no overlaps, this can be done simply by checking that</span></div><div class="line"><a name="l00224"></a><span class="lineno">  224</span>&#160;    <span class="comment">// the total &#39;volume&#39; of the views is the same as the output.</span></div><div class="line"><a name="l00225"></a><span class="lineno">  225</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> totalViewsVolume = 0;</div><div class="line"><a name="l00226"></a><span class="lineno">  226</span>&#160;    <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i = 0; i &lt; inputShapes.size(); i++)</div><div class="line"><a name="l00227"></a><span class="lineno">  227</span>&#160;    {</div><div class="line"><a name="l00228"></a><span class="lineno">  228</span>&#160;        totalViewsVolume += inputShapes[i].GetNumElements();</div><div class="line"><a name="l00229"></a><span class="lineno">  229</span>&#160;    }</div><div class="line"><a name="l00230"></a><span class="lineno">  230</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> outputVolume = 1;</div><div class="line"><a name="l00231"></a><span class="lineno">  231</span>&#160;    <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> d = 0; d &lt; numDims; d++)</div><div class="line"><a name="l00232"></a><span class="lineno">  232</span>&#160;    {</div><div class="line"><a name="l00233"></a><span class="lineno">  233</span>&#160;        outputVolume *= (extentMax[d] - extentMin[d]);</div><div class="line"><a name="l00234"></a><span class="lineno">  234</span>&#160;    }</div><div class="line"><a name="l00235"></a><span class="lineno">  235</span>&#160;</div><div class="line"><a name="l00236"></a><span class="lineno">  236</span>&#160;    ConditionalThrowIfNotEqual&lt;LayerValidationException&gt;(</div><div class="line"><a name="l00237"></a><span class="lineno">  237</span>&#160;        <span class="stringliteral">&quot;ConcatLayer: there are some gaps between views&quot;</span>,</div><div class="line"><a name="l00238"></a><span class="lineno">  238</span>&#160;        totalViewsVolume,</div><div class="line"><a name="l00239"></a><span class="lineno">  239</span>&#160;        outputVolume);</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;    <span class="keywordflow">return</span> std::vector&lt;TensorShape&gt;({ <a class="code" href="classarmnn_1_1_tensor_shape.html">TensorShape</a>({numDims, extentMax.data()}) });</div><div class="line"><a name="l00242"></a><span class="lineno">  242</span>&#160;}</div><div class="line"><a name="l00243"></a><span class="lineno">  243</span>&#160;</div><div class="line"><a name="l00244"></a><span class="lineno"><a class="line" href="classarmnn_1_1_concat_layer.html#a8c8f543d7e9729362c266d12ec169966">  244</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classarmnn_1_1_concat_layer.html#a8c8f543d7e9729362c266d12ec169966">ConcatLayer::ValidateTensorShapesFromInputs</a>()</div><div class="line"><a name="l00245"></a><span class="lineno">  245</span>&#160;{</div><div class="line"><a name="l00246"></a><span class="lineno">  246</span>&#160;    <span class="comment">// Validates Concat layer.</span></div><div class="line"><a name="l00247"></a><span class="lineno">  247</span>&#160;    ConditionalThrowIfNotEqual&lt;LayerValidationException&gt;(</div><div class="line"><a name="l00248"></a><span class="lineno">  248</span>&#160;        <span class="stringliteral">&quot;ConcatLayer: Num Inputs must match num views.&quot;</span>,</div><div class="line"><a name="l00249"></a><span class="lineno">  249</span>&#160;        <a class="code" href="classarmnn_1_1_layer_with_parameters.html#ad32ac22bc72e28dfd6b466d143c8e262">m_Param</a>.<a class="code" href="structarmnn_1_1_origins_descriptor.html#a35546e7b56e6e972a495b48748478ede">GetNumViews</a>(),</div><div class="line"><a name="l00250"></a><span class="lineno">  250</span>&#160;        <a class="code" href="classarmnn_1_1_layer.html#abc0660dc440c8a285b456c9ef6383c26">GetNumInputSlots</a>());</div><div class="line"><a name="l00251"></a><span class="lineno">  251</span>&#160;</div><div class="line"><a name="l00252"></a><span class="lineno">  252</span>&#160;    <a class="code" href="classarmnn_1_1_layer.html#a0607e36e88f38c34c71c663164b76776">VerifyLayerConnections</a>(<a class="code" href="classarmnn_1_1_layer_with_parameters.html#ad32ac22bc72e28dfd6b466d143c8e262">m_Param</a>.<a class="code" href="structarmnn_1_1_origins_descriptor.html#a35546e7b56e6e972a495b48748478ede">GetNumViews</a>(), <a class="code" href="_exceptions_8hpp.html#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>());</div><div class="line"><a name="l00253"></a><span class="lineno">  253</span>&#160;</div><div class="line"><a name="l00254"></a><span class="lineno">  254</span>&#160;    std::vector&lt;TensorShape&gt; inputShapes;</div><div class="line"><a name="l00255"></a><span class="lineno">  255</span>&#160;    <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i = 0; i &lt; <a class="code" href="classarmnn_1_1_layer.html#abc0660dc440c8a285b456c9ef6383c26">GetNumInputSlots</a>(); ++i)</div><div class="line"><a name="l00256"></a><span class="lineno">  256</span>&#160;    {</div><div class="line"><a name="l00257"></a><span class="lineno">  257</span>&#160;        inputShapes.push_back(<a class="code" href="classarmnn_1_1_layer.html#acf8b8e23bf647836592982f97088d375">GetInputSlot</a>(i).GetConnection()-&gt;<a class="code" href="namespacearmnn.html#a93d269806f34407695dc10f510001c30">GetTensorInfo</a>().GetShape());</div><div class="line"><a name="l00258"></a><span class="lineno">  258</span>&#160;    }</div><div class="line"><a name="l00259"></a><span class="lineno">  259</span>&#160;</div><div class="line"><a name="l00260"></a><span class="lineno">  260</span>&#160;    <span class="keyword">auto</span> inferredShapes = <a class="code" href="classarmnn_1_1_concat_layer.html#a65ca562c882ad619684445a1402f415a">InferOutputShapes</a>(inputShapes);</div><div class="line"><a name="l00261"></a><span class="lineno">  261</span>&#160;</div><div class="line"><a name="l00262"></a><span class="lineno">  262</span>&#160;    BOOST_ASSERT(inferredShapes.size() == 1);</div><div class="line"><a name="l00263"></a><span class="lineno">  263</span>&#160;</div><div class="line"><a name="l00264"></a><span class="lineno">  264</span>&#160;    ConditionalThrowIfNotEqual&lt;LayerValidationException&gt;(</div><div class="line"><a name="l00265"></a><span class="lineno">  265</span>&#160;        <span class="stringliteral">&quot;ConcatLayer: TensorShape set on OutputSlot[0] does not match the inferred shape.&quot;</span>,</div><div class="line"><a name="l00266"></a><span class="lineno">  266</span>&#160;        <a class="code" href="classarmnn_1_1_layer.html#a0e36688a43c35668d8db5257274c68fe">GetOutputSlot</a>(0).<a class="code" href="classarmnn_1_1_output_slot.html#ada2ad7d1caeeb4ef6195c8925fad6a65">GetTensorInfo</a>().<a class="code" href="classarmnn_1_1_tensor_info.html#a8b5d0f8a24e9d9238f412260a552acf8">GetShape</a>(),</div><div class="line"><a name="l00267"></a><span class="lineno">  267</span>&#160;        inferredShapes[0]);</div><div class="line"><a name="l00268"></a><span class="lineno">  268</span>&#160;}</div><div class="line"><a name="l00269"></a><span class="lineno">  269</span>&#160;</div><div class="line"><a name="l00270"></a><span class="lineno"><a class="line" href="classarmnn_1_1_concat_layer.html#a75a50f464326fefa605ea84ae2c9be85">  270</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classarmnn_1_1_concat_layer.html#a75a50f464326fefa605ea84ae2c9be85">ConcatLayer::Accept</a>(<a class="code" href="classarmnn_1_1_i_layer_visitor.html">ILayerVisitor</a>&amp; visitor)<span class="keyword"> const</span></div><div class="line"><a name="l00271"></a><span class="lineno">  271</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l00272"></a><span class="lineno">  272</span>&#160;    visitor.<a class="code" href="classarmnn_1_1_i_layer_visitor.html#aeb90d7587f7887aee1f2b43261d4ee5c">VisitConcatLayer</a>(<span class="keyword">this</span>, <a class="code" href="classarmnn_1_1_layer_with_parameters.html#a502c06a1b13e6d90a6cbf47c081f1444">GetParameters</a>(), <a class="code" href="classarmnn_1_1_layer.html#a7ddf0cf6f620d59c10e63495ace795d0">GetName</a>());</div><div class="line"><a name="l00273"></a><span class="lineno">  273</span>&#160;}</div><div class="line"><a name="l00274"></a><span class="lineno">  274</span>&#160;</div><div class="line"><a name="l00275"></a><span class="lineno">  275</span>&#160;} <span class="comment">// namespace armnn armnn</span></div><div class="ttc" id="classarmnn_1_1_layer_html_af2c0edc7ea62a8baaec4d3d9b2b09256"><div class="ttname"><a href="classarmnn_1_1_layer.html#af2c0edc7ea62a8baaec4d3d9b2b09256">armnn::Layer::GetOutputHandler</a></div><div class="ttdeci">const OutputHandler &amp; GetOutputHandler(unsigned int i=0) const</div><div class="ttdef"><b>Definition:</b> <a href="_layer_8hpp_source.html#l00221">Layer.hpp:221</a></div></div>
<div class="ttc" id="classarmnn_1_1_tensor_handle_factory_registry_html"><div class="ttname"><a href="classarmnn_1_1_tensor_handle_factory_registry.html">armnn::TensorHandleFactoryRegistry</a></div><div class="ttdef"><b>Definition:</b> <a href="_tensor_handle_factory_registry_8hpp_source.html#l00020">TensorHandleFactoryRegistry.hpp:20</a></div></div>
<div class="ttc" id="_workload_factory_8hpp_html"><div class="ttname"><a href="_workload_factory_8hpp.html">WorkloadFactory.hpp</a></div></div>
<div class="ttc" id="classarmnn_1_1_input_slot_html_a9effd325a6d512a3f8ff4bd207d53255"><div class="ttname"><a href="classarmnn_1_1_input_slot.html#a9effd325a6d512a3f8ff4bd207d53255">armnn::InputSlot::GetConnectedOutputSlot</a></div><div class="ttdeci">const OutputSlot * GetConnectedOutputSlot() const</div><div class="ttdef"><b>Definition:</b> <a href="_layer_8hpp_source.html#l00055">Layer.hpp:55</a></div></div>
<div class="ttc" id="classarmnn_1_1_layer_html_aaef29472862381822654ab6cbf7cba2a"><div class="ttname"><a href="classarmnn_1_1_layer.html#aaef29472862381822654ab6cbf7cba2a">armnn::Layer::GetType</a></div><div class="ttdeci">LayerType GetType() const</div><div class="ttdef"><b>Definition:</b> <a href="_layer_8hpp_source.html#l00259">Layer.hpp:259</a></div></div>
<div class="ttc" id="classarmnn_1_1_concat_layer_html_abaa77c3ba53847ec462c2aaa1cfe3aa2"><div class="ttname"><a href="classarmnn_1_1_concat_layer.html#abaa77c3ba53847ec462c2aaa1cfe3aa2">armnn::ConcatLayer::ConcatLayer</a></div><div class="ttdeci">ConcatLayer(const OriginsDescriptor &amp;param, const char *name)</div><div class="ttdef"><b>Definition:</b> <a href="_concat_layer_8cpp_source.html#l00017">ConcatLayer.cpp:17</a></div></div>
<div class="ttc" id="classarmnn_1_1_layer_html_a7ddf0cf6f620d59c10e63495ace795d0"><div class="ttname"><a href="classarmnn_1_1_layer.html#a7ddf0cf6f620d59c10e63495ace795d0">armnn::Layer::GetName</a></div><div class="ttdeci">const char * GetName() const override</div><div class="ttdef"><b>Definition:</b> <a href="_layer_8hpp_source.html#l00305">Layer.hpp:305</a></div></div>
<div class="ttc" id="classarmnn_1_1_i_workload_factory_html"><div class="ttname"><a href="classarmnn_1_1_i_workload_factory.html">armnn::IWorkloadFactory</a></div><div class="ttdef"><b>Definition:</b> <a href="_workload_factory_8hpp_source.html#l00021">WorkloadFactory.hpp:21</a></div></div>
<div class="ttc" id="namespacearmnn_html_a4dc0adc6737b5944e7671bee71788407acaf9b6b99962bf5c2264824231d7a40c"><div class="ttname"><a href="namespacearmnn.html#a4dc0adc6737b5944e7671bee71788407acaf9b6b99962bf5c2264824231d7a40c">armnn::BoostLogSeverityMapping::info</a></div></div>
<div class="ttc" id="classarmnn_1_1_output_slot_html"><div class="ttname"><a href="classarmnn_1_1_output_slot.html">armnn::OutputSlot</a></div><div class="ttdef"><b>Definition:</b> <a href="_layer_8hpp_source.html#l00083">Layer.hpp:83</a></div></div>
<div class="ttc" id="classarmnn_1_1_layer_html"><div class="ttname"><a href="classarmnn_1_1_layer.html">armnn::Layer</a></div><div class="ttdef"><b>Definition:</b> <a href="_layer_8hpp_source.html#l00209">Layer.hpp:209</a></div></div>
<div class="ttc" id="classarmnn_1_1_i_layer_visitor_html_aeb90d7587f7887aee1f2b43261d4ee5c"><div class="ttname"><a href="classarmnn_1_1_i_layer_visitor.html#aeb90d7587f7887aee1f2b43261d4ee5c">armnn::ILayerVisitor::VisitConcatLayer</a></div><div class="ttdeci">virtual void VisitConcatLayer(const IConnectableLayer *layer, const OriginsDescriptor &amp;concatDescriptor, const char *name=nullptr)</div><div class="ttdef"><b>Definition:</b> <a href="_i_layer_visitor_8hpp_source.html#l00093">ILayerVisitor.hpp:93</a></div></div>
<div class="ttc" id="classarmnn_1_1_tensor_info_html"><div class="ttname"><a href="classarmnn_1_1_tensor_info.html">armnn::TensorInfo</a></div><div class="ttdef"><b>Definition:</b> <a href="_tensor_8hpp_source.html#l00053">Tensor.hpp:53</a></div></div>
<div class="ttc" id="classarmnn_1_1_output_slot_html_af303cf872a3f95e29992e45224e4cf8e"><div class="ttname"><a href="classarmnn_1_1_output_slot.html#af303cf872a3f95e29992e45224e4cf8e">armnn::OutputSlot::GetTensorHandleFactoryId</a></div><div class="ttdeci">ITensorHandleFactory::FactoryId GetTensorHandleFactoryId() const</div><div class="ttdef"><b>Definition:</b> <a href="_layer_8cpp_source.html#l00172">Layer.cpp:172</a></div></div>
<div class="ttc" id="classarmnn_1_1_concat_layer_html_a65ca562c882ad619684445a1402f415a"><div class="ttname"><a href="classarmnn_1_1_concat_layer.html#a65ca562c882ad619684445a1402f415a">armnn::ConcatLayer::InferOutputShapes</a></div><div class="ttdeci">std::vector&lt; TensorShape &gt; InferOutputShapes(const std::vector&lt; TensorShape &gt; &amp;inputShapes) const override</div><div class="ttdef"><b>Definition:</b> <a href="_concat_layer_8cpp_source.html#l00154">ConcatLayer.cpp:154</a></div></div>
<div class="ttc" id="classarmnn_1_1_i_tensor_handle_factory_html"><div class="ttname"><a href="classarmnn_1_1_i_tensor_handle_factory.html">armnn::ITensorHandleFactory</a></div><div class="ttdef"><b>Definition:</b> <a href="include_2armnn_2backends_2_i_tensor_handle_factory_8hpp_source.html#l00018">ITensorHandleFactory.hpp:18</a></div></div>
<div class="ttc" id="classarmnn_1_1_output_handler_html_a66e8f43a5b42b500871ed96e15419567"><div class="ttname"><a href="classarmnn_1_1_output_handler.html#a66e8f43a5b42b500871ed96e15419567">armnn::OutputHandler::GetTensorInfo</a></div><div class="ttdeci">const TensorInfo &amp; GetTensorInfo() const</div><div class="ttdoc">Gets the matching TensorInfo for the output. </div><div class="ttdef"><b>Definition:</b> <a href="_output_handler_8hpp_source.html#l00044">OutputHandler.hpp:44</a></div></div>
<div class="ttc" id="classarmnn_1_1_concat_layer_html"><div class="ttname"><a href="classarmnn_1_1_concat_layer.html">armnn::ConcatLayer</a></div><div class="ttdoc">This layer represents a merge operation. </div><div class="ttdef"><b>Definition:</b> <a href="_concat_layer_8hpp_source.html#l00013">ConcatLayer.hpp:13</a></div></div>
<div class="ttc" id="classarmnn_1_1_layer_validation_exception_html"><div class="ttname"><a href="classarmnn_1_1_layer_validation_exception.html">armnn::LayerValidationException</a></div><div class="ttdef"><b>Definition:</b> <a href="_exceptions_8hpp_source.html#l00105">Exceptions.hpp:105</a></div></div>
<div class="ttc" id="classarmnn_1_1_i_tensor_handle_html"><div class="ttname"><a href="classarmnn_1_1_i_tensor_handle.html">armnn::ITensorHandle</a></div><div class="ttdef"><b>Definition:</b> <a href="include_2armnn_2backends_2_i_tensor_handle_8hpp_source.html#l00016">ITensorHandle.hpp:16</a></div></div>
<div class="ttc" id="_exceptions_8hpp_html_aa3be76aec4ce713822a5ea1ecbb7bc61"><div class="ttname"><a href="_exceptions_8hpp.html#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a></div><div class="ttdeci">#define CHECK_LOCATION()</div><div class="ttdef"><b>Definition:</b> <a href="_exceptions_8hpp_source.html#l00169">Exceptions.hpp:169</a></div></div>
<div class="ttc" id="_types_utils_8hpp_html"><div class="ttname"><a href="_types_utils_8hpp.html">TypesUtils.hpp</a></div></div>
<div class="ttc" id="classarmnn_1_1_i_tensor_handle_factory_html_a9c95f90eb40e31f629e0e2947b8bc6f9"><div class="ttname"><a href="classarmnn_1_1_i_tensor_handle_factory.html#a9c95f90eb40e31f629e0e2947b8bc6f9">armnn::ITensorHandleFactory::LegacyFactoryId</a></div><div class="ttdeci">static const FactoryId LegacyFactoryId</div><div class="ttdef"><b>Definition:</b> <a href="include_2armnn_2backends_2_i_tensor_handle_factory_8hpp_source.html#l00022">ITensorHandleFactory.hpp:22</a></div></div>
<div class="ttc" id="classarmnn_1_1_concat_layer_html_adfa912d0c4c6c00f1af2cbfa799572b7"><div class="ttname"><a href="classarmnn_1_1_concat_layer.html#adfa912d0c4c6c00f1af2cbfa799572b7">armnn::ConcatLayer::CreateWorkload</a></div><div class="ttdeci">virtual std::unique_ptr&lt; IWorkload &gt; CreateWorkload(const IWorkloadFactory &amp;factory) const override</div><div class="ttdef"><b>Definition:</b> <a href="_concat_layer_8cpp_source.html#l00022">ConcatLayer.cpp:22</a></div></div>
<div class="ttc" id="namespacearmnn_html_a56943a0946e5f15e5e58054b8e7a04a4acb17869fe51048b5a5c4c6106551a255"><div class="ttname"><a href="namespacearmnn.html#a56943a0946e5f15e5e58054b8e7a04a4acb17869fe51048b5a5c4c6106551a255">armnn::LayerType::Constant</a></div></div>
<div class="ttc" id="classarmnn_1_1_concat_layer_html_a8c8f543d7e9729362c266d12ec169966"><div class="ttname"><a href="classarmnn_1_1_concat_layer.html#a8c8f543d7e9729362c266d12ec169966">armnn::ConcatLayer::ValidateTensorShapesFromInputs</a></div><div class="ttdeci">void ValidateTensorShapesFromInputs() override</div><div class="ttdef"><b>Definition:</b> <a href="_concat_layer_8cpp_source.html#l00244">ConcatLayer.cpp:244</a></div></div>
<div class="ttc" id="structarmnn_1_1_concat_queue_descriptor_html_ab1794eb3e74c9700cd3d500fc06dc2e5"><div class="ttname"><a href="structarmnn_1_1_concat_queue_descriptor.html#ab1794eb3e74c9700cd3d500fc06dc2e5">armnn::ConcatQueueDescriptor::m_ViewOrigins</a></div><div class="ttdeci">std::vector&lt; ViewOrigin &gt; m_ViewOrigins</div><div class="ttdef"><b>Definition:</b> <a href="_workload_data_8hpp_source.html#l00115">WorkloadData.hpp:115</a></div></div>
<div class="ttc" id="_concat_layer_8hpp_html"><div class="ttname"><a href="_concat_layer_8hpp.html">ConcatLayer.hpp</a></div></div>
<div class="ttc" id="classarmnn_1_1_tensor_handle_factory_registry_html_ae5ecc42140a12c855554a4a621fc8456"><div class="ttname"><a href="classarmnn_1_1_tensor_handle_factory_registry.html#ae5ecc42140a12c855554a4a621fc8456">armnn::TensorHandleFactoryRegistry::GetFactory</a></div><div class="ttdeci">ITensorHandleFactory * GetFactory(ITensorHandleFactory::FactoryId id) const</div><div class="ttdef"><b>Definition:</b> <a href="_tensor_handle_factory_registry_8cpp_source.html#l00039">TensorHandleFactoryRegistry.cpp:39</a></div></div>
<div class="ttc" id="classarmnn_1_1_output_handler_html_a714596a278cb512fb2368c9293118455"><div class="ttname"><a href="classarmnn_1_1_output_handler.html#a714596a278cb512fb2368c9293118455">armnn::OutputHandler::SetData</a></div><div class="ttdeci">void SetData(std::unique_ptr&lt; ITensorHandle &gt; data)</div><div class="ttdef"><b>Definition:</b> <a href="_output_handler_8hpp_source.html#l00053">OutputHandler.hpp:53</a></div></div>
<div class="ttc" id="classarmnn_1_1_output_slot_html_a25b0119c02aece1d341b99953d169c0f"><div class="ttname"><a href="classarmnn_1_1_output_slot.html#a25b0119c02aece1d341b99953d169c0f">armnn::OutputSlot::GetNumConnections</a></div><div class="ttdeci">unsigned int GetNumConnections() const override</div><div class="ttdef"><b>Definition:</b> <a href="_layer_8hpp_source.html#l00138">Layer.hpp:138</a></div></div>
<div class="ttc" id="_layer_clone_base_8hpp_html"><div class="ttname"><a href="_layer_clone_base_8hpp.html">LayerCloneBase.hpp</a></div></div>
<div class="ttc" id="classarmnn_1_1_i_layer_visitor_html"><div class="ttname"><a href="classarmnn_1_1_i_layer_visitor.html">armnn::ILayerVisitor</a></div><div class="ttdef"><b>Definition:</b> <a href="_i_layer_visitor_8hpp_source.html#l00016">ILayerVisitor.hpp:16</a></div></div>
<div class="ttc" id="classarmnn_1_1_i_workload_factory_html_a32bb8d6cf5fc028bf501252767c08b21"><div class="ttname"><a href="classarmnn_1_1_i_workload_factory.html#a32bb8d6cf5fc028bf501252767c08b21">armnn::IWorkloadFactory::CreateConcat</a></div><div class="ttdeci">virtual std::unique_ptr&lt; IWorkload &gt; CreateConcat(const ConcatQueueDescriptor &amp;descriptor, const WorkloadInfo &amp;info) const</div><div class="ttdef"><b>Definition:</b> <a href="_workload_factory_8cpp_source.html#l01118">WorkloadFactory.cpp:1118</a></div></div>
<div class="ttc" id="classarmnn_1_1_layer_with_parameters_html_a502c06a1b13e6d90a6cbf47c081f1444"><div class="ttname"><a href="classarmnn_1_1_layer_with_parameters.html#a502c06a1b13e6d90a6cbf47c081f1444">armnn::LayerWithParameters&lt; OriginsDescriptor &gt;::GetParameters</a></div><div class="ttdeci">const OriginsDescriptor &amp; GetParameters() const</div><div class="ttdef"><b>Definition:</b> <a href="_layer_with_parameters_8hpp_source.html#l00018">LayerWithParameters.hpp:18</a></div></div>
<div class="ttc" id="classarmnn_1_1_tensor_info_html_a22f377fc4e10dc1773a3f979061e85f1"><div class="ttname"><a href="classarmnn_1_1_tensor_info.html#a22f377fc4e10dc1773a3f979061e85f1">armnn::TensorInfo::IsTypeSpaceMatch</a></div><div class="ttdeci">bool IsTypeSpaceMatch(const TensorInfo &amp;other) const</div><div class="ttdoc">Check that the types are the same and, if quantize, that the quantization parameters are the same...</div><div class="ttdef"><b>Definition:</b> <a href="_tensor_8cpp_source.html#l00218">Tensor.cpp:218</a></div></div>
<div class="ttc" id="structarmnn_1_1_origins_descriptor_html_ab78e6fe963508c1ac5c00d04bb3361a3"><div class="ttname"><a href="structarmnn_1_1_origins_descriptor.html#ab78e6fe963508c1ac5c00d04bb3361a3">armnn::OriginsDescriptor::GetViewOrigin</a></div><div class="ttdeci">const uint32_t * GetViewOrigin(uint32_t idx) const</div><div class="ttdoc">Return the view origin at the int value idx. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8cpp_source.html#l00189">Descriptors.cpp:189</a></div></div>
<div class="ttc" id="structarmnn_1_1_origins_descriptor_html_a35546e7b56e6e972a495b48748478ede"><div class="ttname"><a href="structarmnn_1_1_origins_descriptor.html#a35546e7b56e6e972a495b48748478ede">armnn::OriginsDescriptor::GetNumViews</a></div><div class="ttdeci">uint32_t GetNumViews() const</div><div class="ttdoc">Get the number of views. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8cpp_source.html#l00179">Descriptors.cpp:179</a></div></div>
<div class="ttc" id="classarmnn_1_1_output_slot_html_ab00cd1d8962a1927d0302901cb8410d7"><div class="ttname"><a href="classarmnn_1_1_output_slot.html#ab00cd1d8962a1927d0302901cb8410d7">armnn::OutputSlot::GetOutputHandler</a></div><div class="ttdeci">const OutputHandler &amp; GetOutputHandler() const</div><div class="ttdef"><b>Definition:</b> <a href="_layer_8hpp_source.html#l00119">Layer.hpp:119</a></div></div>
<div class="ttc" id="structarmnn_1_1_origins_descriptor_html_a78e8266be865fdd92cadd04d6e25ae1f"><div class="ttname"><a href="structarmnn_1_1_origins_descriptor.html#a78e8266be865fdd92cadd04d6e25ae1f">armnn::OriginsDescriptor::GetNumDimensions</a></div><div class="ttdeci">uint32_t GetNumDimensions() const</div><div class="ttdoc">Get the number of dimensions. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8cpp_source.html#l00184">Descriptors.cpp:184</a></div></div>
<div class="ttc" id="classarmnn_1_1_layer_with_parameters_html_ad32ac22bc72e28dfd6b466d143c8e262"><div class="ttname"><a href="classarmnn_1_1_layer_with_parameters.html#ad32ac22bc72e28dfd6b466d143c8e262">armnn::LayerWithParameters&lt; OriginsDescriptor &gt;::m_Param</a></div><div class="ttdeci">OriginsDescriptor m_Param</div><div class="ttdoc">The parameters for the layer (not including tensor-valued weights etc.). </div><div class="ttdef"><b>Definition:</b> <a href="_layer_with_parameters_8hpp_source.html#l00050">LayerWithParameters.hpp:50</a></div></div>
<div class="ttc" id="classarmnn_1_1_layer_html_a0607e36e88f38c34c71c663164b76776"><div class="ttname"><a href="classarmnn_1_1_layer.html#a0607e36e88f38c34c71c663164b76776">armnn::Layer::VerifyLayerConnections</a></div><div class="ttdeci">void VerifyLayerConnections(unsigned int expectedConnections, const CheckLocation &amp;location) const</div><div class="ttdef"><b>Definition:</b> <a href="_layer_8cpp_source.html#l00337">Layer.cpp:337</a></div></div>
<div class="ttc" id="classarmnn_1_1_layer_with_parameters_html"><div class="ttname"><a href="classarmnn_1_1_layer_with_parameters.html">armnn::LayerWithParameters</a></div><div class="ttdef"><b>Definition:</b> <a href="_layer_with_parameters_8hpp_source.html#l00013">LayerWithParameters.hpp:13</a></div></div>
<div class="ttc" id="classarmnn_1_1_layer_with_parameters_html_a30a858b2b26d651a066537e499fbf40d"><div class="ttname"><a href="classarmnn_1_1_layer_with_parameters.html#a30a858b2b26d651a066537e499fbf40d">armnn::LayerWithParameters&lt; OriginsDescriptor &gt;::PrepInfoAndDesc</a></div><div class="ttdeci">WorkloadInfo PrepInfoAndDesc(QueueDescriptor &amp;descriptor) const</div><div class="ttdoc">Helper function to reduce duplication in *LayerCreateWorkload. </div><div class="ttdef"><b>Definition:</b> <a href="_layer_with_parameters_8hpp_source.html#l00043">LayerWithParameters.hpp:43</a></div></div>
<div class="ttc" id="_workload_data_8hpp_html"><div class="ttname"><a href="_workload_data_8hpp.html">WorkloadData.hpp</a></div></div>
<div class="ttc" id="namespacearmnn_html"><div class="ttname"><a href="namespacearmnn.html">armnn</a></div><div class="ttdef"><b>Definition:</b> <a href="_backend_helper_8hpp_source.html#l00011">BackendHelper.hpp:11</a></div></div>
<div class="ttc" id="_cl_layer_tests_8cpp_html_a255d08081b372809a176b588529296aa"><div class="ttname"><a href="_cl_layer_tests_8cpp.html#a255d08081b372809a176b588529296aa">FactoryType</a></div><div class="ttdeci">ClWorkloadFactory FactoryType</div><div class="ttdef"><b>Definition:</b> <a href="_cl_layer_tests_8cpp_source.html#l00031">ClLayerTests.cpp:31</a></div></div>
<div class="ttc" id="classarmnn_1_1_layer_html_aa44d91037bba52ba0dec6577509ade3b"><div class="ttname"><a href="classarmnn_1_1_layer.html#aa44d91037bba52ba0dec6577509ade3b">armnn::Layer::m_OutputHandlers</a></div><div class="ttdeci">std::vector&lt; OutputHandler &gt; m_OutputHandlers</div><div class="ttdef"><b>Definition:</b> <a href="_layer_8hpp_source.html#l00364">Layer.hpp:364</a></div></div>
<div class="ttc" id="classarmnn_1_1_output_handler_html_afe3429ac30b180c11f01ea0f9f546f0e"><div class="ttname"><a href="classarmnn_1_1_output_handler.html#afe3429ac30b180c11f01ea0f9f546f0e">armnn::OutputHandler::GetData</a></div><div class="ttdeci">ITensorHandle * GetData() const</div><div class="ttdoc">Gets the allocated tensor memory. </div><div class="ttdef"><b>Definition:</b> <a href="_output_handler_8hpp_source.html#l00048">OutputHandler.hpp:48</a></div></div>
<div class="ttc" id="classarmnn_1_1_tensor_shape_html"><div class="ttname"><a href="classarmnn_1_1_tensor_shape.html">armnn::TensorShape</a></div><div class="ttdef"><b>Definition:</b> <a href="_tensor_8hpp_source.html#l00020">Tensor.hpp:20</a></div></div>
<div class="ttc" id="classarmnn_1_1_concat_layer_html_a75a50f464326fefa605ea84ae2c9be85"><div class="ttname"><a href="classarmnn_1_1_concat_layer.html#a75a50f464326fefa605ea84ae2c9be85">armnn::ConcatLayer::Accept</a></div><div class="ttdeci">void Accept(ILayerVisitor &amp;visitor) const override</div><div class="ttdef"><b>Definition:</b> <a href="_concat_layer_8cpp_source.html#l00270">ConcatLayer.cpp:270</a></div></div>
<div class="ttc" id="classarmnn_1_1_i_tensor_handle_factory_html_a32f4aa6a7089d877af08928139c2c277"><div class="ttname"><a href="classarmnn_1_1_i_tensor_handle_factory.html#a32f4aa6a7089d877af08928139c2c277">armnn::ITensorHandleFactory::FactoryId</a></div><div class="ttdeci">std::string FactoryId</div><div class="ttdef"><b>Definition:</b> <a href="include_2armnn_2backends_2_i_tensor_handle_factory_8hpp_source.html#l00021">ITensorHandleFactory.hpp:21</a></div></div>
<div class="ttc" id="classarmnn_1_1_graph_html"><div class="ttname"><a href="classarmnn_1_1_graph.html">armnn::Graph</a></div><div class="ttdef"><b>Definition:</b> <a href="_graph_8hpp_source.html#l00029">Graph.hpp:29</a></div></div>
<div class="ttc" id="classarmnn_1_1_output_handler_html"><div class="ttname"><a href="classarmnn_1_1_output_handler.html">armnn::OutputHandler</a></div><div class="ttdef"><b>Definition:</b> <a href="_output_handler_8hpp_source.html#l00030">OutputHandler.hpp:30</a></div></div>
<div class="ttc" id="classarmnn_1_1_layer_html_abc0660dc440c8a285b456c9ef6383c26"><div class="ttname"><a href="classarmnn_1_1_layer.html#abc0660dc440c8a285b456c9ef6383c26">armnn::Layer::GetNumInputSlots</a></div><div class="ttdeci">unsigned int GetNumInputSlots() const override</div><div class="ttdef"><b>Definition:</b> <a href="_layer_8hpp_source.html#l00307">Layer.hpp:307</a></div></div>
<div class="ttc" id="classarmnn_1_1_concat_layer_html_aabac24cc08de52926e6bed5ffdc48dd8"><div class="ttname"><a href="classarmnn_1_1_concat_layer.html#aabac24cc08de52926e6bed5ffdc48dd8">armnn::ConcatLayer::Clone</a></div><div class="ttdeci">ConcatLayer * Clone(Graph &amp;graph) const override</div><div class="ttdef"><b>Definition:</b> <a href="_concat_layer_8cpp_source.html#l00149">ConcatLayer.cpp:149</a></div></div>
<div class="ttc" id="structarmnn_1_1_concat_queue_descriptor_html"><div class="ttname"><a href="structarmnn_1_1_concat_queue_descriptor.html">armnn::ConcatQueueDescriptor</a></div><div class="ttdef"><b>Definition:</b> <a href="_workload_data_8hpp_source.html#l00102">WorkloadData.hpp:102</a></div></div>
<div class="ttc" id="classarmnn_1_1_tensor_info_html_a8b5d0f8a24e9d9238f412260a552acf8"><div class="ttname"><a href="classarmnn_1_1_tensor_info.html#a8b5d0f8a24e9d9238f412260a552acf8">armnn::TensorInfo::GetShape</a></div><div class="ttdeci">const TensorShape &amp; GetShape() const</div><div class="ttdef"><b>Definition:</b> <a href="_tensor_8hpp_source.html#l00088">Tensor.hpp:88</a></div></div>
<div class="ttc" id="classarmnn_1_1_output_slot_html_ada2ad7d1caeeb4ef6195c8925fad6a65"><div class="ttname"><a href="classarmnn_1_1_output_slot.html#ada2ad7d1caeeb4ef6195c8925fad6a65">armnn::OutputSlot::GetTensorInfo</a></div><div class="ttdeci">const TensorInfo &amp; GetTensorInfo() const override</div><div class="ttdef"><b>Definition:</b> <a href="_layer_8cpp_source.html#l00063">Layer.cpp:63</a></div></div>
<div class="ttc" id="classarmnn_1_1_output_slot_html_a7ddaf04177053a536f0e7be83a642bc6"><div class="ttname"><a href="classarmnn_1_1_output_slot.html#a7ddaf04177053a536f0e7be83a642bc6">armnn::OutputSlot::GetOwningLayer</a></div><div class="ttdeci">Layer &amp; GetOwningLayer() const</div><div class="ttdef"><b>Definition:</b> <a href="_layer_8hpp_source.html#l00115">Layer.hpp:115</a></div></div>
<div class="ttc" id="classarmnn_1_1_concat_layer_html_a7763728321afb4eb0d1d00323c3e9121"><div class="ttname"><a href="classarmnn_1_1_concat_layer.html#a7763728321afb4eb0d1d00323c3e9121">armnn::ConcatLayer::CreateTensorHandles</a></div><div class="ttdeci">virtual void CreateTensorHandles(const TensorHandleFactoryRegistry &amp;registry, const IWorkloadFactory &amp;factory, const bool IsMemoryManaged=true) override</div><div class="ttdef"><b>Definition:</b> <a href="_concat_layer_8cpp_source.html#l00129">ConcatLayer.cpp:129</a></div></div>
<div class="ttc" id="namespacearmnn_html_a56943a0946e5f15e5e58054b8e7a04a4a324118a6721dd6b8a9b9f4e327df2bf5"><div class="ttname"><a href="namespacearmnn.html#a56943a0946e5f15e5e58054b8e7a04a4a324118a6721dd6b8a9b9f4e327df2bf5">armnn::LayerType::Input</a></div></div>
<div class="ttc" id="classarmnn_1_1_layer_html_a0e36688a43c35668d8db5257274c68fe"><div class="ttname"><a href="classarmnn_1_1_layer.html#a0e36688a43c35668d8db5257274c68fe">armnn::Layer::GetOutputSlot</a></div><div class="ttdeci">const OutputSlot &amp; GetOutputSlot(unsigned int index=0) const override</div><div class="ttdef"><b>Definition:</b> <a href="_layer_8hpp_source.html#l00312">Layer.hpp:312</a></div></div>
<div class="ttc" id="namespacearmnn_html_a93d269806f34407695dc10f510001c30"><div class="ttname"><a href="namespacearmnn.html#a93d269806f34407695dc10f510001c30">armnn::GetTensorInfo</a></div><div class="ttdeci">const TensorInfo &amp; GetTensorInfo(const ITensorHandle *tensorHandle)</div><div class="ttdoc">float32 helpers </div><div class="ttdef"><b>Definition:</b> <a href="_ref_workload_utils_8hpp_source.html#l00025">RefWorkloadUtils.hpp:25</a></div></div>
<div class="ttc" id="namespacearmnn_html_a56943a0946e5f15e5e58054b8e7a04a4ae20f0f2826a6549809f050b86274567f"><div class="ttname"><a href="namespacearmnn.html#a56943a0946e5f15e5e58054b8e7a04a4ae20f0f2826a6549809f050b86274567f">armnn::LayerType::Concat</a></div></div>
<div class="ttc" id="namespacearmnn_html_a56943a0946e5f15e5e58054b8e7a04a4"><div class="ttname"><a href="namespacearmnn.html#a56943a0946e5f15e5e58054b8e7a04a4">armnn::LayerType</a></div><div class="ttdeci">LayerType</div><div class="ttdef"><b>Definition:</b> <a href="_internal_types_8hpp_source.html#l00014">InternalTypes.hpp:14</a></div></div>
<div class="ttc" id="structarmnn_1_1_origins_descriptor_html"><div class="ttname"><a href="structarmnn_1_1_origins_descriptor.html">armnn::OriginsDescriptor</a></div><div class="ttdoc">An OriginsDescriptor for the ConcatLayer. Descriptor to configure the concatenation process...</div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.html#l00147">Descriptors.hpp:147</a></div></div>
<div class="ttc" id="classarmnn_1_1_layer_html_acf8b8e23bf647836592982f97088d375"><div class="ttname"><a href="classarmnn_1_1_layer.html#acf8b8e23bf647836592982f97088d375">armnn::Layer::GetInputSlot</a></div><div class="ttdeci">const InputSlot &amp; GetInputSlot(unsigned int index) const override</div><div class="ttdef"><b>Definition:</b> <a href="_layer_8hpp_source.html#l00310">Layer.hpp:310</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.html">src</a></li><li class="navelem"><a class="el" href="dir_e0a84d05c80a2ef4231141dcbbeac5c8.html">armnn</a></li><li class="navelem"><a class="el" href="dir_9da6642ce0fd5a8c83524f1b621275be.html">layers</a></li><li class="navelem"><a class="el" href="_concat_layer_8cpp.html">ConcatLayer.cpp</a></li>
    <li class="footer">Generated on Fri Mar 13 2020 16:06:54 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>