/// <summary>
        /// Minimize the function
        /// </summary>
        /// <param name="diffFunc">Function to minimize</param><param name="startingPoint">Starting point</param>
        /// <returns>
        /// The minimum
        /// </returns>
        public double[] Minimize(DiffFunc diffFunc, double[] startingPoint)
        {
            var solver = new CompactQuasiNewtonSolver();

            var length = startingPoint.Length;
            this.variables = new int[length];
            for (var index = 0; index < length; ++index)
            {
                solver.AddVariable(null, out this.variables[index]);
                solver.SetValue(this.variables[index], startingPoint[index]);
            }

            int vid;
            solver.AddRow(null, out vid);
            solver.AddGoal(vid, 0, true);
            solver.FunctionEvaluator = this.FunctionEvaluator;
            solver.GradientEvaluator = this.GradientEvaluator;

            this.func = diffFunc;
            this.curGradient = new double[length];
            this.curVariableVals = new double[length];

            var nonlinearSolution = solver.Solve(this.solverParams);

            var numArray = new double[length];
            for (var index = 0; index < length; ++index)
            {
                numArray[index] = nonlinearSolution.GetValue(this.variables[index]);
            }

            return numArray;
        }
        /// <summary>
        /// Minimize the function
        /// </summary>
        /// <param name="diffFunc">Function to minimize</param><param name="startingPoint">Starting point</param>
        /// <returns>
        /// The minimum
        /// </returns>
        public double[] Minimize(DiffFunc diffFunc, double[] startingPoint)
        {
            var solver = new CompactQuasiNewtonSolver();

            var length = startingPoint.Length;

            this.variables = new int[length];
            for (var index = 0; index < length; ++index)
            {
                solver.AddVariable(null, out this.variables[index]);
                solver.SetValue(this.variables[index], startingPoint[index]);
            }

            int vid;

            solver.AddRow(null, out vid);
            solver.AddGoal(vid, 0, true);
            solver.FunctionEvaluator = this.FunctionEvaluator;
            solver.GradientEvaluator = this.GradientEvaluator;

            this.func            = diffFunc;
            this.curGradient     = new double[length];
            this.curVariableVals = new double[length];

            var nonlinearSolution = solver.Solve(this.solverParams);

            var numArray = new double[length];

            for (var index = 0; index < length; ++index)
            {
                numArray[index] = nonlinearSolution.GetValue(this.variables[index]);
            }

            return(numArray);
        }