public void GaussianOpPrecision2() { Gamma Precision = Gamma.PointMass(3); Gaussian X = Gaussian.FromMeanAndVariance(3, 0.5); Gaussian Mean = Gaussian.FromMeanAndVariance(4, 1.0 / 3); Gamma precMsg = GaussianOp.PrecisionAverageConditional_slow(X, Mean, Precision); Console.WriteLine("{0}: {1}", Precision, precMsg); for (int i = 8; i < 30; i++) { Precision = Gamma.FromMeanAndVariance(3, System.Math.Pow(10, -i)); Gamma precMsg2 = GaussianOp.PrecisionAverageConditional_slow(X, Mean, Precision); double diff = precMsg.MaxDiff(precMsg2); Console.WriteLine("{0}: {1} diff={2}", Precision, precMsg2, diff); Assert.True(diff < 1e-8); precMsg2 = GaussianOp_Slow.PrecisionAverageConditional(X, Mean, Precision); diff = precMsg.MaxDiff(precMsg2); Console.WriteLine("{0}: {1} diff={2}", Precision, precMsg2, diff); Assert.True(diff < 1e-8); } }
public void GaussianOpPrecision() { Gamma precMsg, precMsg2; Gaussian X, Mean; Gamma Precision; X = Gaussian.FromNatural(-1.5098177152950143E-09, 1.061649960537027E-168); Mean = Gaussian.FromNatural(-3.6177299471249587, 0.11664740799025652); Precision = Gamma.FromShapeAndRate(306.39423695125572, 1.8326832031565403E+170); precMsg = Gamma.PointMass(0); precMsg2 = GaussianOp_Slow.PrecisionAverageConditional(X, Mean, Precision); Assert.True(precMsg.MaxDiff(precMsg2) < 1e-4); precMsg2 = GaussianOp.PrecisionAverageConditional(X, Mean, Precision); Assert.True(precMsg.MaxDiff(precMsg2) < 1e-4); X = Gaussian.FromNatural(-0.55657497231637854, 6.6259783218464713E-141); Mean = Gaussian.FromNatural(-2.9330116542965374, 0.07513822741674292); Precision = Gamma.FromShapeAndRate(308.8184220331475, 4.6489382805051884E+142); precMsg = Gamma.FromShapeAndRate(1.5000000000000628, 3.5279086383286634E+279); precMsg2 = GaussianOp_Slow.PrecisionAverageConditional(X, Mean, Precision); Assert.True(precMsg.MaxDiff(precMsg2) < 1e-4); precMsg2 = GaussianOp.PrecisionAverageConditional(X, Mean, Precision); Assert.True(precMsg.MaxDiff(precMsg2) < 1e-4); X = Gaussian.FromNatural(0, 1.0705890985886898E-153); Mean = Gaussian.PointMass(0); Precision = Gamma.FromShapeAndRate(1.6461630749684018, 1.0021354807958952E+153); precMsg = Gamma.FromShapeAndRate(1.3230815374839406, 5.7102212927459039E+151); precMsg2 = GaussianOp_Slow.PrecisionAverageConditional(X, Mean, Precision); Assert.True(precMsg.MaxDiff(precMsg2) < 1e-4); precMsg2 = GaussianOp.PrecisionAverageConditional(X, Mean, Precision); Assert.True(precMsg.MaxDiff(precMsg2) < 1e-4); GaussianOp.PrecisionAverageConditional(Gaussian.FromNatural(0, 0.00849303091340374), Gaussian.FromNatural(0.303940178036662, 0.0357912415805232), Gamma.FromNatural(0.870172077263786 - 1, 0.241027170904459)); GaussianOp.PrecisionAverageConditional(Gaussian.FromNatural(0, 0.932143343115292), Gaussian.FromNatural(0.803368837946732, 0.096549750816333), Gamma.FromNatural(0.63591693650741 - 1, 0.728459389753854)); GaussianOp.PrecisionAverageConditional(Gaussian.FromNatural(0, 0.799724777601531), Gaussian.FromNatural(0.351882387116497, 0.0795619408970522), Gamma.FromNatural(0.0398852019756498 - 1, 0.260567798400562)); GaussianOp.PrecisionAverageConditional(Gaussian.FromNatural(0, 0.826197353576402), Gaussian.FromNatural(0.655970732055591, 0.125333868956814), Gamma.FromNatural(0.202543332801453 - 1, 0.147645744563847)); precMsg = GaussianOp.PrecisionAverageConditional(new Gaussian(-6.235e+207, 1.947e+209), Gaussian.PointMass(11), Gamma.PointMass(7)); Assert.True(!double.IsNaN(precMsg.Rate)); Gaussian X0 = Gaussian.FromMeanAndVariance(3, 0.5); Gaussian Mean0 = Gaussian.FromMeanAndVariance(7, 1.0 / 3); Gamma Precision0 = Gamma.FromShapeAndScale(3, 3); precMsg = GaussianOp_Slow.PrecisionAverageConditional(Gaussian.FromNatural(0.010158033515400506, 0.0041117304509528533), Gaussian.FromNatural(33.157651455559929, 13.955304749880149), Gamma.FromShapeAndRate(7.1611372018172794, 1.8190207317123008)); precMsg = GaussianOp_Slow.PrecisionAverageConditional(Gaussian.FromNatural(-0.020177353724675218, 0.0080005002339157711), Gaussian.FromNatural(-12.303440746896294, 4.6439574387849714), Gamma.FromShapeAndRate(5.6778922774773992, 1.0667129560350435)); precMsg = GaussianOp_Slow.PrecisionAverageConditional(Gaussian.PointMass(248), Gaussian.FromNatural(0.099086933095776319, 0.00032349393599347853), Gamma.FromShapeAndRate(0.001, 0.001)); precMsg2 = GaussianOp.PrecisionAverageConditional_slow(Gaussian.PointMass(248), Gaussian.FromNatural(0.099086933095776319, 0.00032349393599347853), Gamma.FromShapeAndRate(0.001, 0.001)); Assert.True(precMsg.MaxDiff(precMsg2) < 0.3); precMsg = GaussianOp_Slow.PrecisionAverageConditional(Gaussian.FromNatural(-0.21769764449791806, 0.0000024898838689952023), Gaussian.FromNatural(0, 0.5), Gamma.FromShapeAndRate(5, 5)); precMsg2 = GaussianOp.PrecisionAverageConditional_slow(Gaussian.FromNatural(-0.21769764449791806, 0.0000024898838689952023), Gaussian.FromNatural(0, 0.5), Gamma.FromShapeAndRate(5, 5)); //Console.WriteLine("{0} should be {1}", precMsg2, precMsg); Assert.True(precMsg.MaxDiff(precMsg2) < 1e-4); Gamma precMsg3 = GaussianOp_Laplace.PrecisionAverageConditional_slow(Gaussian.FromNatural(-0.21769764449791806, 0.0000024898838689952023), Gaussian.FromNatural(0, 0.5), Gamma.FromShapeAndRate(5, 5)); precMsg2 = GaussianOp.PrecisionAverageConditional(Gaussian.FromNatural(-0.21769764449791806, 0.0000024898838689952023), Gaussian.FromNatural(0, 0.5), Gamma.FromShapeAndRate(5, 5)); //Console.WriteLine("{0} should be {1}", precMsg2, precMsg); Assert.True(precMsg.MaxDiff(precMsg2) < 1e-4); Assert.True(GaussianOp.PrecisionAverageConditional_slow(Gaussian.FromNatural(-2.3874057896477092, 0.0070584383295080044), Gaussian.FromNatural(1.3999879871144227, 0.547354438587195), Gamma.FromShapeAndRate(3, 1)) .MaxDiff(Gamma.FromShapeAndRate(1.421, 55546)) < 10); // Unknown precision if (GaussianOp.ForceProper) { Assert.True(GaussianOp.PrecisionAverageConditional_slow(X0, Mean0, Precision0).MaxDiff(Gamma.FromShapeAndRate(1, 0.3632)) < 1e-4); } else { Assert.True(GaussianOp.PrecisionAverageConditional_slow(X0, Mean0, Precision0).MaxDiff(Gamma.FromShapeAndRate(-0.96304, -0.092572)) < 1e-4); } if (GaussianOp.ForceProper) { Assert.True(GaussianOp.PrecisionAverageConditional_slow(Gaussian.PointMass(3.0), Mean0, Precision0).MaxDiff(Gamma.FromShapeAndRate(1, 4.13824)) < 1e-4); } else { Assert.True(GaussianOp.PrecisionAverageConditional_slow(Gaussian.PointMass(3.0), Mean0, Precision0).MaxDiff(Gamma.FromShapeAndRate(-0.24693, 2.2797)) < 1e-4); } Assert.True(GaussianOp.PrecisionAverageConditional(3.0, 7.0).MaxDiff(Gamma.FromShapeAndRate(1.5, 8.0)) < 1e-4); Assert.True(GaussianOp.PrecisionAverageConditional_slow(new Gaussian(), Gaussian.PointMass(7.0), Precision0).MaxDiff(Gamma.FromShapeAndRate(1.0, 0.0)) < 1e-4); }