in vermeer/algorithms/cycle_detection.go [175:234]
func (cdw *CycleDetectionWorker) dfs(rootID serialize.SUint32, vertexID serialize.SUint32, stack []serialize.SUint32) {
//logrus.Infof("root:%v, vID:%v, stack:%v", rootID, vertexID, stack)
if len(stack) > cdw.maxLen {
return
}
temp := make(map[serialize.SUint32]struct{}, len(stack))
for _, node := range stack {
if _, ok := temp[node]; ok {
return
}
temp[node] = struct{}{}
}
for _, edge := range cdw.inEdges[vertexID] {
if _, ok := temp[edge]; ok {
continue
}
switch cdw.mode {
case All:
if cdw.WContext.GraphData.Vertex.GetVertex(uint32(rootID)).ID < cdw.WContext.GraphData.Vertex.GetVertex(uint32(edge)).ID {
cdw.dfs(rootID, edge, append(stack, edge))
} else if rootID == edge && len(stack) >= cdw.minLen {
vIDx := uint32(rootID) - cdw.WContext.GraphData.VertIDStart
newList := make([]serialize.SString, 0, len(stack))
for _, node := range stack {
newList = append(newList, serialize.SString(cdw.WContext.GraphData.Vertex.GetVertex(uint32(node)).ID))
}
cdw.cycleList[vIDx] = append(cdw.cycleList[vIDx], newList)
}
case Limit:
vIDx := uint32(rootID) - cdw.WContext.GraphData.VertIDStart
if len(cdw.cycleList[vIDx]) >= cdw.limit {
return
}
if cdw.WContext.GraphData.Vertex.GetVertex(uint32(rootID)).ID < cdw.WContext.GraphData.Vertex.GetVertex(uint32(edge)).ID {
cdw.dfs(rootID, edge, append(stack, edge))
} else if rootID == edge && len(stack) >= cdw.minLen {
vIDx := uint32(rootID) - cdw.WContext.GraphData.VertIDStart
newList := make([]serialize.SString, 0, len(stack))
for _, node := range stack {
newList = append(newList, serialize.SString(cdw.WContext.GraphData.Vertex.GetVertex(uint32(node)).ID))
}
cdw.cycleList[vIDx] = append(cdw.cycleList[vIDx], newList)
if len(cdw.cycleList[vIDx]) >= cdw.limit {
return
}
}
case Boolean:
if cdw.hasCycle[uint32(rootID)-cdw.WContext.GraphData.VertIDStart] == 1 {
return
}
if rootID != edge {
cdw.dfs(rootID, edge, append(stack, edge))
} else if len(stack) >= cdw.minLen {
cdw.hasCycle[uint32(rootID)-cdw.WContext.GraphData.VertIDStart] = 1
return
}
}
}
}