Example #1
0
        static void TestBigNumberMultinomial(uint maxError, ErrorMeasure errorMeasure)
        {
            Dictionary <string, MultinomialResult> tempResults = new Dictionary <string, MultinomialResult>();

            Results.AppendLine("Number of arguments	Naive	Binom	Log	LogGamma	My	BigNumber	Table");

            const uint maxNumber = 1000;

            uint iteration = 2;

            ulong result;
            int   prevPermutNumber;
            ulong prevResult;

            uint[] prevPermut;
            int    count = 0;

            do
            {
                Results.Append(iteration + "\t");
                tempResults.Clear();

                prevPermut       = null;
                prevResult       = 0;
                prevPermutNumber = -1;
                bool bigIsCorrect          = true;
                bool naiveIsCorrect        = true;
                bool binomIsCorrect        = true;
                bool logIsCorrect          = true;
                bool optIsCorrect          = true;
                bool lnGammaIsCorrect      = true;
                bool primeNumbersIsCorrect = true;

                Console.WriteLine("Arg count: " + iteration);
                uint[] combination;
                while ((combination = CombinationWithRepetition.Next(maxNumber, iteration)) != null)
                {
                    var currentCombintaion = combination.Select(a => a + 1).ToArray();
                    count++;

                    result = 0;
                    try
                    {
                        result = Multinomial.Big(currentCombintaion);
                    }
                    catch
                    {
                        bigIsCorrect = false;
                    }

                    if (bigIsCorrect)
                    {
                        MultinomCoefMethodTest(currentCombintaion, prevPermut, prevPermutNumber, Multinomial.Naive, ref naiveIsCorrect, result, maxError, errorMeasure, tempResults);
                        MultinomCoefMethodTest(currentCombintaion, prevPermut, prevPermutNumber, Multinomial.Binom, ref binomIsCorrect, result, maxError, errorMeasure, tempResults);
                        MultinomCoefMethodTest(currentCombintaion, prevPermut, prevPermutNumber, Multinomial.Log, ref logIsCorrect, result, maxError, errorMeasure, tempResults);
                        MultinomCoefMethodTest(currentCombintaion, prevPermut, prevPermutNumber, Multinomial.LogGamma, ref lnGammaIsCorrect, result, maxError, errorMeasure, tempResults);
                        MultinomCoefMethodTest(currentCombintaion, prevPermut, prevPermutNumber, Multinomial.My, ref optIsCorrect, result, maxError, errorMeasure, tempResults);
                        MultinomCoefMethodTest(currentCombintaion, prevPermut, prevPermutNumber, Multinomial.PrimeNumbers, ref primeNumbersIsCorrect, result, maxError, errorMeasure, tempResults);

                        prevPermut = (uint[])currentCombintaion.Clone();
                        prevResult = result;
                        prevPermutNumber++;
                    }
                    else
                    {
                        if (prevPermut != null)
                        {
                            PrintIfCorrect(Multinomial.Naive, prevPermut, prevPermutNumber, prevResult, naiveIsCorrect, tempResults);
                            PrintIfCorrect(Multinomial.Binom, prevPermut, prevPermutNumber, prevResult, binomIsCorrect, tempResults);
                            PrintIfCorrect(Multinomial.Log, prevPermut, prevPermutNumber, prevResult, logIsCorrect, tempResults);
                            PrintIfCorrect(Multinomial.LogGamma, prevPermut, prevPermutNumber, prevResult, lnGammaIsCorrect, tempResults);
                            PrintIfCorrect(Multinomial.My, prevPermut, prevPermutNumber, prevResult, optIsCorrect, tempResults);
                            PrintIfCorrect(Multinomial.PrimeNumbers, prevPermut, prevPermutNumber, prevResult, primeNumbersIsCorrect, tempResults);
                            PrintIfCorrect(Multinomial.Big, prevPermut, prevPermutNumber, prevResult, true, tempResults);

                            PrintTempResult("Naive", tempResults);
                            PrintTempResult("Binom", tempResults);
                            PrintTempResult("Log", tempResults);
                            PrintTempResult("LogGamma", tempResults);
                            PrintTempResult("My", tempResults);
                            PrintTempResult("PrimeNumbers", tempResults);
                            PrintTempResult("Big", tempResults);
                            Results.Remove(Results.Length - 1, 1);
                        }

                        Console.WriteLine();
                        break;
                    }
                }
                iteration++;

                Results.AppendLine();
            }while (prevPermut != null);
            Console.WriteLine("Count: {0}", count);
        }