private void radioButton5_CheckedChanged_1(object sender, EventArgs e) { if (radioButton5.Checked) { label3.Text = radioButton5.Text + ":"; textBox3.Text = 16.ToString(); _errorMeasure = ErrorMeasure.ErrorGroupCountPerBlock; } }
private void radioButton4_CheckedChanged(object sender, EventArgs e) { if (radioButton4.Checked) { label3.Text = radioButton4.Text + ":"; textBox3.Text = 0.1M.ToString(CultureInfo.InvariantCulture); _errorMeasure = ErrorMeasure.ErrorProbability; } }
private void radioButton2_CheckedChanged(object sender, EventArgs e) { if (radioButton2.Checked) { label3.Text = radioButton2.Text + ":"; textBox3.Text = 1000.ToString(); _errorMeasure = ErrorMeasure.ErrorCount; } }
private void radioButton1_CheckedChanged(object sender, EventArgs e) { if (radioButton1.Checked) { label3.Text = radioButton1.Text + ":"; textBox3.Text = 5.ToString(); _errorMeasure = ErrorMeasure.ErrorPercentage; } }
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; }
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); }
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); }
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); }