/// <include file='FactorDocs.xml' path='factor_docs/message_op_class[@name="ProductWishartOp"]/message_doc[@name="ProductAverageConditional(Wishart, PositiveDefiniteMatrix, Gamma, Gamma, Wishart)"]/*'/>
        public static Wishart ProductAverageConditional(Wishart Product, PositiveDefiniteMatrix A, [SkipIfUniform] Gamma B, Gamma to_B, Wishart result)
        {
            if (B.IsPointMass)
            {
                return(ProductAverageConditional(A, B.Point, result));
            }
            Gamma Bpost = B * to_B;
            // E[x] = a*E[b]
            // E[logdet(x)] = logdet(a) + d*E[log(b)]
            PositiveDefiniteMatrix m = new PositiveDefiniteMatrix(A.Rows, A.Cols);

            m.SetTo(A);
            m.Scale(Bpost.GetMean());
            double meanLogDet = A.Rows * Bpost.GetMeanLog() + A.LogDeterminant();

            if (m.LogDeterminant() < meanLogDet)
            {
                throw new MatrixSingularException(m);
            }
            Wishart.FromMeanAndMeanLogDeterminant(m, meanLogDet, result);
            result.SetToRatio(result, Product);
            return(result);
        }
 /// <summary>
 /// Sets the state of this estimator from the specified estimator.
 /// </summary>
 /// <param name="value"></param>
 public void SetTo(MatrixMeanVarianceAccumulator value)
 {
     Mean.SetTo(value.Mean);
     Variance.SetTo(value.Variance);
     Count = value.Count;
 }
 public void SetTo(VectorMeanVarianceAccumulator value)
 {
     mean.SetTo(value.mean);
     cov.SetTo(value.cov);
     count = value.count;
 }