igraph-help
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[igraph] Segfault in rewiring procedure


From: Heath Henderson
Subject: [igraph] Segfault in rewiring procedure
Date: Thu, 25 Jan 2018 11:13:56 -0600

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)

reply via email to

[Prev in Thread] Current Thread [Next in Thread]