/// <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)); }