Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion packages/nimble/R/cppDefs_nimbleFunction.R
Original file line number Diff line number Diff line change
Expand Up @@ -1204,7 +1204,7 @@ makeCopyFromRobjectDef <- function(cppCopyTypes,
quote = TRUE
)
} else {
unprotectCount <- 2 + length(copyCalls) ## 2 from SETUP_S_xData
unprotectCount <- length(copyCalls) ## 0 extra from SETUP_S_xData (1 PROTECT, covered by the +1 below)
allRcode <- do.call('call',
c(list('{'),
list(cppLiteral("SETUP_S_xData;")),
Expand Down
30 changes: 8 additions & 22 deletions packages/nimble/R/cppDefs_nimbleList.R
Original file line number Diff line number Diff line change
Expand Up @@ -228,31 +228,24 @@ cppNimbleListClass <- setRefClass('cppNimbleListClass',

conditionalClauseStart <- list(quote(cppLiteral('if (!RCopiedFlag){')))
conditionalClauseEnd <- list(quote(cppLiteral('}')))
environmentCPPName <- Rname2CppName('S_.xData') ## create SEXP for ref class environment
listElementTable$addSymbol(cppSEXP(name = environmentCPPName))
envLine <- substitute({PROTECT(ENVNAME <- Rf_allocVector(STRSXP, 1));
SET_STRING_ELT(ENVNAME, 0, PROTECT(Rf_mkChar(".xData")));},
list(ENVNAME = as.name(environmentCPPName)))

for(i in seq_along(elementNames)){
Snames[i] <- Rname2CppName(paste0('S_', elementNames[i]))
listElementTable$addSymbol(cppSEXP(name = Snames[i]))
elementSymTab <- nimCompProc$symTab$getSymbolObject(elementNames[i])
conditionalLineList <- c(conditionalLineList, generateConditionalLines(nimCompProc$symTab$getSymbolObject(elementNames[i]),
listElementTable$getSymbolObject(Snames[i])))

copyToListLines[[i]] <- substitute(Rf_defineVar(Rf_install(ELEMENTNAME), VALUE, PROTECT(GET_SLOT(ROBJ, XDATA))),
copyToListLines[[i]] <- substitute(Rf_defineVar(Rf_install(ELEMENTNAME), VALUE, PROTECT(R_do_slot(ROBJ, Rf_install(".xData")))),
list(ELEMENTNAME = elementNames[i], VALUE = as.name(Snames[i]),
ROBJ = as.name('RObjectPointer'),
XDATA = as.name(environmentCPPName)))
ROBJ = as.name('RObjectPointer')))
}

setFlagLine <- list(substitute(RCopiedFlag <- true,
list()))
returnLine <- list(substitute(return(ROBJ),
list(ROBJ = as.name('RObjectPointer'))))
unprotectLine <- list(substitute(UNPROTECT(N), list(N = 2 * numElements + 1 + 1)))
allCode <- embedListInRbracket(c(conditionalClauseStart, list(envLine), conditionalLineList,
unprotectLine <- list(substitute(UNPROTECT(N), list(N = 2 * numElements)))
allCode <- embedListInRbracket(c(conditionalClauseStart, conditionalLineList,
copyToListLines, setFlagLine, unprotectLine,
conditionalClauseEnd, returnLine))
functionDefs[[paste0(name, "_copyTo")]] <<- cppFunctionDef(name = "copyToSEXP",
Expand All @@ -276,26 +269,19 @@ cppNimbleListClass <- setRefClass('cppNimbleListClass',
listElementTable <- symbolTable()
storeSexpLine <- list(quote(cppLiteral('R_PreserveObject(RObjectPointer = S_nimList_);')))

environmentCPPName <- Rname2CppName('S_.xData') ## create SEXP for ref class environment
listElementTable$addSymbol(cppSEXP(name = environmentCPPName))
envLine <- substitute({PROTECT(ENVNAME <- Rf_allocVector(STRSXP, 1));
SET_STRING_ELT(ENVNAME, 0, PROTECT(Rf_mkChar(".xData")));},
list(ENVNAME = as.name(environmentCPPName)))

for(i in seq_along(argNames)) {
Snames[i] <- Rname2CppName(paste0('S_', argNames[i]))
listElementTable$addSymbol(cppSEXP(name = Snames[i]))
copyFromListLines[[i]] <- substitute(PROTECT(SVAR <- NIM_FINDVARINFRAME(PROTECT(GET_SLOT(S_nimList_, XDATA)), Rf_install(ARGNAME))),
copyFromListLines[[i]] <- substitute(PROTECT(SVAR <- NIM_FINDVARINFRAME(PROTECT(R_do_slot(S_nimList_, Rf_install(".xData"))), Rf_install(ARGNAME))),
list(ARGNAME = argNames[i],
SVAR = as.name(Snames[i]),
XDATA = as.name(environmentCPPName)))
SVAR = as.name(Snames[i])))
copyLine <- buildCopyLineFromSEXP(listElementTable$getSymbolObject(Snames[i]),
nimCompProc$symTab$getSymbolObject(argNames[i]))
copyLines <- c(copyLines, copyLine)
}
numArgs <- length(argNames)
unprotectLine <- substitute(UNPROTECT(N), list(N = 2 * numArgs + 1 + 1))
allCode <- embedListInRbracket(c(storeSexpLine, envLine,
unprotectLine <- substitute(UNPROTECT(N), list(N = 2 * numArgs))
allCode <- embedListInRbracket(c(storeSexpLine,
copyFromListLines, copyLines,
list(unprotectLine)))
functionDefs[[paste0(name, "_copyFrom")]] <<- cppFunctionDef(name = "copyFromSEXP",
Expand Down
17 changes: 7 additions & 10 deletions packages/nimble/inst/CppCode/RcppNimbleUtils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -54,16 +54,13 @@ SEXP setDoublePtrFromSinglePtr(SEXP SdoublePtr, SEXP SsinglePtr) {
void setNimbleFxnPtr_copyFromRobject(void *nf_to, SEXP S_NF_from) {
void **doublePtr = static_cast<void **>(nf_to);
SEXP Scnf, SsinglePtr;
SEXP S_pxData;
PROTECT(S_pxData = Rf_allocVector(STRSXP, 1));
SET_STRING_ELT(S_pxData, 0, Rf_mkChar(".xData"));
// environment(modelVar)$.CobjectInterface
PROTECT(Scnf = NIM_FINDVARINFRAME(PROTECT(GET_SLOT(
PROTECT(Scnf = NIM_FINDVARINFRAME(PROTECT(R_do_slot(
S_NF_from,
S_pxData)),
Rf_install(".xData"))),
Rf_install(".CobjectInterface"))
);
int unprotectCount = 3;
int unprotectCount = 2;
if(Rf_isNewList(Scnf)) {
// multi-interface
//Cnf[[1]]$basePtrList[[ Cnf[[2]] ]]
Expand All @@ -72,10 +69,10 @@ void setNimbleFxnPtr_copyFromRobject(void *nf_to, SEXP S_NF_from) {
int index = (Rf_isInteger(Sindex) ? INTEGER(Sindex)[0] : REAL(Sindex)[0]);
index--; // From 1-based to 0-based indexing
PROTECT(SsinglePtr = VECTOR_ELT(
NIM_FINDVARINFRAME(PROTECT(GET_SLOT(
NIM_FINDVARINFRAME(PROTECT(R_do_slot(
VECTOR_ELT(Scnf,
0),
S_pxData)),
Rf_install(".xData"))),
Rf_install("basePtrList")),
index
)
Expand All @@ -85,9 +82,9 @@ void setNimbleFxnPtr_copyFromRobject(void *nf_to, SEXP S_NF_from) {
// printf("in non-list\n");
// full interface
// Cnf$.basePtr
PROTECT(SsinglePtr = NIM_FINDVARINFRAME(PROTECT(GET_SLOT(
PROTECT(SsinglePtr = NIM_FINDVARINFRAME(PROTECT(R_do_slot(
Scnf,
S_pxData)),
Rf_install(".xData"))),
Rf_install(".basePtr")));
unprotectCount += 2;
}
Expand Down
7 changes: 5 additions & 2 deletions packages/nimble/inst/CppCode/RcppUtils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,10 @@ vector<int> getSEXPdims(SEXP Sx) {
vector<int> ans;
ans.resize(1); ans[0] = LENGTH(Sx); return(ans);
}
return(SEXP_2_vectorInt(Rf_getAttrib(Sx, R_DimSymbol), 0));
SEXP dims = PROTECT(Rf_getAttrib(Sx, R_DimSymbol));
vector<int> result = SEXP_2_vectorInt(dims, 0);
UNPROTECT(1);
return result;
}

string STRSEXP_2_string(SEXP Ss, int i) {
Expand Down Expand Up @@ -858,7 +861,7 @@ SEXP varAndIndices_2_LANGSXP(const varAndIndicesClass &varAndInds) {
Sans = PROTECT(Rf_install(varAndInds.varName.c_str()));
} else {
t = Sans = PROTECT(Rf_allocVector(LANGSXP, ansLen));
SETCAR(t, R_BracketSymbol); t = CDR(t);
SETCAR(t, Rf_install("[")); t = CDR(t);
SETCAR(t, Rf_install(varAndInds.varName.c_str())); t = CDR(t);
for(size_t i = 0; i < varAndInds.indices.size(); ++i) {
if(varAndInds.indices[i].size() == 0) { // blank
Expand Down
34 changes: 14 additions & 20 deletions packages/nimble/inst/CppCode/accessorClasses.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -920,35 +920,32 @@ void populateNodeFxnVectorNew_internal_forDerivs(NodeVectorClassNew_derivs* nfv,

void populateNodeFxnVectorNew_copyFromRobject_forDerivs(void *nodeFxnVec_to, SEXP S_nodeFxnVec_from ) {
SEXP S_indexingInfo;
SEXP S_pxData;
PROTECT(S_pxData = Rf_allocVector(STRSXP, 1));
SET_STRING_ELT(S_pxData, 0, Rf_mkChar(".xData"));
PROTECT(S_indexingInfo = VECTOR_ELT(S_nodeFxnVec_from, 1));
SEXP S_declIDs;
PROTECT(S_declIDs = VECTOR_ELT(S_indexingInfo, 0));
SEXP S_rowIndices;
PROTECT(S_rowIndices = VECTOR_ELT(S_indexingInfo, 1));
SEXP S_numberedPtrs;
PROTECT(S_numberedPtrs = PROTECT(NIM_FINDVARINFRAME(PROTECT(GET_SLOT(
PROTECT(NIM_FINDVARINFRAME(PROTECT(GET_SLOT(
PROTECT(NIM_FINDVARINFRAME(PROTECT(GET_SLOT(
PROTECT(S_numberedPtrs = PROTECT(NIM_FINDVARINFRAME(PROTECT(R_do_slot(
PROTECT(NIM_FINDVARINFRAME(PROTECT(R_do_slot(
PROTECT(NIM_FINDVARINFRAME(PROTECT(R_do_slot(
VECTOR_ELT(S_nodeFxnVec_from,
2
),
S_pxData)),
Rf_install(".xData"))),
Rf_install("CobjectInterface")
)),
S_pxData)),
Rf_install(".xData"))),
Rf_install(".nodeFxnPointers_byDeclID"))),
S_pxData)),
Rf_install(".xData"))),
Rf_install(".ptr")
))
);
SEXP SderivInfo;
PROTECT(SderivInfo = VECTOR_ELT(S_nodeFxnVec_from, 3));
NodeVectorClassNew_derivs* nfv_derivs = static_cast<NodeVectorClassNew_derivs*>(nodeFxnVec_to);
populateNodeFxnVectorNew_internal_forDerivs(nfv_derivs, S_declIDs, S_numberedPtrs, S_rowIndices, SderivInfo);
UNPROTECT(12);
UNPROTECT(11);
}

SEXP populateNodeFxnVectorNew_byDeclID_forDerivs(SEXP SnodeFxnVec, SEXP S_GIDs, SEXP SnumberedObj, SEXP S_ROWINDS, SEXP SderivInfo){
Expand Down Expand Up @@ -979,9 +976,6 @@ void populateNodeFxnVectorNew_internal(NodeVectorClassNew* nfv, SEXP S_GIDs, SEX

void populateNodeFxnVectorNew_copyFromRobject(void *nodeFxnVec_to, SEXP S_nodeFxnVec_from ) {
SEXP S_indexingInfo;
SEXP S_pxData;
S_pxData = PROTECT(Rf_allocVector(STRSXP, 1));
SET_STRING_ELT(S_pxData, 0, Rf_mkChar(".xData"));
S_indexingInfo = PROTECT(VECTOR_ELT(S_nodeFxnVec_from, 1));
SEXP S_declIDs;
S_declIDs = PROTECT(VECTOR_ELT(S_indexingInfo, 0));
Expand All @@ -990,24 +984,24 @@ void populateNodeFxnVectorNew_copyFromRobject(void *nodeFxnVec_to, SEXP S_nodeFx
SEXP S_numberedPtrs;
// equivalent to S_nodeFxnVec_from[["model"]]$CobjectInterface$.nodeFxnPointers_byDeclID$.ptr
// implemented by S_nodeFxnVec_from[[2]]@.xData[["CobjectInterface"]]@.xData[[".nodeFxnPointers_byDeclID"]]@.xData[[".ptr"]]
S_numberedPtrs = PROTECT(NIM_FINDVARINFRAME(PROTECT(GET_SLOT(
PROTECT(NIM_FINDVARINFRAME(PROTECT(GET_SLOT(
PROTECT(NIM_FINDVARINFRAME(PROTECT(GET_SLOT(
S_numberedPtrs = PROTECT(NIM_FINDVARINFRAME(PROTECT(R_do_slot(
PROTECT(NIM_FINDVARINFRAME(PROTECT(R_do_slot(
PROTECT(NIM_FINDVARINFRAME(PROTECT(R_do_slot(
VECTOR_ELT(S_nodeFxnVec_from,
2
),
S_pxData)),
Rf_install(".xData"))),
Rf_install("CobjectInterface")
)),
S_pxData)),
Rf_install(".xData"))),
Rf_install(".nodeFxnPointers_byDeclID"))),
S_pxData)),
Rf_install(".xData"))),
Rf_install(".ptr")
)
);
NodeVectorClassNew* nfv = static_cast<NodeVectorClassNew*>(nodeFxnVec_to);
populateNodeFxnVectorNew_internal(nfv, S_declIDs, S_numberedPtrs, S_rowIndices);
UNPROTECT(10);
UNPROTECT(9);
}

SEXP populateNodeFxnVectorNew_byDeclID(SEXP SnodeFxnVec, SEXP S_GIDs, SEXP SnumberedObj, SEXP S_ROWINDS){
Expand Down
40 changes: 14 additions & 26 deletions packages/nimble/inst/CppCode/eigenUsingClasses.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -71,17 +71,14 @@ void SEXP_2_NimArr<1>(SEXP Sn, NimArr<1, int> &ans) {

/*EIGEN_EIGEN class functions below */
SEXP EIGEN_EIGENCLASS_R::copyToSEXP ( ) {
SEXP S_pxData;
SEXP S_values;
SEXP S_vectors;

PROTECT(S_pxData = Rf_allocVector(STRSXP, 1));
SET_STRING_ELT(S_pxData, 0, Rf_mkChar(".xData"));
PROTECT(S_values = NimArr_2_SEXP<1>(values));
PROTECT(S_vectors = NimArr_2_SEXP<2>(vectors));
Rf_defineVar(Rf_install("values"), S_values, PROTECT(GET_SLOT(RObjectPointer, S_pxData)));
Rf_defineVar(Rf_install("vectors"), S_vectors, PROTECT(GET_SLOT(RObjectPointer, S_pxData)));
UNPROTECT(5);
Rf_defineVar(Rf_install("values"), S_values, PROTECT(R_do_slot(RObjectPointer, Rf_install(".xData"))));
Rf_defineVar(Rf_install("vectors"), S_vectors, PROTECT(R_do_slot(RObjectPointer, Rf_install(".xData"))));
UNPROTECT(4);

return(RObjectPointer);
}
Expand All @@ -97,36 +94,30 @@ void EIGEN_EIGENCLASS_R::createNewSEXP ( ) {
}

void EIGEN_EIGENCLASS_R::copyFromSEXP ( SEXP S_nimList_ ) {
SEXP S_pxData;
SEXP S_values;
SEXP S_vectors;
RObjectPointer = S_nimList_;
PROTECT(S_pxData = Rf_allocVector(STRSXP, 1));
SET_STRING_ELT(S_pxData, 0, Rf_mkChar(".xData"));
PROTECT(S_values = NIM_FINDVARINFRAME(PROTECT(GET_SLOT(S_nimList_, S_pxData)), Rf_install("values")));
PROTECT(S_vectors = NIM_FINDVARINFRAME(PROTECT(GET_SLOT(S_nimList_, S_pxData)), Rf_install("vectors")));
PROTECT(S_values = NIM_FINDVARINFRAME(PROTECT(R_do_slot(S_nimList_, Rf_install(".xData"))), Rf_install("values")));
PROTECT(S_vectors = NIM_FINDVARINFRAME(PROTECT(R_do_slot(S_nimList_, Rf_install(".xData"))), Rf_install("vectors")));
SEXP_2_NimArr<1>(S_values, values);
SEXP_2_NimArr<2>(S_vectors, vectors);
UNPROTECT(5);
UNPROTECT(4);
}


/*EIGEN_SVD class functions below */
SEXP EIGEN_SVDCLASS_R::copyToSEXP ( ) {
SEXP S_pxData;
SEXP S_d;
SEXP S_u;
SEXP S_v;

PROTECT(S_pxData = Rf_allocVector(STRSXP, 1));
SET_STRING_ELT(S_pxData, 0, Rf_mkChar(".xData"));
PROTECT(S_d = NimArr_2_SEXP<1>(d));
PROTECT(S_u = NimArr_2_SEXP<2>(u));
PROTECT(S_v = NimArr_2_SEXP<2>(v));
Rf_defineVar(Rf_install("d"), S_d, PROTECT(GET_SLOT(RObjectPointer, S_pxData)));
Rf_defineVar(Rf_install("u"), S_u, PROTECT(GET_SLOT(RObjectPointer, S_pxData)));
Rf_defineVar(Rf_install("v"), S_v, PROTECT(GET_SLOT(RObjectPointer, S_pxData)));
UNPROTECT(7);
Rf_defineVar(Rf_install("d"), S_d, PROTECT(R_do_slot(RObjectPointer, Rf_install(".xData"))));
Rf_defineVar(Rf_install("u"), S_u, PROTECT(R_do_slot(RObjectPointer, Rf_install(".xData"))));
Rf_defineVar(Rf_install("v"), S_v, PROTECT(R_do_slot(RObjectPointer, Rf_install(".xData"))));
UNPROTECT(6);

return(RObjectPointer);
}
Expand All @@ -142,20 +133,17 @@ void EIGEN_EIGENCLASS_R::copyFromSEXP ( SEXP S_nimList_ ) {
}

void EIGEN_SVDCLASS_R::copyFromSEXP ( SEXP S_nimList_ ) {
SEXP S_pxData;
SEXP S_d;
SEXP S_v;
SEXP S_u;
RObjectPointer = S_nimList_;
PROTECT(S_pxData = Rf_allocVector(STRSXP, 1));
SET_STRING_ELT(S_pxData, 0, Rf_mkChar(".xData"));
PROTECT(S_d = NIM_FINDVARINFRAME(PROTECT(GET_SLOT(S_nimList_, S_pxData)), Rf_install("d")));
PROTECT(S_v = NIM_FINDVARINFRAME(PROTECT(GET_SLOT(S_nimList_, S_pxData)), Rf_install("v")));
PROTECT(S_u = NIM_FINDVARINFRAME(PROTECT(GET_SLOT(S_nimList_, S_pxData)), Rf_install("u")));
PROTECT(S_d = NIM_FINDVARINFRAME(PROTECT(R_do_slot(S_nimList_, Rf_install(".xData"))), Rf_install("d")));
PROTECT(S_v = NIM_FINDVARINFRAME(PROTECT(R_do_slot(S_nimList_, Rf_install(".xData"))), Rf_install("v")));
PROTECT(S_u = NIM_FINDVARINFRAME(PROTECT(R_do_slot(S_nimList_, Rf_install(".xData"))), Rf_install("u")));
SEXP_2_NimArr<1>(S_d, d);
SEXP_2_NimArr<2>(S_v, v);
SEXP_2_NimArr<2>(S_u, u);
UNPROTECT(7);
UNPROTECT(6);
}

SEXP C_nimEigen(SEXP S_x, SEXP S_symmetric, SEXP S_valuesOnly, SEXP returnList) {
Expand Down
Loading
Loading