blob: 7aa42ae03da1138ff75a35ddb23f29beb4e09418 [file] [log] [blame]
Ryan OSheade36e4a2020-03-13 16:26:19 +00001<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
2<html xmlns="http://www.w3.org/1999/xhtml">
3<head>
4<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
5<meta http-equiv="X-UA-Compatible" content="IE=9"/>
6<meta name="generator" content="Doxygen 1.8.13"/>
7<meta name="viewport" content="width=device-width, initial-scale=1"/>
8<title>ArmNN: PermuteAndBatchToSpaceAsDepthToSpaceImpl Class Reference</title>
9<link href="tabs.css" rel="stylesheet" type="text/css"/>
10<script type="text/javascript" src="jquery.js"></script>
11<script type="text/javascript" src="dynsections.js"></script>
12<link href="navtree.css" rel="stylesheet" type="text/css"/>
13<script type="text/javascript" src="resize.js"></script>
14<script type="text/javascript" src="navtreedata.js"></script>
15<script type="text/javascript" src="navtree.js"></script>
16<script type="text/javascript">
17 $(document).ready(initResizable);
18</script>
19<link href="search/search.css" rel="stylesheet" type="text/css"/>
20<script type="text/javascript" src="search/searchdata.js"></script>
21<script type="text/javascript" src="search/search.js"></script>
22<link href="doxygen.css" rel="stylesheet" type="text/css" />
23</head>
24<body>
25<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
26<div id="titlearea">
27<table cellspacing="0" cellpadding="0">
28 <tbody>
29 <tr style="height: 56px;">
30 <td id="projectalign" style="padding-left: 0.5em;">
31 <div id="projectname">ArmNN
32 &#160;<span id="projectnumber">NotReleased</span>
33 </div>
34 </td>
35 </tr>
36 </tbody>
37</table>
38</div>
39<!-- end header part -->
40<!-- Generated by Doxygen 1.8.13 -->
41<script type="text/javascript">
42var searchBox = new SearchBox("searchBox", "search",false,'Search');
43</script>
44<script type="text/javascript" src="menudata.js"></script>
45<script type="text/javascript" src="menu.js"></script>
46<script type="text/javascript">
47$(function() {
48 initMenu('',true,false,'search.php','Search');
49 $(document).ready(function() { init_search(); });
50});
51</script>
52<div id="main-nav"></div>
53</div><!-- top -->
54<div id="side-nav" class="ui-resizable side-nav-resizable">
55 <div id="nav-tree">
56 <div id="nav-tree-contents">
57 <div id="nav-sync" class="sync"></div>
58 </div>
59 </div>
60 <div id="splitbar" style="-moz-user-select:none;"
61 class="ui-resizable-handle">
62 </div>
63</div>
64<script type="text/javascript">
65$(document).ready(function(){initNavTree('classarmnn_1_1optimizations_1_1_permute_and_batch_to_space_as_depth_to_space_impl.html','');});
66</script>
67<div id="doc-content">
68<!-- window showing the filter options -->
69<div id="MSearchSelectWindow"
70 onmouseover="return searchBox.OnSearchSelectShow()"
71 onmouseout="return searchBox.OnSearchSelectHide()"
72 onkeydown="return searchBox.OnSearchSelectKey(event)">
73</div>
74
75<!-- iframe showing the search results (closed by default) -->
76<div id="MSearchResultsWindow">
77<iframe src="javascript:void(0)" frameborder="0"
78 name="MSearchResults" id="MSearchResults">
79</iframe>
80</div>
81
82<div class="header">
83 <div class="summary">
84<a href="#pub-methods">Public Member Functions</a> &#124;
85<a href="classarmnn_1_1optimizations_1_1_permute_and_batch_to_space_as_depth_to_space_impl-members.html">List of all members</a> </div>
86 <div class="headertitle">
87<div class="title">PermuteAndBatchToSpaceAsDepthToSpaceImpl Class Reference</div> </div>
88</div><!--header-->
89<div class="contents">
90
91<p><code>#include &lt;<a class="el" href="_permute_and_batch_to_space_as_depth_to_space_8hpp_source.html">PermuteAndBatchToSpaceAsDepthToSpace.hpp</a>&gt;</code></p>
92<table class="memberdecls">
93<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
94Public Member Functions</h2></td></tr>
95<tr class="memitem:a5a8476ffc04ce7460bb09ad50d1d23de"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classarmnn_1_1optimizations_1_1_permute_and_batch_to_space_as_depth_to_space_impl.html#a5a8476ffc04ce7460bb09ad50d1d23de">Run</a> (<a class="el" href="classarmnn_1_1_graph.html">Graph</a> &amp;graph, <a class="el" href="classarmnn_1_1_input_slot.html">InputSlot</a> &amp;connection) const</td></tr>
96<tr class="separator:a5a8476ffc04ce7460bb09ad50d1d23de"><td class="memSeparator" colspan="2">&#160;</td></tr>
97</table>
98<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
99<div class="textblock"><p>Replaces Permute leading into BatchToSpace with a DepthToSpace in the case where the Permute swaps the batch and channels dimensions such that the replacement is valid. </p>
100
101<p class="definition">Definition at line <a class="el" href="_permute_and_batch_to_space_as_depth_to_space_8hpp_source.html#l00017">17</a> of file <a class="el" href="_permute_and_batch_to_space_as_depth_to_space_8hpp_source.html">PermuteAndBatchToSpaceAsDepthToSpace.hpp</a>.</p>
102</div><h2 class="groupheader">Member Function Documentation</h2>
103<a id="a5a8476ffc04ce7460bb09ad50d1d23de"></a>
104<h2 class="memtitle"><span class="permalink"><a href="#a5a8476ffc04ce7460bb09ad50d1d23de">&#9670;&nbsp;</a></span>Run()</h2>
105
106<div class="memitem">
107<div class="memproto">
108 <table class="memname">
109 <tr>
110 <td class="memname">void Run </td>
111 <td>(</td>
112 <td class="paramtype"><a class="el" href="classarmnn_1_1_graph.html">Graph</a> &amp;&#160;</td>
113 <td class="paramname"><em>graph</em>, </td>
114 </tr>
115 <tr>
116 <td class="paramkey"></td>
117 <td></td>
118 <td class="paramtype"><a class="el" href="classarmnn_1_1_input_slot.html">InputSlot</a> &amp;&#160;</td>
119 <td class="paramname"><em>connection</em>&#160;</td>
120 </tr>
121 <tr>
122 <td></td>
123 <td>)</td>
124 <td></td><td> const</td>
125 </tr>
126 </table>
127</div><div class="memdoc">
128
129<p class="definition">Definition at line <a class="el" href="_permute_and_batch_to_space_as_depth_to_space_8cpp_source.html#l00011">11</a> of file <a class="el" href="_permute_and_batch_to_space_as_depth_to_space_8cpp_source.html">PermuteAndBatchToSpaceAsDepthToSpace.cpp</a>.</p>
130
131<p class="reference">References <a class="el" href="namespacearmnn.html#a56943a0946e5f15e5e58054b8e7a04a4a6ee06c6045d0c5b6565a247955ef0fc2">armnn::BatchToSpaceNd</a>, <a class="el" href="_layer_8hpp_source.html#l00055">InputSlot::GetConnectedOutputSlot()</a>, <a class="el" href="_layer_8hpp_source.html#l00199">InputSlot::GetConnection()</a>, <a class="el" href="_layer_8hpp_source.html#l00310">Layer::GetInputSlot()</a>, <a class="el" href="_layer_8hpp_source.html#l00305">Layer::GetName()</a>, <a class="el" href="_tensor_8hpp_source.html#l00092">TensorInfo::GetNumDimensions()</a>, <a class="el" href="_layer_8hpp_source.html#l00221">Layer::GetOutputHandler()</a>, <a class="el" href="_layer_8hpp_source.html#l00312">Layer::GetOutputSlot()</a>, <a class="el" href="_layer_8hpp_source.html#l00052">InputSlot::GetOwningLayer()</a>, <a class="el" href="_layer_8hpp_source.html#l00115">OutputSlot::GetOwningLayer()</a>, <a class="el" href="classarmnn_1_1_i_output_slot.html#a9943775a364fc4ab53b85ac88f311886">IOutputSlot::GetTensorInfo()</a>, <a class="el" href="_layer_8cpp_source.html#l00063">OutputSlot::GetTensorInfo()</a>, <a class="el" href="_layer_8hpp_source.html#l00259">Layer::GetType()</a>, <a class="el" href="_descriptors_8hpp_source.html#l00682">BatchToSpaceNdDescriptor::m_Crops</a>, <a class="el" href="_descriptors_8hpp_source.html#l00684">BatchToSpaceNdDescriptor::m_DataLayout</a>, <a class="el" href="namespacearmnn.html#ad1d5cce2d9e9a5d61c243e5c989112e0ad066db54b89b0912e7e7c6da51e2da51">armnn::NHWC</a>, <a class="el" href="namespacearmnn.html#a56943a0946e5f15e5e58054b8e7a04a4afa662c6eb71caef475b2b981ce8eccd7">armnn::Permute</a>, and <a class="el" href="_output_handler_8cpp_source.html#l00017">OutputHandler::SetTensorInfo()</a>.</p>
132<div class="fragment"><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="comment">// Validate base layer (the Permute) is compatible</span></div><div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160; <a class="code" href="classarmnn_1_1_layer.html">Layer</a>&amp; base = connection.<a class="code" href="classarmnn_1_1_input_slot.html#a9effd325a6d512a3f8ff4bd207d53255">GetConnectedOutputSlot</a>()-&gt;<a class="code" href="classarmnn_1_1_output_slot.html#a7ddaf04177053a536f0e7be83a642bc6">GetOwningLayer</a>();</div><div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160; BOOST_ASSERT(base.<a class="code" href="classarmnn_1_1_layer.html#aaef29472862381822654ab6cbf7cba2a">GetType</a>() == <a class="code" href="namespacearmnn.html#a56943a0946e5f15e5e58054b8e7a04a4afa662c6eb71caef475b2b981ce8eccd7">LayerType::Permute</a>);</div><div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160; <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_info.html">TensorInfo</a>&amp; inputInfo = base.<a class="code" href="classarmnn_1_1_layer.html#acf8b8e23bf647836592982f97088d375">GetInputSlot</a>(0).<a class="code" href="classarmnn_1_1_input_slot.html#a3153abb7c0c0a84629079b2fac7db54f">GetConnection</a>()-&gt;<a class="code" href="classarmnn_1_1_i_output_slot.html#a9943775a364fc4ab53b85ac88f311886">GetTensorInfo</a>();</div><div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160; <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_info.html">TensorInfo</a>&amp; intermediateInfo = base.<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>();</div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160; <span class="keywordflow">if</span> (intermediateInfo.<a class="code" href="classarmnn_1_1_tensor_info.html#a157e27d41e9f6b21f0d3c025fa47dc24">GetNumDimensions</a>() != 4)</div><div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160; {</div><div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160; <span class="comment">// Must be 4D, otherwise the below checks do not make sense</span></div><div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160; <span class="keywordflow">return</span>;</div><div class="line"><a name="l00022"></a><span class="lineno"> 22</span>&#160; }</div><div class="line"><a name="l00023"></a><span class="lineno"> 23</span>&#160; <span class="keywordflow">if</span> (!static_cast&lt;PermuteLayer&amp;&gt;(base).GetParameters().m_DimMappings.IsEqual(<a class="code" href="classarmnn_1_1_permutation_vector.html">PermutationVector</a>{ 3, 1, 2, 0 }))</div><div class="line"><a name="l00024"></a><span class="lineno"> 24</span>&#160; {</div><div class="line"><a name="l00025"></a><span class="lineno"> 25</span>&#160; <span class="comment">// Must swap batch and channels dimensions, otherwise it is not the (original) channels dimension</span></div><div class="line"><a name="l00026"></a><span class="lineno"> 26</span>&#160; <span class="comment">// that is being decomposed.</span></div><div class="line"><a name="l00027"></a><span class="lineno"> 27</span>&#160; <span class="keywordflow">return</span>;</div><div class="line"><a name="l00028"></a><span class="lineno"> 28</span>&#160; }</div><div class="line"><a name="l00029"></a><span class="lineno"> 29</span>&#160;</div><div class="line"><a name="l00030"></a><span class="lineno"> 30</span>&#160; <span class="comment">// Validate child layer (the BatchToSpace) is compatible</span></div><div class="line"><a name="l00031"></a><span class="lineno"> 31</span>&#160; <a class="code" href="classarmnn_1_1_layer.html">Layer</a>&amp; child = connection.<a class="code" href="classarmnn_1_1_input_slot.html#a7ddaf04177053a536f0e7be83a642bc6">GetOwningLayer</a>();</div><div class="line"><a name="l00032"></a><span class="lineno"> 32</span>&#160; BOOST_ASSERT(child.<a class="code" href="classarmnn_1_1_layer.html#aaef29472862381822654ab6cbf7cba2a">GetType</a>() == <a class="code" href="namespacearmnn.html#a56943a0946e5f15e5e58054b8e7a04a4a6ee06c6045d0c5b6565a247955ef0fc2">LayerType::BatchToSpaceNd</a>);</div><div class="line"><a name="l00033"></a><span class="lineno"> 33</span>&#160; <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_info.html">TensorInfo</a>&amp; outputInfo = child.<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>();</div><div class="line"><a name="l00034"></a><span class="lineno"> 34</span>&#160; <span class="keyword">const</span> <a class="code" href="structarmnn_1_1_batch_to_space_nd_descriptor.html">BatchToSpaceNdDescriptor</a>&amp; batchToSpaceDesc = <span class="keyword">static_cast&lt;</span><a class="code" href="classarmnn_1_1_batch_to_space_nd_layer.html">BatchToSpaceNdLayer</a>&amp;<span class="keyword">&gt;</span>(child).GetParameters();</div><div class="line"><a name="l00035"></a><span class="lineno"> 35</span>&#160; <span class="keywordflow">if</span> (batchToSpaceDesc.<a class="code" href="structarmnn_1_1_batch_to_space_nd_descriptor.html#a6089e1ca91914015777ea780a513131a">m_DataLayout</a> != <a class="code" href="namespacearmnn.html#ad1d5cce2d9e9a5d61c243e5c989112e0ad066db54b89b0912e7e7c6da51e2da51">DataLayout::NHWC</a>)</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="comment">// The rest of this function assumes NHWC, although in future this restriction could be lifted.</span></div><div class="line"><a name="l00038"></a><span class="lineno"> 38</span>&#160; <span class="keywordflow">return</span>;</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">if</span> (batchToSpaceDesc.<a class="code" href="structarmnn_1_1_batch_to_space_nd_descriptor.html#a3941f674c071c9503e00d2b59e92e454">m_Crops</a> != std::vector&lt;std::pair&lt;unsigned int, unsigned int&gt;&gt;{ { 0, 0 }, { 0, 0 } })</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; <span class="comment">// Cropping is not supported in DepthToSpace</span></div><div class="line"><a name="l00043"></a><span class="lineno"> 43</span>&#160; <span class="keywordflow">return</span>;</div><div class="line"><a name="l00044"></a><span class="lineno"> 44</span>&#160; }</div><div class="line"><a name="l00045"></a><span class="lineno"> 45</span>&#160; <span class="keywordflow">if</span> (batchToSpaceDesc.<a class="code" href="structarmnn_1_1_batch_to_space_nd_descriptor.html#a02e143524aefddd40b485fcf7dea6696">m_BlockShape</a>.size() != 2 ||</div><div class="line"><a name="l00046"></a><span class="lineno"> 46</span>&#160; batchToSpaceDesc.<a class="code" href="structarmnn_1_1_batch_to_space_nd_descriptor.html#a02e143524aefddd40b485fcf7dea6696">m_BlockShape</a>[0] != batchToSpaceDesc.<a class="code" href="structarmnn_1_1_batch_to_space_nd_descriptor.html#a02e143524aefddd40b485fcf7dea6696">m_BlockShape</a>[1])</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; <span class="comment">// Asymmetric or non-2D block sizes are not supported by DepthToSpace</span></div><div class="line"><a name="l00049"></a><span class="lineno"> 49</span>&#160; <span class="keywordflow">return</span>;</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; uint32_t blockSize = batchToSpaceDesc.<a class="code" href="structarmnn_1_1_batch_to_space_nd_descriptor.html#a02e143524aefddd40b485fcf7dea6696">m_BlockShape</a>[0];</div><div class="line"><a name="l00052"></a><span class="lineno"> 52</span>&#160; <span class="keywordflow">if</span> (outputInfo.GetShape()[0] != 1 || outputInfo.GetShape()[3] != 1)</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="comment">// The final output must have 1 batch and 1 channel because these dimensions will be swapped around</span></div><div class="line"><a name="l00055"></a><span class="lineno"> 55</span>&#160; <span class="comment">// once we make the substitution, and it needs to be equivalent.</span></div><div class="line"><a name="l00056"></a><span class="lineno"> 56</span>&#160; <span class="keywordflow">return</span>;</div><div class="line"><a name="l00057"></a><span class="lineno"> 57</span>&#160; }</div><div class="line"><a name="l00058"></a><span class="lineno"> 58</span>&#160;</div><div class="line"><a name="l00059"></a><span class="lineno"> 59</span>&#160; <span class="comment">// Validate the intermediate tensor quantization params.</span></div><div class="line"><a name="l00060"></a><span class="lineno"> 60</span>&#160; <span class="comment">// These must be identical to either the input or output quantization params, otherwise the intermediate tensor</span></div><div class="line"><a name="l00061"></a><span class="lineno"> 61</span>&#160; <span class="comment">// may not have sufficient range/precision to preserve the values.</span></div><div class="line"><a name="l00062"></a><span class="lineno"> 62</span>&#160; <span class="comment">// This would mean that once we perform the substitution this loss of precision will no longer occur,</span></div><div class="line"><a name="l00063"></a><span class="lineno"> 63</span>&#160; <span class="comment">// so we would have changed the meaning of the network.</span></div><div class="line"><a name="l00064"></a><span class="lineno"> 64</span>&#160; <span class="keywordtype">bool</span> isIntermediateQuantParamsSameAsInput =</div><div class="line"><a name="l00065"></a><span class="lineno"> 65</span>&#160; intermediateInfo.<a class="code" href="classarmnn_1_1_tensor_info.html#a047ca888c43bd7fb5702853bf72410d0">GetQuantizationScale</a>() == inputInfo.GetQuantizationScale() &amp;&amp;</div><div class="line"><a name="l00066"></a><span class="lineno"> 66</span>&#160; intermediateInfo.<a class="code" href="classarmnn_1_1_tensor_info.html#a770b51078da02f44a819e9f95d8058b5">GetQuantizationOffset</a>() == inputInfo.GetQuantizationOffset();</div><div class="line"><a name="l00067"></a><span class="lineno"> 67</span>&#160; <span class="keywordtype">bool</span> isIntermediateQuantParamsSameAsOutput =</div><div class="line"><a name="l00068"></a><span class="lineno"> 68</span>&#160; intermediateInfo.<a class="code" href="classarmnn_1_1_tensor_info.html#a047ca888c43bd7fb5702853bf72410d0">GetQuantizationScale</a>() == outputInfo.GetQuantizationScale() &amp;&amp;</div><div class="line"><a name="l00069"></a><span class="lineno"> 69</span>&#160; intermediateInfo.<a class="code" href="classarmnn_1_1_tensor_info.html#a770b51078da02f44a819e9f95d8058b5">GetQuantizationOffset</a>() == outputInfo.GetQuantizationOffset();</div><div class="line"><a name="l00070"></a><span class="lineno"> 70</span>&#160; <span class="keywordflow">if</span> (!isIntermediateQuantParamsSameAsInput &amp;&amp; !isIntermediateQuantParamsSameAsOutput)</div><div class="line"><a name="l00071"></a><span class="lineno"> 71</span>&#160; {</div><div class="line"><a name="l00072"></a><span class="lineno"> 72</span>&#160; <span class="keywordflow">return</span>;</div><div class="line"><a name="l00073"></a><span class="lineno"> 73</span>&#160; }</div><div class="line"><a name="l00074"></a><span class="lineno"> 74</span>&#160;</div><div class="line"><a name="l00075"></a><span class="lineno"> 75</span>&#160; <span class="comment">// Insert equivalent DepthToSpace layer</span></div><div class="line"><a name="l00076"></a><span class="lineno"> 76</span>&#160; <span class="keyword">const</span> std::string name = std::string(<span class="stringliteral">&quot;merged-&quot;</span>) + base.<a class="code" href="classarmnn_1_1_layer.html#a7ddf0cf6f620d59c10e63495ace795d0">GetName</a>() + std::string(<span class="stringliteral">&quot;-with-&quot;</span>) + child.<a class="code" href="classarmnn_1_1_layer.html#a7ddf0cf6f620d59c10e63495ace795d0">GetName</a>();</div><div class="line"><a name="l00077"></a><span class="lineno"> 77</span>&#160;</div><div class="line"><a name="l00078"></a><span class="lineno"> 78</span>&#160; <span class="comment">// Inserts equivalent reshape before base layer.</span></div><div class="line"><a name="l00079"></a><span class="lineno"> 79</span>&#160; <span class="keyword">const</span> <a class="code" href="structarmnn_1_1_space_to_depth_descriptor.html">DepthToSpaceDescriptor</a> depthToSpaceDesc(blockSize, <a class="code" href="namespacearmnn.html#ad1d5cce2d9e9a5d61c243e5c989112e0ad066db54b89b0912e7e7c6da51e2da51">DataLayout::NHWC</a>);</div><div class="line"><a name="l00080"></a><span class="lineno"> 80</span>&#160; <span class="keyword">auto</span>&amp; depthToSpace = *graph.<a class="code" href="classarmnn_1_1_graph.html#a3ff30c6669fdc69de1f5be1f89bacc3f">InsertNewLayer</a>&lt;<a class="code" href="classarmnn_1_1_depth_to_space_layer.html">DepthToSpaceLayer</a>&gt;(base.<a class="code" href="classarmnn_1_1_layer.html#acf8b8e23bf647836592982f97088d375">GetInputSlot</a>(0), depthToSpaceDesc, name.c_str());</div><div class="line"><a name="l00081"></a><span class="lineno"> 81</span>&#160; depthToSpace.<a class="code" href="classarmnn_1_1_layer.html#af2c0edc7ea62a8baaec4d3d9b2b09256">GetOutputHandler</a>().<a class="code" href="classarmnn_1_1_output_handler.html#a97db12c41024f5545ef5cc4153e5443b">SetTensorInfo</a>(outputInfo);</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="comment">// Moves connections from child output to new layer.</span></div><div class="line"><a name="l00084"></a><span class="lineno"> 84</span>&#160; <span class="comment">// Child layer will be removed as it&#39;s left unconnected.</span></div><div class="line"><a name="l00085"></a><span class="lineno"> 85</span>&#160; <span class="comment">// Base layer will be removed if left unconnected.</span></div><div class="line"><a name="l00086"></a><span class="lineno"> 86</span>&#160; child.<a class="code" href="classarmnn_1_1_layer.html#a0e36688a43c35668d8db5257274c68fe">GetOutputSlot</a>().<a class="code" href="classarmnn_1_1_output_slot.html#a19d30f83e90f2612e6aec510715f790d">MoveAllConnections</a>(depthToSpace.GetOutputSlot());</div><div class="line"><a name="l00087"></a><span class="lineno"> 87</span>&#160;}</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>
133<div class="ttc" id="classarmnn_1_1_depth_to_space_layer_html"><div class="ttname"><a href="classarmnn_1_1_depth_to_space_layer.html">armnn::DepthToSpaceLayer</a></div><div class="ttdoc">This layer represents a DepthToSpace operation. </div><div class="ttdef"><b>Definition:</b> <a href="_depth_to_space_layer_8hpp_source.html#l00014">DepthToSpaceLayer.hpp:14</a></div></div>
134<div class="ttc" id="classarmnn_1_1_batch_to_space_nd_layer_html"><div class="ttname"><a href="classarmnn_1_1_batch_to_space_nd_layer.html">armnn::BatchToSpaceNdLayer</a></div><div class="ttdoc">This layer represents a BatchToSpaceNd operation. </div><div class="ttdef"><b>Definition:</b> <a href="_batch_to_space_nd_layer_8hpp_source.html#l00013">BatchToSpaceNdLayer.hpp:13</a></div></div>
135<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>
136<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>
137<div class="ttc" id="classarmnn_1_1_tensor_info_html_a770b51078da02f44a819e9f95d8058b5"><div class="ttname"><a href="classarmnn_1_1_tensor_info.html#a770b51078da02f44a819e9f95d8058b5">armnn::TensorInfo::GetQuantizationOffset</a></div><div class="ttdeci">int32_t GetQuantizationOffset() const</div><div class="ttdef"><b>Definition:</b> <a href="_tensor_8cpp_source.html#l00264">Tensor.cpp:264</a></div></div>
138<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>
139<div class="ttc" id="structarmnn_1_1_batch_to_space_nd_descriptor_html"><div class="ttname"><a href="structarmnn_1_1_batch_to_space_nd_descriptor.html">armnn::BatchToSpaceNdDescriptor</a></div><div class="ttdoc">A BatchToSpaceNdDescriptor for the BatchToSpaceNdLayer. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.html#l00657">Descriptors.hpp:657</a></div></div>
140<div class="ttc" id="classarmnn_1_1_i_output_slot_html_a9943775a364fc4ab53b85ac88f311886"><div class="ttname"><a href="classarmnn_1_1_i_output_slot.html#a9943775a364fc4ab53b85ac88f311886">armnn::IOutputSlot::GetTensorInfo</a></div><div class="ttdeci">virtual const TensorInfo &amp; GetTensorInfo() const =0</div></div>
141<div class="ttc" id="classarmnn_1_1_permutation_vector_html"><div class="ttname"><a href="classarmnn_1_1_permutation_vector.html">armnn::PermutationVector</a></div><div class="ttdef"><b>Definition:</b> <a href="_types_8hpp_source.html#l00170">Types.hpp:170</a></div></div>
142<div class="ttc" id="classarmnn_1_1_tensor_info_html_a157e27d41e9f6b21f0d3c025fa47dc24"><div class="ttname"><a href="classarmnn_1_1_tensor_info.html#a157e27d41e9f6b21f0d3c025fa47dc24">armnn::TensorInfo::GetNumDimensions</a></div><div class="ttdeci">unsigned int GetNumDimensions() const</div><div class="ttdef"><b>Definition:</b> <a href="_tensor_8hpp_source.html#l00092">Tensor.hpp:92</a></div></div>
143<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>
144<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>
145<div class="ttc" id="structarmnn_1_1_batch_to_space_nd_descriptor_html_a6089e1ca91914015777ea780a513131a"><div class="ttname"><a href="structarmnn_1_1_batch_to_space_nd_descriptor.html#a6089e1ca91914015777ea780a513131a">armnn::BatchToSpaceNdDescriptor::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.html#l00684">Descriptors.hpp:684</a></div></div>
146<div class="ttc" id="structarmnn_1_1_space_to_depth_descriptor_html"><div class="ttname"><a href="structarmnn_1_1_space_to_depth_descriptor.html">armnn::SpaceToDepthDescriptor</a></div><div class="ttdoc">A SpaceToDepthDescriptor for the SpaceToDepthLayer. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.html#l00810">Descriptors.hpp:810</a></div></div>
147<div class="ttc" id="namespacearmnn_html_a56943a0946e5f15e5e58054b8e7a04a4a6ee06c6045d0c5b6565a247955ef0fc2"><div class="ttname"><a href="namespacearmnn.html#a56943a0946e5f15e5e58054b8e7a04a4a6ee06c6045d0c5b6565a247955ef0fc2">armnn::LayerType::BatchToSpaceNd</a></div></div>
148<div class="ttc" id="classarmnn_1_1_input_slot_html_a3153abb7c0c0a84629079b2fac7db54f"><div class="ttname"><a href="classarmnn_1_1_input_slot.html#a3153abb7c0c0a84629079b2fac7db54f">armnn::InputSlot::GetConnection</a></div><div class="ttdeci">const IOutputSlot * GetConnection() const override</div><div class="ttdef"><b>Definition:</b> <a href="_layer_8hpp_source.html#l00199">Layer.hpp:199</a></div></div>
149<div class="ttc" id="classarmnn_1_1_output_slot_html_a19d30f83e90f2612e6aec510715f790d"><div class="ttname"><a href="classarmnn_1_1_output_slot.html#a19d30f83e90f2612e6aec510715f790d">armnn::OutputSlot::MoveAllConnections</a></div><div class="ttdeci">void MoveAllConnections(OutputSlot &amp;destination)</div><div class="ttdoc">Moves all connections to another OutputSlot. </div><div class="ttdef"><b>Definition:</b> <a href="_layer_8cpp_source.html#l00112">Layer.cpp:112</a></div></div>
150<div class="ttc" id="classarmnn_1_1_output_handler_html_a97db12c41024f5545ef5cc4153e5443b"><div class="ttname"><a href="classarmnn_1_1_output_handler.html#a97db12c41024f5545ef5cc4153e5443b">armnn::OutputHandler::SetTensorInfo</a></div><div class="ttdeci">void SetTensorInfo(const TensorInfo &amp;tensorInfo)</div><div class="ttdoc">Sets the TensorInfo used by this output handler. </div><div class="ttdef"><b>Definition:</b> <a href="_output_handler_8cpp_source.html#l00017">OutputHandler.cpp:17</a></div></div>
151<div class="ttc" id="namespacearmnn_html_a56943a0946e5f15e5e58054b8e7a04a4afa662c6eb71caef475b2b981ce8eccd7"><div class="ttname"><a href="namespacearmnn.html#a56943a0946e5f15e5e58054b8e7a04a4afa662c6eb71caef475b2b981ce8eccd7">armnn::LayerType::Permute</a></div></div>
152<div class="ttc" id="classarmnn_1_1_graph_html_a3ff30c6669fdc69de1f5be1f89bacc3f"><div class="ttname"><a href="classarmnn_1_1_graph.html#a3ff30c6669fdc69de1f5be1f89bacc3f">armnn::Graph::InsertNewLayer</a></div><div class="ttdeci">LayerT * InsertNewLayer(InputSlot &amp;insertBefore, Args &amp;&amp;... args)</div><div class="ttdef"><b>Definition:</b> <a href="_graph_8hpp_source.html#l00409">Graph.hpp:409</a></div></div>
153<div class="ttc" id="structarmnn_1_1_batch_to_space_nd_descriptor_html_a3941f674c071c9503e00d2b59e92e454"><div class="ttname"><a href="structarmnn_1_1_batch_to_space_nd_descriptor.html#a3941f674c071c9503e00d2b59e92e454">armnn::BatchToSpaceNdDescriptor::m_Crops</a></div><div class="ttdeci">std::vector&lt; std::pair&lt; unsigned int, unsigned int &gt; &gt; m_Crops</div><div class="ttdoc">The values to crop from the input dimension. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.html#l00682">Descriptors.hpp:682</a></div></div>
154<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>
155<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>
156<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>
157<div class="ttc" id="classarmnn_1_1_input_slot_html_a7ddaf04177053a536f0e7be83a642bc6"><div class="ttname"><a href="classarmnn_1_1_input_slot.html#a7ddaf04177053a536f0e7be83a642bc6">armnn::InputSlot::GetOwningLayer</a></div><div class="ttdeci">Layer &amp; GetOwningLayer() const</div><div class="ttdef"><b>Definition:</b> <a href="_layer_8hpp_source.html#l00052">Layer.hpp:52</a></div></div>
158<div class="ttc" id="structarmnn_1_1_batch_to_space_nd_descriptor_html_a02e143524aefddd40b485fcf7dea6696"><div class="ttname"><a href="structarmnn_1_1_batch_to_space_nd_descriptor.html#a02e143524aefddd40b485fcf7dea6696">armnn::BatchToSpaceNdDescriptor::m_BlockShape</a></div><div class="ttdeci">std::vector&lt; unsigned int &gt; m_BlockShape</div><div class="ttdoc">Block shape values. </div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8hpp_source.html#l00680">Descriptors.hpp:680</a></div></div>
159<div class="ttc" id="classarmnn_1_1_tensor_info_html_a047ca888c43bd7fb5702853bf72410d0"><div class="ttname"><a href="classarmnn_1_1_tensor_info.html#a047ca888c43bd7fb5702853bf72410d0">armnn::TensorInfo::GetQuantizationScale</a></div><div class="ttdeci">float GetQuantizationScale() const</div><div class="ttdef"><b>Definition:</b> <a href="_tensor_8cpp_source.html#l00247">Tensor.cpp:247</a></div></div>
160<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>
161<div class="ttc" id="namespacearmnn_html_ad1d5cce2d9e9a5d61c243e5c989112e0ad066db54b89b0912e7e7c6da51e2da51"><div class="ttname"><a href="namespacearmnn.html#ad1d5cce2d9e9a5d61c243e5c989112e0ad066db54b89b0912e7e7c6da51e2da51">armnn::DataLayout::NHWC</a></div></div>
162</div><!-- fragment -->
163</div>
164</div>
165<hr/>The documentation for this class was generated from the following files:<ul>
166<li>src/armnn/optimizations/<a class="el" href="_permute_and_batch_to_space_as_depth_to_space_8hpp_source.html">PermuteAndBatchToSpaceAsDepthToSpace.hpp</a></li>
167<li>src/armnn/optimizations/<a class="el" href="_permute_and_batch_to_space_as_depth_to_space_8cpp_source.html">PermuteAndBatchToSpaceAsDepthToSpace.cpp</a></li>
168</ul>
169</div><!-- contents -->
170</div><!-- doc-content -->
171<!-- start footer part -->
172<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
173 <ul>
174 <li class="navelem"><a class="el" href="namespacearmnn.html">armnn</a></li><li class="navelem"><a class="el" href="namespacearmnn_1_1optimizations.html">optimizations</a></li><li class="navelem"><a class="el" href="classarmnn_1_1optimizations_1_1_permute_and_batch_to_space_as_depth_to_space_impl.html">PermuteAndBatchToSpaceAsDepthToSpaceImpl</a></li>
175 <li class="footer">Generated on Fri Mar 13 2020 16:07:05 for ArmNN by
176 <a href="http://www.doxygen.org/index.html">
177 <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
178 </ul>
179</div>
180</body>
181</html>