/// <summary> /// This method was created in VisualAge. /// <summary> /// <returns>double[]</returns> /// <param name="values">cern.it.hepodbms.primitivearray.DoubleArrayList</param> /// <param name="phis">double[]</param> public static double ObservedEpsilonAtPhi(double phi, ExactDoubleQuantileFinder exactFinder, IDoubleQuantileFinder approxFinder) { int N = (int)exactFinder.Size; int exactRank = (int)Utils.EpsilonCeiling(phi * N) - 1; //Console.WriteLine("exactRank="+exactRank); var tmp = exactFinder.QuantileElements(new DoubleArrayList(new double[] { phi }))[0]; // just to ensure exactFinder is sorted double approxElement = approxFinder.QuantileElements(new DoubleArrayList(new double[] { phi }))[0]; //Console.WriteLine("approxElem="+approxElement); IntArrayList approxRanks = BinaryMultiSearch(exactFinder.Buffer, approxElement); int from = approxRanks[0]; int to = approxRanks[1]; int distance; if (from <= exactRank && exactRank <= to) { distance = 0; } else { if (from > exactRank) { distance = System.Math.Abs(from - exactRank); } else { distance = System.Math.Abs(exactRank - to); } } double epsilon = (double)distance / (double)N; return(epsilon); }
/// <summary> /// This method was created in VisualAge. /// <summary> /// <returns>double[]</returns> /// <param name="values">cern.it.hepodbms.primitivearray.DoubleArrayList</param> /// <param name="phis">double[]</param> public static DoubleArrayList ObservedEpsilonsAtPhis(DoubleArrayList phis, ExactDoubleQuantileFinder exactFinder, IDoubleQuantileFinder approxFinder, double desiredEpsilon) { DoubleArrayList epsilons = new DoubleArrayList(phis.Count); for (int i = phis.Count; --i >= 0;) { double epsilon = ObservedEpsilonAtPhi(phis[i], exactFinder, approxFinder); epsilons.Add(epsilon); if (epsilon > desiredEpsilon) Console.WriteLine("Real epsilon = " + epsilon + " is larger than desired by " + (epsilon - desiredEpsilon)); } return epsilons; }