public void MaxTest()
        {
            Gaussian actual, expected;

            actual = MaxGaussianOp.MaxAverageConditional(Gaussian.FromNatural(6053.7946407740192, 2593.4559834344436), Gaussian.FromNatural(-1.57090676324773, 1.3751262174888785), Gaussian.FromNatural(214384.78500926663, 96523.508973471908));
            Assert.False(actual.IsProper());
            actual = MaxGaussianOp.MaxAverageConditional(Gaussian.FromNatural(146.31976467723146, 979.371757950659), Gaussian.FromNatural(0.075442729439046508, 0.086399540048904114), Gaussian.PointMass(0));
            Assert.False(actual.IsProper());

            actual   = MaxGaussianOp.MaxAverageConditional(Gaussian.Uniform(), Gaussian.PointMass(0), new Gaussian(-7.357e+09, 9.75));
            expected = Gaussian.PointMass(0);
            Assert.True(expected.MaxDiff(actual) < 1e-4);

            Gaussian max;

            max      = new Gaussian(4, 5);
            actual   = MaxGaussianOp.MaxAverageConditional(max, new Gaussian(0, 1), new Gaussian(2, 3));
            actual  *= max;
            expected = new Gaussian(2.720481395499785, 1.781481142817509);
            //expected = MaxPosterior(max, new Gaussian(0, 1), new Gaussian(2, 3));
            Assert.True(expected.MaxDiff(actual) < 1e-4);

            max = new Gaussian();
            max.MeanTimesPrecision = 0.2;
            max.Precision          = 1e-10;
            actual   = MaxGaussianOp.MaxAverageConditional(max, new Gaussian(0, 1), new Gaussian(0, 1));
            actual  *= max;
            expected = new Gaussian(0.702106815765215, 0.697676918460236);
            Assert.True(expected.MaxDiff(actual) < 1e-4);
        }
 public void MaxTest2()
 {
     foreach (double max in new[] { 0.0, 2.0 })
     {
         double oldm = double.NaN;
         double oldv = double.NaN;
         for (int i = 0; i < 300; i++)
         {
             Gaussian a    = new Gaussian(System.Math.Pow(10, i), 177);
             Gaussian to_a = MaxGaussianOp.AAverageConditional(max, a, 0);
             Gaussian to_b = MaxGaussianOp.BAverageConditional(max, 0, a);
             Assert.Equal(to_a, to_b);
             if (max == 0)
             {
                 Gaussian to_a2 = IsPositiveOp.XAverageConditional(false, a);
                 double   error = System.Math.Max(MMath.AbsDiff(to_a.MeanTimesPrecision, to_a2.MeanTimesPrecision, double.Epsilon),
                                                  MMath.AbsDiff(to_a.Precision, to_a2.Precision, double.Epsilon));
                 //Trace.WriteLine($"{a} {to_a} {to_a2} {error}");
                 Assert.True(error < 1e-12);
             }
             //else Trace.WriteLine($"{a} {to_a}");
             double m, v;
             to_a.GetMeanAndVariance(out m, out v);
             if (!double.IsNaN(oldm))
             {
                 Assert.True(v <= oldv);
                 double olddiff = System.Math.Abs(max - oldm);
                 double diff    = System.Math.Abs(max - m);
                 Assert.True(diff <= olddiff);
             }
             oldm = m;
             oldv = v;
         }
     }
 }
        private void Max_APointMass(Gaussian max, Gaussian b)
        {
            double   point   = 3;
            Gaussian toPoint = MaxGaussianOp.AAverageConditional(max, Gaussian.PointMass(point), b);

            //Console.WriteLine($"{point} {toPoint} {toPoint.MeanTimesPrecision:g17} {toPoint.Precision:g17}");
            if (max.IsPointMass && b.IsPointMass)
            {
                Gaussian toUniform = MaxGaussianOp.AAverageConditional(max, Gaussian.Uniform(), b);
                if (max.Point > b.Point)
                {
                    Assert.Equal(toUniform, max);
                }
                else
                {
                    Assert.Equal(toUniform, Gaussian.Uniform());
                }
            }
            double oldDiff = double.PositiveInfinity;

            for (int i = 3; i < 100; i++)
            {
                Gaussian a    = Gaussian.FromMeanAndPrecision(point, System.Math.Pow(10, i));
                Gaussian to_a = MaxGaussianOp.AAverageConditional(max, a, b);
                double   diff = toPoint.MaxDiff(to_a);
                //Console.WriteLine($"{a} {to_a} {to_a.MeanTimesPrecision:g17} {to_a.Precision:g17} {diff:g17}");
                if (diff < 1e-14)
                {
                    diff = 0;
                }
                Assert.True(diff <= oldDiff);
                oldDiff = diff;
            }
        }
Beispiel #4
0
 // Test inference on a model where precision is scaled.
 internal void GammaProductTest()
 {
     for (int i = 0; i <= 20; i++)
     {
         double minutesPlayed = System.Math.Pow(0.1, i);
         if (i == 20)
         {
             minutesPlayed = 0;
         }
         var EventCountMean_F           = Gaussian.PointMass(0);
         var EventCountPrecision_F      = GammaRatioOp.RatioAverageConditional(Gamma.PointMass(1), minutesPlayed);
         var realCount_F                = GaussianOp_PointPrecision.SampleAverageConditional(EventCountMean_F, EventCountPrecision_F);
         var realCount_use_B            = MaxGaussianOp.BAverageConditional(0.0, 0.0, realCount_F);
         var EventCountPrecision_B      = GaussianOp_PointPrecision.PrecisionAverageConditional(realCount_use_B, EventCountMean_F, EventCountPrecision_F);
         var EventsPerMinutePrecision_B = GammaRatioOp.AAverageConditional(EventCountPrecision_B, minutesPlayed);
         Console.WriteLine($"realCount_use_B = {realCount_use_B}, EventCountPrecision_B = {EventCountPrecision_B},  EventsPerMinutePrecision_B = {EventsPerMinutePrecision_B}");
     }
 }
        private void Max_MaxPointMass(Gaussian a, Gaussian b)
        {
            double   point   = 3;
            Gaussian toPoint = MaxGaussianOp.MaxAverageConditional(Gaussian.PointMass(point), a, b);
            //Console.WriteLine($"{point} {toPoint} {toPoint.MeanTimesPrecision} {toPoint.Precision}");
            double oldDiff = double.PositiveInfinity;

            for (int i = 5; i < 100; i++)
            {
                Gaussian max    = Gaussian.FromMeanAndPrecision(point, System.Math.Pow(10, i));
                Gaussian to_max = MaxGaussianOp.MaxAverageConditional(max, a, b);
                double   diff   = toPoint.MaxDiff(to_max);
                //Console.WriteLine($"{max} {to_max} {to_max.MeanTimesPrecision} {to_max.Precision} {diff}");
                if (diff < 1e-14)
                {
                    diff = 0;
                }
                Assert.True(diff <= oldDiff);
                oldDiff = diff;
            }
        }