in vermeer/algorithms/betweenness_centrality.go [156:213]
func (bcw *BetweennessCentralityWorker) Compute(vertexID uint32, pID int) {
if bcw.stopFlag {
return
}
vertID := vertexID - bcw.WContext.GraphData.VertIDStart
switch bcw.WContext.Step {
case 1:
inEdges := bcw.WContext.GraphData.Edges.GetInEdges(vertID)
bcw.neighborEdges[vertexID] = make([]serialize.SUint32, 0, len(inEdges))
for _, edge := range inEdges {
if !bcw.sample() || uint32(edge) == vertexID {
continue
}
bcw.neighborEdges[vertexID] = append(bcw.neighborEdges[vertexID], edge)
bcw.bfsNewValues[vertID][uint32(edge)] = [][]uint32{}
bcw.betweennessValueMap[vertexID][edge] = 0
if bcw.useEndPoint {
bcw.betweennessValueMap[vertexID][edge] += 1 * bcw.scale
}
}
bcw.stopSum[pID] = 1
default:
for k, v := range bcw.bfsOldValues[vertID] {
for _, nId := range bcw.neighborEdges[k] {
if !bcw.sample() || nId == serialize.SUint32(vertexID) {
continue
}
if _, ok := bcw.betweennessValueMap[vertexID][nId]; !ok {
bcw.stopSum[pID] = 1
bcw.tempEdges[pID] = append(bcw.tempEdges[pID], nId)
for _, vi := range v {
newV := append(vi, k)
bcw.bfsNewValues[vertID][uint32(nId)] = append(bcw.bfsNewValues[vertID][uint32(nId)], newV)
}
if len(v) == 0 {
bcw.bfsNewValues[vertID][uint32(nId)] = append(bcw.bfsNewValues[vertID][uint32(nId)], []uint32{k})
}
}
}
}
for _, edge := range bcw.tempEdges[pID] {
bcw.betweennessValueMap[vertexID][edge] = 0
if bcw.useEndPoint {
bcw.betweennessValueMap[vertexID][edge] += 1 * bcw.scale
}
}
}
bcw.tempEdges[pID] = bcw.tempEdges[pID][0:0]
for _, values := range bcw.bfsNewValues[vertID] {
for _, v := range values {
for _, u := range v {
bcw.betweennessValueMap[vertexID][serialize.SUint32(u)] +=
1.0 / serialize.SFloat32(len(values)) * bcw.scale
}
}
}
}