public double GraphAssortativity2() { cacheIsEmpty = false; if (!Double.IsNegativeInfinity(_graphAssortativity2)) { return(_graphAssortativity2); } if (ExcessDegreeVariance == 0) // All vertices are the same degree, automatically perfect assortativity { return(_graphAssortativity2 = 1.0); } double M = Edges.Count(); double numerator = ((1 / M) * (EdgesAsNodes.Sum(e => e.Item1.Degree * e.Item2.Degree)) - Math.Pow((1 / M) * 0.5 * EdgesAsNodes.Sum(e => e.Item1.Degree + e.Item2.Degree), 2.0)); double denominator = ((1 / M) * 0.5 * EdgesAsNodes.Sum(e => Math.Pow(e.Item1.Degree, 2) + Math.Pow(e.Item2.Degree, 2)) - Math.Pow((1 / M) * 0.5 * EdgesAsNodes.Sum(e => e.Item1.Degree + e.Item2.Degree), 2.0)); return(_graphAssortativity2 = numerator / denominator); }