<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'm rewriting the AMORE package using Rcpp --- in fact it's more like I'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'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'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 <- <span style="color: #5655ba">' </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<double>(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> '</p><p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco">usingTanhf0 <- cfunction(sig=signature(myfun=<span style="color: #5655ba">"function"</span>, x=<span style="color: #5655ba">"numeric"</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 <- <span style="color: #5655ba">' <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<double>(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> '</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 <- cfunction(sig=signature(x=<span style="color: #5655ba">"numeric"</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">"test"</span>, <span style="color: #5655ba">"replications"</span>, <span style="color: #5655ba">"elapsed"</span>, <span style="color: #5655ba">"relative"</span>), order=<span style="color: #5655ba">"relative"</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 <0x100153d30></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 <- <span style="color: #5655ba">' </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< funPtr > 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>'</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 <- cfunction(sig=signature(myfun=<span style="color: #5655ba">"C++Function"</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 <- 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>