/// <summary>
        ///   Computes a ROC curve with the given increment points
        /// </summary>
        ///
        public void Compute(params double[] cutpoints)
        {
            if (cutpoints.Length == 0)
            {
                throw new ArgumentException(
                          "Cutpoints array must have at least one value.", "cutpoints");
            }

            List <ReceiverOperatingCharacteristicPoint> points = new List <ReceiverOperatingCharacteristicPoint>();

            // Create the curve, computing a point for each cut-point
            for (int i = 0; i < cutpoints.Length; i++)
            {
                points.Add(ComputePoint(cutpoints[i]));
            }


            // Sort the curve by descending specificity
            points.Sort(new Comparison <ReceiverOperatingCharacteristicPoint>(order));


            // Create the point collection
            this.collection = new ReceiverOperatingCharacteristicPointCollection(points.ToArray());

            // Calculate area and error associated with this curve
            this.area  = calculateAreaUnderCurve();
            this.error = calculateStandardError();
        }
        /// <summary>
        ///   Computes a ROC curve with 1/increment points
        /// </summary>
        ///
        /// <param name="increment">The increment over the previous point for each point in the curve.</param>
        /// <param name="forceOrigin">True to force the inclusion of the (0,0) point, false otherwise. Default is false.</param>
        ///
        public void Compute(double increment, bool forceOrigin)
        {
            var    points = new List <ReceiverOperatingCharacteristicPoint>();
            double cutoff;

            // Create the curve, computing a point for each cutoff value
            for (cutoff = min; cutoff <= max; cutoff += increment)
            {
                points.Add(ComputePoint(cutoff));
            }


            // Sort the curve by descending specificity
            points.Sort(new Comparison <ReceiverOperatingCharacteristicPoint>(order));

            if (forceOrigin)
            {
                var last = points[points.Count - 1];
                if (last.FalsePositiveRate != 0.0 || last.Sensitivity != 0.0)
                {
                    points.Add(ComputePoint(Double.PositiveInfinity));
                }
            }


            // Create the point collection
            this.collection = new ReceiverOperatingCharacteristicPointCollection(points.ToArray());

            // Calculate area and error associated with this curve
            this.area  = calculateAreaUnderCurve();
            this.error = calculateStandardError();
        }