Пример #1
0
 /// <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));
 }
Пример #2
0
        /// <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));
        }
Пример #3
0
        /// <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);
        }
Пример #4
0
 /// <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));
 }
Пример #5
0
 /// <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)));
 }
Пример #6
0
        /// <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);
        }
Пример #7
0
 /// <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);
 }
Пример #8
0
 /// <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));
 }
Пример #9
0
        /// <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);
        }
Пример #10
0
 /// <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));
 }
Пример #11
0
 public static double AverageLogFactor(IList <Gaussian> array, VectorGaussianMoments vector)
 {
     return(0.0);
 }
Пример #12
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));
 }
Пример #13
0
 /// <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));
 }
Пример #14
0
 /// <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));
 }
Пример #15
0
 /// <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));
 }
Пример #16
0
 /// <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));
 }
Пример #17
0
 /// <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);
 }