SGLX

03/12/2011: Custom routine to generate total flow matrix (via class extension of SGL). SGLX contains a new concept, sglx (coded as sglx.mata), which inherits (Wiki link) class sgl in its entirety. The new concept implements a new routine that generates total flow matrix, a matrix that contains aggregate weight information based on results from breadth-first search (Wiki link). That is, finding that nodes i and k are connected via node j (based on unweighted network), we may want to know the total flow for nodes j and k, w_ij and w_ik=w_ij+w_jk, respectively, given we have separate data on edge weights. Thus the process is carried out in two stages - in the first stage we generate a weighted directed/undirected adjacency matrix, W. In the second stage, we use the new option flow() included in sglx.ado, specifying matrix W as the argument, to construct the total flow matrix, T. Furthermore, using path matrix P, we can calculate the average flow matrix F=T:/P (metaspeak). Thus example commands may be

. sgl W=adjacency(v1 v2 w), directed replace

. sglx T=flow(v1 v2), directed flow(W) replace infinity(0)

. sgl P=path(v1 v2), directed replace

. mata F=T:/P

Note that infinity() option can be specified to replace missing values in the total flow matrix with a real number. Also, since sglx inherits sgl, we could have used sglx to produce the weighted adjacency and path matrices.

Mata code to generate total flow matrix, flow_matrix.mata, is a modification of breadth-first search found in bfs.mata, and both mata files can be found in folder lsgl in the below attachment. flow_matrix.mata is included in lsgl.do, and thus the compiled Mata library lsgl.mlib contains the compiled code to generate total flow matrix. sglx.mata, which inherits class sgl and makes a call to function flow_matrix(), is also listed in lsgl.do.

The contents of the attachments are identical to SGL except for flow_matrix.mata and sglx.mata in folder lsgl, sglx.ado, and wflorentine_marriages2.dta which has randomly assigned edge weights (as a test dataset).

R code snippet to test total flow matrix routine is pasted below. 'igraph' package is used. Matrix A is unweighted directed/undirected adjacency matrix and W is weighted directed/undirected adjacency matrix. A and W are matrices read in using read.csv() and are generated using sgl/sglx.

# Generate igraph matrix.

G<-igraph::graph.adjacency(A,c(mode))

# Define return matrix.

T<-mat.or.vec(nrow(A),ncol(A))

# Loop through each node.

for(u in c(1:nrow(A))){

q=u-1

# Calculate shortest paths to all nodes.

g<-igraph::get.all.shortest.paths(G,q,mode=c("out"))

g2<-data.matrix(g)

# Loop shortest paths.

for(k in c(1:nrow(g2))){

t=2; sum=0; exit=0

if(is.na(g[[k]][t])==TRUE) next

while(exit!=1){

s=t-1

sum=sum+W[g[[k]][s]+1,g[[k]][t]+1]

t=t+1

if(is.na(g[[k]][t])==TRUE){

T[g[[k]][1]+1,g[[k]][t-1]+1]=T[g[[k]][1]+1,g[[k]][t-1]+1]+sum

exit=1

}

}

}

}