/// <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);
        }
Esempio n. 2
0
        /// <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;
        }