Such a rookie C++ error! I thought I would have caught something like that!
oh well! Thanks! On 20 Feb 2014, at 18:30, Kevin Ushey <[email protected]> wrote: > Hi Hideyoshi, > > At this line: > > if(x(i,exit_col)==1){ > > I see that exit_col is equal to the number of columns in the matrix, > thereby indexing outside the matrix if 'i' is large enough. Do you > want 'exit_col - 1' instead? Be careful when going from R's 1-based > indexing to C++'s 0-based indexing. > > Cheers, > Kevin > > On Thu, Feb 20, 2014 at 10:16 AM, Hideyoshi Maeda > <[email protected]> wrote: >> Thanks for the suggestion to keep adding one line at a time, but annoyingly >> the error has not become apparent...when i add everything but the last >> section >> of code it works...but when adding in simple statements at the end, it no >> longer works >> >> here is the full test.cpp that WORKS >> >> >> #include <Rcpp.h> >> using namespace Rcpp; >> >> // [[Rcpp::export]] >> List entryexitclock( SEXP xts_obj_,int ent_col, int exit_col, double >> clock_limit, int init_pos) { >> // function takes in xts_obj_ (an xts object from R) and converts to a >> NumericMatrix >> Rcpp::NumericMatrix x(xts_obj_); >> // Get the index and call v >> DatetimeVector v(NumericVector(RObject(xts_obj_).attr("index"))); >> // The dimensions of rtn_xts are extracted >> int nr = x.nrow(); >> >> int pos = init_pos; >> Rcpp::NumericVector pos_vec(nr); >> Rcpp::NumericVector clock_vec(nr); >> Rcpp::NumericVector real_entry(nr); >> Rcpp::NumericVector signal_exit(nr); >> Rcpp::NumericVector time_exit(nr); >> >> for(int i=0; i<nr; i++){ >> if(pos==0){ >> // No position before period i >> if(x(i,ent_col)==0){ >> // No position and no entry >> } else { >> //No position and entry signal >> pos = 1; >> pos_vec[i] = 1; >> real_entry[i] = 1; >> } >> } else{ >> // Exisiting position i.e. pos==1 >> // Add the gap difference to the timer >> // time is in seconds... >> double gap_diff = (v[i]-v[i-1]); >> double time_in_trade = clock_vec[i-1]+gap_diff; >> clock_vec[i] = time_in_trade; >> pos_vec[i] = 1; >> if(time_in_trade>=clock_limit){ >> //When holding an existing position, exit due to time given >> pos = 0; >> time_exit[i] = 1; >> } else { >> //If time based exit hasnt triggered...check for signal >> if(x(i,exit_col)==1){ >> // Exit signal given with existing position >> } else{ >> // No exit signal, so keep position >> } >> } >> } >> } >> >> List l; >> return (l); >> >> } >> >> but when changing the last section (starting from the penultimate else) to >> something like this... >> >> } else { >> //If time based exit hasnt triggered...check for signal >> if(x(i,exit_col)==1){ >> // Exit signal given with existing position >> pos = 0; >> signal_exit[i] = 1; >> } else{ >> // No exit signal, so keep position >> } >> } >> } >> } >> return List::create(_["pos_vec"] = pos_vec, >> _["clock_vec"] = clock_vec, >> _["real_entry"] = real_entry, >> _["signal_exit"] = signal_exit, >> _["time_exit"] = time_exit); >> } >> >> It no longer works...and I can't tell why. To me at least it doesn't look >> like >> I'm doing anything crazy... >> >> And to test the code I am running the following.... >> >> require(xts) >> require(Rcpp) >> # 500 days >> n <- 60*24*500 >> >> # minutely standard dev >> sd_m <- 0.003 >> >> #minutely mean >> mu_m <- 5e-6 >> >> # Rate at which entry/exits triggered >> entry_rate <- 0.002 >> exit_rate <- 0.002 >> >> # set seed >> set.seed(1) >> >> x <- xts(100*cumprod(1+rnorm(n,mu_m,sd_m)), >> as.POSIXct(Sys.Date())+(60*c(1:n))) >> x <- round(to.minutes5(x,name="ABC"),2) >> x$rand_entry <- rpois(nrow(x),entry_rate) >> x$rand_exit <- rpois(nrow(x),exit_rate) >> >> Rcpp::sourceCpp('test.cpp') >> >> init_pos <- 0 >> >> clock_time_mins <- 120 >> >> res <- lapply(1:100, function(z) { >> entryexitclock(x,match("rand_entry",colnames(x)), >> match("rand_exit",colnames(x)), >> clock_time_mins*60,init_pos) >> }) >> >> The error obtained when adding in the last part of code is: >> >> *** caught segfault *** >> address 0x10d0cfc40, cause 'memory not mapped' >> >> Traceback: >> 1: .Primitive(".Call")(<pointer: 0x10155d2e0>, xts_obj_, ent_col, >> exit_col, clock_limit, init_pos) >> 2: entryexitclock(x, match("rand_entry", colnames(x)), match("rand_exit", >> colnames(x)), clock_time_mins * 60, init_pos) >> 3: FUN(1:100[[3L]], ...) >> 4: lapply(1:100, function(z) { entryexitclock(x, match("rand_entry", >> colnames(x)), match("rand_exit", colnames(x)), clock_time_mins * 60, >> init_pos)}) >> >> Possible actions: >> 1: abort (with core dump, if enabled) >> 2: normal R exit >> 3: exit R without saving workspace >> 4: exit R saving workspace >> >> Interestingly, from the traceback it suggests it fails on the third attempt >> (z=3) rather than the first or second... >> >> Any suggestions to help fix this issue would be greatly be appreciated... >> >> hlm >> >> >> >> >> >> On 20 Feb 2014, at 16:48, Sameer D'Costa <[email protected]> wrote: >> >> One thing you can do is start with a little test case and run multiple times >> it to see if the segfault is really coming from where you think it is. >> >> /* test.cpp */ >> #include <Rcpp.h> >> using namespace Rcpp; >> >> // [[Rcpp::export]] >> List entryexitclock( SEXP xts_obj_,int ent_col, int exit_col, double >> clock_limit, int init_pos) { >> // function takes in xts_obj_ (an xts object from R) and converts to a >> NumericMatrix >> Rcpp::NumericMatrix x(xts_obj_); >> // Get the index and call v >> DatetimeVector v(NumericVector(RObject(xts_obj_).attr("index"))); >> // The dimensions of rtn_xts are extracted >> int nr = x.nrow(); >> List l; >> return (l); >> } >> >> Then on the R side you can test it out >> library(Rcpp) >> library(xts) >> sourceCpp("test.cpp") >> n <- 10000 >> k <- xts(as.numeric(1:n), Sys.time()+1:n) >> res <- lapply(1:10000, function(z) entryexitclock(k, 12, 12, 60*60,0)) >> >> This code does not seem to segfault for me using R 2.15.3 on Ubuntu with >> Rcpp 0.10.4. Does it segfault for you? >> >> If I were you I would keep adding code to the test example till it segfaults >> reliably. If you do this one line at a time you will have a good idea of >> which line is causing the segfault. Usually the "user error" becomes >> apparent :). If you are unsure you could winnow down the test case to a >> small reproducible test case that crashes reliably and then post it to the >> list. >> >> Regards >> Sameer >> >> >> On Thu, Feb 20, 2014 at 9:50 AM, Hideyoshi Maeda <[email protected]> >> wrote: >>> >>> Hi I am trying to run a function I created in Rcpp, which is then >>> sourced/compiled and executed in R. >>> >>> The function is called "entryexitclock". >>> >>> and starts off as follows: >>> >>> #include <Rcpp.h> >>> using namespace Rcpp; >>> >>> // [[Rcpp::export]] >>> List entryexitclock( SEXP xts_obj_,int ent_col, int exit_col, double >>> clock_limit, int init_pos) { >>> // function takes in xts_obj_ (an xts object from R) and converts to a >>> NumericMatrix >>> Rcpp::NumericMatrix x(xts_obj_); >>> // Get the index and call v >>> DatetimeVector v(NumericVector(RObject(xts_obj_).attr("index"))); >>> // The dimensions of rtn_xts are extracted >>> int nr = x.nrow(); >>> >>> There is more code but I'm starting to doubt if its related to the rest of >>> the code. I have a feeling it might be my use of SEXP but I'm not sure... >>> >>> The compilation works fine, however "sometimes" the code works and >>> sometimes the code doesn't... >>> >>> The error when it doesn't is as follows: >>> >>> >>> *** caught segfault *** >>> address 0x11a9783c8, cause 'memory not mapped' >>> >>> Traceback: >>> 1: .Primitive(".Call")(<pointer: 0x1044dde70>, xts_obj_, ent_col, >>> exit_col, clock_limit, init_pos) >>> 2: entryexitclock(k, 11, 12, 60 * 60, 0) >>> >>> Possible actions: >>> 1: abort (with core dump, if enabled) >>> 2: normal R exit >>> 3: exit R without saving workspace >>> 4: exit R saving workspace >>> >>> Any suggestions as to what I can do to make sure that this function works >>> every time rather than just sometimes? >>> >>> HLM >>> >>> >>> >>> _______________________________________________ >>> Rcpp-devel mailing list >>> [email protected] >>> https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel >> >> >> >> >> _______________________________________________ >> Rcpp-devel mailing list >> [email protected] >> https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel _______________________________________________ Rcpp-devel mailing list [email protected] https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel
