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 Note that . sglx T=flow(v1 v2), directed flow(W) replace infinity(0) . sgl P=path(v1 v2), directed replace . mata F=T:/P 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 } } } } |