示例#1
0
        //Vat computes given a graph
        public Integrity(LightWeightGraph lwg, bool reassignNodes = true, double alpha = 1.0f, double beta = 0.0f)
        {
            //set our alpha and beta variables
            Alpha = alpha; Beta = beta;

            //first we set our variables up
            _removedNodes     = new bool[lwg.NumNodes];
            _nodeRemovalOrder = new List <int>();
            _reassignNodes    = reassignNodes;

            //We will make a copy of the graph and set the label equal to the index
            g = new LightWeightGraph(lwg, _removedNodes);
            for (int i = 0; i < g.NumNodes; i++)
            {
                g.Nodes[i].Label = i;
            }

            if (lwg.NumNodes <= 2)
            {
                return;
            }

            bool threaded = Settings.Threading.ThreadHVAT;

            //This is where our estimate for Vat is calculated
            for (int n = 0; n < g.NumNodes - 1; n++)  // was g.NumNodes / 2
            {
                //get the graph
                LightWeightGraph gItter = new LightWeightGraph(g, _removedNodes);

                //get the betweeness
                Console.WriteLine("Getting betweenness for node " + n);
                double[] betweeness = (threaded) ? BetweenessCentrality.ParallelBrandesBcNodes(gItter) :
                                      BetweenessCentrality.BrandesBcNodes(gItter);
                //get the index of the maximum
                int indexMaxBetweeness = betweeness.IndexOfMax();
                int labelOfMax         = gItter.Nodes[indexMaxBetweeness].Label;

                //now we should add it to our list
                _nodeRemovalOrder.Add(labelOfMax);
                _removedNodes[labelOfMax] = true;
                //calculate vat and update the record
                double vat = CalculateIntegrity(_removedNodes);
                if (vat < _minVat)
                {
                    _minVat          = vat;
                    _numNodesRemoved = n + 1;
                }
            }

            //Now we need to set up S to reflect the actual minimum
            for (int i = 0; i < _removedNodes.Length; i++)
            {
                _removedNodes[i] = false;
            }
            for (int i = 0; i < _numNodesRemoved; i++)
            {
                _removedNodes[_nodeRemovalOrder[i]] = true;
            }
        }
示例#2
0
        //Vat computes given a graph
        public VAT(LightWeightGraph lwg, float alpha = 1.0f, float beta = 0.0f)
        {
            //set our alpha and beta variables
            this.alpha = alpha; this.beta = beta;

            //first we set our variables up
            removedNodes     = new bool[lwg.NumNodes];
            nodeRemovalOrder = new List <int>();
            //We will make a copy of the graph and set the label equal to the index
            g = new LightWeightGraph(lwg, removedNodes);
            for (int i = 0; i < g.NumNodes; i++)
            {
                g.Nodes[i].Label = i;
            }

            //This is where our estimate for Vat is calculated
            for (int n = 0; n < g.NumNodes / 2; n++)  // this was 32, I think a typo?
            {
                //get the graph
                LightWeightGraph gItter = new LightWeightGraph(g, removedNodes);

                //get the betweeness
                float[] BC = BetweenessCentrality.BrandesBcNodes(gItter);

                //get the index of the maximum
                int indexMaxBC = BC.IndexOfMax();
                int labelOfMax = gItter.Nodes[indexMaxBC].Label;

                //now we should add it to our list
                nodeRemovalOrder.Add(labelOfMax);
                removedNodes[labelOfMax] = true;
                //calculate vat and update the record
                float vat = CalculateVAT(removedNodes);
                if (vat < minVat)
                {
                    minVat          = vat;
                    numNodesRemoved = n + 1;
                }
                Console.WriteLine("Node {0} removed", n);
            }

            //Now we need to set up S to reflect the actual minimum
            for (int i = 0; i < removedNodes.Length; i++)
            {
                removedNodes[i] = false;
            }
            for (int i = 0; i < numNodesRemoved; i++)
            {
                removedNodes[nodeRemovalOrder[i]] = true;
            }

            //hillclimbing would go here
        }
        //Vat computes given a graph
        public HyperVATDeg(List <List <int> > overlaps, LightWeightGraph lwg, bool reassignNodes = true, double alpha = 1.0f, double beta = 0.0f)
        {
            //set our alpha and beta variables
            Alpha = alpha; Beta = beta;

            //first we set our variables up
            _removedNodes     = new bool[lwg.NumNodes];
            _nodeRemovalOrder = new List <int>();
            _reassignNodes    = reassignNodes;

            //We will make a copy of the graph and set the label equal to the index
            g = new LightWeightGraph(lwg, _removedNodes);
            for (int i = 0; i < g.NumNodes; i++)
            {
                g.Nodes[i].Label = i;
            }

            if (lwg.NumNodes <= 2)
            {
                return;
            }

            bool threaded = Settings.Threading.ThreadHVAT;

            int[] overlapsSize = new int[overlaps.Count];
            for (int i = 0; i < overlaps.Count; i++)
            {
                overlapsSize[i] = overlaps[i].Count;
            }

            //This is where our estimate for Vat is calculated
            for (int n = 0; n < 15; n++)
            {
                //get the graph
                LightWeightGraph gItter = new LightWeightGraph(g, _removedNodes);
                //sw.Restart();
                //get the betweeness
                //double[] betweeness = (threaded) ? BetweenessCentrality.ParallelBrandesBcNodes(gItter) :
                BetweenessCentrality.BrandesBcNodes(gItter);
                //sw.Stop();
                //Console.WriteLine("{0} {1}ms", n+1, sw.ElapsedMilliseconds);
                //get the index of the maximum
                int maxsize            = 0;
                int indexMaxBetweeness = 0;
                for (int i = 0; i < overlapsSize.Length; i++)
                {
                    if (overlapsSize[i] > maxsize)
                    {
                        maxsize            = overlapsSize[i];
                        indexMaxBetweeness = i;
                    }
                }

                //int indexMaxBetweeness = overlapsSize.IndexOfMax();
                int labelOfMax = gItter.Nodes[indexMaxBetweeness].Label;

                //now we should add it to our list
                // look in overlaps for a set that contains labelOfMax
                //for (int i = 0; i < overlaps.Count; i++)
                // {
                //    if (overlaps[i].Contains(labelOfMax))
                //    {
                _nodeRemovalOrder = _nodeRemovalOrder.Union(overlaps[indexMaxBetweeness]).ToList();
                for (int j = 0; j < overlaps[indexMaxBetweeness].Count; j++)
                {
                    _removedNodes[overlaps[indexMaxBetweeness][j]] = true;
                }
                overlapsSize[indexMaxBetweeness] = 0;
                //     }
                // }
                // _nodeRemovalOrder.Add(labelOfMax);
                // _removedNodes[labelOfMax] = true;
                //calculate vat and update the record
                double vat = CalculateVAT(_removedNodes);
                if (vat < _minVat)
                {
                    _minVat          = vat;
                    _numNodesRemoved = _nodeRemovalOrder.Count;
                }
            }

            //Now we need to set up S to reflect the actual minimum
            for (int i = 0; i < _removedNodes.Length; i++)
            {
                _removedNodes[i] = false;
            }
            for (int i = 0; i < _numNodesRemoved; i++)
            {
                _removedNodes[_nodeRemovalOrder[i]] = true;
            }
        }