blob: 68566e39ab5192687362c7e74606107d8b34ffcc [file] [log] [blame]
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://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.17"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>mxnet: /work/mxnet/3rdparty/tvm/nnvm/include/nnvm/op.h 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="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">mxnet
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.17 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
var searchBox = new SearchBox("searchBox", "search",false,'Search');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
/* @license-end */</script>
<div id="main-nav"></div>
<!-- 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 id="nav-path" class="navpath">
<ul>
<li class="navelem"><a class="el" href="dir_8cab8f464681f7cc51cee77e79a434cd.html">3rdparty</a></li><li class="navelem"><a class="el" href="dir_d40daf7ef9783ad6669561b9a39523a5.html">tvm</a></li><li class="navelem"><a class="el" href="dir_59ab2d7405f48271a817356d16f4868c.html">nnvm</a></li><li class="navelem"><a class="el" href="dir_564b1b3930cee8f0cd6786ede046ff35.html">include</a></li><li class="navelem"><a class="el" href="dir_aadb892b7c99db7e2c3fc68a6c967545.html">nnvm</a></li> </ul>
</div>
</div><!-- top -->
<div class="header">
<div class="headertitle">
<div class="title">op.h</div> </div>
</div><!--header-->
<div class="contents">
<a href="op_8h.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"> * Licensed to the Apache Software Foundation (ASF) under one</span></div>
<div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160;<span class="comment"> * or more contributor license agreements. See the NOTICE file</span></div>
<div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160;<span class="comment"> * distributed with this work for additional information</span></div>
<div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160;<span class="comment"> * regarding copyright ownership. The ASF licenses this file</span></div>
<div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160;<span class="comment"> * to you under the Apache License, Version 2.0 (the</span></div>
<div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160;<span class="comment"> * &quot;License&quot;); you may not use this file except in compliance</span></div>
<div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160;<span class="comment"> * with the License. You may obtain a copy of the License at</span></div>
<div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160;<span class="comment"> * http://www.apache.org/licenses/LICENSE-2.0</span></div>
<div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160;<span class="comment"> * Unless required by applicable law or agreed to in writing,</span></div>
<div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160;<span class="comment"> * software distributed under the License is distributed on an</span></div>
<div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160;<span class="comment"> * &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY</span></div>
<div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160;<span class="comment"> * KIND, either express or implied. See the License for the</span></div>
<div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160;<span class="comment"> * specific language governing permissions and limitations</span></div>
<div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160;<span class="comment"> * under the License.</span></div>
<div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160; </div>
<div class="line"><a name="l00024"></a><span class="lineno"> 24</span>&#160;<span class="preprocessor">#ifndef NNVM_OP_H_</span></div>
<div class="line"><a name="l00025"></a><span class="lineno"> 25</span>&#160;<span class="preprocessor">#define NNVM_OP_H_</span></div>
<div class="line"><a name="l00026"></a><span class="lineno"> 26</span>&#160; </div>
<div class="line"><a name="l00027"></a><span class="lineno"> 27</span>&#160;<span class="preprocessor">#include &lt;<a class="code" href="parameter_8h.html">dmlc/parameter.h</a>&gt;</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;<span class="preprocessor">#include &lt;functional&gt;</span></div>
<div class="line"><a name="l00030"></a><span class="lineno"> 30</span>&#160;<span class="preprocessor">#include &lt;limits&gt;</span></div>
<div class="line"><a name="l00031"></a><span class="lineno"> 31</span>&#160;<span class="preprocessor">#include &lt;string&gt;</span></div>
<div class="line"><a name="l00032"></a><span class="lineno"> 32</span>&#160;<span class="preprocessor">#include &lt;typeinfo&gt;</span></div>
<div class="line"><a name="l00033"></a><span class="lineno"> 33</span>&#160;<span class="preprocessor">#include &lt;utility&gt;</span></div>
<div class="line"><a name="l00034"></a><span class="lineno"> 34</span>&#160;<span class="preprocessor">#include &lt;vector&gt;</span></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;<span class="preprocessor">#include &quot;<a class="code" href="3rdparty_2tvm_2nnvm_2include_2nnvm_2base_8h.html">base.h</a>&quot;</span></div>
<div class="line"><a name="l00037"></a><span class="lineno"> 37</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="3rdparty_2tvm_2nnvm_2include_2nnvm_2c__api_8h.html">c_api.h</a>&quot;</span></div>
<div class="line"><a name="l00038"></a><span class="lineno"> 38</span>&#160; </div>
<div class="line"><a name="l00039"></a><span class="lineno"> 39</span>&#160;<span class="keyword">namespace </span><a class="code" href="namespacennvm.html">nnvm</a> {</div>
<div class="line"><a name="l00040"></a><span class="lineno"> 40</span>&#160; </div>
<div class="line"><a name="l00041"></a><span class="lineno"> 41</span>&#160;<span class="comment">// forward declarations</span></div>
<div class="line"><a name="l00042"></a><span class="lineno"> 42</span>&#160;<span class="keyword">class </span>Node;</div>
<div class="line"><a name="l00043"></a><span class="lineno"> 43</span>&#160;<span class="keyword">struct </span>NodeAttrs;</div>
<div class="line"><a name="l00044"></a><span class="lineno"> 44</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">typename</span> ValueType&gt;</div>
<div class="line"><a name="l00045"></a><span class="lineno"><a class="line" href="classnnvm_1_1OpMap.html"> 45</a></span>&#160;<span class="keyword">class </span><a class="code" href="classnnvm_1_1OpMap.html">OpMap</a>;</div>
<div class="line"><a name="l00046"></a><span class="lineno"> 46</span>&#160;<span class="keyword">class </span><a class="code" href="classnnvm_1_1OpGroup.html">OpGroup</a>;</div>
<div class="line"><a name="l00047"></a><span class="lineno"> 47</span>&#160;<span class="keyword">class </span>OpRegistryEntry;</div>
<div class="line"><a name="l00048"></a><span class="lineno"> 48</span>&#160;<span class="keyword">using</span> dmlc::ParamFieldInfo;</div>
<div class="line"><a name="l00049"></a><span class="lineno"> 49</span>&#160; </div>
<div class="line"><a name="l00051"></a><span class="lineno"> 51</span>&#160;<span class="keyword">static</span> <span class="keyword">const</span> uint32_t kVarg = std::numeric_limits&lt;uint32_t&gt;::max();</div>
<div class="line"><a name="l00052"></a><span class="lineno"> 52</span>&#160; </div>
<div class="line"><a name="l00105"></a><span class="lineno"><a class="line" href="classnnvm_1_1Op.html"> 105</a></span>&#160;<span class="keyword">class </span><a class="code" href="3rdparty_2tvm_2nnvm_2include_2nnvm_2c__api_8h.html#a528178e3caf0ffc542b9f12a50c1c7b0">NNVM_DLL</a> <a class="code" href="classnnvm_1_1Op.html">Op</a> {</div>
<div class="line"><a name="l00106"></a><span class="lineno"> 106</span>&#160; <span class="keyword">public</span>:</div>
<div class="line"><a name="l00108"></a><span class="lineno"><a class="line" href="classnnvm_1_1Op.html#af67a5d6998765023aeed6761df292b6c"> 108</a></span>&#160; std::string <a class="code" href="classnnvm_1_1Op.html#af67a5d6998765023aeed6761df292b6c">name</a>;</div>
<div class="line"><a name="l00113"></a><span class="lineno"><a class="line" href="classnnvm_1_1Op.html#a9552f756aa56608379096b6ca727ccf5"> 113</a></span>&#160; std::string <a class="code" href="classnnvm_1_1Op.html#a9552f756aa56608379096b6ca727ccf5">description</a>;</div>
<div class="line"><a name="l00114"></a><span class="lineno"> 114</span>&#160; <span class="comment">/* \brief description of inputs and keyword arguments*/</span></div>
<div class="line"><a name="l00115"></a><span class="lineno"><a class="line" href="classnnvm_1_1Op.html#a8d63a704ebbd55974b66e6efd75b3722"> 115</a></span>&#160; std::vector&lt;ParamFieldInfo&gt; <a class="code" href="classnnvm_1_1Op.html#a8d63a704ebbd55974b66e6efd75b3722">arguments</a>;</div>
<div class="line"><a name="l00123"></a><span class="lineno"><a class="line" href="classnnvm_1_1Op.html#a040c73b911bfb98b3ea9ebc71deed112"> 123</a></span>&#160; uint32_t num_inputs = 1;</div>
<div class="line"><a name="l00131"></a><span class="lineno"><a class="line" href="classnnvm_1_1Op.html#a69435cb4f8b3187a98e938a66d31a610"> 131</a></span>&#160; uint32_t num_outputs = 1;</div>
<div class="line"><a name="l00137"></a><span class="lineno"><a class="line" href="classnnvm_1_1Op.html#af9ca45839dffc509576b193683dcfc1c"> 137</a></span>&#160; uint32_t support_level = 10;</div>
<div class="line"><a name="l00143"></a><span class="lineno"><a class="line" href="classnnvm_1_1Op.html#a676849f49f99c9a299d5c50cf00f3b5b"> 143</a></span>&#160; std::function&lt;uint32_t(<span class="keyword">const</span> <a class="code" href="structnnvm_1_1NodeAttrs.html">NodeAttrs</a>&amp; attrs)&gt; get_num_outputs = <span class="keyword">nullptr</span>;</div>
<div class="line"><a name="l00149"></a><span class="lineno"><a class="line" href="classnnvm_1_1Op.html#aaed55d545403aca8cd4fff730c40e4bd"> 149</a></span>&#160; std::function&lt;uint32_t(<span class="keyword">const</span> <a class="code" href="structnnvm_1_1NodeAttrs.html">NodeAttrs</a>&amp; attrs)&gt; get_num_inputs = <span class="keyword">nullptr</span>;</div>
<div class="line"><a name="l00182"></a><span class="lineno"><a class="line" href="classnnvm_1_1Op.html#a7781df54dc846bee7d847638e675b959"> 182</a></span>&#160; std::function&lt;void(<a class="code" href="structnnvm_1_1NodeAttrs.html">NodeAttrs</a>* attrs)&gt; attr_parser = <span class="keyword">nullptr</span>;</div>
<div class="line"><a name="l00183"></a><span class="lineno"> 183</span>&#160; <span class="comment">// function fields.</span></div>
<div class="line"><a name="l00190"></a><span class="lineno"> 190</span>&#160;<span class="comment"></span> <span class="keyword">inline</span> <a class="code" href="classnnvm_1_1Op.html">Op</a>&amp; describe(<span class="keyword">const</span> std::string&amp; descr); <span class="comment">// NOLINT(*)</span></div>
<div class="line"><a name="l00198"></a><span class="lineno"> 198</span>&#160;<span class="comment"></span> <span class="keyword">inline</span> <a class="code" href="classnnvm_1_1Op.html">Op</a>&amp; add_argument(<span class="keyword">const</span> std::string&amp; name, <span class="keyword">const</span> std::string&amp; type,</div>
<div class="line"><a name="l00199"></a><span class="lineno"> 199</span>&#160; <span class="keyword">const</span> std::string&amp; description);</div>
<div class="line"><a name="l00205"></a><span class="lineno"> 205</span>&#160; <span class="keyword">inline</span> <a class="code" href="classnnvm_1_1Op.html">Op</a>&amp; add_arguments(<span class="keyword">const</span> std::vector&lt;ParamFieldInfo&gt;&amp; args);</div>
<div class="line"><a name="l00211"></a><span class="lineno"> 211</span>&#160; <span class="keyword">inline</span> <a class="code" href="classnnvm_1_1Op.html">Op</a>&amp; set_num_inputs(uint32_t n); <span class="comment">// NOLINT(*)</span></div>
<div class="line"><a name="l00217"></a><span class="lineno"> 217</span>&#160;<span class="comment"></span> <span class="keyword">inline</span> <a class="code" href="classnnvm_1_1Op.html">Op</a>&amp; set_support_level(uint32_t level); <span class="comment">// NOLINT(*)</span></div>
<div class="line"><a name="l00223"></a><span class="lineno"> 223</span>&#160;<span class="comment"></span> <span class="keyword">inline</span> <a class="code" href="classnnvm_1_1Op.html">Op</a>&amp; set_num_inputs(std::function&lt;uint32_t(<span class="keyword">const</span> <a class="code" href="structnnvm_1_1NodeAttrs.html">NodeAttrs</a>&amp; attr)&gt; fn); <span class="comment">// NOLINT(*)</span></div>
<div class="line"><a name="l00229"></a><span class="lineno"> 229</span>&#160;<span class="comment"></span> <span class="keyword">inline</span> <a class="code" href="classnnvm_1_1Op.html">Op</a>&amp; set_num_outputs(uint32_t n); <span class="comment">// NOLINT(*)</span></div>
<div class="line"><a name="l00235"></a><span class="lineno"> 235</span>&#160;<span class="comment"></span> <span class="keyword">inline</span> <a class="code" href="classnnvm_1_1Op.html">Op</a>&amp; set_num_outputs(std::function&lt;uint32_t(<span class="keyword">const</span> <a class="code" href="structnnvm_1_1NodeAttrs.html">NodeAttrs</a>&amp; attr)&gt; fn); <span class="comment">// NOLINT(*)</span></div>
<div class="line"><a name="l00241"></a><span class="lineno"> 241</span>&#160;<span class="comment"></span> <span class="keyword">inline</span> <a class="code" href="classnnvm_1_1Op.html">Op</a>&amp; set_attr_parser(std::function&lt;<span class="keywordtype">void</span>(<a class="code" href="structnnvm_1_1NodeAttrs.html">NodeAttrs</a>* attrs)&gt; fn); <span class="comment">// NOLINT(*)</span></div>
<div class="line"><a name="l00255"></a><span class="lineno"> 255</span>&#160;<span class="comment"></span> <span class="keyword">template</span> &lt;<span class="keyword">typename</span> ValueType&gt;</div>
<div class="line"><a name="l00256"></a><span class="lineno"> 256</span>&#160; <span class="keyword">inline</span> <a class="code" href="classnnvm_1_1Op.html">Op</a>&amp; set_attr(<span class="keyword">const</span> std::string&amp; attr_name, <span class="comment">// NOLINT(*)</span></div>
<div class="line"><a name="l00257"></a><span class="lineno"> 257</span>&#160; <span class="keyword">const</span> ValueType&amp; value, <span class="keywordtype">int</span> plevel = 10);</div>
<div class="line"><a name="l00264"></a><span class="lineno"> 264</span>&#160; <a class="code" href="classnnvm_1_1Op.html">Op</a>&amp; add_alias(<span class="keyword">const</span> std::string&amp; alias); <span class="comment">// NOLINT(*)</span></div>
<div class="line"><a name="l00272"></a><span class="lineno"> 272</span>&#160;<span class="comment"></span> <a class="code" href="classnnvm_1_1Op.html">Op</a>&amp; include(<span class="keyword">const</span> std::string&amp; group_name);</div>
<div class="line"><a name="l00279"></a><span class="lineno"> 279</span>&#160; <span class="keyword">static</span> <span class="keyword">const</span> <a class="code" href="classnnvm_1_1Op.html">Op</a>* Get(<span class="keyword">const</span> std::string&amp; op_name);</div>
<div class="line"><a name="l00287"></a><span class="lineno"> 287</span>&#160; <span class="keyword">template</span> &lt;<span class="keyword">typename</span> ValueType&gt;</div>
<div class="line"><a name="l00288"></a><span class="lineno"> 288</span>&#160; <span class="keyword">static</span> <span class="keyword">const</span> <a class="code" href="classnnvm_1_1OpMap.html">OpMap&lt;ValueType&gt;</a>&amp; GetAttr(<span class="keyword">const</span> std::string&amp; attr_name);</div>
<div class="line"><a name="l00289"></a><span class="lineno"> 289</span>&#160; </div>
<div class="line"><a name="l00290"></a><span class="lineno"> 290</span>&#160; <span class="keyword">private</span>:</div>
<div class="line"><a name="l00291"></a><span class="lineno"> 291</span>&#160; <span class="keyword">template</span> &lt;<span class="keyword">typename</span> ValueType&gt;</div>
<div class="line"><a name="l00292"></a><span class="lineno"><a class="line" href="classnnvm_1_1Op.html#afcf7d46a60dd033ce159ceceec21db70"> 292</a></span>&#160; <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="classnnvm_1_1OpMap.html">OpMap</a>;</div>
<div class="line"><a name="l00293"></a><span class="lineno"><a class="line" href="classnnvm_1_1Op.html#aa78b2abaef315001da64cae7a8050e61"> 293</a></span>&#160; <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="classnnvm_1_1OpGroup.html">OpGroup</a>;</div>
<div class="line"><a name="l00294"></a><span class="lineno"><a class="line" href="classnnvm_1_1Op.html#ac27d3a3a32f9258272ec64e446b539eb"> 294</a></span>&#160; <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="classdmlc_1_1Registry.html">dmlc::Registry</a>&lt;<a class="code" href="classnnvm_1_1Op.html">Op</a>&gt;;</div>
<div class="line"><a name="l00295"></a><span class="lineno"> 295</span>&#160; <span class="comment">// Program internal unique index of operator.</span></div>
<div class="line"><a name="l00296"></a><span class="lineno"> 296</span>&#160; <span class="comment">// Used to help index the program.</span></div>
<div class="line"><a name="l00297"></a><span class="lineno"> 297</span>&#160; uint32_t index_{0};</div>
<div class="line"><a name="l00298"></a><span class="lineno"> 298</span>&#160; <span class="comment">// internal constructor</span></div>
<div class="line"><a name="l00299"></a><span class="lineno"> 299</span>&#160; <a class="code" href="namespacemxnet.html#ac2fb286fd7ddfbc7af1456f6c7a7ee52">Op</a>();</div>
<div class="line"><a name="l00300"></a><span class="lineno"> 300</span>&#160; <span class="comment">// get const reference to certain attribute</span></div>
<div class="line"><a name="l00301"></a><span class="lineno"> 301</span>&#160; <span class="keyword">static</span> <span class="keyword">const</span> any* GetAttrMap(<span class="keyword">const</span> std::string&amp; key);</div>
<div class="line"><a name="l00302"></a><span class="lineno"> 302</span>&#160; <span class="comment">// update the attribute OpMap</span></div>
<div class="line"><a name="l00303"></a><span class="lineno"> 303</span>&#160; <span class="keyword">static</span> <span class="keywordtype">void</span> UpdateAttrMap(<span class="keyword">const</span> std::string&amp; key, std::function&lt;<span class="keywordtype">void</span>(any*)&gt; updater);</div>
<div class="line"><a name="l00304"></a><span class="lineno"> 304</span>&#160; <span class="comment">// add a trigger based on tag matching on certain tag attribute</span></div>
<div class="line"><a name="l00305"></a><span class="lineno"> 305</span>&#160; <span class="comment">// This will apply trigger on all the op such that</span></div>
<div class="line"><a name="l00306"></a><span class="lineno"> 306</span>&#160; <span class="comment">// include the corresponding group.</span></div>
<div class="line"><a name="l00307"></a><span class="lineno"> 307</span>&#160; <span class="comment">// The trigger will also be applied to all future registrations</span></div>
<div class="line"><a name="l00308"></a><span class="lineno"> 308</span>&#160; <span class="comment">// that calls include</span></div>
<div class="line"><a name="l00309"></a><span class="lineno"> 309</span>&#160; <span class="keyword">static</span> <span class="keywordtype">void</span> AddGroupTrigger(<span class="keyword">const</span> std::string&amp; group_name, std::function&lt;<span class="keywordtype">void</span>(<a class="code" href="classnnvm_1_1Op.html">Op</a>*)&gt; trigger);</div>
<div class="line"><a name="l00310"></a><span class="lineno"> 310</span>&#160;};</div>
<div class="line"><a name="l00311"></a><span class="lineno"> 311</span>&#160; </div>
<div class="line"><a name="l00317"></a><span class="lineno"> 317</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">typename</span> ValueType&gt;</div>
<div class="line"><a name="l00318"></a><span class="lineno"> 318</span>&#160;<span class="keyword">class </span>OpMap {</div>
<div class="line"><a name="l00319"></a><span class="lineno"> 319</span>&#160; <span class="keyword">public</span>:</div>
<div class="line"><a name="l00325"></a><span class="lineno"> 325</span>&#160; <span class="keyword">inline</span> <span class="keyword">const</span> ValueType&amp; <a class="code" href="classnnvm_1_1OpMap.html#a8d2b7f1f25f7905d6d442297d76f4bee">operator[]</a>(<span class="keyword">const</span> <a class="code" href="classnnvm_1_1OpMap.html#a2c31e8a3c11caeb061d69db14ebb0e95">Op</a>* op) <span class="keyword">const</span>;</div>
<div class="line"><a name="l00332"></a><span class="lineno"> 332</span>&#160; <span class="keyword">inline</span> <span class="keyword">const</span> ValueType&amp; <a class="code" href="classnnvm_1_1OpMap.html#a74aecc7ed4873b2a3012e0a9673dd2bc">get</a>(<span class="keyword">const</span> <a class="code" href="classnnvm_1_1OpMap.html#a2c31e8a3c11caeb061d69db14ebb0e95">Op</a>* op, <span class="keyword">const</span> ValueType&amp; def_value) <span class="keyword">const</span>;</div>
<div class="line"><a name="l00338"></a><span class="lineno"> 338</span>&#160; <span class="keyword">inline</span> <span class="keywordtype">int</span> <a class="code" href="classnnvm_1_1OpMap.html#ac6a63fc055c4cfdb9520c64e08cce073">count</a>(<span class="keyword">const</span> <a class="code" href="classnnvm_1_1OpMap.html#a2c31e8a3c11caeb061d69db14ebb0e95">Op</a>* op) <span class="keyword">const</span>;</div>
<div class="line"><a name="l00339"></a><span class="lineno"> 339</span>&#160; </div>
<div class="line"><a name="l00345"></a><span class="lineno"> 345</span>&#160; <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="classnnvm_1_1OpMap.html#a28dd027285b5dbba7a813307993712b2">contains</a>(<span class="keyword">const</span> <a class="code" href="classnnvm_1_1OpMap.html#a2c31e8a3c11caeb061d69db14ebb0e95">Op</a>* op) <span class="keyword">const</span>;</div>
<div class="line"><a name="l00346"></a><span class="lineno"> 346</span>&#160; </div>
<div class="line"><a name="l00347"></a><span class="lineno"> 347</span>&#160; <span class="keyword">private</span>:</div>
<div class="line"><a name="l00348"></a><span class="lineno"><a class="line" href="classnnvm_1_1OpMap.html#a2c31e8a3c11caeb061d69db14ebb0e95"> 348</a></span>&#160; <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="classnnvm_1_1Op.html">Op</a>;</div>
<div class="line"><a name="l00349"></a><span class="lineno"> 349</span>&#160; <span class="comment">// internal attribute name</span></div>
<div class="line"><a name="l00350"></a><span class="lineno"> 350</span>&#160; std::string attr_name_;</div>
<div class="line"><a name="l00351"></a><span class="lineno"> 351</span>&#160; <span class="comment">// internal data</span></div>
<div class="line"><a name="l00352"></a><span class="lineno"> 352</span>&#160; std::vector&lt;std::pair&lt;ValueType, int&gt;&gt; data_;</div>
<div class="line"><a name="l00353"></a><span class="lineno"> 353</span>&#160; <a class="code" href="classnnvm_1_1OpMap.html">OpMap</a>() = <span class="keywordflow">default</span>;</div>
<div class="line"><a name="l00354"></a><span class="lineno"> 354</span>&#160;};</div>
<div class="line"><a name="l00355"></a><span class="lineno"> 355</span>&#160; </div>
<div class="line"><a name="l00360"></a><span class="lineno"><a class="line" href="classnnvm_1_1OpGroup.html"> 360</a></span>&#160;<span class="keyword">class </span><a class="code" href="classnnvm_1_1OpGroup.html">OpGroup</a> {</div>
<div class="line"><a name="l00361"></a><span class="lineno"> 361</span>&#160; <span class="keyword">public</span>:</div>
<div class="line"><a name="l00363"></a><span class="lineno"><a class="line" href="classnnvm_1_1OpGroup.html#a9d49a03bc2cce737a4a0758563295b60"> 363</a></span>&#160; std::string <a class="code" href="classnnvm_1_1OpGroup.html#a9d49a03bc2cce737a4a0758563295b60">group_name</a>;</div>
<div class="line"><a name="l00377"></a><span class="lineno"> 377</span>&#160; <span class="keyword">template</span> &lt;<span class="keyword">typename</span> ValueType&gt;</div>
<div class="line"><a name="l00378"></a><span class="lineno"> 378</span>&#160; <span class="keyword">inline</span> <a class="code" href="classnnvm_1_1OpGroup.html">OpGroup</a>&amp; <a class="code" href="classnnvm_1_1OpGroup.html#aa36a30a41675da76bb7469fbba5e8cab">set_attr</a>(<span class="keyword">const</span> std::string&amp; attr_name, <span class="comment">// NOLINT(*)</span></div>
<div class="line"><a name="l00379"></a><span class="lineno"> 379</span>&#160; <span class="keyword">const</span> ValueType&amp; value, <span class="keywordtype">int</span> plevel = 1);</div>
<div class="line"><a name="l00380"></a><span class="lineno"> 380</span>&#160;};</div>
<div class="line"><a name="l00381"></a><span class="lineno"> 381</span>&#160; </div>
<div class="line"><a name="l00382"></a><span class="lineno"> 382</span>&#160;<span class="comment">// internal macros to make</span></div>
<div class="line"><a name="l00383"></a><span class="lineno"><a class="line" href="op_8h.html#a88a4a87d7af6547d6879a16924cd561b"> 383</a></span>&#160;<span class="preprocessor">#define NNVM_REGISTER_VAR_DEF(OpName) \</span></div>
<div class="line"><a name="l00384"></a><span class="lineno"> 384</span>&#160;<span class="preprocessor"> static DMLC_ATTRIBUTE_UNUSED ::nnvm::Op&amp; __make_##NnvmOp##_##OpName</span></div>
<div class="line"><a name="l00385"></a><span class="lineno"> 385</span>&#160; </div>
<div class="line"><a name="l00386"></a><span class="lineno"><a class="line" href="op_8h.html#ab2b4f84c6934f76a7084c22ae8464766"> 386</a></span>&#160;<span class="preprocessor">#define NNVM_REGISTER_GVAR_DEF(TagName) \</span></div>
<div class="line"><a name="l00387"></a><span class="lineno"> 387</span>&#160;<span class="preprocessor"> static DMLC_ATTRIBUTE_UNUSED ::nnvm::OpGroup __make_##NnvmOpGroup##_##TagName</span></div>
<div class="line"><a name="l00388"></a><span class="lineno"> 388</span>&#160; </div>
<div class="line"><a name="l00404"></a><span class="lineno"><a class="line" href="op_8h.html#aacfc49292e41582dd1bba725ece160ae"> 404</a></span>&#160;<span class="preprocessor">#define NNVM_REGISTER_OP(OpName) \</span></div>
<div class="line"><a name="l00405"></a><span class="lineno"> 405</span>&#160;<span class="preprocessor"> DMLC_STR_CONCAT(NNVM_REGISTER_VAR_DEF(OpName), __COUNTER__) = \</span></div>
<div class="line"><a name="l00406"></a><span class="lineno"> 406</span>&#160;<span class="preprocessor"> ::dmlc::Registry&lt;::nnvm::Op&gt;::Get()-&gt;__REGISTER_OR_GET__(#OpName)</span></div>
<div class="line"><a name="l00407"></a><span class="lineno"> 407</span>&#160; </div>
<div class="line"><a name="l00429"></a><span class="lineno"><a class="line" href="op_8h.html#af0e87dbf2cd566db02e76ea77f14f20b"> 429</a></span>&#160;<span class="preprocessor">#define NNVM_REGISTER_OP_GROUP(GroupName) \</span></div>
<div class="line"><a name="l00430"></a><span class="lineno"> 430</span>&#160;<span class="preprocessor"> DMLC_STR_CONCAT(NNVM_REGISTER_GVAR_DEF(GroupName), __COUNTER__) = ::nnvm::OpGroup { #GroupName }</span></div>
<div class="line"><a name="l00431"></a><span class="lineno"> 431</span>&#160; </div>
<div class="line"><a name="l00432"></a><span class="lineno"> 432</span>&#160;<span class="comment">// implementations of template functions after this.</span></div>
<div class="line"><a name="l00433"></a><span class="lineno"> 433</span>&#160;<span class="comment">// member function of Op</span></div>
<div class="line"><a name="l00434"></a><span class="lineno"> 434</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">typename</span> ValueType&gt;</div>
<div class="line"><a name="l00435"></a><span class="lineno"><a class="line" href="classnnvm_1_1Op.html#a97b65edf5226493f41f4a81e13e6abec"> 435</a></span>&#160;<span class="keyword">inline</span> <span class="keyword">const</span> <a class="code" href="classnnvm_1_1OpMap.html">OpMap&lt;ValueType&gt;</a>&amp; <a class="code" href="classnnvm_1_1Op.html#a97b65edf5226493f41f4a81e13e6abec">Op::GetAttr</a>(<span class="keyword">const</span> std::string&amp; key) {</div>
<div class="line"><a name="l00436"></a><span class="lineno"> 436</span>&#160; <span class="keyword">const</span> any* ref = GetAttrMap(key);</div>
<div class="line"><a name="l00437"></a><span class="lineno"> 437</span>&#160; <span class="keywordflow">if</span> (ref == <span class="keyword">nullptr</span>) {</div>
<div class="line"><a name="l00438"></a><span class="lineno"> 438</span>&#160; <span class="comment">// update the attribute map of the key by creating new empty OpMap</span></div>
<div class="line"><a name="l00439"></a><span class="lineno"> 439</span>&#160; UpdateAttrMap(key, [key](any* pmap) {</div>
<div class="line"><a name="l00440"></a><span class="lineno"> 440</span>&#160; <span class="comment">// use callback so it is in lockscope</span></div>
<div class="line"><a name="l00441"></a><span class="lineno"> 441</span>&#160; <span class="keywordflow">if</span> (pmap-&gt;empty()) {</div>
<div class="line"><a name="l00442"></a><span class="lineno"> 442</span>&#160; OpMap&lt;ValueType&gt; pm;</div>
<div class="line"><a name="l00443"></a><span class="lineno"> 443</span>&#160; pm.attr_name_ = key;</div>
<div class="line"><a name="l00444"></a><span class="lineno"> 444</span>&#160; *pmap = std::move(pm);</div>
<div class="line"><a name="l00445"></a><span class="lineno"> 445</span>&#160; }</div>
<div class="line"><a name="l00446"></a><span class="lineno"> 446</span>&#160; });</div>
<div class="line"><a name="l00447"></a><span class="lineno"> 447</span>&#160; ref = GetAttrMap(key);</div>
<div class="line"><a name="l00448"></a><span class="lineno"> 448</span>&#160; }</div>
<div class="line"><a name="l00449"></a><span class="lineno"> 449</span>&#160; <span class="keywordflow">return</span> nnvm::get&lt;OpMap&lt;ValueType&gt;&gt;(*ref);</div>
<div class="line"><a name="l00450"></a><span class="lineno"> 450</span>&#160;}</div>
<div class="line"><a name="l00451"></a><span class="lineno"> 451</span>&#160; </div>
<div class="line"><a name="l00452"></a><span class="lineno"> 452</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">typename</span> ValueType&gt;</div>
<div class="line"><a name="l00453"></a><span class="lineno"><a class="line" href="classnnvm_1_1Op.html#a6ddb1adaac8e03ae1f66fc41ca927224"> 453</a></span>&#160;<span class="keyword">inline</span> <a class="code" href="classnnvm_1_1Op.html">Op</a>&amp; <a class="code" href="classnnvm_1_1Op.html#a6ddb1adaac8e03ae1f66fc41ca927224">Op::set_attr</a>( <span class="comment">// NOLINT(*)</span></div>
<div class="line"><a name="l00454"></a><span class="lineno"> 454</span>&#160; <span class="keyword">const</span> std::string&amp; attr_name, <span class="keyword">const</span> ValueType&amp; value, <span class="keywordtype">int</span> plevel) {</div>
<div class="line"><a name="l00455"></a><span class="lineno"> 455</span>&#160; CHECK_GT(plevel, 0) &lt;&lt; <span class="stringliteral">&quot;plevel in set_attr must be greater than 0&quot;</span>;</div>
<div class="line"><a name="l00456"></a><span class="lineno"> 456</span>&#160; <span class="comment">// update the attribute map of the key by creating new empty if needed.</span></div>
<div class="line"><a name="l00457"></a><span class="lineno"> 457</span>&#160; UpdateAttrMap(attr_name, [<span class="keyword">this</span>, attr_name, value, plevel](any* pmap) {</div>
<div class="line"><a name="l00458"></a><span class="lineno"> 458</span>&#160; <span class="comment">// the callback is in lockscope so is threadsafe.</span></div>
<div class="line"><a name="l00459"></a><span class="lineno"> 459</span>&#160; <span class="keywordflow">if</span> (pmap-&gt;empty()) {</div>
<div class="line"><a name="l00460"></a><span class="lineno"> 460</span>&#160; OpMap&lt;ValueType&gt; pm;</div>
<div class="line"><a name="l00461"></a><span class="lineno"> 461</span>&#160; pm.attr_name_ = attr_name;</div>
<div class="line"><a name="l00462"></a><span class="lineno"> 462</span>&#160; *pmap = std::move(pm);</div>
<div class="line"><a name="l00463"></a><span class="lineno"> 463</span>&#160; }</div>
<div class="line"><a name="l00464"></a><span class="lineno"> 464</span>&#160; CHECK(pmap-&gt;type() == <span class="keyword">typeid</span>(<a class="code" href="classnnvm_1_1OpMap.html">OpMap&lt;ValueType&gt;</a>))</div>
<div class="line"><a name="l00465"></a><span class="lineno"> 465</span>&#160; &lt;&lt; <span class="stringliteral">&quot;Attribute &quot;</span> &lt;&lt; attr_name &lt;&lt; <span class="stringliteral">&quot; of operator &quot;</span> &lt;&lt; this-&gt;name</div>
<div class="line"><a name="l00466"></a><span class="lineno"> 466</span>&#160; &lt;&lt; <span class="stringliteral">&quot; is registered as inconsistent types&quot;</span></div>
<div class="line"><a name="l00467"></a><span class="lineno"> 467</span>&#160; &lt;&lt; <span class="stringliteral">&quot; previously &quot;</span> &lt;&lt; pmap-&gt;type().name() &lt;&lt; <span class="stringliteral">&quot; current &quot;</span> &lt;&lt; <span class="keyword">typeid</span>(<a class="code" href="classnnvm_1_1OpMap.html">OpMap&lt;ValueType&gt;</a>).name();</div>
<div class="line"><a name="l00468"></a><span class="lineno"> 468</span>&#160; std::vector&lt;std::pair&lt;ValueType, int&gt;&gt;&amp; vec = nnvm::get&lt;<a class="code" href="classnnvm_1_1OpMap.html">OpMap&lt;ValueType&gt;</a>&gt;(*pmap).data_;</div>
<div class="line"><a name="l00469"></a><span class="lineno"> 469</span>&#160; <span class="comment">// resize the value type.</span></div>
<div class="line"><a name="l00470"></a><span class="lineno"> 470</span>&#160; if (vec.size() &lt;= index_) {</div>
<div class="line"><a name="l00471"></a><span class="lineno"> 471</span>&#160; vec.resize(index_ + 1, std::make_pair(ValueType(), 0));</div>
<div class="line"><a name="l00472"></a><span class="lineno"> 472</span>&#160; }</div>
<div class="line"><a name="l00473"></a><span class="lineno"> 473</span>&#160; std::pair&lt;ValueType, int&gt;&amp; p = vec[index_];</div>
<div class="line"><a name="l00474"></a><span class="lineno"> 474</span>&#160; CHECK(p.second != plevel) &lt;&lt; <span class="stringliteral">&quot;Attribute &quot;</span> &lt;&lt; attr_name &lt;&lt; <span class="stringliteral">&quot; of operator &quot;</span> &lt;&lt; this-&gt;name</div>
<div class="line"><a name="l00475"></a><span class="lineno"> 475</span>&#160; &lt;&lt; <span class="stringliteral">&quot; is already registered with same plevel=&quot;</span> &lt;&lt; plevel;</div>
<div class="line"><a name="l00476"></a><span class="lineno"> 476</span>&#160; if (p.second &lt; plevel) {</div>
<div class="line"><a name="l00477"></a><span class="lineno"> 477</span>&#160; vec[index_] = std::make_pair(value, plevel);</div>
<div class="line"><a name="l00478"></a><span class="lineno"> 478</span>&#160; }</div>
<div class="line"><a name="l00479"></a><span class="lineno"> 479</span>&#160; });</div>
<div class="line"><a name="l00480"></a><span class="lineno"> 480</span>&#160; <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div>
<div class="line"><a name="l00481"></a><span class="lineno"> 481</span>&#160;}</div>
<div class="line"><a name="l00482"></a><span class="lineno"> 482</span>&#160; </div>
<div class="line"><a name="l00483"></a><span class="lineno"><a class="line" href="classnnvm_1_1Op.html#abab5b3bef4265a194fced208f2e8292b"> 483</a></span>&#160;<span class="keyword">inline</span> <a class="code" href="classnnvm_1_1Op.html">Op</a>&amp; <a class="code" href="classnnvm_1_1Op.html#abab5b3bef4265a194fced208f2e8292b">Op::describe</a>(<span class="keyword">const</span> std::string&amp; descr) { <span class="comment">// NOLINT(*)</span></div>
<div class="line"><a name="l00484"></a><span class="lineno"> 484</span>&#160; this-&gt;description = descr;</div>
<div class="line"><a name="l00485"></a><span class="lineno"> 485</span>&#160; <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div>
<div class="line"><a name="l00486"></a><span class="lineno"> 486</span>&#160;}</div>
<div class="line"><a name="l00487"></a><span class="lineno"> 487</span>&#160; </div>
<div class="line"><a name="l00488"></a><span class="lineno"><a class="line" href="classnnvm_1_1Op.html#a36256680ebbb00708381115c5b8ab817"> 488</a></span>&#160;<span class="keyword">inline</span> <a class="code" href="classnnvm_1_1Op.html">Op</a>&amp; <a class="code" href="classnnvm_1_1Op.html#a36256680ebbb00708381115c5b8ab817">Op::add_argument</a>(<span class="keyword">const</span> std::string&amp; name, <span class="keyword">const</span> std::string&amp; type,</div>
<div class="line"><a name="l00489"></a><span class="lineno"> 489</span>&#160; <span class="keyword">const</span> std::string&amp; description) {</div>
<div class="line"><a name="l00490"></a><span class="lineno"> 490</span>&#160; <a class="code" href="classnnvm_1_1Op.html#a8d63a704ebbd55974b66e6efd75b3722">arguments</a>.push_back({<a class="code" href="classnnvm_1_1Op.html#af67a5d6998765023aeed6761df292b6c">name</a>, type, type, <a class="code" href="classnnvm_1_1Op.html#a9552f756aa56608379096b6ca727ccf5">description</a>});</div>
<div class="line"><a name="l00491"></a><span class="lineno"> 491</span>&#160; <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div>
<div class="line"><a name="l00492"></a><span class="lineno"> 492</span>&#160;}</div>
<div class="line"><a name="l00493"></a><span class="lineno"> 493</span>&#160; </div>
<div class="line"><a name="l00494"></a><span class="lineno"><a class="line" href="classnnvm_1_1Op.html#ad3d42bec8afaf4e50d59be89a1795035"> 494</a></span>&#160;<span class="keyword">inline</span> <a class="code" href="classnnvm_1_1Op.html">Op</a>&amp; <a class="code" href="classnnvm_1_1Op.html#ad3d42bec8afaf4e50d59be89a1795035">Op::add_arguments</a>(<span class="keyword">const</span> std::vector&lt;ParamFieldInfo&gt;&amp; args) {</div>
<div class="line"><a name="l00495"></a><span class="lineno"> 495</span>&#160; this-&gt;arguments.insert(<a class="code" href="classnnvm_1_1Op.html#a8d63a704ebbd55974b66e6efd75b3722">arguments</a>.end(), args.begin(), args.end());</div>
<div class="line"><a name="l00496"></a><span class="lineno"> 496</span>&#160; <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div>
<div class="line"><a name="l00497"></a><span class="lineno"> 497</span>&#160;}</div>
<div class="line"><a name="l00498"></a><span class="lineno"> 498</span>&#160; </div>
<div class="line"><a name="l00499"></a><span class="lineno"><a class="line" href="classnnvm_1_1Op.html#a2db3c272965df71f1e592ea30a1c824a"> 499</a></span>&#160;<span class="keyword">inline</span> <a class="code" href="classnnvm_1_1Op.html">Op</a>&amp; <a class="code" href="classnnvm_1_1Op.html#a2db3c272965df71f1e592ea30a1c824a">Op::set_num_inputs</a>(uint32_t n) { <span class="comment">// NOLINT(*)</span></div>
<div class="line"><a name="l00500"></a><span class="lineno"> 500</span>&#160; this-&gt;num_inputs = n;</div>
<div class="line"><a name="l00501"></a><span class="lineno"> 501</span>&#160; <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div>
<div class="line"><a name="l00502"></a><span class="lineno"> 502</span>&#160;}</div>
<div class="line"><a name="l00503"></a><span class="lineno"> 503</span>&#160; </div>
<div class="line"><a name="l00504"></a><span class="lineno"><a class="line" href="classnnvm_1_1Op.html#aa9ec331b85b57d31951c4bd3ff8a1473"> 504</a></span>&#160;<span class="keyword">inline</span> <a class="code" href="classnnvm_1_1Op.html">Op</a>&amp; <a class="code" href="classnnvm_1_1Op.html#aa9ec331b85b57d31951c4bd3ff8a1473">Op::set_support_level</a>(uint32_t n) { <span class="comment">// NOLINT(*)</span></div>
<div class="line"><a name="l00505"></a><span class="lineno"> 505</span>&#160; this-&gt;support_level = n;</div>
<div class="line"><a name="l00506"></a><span class="lineno"> 506</span>&#160; <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div>
<div class="line"><a name="l00507"></a><span class="lineno"> 507</span>&#160;}</div>
<div class="line"><a name="l00508"></a><span class="lineno"> 508</span>&#160; </div>
<div class="line"><a name="l00509"></a><span class="lineno"><a class="line" href="classnnvm_1_1Op.html#aab25f32ae369dc760f73ca75caa17f2d"> 509</a></span>&#160;<span class="keyword">inline</span> <a class="code" href="classnnvm_1_1Op.html">Op</a>&amp; <a class="code" href="classnnvm_1_1Op.html#a2db3c272965df71f1e592ea30a1c824a">Op::set_num_inputs</a>(std::function&lt;uint32_t(<span class="keyword">const</span> <a class="code" href="structnnvm_1_1NodeAttrs.html">NodeAttrs</a>&amp; attr)&gt; fn) { <span class="comment">// NOLINT(*)</span></div>
<div class="line"><a name="l00510"></a><span class="lineno"> 510</span>&#160; this-&gt;get_num_inputs = fn;</div>
<div class="line"><a name="l00511"></a><span class="lineno"> 511</span>&#160; <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div>
<div class="line"><a name="l00512"></a><span class="lineno"> 512</span>&#160;}</div>
<div class="line"><a name="l00513"></a><span class="lineno"> 513</span>&#160; </div>
<div class="line"><a name="l00514"></a><span class="lineno"><a class="line" href="classnnvm_1_1Op.html#a034baf61a5f396d400073433e92bea51"> 514</a></span>&#160;<span class="keyword">inline</span> <a class="code" href="classnnvm_1_1Op.html">Op</a>&amp; <a class="code" href="classnnvm_1_1Op.html#a034baf61a5f396d400073433e92bea51">Op::set_num_outputs</a>(uint32_t n) { <span class="comment">// NOLINT(*)</span></div>
<div class="line"><a name="l00515"></a><span class="lineno"> 515</span>&#160; this-&gt;num_outputs = n;</div>
<div class="line"><a name="l00516"></a><span class="lineno"> 516</span>&#160; <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div>
<div class="line"><a name="l00517"></a><span class="lineno"> 517</span>&#160;}</div>
<div class="line"><a name="l00518"></a><span class="lineno"> 518</span>&#160; </div>
<div class="line"><a name="l00519"></a><span class="lineno"><a class="line" href="classnnvm_1_1Op.html#aa7b1b4661e24f8d9ca02c13443cbf6b6"> 519</a></span>&#160;<span class="keyword">inline</span> <a class="code" href="classnnvm_1_1Op.html">Op</a>&amp; <a class="code" href="classnnvm_1_1Op.html#a034baf61a5f396d400073433e92bea51">Op::set_num_outputs</a>(std::function&lt;uint32_t(<span class="keyword">const</span> <a class="code" href="structnnvm_1_1NodeAttrs.html">NodeAttrs</a>&amp; attr)&gt; fn) { <span class="comment">// NOLINT(*)</span></div>
<div class="line"><a name="l00520"></a><span class="lineno"> 520</span>&#160; this-&gt;get_num_outputs = fn;</div>
<div class="line"><a name="l00521"></a><span class="lineno"> 521</span>&#160; <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div>
<div class="line"><a name="l00522"></a><span class="lineno"> 522</span>&#160;}</div>
<div class="line"><a name="l00523"></a><span class="lineno"> 523</span>&#160; </div>
<div class="line"><a name="l00524"></a><span class="lineno"><a class="line" href="classnnvm_1_1Op.html#a3af40f342a817a47f1fb7769ab0866ea"> 524</a></span>&#160;<span class="keyword">inline</span> <a class="code" href="classnnvm_1_1Op.html">Op</a>&amp; <a class="code" href="classnnvm_1_1Op.html#a3af40f342a817a47f1fb7769ab0866ea">Op::set_attr_parser</a>(std::function&lt;<span class="keywordtype">void</span>(<a class="code" href="structnnvm_1_1NodeAttrs.html">NodeAttrs</a>* attrs)&gt; fn) { <span class="comment">// NOLINT(*)</span></div>
<div class="line"><a name="l00525"></a><span class="lineno"> 525</span>&#160; this-&gt;attr_parser = fn;</div>
<div class="line"><a name="l00526"></a><span class="lineno"> 526</span>&#160; <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div>
<div class="line"><a name="l00527"></a><span class="lineno"> 527</span>&#160;}</div>
<div class="line"><a name="l00528"></a><span class="lineno"> 528</span>&#160; </div>
<div class="line"><a name="l00529"></a><span class="lineno"> 529</span>&#160;<span class="comment">// member functions of OpMap</span></div>
<div class="line"><a name="l00530"></a><span class="lineno"> 530</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">typename</span> ValueType&gt;</div>
<div class="line"><a name="l00531"></a><span class="lineno"><a class="line" href="classnnvm_1_1OpMap.html#ac6a63fc055c4cfdb9520c64e08cce073"> 531</a></span>&#160;<span class="keyword">inline</span> <span class="keywordtype">int</span> <a class="code" href="classnnvm_1_1OpMap.html#ac6a63fc055c4cfdb9520c64e08cce073">OpMap&lt;ValueType&gt;::count</a>(<span class="keyword">const</span> <a class="code" href="classnnvm_1_1Op.html">Op</a>* op)<span class="keyword"> const </span>{</div>
<div class="line"><a name="l00532"></a><span class="lineno"> 532</span>&#160; <span class="keywordflow">if</span> (contains(op)) {</div>
<div class="line"><a name="l00533"></a><span class="lineno"> 533</span>&#160; <span class="keywordflow">return</span> 1;</div>
<div class="line"><a name="l00534"></a><span class="lineno"> 534</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00535"></a><span class="lineno"> 535</span>&#160; <span class="keywordflow">return</span> 0;</div>
<div class="line"><a name="l00536"></a><span class="lineno"> 536</span>&#160; }</div>
<div class="line"><a name="l00537"></a><span class="lineno"> 537</span>&#160;}</div>
<div class="line"><a name="l00538"></a><span class="lineno"> 538</span>&#160; </div>
<div class="line"><a name="l00539"></a><span class="lineno"> 539</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">typename</span> ValueType&gt;</div>
<div class="line"><a name="l00540"></a><span class="lineno"><a class="line" href="classnnvm_1_1OpMap.html#a28dd027285b5dbba7a813307993712b2"> 540</a></span>&#160;<span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="classnnvm_1_1OpMap.html#a28dd027285b5dbba7a813307993712b2">OpMap&lt;ValueType&gt;::contains</a>(<span class="keyword">const</span> <a class="code" href="classnnvm_1_1Op.html">Op</a>* op)<span class="keyword"> const </span>{</div>
<div class="line"><a name="l00541"></a><span class="lineno"> 541</span>&#160; <span class="keywordflow">if</span> (op == <span class="keyword">nullptr</span>) {</div>
<div class="line"><a name="l00542"></a><span class="lineno"> 542</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a name="l00543"></a><span class="lineno"> 543</span>&#160; }</div>
<div class="line"><a name="l00544"></a><span class="lineno"> 544</span>&#160; <span class="keyword">const</span> uint32_t idx = op-&gt;index_;</div>
<div class="line"><a name="l00545"></a><span class="lineno"> 545</span>&#160; <span class="keywordflow">return</span> idx &lt; data_.size() ? (data_[idx].second != 0) : <span class="keyword">false</span>;</div>
<div class="line"><a name="l00546"></a><span class="lineno"> 546</span>&#160;}</div>
<div class="line"><a name="l00547"></a><span class="lineno"> 547</span>&#160; </div>
<div class="line"><a name="l00548"></a><span class="lineno"> 548</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">typename</span> ValueType&gt;</div>
<div class="line"><a name="l00549"></a><span class="lineno"><a class="line" href="classnnvm_1_1OpMap.html#a8d2b7f1f25f7905d6d442297d76f4bee"> 549</a></span>&#160;<span class="keyword">inline</span> <span class="keyword">const</span> ValueType&amp; <a class="code" href="classnnvm_1_1OpMap.html#a8d2b7f1f25f7905d6d442297d76f4bee">OpMap&lt;ValueType&gt;::operator[]</a>(<span class="keyword">const</span> <a class="code" href="classnnvm_1_1Op.html">Op</a>* op)<span class="keyword"> const </span>{</div>
<div class="line"><a name="l00550"></a><span class="lineno"> 550</span>&#160; CHECK(op != <span class="keyword">nullptr</span>);</div>
<div class="line"><a name="l00551"></a><span class="lineno"> 551</span>&#160; <span class="keyword">const</span> uint32_t idx = op-&gt;index_;</div>
<div class="line"><a name="l00552"></a><span class="lineno"> 552</span>&#160; CHECK(idx &lt; data_.size() &amp;&amp; data_[idx].second)</div>
<div class="line"><a name="l00553"></a><span class="lineno"> 553</span>&#160; &lt;&lt; <span class="stringliteral">&quot;Attribute &quot;</span> &lt;&lt; attr_name_ &lt;&lt; <span class="stringliteral">&quot; has not been registered for Operator &quot;</span> &lt;&lt; op-&gt;<a class="code" href="classnnvm_1_1Op.html#af67a5d6998765023aeed6761df292b6c">name</a>;</div>
<div class="line"><a name="l00554"></a><span class="lineno"> 554</span>&#160; <span class="keywordflow">return</span> data_[idx].first;</div>
<div class="line"><a name="l00555"></a><span class="lineno"> 555</span>&#160;}</div>
<div class="line"><a name="l00556"></a><span class="lineno"> 556</span>&#160; </div>
<div class="line"><a name="l00557"></a><span class="lineno"> 557</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">typename</span> ValueType&gt;</div>
<div class="line"><a name="l00558"></a><span class="lineno"><a class="line" href="classnnvm_1_1OpMap.html#a74aecc7ed4873b2a3012e0a9673dd2bc"> 558</a></span>&#160;<span class="keyword">inline</span> <span class="keyword">const</span> ValueType&amp; <a class="code" href="classnnvm_1_1OpMap.html#a74aecc7ed4873b2a3012e0a9673dd2bc">OpMap&lt;ValueType&gt;::get</a>(<span class="keyword">const</span> <a class="code" href="classnnvm_1_1Op.html">Op</a>* op, <span class="keyword">const</span> ValueType&amp; def_value)<span class="keyword"> const </span>{</div>
<div class="line"><a name="l00559"></a><span class="lineno"> 559</span>&#160; <span class="keywordflow">if</span> (op == <span class="keyword">nullptr</span>) <span class="keywordflow">return</span> def_value;</div>
<div class="line"><a name="l00560"></a><span class="lineno"> 560</span>&#160; <span class="keyword">const</span> uint32_t idx = op-&gt;index_;</div>
<div class="line"><a name="l00561"></a><span class="lineno"> 561</span>&#160; <span class="keywordflow">if</span> (idx &lt; data_.size() &amp;&amp; data_[idx].second) {</div>
<div class="line"><a name="l00562"></a><span class="lineno"> 562</span>&#160; <span class="keywordflow">return</span> data_[idx].first;</div>
<div class="line"><a name="l00563"></a><span class="lineno"> 563</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00564"></a><span class="lineno"> 564</span>&#160; <span class="keywordflow">return</span> def_value;</div>
<div class="line"><a name="l00565"></a><span class="lineno"> 565</span>&#160; }</div>
<div class="line"><a name="l00566"></a><span class="lineno"> 566</span>&#160;}</div>
<div class="line"><a name="l00567"></a><span class="lineno"> 567</span>&#160; </div>
<div class="line"><a name="l00568"></a><span class="lineno"> 568</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">typename</span> ValueType&gt;</div>
<div class="line"><a name="l00569"></a><span class="lineno"><a class="line" href="classnnvm_1_1OpGroup.html#aa36a30a41675da76bb7469fbba5e8cab"> 569</a></span>&#160;<span class="keyword">inline</span> <a class="code" href="classnnvm_1_1OpGroup.html">OpGroup</a>&amp; <a class="code" href="classnnvm_1_1OpGroup.html#aa36a30a41675da76bb7469fbba5e8cab">OpGroup::set_attr</a>(<span class="keyword">const</span> std::string&amp; attr_name, <span class="keyword">const</span> ValueType&amp; value,</div>
<div class="line"><a name="l00570"></a><span class="lineno"> 570</span>&#160; <span class="keywordtype">int</span> plevel) {</div>
<div class="line"><a name="l00571"></a><span class="lineno"> 571</span>&#160; <span class="keyword">auto</span> trigger = [attr_name, value, plevel](<a class="code" href="classnnvm_1_1Op.html">Op</a>* op) {</div>
<div class="line"><a name="l00572"></a><span class="lineno"> 572</span>&#160; op-&gt;<a class="code" href="classnnvm_1_1OpGroup.html#aa36a30a41675da76bb7469fbba5e8cab">set_attr</a>&lt;ValueType&gt;(attr_name, value, plevel);</div>
<div class="line"><a name="l00573"></a><span class="lineno"> 573</span>&#160; };</div>
<div class="line"><a name="l00574"></a><span class="lineno"> 574</span>&#160; Op::AddGroupTrigger(<a class="code" href="classnnvm_1_1OpGroup.html#a9d49a03bc2cce737a4a0758563295b60">group_name</a>, trigger);</div>
<div class="line"><a name="l00575"></a><span class="lineno"> 575</span>&#160; <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div>
<div class="line"><a name="l00576"></a><span class="lineno"> 576</span>&#160;}</div>
<div class="line"><a name="l00577"></a><span class="lineno"> 577</span>&#160; </div>
<div class="line"><a name="l00578"></a><span class="lineno"> 578</span>&#160;} <span class="comment">// namespace nnvm</span></div>
<div class="line"><a name="l00579"></a><span class="lineno"> 579</span>&#160; </div>
<div class="line"><a name="l00580"></a><span class="lineno"> 580</span>&#160;<span class="preprocessor">#endif // NNVM_OP_H_</span></div>
</div><!-- fragment --></div><!-- contents -->
<div class="ttc" id="aclassnnvm_1_1OpMap_html_a74aecc7ed4873b2a3012e0a9673dd2bc"><div class="ttname"><a href="classnnvm_1_1OpMap.html#a74aecc7ed4873b2a3012e0a9673dd2bc">nnvm::OpMap::get</a></div><div class="ttdeci">const ValueType &amp; get(const Op *op, const ValueType &amp;def_value) const</div><div class="ttdoc">get the corresponding value element at op with default value.</div><div class="ttdef"><b>Definition:</b> op.h:558</div></div>
<div class="ttc" id="aclassnnvm_1_1OpMap_html_ac6a63fc055c4cfdb9520c64e08cce073"><div class="ttname"><a href="classnnvm_1_1OpMap.html#ac6a63fc055c4cfdb9520c64e08cce073">nnvm::OpMap::count</a></div><div class="ttdeci">int count(const Op *op) const</div><div class="ttdoc">Check if the map has op as key.</div><div class="ttdef"><b>Definition:</b> op.h:531</div></div>
<div class="ttc" id="aclassnnvm_1_1Op_html_af67a5d6998765023aeed6761df292b6c"><div class="ttname"><a href="classnnvm_1_1Op.html#af67a5d6998765023aeed6761df292b6c">nnvm::Op::name</a></div><div class="ttdeci">std::string name</div><div class="ttdoc">name of the operator</div><div class="ttdef"><b>Definition:</b> op.h:108</div></div>
<div class="ttc" id="aclassnnvm_1_1Op_html_ad3d42bec8afaf4e50d59be89a1795035"><div class="ttname"><a href="classnnvm_1_1Op.html#ad3d42bec8afaf4e50d59be89a1795035">nnvm::Op::add_arguments</a></div><div class="ttdeci">Op &amp; add_arguments(const std::vector&lt; ParamFieldInfo &gt; &amp;args)</div><div class="ttdoc">Append list if arguments to the end.</div><div class="ttdef"><b>Definition:</b> op.h:494</div></div>
<div class="ttc" id="aparameter_8h_html"><div class="ttname"><a href="parameter_8h.html">parameter.h</a></div><div class="ttdoc">Provide lightweight util to do parameter setup and checking.</div></div>
<div class="ttc" id="aclassnnvm_1_1OpMap_html_a2c31e8a3c11caeb061d69db14ebb0e95"><div class="ttname"><a href="classnnvm_1_1OpMap.html#a2c31e8a3c11caeb061d69db14ebb0e95">nnvm::OpMap::Op</a></div><div class="ttdeci">friend class Op</div><div class="ttdoc">operator structure from NNVM</div><div class="ttdef"><b>Definition:</b> op.h:348</div></div>
<div class="ttc" id="a3rdparty_2tvm_2nnvm_2include_2nnvm_2base_8h_html"><div class="ttname"><a href="3rdparty_2tvm_2nnvm_2include_2nnvm_2base_8h.html">base.h</a></div><div class="ttdoc">Configuration of nnvm as well as basic data structure.</div></div>
<div class="ttc" id="aclassnnvm_1_1OpMap_html"><div class="ttname"><a href="classnnvm_1_1OpMap.html">nnvm::OpMap</a></div><div class="ttdoc">A map data structure that takes Op* as key and returns ValueType.</div><div class="ttdef"><b>Definition:</b> op.h:45</div></div>
<div class="ttc" id="aclassnnvm_1_1Op_html_a8d63a704ebbd55974b66e6efd75b3722"><div class="ttname"><a href="classnnvm_1_1Op.html#a8d63a704ebbd55974b66e6efd75b3722">nnvm::Op::arguments</a></div><div class="ttdeci">std::vector&lt; ParamFieldInfo &gt; arguments</div><div class="ttdef"><b>Definition:</b> op.h:115</div></div>
<div class="ttc" id="astructnnvm_1_1NodeAttrs_html"><div class="ttname"><a href="structnnvm_1_1NodeAttrs.html">nnvm::NodeAttrs</a></div><div class="ttdoc">The attributes of the current operation node. Usually are additional parameters like axis,...</div><div class="ttdef"><b>Definition:</b> node.h:107</div></div>
<div class="ttc" id="aclassnnvm_1_1Op_html_a6ddb1adaac8e03ae1f66fc41ca927224"><div class="ttname"><a href="classnnvm_1_1Op.html#a6ddb1adaac8e03ae1f66fc41ca927224">nnvm::Op::set_attr</a></div><div class="ttdeci">Op &amp; set_attr(const std::string &amp;attr_name, const ValueType &amp;value, int plevel=10)</div><div class="ttdoc">Register additional attributes to operator.</div><div class="ttdef"><b>Definition:</b> op.h:453</div></div>
<div class="ttc" id="aclassdmlc_1_1Registry_html"><div class="ttname"><a href="classdmlc_1_1Registry.html">dmlc::Registry</a></div><div class="ttdoc">Registry class. Registry can be used to register global singletons. The most commonly use case are fa...</div><div class="ttdef"><b>Definition:</b> registry.h:27</div></div>
<div class="ttc" id="aclassnnvm_1_1Op_html_a36256680ebbb00708381115c5b8ab817"><div class="ttname"><a href="classnnvm_1_1Op.html#a36256680ebbb00708381115c5b8ab817">nnvm::Op::add_argument</a></div><div class="ttdeci">Op &amp; add_argument(const std::string &amp;name, const std::string &amp;type, const std::string &amp;description)</div><div class="ttdoc">Add argument information to the function.</div><div class="ttdef"><b>Definition:</b> op.h:488</div></div>
<div class="ttc" id="aclassnnvm_1_1Op_html_a9552f756aa56608379096b6ca727ccf5"><div class="ttname"><a href="classnnvm_1_1Op.html#a9552f756aa56608379096b6ca727ccf5">nnvm::Op::description</a></div><div class="ttdeci">std::string description</div><div class="ttdoc">detailed description of the operator This can be used to generate docstring automatically for the ope...</div><div class="ttdef"><b>Definition:</b> op.h:113</div></div>
<div class="ttc" id="a3rdparty_2tvm_2nnvm_2include_2nnvm_2c__api_8h_html"><div class="ttname"><a href="3rdparty_2tvm_2nnvm_2include_2nnvm_2c__api_8h.html">c_api.h</a></div><div class="ttdoc">C API of NNVM symbolic construction and pass. Enables construction and transformation of Graph in any...</div></div>
<div class="ttc" id="aclassnnvm_1_1OpGroup_html_aa36a30a41675da76bb7469fbba5e8cab"><div class="ttname"><a href="classnnvm_1_1OpGroup.html#aa36a30a41675da76bb7469fbba5e8cab">nnvm::OpGroup::set_attr</a></div><div class="ttdeci">OpGroup &amp; set_attr(const std::string &amp;attr_name, const ValueType &amp;value, int plevel=1)</div><div class="ttdoc">Register additional attributes to operator group.</div><div class="ttdef"><b>Definition:</b> op.h:569</div></div>
<div class="ttc" id="aclassnnvm_1_1OpGroup_html"><div class="ttname"><a href="classnnvm_1_1OpGroup.html">nnvm::OpGroup</a></div><div class="ttdoc">auxiliary data structure used to set attributes to a group of operators</div><div class="ttdef"><b>Definition:</b> op.h:360</div></div>
<div class="ttc" id="aclassnnvm_1_1Op_html_a97b65edf5226493f41f4a81e13e6abec"><div class="ttname"><a href="classnnvm_1_1Op.html#a97b65edf5226493f41f4a81e13e6abec">nnvm::Op::GetAttr</a></div><div class="ttdeci">static const OpMap&lt; ValueType &gt; &amp; GetAttr(const std::string &amp;attr_name)</div><div class="ttdoc">Get additional registered attribute about operators. If nothing has been registered,...</div><div class="ttdef"><b>Definition:</b> op.h:435</div></div>
<div class="ttc" id="aclassnnvm_1_1Op_html_a3af40f342a817a47f1fb7769ab0866ea"><div class="ttname"><a href="classnnvm_1_1Op.html#a3af40f342a817a47f1fb7769ab0866ea">nnvm::Op::set_attr_parser</a></div><div class="ttdeci">Op &amp; set_attr_parser(std::function&lt; void(NodeAttrs *attrs)&gt; fn)</div><div class="ttdoc">Set the attr_parser function.</div><div class="ttdef"><b>Definition:</b> op.h:524</div></div>
<div class="ttc" id="aclassnnvm_1_1Op_html_a034baf61a5f396d400073433e92bea51"><div class="ttname"><a href="classnnvm_1_1Op.html#a034baf61a5f396d400073433e92bea51">nnvm::Op::set_num_outputs</a></div><div class="ttdeci">Op &amp; set_num_outputs(uint32_t n)</div><div class="ttdoc">Set the num_outputs.</div><div class="ttdef"><b>Definition:</b> op.h:514</div></div>
<div class="ttc" id="aclassnnvm_1_1Op_html_abab5b3bef4265a194fced208f2e8292b"><div class="ttname"><a href="classnnvm_1_1Op.html#abab5b3bef4265a194fced208f2e8292b">nnvm::Op::describe</a></div><div class="ttdeci">Op &amp; describe(const std::string &amp;descr)</div><div class="ttdoc">setter function during registration Set the description of operator</div><div class="ttdef"><b>Definition:</b> op.h:483</div></div>
<div class="ttc" id="aclassnnvm_1_1OpMap_html_a28dd027285b5dbba7a813307993712b2"><div class="ttname"><a href="classnnvm_1_1OpMap.html#a28dd027285b5dbba7a813307993712b2">nnvm::OpMap::contains</a></div><div class="ttdeci">bool contains(const Op *op) const</div><div class="ttdoc">Check if the map has op as key.</div><div class="ttdef"><b>Definition:</b> op.h:540</div></div>
<div class="ttc" id="aclassnnvm_1_1Op_html_a2db3c272965df71f1e592ea30a1c824a"><div class="ttname"><a href="classnnvm_1_1Op.html#a2db3c272965df71f1e592ea30a1c824a">nnvm::Op::set_num_inputs</a></div><div class="ttdeci">Op &amp; set_num_inputs(uint32_t n)</div><div class="ttdoc">Set the num_inputs.</div><div class="ttdef"><b>Definition:</b> op.h:499</div></div>
<div class="ttc" id="a3rdparty_2tvm_2nnvm_2include_2nnvm_2c__api_8h_html_a528178e3caf0ffc542b9f12a50c1c7b0"><div class="ttname"><a href="3rdparty_2tvm_2nnvm_2include_2nnvm_2c__api_8h.html#a528178e3caf0ffc542b9f12a50c1c7b0">NNVM_DLL</a></div><div class="ttdeci">#define NNVM_DLL</div><div class="ttdoc">NNVM_DLL prefix for windows.</div><div class="ttdef"><b>Definition:</b> c_api.h:37</div></div>
<div class="ttc" id="aclassnnvm_1_1OpMap_html_a8d2b7f1f25f7905d6d442297d76f4bee"><div class="ttname"><a href="classnnvm_1_1OpMap.html#a8d2b7f1f25f7905d6d442297d76f4bee">nnvm::OpMap::operator[]</a></div><div class="ttdeci">const ValueType &amp; operator[](const Op *op) const</div><div class="ttdoc">get the corresponding value element at op</div><div class="ttdef"><b>Definition:</b> op.h:549</div></div>
<div class="ttc" id="aclassnnvm_1_1OpGroup_html_a9d49a03bc2cce737a4a0758563295b60"><div class="ttname"><a href="classnnvm_1_1OpGroup.html#a9d49a03bc2cce737a4a0758563295b60">nnvm::OpGroup::group_name</a></div><div class="ttdeci">std::string group_name</div><div class="ttdoc">the tag key to be matched</div><div class="ttdef"><b>Definition:</b> op.h:363</div></div>
<div class="ttc" id="anamespacemxnet_html_ac2fb286fd7ddfbc7af1456f6c7a7ee52"><div class="ttname"><a href="namespacemxnet.html#ac2fb286fd7ddfbc7af1456f6c7a7ee52">mxnet::Op</a></div><div class="ttdeci">nnvm::Op Op</div><div class="ttdoc">operator structure from NNVM</div><div class="ttdef"><b>Definition:</b> base.h:87</div></div>
<div class="ttc" id="aclassnnvm_1_1Op_html"><div class="ttname"><a href="classnnvm_1_1Op.html">nnvm::Op</a></div><div class="ttdoc">Operator structure.</div><div class="ttdef"><b>Definition:</b> op.h:105</div></div>
<div class="ttc" id="aclassnnvm_1_1Op_html_aa9ec331b85b57d31951c4bd3ff8a1473"><div class="ttname"><a href="classnnvm_1_1Op.html#aa9ec331b85b57d31951c4bd3ff8a1473">nnvm::Op::set_support_level</a></div><div class="ttdeci">Op &amp; set_support_level(uint32_t level)</div><div class="ttdoc">Set the support level of op.</div><div class="ttdef"><b>Definition:</b> op.h:504</div></div>
<div class="ttc" id="anamespacennvm_html"><div class="ttname"><a href="namespacennvm.html">nnvm</a></div><div class="ttdef"><b>Definition:</b> base.h:35</div></div>
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated on Thu Jan 5 2023 03:47:39 for mxnet by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.8.17
</small></address>
</body>
</html>