public void TestMaximumCentrality() //ну и хватит { var graph = FullCentralGraph(); var centrality = new DegreeCentrality(graph); var graphIn = centrality.GetGraphIndegreeCentrality(); var graphOut = centrality.GetGraphOutdegreeCentrality(); var verticeIn = centrality.GetVerticeIndegreeCentrality(0); var verticeOut = centrality.GetVerticeOutdegreeCentrality(0); Assert.That(graphIn, Is.EqualTo(graphOut).And.EqualTo(1)); Assert.That(verticeIn, Is.EqualTo(verticeOut).And.EqualTo(3)); }
/// <summary> /// Runs the algorithm. /// </summary> public override void RunAlgorithm(IGraph graph) { ResetGraph(graph); double maximumNodeCentrality; double minimumNodeCentrality; ResultItemMapping <INode, double> normalizedNodeCentrality; switch (algorithmType) { case CentralityMode.Weight: { var result = new WeightCentrality { Weights = { Delegate = GetEdgeWeight }, ConsiderOutgoingEdges = true, ConsiderIncomingEdges = true }.Run(graph); maximumNodeCentrality = result.MaximumNodeCentrality; minimumNodeCentrality = result.MinimumNodeCentrality; normalizedNodeCentrality = result.NormalizedNodeCentrality; break; } case CentralityMode.Graph: { var result = new GraphCentrality { Weights = { Delegate = GetEdgeWeight }, Directed = Directed }.Run(graph); maximumNodeCentrality = result.MaximumNodeCentrality; minimumNodeCentrality = result.MinimumNodeCentrality; normalizedNodeCentrality = result.NormalizedNodeCentrality; break; } case CentralityMode.NodeEdgeBetweenness: { var result = new BetweennessCentrality { Directed = Directed, Weights = { Delegate = GetEdgeWeight } }.Run(graph); maximumNodeCentrality = result.MaximumNodeCentrality; minimumNodeCentrality = result.MinimumNodeCentrality; normalizedNodeCentrality = result.NormalizedNodeCentrality; result.NormalizedEdgeCentrality.ForEach((edge, centralityId) => { edge.Tag = Math.Round(centralityId * 100.0) / 100; graph.AddLabel(edge, edge.Tag.ToString(), tag: "Centrality"); }); break; } case CentralityMode.Closeness: { var result = new ClosenessCentrality { Directed = Directed, Weights = { Delegate = GetEdgeWeight } }.Run(graph); maximumNodeCentrality = result.MaximumNodeCentrality; minimumNodeCentrality = result.MinimumNodeCentrality; normalizedNodeCentrality = result.NormalizedNodeCentrality; break; } case CentralityMode.Degree: default: { var result = new DegreeCentrality { ConsiderOutgoingEdges = true, ConsiderIncomingEdges = true }.Run(graph); maximumNodeCentrality = result.MaximumNodeCentrality; minimumNodeCentrality = result.MinimumNodeCentrality; normalizedNodeCentrality = result.NormalizedNodeCentrality; break; } } var min = minimumNodeCentrality / maximumNodeCentrality; var diff = 1 - min; var mostCentralValue = 100; var leastCentralValue = 30; var colorNumber = 50; normalizedNodeCentrality.ForEach((node, centralityId) => { var textLabelStyle = new DefaultLabelStyle { TextBrush = Brushes.White }; node.Tag = Math.Round(centralityId * 100.0) / 100; if (double.IsNaN((double)node.Tag) || double.IsNaN(diff)) { node.Tag = "Inf"; } graph.AddLabel(node, node.Tag.ToString(), style: textLabelStyle, tag: "Centrality"); if (diff == 0 || double.IsNaN(diff)) { graph.SetStyle(node, GetMarkedNodeStyle(0, colorNumber)); graph.SetNodeLayout(node, new RectD(node.Layout.X, node.Layout.Y, leastCentralValue, leastCentralValue)); } else { // adjust gradient color var colorScale = (colorNumber - 1) / diff; var index = Math.Max(0, Math.Min(colorNumber, (int)Math.Floor((centralityId - min) * colorScale))); graph.SetStyle(node, GetMarkedNodeStyle(index, colorNumber)); // adjust size var sizeScale = (mostCentralValue - leastCentralValue) / diff; var size = leastCentralValue + (centralityId - min) * sizeScale; graph.SetNodeLayout(node, new RectD(node.Layout.X, node.Layout.Y, size, size)); } }); }