示例#1
0
        // Возвращает число циклов порядка 3 прикрепленных к данному узлу
        // в нулевом элементе SortedDictionary<int, double>.
        // Число циклов вычисляется в данном узле данного уровня.
        private SortedDictionary <Double, Double> Count3CycleOfVertex(int vertexNumber, int level)
        {
            SortedDictionary <Double, Double> result = new SortedDictionary <Double, Double>();

            result[0] = 0;  // число циклов 3 прикрепленных к данному узлу
            result[1] = 0;  // число ребер в данном подграфе (такое вычисление повышает эффективность)

            if (level == container.Level)
            {
                return(result);
            }
            else
            {
                int      numberNode  = container.TreeIndex(vertexNumber, level);
                int      vertexIndex = container.TreeIndex(vertexNumber, level + 1) % container.BranchingIndex;
                BitArray node        = container.TreeNode(level, numberNode);
                double   powPK       = Math.Pow(container.BranchingIndex, container.Level - level - 1);

                SortedDictionary <Double, Double> previousResult = Count3CycleOfVertex(vertexNumber, level + 1);
                result[0] += previousResult[0];
                result[1] += previousResult[1];

                double degree = container.VertexDegree(vertexNumber, level + 1);
                int    nj     = numberNode * container.BranchingIndex;
                for (int j = nj; j < container.BranchingIndex * (numberNode + 1); ++j)
                {
                    if (container.AreConnectedTwoBlocks(node, vertexIndex, j - nj))
                    {
                        result[0] += container.CalculateNumberOfEdges(level + 1, j);
                        result[0] += powPK * degree;

                        for (int k = j + 1; k < container.BranchingIndex * (numberNode + 1); ++k)
                        {
                            if (container.AreConnectedTwoBlocks(node, j - nj, k - nj) &&
                                container.AreConnectedTwoBlocks(node, k - nj, vertexIndex))
                            {
                                result[0] += powPK * powPK;
                            }
                        }
                    }
                }

                return(result);
            }
        }
 protected override Double CalculateEdgesCountOfNetwork()
 {
     // TODO maybe non recursive calculation is available?
     return(container.CalculateNumberOfEdges(0, 0));
 }