Example #1
0
        //Converts an Algo Rational to an Algo Float.
        public static BigFloat RationalToFloat(AlgoValue rational)
        {
            BigInteger numerator   = ((BigRational)rational.Value).FractionalPart.Numerator;
            BigInteger denominator = ((BigRational)rational.Value).FractionalPart.Denominator;

            return(BigFloat.Divide(new BigFloat(numerator), new BigFloat(denominator)));
        }
Example #2
0
        private static flo SumOfDigits(flo num)
        {
            flo sum = 0;

            while (num > 0)
            {
                sum += num % 10;
                num  = num.Divide(10).Floor();
            }

            return(sum);
        }
Example #3
0
 public XY(BigInteger p, BigInteger q, BigInteger n, BigInteger totient, int x, int y)
 {
     X          = x;
     Y          = y;
     N          = n;
     P          = p;
     Q          = q;
     Totient    = totient;
     Ratio      = BigFloat.Divide(Totient, N);
     Diff       = double.Parse(BigInteger.Subtract(N, Totient).ToString());
     NDynamic   = BigInteger.Parse(N.ToString().Substring(Y));
     TotDynamic = BigInteger.Parse(Totient.ToString().Substring(Y));
     NDouble    = double.Parse(NDynamic.ToString());
     TotDouble  = double.Parse(TotDynamic.ToString());
 }
