Hello,
I am new to igraph (and R for that matter) and have come across a problem I've been unable solve. I am trying to implement the algorithm in
this paper (see bottom of pg. 3). In brief, the algorithm is a way to explore the assortativity-clustering space of a network. This is done by using degree distribution-preserving rewiring to alter assortativity and clustering levels in a given network. The idea is then to measure some outcomes (e.g., robustness) at different points or "pixels" in the assortativity-clustering space and see how the observed network compares to outcomes associated with different assortativity and clustering levels.
The procedure is computationally intensive so I am running it in parallel on a Linux-based high-powered computer running R version 3.4.1 and igraph version 1.1.0 (system specs
here). Note that we had some difficulties installing igraph on the machine and the system administrator resorted to installing a dev version. When running my code I run into two types of errors. The first is "Error: cons memory exhausted (limit reached?)." The memory available should be sufficient for this job, so I am not sure what is going on here. The second error is a bit more concerning:
*** caught segfault ***
address 0x1, cause 'memory not mapped'
Traceback:
1: .Call("R_igraph_finalizer", PACKAGE = "igraph")
2: with$fun(list(119, FALSE, c(110, 73, 80, 21, 94, 104, 102, 57, 99, 73, 57, 60, 59, 55, 82, 40, 38, 107, 111, 57, 80, 108, 53, 93, 100, 104, 107, 114, 73, 104, 85, 111,
[TEXT REMOVED TO SAVE SPACE]
"100", "101", "102", "103", "104", "105", "106", "107", "108", "109", "110", "111", "112", "113", "114", "115", "116", "117", "118", "119")), list()), <environment>), loops = FALSE, niter = 1)
3: eval(call, .env)
4: eval(call, .env)
5: do_call(with$fun, list(graph), .args = with$args)
6: rewire(ntw1, with = keeping_degseq(loops = FALSE, niter = 1))
7: sampling(network, pixels, min.r, max.r, min.c, max.c, vrnd)
8: FUN(X[[i]], ...)
9: lapply(X = S, FUN = FUN, ...)
10: doTryCatch(return(expr), name, parentenv, handler)
11: tryCatchOne(expr, names, parentenv, handlers[[1L]])
12: tryCatchList(expr, classes, parentenv, handlers)
13: tryCatch(expr, error = function(e) { call <- conditionCall(e) if (!is.null(call)) { if (identical(call[[1L]], quote(doTryCatch))) call <- sys.call(-4L) dcall <- deparse(call)[1L] prefix <- paste("Error in", dcall, ": ") LONG <- 75L msg <- conditionMessage(e) sm <- strsplit(msg, "\n")[[1L]] w <- 14L + nchar(dcall, type = "w") + nchar(sm[1L], type = "w") if (
is.na(w)) w <- 14L + nchar(dcall, type = "b") + nchar(sm[1L], type = "b") if (w > LONG) prefix <- paste0(prefix, "\n ") } else prefix <- "Error : " msg <- paste0(prefix, conditionMessage(e), "\n") .Internal(seterrmessage(msg[1L])) if (!silent && identical(getOption("show.error.messages"), TRUE)) { cat(msg, file = outFile) .Internal(printDeferredWarnings()) } invisible(structure(msg, class = "try-error", condition = e))})
14: try(lapply(X = S, FUN = FUN, ...), silent = TRUE)
15: sendMaster(try(lapply(X = S, FUN = FUN, ...), silent = TRUE))
16: FUN(X[[i]], ...)
17: lapply(seq_len(cores), inner.do)
18: mclapply(1:vsamp, function(samp) sampling(network, pixels, min.r, max.r, min.c, max.c, vrnd), mc.cores = no.cores)
An irrecoverable exception occurred. R is aborting now ...
Any ideas why this would arise? My code will run just fine for a number of iterations, it is just that a few iterations will fail because of these errors. I have tried to develop a simplified implementation of the algorithm and that code is available
here. (See the code for "The structure of risk-sharing networks" under Works in Progress. The data is provided in that same directory.) The key function for the procedure is called "sampling" and I have pasted it here in case somebody can spot obvious issues:
sampling <- function(network, pixels, min.r, max.r, min.c, max.c, stop){
pixel.count <- nrow(pixels)
pixels <- pixels[sample(1:pixel.count),] # Randomize pixel order
pixels <- as.list(pixels) # Pixels to list
results <- vector("list", pixel.count) # List to store results
ntw1 <- network
r1 <- assortativity_degree(ntw1) # Calculate initial assortativity coeff.
c1 <- transitivity(ntw1, type="global", isolates="zero") # Calculate initial clustering coeff.
for (octr in 1:pixel.count){ # Run for each pixel
lb.r <- pixels[[1]][octr] # Unpack lower and upper bounds for pixel
ub.r <- pixels[[2]][octr]
lb.c <- pixels[[3]][octr]
ub.c <- pixels[[4]][octr]
center.r <- (lb.r + ub.r)/2 # Calculate pixel center
center.c <- (lb.c + ub.c)/2
rd1 <- ((r1 - center.r)/(max.r - min.r))^2 # Calculate components of distance formula
cd1 <- ((c1 - center.c)/(max.c - min.c))^2
d1 <- sqrt(rd1 + cd1) # Calculate initital distance
cond1 <- (r1 < lb.r) || (r1 >= ub.r)
cond2 <- (c1 < lb.c) || (c1 >= ub.c)
ictr <- 1 # Initialize inner counter
while ((cond1 || cond2) && ictr <= 1e+05){ # While outside pixel ...
ntw2 <- rewire(ntw1, with=keeping_degseq(loops=FALSE, niter=1)) # One trial
r2 <- assortativity_degree(ntw2) # Calculate new assortativity coeff.
c2 <- transitivity(ntw2, type="global", isolates="zero") # Calculate new clustering coeff.
rd2 <- ((r2 - center.r)/(max.r - min.r))^2
cd2 <- ((c2 - center.c)/(max.c - min.c))^2
d2 <- sqrt(rd2 + cd2) # Calculate new distance
if (d2 < d1) { # If moving in the right direction ...
ntw1 <- ntw2 # ... update values
r1 <- r2
c1 <- c2
d1 <- d2
cond1 <- (r1 < lb.r) || (r1 >= ub.r) # Check if still outside pixel
cond2 <- (c1 < lb.c) || (c1 >= ub.c)
}
ictr <- ictr + 1
}
if (ictr <= 1e+05){ # If exit was successful ...
ntw3 <- walk(ntw1, lb.r, ub.r, lb.c, ub.c, stop) # Execute walk
dist <- mean_distance(ntw3) # Calculate stats
component <- max(components(ntw3)$csize)
random.50 <- f.random(ntw3, 0.50, 1)
targeted.50 <- f.targeted(ntw3, 0.50)
targeted.75 <- f.targeted(ntw3, 0.75)
results[[octr]] <- list(dist, component, random.50, targeted.50, targeted.75)
} else {results[[octr]] <- rep(list(NA), 5)}
}
}
The inputs for the function include the network, a data table with the assortativity-clustering coordinates to visit ("pixels"), the overall maximum and minimum values of the assortativity-clustering space, and a stopping criterion. Any help would be much appreciated, please let me know if any additional information is necessary. Thanks!
Heath
--
Heath Henderson, PhD
Assistant Professor of Economics
Drake University
College of Business and Public Administration
359 Aliber Hall, Des Moines, IA 50311
515.271.2898 (Office)
612.867.4776 (Cell)