Duncan Murdoch wrote:
Maximilian Kofler wrote:
Duncan Murdoch <murdoch.duncan <at> gmail.com> writes:
I doubt if that was the error message. More likely you saw
Error: evaluation nested too deeply: infinite recursion /
options(expressions=)?
Exactly this was the error message I recieved
This isn't a case of the source being nested to deeply, but rather of the
evaluation being nested too deeply.
This happens in recursive algorithms when R runs out of
stack space, around 5000 calls deep. Is it likely in your dataset that
a recursion depth of 5000 is reasonable? In most cases this indicates a
programming error that leads to an infinite recursion, but there are
probably cases where a depth like that is reasonable.
I don't think that it is a programming error, because I succeyyfully
calculated subgraph isomirphism with the algorithm, but with
smaller input graphs.
The programming error might be in the design, not the implementation.
For example, you can sum a vector like this:
I've taken a look at your original functions, and I can't spot cases as
obvious as the one below, so there isn't going to be a quick fix for
this. Here are my suggestions:
- Name your functions meaningfully. You named them refine1 to refine9,
so it's not at all obvious what they are trying to do.
- Use nested functions. You are passing lots of arguments in every
function call, e.g.
refine1 <- function(M, A, B, p_A, p_B, FAIL, elim, i, j, k, sc, h, lst, x){
#print("refine 1")
# elim marks if there was eliminated a 1 (and changed to 0)
lst <- vector(mode = "numeric")
elim <- 0
i <- 1
refine2(M, A, B, p_A, p_B, FAIL, elim, i, j, k, sc, h, lst, x)
}
The call to refine2 uses exactly the same values of M, A, B, p_A, p_B, FAIL, j,
k, sc, h and x as were passed to refine1. Those
might be good candidates to be variables in a big outside function, with
refine1 being nested within it, e.g.
refine <- function(M, A, B, p_A, p_B, FAIL, j, k, sc, h, x) {
refine1 <- function() {
lst <- ...
elim <- 0
i <- 1
refine2(elim, i, lst)
}
etc.
which might make it easier to read and fix. Doing this won't reduce the depth
of nesting of your functions, but it will save
some memory (and maybe some protection stack) and will make your functions
easier to read, so perhaps you can recognize what's wrong. (It does make
things slightly harder to debug: you can't say debug(refine1) outside of the
refine(), but you can use setBreakpoint() to set a breakpoint in it.)
Duncan Murdoch
badSum <- function(x) {
if (length(x) > 1) x[1] + badSum(x[-1])
else x
}
and you'll get the right result for vectors of lengths from 1 up to
around length 5000, but not for bigger ones. The solution in some
languages is to recognize when recursion is being used unnecessarily and
to optimize it away, but R doesn't do that. So the programmer has to
recognize when recursion isn't really needed and rewrite the function to
work without it. For example, in the case above, we don't need x after
extracting x[1], so there's no need to make a new call to badSum (which
preserves it). Just turn it into a loop:
notsobadSum <- function(x) {
result <- x[1]
while (length(x) > 1) {
x <- x[-1]
result <- result + x[1]
}
result
}
(This is still a bad way to compute a sum in R, it is just a simple
illustration).
So the algorithm seems to work.
I already tried to set options(expressions=500000), but
then I cause a protection stack overflow:
error: protect(): protection stack overflow
Is the problem that too many objects are stored in the stack?
Too many stack frames. You're not running out of memory, you're running
out of a particular type of memory. When you set expressions to 500000
you just started to run out of a different resource. The help page
?options tells you how to work around that one, but I suspect you really
need to rewrite your functions so they only recurse
when they need to.
Duncan Murdoch
If yes, somebody knows how to solve this
problem?
thanks for your replies
______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.
______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.