Example #4
0
        public static void WriteToTxt(List <BalancedNumber> numbers, bool extended)
        {
            StreamWriter writer = new StreamWriter(File.Open(basePath + (extended ? "Balanced Numbers Extended.txt" : "Balanced Numbers.txt"), FileMode.OpenOrCreate));
            int          i      = 0;

            foreach (BalancedNumber bn in numbers)
            {
                writer.WriteLine("Balanced number #{0}", i + 1);
                writer.WriteLine("\tNumber:          {0}", bn.number.ToString());
                if (extended)
                {
                    writer.WriteLine("\t  Digit Count:   {0}", GetDigits(bn.number).ToString());
                    WritePrimeFactors(bn.PrimeFactors.number, writer);
                }


                writer.WriteLine("\tSideNum:         {0}", bn.sideSum.ToString());
                if (extended)
                {
                    writer.WriteLine("\t  Digit Count:   {0}", GetDigits(bn.sideSum).ToString());
                    WritePrimeFactors(bn.PrimeFactors.sideSum, writer);
                }
                writer.WriteLine("\tK:               {0}", bn.k.ToString());
                if (extended)
                {
                    writer.WriteLine("\t  Digit Count:   {0}", GetDigits(bn.k).ToString());
                    WritePrimeFactors(bn.PrimeFactors.k, writer);
                }
                writer.WriteLine("\tKfactor:         {0}", bn.KFactor.ToString());
                if (extended)
                {
                    TestRational(bn.k, bn.PrimeFactors.kFactorNumerator, bn.number, bn.PrimeFactors.kFactorDenominator, writer);
                }
                if (i < numbers.Count - 1)
                {
                    BigFloat floatn   = bn.number;
                    BigFloat quoitent = BigFloat.Divide(numbers[i + 1].number, floatn, AccuracyGoal.Absolute(floatn.BinaryPrecision), RoundingMode.TowardsNearest);
                    writer.WriteLine("\tnFactor to next: {0}", quoitent.ToString());
                    writer.WriteLine();
                }
                else
                {
                    writer.WriteLine("\tnFactor to next: N/A\n");
                }
                i++;
            }
            writer.Flush();
        }
        public Dictionary <string, BigFloat> GetClassScores(int i, bool passZeroProbs)
        {
            // Github Link: https://github.com/Osinko/BigFloat
            // This method uses BigFloat library for high precision probability calculations
            // When multiplication of probability values is performed consecutively, the value gets smaller and smaller
            List <string> uniqueClasses = trainFeatures[columns.Count - 1].Distinct().ToList();// Gets unique classes
            string        classColumn   = columns.Keys.Last();
            Dictionary <string, BigFloat> classScores = new Dictionary <string, BigFloat>();
            BigFloat numerator;
            BigFloat denominator     = new BigFloat(0);
            bool     denominatorFlag = false;
            double   eps             = 0.00001;// if passZeroProbs is selected, use this value as a probability value

            // CPT's consist of (part1|part2, prob_value) like strings. Each part has (rule$value) like elements. (rule$value) equals to (rule=value)
            // Example CPT element: (credit_history$all paid|own_telephone$none, class$bad)
            foreach (string uqClass in uniqueClasses)// Calculates probability values for each class
            {
                string queryP1;
                string part1, part2;
                // Creates query according to bayes formula;
                // P(class=x|test_sample)=(P(test_sample|class=x)P(class=x))/P(test_sample)
                numerator = new BigFloat(1);
                foreach (string str in columns.Keys)
                {
                    if (str == classColumn)// P(class=x) part
                    {
                        part1 = String.Format("{0}${1}", str, uqClass);
                        part2 = "";
                    }
                    else // P(test_sample|class=x) part
                    {    // Creates query from test data infos like '(part1|part2_element1,part2_element2)'
                        part1 = String.Format("{0}${1}|", str, testFeatures[columns[str]][i]);
                        part2 = "";
                        string[] part2Split = bayesNetStructure[str].Split(',');
                        string   splitter   = "";
                        for (int j = 0; j < part2Split.Length; j++)
                        {
                            if (part2Split[j] == classColumn)
                            {
                                part2 += String.Format("{0}{1}${2}", splitter, part2Split[j], uqClass);
                            }
                            else
                            {
                                part2 += String.Format("{0}{1}${2}", splitter, part2Split[j], testFeatures[columns[part2Split[j]]][i]);
                            }
                            splitter = ",";
                        }
                    }
                    queryP1 = part1 + part2;
                    double prob = CPT[str][queryP1];// Gets query's probability values from CPT
                    if (prob == 0 && passZeroProbs)
                    {
                        prob = eps;
                    }
                    numerator = numerator.Multiply(new BigFloat(prob));
                }

                if (!denominatorFlag)// P(test_sample) part
                {
                    denominatorFlag = true;
                    denominator     = new BigFloat(0);
                    foreach (string uqInnerClass in uniqueClasses)// Same calculation process with numerator, one difference is this loop calculates each possibilities for classes
                    {
                        BigFloat tempDenominator = new BigFloat(1);
                        foreach (string str in columns.Keys)
                        {
                            if (str == classColumn)// P(class=x) part
                            {
                                part1 = String.Format("{0}${1}", str, uqInnerClass);
                                part2 = "";
                            }
                            else // P(test_sample|class=x) part
                            {    // Creates query from test data infos like '(part1|part2_element1,part2_element2)'
                                part1 = String.Format("{0}${1}|", str, testFeatures[columns[str]][i]);
                                part2 = "";
                                string[] part2Split = bayesNetStructure[str].Split(',');
                                string   splitter   = "";
                                for (int j = 0; j < part2Split.Length; j++)
                                {
                                    if (part2Split[j] == classColumn)
                                    {
                                        part2 += String.Format("{0}{1}${2}", splitter, part2Split[j], uqInnerClass);
                                    }
                                    else
                                    {
                                        part2 += String.Format("{0}{1}${2}", splitter, part2Split[j], testFeatures[columns[part2Split[j]]][i]);
                                    }
                                    splitter = ",";
                                }
                            }
                            queryP1 = part1 + part2;
                            double prob = CPT[str][queryP1];// Gets query's probability values from CPT
                            if (prob == 0 && passZeroProbs)
                            {
                                prob = eps;
                            }
                            tempDenominator = tempDenominator.Multiply(new BigFloat(prob));
                        }
                        denominator = denominator.Add(tempDenominator);
                    }
                }

                if (denominator == 0)
                {
                    classScores[uqClass] = 0;
                }
                else
                {
                    classScores[uqClass] = numerator.Divide(denominator);
                }
            }

            return(classScores);
        }
Example #6
0
 public override BigFloat Divide(
     BigFloat dividend,
     BigFloat divisor)
 {
     return(BigFloat.Divide(dividend, divisor));
 }
 private void GetKFactor()
 {
     kFactor = BigFloat.Divide(kFactorRational.Numerator, kFactorRational.Denominator, AccuracyGoal.Absolute(kFactorRational.Numerator.BitCount + 10), RoundingMode.TowardsNegativeInfinity);
 }