Author: Jakob Bossek
Date: 2017-12-20

# HowTo build custom generators

#### Jakob Bossek

#### 2017-12-20

# Custom generators

The graherator package already provides several node, edge and weight generators respectively. However, the collection is by far not complete and it does not aim to be. Therefore the user interface enables the definition of custom generators for each of the three steps (see basic graph generation vignette). A generator is a simple function myGenerator = function(graph, …). The first argument needs to be a grapherator object. More arguments are possible, but optional. Each generator must return a named list. The first field must be either coords (matrix of node coordinates) for node generators, adj.mat (logical matrix defining the adjacency matrix) or weights (numeric matrix of weights or list of numeric matrices) for weight generators respectively. The second field is named generator and contains a short string representation of the generator, e.g., DEG for Delauney Edge Generator.

In the following we demonstrate the definition of a custom edge generator, namely the Threshold Edge Generator. Given a graph and a positive numeric argument threshold this edge generator computes the pairwise Euclidean distances between the nodes and only keeps the edges whose distance is below the threshold value.

    library(grapherator)

    addEdgesThreshold = function(graph, threshold, ...) {
      n = getNumberOfNodes(graph)
      coords = getNodeCoordinates(graph)

      # compute distances
      dists = as.matrix(dist(coords, method = "euclidean", ...))

      # define adjacency matrix
      adj.mat = dists < threshold

      # no loops allowed
      diag(adj.mat) = FALSE

      # return required format
      return(list(adj.mat = adj.mat, generator = "ThEG"))
    }

Next, we create an example graph utilizing our custom edge generator.

    set.seed(1) # reproducability
    g = graph(lower = 0, upper = 100)
    g = addNodes(g, n = 25, generator = addNodesUniform)
    g = addEdges(g, generator = addEdgesThreshold, threshold = 30)
    # weight generation is skipped here
    plot(g)$pl.coords

Example network.

Due to smart internals the custom generators automatically work for intra- or intercluster linking without any adaptations. In the next example, we create a clustered network, apply the threshold edge generator for each cluster separately and connect cluster centers utilizing another edge generator.

    set.seed(1) # reproducability
    g = graph(lower = 0, upper = 100)
    g = addNodes(g, n = 5, generator = addNodesUniform)
    g = addNodes(g, n = 25, by.centers = TRUE, generator = addNodesGrid, lower = c(0, 0), upper = c(15, 15))
    g = addEdges(g, generator = addEdgesThreshold, threshold = 13, type = "intracluster")
    g = addEdges(g, generator = addEdgesDelauney, type = "intercenter")
    # weight generation is skipped here
    plot(g)$pl.coords

Example network.