<html><body bgcolor="#FFFFFF"><div><br></div><blockquote type="cite"><div><span id="OLK_SRC_BODY_SECTION"><div><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; color: rgb(0, 0, 0); font-size: 20px; font-family: Calibri, sans-serif; ">
<div style="color: rgb(0, 0, 0); font-family: Calibri, sans-serif; font-size: 20px; ">Dear all,</div><div style="color: rgb(0, 0, 0); font-family: Calibri, sans-serif; font-size: 20px; "><br></div><div style="color: rgb(0, 0, 0); font-family: Calibri, sans-serif; font-size: 20px; ">
I&#39;m rewriting the AMORE package using Rcpp --- in fact it&#39;s more like I&#39;m having a lot of fun while rewriting the AMORE package thanks to Rcpp.</div><div style="color: rgb(0, 0, 0); font-family: Calibri, sans-serif; font-size: 20px; ">
Nevertheless, I&#39;m facing this little problem that I hope it would be pretty easy for you to solve.</div><div style="color: rgb(0, 0, 0); font-family: Calibri, sans-serif; font-size: 20px; "> </div><div><p style="color: rgb(0, 0, 0); font-family: Calibri, sans-serif; font-size: 20px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 14px/normal Monaco; min-height: 19px; ">
Let&#39;s consider the C++ function Tanh_f0 </p><p style="font-family: Calibri, sans-serif; font-size: 20px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 14px/normal Monaco; color: rgb(86, 85, 186); ">
<span class="Apple-tab-span" style="white-space:pre">                        </span></p><p style="font-family: Calibri, sans-serif; font-size: 20px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 14px/normal Monaco; color: rgb(86, 85, 186); ">
<span class="Apple-tab-span" style="white-space:pre">                        </span>double</p><p style="font-family: Calibri, sans-serif; font-size: 20px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 14px/normal Monaco; color: rgb(86, 85, 186); ">
<span class="Apple-tab-span" style="white-space:pre">                        </span>Tanh_f0(double inducedLocalField)</p><p style="font-family: Calibri, sans-serif; font-size: 20px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 14px/normal Monaco; color: rgb(86, 85, 186); ">
<span class="Apple-tab-span" style="white-space:pre">                        </span>  {</p><p style="font-family: Calibri, sans-serif; font-size: 20px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 14px/normal Monaco; color: rgb(86, 85, 186); ">
<span class="Apple-tab-span" style="white-space:pre">                        </span>    return tanh(inducedLocalField);</p><p style="font-family: Calibri, sans-serif; font-size: 20px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 14px/normal Monaco; color: rgb(86, 85, 186); ">
<span class="Apple-tab-span" style="white-space:pre">                        </span>  }</p><p style="font-family: Calibri, sans-serif; font-size: 20px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 14px/normal Monaco; color: rgb(86, 85, 186); ">
<br></p><p style="font-family: Calibri, sans-serif; font-size: 20px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 14px/normal Monaco; color: rgb(86, 85, 186); "><span class="Apple-style-span" style="color: rgb(0, 0, 0); ">After compilation using inline, Tanh_f0 is exposed to R using Module and accessible through actMod$Tanh_f0</span><span class="Apple-tab-span" style="white-space:pre">        </span></p>
<p style="color: rgb(0, 0, 0); font-family: Calibri, sans-serif; font-size: 20px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 14px/normal Monaco; min-height: 19px; ">
<br></p><p style="color: rgb(0, 0, 0); font-family: Calibri, sans-serif; font-size: 20px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 14px/normal Monaco; "><span class="Apple-tab-span" style="white-space:pre">        </span>actMod<span style="color: #4f7272">$</span>Tanh_f0(<span style="color: #15148f">0.1</span>)</p>
<p style="color: rgb(0, 0, 0); font-family: Calibri, sans-serif; font-size: 20px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 14px/normal Monaco; "><span class="Apple-style-span" style="color: rgb(75, 144, 100); "><span style="color: #000000"><span class="Apple-tab-span" style="white-space:pre">        </span></span># [1] 0.09966799</span></p>
<p style="font-family: Calibri, sans-serif; font-size: 20px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 14px/normal Monaco; "><br></p><p style="color: rgb(0, 0, 0); font-family: Calibri, sans-serif; font-size: 20px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 14px/normal Monaco; ">
Now, I want to pass actMod<span class="Apple-style-span" style="font-family: Monaco; font-size: 14px; "><span style="color: rgb(79, 114, 114); ">$</span></span><span class="Apple-style-span" style="font-family: Monaco; font-size: 14px; ">Tanh_f0 as a parameter of a function in order to use the original C++ function Tanh_f0.</span></p>
<p style="color: rgb(0, 0, 0); font-family: Calibri, sans-serif; font-size: 20px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 14px/normal Monaco; "><span class="Apple-style-span" style="font-family: Monaco; font-size: 14px; "><br>
</span></p><p style="color: rgb(0, 0, 0); font-family: Calibri, sans-serif; font-size: 20px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 14px/normal Monaco; "><br></p>
<p style="color: rgb(0, 0, 0); font-family: Calibri, sans-serif; font-size: 20px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 14px/normal Monaco; "></p><p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco">
testCode &lt;- <span style="color: #5655ba">&#39; </span><span class="Apple-style-span" style="color: rgb(86, 85, 186); "><span class="Apple-tab-span" style="white-space:pre">        </span>Rcpp::Function fx (myfun);</span></p><p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco; color: #5655ba">
<span class="Apple-tab-span" style="white-space:pre">                </span>double result = as&lt;double&gt;(fx(x)); </p><p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco; color: #5655ba"><span class="Apple-tab-span" style="white-space:pre">                </span>return wrap( result );</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco; color: #5655ba"><span class="Apple-tab-span" style="white-space:pre">        </span>    &#39;</p><p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco">usingTanhf0 &lt;- cfunction(sig=signature(myfun=<span style="color: #5655ba">&quot;function&quot;</span>, x=<span style="color: #5655ba">&quot;numeric&quot;</span>), body=testCode,…)</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"><br></p><p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco">And that indeed works, but when compared to using a simple tanh function it shows quite a bad performance.</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco; min-height: 19.0px"><br></p><p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco; min-height: 19.0px"><br></p><p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco">
testCode &lt;- <span style="color: #5655ba">&#39; <span class="Apple-tab-span" style="white-space:pre">        </span></span><span class="Apple-style-span" style="color: rgb(86, 85, 186); ">double value = as&lt;double&gt;(x);</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco; color: #5655ba"><span class="Apple-tab-span" style="white-space:pre">                </span>double result = tanh(value); </p><p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco; color: #5655ba">
<span class="Apple-tab-span" style="white-space:pre">                </span>return wrap( result );</p><p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco; color: #5655ba"><span class="Apple-tab-span" style="white-space:pre">        </span>    &#39;</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco; min-height: 19.0px"><br></p><p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco">usingTanh &lt;- cfunction(sig=signature(x=<span style="color: #5655ba">&quot;numeric&quot;</span>), body=testCode, … )</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco; min-height: 19.0px"><span class="Apple-tab-span" style="white-space:pre">        </span></p><p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"><span class="Apple-tab-span" style="white-space:pre">        </span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco">benchmark(usingTanhf0(myfun=actMod<span style="color: #4f7272">$</span>Tanh_f0, x=<span style="color: #15148f">0.1</span>) , usingTanh( x=<span style="color: #15148f">0.1</span>), columns=c(<span style="color: #5655ba">&quot;test&quot;</span>, <span style="color: #5655ba">&quot;replications&quot;</span>, <span style="color: #5655ba">&quot;elapsed&quot;</span>, <span style="color: #5655ba">&quot;relative&quot;</span>), order=<span style="color: #5655ba">&quot;relative&quot;</span>, replications=<span style="color: #15148f">1000</span>)</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco; color: #4b9064"><span style="color: #000000"><span class="Apple-tab-span" style="white-space:pre">        </span></span>#                                           test replications elapsed relative</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco; color: #4b9064"><span style="color: #000000"><span class="Apple-tab-span" style="white-space:pre">        </span></span># 2                           usingTanh(x = 0.1)         1000   0.004        1</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco; color: #4b9064"><span style="color: #000000"><span class="Apple-tab-span" style="white-space:pre">        </span></span># 1 usingTanhf0(myfun = actMod$Tanh_f0, x = 0.1)         1000   0.080       20</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco; min-height: 19.0px"><br></p><p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco; min-height: 19.0px">Looks like having to go the R way to get access to Tanh_f0 has a high cost. In order to be faster, it would be great if I could have access to the original Tanh_f0 which I guess is pointed to by  actMod$Tanh_f0, may be at the address <span class="Apple-style-span" style="color: rgb(75, 144, 100); ">0x100153d30 ?</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco; min-height: 19.0px"></p><p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"><br></p><p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco">
<span class="Apple-tab-span" style="white-space:pre">        </span>actMod<span style="color: #4f7272">$</span>Tanh_f0</p><p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco; color: #4b9064"><span style="color: #000000"><span class="Apple-tab-span" style="white-space:pre">        </span></span># internal C++ function &lt;0x100153d30&gt;</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco; color: #4b9064"><span style="color: #000000"><span class="Apple-tab-span" style="white-space:pre">        </span></span>#     signature : double Tanh_f0(double)</p>
<div><br></div><p></p><div>After having had a look at RppDE sources, I guess the solution would be to pass the function as an external pointer; something like :</div><div><br></div><div><p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco">
<span class="Apple-tab-span" style="white-space:pre">        </span>testCode &lt;- <span style="color: #5655ba">&#39; </span></p><p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco; color: #5655ba"><span class="Apple-tab-span" style="white-space:pre">                        </span>typedef double (*funPtr)(double) ;</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco; color: #5655ba"><span class="Apple-tab-span" style="white-space:pre">                        </span>Rcpp::XPtr&lt;  funPtr &gt; fx (myfun);</p><p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco; color: #5655ba">
<span class="Apple-tab-span" style="white-space:pre">                        </span>double result = (*fx)(0.1); </p><p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco; color: #5655ba"><span class="Apple-tab-span" style="white-space:pre">                        </span>return wrap( result );</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco; color: #5655ba"><span class="Apple-tab-span" style="white-space:pre">                        </span>&#39;</p><p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"><span class="Apple-tab-span" style="white-space:pre">        </span>testCodefun &lt;- cfunction(sig=signature(myfun=<span style="color: #5655ba">&quot;C++Function&quot;</span>), body=testCode,…)</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"><span class="Apple-tab-span" style="white-space:pre">        </span>result &lt;- testCodefun(myfun=actMod<span style="color: #4f7272">$</span>Tanh_f0)</p></div><div>
<br></div><div>But this does NOT work and crashes R.</div><div><br></div><div>Any hints?</div><div><br></div><div>Thank you for your patience in reading such long message!</div><div>Manuel</div><div><br></div><p></p></div>
<div style="color: rgb(0, 0, 0); font-family: Calibri, sans-serif; font-size: 20px; "><br></div><div style="color: rgb(0, 0, 0); font-family: Calibri, sans-serif; font-size: 20px; "><br></div></div></div></span>
</div></blockquote></body></html>