in vermeer/algorithms/cycle_detection.go [139:173]
func (cdw *CycleDetectionWorker) Compute(vertexID uint32, pID int) {
if cdw.useVertexFilter && !cdw.vertexFilter.Filter(vertexID) {
return
}
_ = pID
vIDx := vertexID - cdw.WContext.GraphData.VertIDStart
if cdw.WContext.Step == 1 {
cdw.inEdges[vertexID] = make([]serialize.SUint32, 0, len(cdw.WContext.GraphData.Edges.GetInEdges(vIDx)))
tempMap := make(map[serialize.SUint32]struct{})
for idx, edge := range cdw.WContext.GraphData.Edges.GetInEdges(vIDx) {
if cdw.useVertexFilter && !cdw.vertexFilter.Filter(uint32(edge)) ||
cdw.useEdgeFilter && !cdw.edgeFilter.Filter(vIDx, uint32(idx)) {
continue
}
if _, ok := tempMap[edge]; ok || vertexID == uint32(edge) {
continue
}
tempMap[edge] = struct{}{}
cdw.inEdges[vertexID] = append(cdw.inEdges[vertexID], edge)
}
} else {
switch cdw.mode {
case All, Limit:
for _, edge := range cdw.inEdges[vertexID] {
if cdw.WContext.GraphData.Vertex.GetVertex(vertexID).ID < cdw.WContext.GraphData.Vertex.GetVertex(uint32(edge)).ID {
cdw.dfs(serialize.SUint32(vertexID), edge, []serialize.SUint32{edge})
}
}
case Boolean:
for _, edge := range cdw.inEdges[vertexID] {
cdw.dfs(serialize.SUint32(vertexID), edge, []serialize.SUint32{edge})
}
}
}
}