// Возвращает число циклов порядка 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)); }