blob: 469eae8f40c444a60b52d280264e64227886c440 [file] [log] [blame]
Nikhil Raj1dc83fe2024-05-16 09:47:51 +01001<!-- HTML header for doxygen 1.8.17-->
2<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3<html xmlns="http://www.w3.org/1999/xhtml">
4<head>
5<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
6<meta http-equiv="X-UA-Compatible" content="IE=9"/>
7<meta name="generator" content="Doxygen 1.8.17"/>
8<meta name="viewport" content="width=device-width, initial-scale=1"/>
9<title>Arm NN: PermutationVector Class Reference</title>
10<link href="tabs.css" rel="stylesheet" type="text/css"/>
11<script type="text/javascript" src="jquery.js"></script>
12<script type="text/javascript" src="dynsections.js"></script>
13<link href="navtree.css" rel="stylesheet" type="text/css"/>
14<script type="text/javascript" src="resize.js"></script>
15<script type="text/javascript" src="navtreedata.js"></script>
16<script type="text/javascript" src="navtree.js"></script>
17<link href="search/search.css" rel="stylesheet" type="text/css"/>
18<script type="text/javascript" src="search/searchdata.js"></script>
19<script type="text/javascript" src="search/search.js"></script>
20<script type="text/x-mathjax-config">
21 MathJax.Hub.Config({
22 extensions: ["tex2jax.js"],
23 jax: ["input/TeX","output/HTML-CSS"],
24});
25</script>
26<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
27<link href="doxygen.css" rel="stylesheet" type="text/css" />
28<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
29</head>
30<body>
31<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
32<div id="titlearea">
33<table cellspacing="0" cellpadding="0">
34 <tbody>
35 <tr style="height: 56px;">
36 <img alt="ArmNN" src="Arm_NN_horizontal_blue.png" style="max-width: 15rem; margin-top: .5rem; margin-left 13px"/>
37 <td id="projectalign" style="padding-left: 0.9em;">
38 <div id="projectname">
39 &#160;<span id="projectnumber">24.05</span>
40 </div>
41 </td>
42 </tr>
43 </tbody>
44</table>
45</div>
46<!-- end header part -->
47<!-- Generated by Doxygen 1.8.17 -->
48<script type="text/javascript">
49/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
50var searchBox = new SearchBox("searchBox", "search",false,'Search');
51/* @license-end */
52</script>
53<script type="text/javascript" src="menudata.js"></script>
54<script type="text/javascript" src="menu.js"></script>
55<script type="text/javascript">
56/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
57$(function() {
58 initMenu('',true,false,'search.php','Search');
59 $(document).ready(function() { init_search(); });
60});
61/* @license-end */</script>
62<div id="main-nav"></div>
63</div><!-- top -->
64<div id="side-nav" class="ui-resizable side-nav-resizable">
65 <div id="nav-tree">
66 <div id="nav-tree-contents">
67 <div id="nav-sync" class="sync"></div>
68 </div>
69 </div>
70 <div id="splitbar" style="-moz-user-select:none;"
71 class="ui-resizable-handle">
72 </div>
73</div>
74<script type="text/javascript">
75/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
76$(document).ready(function(){initNavTree('classarmnn_1_1_permutation_vector.html',''); initResizable(); });
77/* @license-end */
78</script>
79<div id="doc-content">
80<!-- window showing the filter options -->
81<div id="MSearchSelectWindow"
82 onmouseover="return searchBox.OnSearchSelectShow()"
83 onmouseout="return searchBox.OnSearchSelectHide()"
84 onkeydown="return searchBox.OnSearchSelectKey(event)">
85</div>
86
87<!-- iframe showing the search results (closed by default) -->
88<div id="MSearchResultsWindow">
89<iframe src="javascript:void(0)" frameborder="0"
90 name="MSearchResults" id="MSearchResults">
91</iframe>
92</div>
93
94<div class="header">
95 <div class="summary">
96<a href="#pub-types">Public Types</a> &#124;
97<a href="#pub-methods">Public Member Functions</a> &#124;
98<a href="classarmnn_1_1_permutation_vector-members.html">List of all members</a> </div>
99 <div class="headertitle">
100<div class="title">PermutationVector Class Reference</div> </div>
101</div><!--header-->
102<div class="contents">
103
104<p><code>#include &lt;<a class="el" href="_types_8hpp_source.html">Types.hpp</a>&gt;</code></p>
105<table class="memberdecls">
106<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-types"></a>
107Public Types</h2></td></tr>
108<tr class="memitem:a9e70f27e3e424e90566080423b1fe2db"><td class="memItemLeft" align="right" valign="top">using&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classarmnn_1_1_permutation_vector.html#a9e70f27e3e424e90566080423b1fe2db">ValueType</a> = unsigned int</td></tr>
109<tr class="separator:a9e70f27e3e424e90566080423b1fe2db"><td class="memSeparator" colspan="2">&#160;</td></tr>
110<tr class="memitem:a12b132c42f8e60ebc9669a3b333bb946"><td class="memItemLeft" align="right" valign="top">using&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classarmnn_1_1_permutation_vector.html#a12b132c42f8e60ebc9669a3b333bb946">SizeType</a> = unsigned int</td></tr>
111<tr class="separator:a12b132c42f8e60ebc9669a3b333bb946"><td class="memSeparator" colspan="2">&#160;</td></tr>
112<tr class="memitem:acaddf65e487df26a73b4e90cbfc0ada9"><td class="memItemLeft" align="right" valign="top">using&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classarmnn_1_1_permutation_vector.html#acaddf65e487df26a73b4e90cbfc0ada9">ArrayType</a> = std::array&lt; <a class="el" href="classarmnn_1_1_permutation_vector.html#a9e70f27e3e424e90566080423b1fe2db">ValueType</a>, <a class="el" href="namespacearmnn.html#abdcd184ed3bd648bb31d385040cafd5d">MaxNumOfTensorDimensions</a> &gt;</td></tr>
113<tr class="separator:acaddf65e487df26a73b4e90cbfc0ada9"><td class="memSeparator" colspan="2">&#160;</td></tr>
114<tr class="memitem:a065e980f27e65a118d3b071ab077cfda"><td class="memItemLeft" align="right" valign="top">using&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classarmnn_1_1_permutation_vector.html#a065e980f27e65a118d3b071ab077cfda">ConstIterator</a> = typename ArrayType::const_iterator</td></tr>
115<tr class="separator:a065e980f27e65a118d3b071ab077cfda"><td class="memSeparator" colspan="2">&#160;</td></tr>
116</table><table class="memberdecls">
117<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
118Public Member Functions</h2></td></tr>
119<tr class="memitem:a399359e369b182e7c86840d7b6a38c41"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classarmnn_1_1_permutation_vector.html#a399359e369b182e7c86840d7b6a38c41">PermutationVector</a> (const <a class="el" href="classarmnn_1_1_permutation_vector.html#a9e70f27e3e424e90566080423b1fe2db">ValueType</a> *dimMappings, <a class="el" href="classarmnn_1_1_permutation_vector.html#a12b132c42f8e60ebc9669a3b333bb946">SizeType</a> numDimMappings)</td></tr>
120<tr class="separator:a399359e369b182e7c86840d7b6a38c41"><td class="memSeparator" colspan="2">&#160;</td></tr>
121<tr class="memitem:adb9aad0dc5def92d5749a0efad1ead58"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classarmnn_1_1_permutation_vector.html#adb9aad0dc5def92d5749a0efad1ead58">PermutationVector</a> (std::initializer_list&lt; <a class="el" href="classarmnn_1_1_permutation_vector.html#a9e70f27e3e424e90566080423b1fe2db">ValueType</a> &gt; dimMappings)</td></tr>
122<tr class="separator:adb9aad0dc5def92d5749a0efad1ead58"><td class="memSeparator" colspan="2">&#160;</td></tr>
123<tr class="memitem:a86e55f7d14b21da3b31280412be96bd7"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classarmnn_1_1_permutation_vector.html#a9e70f27e3e424e90566080423b1fe2db">ValueType</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classarmnn_1_1_permutation_vector.html#a86e55f7d14b21da3b31280412be96bd7">operator[]</a> (<a class="el" href="classarmnn_1_1_permutation_vector.html#a12b132c42f8e60ebc9669a3b333bb946">SizeType</a> i) const</td></tr>
124<tr class="memdesc:a86e55f7d14b21da3b31280412be96bd7"><td class="mdescLeft">&#160;</td><td class="mdescRight">Indexing method with out-of-bounds error checking for the m_DimMappings array. <a href="classarmnn_1_1_permutation_vector.html#a86e55f7d14b21da3b31280412be96bd7">More...</a><br /></td></tr>
125<tr class="separator:a86e55f7d14b21da3b31280412be96bd7"><td class="memSeparator" colspan="2">&#160;</td></tr>
126<tr class="memitem:a490ec6b59006d1fe1ec2ea30e69fb97c"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classarmnn_1_1_permutation_vector.html#a12b132c42f8e60ebc9669a3b333bb946">SizeType</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classarmnn_1_1_permutation_vector.html#a490ec6b59006d1fe1ec2ea30e69fb97c">GetSize</a> () const</td></tr>
127<tr class="separator:a490ec6b59006d1fe1ec2ea30e69fb97c"><td class="memSeparator" colspan="2">&#160;</td></tr>
128<tr class="memitem:ad5fee900c7aee90671038c79225bf8ec"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classarmnn_1_1_permutation_vector.html#a065e980f27e65a118d3b071ab077cfda">ConstIterator</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classarmnn_1_1_permutation_vector.html#ad5fee900c7aee90671038c79225bf8ec">begin</a> () const</td></tr>
129<tr class="separator:ad5fee900c7aee90671038c79225bf8ec"><td class="memSeparator" colspan="2">&#160;</td></tr>
130<tr class="memitem:a69b6e2a03c835ca5d658a1f16acbaa9c"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classarmnn_1_1_permutation_vector.html#a065e980f27e65a118d3b071ab077cfda">ConstIterator</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classarmnn_1_1_permutation_vector.html#a69b6e2a03c835ca5d658a1f16acbaa9c">end</a> () const</td></tr>
131<tr class="separator:a69b6e2a03c835ca5d658a1f16acbaa9c"><td class="memSeparator" colspan="2">&#160;</td></tr>
132<tr class="memitem:aae44e4154aa80fba7616747450ff69d5"><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classarmnn_1_1_permutation_vector.html#aae44e4154aa80fba7616747450ff69d5">IsEqual</a> (const <a class="el" href="classarmnn_1_1_permutation_vector.html">PermutationVector</a> &amp;other) const</td></tr>
133<tr class="separator:aae44e4154aa80fba7616747450ff69d5"><td class="memSeparator" colspan="2">&#160;</td></tr>
134<tr class="memitem:abca528420d32f4edad0b1425ad90f80e"><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classarmnn_1_1_permutation_vector.html#abca528420d32f4edad0b1425ad90f80e">IsInverse</a> (const <a class="el" href="classarmnn_1_1_permutation_vector.html">PermutationVector</a> &amp;other) const</td></tr>
135<tr class="separator:abca528420d32f4edad0b1425ad90f80e"><td class="memSeparator" colspan="2">&#160;</td></tr>
136</table>
137<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
138<div class="textblock">
139<p class="definition">Definition at line <a class="el" href="_types_8hpp_source.html#l00314">314</a> of file <a class="el" href="_types_8hpp_source.html">Types.hpp</a>.</p>
140</div><h2 class="groupheader">Member Typedef Documentation</h2>
141<a id="acaddf65e487df26a73b4e90cbfc0ada9"></a>
142<h2 class="memtitle"><span class="permalink"><a href="#acaddf65e487df26a73b4e90cbfc0ada9">&#9670;&nbsp;</a></span>ArrayType</h2>
143
144<div class="memitem">
145<div class="memproto">
146 <table class="memname">
147 <tr>
148 <td class="memname">using <a class="el" href="classarmnn_1_1_permutation_vector.html#acaddf65e487df26a73b4e90cbfc0ada9">ArrayType</a> = std::array&lt;<a class="el" href="classarmnn_1_1_permutation_vector.html#a9e70f27e3e424e90566080423b1fe2db">ValueType</a>, <a class="el" href="namespacearmnn.html#abdcd184ed3bd648bb31d385040cafd5d">MaxNumOfTensorDimensions</a>&gt;</td>
149 </tr>
150 </table>
151</div><div class="memdoc">
152
153<p class="definition">Definition at line <a class="el" href="_types_8hpp_source.html#l00319">319</a> of file <a class="el" href="_types_8hpp_source.html">Types.hpp</a>.</p>
154
155</div>
156</div>
157<a id="a065e980f27e65a118d3b071ab077cfda"></a>
158<h2 class="memtitle"><span class="permalink"><a href="#a065e980f27e65a118d3b071ab077cfda">&#9670;&nbsp;</a></span>ConstIterator</h2>
159
160<div class="memitem">
161<div class="memproto">
162 <table class="memname">
163 <tr>
164 <td class="memname">using <a class="el" href="classarmnn_1_1_permutation_vector.html#a065e980f27e65a118d3b071ab077cfda">ConstIterator</a> = typename ArrayType::const_iterator</td>
165 </tr>
166 </table>
167</div><div class="memdoc">
168
169<p class="definition">Definition at line <a class="el" href="_types_8hpp_source.html#l00320">320</a> of file <a class="el" href="_types_8hpp_source.html">Types.hpp</a>.</p>
170
171</div>
172</div>
173<a id="a12b132c42f8e60ebc9669a3b333bb946"></a>
174<h2 class="memtitle"><span class="permalink"><a href="#a12b132c42f8e60ebc9669a3b333bb946">&#9670;&nbsp;</a></span>SizeType</h2>
175
176<div class="memitem">
177<div class="memproto">
178 <table class="memname">
179 <tr>
180 <td class="memname">using <a class="el" href="classarmnn_1_1_permutation_vector.html#a12b132c42f8e60ebc9669a3b333bb946">SizeType</a> = unsigned int</td>
181 </tr>
182 </table>
183</div><div class="memdoc">
184
185<p class="definition">Definition at line <a class="el" href="_types_8hpp_source.html#l00318">318</a> of file <a class="el" href="_types_8hpp_source.html">Types.hpp</a>.</p>
186
187</div>
188</div>
189<a id="a9e70f27e3e424e90566080423b1fe2db"></a>
190<h2 class="memtitle"><span class="permalink"><a href="#a9e70f27e3e424e90566080423b1fe2db">&#9670;&nbsp;</a></span>ValueType</h2>
191
192<div class="memitem">
193<div class="memproto">
194 <table class="memname">
195 <tr>
196 <td class="memname">using <a class="el" href="classarmnn_1_1_permutation_vector.html#a9e70f27e3e424e90566080423b1fe2db">ValueType</a> = unsigned int</td>
197 </tr>
198 </table>
199</div><div class="memdoc">
200
201<p class="definition">Definition at line <a class="el" href="_types_8hpp_source.html#l00317">317</a> of file <a class="el" href="_types_8hpp_source.html">Types.hpp</a>.</p>
202
203</div>
204</div>
205<h2 class="groupheader">Constructor &amp; Destructor Documentation</h2>
206<a id="a399359e369b182e7c86840d7b6a38c41"></a>
207<h2 class="memtitle"><span class="permalink"><a href="#a399359e369b182e7c86840d7b6a38c41">&#9670;&nbsp;</a></span>PermutationVector() <span class="overload">[1/2]</span></h2>
208
209<div class="memitem">
210<div class="memproto">
211 <table class="memname">
212 <tr>
213 <td class="memname"><a class="el" href="classarmnn_1_1_permutation_vector.html">PermutationVector</a> </td>
214 <td>(</td>
215 <td class="paramtype">const <a class="el" href="classarmnn_1_1_permutation_vector.html#a9e70f27e3e424e90566080423b1fe2db">ValueType</a> *&#160;</td>
216 <td class="paramname"><em>dimMappings</em>, </td>
217 </tr>
218 <tr>
219 <td class="paramkey"></td>
220 <td></td>
221 <td class="paramtype"><a class="el" href="classarmnn_1_1_permutation_vector.html#a12b132c42f8e60ebc9669a3b333bb946">SizeType</a>&#160;</td>
222 <td class="paramname"><em>numDimMappings</em>&#160;</td>
223 </tr>
224 <tr>
225 <td></td>
226 <td>)</td>
227 <td></td><td></td>
228 </tr>
229 </table>
230</div><div class="memdoc">
231<dl class="params"><dt>Parameters</dt><dd>
232 <table class="params">
233 <tr><td class="paramname">dimMappings</td><td>- Indicates how to translate tensor elements from a given source into the target destination, when source and target potentially have different memory layouts.</td></tr>
234 </table>
235 </dd>
236</dl>
237<p>E.g. For a 4-d tensor laid out in a memory with the format (Batch Element, Height, Width, Channels), which is to be passed as an input to ArmNN, each source dimension is mapped to the corresponding ArmNN dimension. The Batch dimension remains the same (0 -&gt; 0). The source Height dimension is mapped to the location of the ArmNN Height dimension (1 -&gt; 2). Similar arguments are made for the Width and Channels (2 -&gt; 3 and 3 -&gt; 1). This will lead to m_DimMappings pointing to the following array: [ 0, 2, 3, 1 ].</p>
238<p>Note that the mapping should be reversed if considering the case of ArmNN 4-d outputs (Batch Element, Channels, Height, Width) being written to a destination with the format mentioned above. We now have 0 -&gt; 0, 2 -&gt; 1, 3 -&gt; 2, 1 -&gt; 3, which, when reordered, lead to the following m_DimMappings contents: [ 0, 3, 1, 2 ]. </p>
239
240<p class="definition">Definition at line <a class="el" href="_descriptors_8cpp_source.html#l00020">20</a> of file <a class="el" href="_descriptors_8cpp_source.html">Descriptors.cpp</a>.</p>
241<div class="fragment"><div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160;{</div>
242<div class="line"><a name="l00022"></a><span class="lineno"> 22</span>&#160; <span class="comment">// Validation</span></div>
243<div class="line"><a name="l00023"></a><span class="lineno"> 23</span>&#160; </div>
244<div class="line"><a name="l00024"></a><span class="lineno"> 24</span>&#160; <span class="keywordflow">if</span> (numDimMappings &gt; <a class="code" href="namespacearmnn.html#abdcd184ed3bd648bb31d385040cafd5d">MaxNumOfTensorDimensions</a>)</div>
245<div class="line"><a name="l00025"></a><span class="lineno"> 25</span>&#160; {</div>
246<div class="line"><a name="l00026"></a><span class="lineno"> 26</span>&#160; <span class="keywordflow">throw</span> InvalidArgumentException(</div>
247<div class="line"><a name="l00027"></a><span class="lineno"> 27</span>&#160; fmt::format(<span class="stringliteral">&quot;The number of mappings ({0}) cannot be greater &quot;</span></div>
248<div class="line"><a name="l00028"></a><span class="lineno"> 28</span>&#160; <span class="stringliteral">&quot;than the maximum number of dimensions supported ({1})&quot;</span>,</div>
249<div class="line"><a name="l00029"></a><span class="lineno"> 29</span>&#160; numDimMappings,</div>
250<div class="line"><a name="l00030"></a><span class="lineno"> 30</span>&#160; <a class="code" href="namespacearmnn.html#abdcd184ed3bd648bb31d385040cafd5d">MaxNumOfTensorDimensions</a>));</div>
251<div class="line"><a name="l00031"></a><span class="lineno"> 31</span>&#160; }</div>
252<div class="line"><a name="l00032"></a><span class="lineno"> 32</span>&#160; </div>
253<div class="line"><a name="l00033"></a><span class="lineno"> 33</span>&#160; <span class="keywordflow">if</span> ((dimMappings == <span class="keyword">nullptr</span>) &amp;&amp; (numDimMappings != 0))</div>
254<div class="line"><a name="l00034"></a><span class="lineno"> 34</span>&#160; {</div>
255<div class="line"><a name="l00035"></a><span class="lineno"> 35</span>&#160; <span class="keywordflow">throw</span> InvalidArgumentException(<span class="stringliteral">&quot;Dimension mappings must not be NULL if the number of mappings is positive&quot;</span>);</div>
256<div class="line"><a name="l00036"></a><span class="lineno"> 36</span>&#160; }</div>
257<div class="line"><a name="l00037"></a><span class="lineno"> 37</span>&#160; </div>
258<div class="line"><a name="l00038"></a><span class="lineno"> 38</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classarmnn_1_1_permutation_vector.html#a12b132c42f8e60ebc9669a3b333bb946">SizeType</a> i = 0; i &lt; numDimMappings; ++i)</div>
259<div class="line"><a name="l00039"></a><span class="lineno"> 39</span>&#160; {</div>
260<div class="line"><a name="l00040"></a><span class="lineno"> 40</span>&#160; <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_permutation_vector.html#a9e70f27e3e424e90566080423b1fe2db">ValueType</a> dstIndex = dimMappings[i];</div>
261<div class="line"><a name="l00041"></a><span class="lineno"> 41</span>&#160; <span class="keywordflow">if</span> (dstIndex &gt;= numDimMappings)</div>
262<div class="line"><a name="l00042"></a><span class="lineno"> 42</span>&#160; {</div>
263<div class="line"><a name="l00043"></a><span class="lineno"> 43</span>&#160; <span class="keywordflow">throw</span> InvalidArgumentException(</div>
264<div class="line"><a name="l00044"></a><span class="lineno"> 44</span>&#160; fmt::format(<span class="stringliteral">&quot;Dimension mapping at index {0} is invalid: &quot;</span></div>
265<div class="line"><a name="l00045"></a><span class="lineno"> 45</span>&#160; <span class="stringliteral">&quot;{1} is outside of the valid range [0,{2}]&quot;</span>,</div>
266<div class="line"><a name="l00046"></a><span class="lineno"> 46</span>&#160; i,</div>
267<div class="line"><a name="l00047"></a><span class="lineno"> 47</span>&#160; dstIndex,</div>
268<div class="line"><a name="l00048"></a><span class="lineno"> 48</span>&#160; (numDimMappings - 1)));</div>
269<div class="line"><a name="l00049"></a><span class="lineno"> 49</span>&#160; }</div>
270<div class="line"><a name="l00050"></a><span class="lineno"> 50</span>&#160; }</div>
271<div class="line"><a name="l00051"></a><span class="lineno"> 51</span>&#160; </div>
272<div class="line"><a name="l00052"></a><span class="lineno"> 52</span>&#160; <span class="comment">// Validation: Detect duplicates</span></div>
273<div class="line"><a name="l00053"></a><span class="lineno"> 53</span>&#160; {</div>
274<div class="line"><a name="l00054"></a><span class="lineno"> 54</span>&#160; std::array&lt;bool, MaxNumOfTensorDimensions&gt; observedDims;</div>
275<div class="line"><a name="l00055"></a><span class="lineno"> 55</span>&#160; observedDims.fill(<span class="keyword">false</span>);</div>
276<div class="line"><a name="l00056"></a><span class="lineno"> 56</span>&#160; </div>
277<div class="line"><a name="l00057"></a><span class="lineno"> 57</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classarmnn_1_1_permutation_vector.html#a12b132c42f8e60ebc9669a3b333bb946">SizeType</a> i = 0; i &lt; numDimMappings; ++i)</div>
278<div class="line"><a name="l00058"></a><span class="lineno"> 58</span>&#160; {</div>
279<div class="line"><a name="l00059"></a><span class="lineno"> 59</span>&#160; <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_permutation_vector.html#a9e70f27e3e424e90566080423b1fe2db">ValueType</a> dstIndex = dimMappings[i];</div>
280<div class="line"><a name="l00060"></a><span class="lineno"> 60</span>&#160; <span class="keywordflow">if</span> (observedDims[dstIndex])</div>
281<div class="line"><a name="l00061"></a><span class="lineno"> 61</span>&#160; {</div>
282<div class="line"><a name="l00062"></a><span class="lineno"> 62</span>&#160; <span class="keywordflow">throw</span> InvalidArgumentException(<span class="stringliteral">&quot;Invalid dimension mappings: Two or more source dimensions are mapped &quot;</span></div>
283<div class="line"><a name="l00063"></a><span class="lineno"> 63</span>&#160; <span class="stringliteral">&quot;to the same output dimension&quot;</span>);</div>
284<div class="line"><a name="l00064"></a><span class="lineno"> 64</span>&#160; }</div>
285<div class="line"><a name="l00065"></a><span class="lineno"> 65</span>&#160; observedDims[dstIndex] = <span class="keyword">true</span>;</div>
286<div class="line"><a name="l00066"></a><span class="lineno"> 66</span>&#160; }</div>
287<div class="line"><a name="l00067"></a><span class="lineno"> 67</span>&#160; }</div>
288<div class="line"><a name="l00068"></a><span class="lineno"> 68</span>&#160; </div>
289<div class="line"><a name="l00069"></a><span class="lineno"> 69</span>&#160; <span class="comment">// Initialize</span></div>
290<div class="line"><a name="l00070"></a><span class="lineno"> 70</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classarmnn_1_1_permutation_vector.html#a12b132c42f8e60ebc9669a3b333bb946">SizeType</a> i = 0; i &lt; numDimMappings; ++i)</div>
291<div class="line"><a name="l00071"></a><span class="lineno"> 71</span>&#160; {</div>
292<div class="line"><a name="l00072"></a><span class="lineno"> 72</span>&#160; m_DimMappings[i] = dimMappings[i];</div>
293<div class="line"><a name="l00073"></a><span class="lineno"> 73</span>&#160; }</div>
294<div class="line"><a name="l00074"></a><span class="lineno"> 74</span>&#160; m_NumDimMappings = numDimMappings;</div>
295<div class="line"><a name="l00075"></a><span class="lineno"> 75</span>&#160;}</div>
296</div><!-- fragment -->
297<p class="reference">References <a class="el" href="_types_8hpp_source.html#l00031">armnn::MaxNumOfTensorDimensions</a>.</p>
298
299</div>
300</div>
301<a id="adb9aad0dc5def92d5749a0efad1ead58"></a>
302<h2 class="memtitle"><span class="permalink"><a href="#adb9aad0dc5def92d5749a0efad1ead58">&#9670;&nbsp;</a></span>PermutationVector() <span class="overload">[2/2]</span></h2>
303
304<div class="memitem">
305<div class="memproto">
306 <table class="memname">
307 <tr>
308 <td class="memname"><a class="el" href="classarmnn_1_1_permutation_vector.html">PermutationVector</a> </td>
309 <td>(</td>
310 <td class="paramtype">std::initializer_list&lt; <a class="el" href="classarmnn_1_1_permutation_vector.html#a9e70f27e3e424e90566080423b1fe2db">ValueType</a> &gt;&#160;</td>
311 <td class="paramname"><em>dimMappings</em></td><td>)</td>
312 <td></td>
313 </tr>
314 </table>
315</div><div class="memdoc">
316
317<p class="definition">Definition at line <a class="el" href="_descriptors_8cpp_source.html#l00077">77</a> of file <a class="el" href="_descriptors_8cpp_source.html">Descriptors.cpp</a>.</p>
318<div class="fragment"><div class="line"><a name="l00078"></a><span class="lineno"> 78</span>&#160; : <a class="code" href="classarmnn_1_1_permutation_vector.html#a399359e369b182e7c86840d7b6a38c41">PermutationVector</a>(dimMappings.begin(), armnn::numeric_cast&lt;SizeType&gt;(dimMappings.size()))</div>
319<div class="line"><a name="l00079"></a><span class="lineno"> 79</span>&#160;{</div>
320<div class="line"><a name="l00080"></a><span class="lineno"> 80</span>&#160;}</div>
321</div><!-- fragment -->
322</div>
323</div>
324<h2 class="groupheader">Member Function Documentation</h2>
325<a id="ad5fee900c7aee90671038c79225bf8ec"></a>
326<h2 class="memtitle"><span class="permalink"><a href="#ad5fee900c7aee90671038c79225bf8ec">&#9670;&nbsp;</a></span>begin()</h2>
327
328<div class="memitem">
329<div class="memproto">
330<table class="mlabels">
331 <tr>
332 <td class="mlabels-left">
333 <table class="memname">
334 <tr>
335 <td class="memname"><a class="el" href="classarmnn_1_1_permutation_vector.html#a065e980f27e65a118d3b071ab077cfda">ConstIterator</a> begin </td>
336 <td>(</td>
337 <td class="paramname"></td><td>)</td>
338 <td> const</td>
339 </tr>
340 </table>
341 </td>
342 <td class="mlabels-right">
343<span class="mlabels"><span class="mlabel">inline</span></span> </td>
344 </tr>
345</table>
346</div><div class="memdoc">
347
348<p class="definition">Definition at line <a class="el" href="_types_8hpp_source.html#l00359">359</a> of file <a class="el" href="_types_8hpp_source.html">Types.hpp</a>.</p>
349<div class="fragment"><div class="line"><a name="l00359"></a><span class="lineno"> 359</span>&#160;{ <span class="keywordflow">return</span> m_DimMappings.begin(); }</div>
350</div><!-- fragment -->
351<p class="reference">Referenced by <a class="el" href="_transpose_operator_8cpp_source.html#l00008">ConvertTransposeToTosaOperator()</a>.</p>
352
353</div>
354</div>
355<a id="a69b6e2a03c835ca5d658a1f16acbaa9c"></a>
356<h2 class="memtitle"><span class="permalink"><a href="#a69b6e2a03c835ca5d658a1f16acbaa9c">&#9670;&nbsp;</a></span>end()</h2>
357
358<div class="memitem">
359<div class="memproto">
360<table class="mlabels">
361 <tr>
362 <td class="mlabels-left">
363 <table class="memname">
364 <tr>
365 <td class="memname"><a class="el" href="classarmnn_1_1_permutation_vector.html#a065e980f27e65a118d3b071ab077cfda">ConstIterator</a> end </td>
366 <td>(</td>
367 <td class="paramname"></td><td>)</td>
368 <td> const</td>
369 </tr>
370 </table>
371 </td>
372 <td class="mlabels-right">
373<span class="mlabels"><span class="mlabel">inline</span></span> </td>
374 </tr>
375</table>
376</div><div class="memdoc">
377<dl class="section return"><dt>Returns</dt><dd>pointer one past the end of the number of mapping not the length of m_DimMappings. </dd></dl>
378
379<p class="definition">Definition at line <a class="el" href="_types_8hpp_source.html#l00364">364</a> of file <a class="el" href="_types_8hpp_source.html">Types.hpp</a>.</p>
380<div class="fragment"><div class="line"><a name="l00364"></a><span class="lineno"> 364</span>&#160;{ <span class="keywordflow">return</span> m_DimMappings.begin() + m_NumDimMappings; }</div>
381</div><!-- fragment -->
382<p class="reference">Referenced by <a class="el" href="_transpose_operator_8cpp_source.html#l00008">ConvertTransposeToTosaOperator()</a>.</p>
383
384</div>
385</div>
386<a id="a490ec6b59006d1fe1ec2ea30e69fb97c"></a>
387<h2 class="memtitle"><span class="permalink"><a href="#a490ec6b59006d1fe1ec2ea30e69fb97c">&#9670;&nbsp;</a></span>GetSize()</h2>
388
389<div class="memitem">
390<div class="memproto">
391<table class="mlabels">
392 <tr>
393 <td class="mlabels-left">
394 <table class="memname">
395 <tr>
396 <td class="memname"><a class="el" href="classarmnn_1_1_permutation_vector.html#a12b132c42f8e60ebc9669a3b333bb946">SizeType</a> GetSize </td>
397 <td>(</td>
398 <td class="paramname"></td><td>)</td>
399 <td> const</td>
400 </tr>
401 </table>
402 </td>
403 <td class="mlabels-right">
404<span class="mlabels"><span class="mlabel">inline</span></span> </td>
405 </tr>
406</table>
407</div><div class="memdoc">
408
409<p class="definition">Definition at line <a class="el" href="_types_8hpp_source.html#l00357">357</a> of file <a class="el" href="_types_8hpp_source.html">Types.hpp</a>.</p>
410<div class="fragment"><div class="line"><a name="l00357"></a><span class="lineno"> 357</span>&#160;{ <span class="keywordflow">return</span> m_NumDimMappings; }</div>
411</div><!-- fragment -->
412<p class="reference">Referenced by <a class="el" href="_conversion_utils_8cpp_source.html#l00086">ConstTensorPin::ConstTensorPin()</a>, <a class="el" href="_onnx_parser_8cpp_source.html#l00604">armnnOnnxParser::CreateConstTensorImpl()</a>, <a class="el" href="_types_8hpp_source.html#l00376">PermutationVector::IsInverse()</a>, <a class="el" href="_types_8hpp_source.html#l00347">PermutationVector::operator[]()</a>, <a class="el" href="_permute_8cpp_source.html#l00125">armnnUtils::Permuted()</a>, <a class="el" href="_workload_utils_8cpp_source.html#l00019">armnn::PermuteTensor()</a>, <a class="el" href="_transpose_8cpp_source.html#l00125">armnnUtils::TransposeTensorShape()</a>, <a class="el" href="_workload_data_8cpp_source.html#l01494">PermuteQueueDescriptor::Validate()</a>, and <a class="el" href="_workload_data_8cpp_source.html#l03106">TransposeQueueDescriptor::Validate()</a>.</p>
413
414</div>
415</div>
416<a id="aae44e4154aa80fba7616747450ff69d5"></a>
417<h2 class="memtitle"><span class="permalink"><a href="#aae44e4154aa80fba7616747450ff69d5">&#9670;&nbsp;</a></span>IsEqual()</h2>
418
419<div class="memitem">
420<div class="memproto">
421<table class="mlabels">
422 <tr>
423 <td class="mlabels-left">
424 <table class="memname">
425 <tr>
426 <td class="memname">bool IsEqual </td>
427 <td>(</td>
428 <td class="paramtype">const <a class="el" href="classarmnn_1_1_permutation_vector.html">PermutationVector</a> &amp;&#160;</td>
429 <td class="paramname"><em>other</em></td><td>)</td>
430 <td> const</td>
431 </tr>
432 </table>
433 </td>
434 <td class="mlabels-right">
435<span class="mlabels"><span class="mlabel">inline</span></span> </td>
436 </tr>
437</table>
438</div><div class="memdoc">
439
440<p class="definition">Definition at line <a class="el" href="_types_8hpp_source.html#l00366">366</a> of file <a class="el" href="_types_8hpp_source.html">Types.hpp</a>.</p>
441<div class="fragment"><div class="line"><a name="l00367"></a><span class="lineno"> 367</span>&#160; {</div>
442<div class="line"><a name="l00368"></a><span class="lineno"> 368</span>&#160; <span class="keywordflow">if</span> (m_NumDimMappings != other.m_NumDimMappings) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
443<div class="line"><a name="l00369"></a><span class="lineno"> 369</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i = 0; i &lt; m_NumDimMappings; ++i)</div>
444<div class="line"><a name="l00370"></a><span class="lineno"> 370</span>&#160; {</div>
445<div class="line"><a name="l00371"></a><span class="lineno"> 371</span>&#160; <span class="keywordflow">if</span> (m_DimMappings[i] != other.m_DimMappings[i]) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
446<div class="line"><a name="l00372"></a><span class="lineno"> 372</span>&#160; }</div>
447<div class="line"><a name="l00373"></a><span class="lineno"> 373</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
448<div class="line"><a name="l00374"></a><span class="lineno"> 374</span>&#160; }</div>
449</div><!-- fragment -->
450<p class="reference">Referenced by <a class="el" href="_transpose_layer_8hpp_source.html#l00054">TransposeLayer::IsEqual()</a>, <a class="el" href="_permute_layer_8hpp_source.html#l00055">PermuteLayer::IsEqual()</a>, <a class="el" href="_descriptors_8hpp_source.html#l00159">PermuteDescriptor::operator==()</a>, and <a class="el" href="_descriptors_8hpp_source.html#l01500">TransposeDescriptor::operator==()</a>.</p>
451
452</div>
453</div>
454<a id="abca528420d32f4edad0b1425ad90f80e"></a>
455<h2 class="memtitle"><span class="permalink"><a href="#abca528420d32f4edad0b1425ad90f80e">&#9670;&nbsp;</a></span>IsInverse()</h2>
456
457<div class="memitem">
458<div class="memproto">
459<table class="mlabels">
460 <tr>
461 <td class="mlabels-left">
462 <table class="memname">
463 <tr>
464 <td class="memname">bool IsInverse </td>
465 <td>(</td>
466 <td class="paramtype">const <a class="el" href="classarmnn_1_1_permutation_vector.html">PermutationVector</a> &amp;&#160;</td>
467 <td class="paramname"><em>other</em></td><td>)</td>
468 <td> const</td>
469 </tr>
470 </table>
471 </td>
472 <td class="mlabels-right">
473<span class="mlabels"><span class="mlabel">inline</span></span> </td>
474 </tr>
475</table>
476</div><div class="memdoc">
477
478<p class="definition">Definition at line <a class="el" href="_types_8hpp_source.html#l00376">376</a> of file <a class="el" href="_types_8hpp_source.html">Types.hpp</a>.</p>
479<div class="fragment"><div class="line"><a name="l00377"></a><span class="lineno"> 377</span>&#160; {</div>
480<div class="line"><a name="l00378"></a><span class="lineno"> 378</span>&#160; <span class="keywordtype">bool</span> isInverse = (<a class="code" href="classarmnn_1_1_permutation_vector.html#a490ec6b59006d1fe1ec2ea30e69fb97c">GetSize</a>() == other.GetSize());</div>
481<div class="line"><a name="l00379"></a><span class="lineno"> 379</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classarmnn_1_1_permutation_vector.html#a12b132c42f8e60ebc9669a3b333bb946">SizeType</a> i = 0; isInverse &amp;&amp; (i &lt; <a class="code" href="classarmnn_1_1_permutation_vector.html#a490ec6b59006d1fe1ec2ea30e69fb97c">GetSize</a>()); ++i)</div>
482<div class="line"><a name="l00380"></a><span class="lineno"> 380</span>&#160; {</div>
483<div class="line"><a name="l00381"></a><span class="lineno"> 381</span>&#160; isInverse = (m_DimMappings[other.m_DimMappings[i]] == i);</div>
484<div class="line"><a name="l00382"></a><span class="lineno"> 382</span>&#160; }</div>
485<div class="line"><a name="l00383"></a><span class="lineno"> 383</span>&#160; <span class="keywordflow">return</span> isInverse;</div>
486<div class="line"><a name="l00384"></a><span class="lineno"> 384</span>&#160; }</div>
487</div><!-- fragment -->
488<p class="reference">References <a class="el" href="_types_8hpp_source.html#l00357">PermutationVector::GetSize()</a>.</p>
489
490<p class="reference">Referenced by <a class="el" href="_transpose_layer_8hpp_source.html#l00045">TransposeLayer::IsInverse()</a>, and <a class="el" href="_permute_layer_8hpp_source.html#l00046">PermuteLayer::IsInverse()</a>.</p>
491
492</div>
493</div>
494<a id="a86e55f7d14b21da3b31280412be96bd7"></a>
495<h2 class="memtitle"><span class="permalink"><a href="#a86e55f7d14b21da3b31280412be96bd7">&#9670;&nbsp;</a></span>operator[]()</h2>
496
497<div class="memitem">
498<div class="memproto">
499<table class="mlabels">
500 <tr>
501 <td class="mlabels-left">
502 <table class="memname">
503 <tr>
504 <td class="memname"><a class="el" href="classarmnn_1_1_permutation_vector.html#a9e70f27e3e424e90566080423b1fe2db">ValueType</a> operator[] </td>
505 <td>(</td>
506 <td class="paramtype"><a class="el" href="classarmnn_1_1_permutation_vector.html#a12b132c42f8e60ebc9669a3b333bb946">SizeType</a>&#160;</td>
507 <td class="paramname"><em>i</em></td><td>)</td>
508 <td> const</td>
509 </tr>
510 </table>
511 </td>
512 <td class="mlabels-right">
513<span class="mlabels"><span class="mlabel">inline</span></span> </td>
514 </tr>
515</table>
516</div><div class="memdoc">
517
518<p>Indexing method with out-of-bounds error checking for the m_DimMappings array. </p>
519<dl class="params"><dt>Parameters</dt><dd>
520 <table class="params">
521 <tr><td class="paramname">i</td><td>- integer value corresponding to index of m_DimMappings array to retrieve element from. </td></tr>
522 </table>
523 </dd>
524</dl>
525<dl class="section return"><dt>Returns</dt><dd>element at index i of m_DimMappings array. </dd></dl>
526<dl class="exception"><dt>Exceptions</dt><dd>
527 <table class="exception">
528 <tr><td class="paramname"><a class="el" href="classarmnn_1_1_invalid_argument_exception.html">InvalidArgumentException</a></td><td>when indexing out-of-bounds index of m_DimMappings array. </td></tr>
529 </table>
530 </dd>
531</dl>
532
533<p class="definition">Definition at line <a class="el" href="_types_8hpp_source.html#l00347">347</a> of file <a class="el" href="_types_8hpp_source.html">Types.hpp</a>.</p>
534<div class="fragment"><div class="line"><a name="l00348"></a><span class="lineno"> 348</span>&#160; {</div>
535<div class="line"><a name="l00349"></a><span class="lineno"> 349</span>&#160; <span class="keywordflow">if</span> (i &gt;= <a class="code" href="classarmnn_1_1_permutation_vector.html#a490ec6b59006d1fe1ec2ea30e69fb97c">GetSize</a>())</div>
536<div class="line"><a name="l00350"></a><span class="lineno"> 350</span>&#160; {</div>
537<div class="line"><a name="l00351"></a><span class="lineno"> 351</span>&#160; <span class="keywordflow">throw</span> InvalidArgumentException(<span class="stringliteral">&quot;Invalid indexing of PermutationVector of size &quot;</span> + std::to_string(<a class="code" href="classarmnn_1_1_permutation_vector.html#a490ec6b59006d1fe1ec2ea30e69fb97c">GetSize</a>())</div>
538<div class="line"><a name="l00352"></a><span class="lineno"> 352</span>&#160; + <span class="stringliteral">&quot; at location [&quot;</span> + std::to_string(i) + <span class="stringliteral">&quot;].&quot;</span>);</div>
539<div class="line"><a name="l00353"></a><span class="lineno"> 353</span>&#160; }</div>
540<div class="line"><a name="l00354"></a><span class="lineno"> 354</span>&#160; <span class="keywordflow">return</span> m_DimMappings.at(i);</div>
541<div class="line"><a name="l00355"></a><span class="lineno"> 355</span>&#160; }</div>
542</div><!-- fragment -->
543<p class="reference">References <a class="el" href="_types_8hpp_source.html#l00357">PermutationVector::GetSize()</a>.</p>
544
545</div>
546</div>
547<hr/>The documentation for this class was generated from the following files:<ul>
548<li>include/armnn/<a class="el" href="_types_8hpp_source.html">Types.hpp</a></li>
549<li>src/armnn/<a class="el" href="_descriptors_8cpp_source.html">Descriptors.cpp</a></li>
550</ul>
551</div><!-- contents -->
552</div><!-- doc-content -->
553<div class="ttc" id="anamespacearmnn_html_abdcd184ed3bd648bb31d385040cafd5d"><div class="ttname"><a href="namespacearmnn.html#abdcd184ed3bd648bb31d385040cafd5d">armnn::MaxNumOfTensorDimensions</a></div><div class="ttdeci">constexpr unsigned int MaxNumOfTensorDimensions</div><div class="ttdef"><b>Definition:</b> <a href="_types_8hpp_source.html#l00031">Types.hpp:31</a></div></div>
554<div class="ttc" id="aclassarmnn_1_1_permutation_vector_html_a490ec6b59006d1fe1ec2ea30e69fb97c"><div class="ttname"><a href="classarmnn_1_1_permutation_vector.html#a490ec6b59006d1fe1ec2ea30e69fb97c">armnn::PermutationVector::GetSize</a></div><div class="ttdeci">SizeType GetSize() const</div><div class="ttdef"><b>Definition:</b> <a href="_types_8hpp_source.html#l00357">Types.hpp:357</a></div></div>
555<div class="ttc" id="aclassarmnn_1_1_permutation_vector_html_a9e70f27e3e424e90566080423b1fe2db"><div class="ttname"><a href="classarmnn_1_1_permutation_vector.html#a9e70f27e3e424e90566080423b1fe2db">armnn::PermutationVector::ValueType</a></div><div class="ttdeci">unsigned int ValueType</div><div class="ttdef"><b>Definition:</b> <a href="_types_8hpp_source.html#l00317">Types.hpp:317</a></div></div>
556<div class="ttc" id="aclassarmnn_1_1_permutation_vector_html_a399359e369b182e7c86840d7b6a38c41"><div class="ttname"><a href="classarmnn_1_1_permutation_vector.html#a399359e369b182e7c86840d7b6a38c41">armnn::PermutationVector::PermutationVector</a></div><div class="ttdeci">PermutationVector(const ValueType *dimMappings, SizeType numDimMappings)</div><div class="ttdef"><b>Definition:</b> <a href="_descriptors_8cpp_source.html#l00020">Descriptors.cpp:20</a></div></div>
557<div class="ttc" id="aclassarmnn_1_1_permutation_vector_html_a12b132c42f8e60ebc9669a3b333bb946"><div class="ttname"><a href="classarmnn_1_1_permutation_vector.html#a12b132c42f8e60ebc9669a3b333bb946">armnn::PermutationVector::SizeType</a></div><div class="ttdeci">unsigned int SizeType</div><div class="ttdef"><b>Definition:</b> <a href="_types_8hpp_source.html#l00318">Types.hpp:318</a></div></div>
558<!-- start footer part -->
559<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
560 <ul>
561 <li class="navelem"><a class="el" href="namespacearmnn.html">armnn</a></li><li class="navelem"><a class="el" href="classarmnn_1_1_permutation_vector.html">PermutationVector</a></li>
562 <li class="footer">Generated on Thu May 16 2024 09:31:58 for Arm NN by
563 <a href="http://www.doxygen.org/index.html">
564 <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.17 </li>
565 </ul>
566</div>
567</body>
568</html>