/// <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); }
/// <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; }