Example #1
0
        static ulong MultinomCoefMethodTest(uint[] args, uint[] prevArgs, int prevPermutNumber, Func <uint[], ulong> method,
                                            ref bool methodIsCorrect, ulong correctResult, ulong maxError, ErrorMeasure errorMeasure,
                                            Dictionary <string, MultinomialResult> tempResults)
        {
            ulong result = 0;

            if (methodIsCorrect)
            {
                try
                {
                    result = method(args);
                }
                catch
                {
                    if (prevArgs != null)
                    {
                        result = method(prevArgs);
                        Console.WriteLine(string.Format("{0}({1}) = {2}; #{3}; overflow",
                                                        method.Method.Name, string.Join(",", prevArgs), result, prevPermutNumber));
                        tempResults[method.Method.Name] = new MultinomialResult
                        {
                            Number      = prevPermutNumber,
                            Permutation = prevArgs,
                            Result      = result,
                            ErrorType   = ErrorType.Overflow,
                            Error       = 0
                        };
                    }
                    else
                    {
                        Console.WriteLine(string.Format("{0}(x); #{1}; overflow", method.Method.Name, prevPermutNumber));
                        tempResults[method.Method.Name] = new MultinomialResult
                        {
                            Number      = -1,
                            Permutation = prevArgs,
                            Result      = 0,
                            ErrorType   = ErrorType.Overflow,
                            Error       = 0
                        };
                    }

                    methodIsCorrect = false;
                }

                var error = Multinomial.Diff(result, correctResult);
                if (methodIsCorrect && ((errorMeasure == ErrorMeasure.Absolute && error > maxError) ||
                                        (errorMeasure == ErrorMeasure.Relative && ((double)error * 10000000000000 / correctResult) > maxError)))
                {
                    if (prevArgs != null)
                    {
                        Console.WriteLine(string.Format("{0}({1}) = {2}; #{3}; rounding(error = {4}{5})",
                                                        method.Method.Name, string.Join(",", prevArgs), method(prevArgs),
                                                        prevPermutNumber, error,
                                                        errorMeasure == ErrorMeasure.Relative ? "%" : string.Empty));
                        tempResults[method.Method.Name] = new MultinomialResult
                        {
                            Number      = prevPermutNumber,
                            Permutation = prevArgs,
                            Result      = result,
                            ErrorType   = ErrorType.Rounding,
                            Error       = error
                        };
                    }
                    else
                    {
                        Console.WriteLine(string.Format("{0}(x); #{1}; rounding(error = {2}{3})",
                                                        method.Method.Name, prevPermutNumber, error,
                                                        errorMeasure == ErrorMeasure.Relative ? "%" : string.Empty));
                        tempResults[method.Method.Name] = new MultinomialResult
                        {
                            Number      = -1,
                            Permutation = prevArgs,
                            Result      = 0,
                            ErrorType   = ErrorType.Rounding,
                            Error       = error
                        };
                    }

                    methodIsCorrect = false;
                }
            }
            return(result);
        }