private SimilarNodeInfo CreateSimilarNodeInfo(SimilarNodeInfo[] colSimilarNodeInfo, int nodeId) { colSimilarNodeInfo[nodeId] = new SimilarNodeInfo { NodeId = nodeId, SimilarNeighborsCount = 0, SimilarNodeId = -1 }; return(colSimilarNodeInfo[nodeId]); }
private bool UpdateSimilarNodeInfo(SimilarNodeInfo similarNodeInfo, int nearNeighborId, int sameNodesCount) { if (similarNodeInfo.SimilarNeighborsCount < sameNodesCount) { similarNodeInfo.SimilarNeighborsCount = sameNodesCount; similarNodeInfo.SimilarNodeId = nearNeighborId; return(true); } return(false); }
private IEnumerable <SimilarNodeInfo> GetSimilarNodeInfo(IGraph graph) { var graphSize = graph.Size; var colSimilarNodeInfo = new SimilarNodeInfo[graphSize]; var degreeDispersion = 100; Parallel.For(0, graphSize, nodeId => { var similarNodeInfo = CreateSimilarNodeInfo(colSimilarNodeInfo, nodeId); var node = graph.GetNode(nodeId); if (node.Degree <= 2) { return; } foreach (var nearNeighborId in graph.GetNeighbors(nodeId, 2)) { var nearNode = graph.GetNode(nearNeighborId); if (nodeId == nearNeighborId) { continue; } var isNearNodeDegreeInsideDispersion = nearNode.Degree <= node.Degree ? node.Degree - nearNode.Degree <= degreeDispersion : nearNode.Degree - node.Degree <= degreeDispersion; if (!isNearNodeDegreeInsideDispersion) //TODO: Otestovat vhodnou hodnotu 100 { continue; } var sameNodesCount = GetNumberOfSameNeighbors(node, nearNode); UpdateSimilarNodeInfo(similarNodeInfo, nearNeighborId, sameNodesCount); if (sameNodesCount == node.Degree) { return; } } }); return(colSimilarNodeInfo); }