/// <summary>
        /// Evidence message for VMP
        /// </summary>
        /// <param name="sample">Constant value for 'sample'.</param>
        /// <param name="probsTrue">Incoming message from 'probsTrue'. Must be a proper distribution.  If any element is uniform, the result will be uniform.</param>
        /// <param name="MeanLogOneMinus">Buffer 'MeanLogOneMinus'.</param>
        /// <returns>Average of the factor's log-value across the given argument distributions</returns>
        /// <remarks><para>
        /// The formula for the result is <c>sum_(probsTrue) p(probsTrue) log(factor(sample,probsTrue))</c>.
        /// Adding up these values across all factors and variables gives the log-evidence estimate for VMP.
        /// </para></remarks>
        /// <exception cref="ImproperMessageException"><paramref name="probsTrue"/> is not a proper distribution</exception>
        public static double AverageLogFactor(IList <bool> sample, [Proper] SparseBetaList probsTrue, SparseVector MeanLogOneMinus)
        {
            //var MeanLogOneMinus = probsTrue.GetMeanLogOneMinus();
            double ev    = MeanLogOneMinus.Sum();
            int    count = sample.Count;

            // assume 'sample' is very sparse
            bool[] sampleAsArray = (bool[])sample;
            for (int i = 0; i < count; i++)
            {
                if (!sampleAsArray[i])
                {
                    continue;
                }
                ev -= MeanLogOneMinus[i];
                ev += SparseBetaList.ComputeMeanLog(probsTrue.TrueCounts[i], probsTrue.FalseCounts[i]);
            }
            return(ev);
        }