//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; } }
//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; } }