コード例 #1
0
        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));
        }
コード例 #2
0
        /// <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));
                }
            });
        }