Пример #1
0
        // new code to get GOI for communities
        // above function is not correct

        /*
         * public static double ComGOI(Matrix commDensity)
         * {
         *  double GOI = 0.0;
         *
         *
         *  return GOI;
         * }
         */

        public static Pair <double, double> COC(CommCollection cc)
        {
            double simple_sum = 0, complex_sum = 0;

            Matrix CBCO = cc.CommByCommOverlap;
            Vector v    = CBCO as Vector;

            if (CBCO.Cols == 1)
            {
                return(new Pair <double, double>(0.0, 0.0));
            }

            double denominator = (double)(((double)CBCO.Cols * ((double)CBCO.Cols - 1)) / 2.0);


            if (v != null)
            {
                Vector w = new Vector(v.Size);
                w.Clear();
                for (int i = 0; i < v.Size; ++i)
                {
                    for (int j = i + 1; j < v.Size; ++j)
                    {
                        w[j] += cc.GetCommByCommOverlap(i, j);
                    }
                }

                for (int j = 1; j < v.Size; ++j)
                {
                    double sum = w[j];
                    simple_sum += (sum / v[j]);
                    if (v[j] > 1)
                    {
                        complex_sum += (sum / (v[j] - 1));
                    }
                }
            }
            else
            {
                for (int j = 1; j < CBCO.Rows; ++j)
                {
                    double sum = 0.0;

                    for (int i = 0; i < j; ++i)
                    {
                        sum += CBCO[i, j];
                    }

                    simple_sum += sum / CBCO[j, j];
                    if (CBCO[j, j] > 1)
                    {
                        complex_sum += sum / (CBCO[j, j] - 1);
                    }
                }
            }

            return(new Pair <double, double>(simple_sum / denominator, complex_sum / denominator));
        }