Average geometric value of interval length.
Inheritance: BinaryCalculator, ICalculator
        /// <summary>
        /// Calculate std method.
        /// </summary>
        /// <param name="convoluted">
        /// The convoluted.
        /// </param>
        /// <param name="windowLen">
        /// The window len.
        /// </param>
        public void CalculateStd(ComplexChain convoluted, int windowLen)
        {
            var geometricMean = new GeometricMean();
            var arithmeticMean = new ArithmeticMean();

            foreach (KeyValuePair<List<string>, List<int>> accord in fullEntry.Entry())
            {
                PositionFilter.Filtrate(accord.Value, windowLen);
                var temp = new ComplexChain(accord.Value);
                double geometric = geometricMean.Calculate(temp, convoluted.Anchor);
                double arithmetic = arithmeticMean.Calculate(temp, convoluted.Anchor);
                double std = 1 - (1 / Math.Abs(arithmetic - geometric));
                if (!wordPriority.ContainsKey(std))
                {
                    wordPriority.Add(std, accord);
                }
            }
        }
        // TODO: refactor to using intervals manager
        /// <summary>
        /// Calculation method.
        /// </summary>
        /// <param name="manager">
        /// Intervals manager.
        /// </param>
        /// <param name="link">
        /// Link of intervals in chain.
        /// </param>
        /// <returns>
        /// Redundancy as <see cref="double"/>.
        /// </returns>
        public override double Calculate(BinaryIntervalsManager manager, Link link)
        {
            if (manager.FirstElement.Equals(manager.SecondElement))
            {
                return 0;
            }

            var firstElementCount = manager.FirstChain.OccurrencesCount;
            double avG = 0;
            int currentEntrance = 0;

            for (int i = 1; i <= firstElementCount; i++)
            {
                if (manager.GetBinaryInterval(i) > 0)
                {
                    if (currentEntrance == 0)
                    {
                        currentEntrance = manager.GetFirstAfter(manager.GetFirst(i));
                        if (link == Link.Start || link == Link.Both)
                        {
                            avG += Math.Log(currentEntrance, 2);
                        }
                    }
                    else
                    {
                        int nextEntrance = manager.GetFirstAfter(manager.GetFirst(i));
                        avG += Math.Log(nextEntrance - currentEntrance, 2);
                        currentEntrance = nextEntrance;
                    }
                }
            }

            if (link == Link.End || link == Link.Both)
            {
                avG += Math.Log(manager.Length - currentEntrance, 2);
            }

            avG = manager.PairsCount == 0 ? 0 : avG / manager.PairsCount;

            var geometricMeanCalculator = new GeometricMean();
            double binaryGeometricMean = geometricMeanCalculator.Calculate(manager, link);

            return 1 - (binaryGeometricMean / Math.Pow(2, avG));
        }