/// <include file='FactorDocs.xml' path='factor_docs/message_op_class[@name="WrappedGaussianProductOp"]/message_doc[@name="AAverageConditional(WrappedGaussian, double, WrappedGaussian)"]/*'/> public static WrappedGaussian AAverageConditional([SkipIfUniform] WrappedGaussian Product, double B, WrappedGaussian result) { result.Period = Product.Period / B; result.Gaussian = GaussianProductOp.AAverageConditional(Product.Gaussian, B); result.Normalize(); return(result); }
private void GaussianProductOp_APointMass(double aMean, Gaussian Product, Gaussian B) { bool isProper = Product.IsProper(); Gaussian A = Gaussian.PointMass(aMean); Gaussian result = GaussianProductOp.AAverageConditional(Product, A, B); Console.WriteLine("{0}: {1}", A, result); Gaussian result2 = isProper ? GaussianProductOp_Slow.AAverageConditional(Product, A, B) : result; Console.WriteLine("{0}: {1}", A, result2); Assert.True(result.MaxDiff(result2) < 1e-6); var Amsg = InnerProductOp_PointB.BAverageConditional(Product, DenseVector.FromArray(B.GetMean()), new PositiveDefiniteMatrix(new double[, ] { { B.GetVariance() } }), VectorGaussian.PointMass(aMean), VectorGaussian.Uniform(1)); //Console.WriteLine("{0}: {1}", A, Amsg); Assert.True(result.MaxDiff(Amsg.GetMarginal(0)) < 1e-6); double prevDiff = double.PositiveInfinity; for (int i = 3; i < 40; i++) { double v = System.Math.Pow(0.1, i); A = Gaussian.FromMeanAndVariance(aMean, v); result2 = isProper ? GaussianProductOp.AAverageConditional(Product, A, B) : result; double diff = result.MaxDiff(result2); Console.WriteLine("{0}: {1} diff={2}", A, result2, diff.ToString("g4")); //Assert.True(diff <= prevDiff || diff < 1e-6); result2 = isProper ? GaussianProductOp_Slow.AAverageConditional(Product, A, B) : result; diff = result.MaxDiff(result2); Console.WriteLine("{0}: {1} diff={2}", A, result2, diff.ToString("g4")); Assert.True(diff <= prevDiff || diff < 1e-6); prevDiff = diff; } }
/// <include file='FactorDocs.xml' path='factor_docs/message_op_class[@name="RatioGaussianOp"]/message_doc[@name="LogAverageFactor(double, Gaussian, double)"]/*'/> public static double LogAverageFactor(double ratio, Gaussian a, double b) { Gaussian to_ratio = GaussianProductOp.AAverageConditional(a, b); return(to_ratio.GetLogProb(ratio)); }
/// <include file='FactorDocs.xml' path='factor_docs/message_op_class[@name="RatioGaussianVmpOp"]/message_doc[@name="RatioAverageLogarithm(Gaussian, double)"]/*'/> public static Gaussian RatioAverageLogarithm([SkipIfUniform] Gaussian A, double B) { return(GaussianProductOp.AAverageConditional(A, B)); }
/// <summary>Computations that depend on the observed value of t7</summary> private void Changed_t7() { if (this.Changed_t7_isDone) { return; } this.t7_marginal = Gaussian.Uniform(); this.t7_marginal = Distribution.SetPoint <Gaussian, double>(this.t7_marginal, this.T7); Gaussian t1_F = default(Gaussian); this.t1_marginal_F = Gaussian.Uniform(); Gaussian t1_use_B = Gaussian.Uniform(); // Message to 't1' from GaussianFromMeanAndVariance factor t1_F = GaussianFromMeanAndVarianceOp.SampleAverageConditional(1.0, 1.0); Gaussian[] t1_uses_F; Gaussian[] t1_uses_B; // Create array for 't1_uses' Forwards messages. t1_uses_F = new Gaussian[2]; // Create array for 't1_uses' Backwards messages. t1_uses_B = new Gaussian[2]; t1_uses_B[1] = Gaussian.Uniform(); t1_uses_B[0] = Gaussian.Uniform(); t1_uses_F[1] = Gaussian.Uniform(); t1_uses_F[0] = Gaussian.Uniform(); Gaussian t2_F = default(Gaussian); // Message to 't2' from GaussianFromMeanAndVariance factor t2_F = GaussianFromMeanAndVarianceOp.SampleAverageConditional(10.0, 1.0); Gaussian[] t2_uses_B; // Create array for 't2_uses' Backwards messages. t2_uses_B = new Gaussian[2]; t2_uses_B[1] = Gaussian.Uniform(); Gaussian[] t2_uses_F; // Create array for 't2_uses' Forwards messages. t2_uses_F = new Gaussian[2]; t2_uses_F[0] = Gaussian.Uniform(); // Message to 't2_uses' from Replicate factor t2_uses_F[0] = ReplicateOp_NoDivide.UsesAverageConditional <Gaussian>(t2_uses_B, t2_F, 0, t2_uses_F[0]); // Message to 't1_uses' from Replicate factor t1_uses_F[0] = ReplicateOp_NoDivide.UsesAverageConditional <Gaussian>(t1_uses_B, t1_F, 0, t1_uses_F[0]); Gaussian vdouble6_F = default(Gaussian); // Message to 'vdouble6' from Plus factor vdouble6_F = DoublePlusOp.SumAverageConditional(t1_uses_F[0], t2_uses_F[0]); Gaussian t4_F = default(Gaussian); // Message to 't4' from GaussianFromMeanAndVariance factor t4_F = GaussianFromMeanAndVarianceOp.SampleAverageConditional(2.0, 1.0); Gaussian[] t4_uses_B; // Create array for 't4_uses' Backwards messages. t4_uses_B = new Gaussian[2]; t4_uses_B[0] = Gaussian.Uniform(); Gaussian[] t4_uses_F; // Create array for 't4_uses' Forwards messages. t4_uses_F = new Gaussian[2]; t4_uses_F[1] = Gaussian.Uniform(); // Message to 't4_uses' from Replicate factor t4_uses_F[1] = ReplicateOp_NoDivide.UsesAverageConditional <Gaussian>(t4_uses_B, t4_F, 1, t4_uses_F[1]); Gaussian vdouble6_use_B = default(Gaussian); // Message to 'vdouble6_use' from Product factor vdouble6_use_B = GaussianProductOp.AAverageConditional(this.T7, vdouble6_F, t4_uses_F[1]); // Message to 't1_uses' from Plus factor t1_uses_B[0] = DoublePlusOp.AAverageConditional(vdouble6_use_B, t2_uses_F[0]); // Message to 't1_use' from Replicate factor t1_use_B = ReplicateOp_NoDivide.DefAverageConditional <Gaussian>(t1_uses_B, t1_use_B); // Message to 't1_marginal' from Variable factor this.t1_marginal_F = VariableOp.MarginalAverageConditional <Gaussian>(t1_use_B, t1_F, this.t1_marginal_F); // Message to 't1_uses' from Replicate factor t1_uses_F[1] = ReplicateOp_NoDivide.UsesAverageConditional <Gaussian>(t1_uses_B, t1_F, 1, t1_uses_F[1]); this.t2_marginal_F = Gaussian.Uniform(); Gaussian t2_use_B = Gaussian.Uniform(); t2_uses_B[0] = Gaussian.Uniform(); t2_uses_F[1] = Gaussian.Uniform(); // Message to 't2_uses' from Plus factor t2_uses_B[0] = DoublePlusOp.BAverageConditional(vdouble6_use_B, t1_uses_F[0]); // Message to 't2_use' from Replicate factor t2_use_B = ReplicateOp_NoDivide.DefAverageConditional <Gaussian>(t2_uses_B, t2_use_B); // Message to 't2_marginal' from Variable factor this.t2_marginal_F = VariableOp.MarginalAverageConditional <Gaussian>(t2_use_B, t2_F, this.t2_marginal_F); // Message to 't2_uses' from Replicate factor t2_uses_F[1] = ReplicateOp_NoDivide.UsesAverageConditional <Gaussian>(t2_uses_B, t2_F, 1, t2_uses_F[1]); this.vdouble6_marginal_F = Gaussian.Uniform(); // Message to 'vdouble6_marginal' from DerivedVariable factor this.vdouble6_marginal_F = DerivedVariableOp.MarginalAverageConditional <Gaussian>(vdouble6_use_B, vdouble6_F, this.vdouble6_marginal_F); this.t4_marginal_F = Gaussian.Uniform(); Gaussian t4_use_B = Gaussian.Uniform(); t4_uses_B[1] = Gaussian.Uniform(); t4_uses_F[0] = Gaussian.Uniform(); // Message to 't4_uses' from Product factor t4_uses_B[1] = GaussianProductOp.BAverageConditional(this.T7, vdouble6_F, t4_uses_F[1]); // Message to 't4_use' from Replicate factor t4_use_B = ReplicateOp_NoDivide.DefAverageConditional <Gaussian>(t4_uses_B, t4_use_B); // Message to 't4_marginal' from Variable factor this.t4_marginal_F = VariableOp.MarginalAverageConditional <Gaussian>(t4_use_B, t4_F, this.t4_marginal_F); // Message to 't4_uses' from Replicate factor t4_uses_F[0] = ReplicateOp_NoDivide.UsesAverageConditional <Gaussian>(t4_uses_B, t4_F, 0, t4_uses_F[0]); Gaussian vdouble10_F = default(Gaussian); this.vdouble10_marginal_F = Gaussian.Uniform(); Gaussian vdouble10_use_B = Gaussian.Uniform(); // Message to 'vdouble10' from Plus factor vdouble10_F = DoublePlusOp.SumAverageConditional(t1_uses_F[1], t2_uses_F[1]); // Message to 'vdouble10_marginal' from DerivedVariable factor this.vdouble10_marginal_F = DerivedVariableOp.MarginalAverageConditional <Gaussian>(vdouble10_use_B, vdouble10_F, this.vdouble10_marginal_F); Gaussian t5_F = default(Gaussian); this.t5_marginal_F = Gaussian.Uniform(); Gaussian t5_use_B = Gaussian.Uniform(); // Message to 't5' from Product factor t5_F = GaussianProductOp.ProductAverageConditional(t5_use_B, vdouble10_F, t4_uses_F[0]); // Message to 't5_marginal' from DerivedVariable factor this.t5_marginal_F = DerivedVariableOp.MarginalAverageConditional <Gaussian>(t5_use_B, t5_F, this.t5_marginal_F); this.Changed_t7_isDone = true; }
public void ProductOpTest() { Assert.True(GaussianProductVmpOp.ProductAverageLogarithm( 2.0, Gaussian.FromMeanAndVariance(3.0, 5.0)).MaxDiff(Gaussian.FromMeanAndVariance(2 * 3, 4 * 5)) < 1e-8); Assert.True(GaussianProductOp.ProductAverageConditional( 2.0, Gaussian.FromMeanAndVariance(3.0, 5.0)).MaxDiff(Gaussian.FromMeanAndVariance(2 * 3, 4 * 5)) < 1e-8); Assert.True(GaussianProductOp.ProductAverageConditional(new Gaussian(0, 1), Gaussian.PointMass(2.0), Gaussian.FromMeanAndVariance(3.0, 5.0)).MaxDiff(Gaussian.FromMeanAndVariance(2 * 3, 4 * 5)) < 1e-8); Assert.True(GaussianProductVmpOp.ProductAverageLogarithm( 0.0, Gaussian.FromMeanAndVariance(3.0, 5.0)).MaxDiff(Gaussian.PointMass(0.0)) < 1e-8); Assert.True(GaussianProductOp.ProductAverageConditional( 0.0, Gaussian.FromMeanAndVariance(3.0, 5.0)).MaxDiff(Gaussian.PointMass(0.0)) < 1e-8); Assert.True(GaussianProductOp.ProductAverageConditional(new Gaussian(0, 1), Gaussian.PointMass(0.0), Gaussian.FromMeanAndVariance(3.0, 5.0)).MaxDiff(Gaussian.PointMass(0.0)) < 1e-8); Assert.True(GaussianProductVmpOp.ProductAverageLogarithm( Gaussian.FromMeanAndVariance(2, 4), Gaussian.FromMeanAndVariance(3, 5)).MaxDiff(Gaussian.FromMeanAndVariance(2 * 3, 4 * 5 + 3 * 3 * 4 + 2 * 2 * 5)) < 1e-8); Assert.True(GaussianProductOp.ProductAverageConditional(Gaussian.Uniform(), Gaussian.FromMeanAndVariance(2, 4), Gaussian.FromMeanAndVariance(3, 5)).MaxDiff(Gaussian.FromMeanAndVariance(2 * 3, 4 * 5 + 3 * 3 * 4 + 2 * 2 * 5)) < 1e-8); Assert.True(GaussianProductOp.ProductAverageConditional(Gaussian.FromMeanAndVariance(0, 1e16), Gaussian.FromMeanAndVariance(2, 4), Gaussian.FromMeanAndVariance(3, 5)).MaxDiff(Gaussian.FromMeanAndVariance(2 * 3, 4 * 5 + 3 * 3 * 4 + 2 * 2 * 5)) < 1e-4); Assert.True(GaussianProductOp.AAverageConditional(6.0, 2.0) .MaxDiff(Gaussian.PointMass(6.0 / 2.0)) < 1e-8); Assert.True(GaussianProductOp.AAverageConditional(6.0, new Gaussian(1, 3), Gaussian.PointMass(2.0)) .MaxDiff(Gaussian.PointMass(6.0 / 2.0)) < 1e-8); Assert.True(GaussianProductOp.AAverageConditional(0.0, 0.0).IsUniform()); Assert.True(GaussianProductOp.AAverageConditional(Gaussian.Uniform(), 2.0).IsUniform()); Assert.True(GaussianProductOp.AAverageConditional(Gaussian.Uniform(), new Gaussian(1, 3), Gaussian.PointMass(2.0)).IsUniform()); Assert.True(GaussianProductOp.AAverageConditional(Gaussian.Uniform(), new Gaussian(1, 3), new Gaussian(2, 4)).IsUniform()); Gaussian aPrior = Gaussian.FromMeanAndVariance(0.0, 1000.0); Assert.True((GaussianProductOp.AAverageConditional( Gaussian.FromMeanAndVariance(10.0, 1.0), aPrior, Gaussian.FromMeanAndVariance(5.0, 1.0)) * aPrior).MaxDiff( Gaussian.FromMeanAndVariance(2.208041421368822, 0.424566765678152)) < 1e-4); Gaussian g = new Gaussian(0, 1); Assert.True(GaussianProductOp.AAverageConditional(g, 0.0).IsUniform()); Assert.True(GaussianProductOp.AAverageConditional(0.0, 0.0).IsUniform()); Assert.True(GaussianProductVmpOp.AAverageLogarithm(g, 0.0).IsUniform()); Assert.True(Gaussian.PointMass(3.0).MaxDiff(GaussianProductVmpOp.AAverageLogarithm(6.0, 2.0)) < 1e-10); Assert.True(GaussianProductVmpOp.AAverageLogarithm(0.0, 0.0).IsUniform()); try { Assert.True(GaussianProductVmpOp.AAverageLogarithm(6.0, g).IsUniform()); Assert.True(false, "Did not throw NotSupportedException"); } catch (NotSupportedException) { } try { g = GaussianProductOp.AAverageConditional(12.0, 0.0); Assert.True(false, "Did not throw AllZeroException"); } catch (AllZeroException) { } try { g = GaussianProductVmpOp.AAverageLogarithm(12.0, 0.0); Assert.True(false, "Did not throw AllZeroException"); } catch (AllZeroException) { } }