Ejemplo n.º 1
0
        // This is experimental (for now at least), trying to see if we can swap edges and change assortativity while
        // maintaining the degree vector, really need to reorganize this part. Would move it to a new class that inherits
        // from Graph, but I want to use it in ER and BA..
        public bool SwapRandomEdgesToIncreaseAssortativity()
        {
            Randomizer rand = new Randomizer();

            var edges = EdgesAsNodes.ToList();
            var e1    = edges[rand.Next(edges.Count)];
            var e2    = edges[rand.Next(edges.Count)];

            if (e1.Item1 == e2.Item1 || e1.Item1 == e2.Item2 || e1.Item2 == e2.Item1 || e1.Item2 == e2.Item2)
            {
                return(false);
            }


            var currVal = ((double)Math.Max(e1.Item1.Degree, e1.Item2.Degree) /
                           Math.Min(e1.Item1.Degree, e1.Item2.Degree) +
                           (double)Math.Max(e2.Item1.Degree, e2.Item2.Degree) /
                           Math.Min(e2.Item1.Degree, e2.Item2.Degree)) / 2.0;
            var e1Ae2A = ((double)Math.Max(e1.Item1.Degree, e2.Item1.Degree) /
                          Math.Min(e1.Item1.Degree, e2.Item1.Degree) +
                          (double)Math.Max(e1.Item2.Degree, e2.Item2.Degree) /
                          Math.Min(e1.Item2.Degree, e2.Item2.Degree)) / 2.0;
            var e1Ae2B = ((double)Math.Max(e1.Item1.Degree, e2.Item2.Degree) /
                          Math.Min(e1.Item1.Degree, e2.Item2.Degree) +
                          (double)Math.Max(e1.Item2.Degree, e2.Item1.Degree) /
                          Math.Min(e1.Item2.Degree, e2.Item1.Degree)) / 2.0;

            String oldDegSeq = String.Join(",", DegreeVector);

            if (e1Ae2A < currVal && e1Ae2A < e1Ae2B &&
                !e1.Item1.Neighbors.Contains(e2.Item1) && !e1.Item2.Neighbors.Contains(e2.Item2))
            {
                RemoveEdge(e1.Item1, e1.Item2);
                RemoveEdge(e2.Item1, e2.Item2);
                AddEdge(e1.Item1, e2.Item1);
                AddEdge(e1.Item2, e2.Item2);
                if (oldDegSeq != String.Join(",", DegreeVector))
                {
                    throw new Exception("Holy cow");
                }
                return(true);
            }
            else if (e1Ae2B < currVal && e1Ae2B < e1Ae2A &&
                     !e1.Item1.Neighbors.Contains(e2.Item2) && !e1.Item2.Neighbors.Contains(e2.Item1))
            {
                RemoveEdge(e1.Item1, e1.Item2);
                RemoveEdge(e2.Item1, e2.Item2);
                AddEdge(e1.Item1, e2.Item2);
                AddEdge(e1.Item2, e2.Item1);
                if (oldDegSeq != String.Join(",", DegreeVector))
                {
                    throw new Exception("Holy cow");
                }
                return(true);
            }
            return(false);
        }