public static Wishart SampleAverageConditional2(double shape, [Proper] Wishart rate, Wishart to_rate, Wishart result) { Wishart ratePost = rate * to_rate; PositiveDefiniteMatrix r = ratePost.GetMean(); return(WishartFromShapeAndRateOp.SampleAverageConditional(shape, r, result)); }
/// <include file='FactorDocs.xml' path='factor_docs/message_op_class[@name="WishartFromShapeAndRateOp_Laplace2"]/message_doc[@name="RateAverageConditional(Wishart, double, Wishart, Wishart, Wishart)"]/*'/> public static Wishart RateAverageConditional([SkipIfUniform] Wishart sample, double shape, Wishart rate, Wishart to_rate, Wishart result) { if (sample.IsPointMass) { return(WishartFromShapeAndRateOp.RateAverageConditional(sample.Point, shape, result)); } // f(Y,R) = |Y|^(a-c) |R|^a exp(-tr(YR)) // p(Y) = |Y|^(a_y-c) exp(-tr(YB_y) // p(R) = |R|^(a_r-c) exp(-tr(RB_r) // int_Y f(Y,R) p(Y) dY = |R|^a |R+B_y|^-(a+a_y-c) int dim = sample.Dimension; double c = 0.5 * (dim + 1); double shape2 = shape - c + sample.Shape; Wishart ratePost = rate * to_rate; PositiveDefiniteMatrix r = ratePost.GetMean(); PositiveDefiniteMatrix rby = r + sample.Rate; PositiveDefiniteMatrix invrby = rby.Inverse(); PositiveDefiniteMatrix rInvrby = rby; rInvrby.SetToProduct(r, invrby); double xxddlogp = Matrix.TraceOfProduct(rInvrby, rInvrby) * shape2; double delta = -xxddlogp / dim; PositiveDefiniteMatrix invR = r.Inverse(); PositiveDefiniteMatrix dlogp = invrby; dlogp.Scale(-shape2); LowerTriangularMatrix rChol = new LowerTriangularMatrix(dim, dim); rChol.SetToCholesky(r); result.SetDerivatives(rChol, invR, dlogp, xxddlogp, GammaFromShapeAndRateOp.ForceProper, shape); return(result); }