func()

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})
			}
		}
	}
}