<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
</head>
<body>
<p>Dear Rcpp-devel,</p>
<p>Apologies in advance for the laborious problem statement. I hope
your experienced eyes will see a trivial mistake obscured to my
nascent ones. <br>
</p>
<p>We have a <a moz-do-not-send="true"
href="https://github.com/SugiharaLab/cppEDM#readme">C++ core
library</a> providing an API that is wrapped in R (Rcpp) and
Python (pybind11). <br>
</p>
<p>A new feature implements the addition of a boolean vector (<font
face="monospace">validLib</font>) as an API argument. <br>
</p>
<p>When adding this to one of the API functions (Simplex), there is
no issue. Note that Simplex returns a DataFrame class object. <br>
</p>
<p>When adding the same code to the API function SMap, which returns
a list, there seems to be a compiler error regarding the argument
as not allowed. (Error Log below). <br>
</p>
<p>sessionInfo is also listed below. <br>
</p>
<p>The same error (template argument deduction/substitution failed)
is found if I replace std::vector< bool > with
Rcpp::LogicalVector. <br>
</p>
<p>The code layout:</p>
<p>R API is accessed by R package user, function SMap() in R code
interface EDM.R. <br>
</p>
<p>SMap (R) calls the Rcpp wrapped function RtoCpp_SMap(), returning
a list of R data.frames.</p>
<p>RtoCpp_SMap() is mapped to SMap_rcpp() (cpp code in SMap.cpp) in
RcppEDMCommon.cpp.</p>
<p>The function SMap_rcpp() calls the C++ API function SMap().
Note, function (SMap) is overloaded. <br>
</p>
<p>In RcppEDMCommon.h a prototype is defined. In RcppEDMCommon.cpp
an argument list is defined: Protoype in RcppEDMCommon.h</p>
<p><font face="monospace">namespace r = Rcpp;<br>
</font></p>
<p><font face="monospace">r::List SMap_rcpp( std::string
pathIn,<br>
std::string dataFile,<br>
r::DataFrame dataList,<br>
std::string pathOut,<br>
std::string predictFile,<br>
std::string lib,<br>
std::string pred,<br>
int E,<br>
int Tp,<br>
int knn,<br>
int tau,<br>
double theta,<br>
int exclusionRadius,<br>
std::string columns,<br>
std::string target,<br>
std::string smapFile,<br>
std::string jacobians,<br>
bool embedded,<br>
bool const_predict,<br>
bool verbose,<br>
std::vector<bool> validLib );<br>
<br>
</font>Argument list in RcppEDMCommon.cpp:</p>
<p><font face="monospace">auto SMapArgs = r::List::create( <br>
r::_["pathIn"] = std::string("./"),<br>
r::_["dataFile"] = std::string("./"),<br>
r::_["dataFrame"] = r::DataFrame(),<br>
r::_["pathOut"] = std::string("./"),<br>
r::_["predictFile"] = std::string(""),<br>
r::_["lib"] = std::string(""),<br>
r::_["pred"] = std::string(""),<br>
r::_["E"] = 0,<br>
r::_["Tp"] = 1,<br>
r::_["knn"] = 0,<br>
r::_["tau"] = -1,<br>
r::_["theta"] = 0,<br>
r::_["exclusionRadius"] = 0,<br>
r::_["columns"] = std::string(""),<br>
r::_["target"] = std::string(""),<br>
r::_["smapFile"] = std::string(""),<br>
r::_["jacobians"] = std::string(""),<br>
r::_["embedded"] = false,<br>
r::_["const_predict"] = false,<br>
r::_["verbose"] = false,<br>
r::_["validLib"] = std::vector<bool>() ); //
<== This is reported as the error<br>
</font></p>
<p>Mapping in RcppEDMCommon.cpp:</p>
<p><font face="monospace">//-------------------------------------------------------------------------<br>
// Export / map the functions<br>
// First argument: R function name, see ../R/EDM.R<br>
// Second argument: pointer to Rcpp interface function<br>
// Third argument: arguments of the R function that
encapsulates the <br>
// C++ function in a Rcpp::List<br>
//-------------------------------------------------------------------------<br>
RCPP_MODULE(EDMInternal) {<br>
r::function( "RtoCpp_Simplex", &Simplex_rcpp,
SimplexArgs );<br>
r::function( "RtoCpp_SMap", &SMap_rcpp,
SMapArgs );<br>
}<br>
</font></p>
<p>C++ API function call (overloaded) to core library from function
SMap_rcpp() in SMap.cc (C++ API prototype listed below):</p>
<p><font face="monospace">//----------------------------------------------------------<br>
// <br>
//----------------------------------------------------------<br>
r::List SMap_rcpp( std::string pathIn,<br>
std::string dataFile,<br>
r::DataFrame dataFrame,<br>
std::string pathOut,<br>
std::string predictFile,<br>
std::string lib,<br>
std::string pred,<br>
int E,<br>
int Tp,<br>
int knn,<br>
int tau,<br>
double theta,<br>
int exlusionRadius,<br>
std::string columns,<br>
std::string target,<br>
std::string smapFile,<br>
std::string jacobians,<br>
bool embedded,<br>
bool const_predict,<br>
bool verbose,<br>
std::vector<bool> validLib ) {<br>
<br>
SMapValues SM;<br>
<br>
if ( dataFile.size() ) {<br>
// dataFile specified, dispatch overloaded SMap, ignore
dataFrame<br>
<br>
SM = SMap( pathIn,<br>
dataFile,<br>
pathOut,<br>
predictFile,<br>
lib,<br>
pred,<br>
E, <br>
Tp,<br>
knn,<br>
tau,<br>
theta,<br>
exlusionRadius,<br>
columns, <br>
target,<br>
smapFile,<br>
jacobians,<br>
embedded,<br>
const_predict,<br>
verbose,<br>
validLib );<br>
}<br>
else if ( dataFrame.size() ) {<br>
DataFrame< double > dataFrame_ = DFToDataFrame(
dataFrame );<br>
<br>
SM = SMap( dataFrame_,<br>
pathOut,<br>
predictFile,<br>
lib,<br>
pred,<br>
E, <br>
Tp,<br>
knn,<br>
tau,<br>
theta,<br>
exlusionRadius,<br>
columns, <br>
target,<br>
smapFile,<br>
jacobians,<br>
embedded,<br>
const_predict,<br>
verbose,<br>
validLib );<br>
}<br>
else {<br>
Rcpp::warning( "SMap_rcpp(): Invalid input.\n" );<br>
}<br>
<br>
r::DataFrame df_pred = DataFrameToDF( SM.predictions );<br>
r::DataFrame df_coef = DataFrameToDF( SM.coefficients );<br>
r::List output = r::List::create( r::Named("predictions") =
df_pred,<br>
r::Named("coefficients") =
df_coef );<br>
<br>
return output;<br>
}<br>
</font></p>
<p>As far as I can tell, the function arguments match the
definition. Again, this same code is implemented in another
function where there is no issue. <br>
</p>
<p>An interesting feature of the error log is a "countdown" of
function arguments, variously providing notes, until the final
note and error exit:</p>
<font face="monospace">candidate expects 0 arguments, 21 provided</font><br>
<font face="monospace"><font face="monospace">candidate expects 1
argument, 21 provided</font></font><br>
<font face="monospace"><font face="monospace">...</font></font><br>
<font face="monospace"><font face="monospace"><font face="monospace">candidate
expects 20 arguments, 21 provided</font></font></font>
<p><br>
</p>
<p>-- Error Log --<br>
</p>
<p><font face="monospace">> R CMD build .<br>
* checking for file ‘./DESCRIPTION’ ... OK<br>
* preparing ‘rEDM’:<br>
* checking DESCRIPTION meta-information ... OK<br>
* cleaning src<br>
* installing the package to build vignettes<br>
-----------------------------------<br>
* installing *source* package ‘rEDM’ ...<br>
** using staged installation<br>
** libs<br>
...</font></p>
<p><font face="monospace">g++ -std=gnu++11 -I"/usr/share/R/include"
-DNDEBUG -I ./cppEDM/src/
-I'/usr/local/lib/R/site-library/Rcpp/include'
-I'/usr/local/lib/R/site-library/RcppThread/include' -fpic
-g -O2 -fdebug-prefix-map=/build/r-base-tbZjLv/r-base-4.1.0=.
-fstack-protector-strong -Wformat -Werror=format-security
-Wdate-time -D_FORTIFY_SOURCE=2 -g -c RcppEDMCommon.cpp -o
RcppEDMCommon.o<br>
RcppEDMCommon.cpp:60:51: error: no matching function for call to
‘Rcpp::Vector<19>::create(Rcpp::traits::named_object<std::__cxx11::basic_string<char>
>,
Rcpp::traits::named_object<std::__cxx11::basic_string<char>
>,
Rcpp::traits::named_object<Rcpp::DataFrame_Impl<Rcpp::PreserveStorage>
>,
Rcpp::traits::named_object<std::__cxx11::basic_string<char>
>,
Rcpp::traits::named_object<std::__cxx11::basic_string<char>
>,
Rcpp::traits::named_object<std::__cxx11::basic_string<char>
>,
Rcpp::traits::named_object<std::__cxx11::basic_string<char>
>, Rcpp::traits::named_object<int>,
Rcpp::traits::named_object<int>,
Rcpp::traits::named_object<int>,
Rcpp::traits::named_object<int>,
Rcpp::traits::named_object<int>,
Rcpp::traits::named_object<int>,
Rcpp::traits::named_object<std::__cxx11::basic_string<char>
>,
Rcpp::traits::named_object<std::__cxx11::basic_string<char>
>,
Rcpp::traits::named_object<std::__cxx11::basic_string<char>
>,
Rcpp::traits::named_object<std::__cxx11::basic_string<char>
>, Rcpp::traits::named_object<bool>,
Rcpp::traits::named_object<bool>,
Rcpp::traits::named_object<bool>,
Rcpp::traits::named_object<std::vector<bool> >)’<br>
60 | r::_["validLib"] = std::vector<bool>()
);<br>
| ^<br>
In file included from
/usr/local/lib/R/site-library/Rcpp/include/Rcpp/Vector.h:52,<br>
from
/usr/local/lib/R/site-library/Rcpp/include/Rcpp.h:40,<br>
from RcppEDMCommon.h:10,<br>
from RcppEDMCommon.cpp:14:<br>
/usr/local/lib/R/site-library/Rcpp/include/Rcpp/vector/Vector.h:1122:19:
note: candidate: ‘static Rcpp::Vector<RTYPE,
StoragePolicy> Rcpp::Vector<RTYPE,
StoragePolicy>::create() [with int RTYPE = 19; StoragePolicy
= Rcpp::PreserveStorage]’<br>
1122 | static Vector create(){<br>
| ^~~~~~<br>
/usr/local/lib/R/site-library/Rcpp/include/Rcpp/vector/Vector.h:1122:19:
note: candidate expects 0 arguments, 21 provided<br>
...</font></p>
<p><font face="monospace">In file included from
/usr/local/lib/R/site-library/Rcpp/include/Rcpp/vector/Vector.h:1126,<br>
from
/usr/local/lib/R/site-library/Rcpp/include/Rcpp/Vector.h:52,<br>
from
/usr/local/lib/R/site-library/Rcpp/include/Rcpp.h:40,<br>
from RcppEDMCommon.h:10,<br>
from RcppEDMCommon.cpp:14:<br>
/usr/local/lib/R/site-library/Rcpp/include/Rcpp/generated/Vector__create.h:70:16:
note: candidate: ‘template<class T1> static
Rcpp::Vector<RTYPE, StoragePolicy> Rcpp::Vector<RTYPE,
StoragePolicy>::create(const T1&) [with T1 = T1; int
RTYPE = 19; StoragePolicy = Rcpp::PreserveStorage]’<br>
70 | static Vector create(const T1& t1){<br>
| ^~~~~~<br>
/usr/local/lib/R/site-library/Rcpp/include/Rcpp/generated/Vector__create.h:70:16:
note: template argument deduction/substitution failed:<br>
RcppEDMCommon.cpp:60:51: note: candidate expects 1 argument,
21 provided<br>
...</font></p>
<p><font face="monospace">/usr/local/lib/R/site-library/Rcpp/include/Rcpp/generated/Vector__create.h:1159:16:
note: template argument deduction/substitution failed:<br>
RcppEDMCommon.cpp:60:51: note: candidate expects 20 arguments,
21 provided<br>
60 | r::_["validLib"] = std::vector<bool>()
);<br>
| ^<br>
make: *** [/usr/lib/R/etc/Makeconf:177: RcppEDMCommon.o] Error 1<br>
ERROR: compilation failed for package ‘rEDM’<br>
* removing ‘/tmp/RtmpWluzdI/Rinst8d5e56742eb9/rEDM’<br>
-----------------------------------<br>
ERROR: package installation failed<br>
<br>
</font></p>
<p>-- Version Info --<br>
</p>
<p><font face="monospace">> sessionInfo()<br>
R version 4.1.0 (2021-05-18)<br>
Platform: x86_64-pc-linux-gnu (64-bit)<br>
Running under: Ubuntu 20.04.1 LTS<br>
<br>
Matrix products: default<br>
BLAS: /usr/lib/x86_64-linux-gnu/blas/libblas.so.3.9.0<br>
LAPACK: /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.9.0<br>
<br>
locale:<br>
[1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C <br>
[3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 <br>
[5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 <br>
[7] LC_PAPER=en_US.UTF-8 LC_NAME=C <br>
[9] LC_ADDRESS=C LC_TELEPHONE=C <br>
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C <br>
<br>
attached base packages:<br>
[1] stats graphics grDevices utils datasets methods
base <br>
<br>
other attached packages:<br>
[1] Rcpp_1.0.5<br>
<br>
loaded via a namespace (and not attached):<br>
[1] compiler_4.1.0</font><br>
</p>
<div class="moz-signature"><br>
</div>
<div class="moz-signature">-- C++ API prototype --</div>
<div class="moz-signature"><br>
</div>
<div class="moz-signature"><font face="monospace">// SMap is a
special case since it can be called with a function pointer<br>
// to the SVD solver. This is done so that interfaces such as
pybind11<br>
// can provide their own object for the solver.<br>
// 1) Data path/file with default SVD (LAPACK) assigned in
Smap.cc 2)<br>
SMapValues SMap( std::string pathIn = "./data/",<br>
std::string dataFile = "",<br>
std::string pathOut = "./",<br>
std::string predictFile = "",<br>
std::string lib = "",<br>
std::string pred = "",<br>
int E = 0,<br>
int Tp = 1,<br>
int knn = 0,<br>
int tau = -1,<br>
double theta = 0,<br>
int exclusionRadius = 0,<br>
std::string columns = "",<br>
std::string target = "",<br>
std::string smapFile = "",<br>
std::string derivatives = "",<br>
bool embedded = false,<br>
bool const_predict = false,<br>
bool verbose = true,<br>
std::vector<bool> validLib =
std::vector<bool>() );<br>
<br>
// 2) DataFrame with default SVD (LAPACK) assigned in Smap.cc 2)<br>
SMapValues SMap( DataFrame< double > &dataFrameIn,<br>
std::string pathOut = "./",<br>
std::string predictFile = "",<br>
std::string lib = "",<br>
std::string pred = "",<br>
int E = 0,<br>
int Tp = 1,<br>
int knn = 0,<br>
int tau = -1,<br>
double theta = 0,<br>
int exclusionRadius = 0,<br>
std::string columns = "",<br>
std::string target = "",<br>
std::string smapFile = "",<br>
std::string derivatives = "",<br>
bool embedded = false,<br>
bool const_predict = false,<br>
bool verbose = true,<br>
std::vector<bool> validLib =
std::vector<bool>() );<br>
<br>
</font><br>
</div>
</body>
</html>