/// <include file='FactorDocs.xml' path='factor_docs/message_op_class[@name="MatrixVectorProductOp"]/message_doc[@name="BAverageConditional(VectorGaussianMoments, DistributionArray2D{Gaussian,double}, VectorGaussian)"]/*'/> public static VectorGaussian BAverageConditional([SkipIfUniform] VectorGaussianMoments product, DistributionArray2D <Gaussian, double> A, VectorGaussian result) { if (!A.IsPointMass) { throw new ArgumentException("A is not a point mass"); } return(BAverageConditional(product, new Matrix(A.Point), result)); }
/// <include file='FactorDocs.xml' path='factor_docs/message_op_class[@name="MatrixVectorProductOp"]/message_doc[@name="BAverageConditional(VectorGaussianMoments, Matrix, VectorGaussian)"]/*'/> public static VectorGaussian BAverageConditional([SkipIfUniform] VectorGaussianMoments product, Matrix A, VectorGaussian result) { if (product.IsPointMass) { return(BAverageConditional(product.Point, A, result)); } VectorGaussian productNatural = new VectorGaussian(product.Mean, product.Variance); return(BAverageConditional(productNatural, A, result)); }
/// <include file='FactorDocs.xml' path='factor_docs/message_op_class[@name="ArrayFromVectorOp"]/message_doc[@name="LogEvidenceRatio(IList{Gaussian}, VectorGaussian, VectorGaussian, IList{Gaussian})"]/*'/> public static double LogEvidenceRatio(IList <Gaussian> array, VectorGaussianMoments vector, [Fresh] VectorGaussianMoments to_vector, [Fresh] IList <Gaussian> to_array) { double result = LogAverageFactor(array, vector, to_vector); int length = array.Count; for (int i = 0; i < length; i++) { result -= to_array[i].GetLogAverageOf(array[i]); } return(result); }
/// <include file='FactorDocs.xml' path='factor_docs/message_op_class[@name="ArrayFromVectorOp"]/message_doc[@name="LogEvidenceRatio(double[], VectorGaussian)"]/*'/> public static double LogEvidenceRatio(double[] array, VectorGaussianMoments vector) { return(LogAverageFactor(array, vector)); }
/// <include file='FactorDocs.xml' path='factor_docs/message_op_class[@name="ArrayFromVectorOp"]/message_doc[@name="LogAverageFactor(double[], VectorGaussian)"]/*'/> public static double LogAverageFactor(double[] array, VectorGaussianMoments vector) { return(vector.GetLogProb(Vector.FromArray(array))); }
/// <include file='FactorDocs.xml' path='factor_docs/message_op_class[@name="ArrayFromVectorOp"]/message_doc[@name="ArrayAverageConditional{GaussianList}(IList{Gaussian}, VectorGaussianMoments, GaussianList)"]/*'/> /// <typeparam name="GaussianList">The type of the resulting array.</typeparam> public static GaussianList ArrayAverageConditional <GaussianList>( [NoInit] IList <Gaussian> array, [SkipIfUniform] VectorGaussianMoments vector, GaussianList result) where GaussianList : IList <Gaussian> { if (result.Count != vector.Dimension) { throw new ArgumentException("vector.Dimension (" + vector.Dimension + ") != result.Count (" + result.Count + ")"); } int length = result.Count; if (array.All(g => g.IsUniform()) || vector.IsUniform() || vector.IsPointMass) { for (int i = 0; i < length; i++) { result[i] = Gaussian.FromMeanAndVariance(vector.Mean[i], vector.Variance[i, i]); } } else { // Z = N(m1; m2, V1+V2) // logZ = -0.5 (m1-m2)'inv(V1+V2)(m1-m2) // dlogZ = (m1-m2)'inv(V1+V2) dm2 // ddlogZ = -dm2'inv(V1+V2) dm2 VectorGaussianMoments product = new VectorGaussianMoments(length); Vector mean = product.Mean; PositiveDefiniteMatrix variance = product.Variance; vector.GetMeanAndVariance(mean, variance); for (int i = 0; i < length; i++) { double m, v; array[i].GetMeanAndVariance(out m, out v); variance[i, i] += v; mean[i] -= m; } double offset = 1e-10; for (int i = 0; i < length; i++) { variance[i, i] += offset; } PositiveDefiniteMatrix precision = variance.Inverse(); Vector meanTimesPrecision = precision * mean; double precisionThreshold = 1; if (array.Any(g => g.Precision <= precisionThreshold)) { // compute the posterior mean and variance product.SetToProduct(vector, array); mean = product.Mean; variance = product.Variance; } for (int i = 0; i < length; i++) { if (array[i].Precision <= precisionThreshold) { result[i] = Gaussian.FromMeanAndVariance(mean[i], variance[i, i]) / array[i]; } else { double alpha = meanTimesPrecision[i]; double beta = precision[i, i]; if (double.IsNaN(alpha)) { throw new Exception("alpha is NaN"); } if (double.IsNaN(beta)) { throw new Exception("beta is NaN"); } result[i] = GaussianOp.GaussianFromAlphaBeta(array[i], alpha, beta, false); if (double.IsNaN(result[i].MeanTimesPrecision)) { throw new Exception("result is NaN"); } if (result[i].Precision < 0) { throw new Exception("result is improper"); } } } } return(result); }
/// <include file='FactorDocs.xml' path='factor_docs/message_op_class[@name="ArrayFromVectorOp"]/message_doc[@name="VectorAverageLogarithm(double[], VectorGaussian)"]/*'/> public static VectorGaussianMoments VectorAverageLogarithm(double[] array, VectorGaussianMoments result) { result.Point = result.Point; result.Point.SetTo(array); return(result); }
/// <include file='FactorDocs.xml' path='factor_docs/message_op_class[@name="ArrayFromVectorOp"]/message_doc[@name="VectorAverageConditional(double[], VectorGaussian)"]/*'/> public static VectorGaussianMoments VectorAverageConditional(double[] array, VectorGaussianMoments result) { return(VectorAverageLogarithm(array, result)); }
/// <include file='FactorDocs.xml' path='factor_docs/message_op_class[@name="ArrayFromVectorOp"]/message_doc[@name="VectorAverageLogarithm(IList{Gaussian}, VectorGaussian)"]/*'/> public static VectorGaussianMoments VectorAverageLogarithm([SkipIfAllUniform] IList <Gaussian> array, VectorGaussianMoments result) { if (result.Dimension != array.Count) { throw new ArgumentException("array.Count (" + array.Count + ") != result.Dimension (" + result.Dimension + ")"); } result.Variance.SetAllElementsTo(0.0); int length = array.Count; for (int i = 0; i < length; i++) { Gaussian item = array[i]; double m, v; item.GetMeanAndVariance(out m, out v); result.Variance[i, i] = v; result.Mean[i] = m; } return(result); }
/// <include file='FactorDocs.xml' path='factor_docs/message_op_class[@name="MatrixVectorProductOp"]/message_doc[@name="ProductAverageConditional(double[,], Vector, PositiveDefiniteMatrix, VectorGaussianMoments)"]/*'/> public static VectorGaussianMoments ProductAverageConditional(DistributionArray2D <Gaussian, double> A, Vector BMean, PositiveDefiniteMatrix BVariance, VectorGaussianMoments result) { if (!A.IsPointMass) { throw new ArgumentException("A is not a point mass"); } return(ProductAverageConditional(new Matrix(A.Point), BMean, BVariance, result)); }
public static double AverageLogFactor(IList <Gaussian> array, VectorGaussianMoments vector) { return(0.0); }
/// <include file='FactorDocs.xml' path='factor_docs/message_op_class[@name="MatrixVectorProductOp"]/message_doc[@name="BAverageLogarithm(VectorGaussianMoments, Matrix, VectorGaussian)"]/*'/> public static VectorGaussian BAverageLogarithm([SkipIfUniform] VectorGaussianMoments product, Matrix A, VectorGaussian result) { return(BAverageConditional(product, A, result)); }
/// <include file='FactorDocs.xml' path='factor_docs/message_op_class[@name="MatrixVectorProductOp"]/message_doc[@name="BAverageConditional(VectorGaussianMoments, double[,], VectorGaussian)"]/*'/> public static VectorGaussian BAverageConditional([SkipIfUniform] VectorGaussianMoments product, double[,] A, VectorGaussian result) { return(BAverageConditional(product, new Matrix(A), result)); }
/// <include file='FactorDocs.xml' path='factor_docs/message_op_class[@name="MatrixVectorProductOp"]/message_doc[@name="ProductAverageLogarithm(double[,], Vector, PositiveDefiniteMatrix, VectorGaussianMoments)"]/*'/> public static VectorGaussianMoments ProductAverageLogarithm(double[,] A, Vector BMean, PositiveDefiniteMatrix BVariance, VectorGaussianMoments result) { return(ProductAverageConditional(A, BMean, BVariance, result)); }
/// <include file='FactorDocs.xml' path='factor_docs/message_op_class[@name="ArrayFromVectorOp"]/message_doc[@name="LogAverageFactor(IList{Gaussian}, VectorGaussian, VectorGaussian)"]/*'/> public static double LogAverageFactor(IList <Gaussian> array, VectorGaussianMoments vector, [Fresh] VectorGaussianMoments to_vector) { return(vector.GetLogAverageOf(to_vector)); }
/// <include file='FactorDocs.xml' path='factor_docs/message_op_class[@name="ArrayFromVectorOp"]/message_doc[@name="VectorAverageConditional(IList{Gaussian}, VectorGaussian)"]/*'/> public static VectorGaussianMoments VectorAverageConditional([SkipIfAllUniform] IList <Gaussian> array, VectorGaussianMoments result) { return(VectorAverageLogarithm(array, result)); }
/// <include file='FactorDocs.xml' path='factor_docs/message_op_class[@name="MatrixVectorProductOp"]/message_doc[@name="ProductAverageConditional(Matrix, Vector, PositiveDefiniteMatrix, VectorGaussianMoments)"]/*'/> public static VectorGaussianMoments ProductAverageConditional(Matrix A, Vector BMean, PositiveDefiniteMatrix BVariance, VectorGaussianMoments result) { GetProductMoments(A, BMean, BVariance, result.Mean, result.Variance); return(result); }