| <!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&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&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> <span class="comment">/*</span></div> |
| <div class="line"><a name="l00002"></a><span class="lineno"> 2</span> <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> <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> <span class="comment"> * distributed with this work for additional information</span></div> |
| <div class="line"><a name="l00005"></a><span class="lineno"> 5</span> <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> <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> <span class="comment"> * "License"); you may not use this file except in compliance</span></div> |
| <div class="line"><a name="l00008"></a><span class="lineno"> 8</span> <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> <span class="comment"> *</span></div> |
| <div class="line"><a name="l00010"></a><span class="lineno"> 10</span> <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> <span class="comment"> *</span></div> |
| <div class="line"><a name="l00012"></a><span class="lineno"> 12</span> <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> <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> <span class="comment"> * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY</span></div> |
| <div class="line"><a name="l00015"></a><span class="lineno"> 15</span> <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> <span class="comment"> * specific language governing permissions and limitations</span></div> |
| <div class="line"><a name="l00017"></a><span class="lineno"> 17</span> <span class="comment"> * under the License.</span></div> |
| <div class="line"><a name="l00018"></a><span class="lineno"> 18</span> <span class="comment"> */</span></div> |
| <div class="line"><a name="l00019"></a><span class="lineno"> 19</span>  </div> |
| <div class="line"><a name="l00024"></a><span class="lineno"> 24</span> <span class="preprocessor">#ifndef NNVM_OP_H_</span></div> |
| <div class="line"><a name="l00025"></a><span class="lineno"> 25</span> <span class="preprocessor">#define NNVM_OP_H_</span></div> |
| <div class="line"><a name="l00026"></a><span class="lineno"> 26</span>  </div> |
| <div class="line"><a name="l00027"></a><span class="lineno"> 27</span> <span class="preprocessor">#include <<a class="code" href="parameter_8h.html">dmlc/parameter.h</a>></span></div> |
| <div class="line"><a name="l00028"></a><span class="lineno"> 28</span>  </div> |
| <div class="line"><a name="l00029"></a><span class="lineno"> 29</span> <span class="preprocessor">#include <functional></span></div> |
| <div class="line"><a name="l00030"></a><span class="lineno"> 30</span> <span class="preprocessor">#include <limits></span></div> |
| <div class="line"><a name="l00031"></a><span class="lineno"> 31</span> <span class="preprocessor">#include <string></span></div> |
| <div class="line"><a name="l00032"></a><span class="lineno"> 32</span> <span class="preprocessor">#include <typeinfo></span></div> |
| <div class="line"><a name="l00033"></a><span class="lineno"> 33</span> <span class="preprocessor">#include <utility></span></div> |
| <div class="line"><a name="l00034"></a><span class="lineno"> 34</span> <span class="preprocessor">#include <vector></span></div> |
| <div class="line"><a name="l00035"></a><span class="lineno"> 35</span>  </div> |
| <div class="line"><a name="l00036"></a><span class="lineno"> 36</span> <span class="preprocessor">#include "<a class="code" href="3rdparty_2tvm_2nnvm_2include_2nnvm_2base_8h.html">base.h</a>"</span></div> |
| <div class="line"><a name="l00037"></a><span class="lineno"> 37</span> <span class="preprocessor">#include "<a class="code" href="3rdparty_2tvm_2nnvm_2include_2nnvm_2c__api_8h.html">c_api.h</a>"</span></div> |
| <div class="line"><a name="l00038"></a><span class="lineno"> 38</span>  </div> |
| <div class="line"><a name="l00039"></a><span class="lineno"> 39</span> <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>  </div> |
| <div class="line"><a name="l00041"></a><span class="lineno"> 41</span> <span class="comment">// forward declarations</span></div> |
| <div class="line"><a name="l00042"></a><span class="lineno"> 42</span> <span class="keyword">class </span>Node;</div> |
| <div class="line"><a name="l00043"></a><span class="lineno"> 43</span> <span class="keyword">struct </span>NodeAttrs;</div> |
| <div class="line"><a name="l00044"></a><span class="lineno"> 44</span> <span class="keyword">template</span> <<span class="keyword">typename</span> ValueType></div> |
| <div class="line"><a name="l00045"></a><span class="lineno"><a class="line" href="classnnvm_1_1OpMap.html"> 45</a></span> <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> <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> <span class="keyword">class </span>OpRegistryEntry;</div> |
| <div class="line"><a name="l00048"></a><span class="lineno"> 48</span> <span class="keyword">using</span> dmlc::ParamFieldInfo;</div> |
| <div class="line"><a name="l00049"></a><span class="lineno"> 49</span>  </div> |
| <div class="line"><a name="l00051"></a><span class="lineno"> 51</span> <span class="keyword">static</span> <span class="keyword">const</span> uint32_t kVarg = std::numeric_limits<uint32_t>::max();</div> |
| <div class="line"><a name="l00052"></a><span class="lineno"> 52</span>  </div> |
| <div class="line"><a name="l00105"></a><span class="lineno"><a class="line" href="classnnvm_1_1Op.html"> 105</a></span> <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>  <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>  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>  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>  <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>  std::vector<ParamFieldInfo> <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>  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>  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>  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>  std::function<uint32_t(<span class="keyword">const</span> <a class="code" href="structnnvm_1_1NodeAttrs.html">NodeAttrs</a>& attrs)> 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>  std::function<uint32_t(<span class="keyword">const</span> <a class="code" href="structnnvm_1_1NodeAttrs.html">NodeAttrs</a>& attrs)> 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>  std::function<void(<a class="code" href="structnnvm_1_1NodeAttrs.html">NodeAttrs</a>* attrs)> attr_parser = <span class="keyword">nullptr</span>;</div> |
| <div class="line"><a name="l00183"></a><span class="lineno"> 183</span>  <span class="comment">// function fields.</span></div> |
| <div class="line"><a name="l00190"></a><span class="lineno"> 190</span> <span class="comment"></span> <span class="keyword">inline</span> <a class="code" href="classnnvm_1_1Op.html">Op</a>& describe(<span class="keyword">const</span> std::string& descr); <span class="comment">// NOLINT(*)</span></div> |
| <div class="line"><a name="l00198"></a><span class="lineno"> 198</span> <span class="comment"></span> <span class="keyword">inline</span> <a class="code" href="classnnvm_1_1Op.html">Op</a>& add_argument(<span class="keyword">const</span> std::string& name, <span class="keyword">const</span> std::string& type,</div> |
| <div class="line"><a name="l00199"></a><span class="lineno"> 199</span>  <span class="keyword">const</span> std::string& description);</div> |
| <div class="line"><a name="l00205"></a><span class="lineno"> 205</span>  <span class="keyword">inline</span> <a class="code" href="classnnvm_1_1Op.html">Op</a>& add_arguments(<span class="keyword">const</span> std::vector<ParamFieldInfo>& args);</div> |
| <div class="line"><a name="l00211"></a><span class="lineno"> 211</span>  <span class="keyword">inline</span> <a class="code" href="classnnvm_1_1Op.html">Op</a>& set_num_inputs(uint32_t n); <span class="comment">// NOLINT(*)</span></div> |
| <div class="line"><a name="l00217"></a><span class="lineno"> 217</span> <span class="comment"></span> <span class="keyword">inline</span> <a class="code" href="classnnvm_1_1Op.html">Op</a>& set_support_level(uint32_t level); <span class="comment">// NOLINT(*)</span></div> |
| <div class="line"><a name="l00223"></a><span class="lineno"> 223</span> <span class="comment"></span> <span class="keyword">inline</span> <a class="code" href="classnnvm_1_1Op.html">Op</a>& set_num_inputs(std::function<uint32_t(<span class="keyword">const</span> <a class="code" href="structnnvm_1_1NodeAttrs.html">NodeAttrs</a>& attr)> fn); <span class="comment">// NOLINT(*)</span></div> |
| <div class="line"><a name="l00229"></a><span class="lineno"> 229</span> <span class="comment"></span> <span class="keyword">inline</span> <a class="code" href="classnnvm_1_1Op.html">Op</a>& set_num_outputs(uint32_t n); <span class="comment">// NOLINT(*)</span></div> |
| <div class="line"><a name="l00235"></a><span class="lineno"> 235</span> <span class="comment"></span> <span class="keyword">inline</span> <a class="code" href="classnnvm_1_1Op.html">Op</a>& set_num_outputs(std::function<uint32_t(<span class="keyword">const</span> <a class="code" href="structnnvm_1_1NodeAttrs.html">NodeAttrs</a>& attr)> fn); <span class="comment">// NOLINT(*)</span></div> |
| <div class="line"><a name="l00241"></a><span class="lineno"> 241</span> <span class="comment"></span> <span class="keyword">inline</span> <a class="code" href="classnnvm_1_1Op.html">Op</a>& set_attr_parser(std::function<<span class="keywordtype">void</span>(<a class="code" href="structnnvm_1_1NodeAttrs.html">NodeAttrs</a>* attrs)> fn); <span class="comment">// NOLINT(*)</span></div> |
| <div class="line"><a name="l00255"></a><span class="lineno"> 255</span> <span class="comment"></span> <span class="keyword">template</span> <<span class="keyword">typename</span> ValueType></div> |
| <div class="line"><a name="l00256"></a><span class="lineno"> 256</span>  <span class="keyword">inline</span> <a class="code" href="classnnvm_1_1Op.html">Op</a>& set_attr(<span class="keyword">const</span> std::string& attr_name, <span class="comment">// NOLINT(*)</span></div> |
| <div class="line"><a name="l00257"></a><span class="lineno"> 257</span>  <span class="keyword">const</span> ValueType& value, <span class="keywordtype">int</span> plevel = 10);</div> |
| <div class="line"><a name="l00264"></a><span class="lineno"> 264</span>  <a class="code" href="classnnvm_1_1Op.html">Op</a>& add_alias(<span class="keyword">const</span> std::string& alias); <span class="comment">// NOLINT(*)</span></div> |
| <div class="line"><a name="l00272"></a><span class="lineno"> 272</span> <span class="comment"></span> <a class="code" href="classnnvm_1_1Op.html">Op</a>& include(<span class="keyword">const</span> std::string& group_name);</div> |
| <div class="line"><a name="l00279"></a><span class="lineno"> 279</span>  <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& op_name);</div> |
| <div class="line"><a name="l00287"></a><span class="lineno"> 287</span>  <span class="keyword">template</span> <<span class="keyword">typename</span> ValueType></div> |
| <div class="line"><a name="l00288"></a><span class="lineno"> 288</span>  <span class="keyword">static</span> <span class="keyword">const</span> <a class="code" href="classnnvm_1_1OpMap.html">OpMap<ValueType></a>& GetAttr(<span class="keyword">const</span> std::string& attr_name);</div> |
| <div class="line"><a name="l00289"></a><span class="lineno"> 289</span>  </div> |
| <div class="line"><a name="l00290"></a><span class="lineno"> 290</span>  <span class="keyword">private</span>:</div> |
| <div class="line"><a name="l00291"></a><span class="lineno"> 291</span>  <span class="keyword">template</span> <<span class="keyword">typename</span> ValueType></div> |
| <div class="line"><a name="l00292"></a><span class="lineno"><a class="line" href="classnnvm_1_1Op.html#afcf7d46a60dd033ce159ceceec21db70"> 292</a></span>  <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>  <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>  <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="classdmlc_1_1Registry.html">dmlc::Registry</a><<a class="code" href="classnnvm_1_1Op.html">Op</a>>;</div> |
| <div class="line"><a name="l00295"></a><span class="lineno"> 295</span>  <span class="comment">// Program internal unique index of operator.</span></div> |
| <div class="line"><a name="l00296"></a><span class="lineno"> 296</span>  <span class="comment">// Used to help index the program.</span></div> |
| <div class="line"><a name="l00297"></a><span class="lineno"> 297</span>  uint32_t index_{0};</div> |
| <div class="line"><a name="l00298"></a><span class="lineno"> 298</span>  <span class="comment">// internal constructor</span></div> |
| <div class="line"><a name="l00299"></a><span class="lineno"> 299</span>  <a class="code" href="namespacemxnet.html#ac2fb286fd7ddfbc7af1456f6c7a7ee52">Op</a>();</div> |
| <div class="line"><a name="l00300"></a><span class="lineno"> 300</span>  <span class="comment">// get const reference to certain attribute</span></div> |
| <div class="line"><a name="l00301"></a><span class="lineno"> 301</span>  <span class="keyword">static</span> <span class="keyword">const</span> any* GetAttrMap(<span class="keyword">const</span> std::string& key);</div> |
| <div class="line"><a name="l00302"></a><span class="lineno"> 302</span>  <span class="comment">// update the attribute OpMap</span></div> |
| <div class="line"><a name="l00303"></a><span class="lineno"> 303</span>  <span class="keyword">static</span> <span class="keywordtype">void</span> UpdateAttrMap(<span class="keyword">const</span> std::string& key, std::function<<span class="keywordtype">void</span>(any*)> updater);</div> |
| <div class="line"><a name="l00304"></a><span class="lineno"> 304</span>  <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>  <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>  <span class="comment">// include the corresponding group.</span></div> |
| <div class="line"><a name="l00307"></a><span class="lineno"> 307</span>  <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>  <span class="comment">// that calls include</span></div> |
| <div class="line"><a name="l00309"></a><span class="lineno"> 309</span>  <span class="keyword">static</span> <span class="keywordtype">void</span> AddGroupTrigger(<span class="keyword">const</span> std::string& group_name, std::function<<span class="keywordtype">void</span>(<a class="code" href="classnnvm_1_1Op.html">Op</a>*)> trigger);</div> |
| <div class="line"><a name="l00310"></a><span class="lineno"> 310</span> };</div> |
| <div class="line"><a name="l00311"></a><span class="lineno"> 311</span>  </div> |
| <div class="line"><a name="l00317"></a><span class="lineno"> 317</span> <span class="keyword">template</span> <<span class="keyword">typename</span> ValueType></div> |
| <div class="line"><a name="l00318"></a><span class="lineno"> 318</span> <span class="keyword">class </span>OpMap {</div> |
| <div class="line"><a name="l00319"></a><span class="lineno"> 319</span>  <span class="keyword">public</span>:</div> |
| <div class="line"><a name="l00325"></a><span class="lineno"> 325</span>  <span class="keyword">inline</span> <span class="keyword">const</span> ValueType& <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>  <span class="keyword">inline</span> <span class="keyword">const</span> ValueType& <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& def_value) <span class="keyword">const</span>;</div> |
| <div class="line"><a name="l00338"></a><span class="lineno"> 338</span>  <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>  </div> |
| <div class="line"><a name="l00345"></a><span class="lineno"> 345</span>  <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>  </div> |
| <div class="line"><a name="l00347"></a><span class="lineno"> 347</span>  <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>  <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>  <span class="comment">// internal attribute name</span></div> |
| <div class="line"><a name="l00350"></a><span class="lineno"> 350</span>  std::string attr_name_;</div> |
| <div class="line"><a name="l00351"></a><span class="lineno"> 351</span>  <span class="comment">// internal data</span></div> |
| <div class="line"><a name="l00352"></a><span class="lineno"> 352</span>  std::vector<std::pair<ValueType, int>> data_;</div> |
| <div class="line"><a name="l00353"></a><span class="lineno"> 353</span>  <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> };</div> |
| <div class="line"><a name="l00355"></a><span class="lineno"> 355</span>  </div> |
| <div class="line"><a name="l00360"></a><span class="lineno"><a class="line" href="classnnvm_1_1OpGroup.html"> 360</a></span> <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>  <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>  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>  <span class="keyword">template</span> <<span class="keyword">typename</span> ValueType></div> |
| <div class="line"><a name="l00378"></a><span class="lineno"> 378</span>  <span class="keyword">inline</span> <a class="code" href="classnnvm_1_1OpGroup.html">OpGroup</a>& <a class="code" href="classnnvm_1_1OpGroup.html#aa36a30a41675da76bb7469fbba5e8cab">set_attr</a>(<span class="keyword">const</span> std::string& attr_name, <span class="comment">// NOLINT(*)</span></div> |
| <div class="line"><a name="l00379"></a><span class="lineno"> 379</span>  <span class="keyword">const</span> ValueType& value, <span class="keywordtype">int</span> plevel = 1);</div> |
| <div class="line"><a name="l00380"></a><span class="lineno"> 380</span> };</div> |
| <div class="line"><a name="l00381"></a><span class="lineno"> 381</span>  </div> |
| <div class="line"><a name="l00382"></a><span class="lineno"> 382</span> <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> <span class="preprocessor">#define NNVM_REGISTER_VAR_DEF(OpName) \</span></div> |
| <div class="line"><a name="l00384"></a><span class="lineno"> 384</span> <span class="preprocessor"> static DMLC_ATTRIBUTE_UNUSED ::nnvm::Op& __make_##NnvmOp##_##OpName</span></div> |
| <div class="line"><a name="l00385"></a><span class="lineno"> 385</span>  </div> |
| <div class="line"><a name="l00386"></a><span class="lineno"><a class="line" href="op_8h.html#ab2b4f84c6934f76a7084c22ae8464766"> 386</a></span> <span class="preprocessor">#define NNVM_REGISTER_GVAR_DEF(TagName) \</span></div> |
| <div class="line"><a name="l00387"></a><span class="lineno"> 387</span> <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>  </div> |
| <div class="line"><a name="l00404"></a><span class="lineno"><a class="line" href="op_8h.html#aacfc49292e41582dd1bba725ece160ae"> 404</a></span> <span class="preprocessor">#define NNVM_REGISTER_OP(OpName) \</span></div> |
| <div class="line"><a name="l00405"></a><span class="lineno"> 405</span> <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> <span class="preprocessor"> ::dmlc::Registry<::nnvm::Op>::Get()->__REGISTER_OR_GET__(#OpName)</span></div> |
| <div class="line"><a name="l00407"></a><span class="lineno"> 407</span>  </div> |
| <div class="line"><a name="l00429"></a><span class="lineno"><a class="line" href="op_8h.html#af0e87dbf2cd566db02e76ea77f14f20b"> 429</a></span> <span class="preprocessor">#define NNVM_REGISTER_OP_GROUP(GroupName) \</span></div> |
| <div class="line"><a name="l00430"></a><span class="lineno"> 430</span> <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>  </div> |
| <div class="line"><a name="l00432"></a><span class="lineno"> 432</span> <span class="comment">// implementations of template functions after this.</span></div> |
| <div class="line"><a name="l00433"></a><span class="lineno"> 433</span> <span class="comment">// member function of Op</span></div> |
| <div class="line"><a name="l00434"></a><span class="lineno"> 434</span> <span class="keyword">template</span> <<span class="keyword">typename</span> ValueType></div> |
| <div class="line"><a name="l00435"></a><span class="lineno"><a class="line" href="classnnvm_1_1Op.html#a97b65edf5226493f41f4a81e13e6abec"> 435</a></span> <span class="keyword">inline</span> <span class="keyword">const</span> <a class="code" href="classnnvm_1_1OpMap.html">OpMap<ValueType></a>& <a class="code" href="classnnvm_1_1Op.html#a97b65edf5226493f41f4a81e13e6abec">Op::GetAttr</a>(<span class="keyword">const</span> std::string& key) {</div> |
| <div class="line"><a name="l00436"></a><span class="lineno"> 436</span>  <span class="keyword">const</span> any* ref = GetAttrMap(key);</div> |
| <div class="line"><a name="l00437"></a><span class="lineno"> 437</span>  <span class="keywordflow">if</span> (ref == <span class="keyword">nullptr</span>) {</div> |
| <div class="line"><a name="l00438"></a><span class="lineno"> 438</span>  <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>  UpdateAttrMap(key, [key](any* pmap) {</div> |
| <div class="line"><a name="l00440"></a><span class="lineno"> 440</span>  <span class="comment">// use callback so it is in lockscope</span></div> |
| <div class="line"><a name="l00441"></a><span class="lineno"> 441</span>  <span class="keywordflow">if</span> (pmap->empty()) {</div> |
| <div class="line"><a name="l00442"></a><span class="lineno"> 442</span>  OpMap<ValueType> pm;</div> |
| <div class="line"><a name="l00443"></a><span class="lineno"> 443</span>  pm.attr_name_ = key;</div> |
| <div class="line"><a name="l00444"></a><span class="lineno"> 444</span>  *pmap = std::move(pm);</div> |
| <div class="line"><a name="l00445"></a><span class="lineno"> 445</span>  }</div> |
| <div class="line"><a name="l00446"></a><span class="lineno"> 446</span>  });</div> |
| <div class="line"><a name="l00447"></a><span class="lineno"> 447</span>  ref = GetAttrMap(key);</div> |
| <div class="line"><a name="l00448"></a><span class="lineno"> 448</span>  }</div> |
| <div class="line"><a name="l00449"></a><span class="lineno"> 449</span>  <span class="keywordflow">return</span> nnvm::get<OpMap<ValueType>>(*ref);</div> |
| <div class="line"><a name="l00450"></a><span class="lineno"> 450</span> }</div> |
| <div class="line"><a name="l00451"></a><span class="lineno"> 451</span>  </div> |
| <div class="line"><a name="l00452"></a><span class="lineno"> 452</span> <span class="keyword">template</span> <<span class="keyword">typename</span> ValueType></div> |
| <div class="line"><a name="l00453"></a><span class="lineno"><a class="line" href="classnnvm_1_1Op.html#a6ddb1adaac8e03ae1f66fc41ca927224"> 453</a></span> <span class="keyword">inline</span> <a class="code" href="classnnvm_1_1Op.html">Op</a>& <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>  <span class="keyword">const</span> std::string& attr_name, <span class="keyword">const</span> ValueType& value, <span class="keywordtype">int</span> plevel) {</div> |
| <div class="line"><a name="l00455"></a><span class="lineno"> 455</span>  CHECK_GT(plevel, 0) << <span class="stringliteral">"plevel in set_attr must be greater than 0"</span>;</div> |
| <div class="line"><a name="l00456"></a><span class="lineno"> 456</span>  <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>  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>  <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>  <span class="keywordflow">if</span> (pmap->empty()) {</div> |
| <div class="line"><a name="l00460"></a><span class="lineno"> 460</span>  OpMap<ValueType> pm;</div> |
| <div class="line"><a name="l00461"></a><span class="lineno"> 461</span>  pm.attr_name_ = attr_name;</div> |
| <div class="line"><a name="l00462"></a><span class="lineno"> 462</span>  *pmap = std::move(pm);</div> |
| <div class="line"><a name="l00463"></a><span class="lineno"> 463</span>  }</div> |
| <div class="line"><a name="l00464"></a><span class="lineno"> 464</span>  CHECK(pmap->type() == <span class="keyword">typeid</span>(<a class="code" href="classnnvm_1_1OpMap.html">OpMap<ValueType></a>))</div> |
| <div class="line"><a name="l00465"></a><span class="lineno"> 465</span>  << <span class="stringliteral">"Attribute "</span> << attr_name << <span class="stringliteral">" of operator "</span> << this->name</div> |
| <div class="line"><a name="l00466"></a><span class="lineno"> 466</span>  << <span class="stringliteral">" is registered as inconsistent types"</span></div> |
| <div class="line"><a name="l00467"></a><span class="lineno"> 467</span>  << <span class="stringliteral">" previously "</span> << pmap->type().name() << <span class="stringliteral">" current "</span> << <span class="keyword">typeid</span>(<a class="code" href="classnnvm_1_1OpMap.html">OpMap<ValueType></a>).name();</div> |
| <div class="line"><a name="l00468"></a><span class="lineno"> 468</span>  std::vector<std::pair<ValueType, int>>& vec = nnvm::get<<a class="code" href="classnnvm_1_1OpMap.html">OpMap<ValueType></a>>(*pmap).data_;</div> |
| <div class="line"><a name="l00469"></a><span class="lineno"> 469</span>  <span class="comment">// resize the value type.</span></div> |
| <div class="line"><a name="l00470"></a><span class="lineno"> 470</span>  if (vec.size() <= index_) {</div> |
| <div class="line"><a name="l00471"></a><span class="lineno"> 471</span>  vec.resize(index_ + 1, std::make_pair(ValueType(), 0));</div> |
| <div class="line"><a name="l00472"></a><span class="lineno"> 472</span>  }</div> |
| <div class="line"><a name="l00473"></a><span class="lineno"> 473</span>  std::pair<ValueType, int>& p = vec[index_];</div> |
| <div class="line"><a name="l00474"></a><span class="lineno"> 474</span>  CHECK(p.second != plevel) << <span class="stringliteral">"Attribute "</span> << attr_name << <span class="stringliteral">" of operator "</span> << this->name</div> |
| <div class="line"><a name="l00475"></a><span class="lineno"> 475</span>  << <span class="stringliteral">" is already registered with same plevel="</span> << plevel;</div> |
| <div class="line"><a name="l00476"></a><span class="lineno"> 476</span>  if (p.second < plevel) {</div> |
| <div class="line"><a name="l00477"></a><span class="lineno"> 477</span>  vec[index_] = std::make_pair(value, plevel);</div> |
| <div class="line"><a name="l00478"></a><span class="lineno"> 478</span>  }</div> |
| <div class="line"><a name="l00479"></a><span class="lineno"> 479</span>  });</div> |
| <div class="line"><a name="l00480"></a><span class="lineno"> 480</span>  <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div> |
| <div class="line"><a name="l00481"></a><span class="lineno"> 481</span> }</div> |
| <div class="line"><a name="l00482"></a><span class="lineno"> 482</span>  </div> |
| <div class="line"><a name="l00483"></a><span class="lineno"><a class="line" href="classnnvm_1_1Op.html#abab5b3bef4265a194fced208f2e8292b"> 483</a></span> <span class="keyword">inline</span> <a class="code" href="classnnvm_1_1Op.html">Op</a>& <a class="code" href="classnnvm_1_1Op.html#abab5b3bef4265a194fced208f2e8292b">Op::describe</a>(<span class="keyword">const</span> std::string& descr) { <span class="comment">// NOLINT(*)</span></div> |
| <div class="line"><a name="l00484"></a><span class="lineno"> 484</span>  this->description = descr;</div> |
| <div class="line"><a name="l00485"></a><span class="lineno"> 485</span>  <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div> |
| <div class="line"><a name="l00486"></a><span class="lineno"> 486</span> }</div> |
| <div class="line"><a name="l00487"></a><span class="lineno"> 487</span>  </div> |
| <div class="line"><a name="l00488"></a><span class="lineno"><a class="line" href="classnnvm_1_1Op.html#a36256680ebbb00708381115c5b8ab817"> 488</a></span> <span class="keyword">inline</span> <a class="code" href="classnnvm_1_1Op.html">Op</a>& <a class="code" href="classnnvm_1_1Op.html#a36256680ebbb00708381115c5b8ab817">Op::add_argument</a>(<span class="keyword">const</span> std::string& name, <span class="keyword">const</span> std::string& type,</div> |
| <div class="line"><a name="l00489"></a><span class="lineno"> 489</span>  <span class="keyword">const</span> std::string& description) {</div> |
| <div class="line"><a name="l00490"></a><span class="lineno"> 490</span>  <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>  <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div> |
| <div class="line"><a name="l00492"></a><span class="lineno"> 492</span> }</div> |
| <div class="line"><a name="l00493"></a><span class="lineno"> 493</span>  </div> |
| <div class="line"><a name="l00494"></a><span class="lineno"><a class="line" href="classnnvm_1_1Op.html#ad3d42bec8afaf4e50d59be89a1795035"> 494</a></span> <span class="keyword">inline</span> <a class="code" href="classnnvm_1_1Op.html">Op</a>& <a class="code" href="classnnvm_1_1Op.html#ad3d42bec8afaf4e50d59be89a1795035">Op::add_arguments</a>(<span class="keyword">const</span> std::vector<ParamFieldInfo>& args) {</div> |
| <div class="line"><a name="l00495"></a><span class="lineno"> 495</span>  this->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>  <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div> |
| <div class="line"><a name="l00497"></a><span class="lineno"> 497</span> }</div> |
| <div class="line"><a name="l00498"></a><span class="lineno"> 498</span>  </div> |
| <div class="line"><a name="l00499"></a><span class="lineno"><a class="line" href="classnnvm_1_1Op.html#a2db3c272965df71f1e592ea30a1c824a"> 499</a></span> <span class="keyword">inline</span> <a class="code" href="classnnvm_1_1Op.html">Op</a>& <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>  this->num_inputs = n;</div> |
| <div class="line"><a name="l00501"></a><span class="lineno"> 501</span>  <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div> |
| <div class="line"><a name="l00502"></a><span class="lineno"> 502</span> }</div> |
| <div class="line"><a name="l00503"></a><span class="lineno"> 503</span>  </div> |
| <div class="line"><a name="l00504"></a><span class="lineno"><a class="line" href="classnnvm_1_1Op.html#aa9ec331b85b57d31951c4bd3ff8a1473"> 504</a></span> <span class="keyword">inline</span> <a class="code" href="classnnvm_1_1Op.html">Op</a>& <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>  this->support_level = n;</div> |
| <div class="line"><a name="l00506"></a><span class="lineno"> 506</span>  <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div> |
| <div class="line"><a name="l00507"></a><span class="lineno"> 507</span> }</div> |
| <div class="line"><a name="l00508"></a><span class="lineno"> 508</span>  </div> |
| <div class="line"><a name="l00509"></a><span class="lineno"><a class="line" href="classnnvm_1_1Op.html#aab25f32ae369dc760f73ca75caa17f2d"> 509</a></span> <span class="keyword">inline</span> <a class="code" href="classnnvm_1_1Op.html">Op</a>& <a class="code" href="classnnvm_1_1Op.html#a2db3c272965df71f1e592ea30a1c824a">Op::set_num_inputs</a>(std::function<uint32_t(<span class="keyword">const</span> <a class="code" href="structnnvm_1_1NodeAttrs.html">NodeAttrs</a>& attr)> fn) { <span class="comment">// NOLINT(*)</span></div> |
| <div class="line"><a name="l00510"></a><span class="lineno"> 510</span>  this->get_num_inputs = fn;</div> |
| <div class="line"><a name="l00511"></a><span class="lineno"> 511</span>  <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div> |
| <div class="line"><a name="l00512"></a><span class="lineno"> 512</span> }</div> |
| <div class="line"><a name="l00513"></a><span class="lineno"> 513</span>  </div> |
| <div class="line"><a name="l00514"></a><span class="lineno"><a class="line" href="classnnvm_1_1Op.html#a034baf61a5f396d400073433e92bea51"> 514</a></span> <span class="keyword">inline</span> <a class="code" href="classnnvm_1_1Op.html">Op</a>& <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>  this->num_outputs = n;</div> |
| <div class="line"><a name="l00516"></a><span class="lineno"> 516</span>  <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div> |
| <div class="line"><a name="l00517"></a><span class="lineno"> 517</span> }</div> |
| <div class="line"><a name="l00518"></a><span class="lineno"> 518</span>  </div> |
| <div class="line"><a name="l00519"></a><span class="lineno"><a class="line" href="classnnvm_1_1Op.html#aa7b1b4661e24f8d9ca02c13443cbf6b6"> 519</a></span> <span class="keyword">inline</span> <a class="code" href="classnnvm_1_1Op.html">Op</a>& <a class="code" href="classnnvm_1_1Op.html#a034baf61a5f396d400073433e92bea51">Op::set_num_outputs</a>(std::function<uint32_t(<span class="keyword">const</span> <a class="code" href="structnnvm_1_1NodeAttrs.html">NodeAttrs</a>& attr)> fn) { <span class="comment">// NOLINT(*)</span></div> |
| <div class="line"><a name="l00520"></a><span class="lineno"> 520</span>  this->get_num_outputs = fn;</div> |
| <div class="line"><a name="l00521"></a><span class="lineno"> 521</span>  <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div> |
| <div class="line"><a name="l00522"></a><span class="lineno"> 522</span> }</div> |
| <div class="line"><a name="l00523"></a><span class="lineno"> 523</span>  </div> |
| <div class="line"><a name="l00524"></a><span class="lineno"><a class="line" href="classnnvm_1_1Op.html#a3af40f342a817a47f1fb7769ab0866ea"> 524</a></span> <span class="keyword">inline</span> <a class="code" href="classnnvm_1_1Op.html">Op</a>& <a class="code" href="classnnvm_1_1Op.html#a3af40f342a817a47f1fb7769ab0866ea">Op::set_attr_parser</a>(std::function<<span class="keywordtype">void</span>(<a class="code" href="structnnvm_1_1NodeAttrs.html">NodeAttrs</a>* attrs)> fn) { <span class="comment">// NOLINT(*)</span></div> |
| <div class="line"><a name="l00525"></a><span class="lineno"> 525</span>  this->attr_parser = fn;</div> |
| <div class="line"><a name="l00526"></a><span class="lineno"> 526</span>  <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div> |
| <div class="line"><a name="l00527"></a><span class="lineno"> 527</span> }</div> |
| <div class="line"><a name="l00528"></a><span class="lineno"> 528</span>  </div> |
| <div class="line"><a name="l00529"></a><span class="lineno"> 529</span> <span class="comment">// member functions of OpMap</span></div> |
| <div class="line"><a name="l00530"></a><span class="lineno"> 530</span> <span class="keyword">template</span> <<span class="keyword">typename</span> ValueType></div> |
| <div class="line"><a name="l00531"></a><span class="lineno"><a class="line" href="classnnvm_1_1OpMap.html#ac6a63fc055c4cfdb9520c64e08cce073"> 531</a></span> <span class="keyword">inline</span> <span class="keywordtype">int</span> <a class="code" href="classnnvm_1_1OpMap.html#ac6a63fc055c4cfdb9520c64e08cce073">OpMap<ValueType>::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>  <span class="keywordflow">if</span> (contains(op)) {</div> |
| <div class="line"><a name="l00533"></a><span class="lineno"> 533</span>  <span class="keywordflow">return</span> 1;</div> |
| <div class="line"><a name="l00534"></a><span class="lineno"> 534</span>  } <span class="keywordflow">else</span> {</div> |
| <div class="line"><a name="l00535"></a><span class="lineno"> 535</span>  <span class="keywordflow">return</span> 0;</div> |
| <div class="line"><a name="l00536"></a><span class="lineno"> 536</span>  }</div> |
| <div class="line"><a name="l00537"></a><span class="lineno"> 537</span> }</div> |
| <div class="line"><a name="l00538"></a><span class="lineno"> 538</span>  </div> |
| <div class="line"><a name="l00539"></a><span class="lineno"> 539</span> <span class="keyword">template</span> <<span class="keyword">typename</span> ValueType></div> |
| <div class="line"><a name="l00540"></a><span class="lineno"><a class="line" href="classnnvm_1_1OpMap.html#a28dd027285b5dbba7a813307993712b2"> 540</a></span> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="classnnvm_1_1OpMap.html#a28dd027285b5dbba7a813307993712b2">OpMap<ValueType>::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>  <span class="keywordflow">if</span> (op == <span class="keyword">nullptr</span>) {</div> |
| <div class="line"><a name="l00542"></a><span class="lineno"> 542</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> |
| <div class="line"><a name="l00543"></a><span class="lineno"> 543</span>  }</div> |
| <div class="line"><a name="l00544"></a><span class="lineno"> 544</span>  <span class="keyword">const</span> uint32_t idx = op->index_;</div> |
| <div class="line"><a name="l00545"></a><span class="lineno"> 545</span>  <span class="keywordflow">return</span> idx < data_.size() ? (data_[idx].second != 0) : <span class="keyword">false</span>;</div> |
| <div class="line"><a name="l00546"></a><span class="lineno"> 546</span> }</div> |
| <div class="line"><a name="l00547"></a><span class="lineno"> 547</span>  </div> |
| <div class="line"><a name="l00548"></a><span class="lineno"> 548</span> <span class="keyword">template</span> <<span class="keyword">typename</span> ValueType></div> |
| <div class="line"><a name="l00549"></a><span class="lineno"><a class="line" href="classnnvm_1_1OpMap.html#a8d2b7f1f25f7905d6d442297d76f4bee"> 549</a></span> <span class="keyword">inline</span> <span class="keyword">const</span> ValueType& <a class="code" href="classnnvm_1_1OpMap.html#a8d2b7f1f25f7905d6d442297d76f4bee">OpMap<ValueType>::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>  CHECK(op != <span class="keyword">nullptr</span>);</div> |
| <div class="line"><a name="l00551"></a><span class="lineno"> 551</span>  <span class="keyword">const</span> uint32_t idx = op->index_;</div> |
| <div class="line"><a name="l00552"></a><span class="lineno"> 552</span>  CHECK(idx < data_.size() && data_[idx].second)</div> |
| <div class="line"><a name="l00553"></a><span class="lineno"> 553</span>  << <span class="stringliteral">"Attribute "</span> << attr_name_ << <span class="stringliteral">" has not been registered for Operator "</span> << op-><a class="code" href="classnnvm_1_1Op.html#af67a5d6998765023aeed6761df292b6c">name</a>;</div> |
| <div class="line"><a name="l00554"></a><span class="lineno"> 554</span>  <span class="keywordflow">return</span> data_[idx].first;</div> |
| <div class="line"><a name="l00555"></a><span class="lineno"> 555</span> }</div> |
| <div class="line"><a name="l00556"></a><span class="lineno"> 556</span>  </div> |
| <div class="line"><a name="l00557"></a><span class="lineno"> 557</span> <span class="keyword">template</span> <<span class="keyword">typename</span> ValueType></div> |
| <div class="line"><a name="l00558"></a><span class="lineno"><a class="line" href="classnnvm_1_1OpMap.html#a74aecc7ed4873b2a3012e0a9673dd2bc"> 558</a></span> <span class="keyword">inline</span> <span class="keyword">const</span> ValueType& <a class="code" href="classnnvm_1_1OpMap.html#a74aecc7ed4873b2a3012e0a9673dd2bc">OpMap<ValueType>::get</a>(<span class="keyword">const</span> <a class="code" href="classnnvm_1_1Op.html">Op</a>* op, <span class="keyword">const</span> ValueType& def_value)<span class="keyword"> const </span>{</div> |
| <div class="line"><a name="l00559"></a><span class="lineno"> 559</span>  <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>  <span class="keyword">const</span> uint32_t idx = op->index_;</div> |
| <div class="line"><a name="l00561"></a><span class="lineno"> 561</span>  <span class="keywordflow">if</span> (idx < data_.size() && data_[idx].second) {</div> |
| <div class="line"><a name="l00562"></a><span class="lineno"> 562</span>  <span class="keywordflow">return</span> data_[idx].first;</div> |
| <div class="line"><a name="l00563"></a><span class="lineno"> 563</span>  } <span class="keywordflow">else</span> {</div> |
| <div class="line"><a name="l00564"></a><span class="lineno"> 564</span>  <span class="keywordflow">return</span> def_value;</div> |
| <div class="line"><a name="l00565"></a><span class="lineno"> 565</span>  }</div> |
| <div class="line"><a name="l00566"></a><span class="lineno"> 566</span> }</div> |
| <div class="line"><a name="l00567"></a><span class="lineno"> 567</span>  </div> |
| <div class="line"><a name="l00568"></a><span class="lineno"> 568</span> <span class="keyword">template</span> <<span class="keyword">typename</span> ValueType></div> |
| <div class="line"><a name="l00569"></a><span class="lineno"><a class="line" href="classnnvm_1_1OpGroup.html#aa36a30a41675da76bb7469fbba5e8cab"> 569</a></span> <span class="keyword">inline</span> <a class="code" href="classnnvm_1_1OpGroup.html">OpGroup</a>& <a class="code" href="classnnvm_1_1OpGroup.html#aa36a30a41675da76bb7469fbba5e8cab">OpGroup::set_attr</a>(<span class="keyword">const</span> std::string& attr_name, <span class="keyword">const</span> ValueType& value,</div> |
| <div class="line"><a name="l00570"></a><span class="lineno"> 570</span>  <span class="keywordtype">int</span> plevel) {</div> |
| <div class="line"><a name="l00571"></a><span class="lineno"> 571</span>  <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>  op-><a class="code" href="classnnvm_1_1OpGroup.html#aa36a30a41675da76bb7469fbba5e8cab">set_attr</a><ValueType>(attr_name, value, plevel);</div> |
| <div class="line"><a name="l00573"></a><span class="lineno"> 573</span>  };</div> |
| <div class="line"><a name="l00574"></a><span class="lineno"> 574</span>  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>  <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div> |
| <div class="line"><a name="l00576"></a><span class="lineno"> 576</span> }</div> |
| <div class="line"><a name="l00577"></a><span class="lineno"> 577</span>  </div> |
| <div class="line"><a name="l00578"></a><span class="lineno"> 578</span> } <span class="comment">// namespace nnvm</span></div> |
| <div class="line"><a name="l00579"></a><span class="lineno"> 579</span>  </div> |
| <div class="line"><a name="l00580"></a><span class="lineno"> 580</span> <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 & get(const Op *op, const ValueType &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 & add_arguments(const std::vector< ParamFieldInfo > &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< ParamFieldInfo > 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 & set_attr(const std::string &attr_name, const ValueType &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 & add_argument(const std::string &name, const std::string &type, const std::string &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 & set_attr(const std::string &attr_name, const ValueType &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< ValueType > & GetAttr(const std::string &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 & set_attr_parser(std::function< void(NodeAttrs *attrs)> 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 & 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 & describe(const std::string &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 & 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 & 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 & 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 Sat Nov 5 2022 01:16:57 for mxnet by  <a href="http://www.doxygen.org/index.html"> |
| <img class="footer" src="doxygen.png" alt="doxygen"/> |
| </a> 1.8.17 |
| </small></address> |
| </body> |
| </html> |