예제 #1
0
파일: Concat.cs 프로젝트: mesgarpour/ERMER
        /// <summary>EP message to <c>second</c>.</summary>
        /// <param name="concat">Incoming message from <c>concat</c>. Must be a proper distribution. If any element is uniform, the result will be uniform.</param>
        /// <param name="first">Incoming message from <c>first</c>.</param>
        /// <param name="result">Modified to contain the outgoing message.</param>
        /// <returns>
        ///   <paramref name="result" />
        /// </returns>
        /// <remarks>
        ///   <para>The outgoing message is a distribution matching the moments of <c>second</c> as the random arguments are varied. The formula is <c>proj[p(second) sum_(concat,first) p(concat,first) factor(concat,first,second)]/p(second)</c>.</para>
        /// </remarks>
        /// <exception cref="ImproperMessageException">
        ///   <paramref name="concat" /> is not a proper distribution.</exception>
        public static VectorGaussian SecondAverageConditional([SkipIfUniform] VectorGaussian concat, VectorGaussian first, VectorGaussian result)
        {
            if (first.IsPointMass)
            {
                return(SecondAverageConditional(concat, first.Point, result));
            }
            int            dim1             = first.Dimension;
            VectorGaussian concatTimesFirst = new VectorGaussian(concat.Dimension);

            concatTimesFirst.MeanTimesPrecision.SetSubvector(0, first.MeanTimesPrecision);
            concatTimesFirst.Precision.SetSubmatrix(0, 0, first.Precision);
            concatTimesFirst.SetToProduct(concatTimesFirst, concat);
            concatTimesFirst.GetMarginal(dim1, result);
            return(result);
        }
예제 #2
0
파일: Concat.cs 프로젝트: mesgarpour/ERMER
        /// <summary>EP message to <c>first</c>.</summary>
        /// <param name="concat">Incoming message from <c>concat</c>. Must be a proper distribution. If any element is uniform, the result will be uniform.</param>
        /// <param name="second">Incoming message from <c>second</c>.</param>
        /// <param name="result">Modified to contain the outgoing message.</param>
        /// <returns>
        ///   <paramref name="result" />
        /// </returns>
        /// <remarks>
        ///   <para>The outgoing message is a distribution matching the moments of <c>first</c> as the random arguments are varied. The formula is <c>proj[p(first) sum_(concat,second) p(concat,second) factor(concat,first,second)]/p(first)</c>.</para>
        /// </remarks>
        /// <exception cref="ImproperMessageException">
        ///   <paramref name="concat" /> is not a proper distribution.</exception>
        public static VectorGaussian FirstAverageConditional([SkipIfUniform] VectorGaussian concat, VectorGaussian second, VectorGaussian result)
        {
            if (second.IsPointMass)
            {
                return(FirstAverageConditional(concat, second.Point, result));
            }
            int            dim1 = result.Dimension;
            VectorGaussian concatTimesSecond = new VectorGaussian(concat.Dimension);

            concatTimesSecond.MeanTimesPrecision.SetSubvector(dim1, second.MeanTimesPrecision);
            concatTimesSecond.Precision.SetSubmatrix(dim1, dim1, second.Precision);
            concatTimesSecond.SetToProduct(concatTimesSecond, concat);
            concatTimesSecond.GetMarginal(0, result);
            return(result);
        }
		/// <summary>
		/// EP message to 'second'
		/// </summary>
		/// <param name="concat">Incoming message from 'concat'. Must be a proper distribution.  If any element is uniform, the result will be uniform.</param>
		/// <param name="first">Incoming message from 'first'.</param>
		/// <param name="result">Modified to contain the outgoing message</param>
		/// <returns><paramref name="result"/></returns>
		/// <remarks><para>
		/// The outgoing message is a distribution matching the moments of 'second' as the random arguments are varied.
		/// The formula is <c>proj[p(second) sum_(concat,first) p(concat,first) factor(concat,first,second)]/p(second)</c>.
		/// </para></remarks>
		/// <exception cref="ImproperMessageException"><paramref name="concat"/> is not a proper distribution</exception>
		public static VectorGaussian SecondAverageConditional([SkipIfUniform] VectorGaussian concat, VectorGaussian first, VectorGaussian result)
		{
			if (first.IsPointMass) return SecondAverageConditional(concat, first.Point, result);
			int dim1 = first.Dimension;
			VectorGaussian concatTimesFirst = new VectorGaussian(concat.Dimension);
			concatTimesFirst.MeanTimesPrecision.SetSubvector(0, first.MeanTimesPrecision);
			concatTimesFirst.Precision.SetSubmatrix(0, 0, first.Precision);
			concatTimesFirst.SetToProduct(concatTimesFirst, concat);
			concatTimesFirst.GetMarginal(dim1, result);
			return result;
		}
		/// <summary>
		/// EP message to 'first'
		/// </summary>
		/// <param name="concat">Incoming message from 'concat'. Must be a proper distribution.  If any element is uniform, the result will be uniform.</param>
		/// <param name="second">Incoming message from 'second'.</param>
		/// <param name="result">Modified to contain the outgoing message</param>
		/// <returns><paramref name="result"/></returns>
		/// <remarks><para>
		/// The outgoing message is a distribution matching the moments of 'first' as the random arguments are varied.
		/// The formula is <c>proj[p(first) sum_(concat,second) p(concat,second) factor(concat,first,second)]/p(first)</c>.
		/// </para></remarks>
		/// <exception cref="ImproperMessageException"><paramref name="concat"/> is not a proper distribution</exception>
		public static VectorGaussian FirstAverageConditional([SkipIfUniform] VectorGaussian concat, VectorGaussian second, VectorGaussian result)
		{
			if (second.IsPointMass) return FirstAverageConditional(concat, second.Point, result);
			int dim1 = result.Dimension;
			VectorGaussian concatTimesSecond = new VectorGaussian(concat.Dimension);
			concatTimesSecond.MeanTimesPrecision.SetSubvector(dim1, second.MeanTimesPrecision);
			concatTimesSecond.Precision.SetSubmatrix(dim1, dim1, second.Precision);
			concatTimesSecond.SetToProduct(concatTimesSecond, concat);
			concatTimesSecond.GetMarginal(0, result);
			return result;
		}